@truconsent/consent-notice 0.0.19 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/runtime/purposeAdapter.js","../src/runtime/bannerState.js","../src/i18n/BannerTranslationContext.jsx","../src/templates/shared/LanguageProvider.jsx","../src/templates/shared/ModernBannerHeader.jsx","../src/templates/shared/CollapsibleDataSection.jsx","../src/templates/shared/ModernPurposeCard.jsx","../src/templates/shared/ModernBannerFooter.jsx","../src/templates/shared/ModernBannerActions.jsx","../src/templates/general_consent/TabbedBannerUI.jsx","../src/templates/notice_only/NoticeOnlyBanner.jsx","../src/templates/general_consent/InlineSingleRowUI.jsx","../src/templates/general_consent/CompactListUI.jsx","../src/runtime/templateRegistry.js","../src/templates/general_consent/BannerUI.jsx","../src/templates/general_consent/PreferencesModalUI.jsx","../src/templates/cookie_consent/CookieBannerUI.jsx","../src/templates/general_consent/SplitPaneUI.jsx","../src/runtime/useConsentEngine.js","../src/core/HCaseWarningPopup.jsx","../src/core/TruConsentModal.jsx","../src/core/TruConsent.jsx","../src/core/RightCenter.jsx"],"sourcesContent":["/**\n * purposeAdapter.js\n *\n * Normalizes raw purpose objects from the API into a consistent shape\n * used by the Consent Engine and template layer.\n */\n\n/**\n * Normalize a single raw purpose object.\n *\n * @param {object} rawPurpose - Purpose as returned by the /v1/banners API\n * @param {string} defaultSelection - One of 'all' | 'mandatory_only' | 'none'\n * @returns {object} Normalized purpose\n */\nexport function normalizePurpose(rawPurpose, defaultSelection = 'mandatory_only') {\n const isLegitimate = !!(rawPurpose.is_legitimate || rawPurpose.isLegitimate);\n const isMandatory = !!(rawPurpose.is_mandatory || rawPurpose.isMandatory);\n\n // Legal basis: legitimate interest purposes are notice-basis\n const legalBasis = isLegitimate ? 'notice' : 'consent';\n\n // Withdrawable: only consent-basis purposes with recurring frequency\n const withdrawable = !isLegitimate && rawPurpose.frequency === 'recurring';\n\n // Initial consent state\n let checked;\n if (isLegitimate || isMandatory) {\n // Notice/legitimate interest or mandatory purposes are always active by default\n checked = 'accepted';\n } else if (defaultSelection === 'all') {\n checked = 'accepted';\n } else if (defaultSelection === 'none') {\n checked = 'declined';\n } else {\n // Default to 'mandatory_only' behavior\n checked = 'declined';\n }\n\n return {\n ...rawPurpose,\n isLegitimate,\n isMandatory,\n legalBasis,\n withdrawable,\n consented: checked,\n // Preserve isDynamic as-is (defaults to false if not present)\n isDynamic: !!(rawPurpose.is_dynamic || rawPurpose.isDynamic),\n };\n}\n\n/**\n * Normalize an array of raw purposes and sort them by hierarchy.\n * Hierarchy: Legitimate > Necessary > Purpose-based (Recurring) > Optional (One-time)\n *\n * @param {Array} purposes - Array of raw purpose objects\n * @param {string} defaultSelection - 'all' | 'mandatory_only' | 'none'\n * @returns {Array} Normalized and sorted purposes\n */\nexport function normalizePurposes(purposes, defaultSelection = 'mandatory_only') {\n const normalized = (purposes || []).map(p => normalizePurpose(p, defaultSelection));\n return sortPurposes(normalized);\n}\n\n/**\n * Sort purposes by hierarchy: Legitimate > Necessary > Recurring > One-time.\n *\n * @param {Array} purposes - Normalized purposes\n * @returns {Array} Sorted purposes\n */\nexport function sortPurposes(purposes) {\n if (!purposes || !Array.isArray(purposes)) return [];\n \n const getPriority = (p) => {\n // 1. Legitimate Interest\n if (p.isLegitimate) return 1;\n // 2. Necessary / Mandatory\n if (p.isMandatory) return 2;\n // 3. Purpose-based (Recurring)\n if (p.frequency === 'recurring') return 3;\n // 4. Optional (One-time)\n if (p.frequency === 'one_off') return 4;\n return 5;\n };\n\n return [...purposes].sort((a, b) => getPriority(a) - getPriority(b));\n}\n\n/**\n * Filter dynamic purposes based on previous consent.\n *\n * - Static purposes → always included\n * - Dynamic purpose never seen → show\n * - Dynamic purpose previously consented (accepted) → hide\n * - Dynamic purpose previously rejected → show (suppression logic applies externally)\n *\n * @param {Array} purposes - Normalized purposes\n * @param {Array} previousConsent - Previous consent records [{id, consented}]\n * @returns {Array} Filtered purposes\n */\nexport function filterDynamicPurposes(purposes, previousConsent = []) {\n return purposes.filter(p => {\n if (!p.isDynamic) return true; // Static purposes always included\n const prev = previousConsent.find(c => c.id === p.id || c.purpose_id === p.id);\n if (!prev) return true; // Never seen → show\n // Consented → hide; rejected → show (suppression logic applies)\n return prev.consented !== 'accepted' && prev.status !== 'accepted';\n });\n}\n/**\n * Translate dynamic content (purpose names, data elements, etc.) using the\n * translations snapshot served from the backend. Falls back to source text\n * if no translation is available.\n *\n * @param {string} text - Source (English) text\n * @param {string} lang - Language code (use synchronous React state, not i18n.language)\n * @param {object} [snapshot] - translations_snapshot from the banner API response\n */\nexport const translateDynamic = (text, lang, snapshot) => {\n if (!text) return '';\n const textMap = snapshot?.textMap || snapshot?.text_map;\n if (lang && textMap?.[text]?.[lang]) {\n return textMap[text][lang];\n }\n return text;\n};\n","/**\n * bannerState.js\n *\n * Derives UI state from normalized purposes.\n * Used by useConsentEngine and templates to decide rendering behaviour.\n */\n\n/**\n * Banner display cases:\n * CASE 1 — Legitimate + Other purposes → Tab-based UI\n * CASE 2 — Only consent purposes (no legitimate) → Normal banner (no tabs)\n * CASE 3 — Only legitimate purposes → Single-tab / notice-only UI\n */\nexport const BANNER_CASE = {\n TABBED: 1, // Legitimate + consent → two tabs\n NORMAL: 2, // Consent only → standard banner\n NOTICE_ONLY: 3, // Legitimate only → single tab / OK button\n};\n\n/**\n * Determine which banner case applies.\n *\n * @param {Array} purposes - Normalized purposes\n * @returns {number} One of BANNER_CASE values\n */\nexport function detectBannerCase(purposes = []) {\n const hasNotice = purposes.some(p => p.legalBasis === 'notice');\n const hasConsent = purposes.some(p => p.legalBasis === 'consent');\n\n if (hasNotice && hasConsent) return BANNER_CASE.TABBED;\n if (hasConsent && !hasNotice) return BANNER_CASE.NORMAL;\n if (hasNotice && !hasConsent) return BANNER_CASE.NOTICE_ONLY;\n\n // Fallback (empty purposes)\n return BANNER_CASE.NORMAL;\n}\n\n/**\n * Derive the UI state from a list of normalized purposes.\n *\n * @param {Array} purposes - Array of normalized purposes (with legalBasis)\n * @returns {object} UI state descriptor\n */\nexport function deriveUIState(purposes = []) {\n const noticePurposes = purposes.filter(p => p.legalBasis === 'notice');\n const consentPurposes = purposes.filter(p => p.legalBasis === 'consent');\n\n // Separate consent purposes into mandatory (profile-based) and optional\n const mandatoryConsentPurposes = consentPurposes.filter(p => p.isMandatory);\n const optionalConsentPurposes = consentPurposes.filter(p => !p.isMandatory);\n\n return {\n /** True when ONLY notice/legitimate-interest purposes exist (no consent needed) */\n noticeOnly: consentPurposes.length === 0 && noticePurposes.length > 0,\n\n /** True when ONLY consent purposes exist (no notice purposes) */\n consentOnly: noticePurposes.length === 0 && consentPurposes.length > 0,\n\n /** H-Case: both notice AND consent purposes exist */\n isHCase: noticePurposes.length > 0 && consentPurposes.length > 0,\n\n /** At least one consent purpose is mandatory */\n hasRequiredConsent: consentPurposes.some(p => p.isMandatory),\n\n /** Which banner case to use */\n bannerCase: detectBannerCase(purposes),\n\n /** Segmented purpose lists for action handlers */\n noticePurposes,\n consentPurposes,\n\n /** Further breakdown of consent purposes */\n mandatoryConsentPurposes,\n optionalConsentPurposes,\n };\n}\n","import React, { createContext, useContext, useState, useCallback } from 'react';\n\nexport const KEY_TO_SOURCE = {\n consent_by: 'Consent by {{companyName}}',\n decline_rights: 'You have the right to decline consents which you feel are not required by {{companyName}}',\n expiry_type: 'Expiry Type: {{expiry}}',\n accept: 'Accept',\n reject_all: 'Reject All',\n accept_all: 'Accept All',\n accept_only_necessary: 'Accept Only Necessary',\n accept_selected: 'Accept Selected',\n i_consent: 'I Consent',\n necessary: 'Necessary',\n data_elements: 'Data Elements',\n legal_entities: 'Legal Entities',\n tools: 'Tools',\n processing_activities: 'Processing Activities',\n data_processors: 'Data Processors',\n legitimate_interest: 'Legitimate Interest',\n only_necessary: 'Only Necessary',\n save_preferences: 'Save My Preferences',\n legitimate_use_tab: 'Legitimate',\n purposes_tab: 'Purpose',\n next_button: 'Next',\n ok_button: 'Ok',\n until_withdrawn: 'Until withdrawn',\n scroll_to_bottom: 'Please scroll to the bottom to enable actions',\n consent_notice: 'Consent Notice',\n expires_in: 'Expires in',\n one_time: 'One-time',\n optional: 'Optional',\n profile_based: 'Profile Based',\n informational: 'Informational',\n consent_tab: 'Consent',\n reconsent_tab: 'Re-consent',\n processing: 'Processing...',\n consent_sections: 'Consent sections',\n purpose_description: 'Purpose / Description',\n expiration: 'Expiration',\n status: 'Status',\n no_data_elements: 'No data elements',\n no_processors: 'No processors',\n select_purpose_hint: 'Select a purpose from the left to view details',\n activities: 'Activities',\n cookie_preferences: 'Cookie Preferences',\n cookie_preferences_desc: 'We use cookies to enhance your browsing experience and analyze our traffic. Please choose which types of cookies you want to allow. You can change these settings at any time.',\n};\n\nfunction interpolate(text, vars) {\n if (!vars || !text) return text;\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, k) => (vars[k] != null ? vars[k] : `{{${k}}}`));\n}\n\nconst BannerTranslationContext = createContext({\n snapshot: null,\n language: 'en',\n translationVersion: 0,\n setLanguage: () => {},\n translate: (key) => KEY_TO_SOURCE[key] || key,\n});\n\nexport function BannerTranslationProvider({ snapshot, initialLanguage, children }) {\n const [language, setLanguageState] = useState(initialLanguage || 'en');\n const [translationVersion, setTranslationVersion] = useState(0);\n\n const setLanguage = useCallback((lang) => {\n setLanguageState(lang);\n setTranslationVersion(v => v + 1);\n }, []);\n\n const translate = useCallback((key, vars) => {\n const sourceText = KEY_TO_SOURCE[key];\n if (!sourceText) return key;\n const textMap = snapshot?.textMap || snapshot?.text_map;\n const translated = (language && textMap?.[sourceText]?.[language]) || sourceText;\n return interpolate(translated, vars);\n }, [snapshot, language]);\n\n return (\n <BannerTranslationContext.Provider value={{ snapshot, language, translationVersion, setLanguage, translate }}>\n {children}\n </BannerTranslationContext.Provider>\n );\n}\n\nexport const useBannerTranslation = () => useContext(BannerTranslationContext);\n","import React from 'react';\nimport { BannerTranslationProvider } from '../../i18n/BannerTranslationContext';\n\nexport default function LanguageProvider({ snapshot, initialLanguage, children }) {\n return (\n <BannerTranslationProvider snapshot={snapshot} initialLanguage={initialLanguage}>\n {children}\n </BannerTranslationProvider>\n );\n}\n","import React, { useState } from 'react';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\n\nconst FALLBACK_LANGUAGES = [\n { code: 'en', label: 'English' },\n { code: 'as', label: 'অসমীয়া' },\n { code: 'bn', label: 'বাংলা' },\n { code: 'doi', label: 'डोगरी' },\n { code: 'gu', label: 'ગુજરાતી' },\n { code: 'hi', label: 'हिन्दी' },\n { code: 'kn', label: 'ಕನ್ನಡ' },\n { code: 'gom', label: 'कोंकणी' },\n { code: 'mai', label: 'मैथिली' },\n { code: 'ml', label: 'മലയാളം' },\n { code: 'mni-Mtei', label: 'ꯃꯤꯇꯩꯂꯣꯟ' },\n { code: 'mr', label: 'मराठी' },\n { code: 'ne', label: 'नेपाली' },\n { code: 'or', label: 'ଓଡ଼ିଆ' },\n { code: 'pa', label: 'ਪੰਜਾਬੀ' },\n { code: 'sa', label: 'संस्कृतम्' },\n { code: 'sat', label: 'ᱥᱟᱱᱛᱟᱲᱤ' },\n { code: 'sd', label: 'سنڌي' },\n { code: 'ta', label: 'தமிழ்' },\n { code: 'te', label: 'తెలుగు' },\n { code: 'ur', label: 'اردو' },\n];\n\nconst LANGUAGE_ENGLISH_NAMES = {\n en: 'English', as: 'Assamese', bn: 'Bengali', doi: 'Dogri',\n gu: 'Gujarati', hi: 'Hindi', kn: 'Kannada', gom: 'Konkani',\n mai: 'Maithili', ml: 'Malayalam', 'mni-Mtei': 'Meitei (Manipuri)',\n mr: 'Marathi', ne: 'Nepali', or: 'Odia', pa: 'Punjabi',\n sa: 'Sanskrit', sat: 'Santali', sd: 'Sindhi', ta: 'Tamil',\n te: 'Telugu', ur: 'Urdu',\n};\n\nexport default function ModernBannerHeader({ logoUrl, orgName, bannerTitle, disclaimerText, showLanguage = true }) {\n const { snapshot, language, setLanguage, translate } = useBannerTranslation();\n const [isLangOpen, setIsLangOpen] = useState(false);\n\n const languages = snapshot?.languages?.length ? snapshot.languages : FALLBACK_LANGUAGES;\n const currentLang = languages.find(l => l.code === language) || languages[0];\n\n const changeLanguage = (lng) => {\n setLanguage(lng);\n setIsLangOpen(false);\n };\n\n const processPlaceholder = (text) => (text || '').replace(/\\[Organization Name\\]/g, orgName);\n\n const translatedTitle = bannerTitle ? translateDynamic(bannerTitle, language, snapshot) : null;\n const title = translatedTitle\n ? processPlaceholder(translatedTitle)\n : (orgName ? translate('consent_by', { companyName: orgName }) : translate('consent_notice'));\n\n const translatedDisclaimer = disclaimerText ? translateDynamic(disclaimerText, language, snapshot) : null;\n const disclaimer = translatedDisclaimer ? processPlaceholder(translatedDisclaimer) : processPlaceholder(disclaimerText);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-start\">\n <div className=\"flex items-center gap-3 min-w-0 flex-1\">\n {logoUrl && <img src={logoUrl} alt={`${orgName} logo`} className=\"tru-banner-logo h-7 w-auto flex-shrink-0\" />}\n <h2 className=\"tru-banner-title text-[1.25em] font-bold leading-tight break-words overflow-wrap-anywhere\" style={{ color: 'var(--banner-text)', wordBreak: 'break-word' }}>{title}</h2>\n </div>\n {showLanguage && (\n <div className=\"relative flex-shrink-0\">\n <button onClick={() => setIsLangOpen(!isLangOpen)} className=\"tru-language-toggle flex items-center gap-1 text-[0.875em] hover:opacity-80\" style={{ color: 'var(--banner-text-muted)' }}>\n <span className=\"whitespace-nowrap\">{currentLang.label}</span>\n <svg className=\"h-4 w-4 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" /></svg>\n </button>\n {isLangOpen && (\n <div className=\"tru-language-dropdown absolute right-0 mt-1 min-w-[160px] max-h-64 overflow-y-auto rounded-md shadow-lg z-[100] border\"\n style={{ backgroundColor: 'var(--banner-bg)', borderColor: 'var(--banner-border)' }}>\n {languages.map(({ code, label }) => {\n const englishName = LANGUAGE_ENGLISH_NAMES[code];\n const showSubtitle = englishName && englishName !== label;\n return (\n <button\n key={code}\n onClick={() => changeLanguage(code)}\n className=\"block w-full text-left px-4 py-2 text-[0.875em] hover:bg-[var(--banner-hover-bg)]\"\n style={{\n color: 'var(--banner-text)',\n fontWeight: code === language ? 'bold' : 'normal',\n }}\n >\n <span className=\"block leading-tight\">{label}</span>\n {showSubtitle && (\n <span className=\"block text-[0.75em] leading-tight opacity-50\">{englishName}</span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n {disclaimer && (\n <div className=\"tru-disclaimer-box border text-[0.9375em] leading-normal rounded-lg py-2 px-3 italic\"\n style={{ backgroundColor: 'var(--banner-info-bg)', borderColor: 'var(--banner-info-border)', color: 'var(--banner-info-text)' }}>\n {disclaimer}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\n\nexport default function CollapsibleDataSection({ title, items, isOpen, onToggle, chevronLeft = false }) {\n const { snapshot, language, translationVersion } = useBannerTranslation();\n void translationVersion;\n\n return (\n <div className=\"tru-data-section border-t\" style={{ borderColor: 'var(--banner-border)' }}>\n <button\n type=\"button\"\n className=\"w-full flex items-center py-2 text-[0.85em] font-medium gap-2\"\n style={{ color: 'var(--banner-text)' }}\n onClick={onToggle}\n >\n {chevronLeft && (\n <svg\n className={`w-3.5 h-3.5 text-gray-400 transition-transform ${isOpen ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n\n <span className=\"flex-1 text-left\">{title} ({items.length})</span>\n\n {!chevronLeft && (\n <svg className={`w-4 h-4 transform transition-transform ${isOpen ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )}\n </button>\n {isOpen && (\n <div className={`${chevronLeft ? 'pl-5' : ''} py-1.5 flex flex-wrap gap-1.5`}>\n {items.map((item) => (\n <div key={item.id} className=\"border rounded-full px-3 py-1 text-[0.875em]\"\n style={{ backgroundColor: 'var(--banner-btn-secondary-bg)', borderColor: 'var(--banner-btn-secondary-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name, language, snapshot)}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport CollapsibleDataSection from './CollapsibleDataSection';\n\nimport { translateDynamic } from '../../runtime/purposeAdapter';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\n\nexport default function ModernPurposeCard({ purpose, banner, onToggle, mandatoryLabel, showNecessaryTag = false, isUpdated = false, isNew = false, isRemoved = false, isExpired = false }) {\n const { snapshot, language, translationVersion, translate } = useBannerTranslation();\n void translationVersion; // consumed to trigger re-render when translations load\n // Start with all sections collapsed\n const [openSection, setOpenSection] = useState(null);\n const isMandatory = purpose.isMandatory;\n const isAccepted = purpose.consented === 'accepted' || purpose.consented === true;\n const isUUID = (val) => typeof val === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(val);\n\n const formatExpiryText = (text) => {\n if (!text || isUUID(text)) return translate('until_withdrawn');\n const translatedText = translateDynamic(text, language, snapshot) || text;\n // Handle 'one_time' / 'one_off' -> localized label\n if (translatedText === 'one_time' || translatedText === 'one_off') return translate('one_time');\n if (translatedText === 'never') return 'never';\n // Handle '90days' -> '90 days'\n if (translatedText.match(/^\\d+[a-zA-Z]+$/)) {\n const digits = translatedText.match(/^\\d+/)[0];\n const unit = translatedText.slice(digits.length);\n return `${digits} ${unit}`;\n }\n return translatedText;\n };\n\n const formatFrequency = (freq) => {\n if (!freq) return null;\n if (freq === 'one_off' || freq === 'one_time') return translate('one_time');\n if (freq === 'recurring') return null; // recurring needs actual period\n return null;\n };\n\n // Frequency takes display priority for one-time purposes\n const frequencyLabel = formatFrequency(purpose.frequency);\n\n // Try expiry fields in priority order; skip UUIDs\n const rawExpiry = [\n purpose.expiryLabel,\n purpose.expiry_type,\n purpose.expiry,\n purpose.expiryPeriod,\n purpose.expiry_period,\n ].find(v => v && !isUUID(v));\n\n // One-time frequency always shows \"One-time\" regardless of expiry_period value\n const expiryLabel = frequencyLabel || (rawExpiry ? formatExpiryText(rawExpiry) : 'Until withdrawn');\n\n const handleToggleSection = (section) => {\n setOpenSection(openSection === section ? null : section);\n };\n\n // Use per-purpose entities from the purpose object (support both camelCase and snake_case from DB snapshots)\n const dataElements = purpose.dataElements || purpose.data_elements || [];\n const processingActivities = purpose.processingActivities || purpose.processing_activities || [];\n const legalEntities = purpose.legalEntities || purpose.legal_entities || [];\n const tools = purpose.tools || [];\n\n // Combine legal entities and tools for Data Processors section\n const dataProcessors = [...legalEntities, ...tools];\n\n const getDiffFor = (field) => {\n return (purpose.field_diff || purpose.fieldDiff || []).find(d => d.field === field);\n };\n\n const renderDiffInline = (field, currentContent) => {\n const diff = getDiffFor(field);\n if (!diff) return currentContent;\n return (\n <div className=\"inline-flex items-center gap-1 flex-wrap\">\n <span className=\"px-1 py-0 rounded bg-red-50 text-red-600 line-through opacity-60 text-[0.85em] font-normal\">\n {diff.old_value || diff.oldValue || '—'}\n </span>\n <span className=\"text-gray-400 text-[0.8em]\">→</span>\n <span className=\"px-1 py-0 rounded bg-green-50 text-green-700 font-bold text-[0.95em]\">\n {currentContent}\n </span>\n </div>\n );\n };\n\n return (\n <div className=\"tru-purpose-card border rounded-xl p-2 shadow-sm hover:shadow-md transition-shadow duration-200\"\n style={{ backgroundColor: 'var(--banner-bg)', borderColor: 'var(--banner-border)', opacity: isRemoved ? 0.75 : 1 }}>\n <div className=\"flex justify-between items-start gap-2\">\n <div className=\"flex-1 space-y-0.5\">\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <h3 className=\"font-bold text-[1em]\" style={{ color: 'var(--banner-text)', textDecoration: isRemoved ? 'line-through' : 'none' }}>\n {renderDiffInline('name', translateDynamic(purpose.name, language, snapshot))}\n </h3>\n {(isUpdated || isNew || isExpired) && (\n <span style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 7px',\n borderRadius: '999px',\n fontSize: '0.62rem',\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n backgroundColor: isExpired ? '#d97706' : isNew ? '#10b981' : '#3b82f6',\n color: '#ffffff',\n marginLeft: '6px',\n verticalAlign: 'middle',\n lineHeight: 1,\n }}>\n {isExpired ? 'Expired' : isNew ? 'New' : 'Updated'}\n </span>\n )}\n </div>\n\n {purpose.description && (\n <p className=\"text-[0.8em] opacity-80\" style={{ color: 'var(--banner-text-muted)' }}>\n {translateDynamic(purpose.description, language, snapshot)}\n </p>\n )}\n\n {/* Processing Activities as Pills */}\n {processingActivities.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {processingActivities.map((activity, idx) => (\n <span key={idx} className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-[0.75em] font-medium border\"\n style={{\n backgroundColor: 'var(--banner-btn-secondary-bg)',\n color: 'var(--banner-text-muted)',\n borderColor: 'var(--banner-btn-secondary-border)',\n maxWidth: '140px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'inline-block',\n }}>\n {translateDynamic(activity.name || activity, language, snapshot)}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Right Column: Actions & Meta Row */}\n <div className=\"flex flex-col items-end gap-1.5 shrink-0\">\n <div className=\"h-6 flex items-center\">\n {isRemoved ? (\n <span style={{\n fontSize: '0.65rem',\n fontWeight: 700,\n backgroundColor: '#ef4444',\n color: '#fff',\n padding: '3px 6px',\n borderRadius: '4px',\n textTransform: 'uppercase'\n }}>\n Removed\n </span>\n ) : !purpose.isLegitimate && (\n <div className=\"flex items-center gap-2\">\n {showNecessaryTag ? (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[0.6em] font-bold uppercase tracking-wide shrink-0\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', border: '1px solid var(--banner-danger-text)' }}>\n {translate('necessary')}\n </span>\n ) : !isMandatory && (\n <span className=\"text-[10px] font-bold uppercase tracking-tight\" style={{ color: 'var(--banner-text-muted)' }}>{translate('accept')}</span>\n )}\n <label className=\"switch scale-90 origin-right\">\n <input type=\"checkbox\" checked={isAccepted} onChange={(e) => onToggle(purpose.id, e.target.checked ? 'accepted' : 'declined')} />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </label>\n </div>\n )}\n </div>\n\n <div className=\"flex flex-wrap flex-col items-end gap-0.5 min-w-[80px]\">\n <span className=\"text-[0.7em] font-medium italic\" style={{ color: 'var(--banner-text-muted)', opacity: 0.8 }}>\n {isRemoved ? 'No longer required' : renderDiffInline('expiry_period', (rawExpiry && !frequencyLabel) ? `${translate('expires_in')} ${expiryLabel}` : expiryLabel)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Difference Summary - REMOVED for integrated view */}\n\n {/* Sections - Collapsible */}\n <div className=\"mt-1 space-y-1\">\n {dataElements.length > 0 && (\n <CollapsibleDataSection\n title={translate('data_elements')}\n items={dataElements}\n isOpen={openSection === 'data_elements'}\n onToggle={() => handleToggleSection('data_elements')}\n />\n )}\n\n {banner?.showProcessors !== false && dataProcessors.length > 0 && (\n <CollapsibleDataSection\n title={translate('data_processors')}\n items={dataProcessors}\n isOpen={openSection === 'data_processors'}\n onToggle={() => handleToggleSection('data_processors')}\n />\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\n\nfunction convertMarkdownLinks(text) {\n // Regular expression to match [text](url) pattern\n const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\n // Replace all markdown links with HTML anchor tags\n return text.replace(markdownLinkRegex, (match, linkText, url) => {\n // Add https:// if the URL doesn't have a protocol\n let fullUrl = url.trim();\n if (!fullUrl.match(/^[a-zA-Z]+:\\/\\//)) {\n // No protocol found, add https://\n fullUrl = `https://${fullUrl}`;\n }\n\n return `<a href=\"${fullUrl}\" class=\"hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: var(--banner-primary-color);\">${linkText}</a>`;\n });\n}\n\nexport default function ModernBannerFooter({ footerText, orgName }) {\n if (!footerText) return null;\n\n const { snapshot, language } = useBannerTranslation();\n\n // Replace [Organization Name] placeholder with actual org name\n const translatedText = translateDynamic(footerText, language, snapshot);\n const processedText = (translatedText || '').replace(/\\[Organization Name\\]/g, orgName);\n // Convert markdown links to HTML\n const htmlContent = convertMarkdownLinks(processedText);\n\n return (\n <div\n className=\"tru-footer-box text-center text-[0.8125em] border rounded-lg px-3 py-2 leading-normal italic mb-2 w-full\"\n style={{ backgroundColor: 'var(--banner-info-bg)', borderColor: 'var(--banner-info-border)', color: 'var(--banner-info-text)' }}\n dangerouslySetInnerHTML={{ __html: htmlContent }}\n />\n );\n}\n","import React from 'react';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\n\nexport default function ModernBannerActions({\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n actionButtonText,\n rejectAllText,\n rejectAllColor,\n acceptAllText,\n onlyNecessaryText,\n onlyNecessaryColor,\n savePreferencesColor,\n primaryColor,\n purposes = [],\n isBottomReached = false,\n hasUserInteracted = false,\n isSplitLayout = false,\n showAcceptAll = true,\n minimal = false\n}) {\n const { snapshot, language, translationVersion, translate } = useBannerTranslation();\n void translationVersion;\n\n const resolveText = (text, fallbackKey, fallbackValue) => {\n if (text) {\n return translateDynamic(text, language, snapshot) || text;\n }\n if (fallbackKey) return translate(fallbackKey);\n return fallbackValue;\n };\n\n // Check if any optional purposes are accepted\n const anyOptionalAccepted = purposes\n .filter(p => !p.isMandatory)\n .some(p => p.consented === 'accepted' || p.consented === true);\n\n // Check if there are any mandatory purposes\n const hasMandatoryPurposes = purposes.some(p => p.isMandatory);\n\n // Use dynamic primary color or fallback to purple\n const primaryBg = primaryColor || '#7030bc';\n\n const disabledClasses = \"opacity-50 cursor-not-allowed\";\n const buttonBase = \"px-3 py-1.5 text-[0.8125em] font-bold rounded-lg transition-all duration-200 shadow-sm whitespace-nowrap flex-shrink-0\";\n\n if (isSplitLayout) {\n const splitLayoutContent = (\n <>\n {!isBottomReached && (\n <p className=\"text-[10px] mb-2 text-center animate-pulse\" style={{ color: 'var(--banner-text-muted)' }}>\n {translate('scroll_to_bottom')}\n </p>\n )}\n <div className=\"tru-actions-row tru-actions-center\">\n <button\n onClick={onRejectAll}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (rejectAllColor || '#dc2626') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-reject ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {resolveText(rejectAllText, 'reject_all', 'Reject All')}\n </button>\n\n <button\n onClick={onAcceptMandatory}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (onlyNecessaryColor || '#f97316') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-necessary ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {resolveText(onlyNecessaryText, 'only_necessary', 'Only Necessary')}\n </button>\n\n {showAcceptAll && (\n <button\n onClick={onConsentAll}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? '#10b981' : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-accept ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {resolveText(actionButtonText || acceptAllText, 'accept_all', 'Accept All')}\n </button>\n )}\n </div>\n </>\n );\n\n if (minimal) return <div className=\"w-full\">{splitLayoutContent}</div>;\n\n return (\n <div className=\"px-4 py-3 border-t\" style={{ backgroundColor: 'var(--banner-hover-bg)', borderColor: 'var(--banner-border)' }}>\n {splitLayoutContent}\n </div>\n );\n }\n\n const defaultLayoutContent = (\n <div className=\"w-full\">\n {!isBottomReached && (\n <p className=\"text-[10px] mb-2 text-center animate-pulse\" style={{ color: 'var(--banner-text-muted)' }}>\n {translate('scroll_to_bottom')}\n </p>\n )}\n <div className=\"tru-actions-row tru-actions-center\">\n <button\n onClick={onRejectAll}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (rejectAllColor || '#dc2626') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-reject ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {resolveText(rejectAllText, 'reject_all', 'Reject All')}\n </button>\n\n <button\n onClick={onAcceptMandatory}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (onlyNecessaryColor || '#f97316') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-necessary ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {resolveText(onlyNecessaryText, 'only_necessary', 'Only Necessary')}\n </button>\n\n <button\n onClick={() => {\n if (anyOptionalAccepted || hasUserInteracted) {\n onAcceptSelected?.();\n } else {\n onConsentAll();\n }\n }}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? '#10b981' : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-accept ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {resolveText(actionButtonText || acceptAllText, 'accept_all', 'I Consent')}\n </button>\n </div>\n </div>\n );\n\n if (minimal) return defaultLayoutContent;\n\n return (\n <div className=\"px-4 py-2.5 border-t\" style={{ backgroundColor: 'var(--banner-hover-bg)', borderColor: 'var(--banner-border)' }}>\n {defaultLayoutContent}\n </div>\n );\n}\n","/**\n * TabbedBannerUI.jsx\n *\n * Dynamic tab-based consent banner that adapts to four cases:\n * CASE 1 (TABBED) — Legitimate + consent purposes → 2 tabs (+ Re-consent if campaign)\n * CASE 2 (NORMAL) — Consent purposes only → no tabs (+ Re-consent tab if campaign)\n * CASE 3 (NOTICE_ONLY) — Legitimate purposes only → single Informational tab (+ Re-consent if campaign)\n * RE-CONSENT — Any case with active campaign → Re-consent tab appended; auto-lands there\n */\nimport React, { useState, useRef, useEffect, Fragment } from 'react';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\nimport { BANNER_CASE } from '../../runtime/bannerState';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction GroupHeader({ title }) {\n return <div className=\"tru-group-heading\">{title}</div>;\n}\n\nfunction TabButton({ label, isActive, onClick, tabId, panelId, badge, badgeColor, primaryColor }) {\n return (\n <button\n role=\"tab\"\n id={tabId}\n aria-selected={isActive}\n aria-controls={panelId}\n onClick={onClick}\n className=\"tru-tab-button\"\n data-active={isActive || undefined}\n >\n {label}\n {badge && (\n <span style={{\n marginLeft: '5px',\n background: badgeColor || primaryColor,\n color: '#fff',\n fontSize: '0.58rem',\n fontWeight: 700,\n padding: '2px 6px',\n borderRadius: '999px',\n verticalAlign: 'middle',\n letterSpacing: '0.04em',\n textTransform: 'uppercase',\n lineHeight: 1,\n display: 'inline-flex',\n alignItems: 'center',\n }}>\n {badge}\n </span>\n )}\n </button>\n );\n}\n\nfunction TabPanel({ id, labelledBy, children, isActive }) {\n return (\n <div\n role=\"tabpanel\"\n id={id}\n aria-labelledby={labelledBy}\n hidden={!isActive}\n className=\"tru-tab-panel\"\n >\n {children}\n </div>\n );\n}\n\nfunction LegitimateUseContent({ noticePurposes, banner, settings }) {\n return (\n <div className=\"tru-legitimate-content\">\n <div className=\"tru-purposes-list\">\n {noticePurposes.map((p) => (\n <ModernPurposeCard key={p.id} purpose={p} banner={banner} onToggle={() => {}} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ConsentPurposesContent({ allConsentPurposes, banner, onChangePurpose, settings }) {\n const { translate } = useBannerTranslation();\n\n // A purpose that is both mandatory AND dynamic belongs only in PROFILE BASED\n // (with a \"Necessary\" tag on the card), not in NECESSARY as well.\n const groups = [\n {\n title: translate('necessary'),\n items: allConsentPurposes.filter(p => p.isMandatory && !p.isDynamic)\n },\n {\n title: translate('optional'),\n items: allConsentPurposes.filter(p => !p.isMandatory && !p.isDynamic)\n },\n {\n title: translate('profile_based'),\n items: allConsentPurposes.filter(p => p.isDynamic)\n }\n ].filter(g => g.items.length > 0);\n\n return (\n <div className=\"tru-consent-content\">\n <div className=\"tru-purposes-list\">\n {groups.map((group, gIdx) => (\n <React.Fragment key={gIdx}>\n <GroupHeader title={group.title} />\n {group.items.map((p) => (\n <ModernPurposeCard\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n showNecessaryTag={p.isDynamic && p.isMandatory}\n />\n ))}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n}\n\n/** Re-consent tab: shows version diff summary (or expiry notice) + purpose toggles. */\nfunction ReconsentContent({ purposes, versionDiff, reconsentUiMode, banner, onChangePurpose, primaryColor, hasOtherTabs, reconsentSource }) {\n const isExpiryReconsent = reconsentSource === 'expiry';\n const hasMixedExpiry = !isExpiryReconsent && purposes.some(p => p.isExpired);\n const changedFields = (!isExpiryReconsent && versionDiff?.changed_fields) || (!isExpiryReconsent && versionDiff?.changedFields) || [];\n const changedPurposeIds = new Set((!isExpiryReconsent && versionDiff?.changed_purpose_ids) || (!isExpiryReconsent && versionDiff?.changedPurposeIds) || []);\n\n // If there are other tabs (Consent/Info), we only show changes here.\n // Otherwise we respect the API mode.\n const effectiveMode = hasOtherTabs ? 'diff_only' : reconsentUiMode;\n console.log('[TruConsent] ReconsentContent purposes:', purposes.map(p => ({ id: p.id, name: p.name, isExpired: p.isExpired, isUpdated: p.isUpdated, isNew: p.isNew })), 'effectiveMode:', effectiveMode, 'versionDiff:', versionDiff);\n\n let purposesToShow = effectiveMode === 'diff_only'\n ? purposes.filter(p =>\n (versionDiff?.changed_purpose_ids || versionDiff?.changedPurposeIds || []).includes(p.id) ||\n (versionDiff?.added_purpose_ids || versionDiff?.addedPurposeIds || []).includes(p.id) ||\n Boolean(p.isExpired)\n )\n : purposes;\n\n // Fallback: If \"Changes Only\" results in nothing (e.g. only global text changed), \n // show everything so the tab isn't empty.\n if (purposesToShow.length === 0 && purposes.length > 0) {\n purposesToShow = purposes;\n }\n\n return (\n <div className=\"tru-reconsent-content\">\n {/* Notice banner */}\n <div style={{\n background: `${primaryColor}14`, // ~8% opacity\n border: `1px solid ${primaryColor}33`, // ~20% opacity\n borderRadius: '6px',\n padding: '0.6rem 0.75rem',\n marginBottom: '0.75rem',\n fontSize: '0.8rem',\n color: primaryColor,\n display: 'flex',\n gap: '0.5rem',\n alignItems: 'flex-start',\n }}>\n <span style={{ flexShrink: 0 }}>🔄</span>\n <span>\n {isExpiryReconsent\n ? <><strong>Consent Expired</strong> — Your consent for these purposes has expired. Please review and re-confirm your preferences below.</>\n : <><strong>Consent Update Required</strong> — Some terms have changed since you last consented. Please review and re-confirm your preferences below.</>\n }\n {hasMixedExpiry && (\n <span style={{ display: 'block', marginTop: '0.35rem', opacity: 0.85 }}>\n Some purposes are also marked <strong>Expired</strong> and require re-confirmation.\n </span>\n )}\n </span>\n </div>\n\n {/* CP-level field diff (e.g. name or description changed) */}\n {changedFields.length > 0 && (\n <div style={{\n background: 'var(--banner-hover-bg, rgba(0,0,0,0.03))',\n border: '1px solid var(--banner-border, #e5e7eb)',\n borderRadius: '6px',\n padding: '0.6rem 0.75rem',\n marginBottom: '0.75rem',\n fontSize: '0.78rem',\n }}>\n <div style={{ fontWeight: 600, marginBottom: '0.35rem', fontSize: '0.75rem', textTransform: 'uppercase', letterSpacing: '0.05em', opacity: 0.6 }}>\n What changed\n </div>\n {changedFields.map(({ field, old_value, new_value }) => (\n <div key={field} style={{ display: 'flex', gap: '0.4rem', alignItems: 'baseline', marginBottom: '0.2rem' }}>\n <span style={{ fontWeight: 600, minWidth: 90, textTransform: 'capitalize' }}>{field.replace(/_/g, ' ')}:</span>\n <span style={{ textDecoration: 'line-through', opacity: 0.5, wordBreak: 'break-all' }}>{String(old_value ?? '—')}</span>\n <span style={{ opacity: 0.4, flexShrink: 0 }}>→</span>\n <span style={{ color: 'var(--banner-primary-color, #3b82f6)', wordBreak: 'break-all' }}>{String(new_value ?? '—')}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Purpose cards */}\n <div className=\"tru-purposes-list\">\n {purposesToShow.length === 0 && (versionDiff?.removed_purposes || versionDiff?.removedPurposes || []).length === 0 ? (\n <div style={{ color: 'var(--banner-muted, #888)', fontSize: '0.85rem', padding: '0.5rem 0' }}>\n No specific purposes require re-consent.\n </div>\n ) : (\n <React.Fragment>\n {purposesToShow.map((p) => (\n <div key={p.id} style={{ position: 'relative' }}>\n <ModernPurposeCard\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n isUpdated={!isExpiryReconsent && !p.isExpired && (versionDiff?.changed_purpose_ids || versionDiff?.changedPurposeIds || []).includes(p.id)}\n isNew={!isExpiryReconsent && !p.isExpired && (versionDiff?.added_purpose_ids || versionDiff?.addedPurposeIds || []).includes(p.id)}\n isExpired={isExpiryReconsent || Boolean(p.isExpired)}\n />\n </div>\n ))}\n\n {/* Removed Purposes Section */}\n {(versionDiff?.removed_purposes || versionDiff?.removedPurposes || []).map((rp) => (\n <div key={rp.id} style={{ position: 'relative', marginTop: '0.5rem' }}>\n <ModernPurposeCard\n purpose={rp}\n banner={banner}\n onToggle={() => {}} /* No-op for removed purposes */\n isRemoved={true}\n />\n </div>\n ))}\n </React.Fragment>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build the ordered tab list for the current banner case + re-consent state.\n *\n * reconsentOnly = true → dedicated re-consent CP (new_collection_point method).\n * The CP exists solely for re-consent so we skip Informational and Consent tabs\n * entirely and show only the Re-consent tab.\n */\nfunction buildTabs(bannerCase, hasReconsent, reconsentOnly, reconsentSource, translate) {\n if (reconsentOnly) {\n return [{ key: 'reconsent', label: translate('reconsent_tab') }];\n }\n const tabs = [];\n if (bannerCase === BANNER_CASE.TABBED || bannerCase === BANNER_CASE.NOTICE_ONLY) {\n tabs.push({ key: 'legitimate', label: translate('informational') });\n }\n if (bannerCase === BANNER_CASE.TABBED || bannerCase === BANNER_CASE.NORMAL) {\n tabs.push({ key: 'purposes', label: translate('consent_tab') });\n }\n if (hasReconsent) {\n tabs.push({ key: 'reconsent', label: translate('reconsent_tab') });\n }\n return tabs;\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport default function TabbedBannerUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n onAcknowledgeNotice,\n hasUserInteracted,\n actionLoading,\n bannerCase,\n uiState,\n settings: settingsOverride,\n // Re-consent props\n reconsentCampaignId,\n reconsentUiMode,\n versionDiff,\n reconsentOnly,\n reconsentSource,\n expiryReconsentRequestId,\n}) {\n const { translate } = useBannerTranslation();\n const scrollRef = useRef(null);\n const [isBottomReached, setIsBottomReached] = useState(false);\n\n const settings = settingsOverride || banner?.bannerSettings || {};\n const isReconsentOnly = reconsentOnly || (banner?.bannerId && banner.bannerId.endsWith('-rc'));\n const hasReconsent = Boolean(reconsentCampaignId) || Boolean(expiryReconsentRequestId);\n \n // Use Campaign Blue (#3b82f6) if re-consent is active, otherwise use settings primary color\n const primaryColor = (hasReconsent || isReconsentOnly) ? '#3b82f6' : (settings.primaryColor || '#3b82f6');\n\n const { noticePurposes = [], consentPurposes = [] } = uiState || {};\n\n const tabs = buildTabs(bannerCase, hasReconsent, reconsentOnly || isReconsentOnly, reconsentSource, translate);\n\n // Auto-land on the Re-consent tab when an active campaign is present.\n // Fall back to 0 if Re-consent tab somehow isn't in the list.\n const reconsentTabIndex = tabs.findIndex(t => t.key === 'reconsent');\n const [activeTab, setActiveTab] = useState(\n hasReconsent && reconsentTabIndex >= 0 ? reconsentTabIndex : 0\n );\n\n // Reset scroll gate on tab change\n const handleScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n if (scrollHeight - scrollTop <= clientHeight + 5) setIsBottomReached(true);\n };\n\n useEffect(() => {\n if (scrollRef.current) {\n const { scrollHeight, clientHeight } = scrollRef.current;\n setIsBottomReached(scrollHeight <= clientHeight);\n }\n }, [banner?.purposes, activeTab]);\n\n const styleVars = {\n '--font-type': settings.fontType,\n '--font-size': settings.fontSize,\n '--banner-primary-color': primaryColor,\n '--banner-secondary-color': settings.secondaryColor || '#555',\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n const currentTab = tabs[activeTab];\n const isFirstTab = activeTab === 0;\n const isLastTab = activeTab === tabs.length - 1;\n const isReconsentTab = currentTab?.key === 'reconsent';\n const isLegitimateTab = currentTab?.key === 'legitimate';\n const isPurposesTab = currentTab?.key === 'purposes';\n\n // Shared tab bar (rendered the same way regardless of case)\n const tabBar = tabs.length > 1 ? (\n <div className=\"tru-tabs-bar\" role=\"tablist\" aria-label={translate('consent_sections')}>\n {tabs.map((tab, idx) => (\n <TabButton\n key={tab.key}\n label={tab.label}\n isActive={activeTab === idx}\n onClick={() => setActiveTab(idx)}\n tabId={'tab-' + tab.key}\n panelId={'panel-' + tab.key}\n badge={tab.badge}\n badgeColor={tab.badgeColor}\n primaryColor={primaryColor}\n />\n ))}\n </div>\n ) : (\n <div className=\"tru-tabs-bar\" role=\"tablist\" aria-label={translate('consent_sections')}>\n <TabButton\n label={tabs[0]?.label}\n isActive={true}\n onClick={() => {}}\n tabId={'tab-' + tabs[0]?.key}\n panelId={'panel-' + tabs[0]?.key}\n badge={tabs[0]?.badge}\n badgeColor={tabs[0]?.badgeColor}\n primaryColor={primaryColor}\n />\n </div>\n );\n\n // Shared footer actions\n const footerActions = (\n <div className=\"tru-actions-row\" style={{ display: 'flex', justifyContent: 'flex-end', width: '100%' }}>\n {/* Informational / Legitimate tab: Next button */}\n {isLegitimateTab && !isLastTab && (\n <button\n className={`tru-btn tru-btn-primary ${!isBottomReached ? 'opacity-50 cursor-not-allowed' : ''}`}\n style={{ backgroundColor: isBottomReached ? primaryColor : 'var(--banner-border)' }}\n onClick={() => isBottomReached && setActiveTab(activeTab + 1)}\n disabled={!isBottomReached}\n >\n {translate('next_button')}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ marginLeft: 6 }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n )}\n\n {/* Informational-only (no more tabs after): OK button */}\n {isLegitimateTab && isLastTab && (\n <button\n className=\"tru-btn tru-btn-primary\"\n style={{ backgroundColor: primaryColor }}\n onClick={onAcknowledgeNotice}\n disabled={actionLoading}\n >\n {actionLoading ? (translate('processing')) : (settings.noticeAcknowledgeText || translate('ok_button'))}\n </button>\n )}\n\n {/* Consent tab: standard actions; Next if Re-consent tab follows */}\n {isPurposesTab && !isLastTab && (\n <button\n className={`tru-btn tru-btn-primary ${!isBottomReached ? 'opacity-50 cursor-not-allowed' : ''}`}\n style={{ backgroundColor: isBottomReached ? primaryColor : 'var(--banner-border)' }}\n onClick={() => isBottomReached && setActiveTab(activeTab + 1)}\n disabled={!isBottomReached}\n >\n {translate('next_button')}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ marginLeft: 6 }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n )}\n {isPurposesTab && isLastTab && (\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={banner?.purposes || []}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={primaryColor}\n isBottomReached={isBottomReached}\n hasUserInteracted={hasUserInteracted}\n minimal={true}\n />\n )}\n\n {/* Re-consent tab: same submit actions, labelled for re-consent context */}\n {isReconsentTab && (\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={banner?.purposes || []}\n actionButtonText={settings.actionButtonText || 'Re-consent'}\n rejectAllText={settings.rejectAllText || 'Decline'}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText || 'Re-consent All'}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={primaryColor}\n isBottomReached={isBottomReached}\n hasUserInteracted={hasUserInteracted}\n minimal={true}\n />\n )}\n </div>\n );\n\n // Single shared scroll warning lines (shown inside scroll area, below content)\n const scrollWarnings = (\n <Fragment>\n {isLegitimateTab && (\n <div className=\"tru-legitimate-disclaimer\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <p>No action is needed — this notice is for your awareness and is logged for transparency.</p>\n </div>\n )}\n {isPurposesTab && banner?.purposes?.some(p => p.consented === 'declined' || p.consented === false) && (\n <div className=\"tru-warning-bar\" style={{ marginTop: 16 }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <p>Your explicit consent is required to proceed. You may accept or decline, and can update your preferences anytime from the Rights Centre.</p>\n </div>\n )}\n </Fragment>\n );\n\n // -----------------------------------------------------------------------\n // Unified render — all cases share the same shell; only tab definitions differ\n // -----------------------------------------------------------------------\n const rootClass = reconsentOnly\n ? 'tru-banner-root tru-banner-reconsent-only'\n : tabs.length > 1\n ? 'tru-banner-root tru-banner-tabbed'\n : bannerCase === BANNER_CASE.NOTICE_ONLY\n ? 'tru-banner-root tru-banner-notice-only'\n : 'tru-banner-root tru-banner-normal';\n\n return (\n <div className={rootClass} style={styleVars}>\n <div className=\"tru-banner-header-area\">\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={settings.bannerTitle}\n disclaimerText={settings.disclaimerText}\n />\n </div>\n\n {tabBar}\n\n <div ref={scrollRef} onScroll={handleScroll} className=\"tru-banner-scroll-area\">\n {/* Legitimate / Informational tab */}\n {tabs.some(t => t.key === 'legitimate') && (\n <TabPanel id=\"panel-legitimate\" labelledBy=\"tab-legitimate\" isActive={isLegitimateTab}>\n <LegitimateUseContent\n noticePurposes={noticePurposes}\n banner={banner}\n settings={settings}\n companyName={companyName}\n />\n </TabPanel>\n )}\n\n {/* Consent tab */}\n {tabs.some(t => t.key === 'purposes') && (\n <TabPanel id=\"panel-purposes\" labelledBy=\"tab-purposes\" isActive={isPurposesTab}>\n <ConsentPurposesContent\n allConsentPurposes={consentPurposes}\n banner={banner}\n onChangePurpose={onChangePurpose}\n settings={settings}\n companyName={companyName}\n />\n </TabPanel>\n )}\n\n {/* Re-consent tab */}\n {hasReconsent && (\n <TabPanel id=\"panel-reconsent\" labelledBy=\"tab-reconsent\" isActive={isReconsentTab}>\n <ReconsentContent\n purposes={banner?.purposes || []}\n versionDiff={versionDiff}\n reconsentUiMode={reconsentUiMode}\n banner={banner}\n onChangePurpose={onChangePurpose}\n primaryColor={primaryColor}\n hasOtherTabs={tabs.length > 1}\n reconsentSource={reconsentSource}\n />\n </TabPanel>\n )}\n\n {scrollWarnings}\n </div>\n\n <div className=\"tru-banner-footer-area\">\n <ModernBannerFooter footerText={settings.footerText} orgName={companyName} />\n {footerActions}\n </div>\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport LanguageProvider from '../shared/LanguageProvider';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\n\n/**\n * NoticeOnlyBanner\n *\n * Informational banner for collections that have ONLY notice/legitimate-interest purposes.\n * - Read-only purpose list (no toggles — all show \"Always Active\")\n * - Single \"I Understand\" button → fires notice_shown → closes\n * - No Reject All, no Save Preferences\n */\nfunction NoticeOnlyBannerInner({\n banner,\n companyName,\n logoUrl,\n onAcknowledge,\n actionLoading,\n}) {\n const settings = banner?.bannerSettings || {};\n const primaryColor = settings.primaryColor || '#3b82f6';\n const footerText = settings.footerText;\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const acknowledgeText = settings.noticeAcknowledgeText || 'I Understand';\n\n const [isBottomReached, setIsBottomReached] = useState(false);\n const scrollRef = useRef(null);\n\n const handleScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n if (scrollHeight - scrollTop <= clientHeight + 5) {\n setIsBottomReached(true);\n }\n };\n\n useEffect(() => {\n if (scrollRef.current) {\n const { scrollHeight, clientHeight } = scrollRef.current;\n if (scrollHeight <= clientHeight) {\n setIsBottomReached(true);\n }\n }\n }, [banner?.purposes]);\n\n const styleVars = {\n '--font-type': settings.fontType,\n '--font-size': settings.fontSize,\n '--banner-primary-color': primaryColor,\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n return (\n <div\n className=\"rounded-2xl flex flex-col overflow-hidden text-left h-full border\"\n style={{\n ...styleVars,\n backgroundColor: 'var(--banner-bg)',\n color: 'var(--banner-text)',\n borderColor: 'var(--banner-border)',\n }}\n >\n {/* Header */}\n <div\n className=\"flex-shrink-0 pt-3.5 pb-2 px-3 border-b flex flex-col gap-2\"\n style={{\n borderColor: 'var(--banner-border)',\n backgroundColor: 'var(--banner-hover-bg)',\n }}\n >\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logo_url}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n {/* Purpose Cards — all read-only */}\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 px-5 py-2.5 space-y-2.5 overflow-y-auto\"\n style={{ backgroundColor: 'var(--banner-bg)' }}\n >\n {banner?.purposes?.map((p) => (\n <ModernPurposeCard\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={() => { }} // No-op: notice purposes are read-only\n mandatoryLabel=\"Always Active\"\n />\n ))}\n </div>\n\n {/* Footer + Single Action */}\n <div\n className=\"flex-shrink-0 border-t px-4 py-2.5\"\n style={{\n borderColor: 'var(--banner-border)',\n backgroundColor: 'var(--banner-hover-bg)',\n }}\n >\n {footerText && (\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n />\n )}\n\n <div className=\"flex justify-center mt-2\">\n <button\n type=\"button\"\n className=\"px-8 py-2.5 rounded-lg font-semibold text-white text-sm transition-all duration-200 hover:opacity-90 disabled:opacity-50\"\n style={{ backgroundColor: primaryColor }}\n onClick={onAcknowledge}\n disabled={actionLoading}\n >\n {actionLoading ? 'Processing...' : acknowledgeText}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default function NoticeOnlyBanner(props) {\n return (\n <LanguageProvider>\n <NoticeOnlyBannerInner {...props} />\n </LanguageProvider>\n );\n}\n","import React from 'react';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerActions from '../shared/ModernBannerActions';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\n\nfunction PurposeRow({ purpose, language, snapshot, translate, onChangePurpose, finalPrimaryColor, settings }) {\n const isMandatory = purpose.isMandatory;\n const isAccepted = purpose.consented === 'accepted' || purpose.consented === true;\n const mandatoryLabel = settings.mandatoryLabel || translate('necessary');\n\n const dataElements = purpose.dataElements || [];\n const _legalEntities = purpose.legalEntities || [];\n const _tools = purpose.tools || [];\n const dataProcessors = [..._legalEntities, ..._tools];\n\n return (\n <tr className=\"border-b transition-colors hover:bg-gray-50/50\" style={{ borderColor: 'var(--banner-border)' }}>\n {/* Column 1: Purpose Name & Description */}\n <td className=\"py-3 px-4 min-w-[200px]\">\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"font-bold text-[0.85em]\" style={{ color: 'var(--banner-text)' }}>\n {translateDynamic(purpose.name, language, snapshot)}\n </span>\n {isMandatory && (\n <span className=\"text-[0.6em] uppercase font-black px-1.5 py-0.5 rounded-md tracking-wider border shrink-0\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', borderColor: 'var(--banner-danger-text)' }}>\n {mandatoryLabel}\n </span>\n )}\n </div>\n <p className=\"text-[0.7em] leading-tight text-gray-500 line-clamp-2 max-w-[400px]\" title={translateDynamic(purpose.description, language, snapshot)}>\n {translateDynamic(purpose.description, language, snapshot)}\n </p>\n </div>\n </td>\n\n {/* Column 2: Data Elements */}\n <td className=\"py-3 px-3 min-w-[250px]\">\n <div className=\"flex flex-wrap gap-1\">\n {dataElements.length > 0 ? dataElements.map((item, idx) => (\n <span key={idx} className=\"px-2 py-0.5 rounded text-[0.65em] border whitespace-nowrap\"\n style={{ backgroundColor: 'var(--banner-card-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item, language, snapshot)}\n </span>\n )) : <span className=\"text-[0.65em] text-gray-400 italic\">{t('no_data_elements') || 'No data elements'}</span>}\n </div>\n </td>\n\n {/* Column 3: Data Processors */}\n <td className=\"py-3 px-3 min-w-[220px]\">\n <div className=\"flex flex-wrap gap-1\">\n {dataProcessors.length > 0 ? dataProcessors.map((item, idx) => (\n <span key={idx} className=\"px-2 py-0.5 rounded text-[0.65em] border whitespace-nowrap\"\n style={{ backgroundColor: 'var(--banner-card-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item, language, snapshot)}\n </span>\n )) : <span className=\"text-[0.65em] text-gray-400 italic\">{t('no_processors') || 'No processors'}</span>}\n </div>\n </td>\n\n {/* Column 4: Expiration */}\n <td className=\"py-3 px-3 min-w-[120px]\">\n <span className=\"text-[0.7em] text-gray-500\">\n {purpose.expiryPeriod ? `${t('expires_in') || 'Expires in'} ${translateDynamic(purpose.expiryPeriod, language, snapshot)}` : '-'}\n </span>\n </td>\n\n {/* Column 5: Action / Status */}\n <td className=\"py-3 px-4 text-right\">\n <div className=\"flex items-center justify-end gap-3\">\n {!isMandatory ? (\n <label className=\"switch scale-[0.8] origin-right cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={isAccepted}\n onChange={(e) => onChangePurpose(purpose.id, e.target.checked ? 'accepted' : 'declined')}\n />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </label>\n ) : (\n <div className=\"w-10 h-5\" /> // Spacer for alignment\n )}\n </div>\n </td>\n </tr>\n );\n}\n\nexport default function InlineSingleRowUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n hasUserInteracted,\n primaryColor,\n actionLoading\n}) {\n const { snapshot, language, translationVersion, translate } = useBannerTranslation();\n void translationVersion;\n const settings = banner?.bannerSettings || {};\n const finalPrimaryColor = primaryColor || settings.primaryColor || '#3b82f6';\n const purposes = banner?.purposes || [];\n\n if (purposes.length === 0) return null;\n\n const footerText = settings.footerText;\n\n return (\n <div className=\"w-full h-full bg-white border rounded-xl overflow-hidden shadow-2xl flex flex-col\" style={{ borderColor: 'var(--banner-border)' }}>\n {/* Header Area */}\n <div className=\"flex-shrink-0 pt-3.5 pb-2 px-4 border-b bg-gray-50 relative z-20\" style={{ borderColor: 'var(--banner-border)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={settings.bannerTitle}\n disclaimerText={settings.disclaimerText}\n />\n </div>\n\n {/* Spreadsheet Table Container */}\n <div className=\"flex-1 overflow-x-auto overflow-y-auto w-full scrollbar-thin scrollbar-thumb-gray-200\">\n <table className=\"w-full border-collapse text-left border-hidden\">\n <thead className=\"bg-gray-50 sticky top-0 z-10\" style={{ backgroundColor: 'var(--banner-hover-bg)' }}>\n <tr className=\"border-b\" style={{ borderColor: 'var(--banner-border)' }}>\n <th className=\"py-4 px-4 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">{t('purpose_description') || 'Purpose / Description'}</th>\n <th className=\"py-4 px-3 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">{t('data_elements') || 'Data Elements'}</th>\n <th className=\"py-4 px-3 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">{t('data_processors') || 'Data Processors'}</th>\n <th className=\"py-4 px-3 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">{t('expiration') || 'Expiration'}</th>\n <th className=\"py-4 px-4 text-[0.7em] font-black uppercase tracking-wider text-gray-500 text-right\">{t('status') || 'Status'}</th>\n </tr>\n </thead>\n <tbody>\n {purposes.map(purpose => (\n <PurposeRow\n key={purpose.id}\n purpose={purpose}\n language={language}\n snapshot={snapshot}\n translate={translate}\n onChangePurpose={onChangePurpose}\n finalPrimaryColor={finalPrimaryColor}\n settings={settings}\n />\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Bottom Footer Actions */}\n <div className=\"p-4 border-t bg-gray-50/50\" style={{ borderColor: 'var(--banner-border)' }}>\n {footerText && (\n <div className=\"mb-4\">\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n compact={true}\n />\n </div>\n )}\n\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n isLoading={actionLoading}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={finalPrimaryColor}\n purposes={purposes}\n isBottomReached={true} // Always allow actions in spreadsheet view\n showAcceptAll={true}\n />\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\nimport CollapsibleDataSection from '../shared/CollapsibleDataSection';\n\n// Individual compact row\nfunction CompactPurposeRow({ purpose, banner, onToggle, isExpanded, toggleExpand }) {\n const { snapshot, language, translationVersion, translate } = useBannerTranslation();\n void translationVersion;\n const settings = banner?.bannerSettings || {};\n\n // State for internal sections (Data Elements / Processors)\n const [openSections, setOpenSections] = React.useState({});\n\n const toggleSection = (section) => {\n setOpenSections(prev => ({ ...prev, [section]: !prev[section] }));\n };\n\n const isMandatory = purpose.isMandatory;\n const isAccepted = purpose.consented === 'accepted' || purpose.consented === true;\n const primaryColor = settings.primaryColor || '#3b82f6';\n const mandatoryLabel = settings.mandatoryLabel || translate('necessary');\n\n // Use per-purpose entities\n const dataElements = purpose.dataElements || [];\n const processingActivities = purpose.processingActivities || [];\n const _legalEntities = purpose.legalEntities || [];\n const _tools = purpose.tools || [];\n const dataProcessors = [..._legalEntities, ..._tools];\n\n return (\n <div className=\"border rounded-lg mb-2 overflow-hidden bg-white\" style={{ borderColor: isExpanded ? primaryColor : 'var(--banner-border)' }}>\n <div\n className=\"flex items-center justify-between p-3 gap-3 cursor-pointer hover:bg-gray-50 transition-colors\"\n onClick={toggleExpand}\n >\n {/* Left: Title & Expand Icon */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <svg\n className={`w-4 h-4 text-gray-400 transition-transform ${isExpanded ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <h3 className=\"font-bold text-[0.85em] truncate text-gray-800\">\n {translateDynamic(purpose.name, language, snapshot)}\n </h3>\n {purpose.expiryPeriod && (\n <span className=\"text-[0.7em] text-gray-400 font-normal italic ml-1 shrink-0\">\n ({(translate('expires_in'))} {translateDynamic(purpose.expiryPeriod, language, snapshot)})\n </span>\n )}\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-3 shrink-0\" onClick={(e) => e.stopPropagation()}>\n {isMandatory ? (\n <span className=\"text-[0.65em] uppercase font-extrabold px-1.5 py-0.5 rounded-md tracking-wider border\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', borderColor: 'var(--banner-danger-text)' }}>\n {mandatoryLabel}\n </span>\n ) : (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <span className=\"text-[0.7em] font-medium uppercase text-gray-500 hidden sm:inline\">\n {isAccepted ? translate('accept') : 'Declined'}\n </span>\n <div className=\"switch scale-[0.8] origin-right m-0\">\n <input\n type=\"checkbox\"\n checked={isAccepted}\n onChange={(e) => onToggle(purpose.id, e.target.checked ? 'accepted' : 'declined')}\n />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </div>\n </label>\n )}\n </div>\n </div>\n\n {/* Expanded Content */}\n {isExpanded && (\n <div className=\"p-3 pt-0 border-t bg-gray-50 bg-opacity-30\" style={{ borderColor: 'var(--banner-border)' }}>\n <p className=\"text-[0.8em] text-gray-600 mt-2 mb-3 leading-relaxed\">\n {translateDynamic(purpose.description, language, snapshot)}\n </p>\n\n <div className=\"space-y-2\">\n {processingActivities.length > 0 && (\n <div className=\"text-[0.8em] text-gray-500\">\n <span className=\"font-semibold text-gray-700\">{translate('activities')}:</span>{' '}\n {processingActivities.map(a => translateDynamic(a.name || a, language, snapshot)).join(', ')}\n </div>\n )}\n {dataElements.length > 0 && (\n <CollapsibleDataSection\n title={translate('data_elements')}\n items={dataElements}\n isOpen={!!openSections.elements}\n onToggle={() => toggleSection('elements')}\n chevronLeft={true}\n />\n )}\n {settings.showProcessors !== false && dataProcessors.length > 0 && (\n <CollapsibleDataSection\n title={translate('data_processors')}\n items={dataProcessors}\n isOpen={!!openSections.processors}\n onToggle={() => toggleSection('processors')}\n chevronLeft={true}\n />\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default function CompactListUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n hasUserInteracted,\n actionLoading,\n error,\n}) {\n const settings = banner?.bannerSettings || {};\n\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const footerText = settings.footerText;\n const purposes = banner?.purposes || [];\n\n // State to track which rows are expanded (default to first purpose if present)\n const [expandedRows, setExpandedRows] = useState(\n purposes.length > 0 ? { [purposes[0].id]: true } : {}\n );\n\n const toggleRow = (id) => {\n setExpandedRows(prev => ({\n ...prev,\n [id]: !prev[id]\n }));\n };\n\n return (\n <div className=\"flex flex-col h-full w-full bg-white rounded-xl shadow-2xl overflow-hidden\">\n <div className=\"flex-shrink-0 pt-3.5 pb-2 px-4 border-b bg-gray-50\" style={{ borderColor: 'var(--banner-border)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n <div className=\"flex-1 px-4 py-3 overflow-y-auto bg-white\">\n {purposes.map((p) => (\n <CompactPurposeRow\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n isExpanded={!!expandedRows[p.id]}\n toggleExpand={() => toggleRow(p.id)}\n />\n ))}\n </div>\n\n <div className=\"flex-shrink-0 border-t px-4 py-3 bg-gray-50\" style={{ borderColor: 'var(--banner-border)' }}>\n <div className=\"mb-3\">\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n compact={true}\n />\n </div>\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n isLoading={actionLoading}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={settings.primaryColor}\n purposes={purposes}\n isBottomReached={true} // For compact list, we don't force scroll\n />\n </div>\n </div>\n );\n}\n","/**\n * templateRegistry.js\n *\n * Maps template keys (from banner_settings) to React components.\n * Replaces the if/else tree in TruConsentModal.\n */\n\nimport BannerUI from '../templates/general_consent/BannerUI';\nimport PreferencesModalUI from '../templates/general_consent/PreferencesModalUI';\nimport TabbedBannerUI from '../templates/general_consent/TabbedBannerUI';\nimport CookieBannerUI from '../templates/cookie_consent/CookieBannerUI';\nimport NoticeOnlyBanner from '../templates/notice_only/NoticeOnlyBanner';\nimport InlineSingleRowUI from '../templates/general_consent/InlineSingleRowUI';\nimport CompactListUI from '../templates/general_consent/CompactListUI';\nimport SplitPaneUI from '../templates/general_consent/SplitPaneUI';\n\nconst registry = {\n center_modal: BannerUI,\n tabbed_banner: TabbedBannerUI,\n preferences_modal: PreferencesModalUI,\n floating_card: CookieBannerUI,\n notice_only: NoticeOnlyBanner,\n inline_single_row: InlineSingleRowUI,\n general_compact_list: CompactListUI,\n general_split_pane: SplitPaneUI,\n};\n\n/**\n * Get the template component for a given key.\n * Falls back to BannerUI if the key is not recognized.\n *\n * @param {string} key - Template key from banner_settings\n * @returns {React.Component} Template component\n */\nexport const getTemplate = (key) => registry[key] || registry['center_modal'];\n\n/**\n * Check if a given key is a registered template.\n *\n * @param {string} key\n * @returns {boolean}\n */\nexport const isRegistered = (key) => key in registry;\n","import React, { useState, useRef, useEffect } from 'react';\nimport LanguageProvider from '../shared/LanguageProvider';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\n\nexport default function BannerUI({ banner, companyName, logoUrl, onChangePurpose, onRejectAll, onConsentAll, onAcceptSelected, onAcceptMandatory, hasUserInteracted, primaryColor, secondaryColor }) {\n const [isBottomReached, setIsBottomReached] = useState(false);\n const scrollRef = useRef(null);\n\n // Use bannerSettings from API if available, otherwise fall back to props\n const settings = banner?.bannerSettings || {};\n const finalPrimaryColor = settings.primaryColor || primaryColor || '#3b82f6';\n const finalSecondaryColor = settings.secondaryColor || secondaryColor || '#555';\n const footerText = settings.footerText;\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const actionButtonText = settings.actionButtonText;\n\n const handleScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n // 5px threshold for \"bottom\"\n if (scrollHeight - scrollTop <= clientHeight + 5) {\n setIsBottomReached(true);\n }\n };\n\n // Check if content is already visible without scrolling\n useEffect(() => {\n if (scrollRef.current) {\n const { scrollHeight, clientHeight } = scrollRef.current;\n if (scrollHeight <= clientHeight) {\n setIsBottomReached(true);\n } else {\n setIsBottomReached(false);\n }\n }\n }, [banner?.purposes]);\n\n const styleVars = {\n '--font-type': settings.fontType,\n '--font-size': settings.fontSize,\n '--banner-primary-color': finalPrimaryColor,\n '--banner-secondary-color': finalSecondaryColor,\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n return (\n <div className=\"rounded-2xl flex flex-col overflow-hidden text-left h-full border\" style={{ ...styleVars, backgroundColor: 'var(--banner-bg)', color: 'var(--banner-text)', borderColor: 'var(--banner-border)' }}>\n <div className=\"flex-shrink-0 pt-3.5 pb-2 px-3 border-b flex flex-col gap-2\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 px-5 py-2.5 space-y-2.5 overflow-y-auto\"\n style={{ backgroundColor: 'var(--banner-bg)' }}\n >\n {banner?.purposes?.map((p) => (\n <ModernPurposeCard\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n />\n ))}\n\n {banner?.purposes?.some(p => p.consented === 'declined' || p.consented === false) && settings.warningMessage && (\n <div className=\"py-2 px-3 border rounded-lg flex items-start gap-2.5 animate-in fade-in slide-in-from-top-1 duration-200\"\n style={{ backgroundColor: 'var(--banner-warning-bg)', borderColor: 'var(--banner-warning-border)' }}>\n <svg\n className=\"mt-0.5 flex-shrink-0 opacity-70\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\"\n style={{ color: 'var(--banner-warning-text)' }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <p className=\"text-[0.75em] leading-normal font-medium\" style={{ color: 'var(--banner-warning-text)' }}>\n {settings.warningMessage}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"flex-shrink-0 border-t px-4 py-1.5\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n />\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={banner?.purposes || []}\n actionButtonText={actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={finalPrimaryColor}\n isBottomReached={isBottomReached}\n hasUserInteracted={hasUserInteracted}\n isSplitLayout={banner?.bannerSettings?.generalNoticeTemplate === 'preferences_modal'}\n />\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\n\nfunction PreferencesModalUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n onClose,\n settings\n}) {\n const { snapshot, language, translationVersion, translate } = useBannerTranslation();\n void translationVersion;\n // Use bannerSettings for content if available\n const bannerSettings = banner?.bannerSettings || settings || {};\n const finalPrimaryColor = bannerSettings.primaryColor || '#3b82f6';\n\n const styleVars = {\n '--preferences-primary-color': finalPrimaryColor,\n fontFamily: bannerSettings.fontType || 'inherit',\n fontSize: bannerSettings.fontSize || 'inherit',\n };\n\n const orgName = companyName || 'TruConsent';\n const footerText = bannerSettings.footerText;\n\n // Group purposes or use as-is\n const purposes = banner?.purposes || [];\n\n return (\n <div className=\"preferences-modal-content\" style={styleVars}>\n {/* Header */}\n <div className=\"preferences-header block w-full relative\">\n <ModernBannerHeader\n logoUrl={logoUrl || bannerSettings.logoUrl}\n orgName={orgName}\n bannerTitle={bannerSettings.bannerTitle || translate('cookie_preferences')}\n disclaimerText={bannerSettings.disclaimerText || translate('cookie_preferences_desc')}\n showLanguage={true}\n />\n </div>\n\n\n <div className=\"preferences-purpose-list scrollbar-thin scrollbar-thumb-gray-200 mt-2\">\n {purposes.map((purpose) => (\n <div key={purpose.id} className=\"preferences-purpose-card-wrapper mb-3\">\n <ModernPurposeCard\n purpose={purpose}\n banner={banner}\n onToggle={onChangePurpose}\n />\n </div>\n ))}\n </div>\n\n <div className=\"preferences-footer-container\">\n {settings.footerText && (\n <div className=\"preferences-footer-text\">\n <ModernBannerFooter\n footerText={settings.footerText}\n orgName={companyName}\n compact={true}\n />\n </div>\n )}\n <div className=\"preferences-actions\">\n <button\n type=\"button\"\n className=\"preferences-btn preferences-btn-essential\"\n onClick={onAcceptMandatory}\n >\n {settings.onlyNecessaryText\n ? translateDynamic(settings.onlyNecessaryText, language, snapshot)\n : (t('only_necessary') || 'Only Necessary')}\n </button>\n <div className=\"preferences-actions-right\">\n <button\n type=\"button\"\n className=\"preferences-btn preferences-btn-save\"\n style={{ color: finalPrimaryColor, border: '1px solid var(--banner-border)' }}\n onClick={onAcceptSelected}\n >\n {settings.savePreferencesText\n ? translateDynamic(settings.savePreferencesText, language, snapshot)\n : (t('save_preferences') || 'Save My Preferences')}\n </button>\n <button\n type=\"button\"\n className=\"preferences-btn preferences-btn-accept\"\n style={{ backgroundColor: '#10b981', color: 'white' }}\n onClick={onConsentAll}\n >\n {(settings.actionButtonText || settings.acceptAllText)\n ? translateDynamic(settings.actionButtonText || settings.acceptAllText, language, snapshot)\n : (t('accept_all') || 'Accept All')}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default PreferencesModalUI;\n","import React, { useMemo } from 'react';\n\n/**\n * CookieBannerUI\n *\n * Simplified summary-first cookie consent UI.\n * Actions (Accept All, Reject All, Personalize) are delegated to the parent.\n */\nexport default function CookieBannerUI({\n banner,\n companyName,\n logoUrl,\n onConsentAll,\n onAcceptMandatory,\n onPersonalize,\n primaryColor,\n secondaryColor,\n layoutClass,\n footerText,\n}) {\n const processPlaceholder = (text) => (text || '').replace(/\\[Organization Name\\]/g, companyName || '');\n\n /**\n * Simple markdown link converter for [text](url)\n */\n const convertMarkdownLinks = (text) => {\n const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n return text.replace(markdownLinkRegex, (match, linkText, url) => {\n let fullUrl = url.trim();\n if (!fullUrl.match(/^[a-zA-Z]+:\\/\\//)) {\n fullUrl = `https://${fullUrl}`;\n }\n return `<a href=\"${fullUrl}\" class=\"mcm-link\" target=\"_blank\" rel=\"noopener noreferrer\">${linkText}</a>`;\n });\n };\n\n const styleVars = {\n '--banner-primary-color': primaryColor || '#16a34a',\n '--banner-secondary-color': secondaryColor || '#0f172a',\n };\n\n // Build the dynamic footer content\n const dynamicFooter = useMemo(() => {\n if (!footerText) return null;\n const processed = processPlaceholder(footerText);\n const withLinks = convertMarkdownLinks(processed);\n\n return (\n <div\n className=\"mcm-cookie-summary-footer-links dynamic\"\n dangerouslySetInnerHTML={{ __html: withLinks }}\n />\n );\n }, [footerText, companyName]);\n\n return (\n <div className={`mcm-cookie-banner-ui ${layoutClass}`} style={styleVars}>\n <div className={`mcm-cookie-summary ${layoutClass}`}>\n <div className=\"mcm-cookie-summary-content\">\n <h2 className=\"mcm-cookie-summary-title\">\n {processPlaceholder(banner?.banner_settings?.banner_title || 'Cookie Consent')}\n </h2>\n <p className=\"mcm-cookie-summary-text\">\n {processPlaceholder(banner?.banner_settings?.disclaimer_text || 'We use cookies to improve your experience on our site.')}\n </p>\n </div>\n\n {layoutClass === 'floating-card' && <hr />}\n\n <div className=\"mcm-cookie-summary-actions\">\n <button\n type=\"button\"\n className=\"mcm-summary-btn primary\"\n style={{ backgroundColor: styleVars['--banner-primary-color'] }}\n onClick={onConsentAll}\n >\n Accept All\n </button>\n <button\n type=\"button\"\n className=\"mcm-summary-btn secondary\"\n onClick={onAcceptMandatory}\n >\n Accept Only Necessary\n </button>\n <button\n type=\"button\"\n className=\"mcm-summary-btn text\"\n onClick={onPersonalize}\n >\n Personalize Cookies\n </button>\n </div>\n\n {layoutClass === 'floating-card' && <hr />}\n\n {dynamicFooter}\n\n <div className={`mcm-powered-by ${layoutClass === 'bottom-bar' ? 'vertical' : ''}`}>\n Powered by <span className=\"mcm-brand\">truConsent</span>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { translateDynamic } from '../../runtime/purposeAdapter';\nimport { useBannerTranslation } from '../../i18n/BannerTranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\n\nexport default function SplitPaneUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n hasUserInteracted,\n actionLoading,\n primaryColor,\n secondaryColor\n}) {\n const { snapshot, language, translationVersion, translate } = useBannerTranslation();\n void translationVersion;\n const settings = banner?.bannerSettings || {};\n const purposes = banner?.purposes || [];\n\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const footerText = settings.footerText;\n const finalPrimaryColor = settings.primaryColor || primaryColor || '#3b82f6';\n const mandatoryLabel = settings.mandatoryLabel || translate('necessary');\n\n const [selectedPurposeId, setSelectedPurposeId] = useState(purposes.length > 0 ? purposes[0].id : null);\n\n const activePurpose = purposes.find(p => p.id === selectedPurposeId) || purposes[0];\n\n return (\n <div\n className=\"flex flex-col mx-auto bg-white rounded-xl shadow-2xl overflow-hidden text-left\"\n style={{\n height: '85vh',\n width: '100%',\n border: '1px solid var(--banner-border)',\n backgroundColor: 'var(--banner-bg)',\n color: 'var(--banner-text)'\n }}\n >\n {/* Header - Removing extra padding/margins */}\n <div className=\"flex-shrink-0 pt-3 px-4 border-b flex flex-col\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n {/* Split Content Area */}\n <div className=\"flex flex-1 overflow-hidden min-h-0\">\n\n {/* Left Side: Purpose List */}\n <div className=\"w-1/3 border-r overflow-y-auto\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-bg)' }}>\n {purposes.map((p) => {\n const isMandatory = p.isMandatory;\n const isAccepted = p.consented === 'accepted' || p.consented === true;\n const isSelected = p.id === selectedPurposeId;\n\n return (\n <div\n key={p.id}\n onClick={() => setSelectedPurposeId(p.id)}\n className={`p-4 border-b cursor-pointer transition-colors ${isSelected ? 'bg-[var(--banner-hover-bg)]' : 'hover:bg-[var(--banner-hover-bg)]/50'}`}\n style={{ borderColor: 'var(--banner-border)' }}\n >\n <div className=\"flex items-center justify-between mb-1\">\n <div className=\"flex flex-col flex-1 min-w-0\">\n <h3 className={`font-bold text-[0.95em] truncate ${isSelected ? 'text-[var(--banner-primary-color)]' : ''}`}>\n {translateDynamic(p.name, language, snapshot)}\n </h3>\n {p.expiryPeriod && (\n <span className=\"text-[0.7em] text-[var(--banner-text-muted)] italic font-normal\">\n {(t('expires_in') || 'Expires in')} {translateDynamic(p.expiryPeriod, language, snapshot)}\n </span>\n )}\n </div>\n <div onClick={(e) => e.stopPropagation()} className=\"shrink-0 ml-2\">\n {isMandatory ? (\n <span className=\"text-[0.65em] uppercase font-extrabold px-2 py-0.5 rounded-md tracking-wider border\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', borderColor: 'var(--banner-danger-text)' }}>\n {mandatoryLabel}\n </span>\n ) : (\n <label className=\"switch scale-75 origin-right\">\n <input\n type=\"checkbox\"\n checked={isAccepted}\n onChange={(e) => onChangePurpose(p.id, e.target.checked ? 'accepted' : 'declined')}\n />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </label>\n )}\n </div>\n </div>\n <p className=\"text-[0.8em] text-[var(--banner-text-muted)] line-clamp-2 leading-tight\">\n {translateDynamic(p.description, language, snapshot)}\n </p>\n </div>\n );\n })}\n </div>\n\n {/* Right Side: Detail View */}\n <div className=\"flex-1 overflow-y-auto p-6 bg-white\" style={{ backgroundColor: 'var(--banner-bg)' }}>\n {activePurpose ? (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-xl font-bold mb-3\" style={{ color: 'var(--banner-text)' }}>\n {translateDynamic(activePurpose.name, language, snapshot)}\n </h2>\n <p className=\"text-[0.95em] leading-relaxed\" style={{ color: 'var(--banner-text-muted)' }}>\n {translateDynamic(activePurpose.description, language, snapshot)}\n </p>\n </div>\n\n {/* Processing Activities */}\n {activePurpose.processingActivities?.length > 0 && (\n <div className=\"border-t pt-6\" style={{ borderColor: 'var(--banner-border)' }}>\n <h4 className=\"text-[0.85em] font-bold mb-2 uppercase tracking-wide\" style={{ color: 'var(--banner-text)' }}>\n {t('processing_activities') || 'Processing Activities'}\n </h4>\n <div className=\"flex flex-wrap gap-1.5\">\n {activePurpose.processingActivities.map((a, idx) => (\n <span key={idx} className=\"px-2.5 py-1 rounded-full text-[0.75em] font-medium border\"\n style={{ backgroundColor: 'var(--banner-btn-secondary-bg)', color: 'var(--banner-text-muted)', borderColor: 'var(--banner-btn-secondary-border)' }}>\n {translateDynamic(a.name || a, language, snapshot)}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Data Elements (Direct List) */}\n {activePurpose.dataElements?.length > 0 && (\n <div className=\"border-t pt-6\" style={{ borderColor: 'var(--banner-border)' }}>\n <h4 className=\"text-[0.85em] font-bold mb-2 uppercase tracking-wide\" style={{ color: 'var(--banner-text)' }}>\n {t('data_elements')} ({activePurpose.dataElements.length})\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n {activePurpose.dataElements.map((item, idx) => (\n <span key={idx} className=\"px-3 py-1 rounded-full text-[0.8em] border\"\n style={{ backgroundColor: 'var(--banner-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item, language, snapshot)}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Data Processors (Direct List) */}\n {settings.showProcessors !== false && (activePurpose.legalEntities?.length > 0 || activePurpose.tools?.length > 0) && (\n <div className=\"border-t pt-6\" style={{ borderColor: 'var(--banner-border)' }}>\n <h4 className=\"text-[0.85em] font-bold mb-2 uppercase tracking-wide\" style={{ color: 'var(--banner-text)' }}>\n {t('data_processors') || 'Data Processors'} ({[...(activePurpose.legalEntities || []), ...(activePurpose.tools || [])].length})\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n {[...(activePurpose.legalEntities || []), ...(activePurpose.tools || [])].map((item, idx) => (\n <span key={idx} className=\"px-3 py-1 rounded-full text-[0.8em] border\"\n style={{ backgroundColor: 'var(--banner-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item, language, snapshot)}\n </span>\n ))}\n </div>\n </div>\n )}\n\n </div>\n ) : (\n <div className=\"h-full flex items-center justify-center text-[var(--banner-text-muted)] italic\">\n {t('select_purpose_hint') || 'Select a purpose from the left to view details'}\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex-shrink-0 border-t px-4 py-2\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n />\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={purposes}\n isLoading={actionLoading}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={finalPrimaryColor}\n isBottomReached={true}\n isSplitLayout={true}\n showAcceptAll={true}\n hasUserInteracted={hasUserInteracted}\n />\n </div>\n </div>\n );\n}\n","/**\n * useConsentEngine.js\n *\n * Custom React hook that extracts all consent logic from TruConsentModal\n * into a reusable, testable unit.\n *\n * Manages: purpose normalization, dynamic filtering, action handlers,\n * event logging (with notice_shown separation), and H-Case intercept.\n */\n\nimport { useState, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { normalizePurposes, filterDynamicPurposes } from './purposeAdapter';\nimport { deriveUIState } from './bannerState';\n\n/** Generate a simple session ID for metadata tracking */\nfunction generateSessionId() {\n return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * @param {object} options\n * @param {object} options.bannerData - Raw banner data from API\n * @param {string} options.apiUrl - Full API base (e.g. https://api.truconsent.com)\n * @param {string} options.apiBaseUrl - Short base URL override\n * @param {string} options.apiKey - API key (mutually exclusive with token for auth)\n * @param {string} options.token - JWT token\n * @param {string} options.effectiveOrgId - Resolved organization ID\n * @param {string} options.userId - User/device ID\n * @param {string} options.assetId - Asset ID (required for API key, optional for JWT)\n * @param {function} options.onSubmit - Optional custom submission handler\n * @param {Array} options.previousConsent - Previous consent records for dynamic filtering\n * @param {number} options.bannerFetchAt - Absolute timestamp when banner fetch completed\n * @returns {object} Consent engine interface\n */\nconst EMPTY_ARRAY = [];\n\nexport default function useConsentEngine({\n bannerData,\n apiUrl,\n apiBaseUrl,\n apiKey,\n token,\n effectiveOrgId,\n userId,\n assetId,\n onSubmit,\n previousConsent = EMPTY_ARRAY,\n bannerFetchAt = null,\n bannerFetchStart = null,\n extraMetadata = {},\n}) {\n // --- Performance Tracking ---\n const [bannerDisplayAt, setBannerDisplayAt] = useState(null);\n\n // Capture display time when bannerData becomes available\n useEffect(() => {\n if (bannerData && !bannerDisplayAt) {\n setBannerDisplayAt(Date.now());\n if (bannerFetchStart) {\n const displayMs = (performance.now() - bannerFetchStart).toFixed(1);\n console.log(`[TruConsent] Banner displayed after ${displayMs}ms`);\n }\n }\n }, [bannerData, bannerDisplayAt, bannerFetchStart]);\n\n // --- Request ID & Session ID (stable for this banner render) ---\n const [requestId] = useState(() => crypto.randomUUID());\n const [sessionId] = useState(() => generateSessionId());\n\n // --- Refs for action gating ---\n const actionTakenRef = useRef(false);\n const actionRunningRef = useRef(false);\n const noticeLoggedAtRef = useRef(null);\n\n // --- Loading / error state ---\n const [actionLoading, setActionLoading] = useState(false);\n const [error, setError] = useState('');\n\n // --- H-Case state ---\n const [hCaseData, setHCaseData] = useState({ show: false, action: null, intendedPurposes: null });\n\n // --- User interaction tracking ---\n const [hasUserInteracted, setHasUserInteracted] = useState(false);\n\n // --- Normalize & filter purposes ---\n const defaultSelection = bannerData?.bannerSettings?.defaultSelection || 'mandatory_only';\n\n const initialPurposes = useMemo(() => {\n const normalized = normalizePurposes(bannerData?.purposes, defaultSelection);\n return filterDynamicPurposes(normalized, previousConsent);\n }, [bannerData?.purposes, defaultSelection, previousConsent]);\n\n const [purposes, setPurposes] = useState(initialPurposes);\n\n // *** FIX: Sync purposes when bannerData loads after initial render ***\n useEffect(() => {\n if (initialPurposes.length > 0) {\n setPurposes(initialPurposes);\n }\n }, [initialPurposes]);\n\n // --- UI State ---\n const uiState = useMemo(() => deriveUIState(purposes), [purposes]);\n\n // --- Build auth headers ---\n const buildHeaders = useCallback(() => {\n const headers = {\n 'Content-Type': 'application/json',\n 'X-Org-Id': effectiveOrgId,\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n } else if (apiKey) {\n headers['X-API-Key'] = apiKey;\n }\n return headers;\n }, [token, apiKey, effectiveOrgId]);\n\n // --- Send notice_shown for notice purposes ---\n const sendNoticeShown = useCallback(async (metadata = {}) => {\n if (uiState.noticePurposes.length === 0) return;\n\n try {\n const formattedNoticePurposes = uiState.noticePurposes.map(p => ({\n purposeId: p.id,\n version: p.version || 'v1.0',\n consented: 'shown',\n purpose_type: 'legitimate_interest',\n is_mandatory: !!(p.is_mandatory || p.isMandatory),\n }));\n\n const collectionPointVersion = bannerData?.version || 'v1.0';\n\n const noticeMetadata = {\n sessionId,\n ...metadata,\n event_type: 'notice_shown',\n performance: {\n banner_fetched_at: bannerFetchAt,\n banner_displayed_at: bannerDisplayAt,\n }\n };\n\n const payload = {\n userId,\n requestId,\n assetId: assetId || undefined,\n consentLanguage: 'en',\n collectionPointId: bannerData?.collectionPoint,\n collectionPointVersion,\n consentTimestamp: Date.now(),\n source: 'npm',\n purposes: formattedNoticePurposes,\n action: 'notice_shown',\n metadata: noticeMetadata,\n };\n\n if (onSubmit) {\n await onSubmit(payload);\n } else {\n const requestUrl = apiUrl\n ? `${apiUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`\n : `${apiBaseUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`;\n\n const res = await fetch(requestUrl, {\n method: 'POST',\n headers: buildHeaders(),\n keepalive: true,\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n console.warn(`[TruConsent] notice_shown log failed with status ${res.status}`);\n }\n }\n // Mark when notice logging completed\n noticeLoggedAtRef.current = Date.now();\n } catch (e) {\n console.error('Failed to log notice_shown:', e);\n }\n }, [uiState.noticePurposes, userId, requestId, assetId, onSubmit, apiUrl, apiBaseUrl, bannerData, buildHeaders, bannerFetchAt, bannerDisplayAt, sessionId]);\n\n // notice_shown is logged only when the user explicitly clicks a button (acknowledgeNotice / i_understand)\n\n const sendSuppressionUpdate = useCallback((purposePayload) => {\n if (onSubmit) return; // custom submit handler — skip suppression call\n const declinedIds = (purposePayload || purposes)\n .filter(p => p.consented === 'declined' || p.consented === false)\n .map(p => p.id)\n .filter(Boolean);\n if (!declinedIds.length || !userId) return;\n\n const baseUrl = apiUrl || apiBaseUrl;\n const suppressionUrl = `${baseUrl}/api/v1/internal/consent/suppression`;\n fetch(suppressionUrl, {\n method: 'POST',\n headers: buildHeaders(),\n keepalive: true,\n body: JSON.stringify({ userId, declinedPurposeIds: declinedIds }),\n }).catch(e => console.warn('[TruConsent] suppression update failed:', e));\n }, [purposes, userId, onSubmit, apiUrl, apiBaseUrl, buildHeaders]);\n\n const sendLogEvent = useCallback(async (action, purposePayload, metadata) => {\n if (!bannerData || actionRunningRef.current) return;\n\n if (action !== 'no_action') {\n actionTakenRef.current = true;\n }\n\n actionRunningRef.current = true;\n try {\n // Build purposes in the required format: purposeId, version, consented\n const rawPurposes = purposePayload || purposes;\n const formattedPurposes = rawPurposes.map(p => {\n const isLegitimate = p.legalBasis === 'notice' || p.isLegitimate || p.is_legitimate;\n \n // For legitimate interest, the status should be 'shown' regardless of UI 'accepted' state\n const consentedStatus = isLegitimate ? 'shown' : (p.consented === true ? 'accepted' : p.consented === false ? 'declined' : (p.consented || 'declined'));\n \n return {\n purposeId: p.id,\n version: p.version || 'v1.0',\n consented: consentedStatus,\n purpose_type: p.purpose_type || (isLegitimate ? 'legitimate_interest' : 'consent'),\n is_mandatory: !!(p.is_mandatory || p.isMandatory)\n };\n });\n\n const collectionPointVersion = bannerData?.version || 'v1.0';\n\n const payload = {\n userId,\n requestId,\n assetId: assetId || undefined,\n consentLanguage: 'en',\n collectionPointId: bannerData?.collectionPoint,\n collectionPointVersion,\n consentTimestamp: Date.now(),\n source: 'npm',\n purposes: formattedPurposes,\n action,\n metadata: {\n sessionId,\n ...extraMetadata,\n ...metadata,\n collection_point_version: collectionPointVersion,\n performance: {\n banner_fetched_at: bannerFetchAt,\n banner_displayed_at: bannerDisplayAt,\n user_interaction_at: Date.now(),\n notice_logged_at: noticeLoggedAtRef.current,\n }\n },\n };\n\n if (onSubmit) {\n await onSubmit(payload);\n } else {\n // Step 1: Record consent log\n const requestUrl = apiUrl\n ? `${apiUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`\n : `${apiBaseUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`;\n\n const res = await fetch(requestUrl, {\n method: 'POST',\n headers: buildHeaders(),\n keepalive: true,\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n if (res.status === 401) throw new Error('Unauthorized - Invalid API key');\n if (res.status === 403) throw new Error('Forbidden - Your origin or API key scope is not allowed to record consent');\n if (res.status === 429) throw new Error('Rate limit exceeded - Please try again later');\n throw new Error('Failed to record consent event');\n }\n\n // Step 2: Update suppression tracking (fire-and-forget, does not block)\n sendSuppressionUpdate(rawPurposes);\n }\n } catch (e) {\n console.error('Failed to log consent event:', e);\n throw e;\n } finally {\n actionRunningRef.current = false;\n }\n }, [bannerData, userId, purposes, requestId, assetId, onSubmit, apiUrl, apiBaseUrl, buildHeaders, bannerFetchAt, bannerDisplayAt, sessionId, sendSuppressionUpdate]);\n\n // --- Toggle a single purpose ---\n const togglePurpose = useCallback((purposeId, newStatus) => {\n setHasUserInteracted(true);\n setPurposes(prev =>\n prev.map(p => p.id === purposeId ? { ...p, consented: newStatus } : p)\n );\n }, []);\n\n // --- H-Case intercept check ---\n // Only triggers when a MANDATORY consent purpose is NOT accepted\n const checkHCaseIntercept = useCallback((action, customPurposes = null) => {\n const targetPurposes = customPurposes || purposes;\n const hasDeclinedMandatory = targetPurposes.some(\n p => p.isMandatory && p.legalBasis === 'consent' &&\n (p.consented === 'declined' || p.consented === false)\n );\n\n if (hasDeclinedMandatory && !hCaseData.show) {\n setHCaseData({ show: true, action, intendedPurposes: targetPurposes });\n return true; // intercepted\n }\n return false;\n }, [purposes, hCaseData.show]);\n\n // =====================================================================\n // ACTION HANDLERS\n // =====================================================================\n\n /** Accept All: Approved for all purposes */\n const acceptAll = useCallback(async (metadata = {}) => {\n setActionLoading(true);\n setError('');\n try {\n const acceptedPurposes = purposes.map(p => ({\n ...p,\n consented: 'accepted',\n }));\n\n const enhancedMetadata = { ...metadata, button_used: 'accept_all' };\n await sendLogEvent('Approved', acceptedPurposes, enhancedMetadata);\n return 'Approved';\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n }\n }, [purposes, sendLogEvent]);\n\n /** Reject All: Declined for all purposes */\n const rejectAll = useCallback(async (metadata = {}) => {\n const declinedPurposes = purposes.map(p => ({\n ...p,\n consented: 'declined',\n }));\n\n // Intercept if mandatory consent is being declined\n if (checkHCaseIntercept('Declined', declinedPurposes)) return null;\n\n setActionLoading(true);\n setError('');\n try {\n const enhancedMetadata = { ...metadata, button_used: 'reject_all' };\n await sendLogEvent('Declined', declinedPurposes, enhancedMetadata);\n return 'Declined';\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n }\n }, [purposes, checkHCaseIntercept, sendLogEvent]);\n\n /** Only Necessary: accept mandatory, decline optional */\n const onlyNecessary = useCallback(async (metadata = {}) => {\n setActionLoading(true);\n setError('');\n try {\n // Construct payload: mandatory accepted, optional declined\n const mandatoryPurposes = purposes.map(p => ({\n ...p,\n consented: p.isMandatory ? 'accepted' : 'declined',\n }));\n\n const enhancedMetadata = { ...metadata, button_used: 'only_necessary' };\n\n // If there are optional purposes, it's partial; otherwise approved\n const hasOptional = purposes.some(p => !p.isMandatory && p.legalBasis === 'consent');\n const action = hasOptional ? 'Partially Consented' : 'Approved';\n\n await sendLogEvent(action, mandatoryPurposes, enhancedMetadata);\n return action;\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n }\n }, [purposes, sendLogEvent]);\n\n /** Save Preferences / I Consent */\n const savePreferences = useCallback(async (metadata = {}) => {\n // Intercept if mandatory consent is not accepted\n const hasDeclinedMandatory = purposes.some(\n p => p.isMandatory && p.legalBasis === 'consent' &&\n (p.consented === 'declined' || p.consented === false)\n );\n if (hasDeclinedMandatory && checkHCaseIntercept('Partially Consented')) return null;\n\n setActionLoading(true);\n setError('');\n try {\n const enhancedMetadata = {\n button_used: 'save_preferences',\n ...metadata,\n };\n\n const consentPurposes = purposes.filter(p => p.legalBasis === 'consent');\n const totalCount = consentPurposes.length;\n const acceptedCount = consentPurposes.filter(p => p.consented === 'accepted' || p.consented === true).length;\n \n let action;\n if (totalCount > 0) {\n if (acceptedCount === 0) {\n action = 'Declined';\n } else if (acceptedCount === totalCount) {\n action = 'Approved';\n } else {\n action = 'Partially Consented';\n }\n } else {\n action = 'Approved'; // No consent-based purposes to decline\n }\n\n await sendLogEvent(action, purposes, enhancedMetadata);\n return action;\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n }\n }, [purposes, checkHCaseIntercept, sendLogEvent]);\n\n /** Close Banner: No Action */\n const closeBanner = useCallback(async () => {\n if (!actionTakenRef.current) {\n // Force all consent purposes to declined, legitimate interest stays shown\n const noActionPurposes = purposes.map(p => {\n const isLegitimate = p.legalBasis === 'notice' || p.isLegitimate || p.is_legitimate;\n return { ...p, consented: isLegitimate ? 'shown' : 'declined' };\n });\n await sendLogEvent('No Action', noActionPurposes, { button_used: 'close' });\n actionTakenRef.current = true;\n }\n return 'No Action';\n }, [purposes, sendLogEvent]);\n\n /** Notice-only: I Understand — fires notice_shown only */\n const acknowledgeNotice = useCallback(async (metadata = {}) => {\n setActionLoading(true);\n setError('');\n try {\n await sendNoticeShown({ ...metadata, button_used: 'i_understand' });\n actionTakenRef.current = true;\n return 'notice_shown';\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n }\n }, [sendNoticeShown]);\n\n // =====================================================================\n // H-CASE POPUP HANDLERS\n // =====================================================================\n\n /**\n * Proceed / OK button in H-Case popup.\n * - Allow Override (soft_first): \"Proceed Anyway\" → Partially Consented\n * - Enforce Acknowledgment (hard_immediate): \"OK\" → Partially Consented\n * Both strategies submit Partially Consented.\n */\n const handleHCaseProceed = useCallback(async () => {\n setActionLoading(true);\n setError('');\n try {\n const metadata = {\n h_case_warning_shown: true,\n h_case_acknowledged: true,\n button_used: 'h_case_proceed',\n };\n\n const finalAction = hCaseData.action || 'Partially Consented';\n await sendLogEvent(finalAction, hCaseData.intendedPurposes, metadata);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n return finalAction;\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n }\n }, [sendLogEvent, hCaseData]);\n\n /**\n * Go Back button in H-Case popup (Allow Override mode only).\n * NO logging — just dismiss popup and return to banner.\n */\n const handleHCaseBack = useCallback(() => {\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n // No logging — user goes back to the banner to change selections\n }, []);\n\n return {\n // State\n purposes,\n uiState,\n actionLoading,\n error,\n hCaseData,\n requestId,\n actionTakenRef,\n hasUserInteracted,\n\n // Actions\n actions: {\n acceptAll,\n rejectAll,\n onlyNecessary,\n savePreferences,\n closeBanner,\n togglePurpose,\n acknowledgeNotice,\n },\n\n // H-Case handlers\n hCaseActions: {\n handleHCaseProceed,\n handleHCaseBack,\n },\n\n // Internals (exposed for TruConsentModal compatibility)\n sendLogEvent,\n };\n}\n","\nimport React from 'react';\n\nexport default function HCaseWarningPopup({\n settings,\n onProceed,\n onBack,\n primaryColor\n}) {\n const strategy = settings.h_case_logging_strategy || 'soft_first';\n const isHard = strategy === 'hard_immediate';\n\n const popupMessage = settings.h_case_warning_message || 'Important: You have not provided consent for one or more required items. Please acknowledge this to continue.';\n const proceedText = settings.h_case_proceed_button_text || (isHard ? 'OK' : 'Proceed Anyway');\n const backText = settings.h_case_back_button_text || 'Go Back';\n\n return (\n <div className=\"mcm-hcase-overlay\">\n <div className=\"mcm-hcase-container\">\n <div className=\"mcm-hcase-icon\">\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#f59e0b\" strokeWidth=\"2\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n </div>\n <h3 className=\"mcm-hcase-title\">Consent Required</h3>\n <p className=\"mcm-hcase-message\">{popupMessage}</p>\n\n <div className=\"mcm-hcase-actions\">\n {!isHard && (\n <button\n className=\"mcm-hcase-btn back\"\n onClick={onBack}\n style={{ backgroundColor: settings.h_case_back_button_color || '#f3f4f6' }}\n >\n {backText}\n </button>\n )}\n <button\n className=\"mcm-hcase-btn proceed\"\n style={{ backgroundColor: settings.h_case_proceed_button_color || primaryColor || '#3b82f6' }}\n onClick={onProceed}\n >\n {proceedText}\n </button>\n </div>\n </div>\n <style>{`\n .mcm-hcase-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.35);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 99999;\n animation: mcmFadeIn 0.3s ease-out;\n }\n .mcm-hcase-container {\n background: white;\n border-radius: 20px;\n padding: 40px;\n max-width: 480px;\n width: 90%;\n text-align: center;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n transform: translateY(0);\n animation: mcmSlideUp 0.3s ease-out;\n }\n .mcm-hcase-icon {\n margin-bottom: 20px;\n display: flex;\n justify-content: center;\n animation: mcmPop 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .mcm-hcase-title {\n font-size: 1.5rem;\n font-weight: 800;\n color: #111827;\n margin-bottom: 16px;\n letter-spacing: -0.025em;\n }\n .mcm-hcase-message {\n font-size: 1rem;\n color: #4b5563;\n line-height: 1.6;\n margin-bottom: 32px;\n }\n .mcm-hcase-actions {\n display: flex;\n gap: 16px;\n justify-content: center;\n }\n .mcm-hcase-btn {\n padding: 12px 28px;\n border-radius: 12px;\n font-size: 1rem;\n font-weight: 700;\n border: none;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .mcm-hcase-btn:active {\n transform: scale(0.95);\n }\n .mcm-hcase-btn.back {\n background: #f3f4f6;\n color: #374151;\n }\n .mcm-hcase-btn.back:hover {\n background: #e5e7eb;\n transform: translateY(-1px);\n }\n .mcm-hcase-btn.proceed {\n color: white;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n }\n .mcm-hcase-btn.proceed:hover {\n filter: brightness(1.05);\n transform: translateY(-1px);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n @keyframes mcmFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes mcmSlideUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes mcmPop {\n from { opacity: 0; transform: scale(0.5); }\n to { opacity: 1; transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n","// TruConsentModal.jsx\nimport React, { useEffect, useState, useRef } from 'react';\nimport * as ReactDOM from 'react-dom';\nimport '../styles/consent-modal.css';\n\nimport { normalizePurposes } from '../runtime/purposeAdapter';\nimport { deriveUIState, BANNER_CASE, detectBannerCase } from '../runtime/bannerState';\nimport { getTemplate } from '../runtime/templateRegistry';\nimport useConsentEngine from '../runtime/useConsentEngine';\nimport TabbedBannerUI from '../templates/general_consent/TabbedBannerUI';\n\nimport HCaseWarningPopup from './HCaseWarningPopup';\nimport LanguageProvider from '../templates/shared/LanguageProvider';\n\n// Helper to normalize relative logo URLs\nconst normalizeUrl = (url, baseUrl) => {\n if (!url || !baseUrl) return url;\n if (url.startsWith('http') || url.startsWith('data:')) return url;\n \n const cleanBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const cleanUrl = url.startsWith('/') ? url : `/${url}`;\n \n return `${cleanBase}${cleanUrl}`;\n};\n\nexport default function TruConsentModal(props) {\n const {\n apiKey,\n organizationId,\n bannerId,\n userId,\n assetId,\n apiUrl,\n apiBaseUrl,\n theme = 'light',\n logoUrl,\n companyName = 'Mars Company',\n onClose,\n onSubmit,\n token,\n initialLanguage,\n } = props;\n\n const [banner, setBanner] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [fetchError, setFetchError] = useState(null);\n const [visible, setVisible] = useState(true);\n const [showFullNotice, setShowFullNotice] = useState(false);\n const [bannerFetchAt, setBannerFetchAt] = useState(null);\n const fetchStartRef = useRef(null);\n\n // Re-consent state — auto-detected from banner API response\n const [reconsentCampaignId, setReconsentCampaignId] = useState(null);\n const [reconsentUiMode, setReconsentUiMode] = useState('full_cp');\n const [versionDiff, setVersionDiff] = useState(null);\n const [reconsentCampaignStatus, setReconsentCampaignStatus] = useState(null);\n // True when the banner is served from a dedicated re-consent CP (new_collection_point method).\n // In this case only the Re-consent tab should be shown.\n const [reconsentIsDedicatedCp, setReconsentIsDedicatedCp] = useState(false);\n // \"version_update\" (existing) or \"expiry\" (new)\n const [reconsentSource, setReconsentSource] = useState(null);\n // ID of the ExpiryReconsentRequest — sent in consent log metadata for resolution\n const [expiryReconsentRequestId, setExpiryReconsentRequestId] = useState(null);\n\n const closeButtonClickedRef = useRef(false);\n\n const effectiveOrgId = organizationId;\n\n // Resolve assetId: prop > JWT-decoded (only for JWT/consent-link flow)\n const [resolvedAssetId, setResolvedAssetId] = useState(assetId || null);\n\n // Derive company / logo from banner.organization when available\n const resolvedCompanyName =\n (banner && (banner.organizationName || (banner.organization && banner.organization.name))) ||\n companyName;\n\n const effectiveBaseUrl = apiUrl || apiBaseUrl;\n \n // Prioritize explicitly passed logoUrl prop over backend organization logo\n const resolvedLogoUrl = logoUrl || ((banner && banner.organization && banner.organization.logoUrl)\n ? normalizeUrl(banner.organization.logoUrl, effectiveBaseUrl)\n : null);\n console.log('[TruConsent] resolvedLogoUrl:', resolvedLogoUrl, { logoUrl, effectiveBaseUrl });\n\n // =====================================================================\n // FETCH BANNER DATA\n // =====================================================================\n\n\n useEffect(() => {\n if (!bannerId) {\n setIsLoading(false);\n return;\n }\n if (!userId) {\n console.warn('TruConsent: Valid userId or deviceId is highly recommended but not provided.');\n }\n if (!token && !apiKey) {\n setIsLoading(false);\n return;\n }\n if (!effectiveOrgId) {\n setIsLoading(false);\n return;\n }\n\n // Determine assetId: explicit prop or from JWT\n let effectiveAssetId = assetId || null;\n if (!effectiveAssetId && token) {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n effectiveAssetId = payload.asset_id;\n } catch (e) {\n console.warn('TruConsent: Failed to decode JWT token', e);\n }\n }\n setResolvedAssetId(effectiveAssetId);\n\n // For API key auth, assetId is required\n if (apiKey && !effectiveAssetId) {\n console.error('TruConsent: assetId is required when using API key authentication');\n setIsLoading(false);\n return;\n }\n\n // ── Unified endpoint: GET /api/v1/consent/{asset_id}/{banner_id} ──────────\n const basePath = '/api/v1/internal/consent';\n\n const buildFetchUrl = (baseUrl, path, bId, aId, uId) => {\n const effectivePath = aId ? `${path}/${aId}/${bId}` : `${path}/${bId}`;\n const url = `${baseUrl}${effectivePath}`;\n return uId ? `${url}?userId=${encodeURIComponent(uId)}` : url;\n };\n\n const fetchUrl = apiUrl\n ? buildFetchUrl(apiUrl, basePath, bannerId, effectiveAssetId, userId)\n : buildFetchUrl(apiBaseUrl, basePath, bannerId, effectiveAssetId, userId);\n\n const headers = {\n 'Content-Type': 'application/json',\n 'X-Org-Id': effectiveOrgId,\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n } else if (apiKey) {\n headers['X-API-Key'] = apiKey;\n }\n\n // ETag-based conditional fetch: send cached ETag so server can return 304\n // when banner config hasn't changed (eliminates JSON transfer + parsing).\n // Only used for non-userId fetches since user-specific data is always live.\n const etagKey = `truConsent_etag_${bannerId}`;\n const cachedEtag = !userId ? sessionStorage.getItem(etagKey) : null;\n const cachedBannerKey = `truConsent_banner_${bannerId}`;\n if (cachedEtag) {\n headers['If-None-Match'] = cachedEtag;\n }\n\n setIsLoading(true);\n fetchStartRef.current = performance.now();\n console.log('[TruConsent] Banner fetch START →', fetchUrl);\n fetch(fetchUrl, { headers })\n .then((res) => {\n if (res.status === 401) {\n throw new Error('Unauthorized - Invalid or missing API key');\n }\n if (res.status === 403) {\n throw new Error('Forbidden - This domain is not authorized to display this content');\n }\n if (res.status === 429) {\n throw new Error('Rate limit exceeded - Please try again in a moment');\n }\n // 304: banner unchanged — use sessionStorage cache\n if (res.status === 304) {\n const cached = sessionStorage.getItem(cachedBannerKey);\n if (cached) return JSON.parse(cached);\n }\n if (!res.ok) throw new Error('Service temporarily unavailable - Please try again later');\n // Store ETag and response body for future conditional requests\n const newEtag = res.headers.get('etag');\n if (newEtag && !userId) {\n sessionStorage.setItem(etagKey, newEtag);\n return res.json().then((d) => {\n sessionStorage.setItem(cachedBannerKey, JSON.stringify(d));\n return d;\n });\n }\n return res.json();\n })\n .then((data) => {\n const fetchMs = (performance.now() - fetchStartRef.current).toFixed(1);\n setBannerFetchAt(Date.now());\n console.log(`[TruConsent] Banner fetched in ${fetchMs}ms →`, fetchUrl);\n const normalizedTranslationsSnapshot = data.translationsSnapshot || data.translations_snapshot || null;\n console.log('[TruConsent] translationsSnapshot in response:', !!normalizedTranslationsSnapshot, normalizedTranslationsSnapshot ? Object.keys(normalizedTranslationsSnapshot) : 'null');\n\n // Auto-detect re-consent context from banner API response\n if (data.reconsentMode) {\n setReconsentCampaignId(data.reconsentCampaignId || null);\n setReconsentUiMode(data.reconsentUiMode || 'full_cp');\n setVersionDiff(data.versionDiff || null);\n setReconsentCampaignStatus(data.reconsentCampaignStatus || null);\n setReconsentIsDedicatedCp(Boolean(data.reconsentIsDedicatedCp) || (bannerId && bannerId.endsWith('-rc')));\n setReconsentSource(data.reconsentSource || 'version_update');\n setExpiryReconsentRequestId(data.expiryReconsentRequestId || null);\n // For temp_profile: replace purposes with campaign-scoped ones\n if (data.reconsentPurposes && data.reconsentPurposes.length > 0) {\n data = { ...data, purposes: data.reconsentPurposes };\n }\n }\n\n // AUTO-HIDE if user is already fully consented (Progressive Consent)\n // Skip auto-hide when in re-consent mode — the DP must re-confirm\n if (!data.reconsentMode && (data.consentStatus === 'complete' || (!data.purposes || data.purposes.length === 0))) {\n setVisible(false);\n if (onClose) onClose('no_action');\n return;\n }\n\n // Normalize purposes using purposeAdapter\n const defaultSelection = data.bannerSettings?.defaultSelection || 'mandatory_only';\n const initializedPurposes = normalizePurposes(data.purposes, defaultSelection);\n\n setBanner({\n ...data,\n translationsSnapshot: normalizedTranslationsSnapshot,\n translations_snapshot: data.translations_snapshot || normalizedTranslationsSnapshot || undefined,\n purposes: initializedPurposes,\n });\n })\n .catch((e) => {\n const fetchMs = fetchStartRef.current ? (performance.now() - fetchStartRef.current).toFixed(1) : 'unknown';\n console.error(`[TruConsent] Banner fetch ERROR after ${fetchMs}ms:`, e);\n \n // Improve \"Failed to fetch\" message (usually network or CORS)\n let msg = e.message || 'Failed to load banner configuration';\n if (msg === 'Failed to fetch') {\n msg = 'Unable to connect to the server. Please check your internet connection or allowed domains.';\n }\n \n setFetchError(msg);\n })\n .finally(() => setIsLoading(false));\n }, [bannerId, apiKey, effectiveOrgId, apiBaseUrl, apiUrl, assetId, token]);\n\n // =====================================================================\n // CONSENT ENGINE HOOK\n // =====================================================================\n const extraMeta = {\n ...(reconsentCampaignId ? { reconsent_campaign_id: reconsentCampaignId } : {}),\n ...(expiryReconsentRequestId ? { expiry_reconsent_request_id: expiryReconsentRequestId } : {}),\n };\n\n const engine = useConsentEngine({\n bannerData: banner,\n apiUrl,\n apiBaseUrl,\n apiKey,\n token,\n effectiveOrgId,\n userId,\n assetId: resolvedAssetId,\n onSubmit,\n bannerFetchAt,\n bannerFetchStart: fetchStartRef.current,\n extraMetadata: extraMeta,\n });\n\n const {\n purposes: enginePurposes,\n uiState,\n actionLoading,\n error,\n hCaseData,\n hasUserInteracted,\n actions,\n hCaseActions,\n } = engine;\n\n // Sync engine purposes back to banner state (for template props)\n const activeBanner = banner ? {\n ...banner,\n purposes: enginePurposes,\n bannerSettings: banner.bannerSettings ? {\n ...banner.bannerSettings,\n logoUrl: normalizeUrl(banner.bannerSettings.logoUrl, effectiveBaseUrl)\n } : banner.bannerSettings,\n organization: banner.organization ? {\n ...banner.organization,\n logoUrl: normalizeUrl(banner.organization.logoUrl, effectiveBaseUrl)\n } : banner.organization\n } : null;\n\n // =====================================================================\n // CLOSE HANDLERS\n // =====================================================================\n const close = (type) => {\n setVisible(false);\n if (onClose) onClose(type);\n };\n\n const handleCloseClick = async () => {\n closeButtonClickedRef.current = true;\n const result = await actions.closeBanner();\n close(result || 'no_action');\n };\n\n // Wrap engine actions to also close the modal\n const handleAcceptAll = async () => {\n const result = await actions.acceptAll();\n if (result) close(result);\n };\n\n const handleRejectAll = async () => {\n const result = await actions.rejectAll();\n if (result) close(result);\n };\n\n const handleOnlyNecessary = async () => {\n const result = await actions.onlyNecessary();\n if (result) close(result);\n };\n\n const handleSavePreferences = async () => {\n const result = await actions.savePreferences();\n if (result) close(result);\n };\n\n const handleAcknowledgeNotice = async () => {\n const result = await actions.acknowledgeNotice();\n if (result) close(result);\n };\n\n const handleHCaseProceed = async () => {\n const result = await hCaseActions.handleHCaseProceed();\n if (result) close(result);\n };\n\n if (!visible) return null;\n\n // =====================================================================\n // STYLING\n // =====================================================================\n const settings = banner?.bannerSettings || {};\n const styleVars = {\n '--font-type': settings.fontType || 'Verdana',\n '--font-size': settings.fontSize || '14px',\n '--banner-primary-color': settings.primaryColor || '#3b82f6',\n '--banner-secondary-color': settings.secondaryColor || '#555',\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n // =====================================================================\n // TEMPLATE SELECTION (via registry)\n // =====================================================================\n const isCookieConsent = banner?.consentType === 'cookie_consent';\n\n // Detect banner case for tabbed UI\n const bannerCase = uiState ? uiState.bannerCase : BANNER_CASE.NORMAL;\n\n // Determine if we should use the tabbed banner UI.\n // Use tabbed UI by default for the center_modal template, or explicitly via tabbed_banner.\n // Other templates (floating_card, preferences_modal, etc.) keep their own UI.\n const rawTemplateKey = settings.generalNoticeTemplate || 'center_modal';\n const useTabbedUI = rawTemplateKey === 'tabbed_banner' || rawTemplateKey === 'center_modal';\n\n const templateKey = useTabbedUI ? 'tabbed_banner' : rawTemplateKey;\n\n const layoutClass = templateKey.replace(/_/g, '-');\n const themeClass = theme === 'dark' ? 'trubanner-theme-dark' : '';\n\n // Loading spinner\n if (isLoading) {\n return ReactDOM.createPortal(\n <div className={`mcm-overlay ${themeClass}`}>\n <div className=\"mcm-spinner\" />\n </div>,\n document.body\n );\n }\n\n // =====================================================================\n // RENDER TEMPLATE\n // =====================================================================\n const TemplateComponent = getTemplate(templateKey);\n\n // Build template-specific props\n const buildTemplateProps = () => {\n const baseProps = {\n banner: activeBanner,\n companyName: resolvedCompanyName,\n logoUrl: resolvedLogoUrl,\n actionLoading,\n };\n\n if (templateKey === 'tabbed_banner') {\n return {\n ...baseProps,\n hasUserInteracted,\n onChangePurpose: actions.togglePurpose,\n onRejectAll: handleRejectAll,\n onConsentAll: handleAcceptAll,\n onAcceptSelected: handleSavePreferences,\n onAcceptMandatory: handleOnlyNecessary,\n onAcknowledgeNotice: handleAcknowledgeNotice,\n bannerCase,\n uiState,\n settings,\n // Re-consent props — auto-detected from banner API\n reconsentCampaignId,\n reconsentUiMode,\n versionDiff,\n reconsentOnly: reconsentIsDedicatedCp,\n reconsentSource,\n expiryReconsentRequestId,\n };\n }\n\n if (templateKey === 'notice_only') {\n return {\n ...baseProps,\n onAcknowledge: handleAcknowledgeNotice,\n };\n }\n\n if (templateKey === 'floating_card') {\n return {\n ...baseProps,\n onAcceptMandatory: handleOnlyNecessary,\n onConsentAll: handleAcceptAll,\n onPersonalize: () => setShowFullNotice(true),\n primaryColor: settings.primaryColor,\n secondaryColor: settings.secondaryColor,\n layoutClass,\n footerText: settings.footerText,\n settings,\n };\n }\n\n if (templateKey === 'preferences_modal') {\n return {\n ...baseProps,\n hasUserInteracted,\n onChangePurpose: actions.togglePurpose,\n onRejectAll: handleRejectAll,\n onConsentAll: handleAcceptAll,\n onAcceptSelected: handleSavePreferences,\n onAcceptMandatory: handleOnlyNecessary,\n onClose,\n settings,\n };\n }\n\n // Default: center_modal (BannerUI), general_compact_list, general_split_pane, inline_single_row\n return {\n ...baseProps,\n hasUserInteracted,\n onChangePurpose: actions.togglePurpose,\n onRejectAll: handleRejectAll,\n onConsentAll: handleAcceptAll,\n onAcceptSelected: handleSavePreferences,\n onAcceptMandatory: handleOnlyNecessary,\n settings,\n };\n };\n const isInline = false;\n\n // ── Re-consent: already-consented guard ──────────────────────────────\n if (reconsentCampaignId && reconsentCampaignStatus === 'consented') {\n return ReactDOM.createPortal(\n <div className={`mcm-overlay ${themeClass}`} style={styleVars}>\n <div className=\"mcm-modal\" style={{ textAlign: 'center', padding: '2rem' }}>\n <div style={{ fontSize: '2rem', marginBottom: '0.5rem' }}>✅</div>\n <h2 style={{ marginBottom: '0.5rem', fontSize: '1.1rem', fontWeight: 600 }}>\n Re-consent Provided\n </h2>\n <p style={{ color: '#aaa', fontSize: '0.9rem' }}>\n You have already provided re-consent for this update.\n </p>\n </div>\n </div>,\n document.body\n );\n }\n\n const content = (\n <React.Fragment>\n {error && (\n <div className=\"mcm-error\" role=\"alert\">\n {error}\n </div>\n )}\n\n {fetchError ? (\n <div className=\"mcm-error-view\">\n <div className=\"mcm-error-icon\">⚠️</div>\n <h2 className=\"mcm-error-title\">Unable to Load Consent</h2>\n <p className=\"mcm-error-desc\">\n {fetchError}\n </p>\n </div>\n ) : activeBanner && (\n <TemplateComponent {...buildTemplateProps()} />\n )}\n\n {hCaseData.show && (\n <HCaseWarningPopup\n settings={banner?.bannerSettings || {}}\n onProceed={handleHCaseProceed}\n onBack={hCaseActions.handleHCaseBack}\n primaryColor={banner?.bannerSettings?.primaryColor}\n />\n )}\n </React.Fragment>\n );\n\n const isWide = templateKey === 'inline_single_row' || templateKey === 'general_split_pane';\n const wrapperStyle = {\n ...styleVars,\n ...(isWide ? { maxWidth: '1100px', width: '90vw' } : {})\n };\n\n const translationsSnapshot = activeBanner?.translationsSnapshot || activeBanner?.translations_snapshot || null;\n if (activeBanner && !translationsSnapshot) {\n console.warn('[TruConsent] activeBanner exists but translationsSnapshot is null/empty. Keys in banner:', Object.keys(activeBanner));\n }\n\n if (isInline) {\n return (\n <LanguageProvider snapshot={translationsSnapshot} initialLanguage={initialLanguage}>\n <div className={`mcm-inline-wrapper ${themeClass}`} style={wrapperStyle}>\n {content}\n </div>\n </LanguageProvider>\n );\n }\n\n return ReactDOM.createPortal(\n <LanguageProvider snapshot={translationsSnapshot} initialLanguage={initialLanguage}>\n <div className={`mcm-overlay ${layoutClass} ${themeClass}`} style={styleVars}>\n <div className={`mcm-wrapper ${layoutClass}`} style={wrapperStyle}>\n <button\n className=\"mcm-close-btn\"\n onClick={handleCloseClick}\n aria-label=\"Close consent banner\"\n >\n &times;\n </button>\n <div\n className=\"mcm-container\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {content}\n </div>\n </div>\n </div>\n </LanguageProvider>,\n document.body\n );\n}\n","import React from 'react';\nimport TruConsentModal from './TruConsentModal';\n\n/**\n * TruConsent - Auto-showing cookie consent modal\n * \n * Displays a modal popup immediately on mount with loading state.\n * The modal fetches banner data and shows cookie consent UI.\n * \n * @param {string} apiKey - API key for authentication\n * @param {string} organizationId - Organization ID (e.g., 'cobuildx', 'client-dev')\n * @param {string} bannerId - Banner/Collection Point ID to display\n * @param {string} userId - User ID for consent tracking\n * @param {string} assetId - Asset ID (required when using API key auth)\n * @param {string} apiBaseUrl - Base URL for API (optional)\n * @param {string} logoUrl - Company logo URL (optional)\n * @param {string} companyName - Company name (optional)\n * @param {function} onClose - Callback when modal closes (optional)\n */\n\nexport default function TruConsent({\n apiKey,\n organizationId,\n bannerId,\n userId,\n assetId,\n apiUrl,\n apiBaseUrl,\n theme,\n logoUrl,\n companyName,\n onClose\n}) {\n // Auto-show modal on mount - TruConsentModal handles loading state internally\n return (\n <TruConsentModal\n apiKey={apiKey}\n organizationId={organizationId}\n bannerId={bannerId}\n userId={userId}\n assetId={assetId}\n apiUrl={apiUrl}\n apiBaseUrl={apiBaseUrl}\n theme={theme}\n logoUrl={logoUrl}\n companyName={companyName}\n onClose={onClose}\n />\n );\n}","\nimport React, { useState, useEffect, useMemo, useRef } from 'react';\nimport {\n Mail,\n Clock,\n Info,\n CheckCircle2,\n User,\n} from 'lucide-react';\nimport '../styles/RightCenter.css';\n \n /** Generate a simple session ID for metadata tracking */\n function generateSessionId() {\n return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\nconst DEFAULT_RIGHTS_CENTER_SETTINGS = {\n background_color: 'transparent',\n primary_text_color: '#111827',\n secondary_text_color: '#4b5563',\n button_color: '#65a30d',\n button_text_color: '#0b1120',\n font_family: 'sans-serif',\n show_consents_section: true,\n show_rights_section: true,\n show_nominees_section: true,\n show_transparency_section: false,\n show_dpo_section: false,\n show_grievance_section: true,\n grievance_mode: 'truconsent',\n grievance_external_url: '',\n consents_section_title: 'Consents',\n rights_section_title: 'Your Data Rights',\n nominees_section_title: 'Nominees',\n dpo_qualifications_enabled: true,\n dpo_responsibilities_enabled: true,\n dpo_working_hours_enabled: true,\n dpo_response_time_enabled: true,\n transparency_description: '',\n};\n\nconst unwrapDataPayload = (payload) => {\n if (!payload || typeof payload !== 'object') return null;\n if (payload.data && typeof payload.data === 'object') return payload.data;\n return payload;\n};\n\nconst normalizeRightsCenterSettings = (payload) => {\n const data = unwrapDataPayload(payload) || {};\n return {\n ...DEFAULT_RIGHTS_CENTER_SETTINGS,\n ...data,\n };\n};\n\nconst normalizeArrayResponse = (payload) => {\n if (Array.isArray(payload)) return payload;\n if (Array.isArray(payload?.data)) return payload.data;\n return [];\n};\n\nconst normalizeObjectResponse = (payload) => {\n if (payload && typeof payload === 'object' && payload.data && typeof payload.data === 'object') {\n return payload.data;\n }\n return payload && typeof payload === 'object' ? payload : null;\n};\n\nconst withQuery = (path, queryObj = {}) => {\n const entries = Object.entries(queryObj).filter(([, v]) => v !== null && v !== undefined && String(v) !== '');\n if (!entries.length) return path;\n const qs = new URLSearchParams(entries.map(([k, v]) => [k, String(v)])).toString();\n return `${path}?${qs}`;\n};\n\nconst firstDefined = (...values) => values.find((v) => v !== undefined && v !== null && v !== '');\n\nconst toReadableValue = (value, fallback = 'Not specified') => {\n if (value === undefined || value === null || value === '') return fallback;\n if (typeof value === 'string' || typeof value === 'number') return String(value);\n if (typeof value === 'object') {\n return String(firstDefined(value.label, value.name, value.title, value.value, value.id) ?? fallback);\n }\n return fallback;\n};\n\nconst normalizeConsentedValue = (value) => {\n if (value === true) return 'accepted';\n if (value === false) return 'declined';\n if (typeof value === 'string') {\n const normalized = value.toLowerCase();\n if (['accepted', 'approved', 'yes', 'true'].includes(normalized)) return 'accepted';\n if (['declined', 'rejected', 'no', 'false'].includes(normalized)) return 'declined';\n return value;\n }\n return value;\n};\n\nconst resolveExpiry = (purpose) =>\n toReadableValue(\n firstDefined(purpose?.expiry_period, purpose?.expiry_type, purpose?.expiry, purpose?.expiry_period_id),\n 'Not specified'\n );\n\nconst resolveProcessingActivity = (purpose) => {\n const activities = Array.isArray(purpose?.processingActivities || purpose?.processing_activities) ? (purpose.processingActivities || purpose.processing_activities) : [];\n if (activities.length > 0) {\n return activities.map(a => a.name || a.label || a.title || 'Unknown Activity').join(', ');\n }\n return toReadableValue(\n firstDefined(\n purpose?.processing_activity,\n purpose?.processingActivity,\n purpose?.activity\n ),\n 'Not specified'\n );\n};\n\nconst formatDateValue = (value) => {\n if (!value) return 'Not available';\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n};\n\nconst getPurposeDataElements = (purpose) => {\n const elements = Array.isArray(purpose?.dataElements || purpose?.data_elements) ? (purpose.dataElements || purpose.data_elements) : [];\n return elements\n .map((el) => ({\n label:\n (typeof el === 'string' || typeof el === 'number'\n ? String(el)\n : el?.name || el?.label || el?.title || String(el?.id || '')),\n description: el?.description || '',\n }))\n .filter((el) => el.label);\n};\n\nconst hexToRgba = (hex, alpha) => {\n if (typeof hex !== 'string') return null;\n const clean = hex.replace('#', '').trim();\n if (![3, 6].includes(clean.length)) return null;\n const full = clean.length === 3 ? clean.split('').map((ch) => ch + ch).join('') : clean;\n const intVal = Number.parseInt(full, 16);\n if (Number.isNaN(intVal)) return null;\n const r = (intVal >> 16) & 255;\n const g = (intVal >> 8) & 255;\n const b = intVal & 255;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nexport default function RightCenter({ userId, apiKey, organizationId, apiUrl, apiBaseUrl, assetId, authToken }) {\n\n const [rightsCenterSettings, setRightsCenterSettings] = useState(DEFAULT_RIGHTS_CENTER_SETTINGS);\n const [activeTab, setActiveTab] = useState('Consent');\n const [isInitializing, setIsInitializing] = useState(true);\n const responseCacheRef = useRef(new Map());\n const noticeLoggedAtRef = useRef(Date.now());\n const userInteractionAtRef = useRef(null);\n\n // auth headers for backend (tenant-aware)\n const authHeaders = {};\n if (apiKey) authHeaders['X-API-Key'] = apiKey;\n if (organizationId) authHeaders['X-Org-Id'] = organizationId;\n if (userId) authHeaders['X-User-Id'] = userId;\n if (authToken) authHeaders['Authorization'] = `Bearer ${authToken}`;\n\n // --- DPO Info ---\n const [dpoInfo, setDpoInfo] = useState(null);\n\n // --- Nominees ---\n const [nominees, setNominees] = useState([]);\n const [editing, setEditing] = useState(false);\n const [nomineeForm, setNomineeForm] = useState({\n nominee_name: '',\n relationship: '',\n nominee_email: '',\n nominee_mobile: '',\n purpose_of_appointment: '',\n });\n\n const nominee = nominees[0] || null;\n\n // --- Grievance Tickets ---\n const [tickets, setTickets] = useState([]);\n const [showGrievanceForm, setShowGrievanceForm] = useState(false);\n const [grievanceForm, setGrievanceForm] = useState({\n subject: '',\n category: '',\n description: '',\n });\n\n const tabs = useMemo(() => {\n const tabConfig = [\n { label: 'Consent', enabled: rightsCenterSettings.show_consents_section },\n { label: 'Rights', enabled: rightsCenterSettings.show_rights_section },\n { label: 'Nominee', enabled: rightsCenterSettings.show_nominees_section },\n { label: 'Grievance', enabled: rightsCenterSettings.show_grievance_section },\n { label: 'Transparency', enabled: rightsCenterSettings.show_transparency_section },\n { label: 'DPO', enabled: rightsCenterSettings.show_dpo_section },\n ];\n return tabConfig.filter((tab) => tab.enabled !== false).map((tab) => tab.label);\n }, [rightsCenterSettings]);\n\n useEffect(() => {\n if (!tabs.includes(activeTab)) {\n setActiveTab(tabs[0] || 'Consent');\n }\n }, [activeTab, tabs]);\n\n const rcThemeVars = useMemo(\n () => {\n const bg = rightsCenterSettings.background_color || '#020617';\n const primaryText = rightsCenterSettings.primary_text_color || '#e5e7eb';\n const secondaryText = rightsCenterSettings.secondary_text_color || '#9ca3af';\n const primary = rightsCenterSettings.button_color || '#65a30d';\n const buttonText = rightsCenterSettings.button_text_color || '#0b1120';\n\n return {\n '--banner-card-bg': bg,\n '--banner-bg': bg,\n '--banner-hover-bg': hexToRgba(primaryText, 0.08) || 'rgba(255, 255, 255, 0.06)',\n '--banner-text': primaryText,\n '--banner-text-muted': secondaryText,\n '--banner-primary-color': primary,\n '--banner-border': hexToRgba(secondaryText, 0.45) || 'rgba(107, 114, 128, 0.45)',\n '--banner-info-bg': hexToRgba(primary, 0.12) || 'rgba(101, 163, 13, 0.12)',\n '--banner-info-border': hexToRgba(primary, 0.25) || 'rgba(101, 163, 13, 0.25)',\n '--banner-success-bg': 'rgba(34, 197, 94, 0.18)',\n '--banner-success-text': '#166534',\n '--banner-danger-bg': 'rgba(239, 68, 68, 0.18)',\n '--banner-danger-text': '#991b1b',\n '--banner-danger-btn': '#dc2626',\n '--banner-danger-btn-hover': '#b91c1c',\n '--banner-warning-bg': 'rgba(245, 158, 11, 0.12)',\n '--banner-warning-border': 'rgba(245, 158, 11, 0.28)',\n '--banner-warning-text': '#fbbf24',\n '--banner-overlay': 'rgba(2, 6, 23, 0.72)',\n '--font-type': rightsCenterSettings.font_family || 'sans-serif',\n '--rc-btn-text': buttonText,\n };\n },\n [rightsCenterSettings]\n );\n\n const cloneJson = (value) => {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch (_e) {\n return value;\n }\n };\n\n const getJson = async (path, options = {}) => {\n const bypassCache = !!options.bypassCache;\n const base = apiUrl || apiBaseUrl || '';\n const url = `${base}${path}`;\n const cacheKey = `GET:${url}`;\n\n if (!bypassCache && responseCacheRef.current.has(cacheKey)) {\n return cloneJson(responseCacheRef.current.get(cacheKey));\n }\n\n let res;\n try {\n res = await fetch(url, { headers: authHeaders });\n } catch (error) {\n throw error;\n }\n\n if (!res.ok) {\n throw new Error(`GET failed (${res.status}) for ${path}`);\n }\n\n const payload = await res.json();\n if (!bypassCache) {\n responseCacheRef.current.set(cacheKey, cloneJson(payload));\n }\n return payload;\n };\n\n const fetchRightsCenterSettings = async () => {\n const query = assetId ? `?asset_id=${encodeURIComponent(assetId)}` : '';\n const base = apiUrl || apiBaseUrl || '';\n if (!base) return;\n\n const candidates = [`${base}/api/v1/internal/rights-center/settings/global${query}`];\n\n let lastError = null;\n\n for (const url of candidates) {\n let res;\n try {\n res = await fetch(url, { headers: authHeaders });\n } catch (e) {\n lastError = e;\n continue;\n }\n\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n throw new Error(`GET failed (${res.status}) for rights center settings`);\n }\n lastError = new Error(`GET failed (${res.status}) for rights center settings`);\n continue;\n }\n\n const payload = await res.json();\n setRightsCenterSettings(normalizeRightsCenterSettings(payload));\n return;\n }\n\n if (lastError) throw lastError;\n };\n\n const fetchRightsTabData = async () => {\n await Promise.allSettled([\n getJson('/api/v1/internal/dpo')\n .then((payload) => setDpoInfo(normalizeObjectResponse(payload))),\n getJson(`/api/v1/internal/nominee/user/${userId}`)\n .then((payload) => setNominees(normalizeArrayResponse(payload))),\n getJson(`/api/v1/internal/grievance/user/${userId}`)\n .then((payload) => setTickets(normalizeArrayResponse(payload))),\n ]);\n };\n\n const requestApi = async (method, path, payload = null) => {\n const base = apiUrl || apiBaseUrl || '';\n const url = `${base}${path}`;\n let res;\n\n try {\n res = await fetch(url, {\n method,\n headers: payload ? { 'Content-Type': 'application/json', ...authHeaders } : authHeaders,\n body: payload ? JSON.stringify(payload) : undefined,\n });\n } catch (e) {\n throw e;\n }\n\n if (!res) {\n throw new Error(`No response for ${path}`);\n }\n\n if (!res.ok) {\n let detail = '';\n try {\n const body = await res.json();\n detail = body?.detail ? `: ${body.detail}` : '';\n } catch (_e) {\n // Ignore response parse issues and fall back to status-only error.\n }\n throw new Error(`Request failed (${res.status}) for ${path}${detail}`);\n }\n\n return res;\n };\n\n // ------ Handlers ------\n\n const handleNomineeSubmit = e => {\n e.preventDefault();\n const payload = { user_id: userId, client_user_id: userId, ...nomineeForm };\n\n const method = nominee && editing ? 'PUT' : 'POST';\n const path = nominee && editing ? `/api/v1/internal/nominee/${nominee.id}` : '/api/v1/internal/nominee';\n\n requestApi(method, path, payload)\n .then(() => getJson(`/api/v1/internal/nominee/user/${userId}`, { bypassCache: true }))\n .then(payload => {\n setNominees(normalizeArrayResponse(payload));\n setEditing(false);\n setNomineeForm({\n nominee_name: '',\n relationship: '',\n nominee_email: '',\n nominee_mobile: '',\n purpose_of_appointment: '',\n });\n })\n .catch(console.error);\n };\n\n const handleDeleteNominee = () => {\n if (!nominee) return;\n requestApi('DELETE', `/api/v1/internal/nominee/${nominee.id}`)\n .then(() => {\n // Clear cache and re-fetch\n return getJson(`/api/v1/internal/nominee/user/${userId}`, { bypassCache: true });\n })\n .then(payload => setNominees(normalizeArrayResponse(payload)))\n .catch(console.error);\n };\n\n const handleGrievanceSubmit = (e) => {\n e.preventDefault();\n const payload = {\n client_user_id: userId,\n subject: grievanceForm.subject,\n category: grievanceForm.category,\n description: grievanceForm.description,\n };\n requestApi('POST', '/api/v1/internal/grievance', payload)\n .then((r) => r.json())\n .then((t) => {\n setTickets((prev) => [t, ...prev]);\n setShowGrievanceForm(false);\n setGrievanceForm({ subject: '', category: '', description: '' });\n })\n .catch(console.error);\n };\n\n\n // Consent tab state\n const [consents, setConsents] = useState([]);\n const [initialConsents, setInitialConsents] = useState({}); // { purposeId: status }\n const [consentsLoading, setConsentsLoading] = useState(true);\n const [dirty, setDirty] = useState(false);\n const [showSaveModal, setShowSaveModal] = useState(false);\n\n // Rights / deletion modal state\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [showAccessModal, setShowAccessModal] = useState(false);\n const [deleteConfirmed, setDeleteConfirmed] = useState(false);\n const [accessConfirmed, setAccessConfirmed] = useState(false);\n\n // Grievance tab state\n const [showForm, setShowForm] = useState(false);\n const [changedPurposeIds, setChangedPurposeIds] = useState(new Set());\n \n // --- Auditing State ---\n const [sessionId] = useState(() => generateSessionId());\n \n\n const normalizeStatus = (val) => {\n if (val === 'accepted' || val === 'declined') return val;\n if (val === 'approved') return 'accepted';\n if (val === 'rejected') return 'declined';\n if (typeof val === 'boolean') return val ? 'accepted' : 'declined';\n if (typeof val === 'string') {\n const v = val.toLowerCase();\n if (v === 'yes' || v === 'true') return 'accepted';\n if (v === 'no' || v === 'false') return 'declined';\n }\n return val; // could be 'pending' or undefined\n };\n\n // Fetch all purposes (via banners) and merge with latest user status overview\n const fetchUserConsents = async (options = {}) => {\n const bypassCache = !!options.bypassCache;\n setConsentsLoading(true);\n try {\n const assetQuery = assetId ? { asset_id: assetId } : {};\n \n // 1. Fetch ALL banners for this asset (the template)\n const bannersData = await getJson(withQuery('/api/v1/internal/consent', assetQuery), { bypassCache });\n const allBanners = normalizeArrayResponse(bannersData);\n\n // 2. Fetch the latest user status overview\n const userStatusData = await getJson(withQuery('/api/v1/internal/consent/user-consent-status', { userId }), { bypassCache });\n const userOverview = userStatusData?.collectionPoints || [];\n\n // 3. Create a unique map of purposes\n const uniquePurposesMap = new Map();\n\n // Seed from template banners\n allBanners.forEach(banner => {\n (banner.purposes || []).forEach(p => {\n const pid = String(p.id || '');\n const status = String(p.status || '').toLowerCase();\n if (!pid || status !== 'active') return;\n\n if (!uniquePurposesMap.has(pid)) {\n const purposeType = String(p.purpose_type || '').toLowerCase();\n const isMandatory = (p.isMandatory || p.is_mandatory || purposeType.includes('mandatory'));\n\n uniquePurposesMap.set(pid, {\n ...p,\n id: pid,\n title: p.name,\n consented: normalizeStatus(p.consented) || 'declined',\n timestamp: 0,\n type: isMandatory ? 'Mandatory' : 'Optional',\n isLegitimate: !!(p.is_legitimate || p.isLegitimate),\n dataElements: p.data_elements || p.dataElements || [],\n processingActivities: p.processing_activities || p.processingActivities || [],\n });\n }\n });\n });\n\n // Merge results from the DB overview\n userOverview.forEach(cp => {\n const pcList = cp.latest_consent?.purpose_consents || cp.latestConsent?.purposeConsents || [];\n const logTimestamp = new Date(cp.latest_consent?.timestamp || cp.latestConsent?.timestamp || 0).getTime();\n \n pcList.forEach(pc => {\n const pid = String(pc.purpose_id || pc.id || pc.purposeId || '');\n const status = normalizeStatus(pc.status || pc.consented);\n if (!pid) return;\n\n let entry = uniquePurposesMap.get(pid);\n if (entry) {\n // Only update if this log is newer than what we have\n if (logTimestamp > entry.timestamp) {\n entry.consented = status;\n entry.timestamp = logTimestamp;\n \n // Use enriched metadata from backend if available\n const de = pc.data_elements || pc.dataElements;\n if (de && de.length > 0) {\n entry.dataElements = de;\n }\n const pa = pc.processing_activities || pc.processingActivities;\n if (pa && pa.length > 0) {\n entry.processingActivities = pa;\n }\n if (pc.description) {\n entry.description = pc.description;\n }\n if (pc.name || pc.title) {\n entry.name = pc.name || pc.title;\n entry.title = pc.name || pc.title;\n }\n }\n }\n });\n });\n\n const items = Array.from(uniquePurposesMap.values());\n setConsents(items);\n const initialMap = {};\n items.forEach(it => {\n initialMap[it.id] = it.consented;\n });\n setInitialConsents(initialMap);\n setChangedPurposeIds(new Set());\n setDirty(false);\n } catch (e) {\n console.error('Error fetching user consents:', e);\n } finally {\n setConsentsLoading(false);\n }\n };\n\n useEffect(() => {\n noticeLoggedAtRef.current = Date.now();\n userInteractionAtRef.current = null;\n }, [userId, assetId]);\n\n useEffect(() => {\n let isActive = true;\n\n const bootstrap = async () => {\n setIsInitializing(true);\n responseCacheRef.current.clear();\n\n await Promise.allSettled([\n fetchRightsCenterSettings(),\n fetchRightsTabData(),\n fetchUserConsents({ bypassCache: true }),\n ]);\n\n if (isActive) {\n setIsInitializing(false);\n }\n };\n\n bootstrap().catch(console.error);\n return () => {\n isActive = false;\n };\n }, [userId, apiUrl, apiBaseUrl, apiKey, organizationId, assetId, authToken]);\n\n const handleToggle = (purposeId) => {\n if (!userInteractionAtRef.current) {\n userInteractionAtRef.current = Date.now();\n }\n \n let newValue;\n setConsents((prev) =>\n prev.map((c) => {\n if (c.id === purposeId) {\n newValue = c.consented === 'accepted' ? 'declined' : 'accepted';\n return { ...c, consented: newValue };\n }\n return c;\n })\n );\n\n setChangedPurposeIds((prev) => {\n const next = new Set(prev);\n if (newValue !== initialConsents[purposeId]) {\n next.add(purposeId);\n } else {\n next.delete(purposeId);\n }\n setDirty(next.size > 0);\n return next;\n });\n };\n\n const handleSave = async () => {\n try {\n if (!userId) {\n throw new Error('Cannot save consent: userId is required');\n }\n if (!organizationId) {\n throw new Error('Cannot save consent: organizationId (X-Org-Id) is required');\n }\n\n // Only include purposes that were actually toggled by the user\n const uniquePurposesMap = new Map();\n consents.forEach((c) => {\n if (changedPurposeIds.has(c.id) && !uniquePurposesMap.has(c.id)) {\n uniquePurposesMap.set(c.id, {\n id: c.id,\n name: c.name,\n consented: normalizeConsentedValue(c.consented),\n });\n }\n });\n\n const purposesToSave = Array.from(uniquePurposesMap.values());\n\n if (purposesToSave.length === 0) {\n setChangedPurposeIds(new Set());\n setDirty(false);\n return;\n }\n\n // Action is either 'approved' if any purpose is accepted, or 'revoked' if all are declined.\n const hasApproval = purposesToSave.some(\n (p) => p.consented === 'accepted'\n );\n const action = hasApproval ? 'approved' : 'revoked';\n\n \n const now = Date.now();\n const payload = {\n userId,\n purposes: purposesToSave,\n action,\n assetId,\n source: 'right center npm',\n metadata: {\n button_used: 'save',\n interaction_type: 'rights_center',\n logged_at: new Date().toISOString(),\n session_id: sessionId,\n notice_logged_at: noticeLoggedAtRef.current,\n user_interaction_at: userInteractionAtRef.current,\n performance: {\n interaction_to_save_ms: (noticeLoggedAtRef.current && userInteractionAtRef.current) \n ? (now - userInteractionAtRef.current) : null\n }\n }\n };\n\n // Purpose-based save to truAPI backend endpoint\n await requestApi('POST', '/api/v1/internal/consent/rights-center', payload);\n\n // Reset baseline state and re-fetch to ensure sync\n setChangedPurposeIds(new Set());\n setDirty(false);\n setShowSaveModal(true);\n await fetchUserConsents({ bypassCache: true });\n } catch (e) {\n console.error(e);\n setShowSaveModal(false);\n alert(\"Failed to save consent preferences. Please try again.\");\n }\n };\n\n const createRightsRequest = async (type) => {\n if (type === 'access') {\n await requestApi('POST', '/api/v1/internal/rights-requests/access-request', {\n user_id: userId,\n subject: 'Data Access Request',\n description: 'User requested access to personal data from Rights Center.',\n metadata: {\n asset_id: assetId,\n source: 'Rights Center',\n },\n });\n return;\n }\n\n await requestApi('POST', '/api/v1/internal/rights-requests/deletion-request', {\n user_id: userId,\n reason: 'User requested data deletion from Rights Center',\n metadata: {\n asset_id: assetId,\n requested_at: new Date().toISOString(),\n source: 'Rights Center',\n },\n });\n };\n\n const handleAccessRequest = async () => {\n try {\n await createRightsRequest('access');\n setAccessConfirmed(true);\n setTimeout(() => {\n setShowAccessModal(false);\n }, 1500);\n } catch (error) {\n console.error('Error submitting access request:', error);\n alert('Failed to submit access request. Please try again later.');\n }\n };\n\n const handleDeleteRequest = async () => {\n try {\n await createRightsRequest('delete');\n\n setDeleteConfirmed(true);\n setTimeout(() => {\n setShowDeleteModal(false);\n }, 1500);\n } catch (error) {\n console.error('Error submitting deletion request:', error);\n alert('Failed to submit deletion request. Please try again later.');\n }\n };\n\n return (\n <div className=\"rc-container\" style={rcThemeVars}>\n {isInitializing && (\n <div className=\"rc-initial-loader\" role=\"status\" aria-live=\"polite\">\n <div className=\"rc-spinner\" />\n <span>Loading Rights Center...</span>\n </div>\n )}\n\n {!isInitializing && (\n <React.Fragment>\n {/* Tabs Navigation */}\n <nav className=\"rc-tabs\">\n {tabs.map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n disabled={consentsLoading && consents.length === 0}\n className={`rc-tab ${activeTab === tab ? 'rc-tab-active' : ''}`}\n >\n {tab}\n </button>\n ))}\n </nav>\n\n {/* ------------------ CONSENT TAB ------------------ */}\n {activeTab === 'Consent' && (\n <div className=\"rc-content\">\n <div className=\"rc-section-header\">\n <h2 className=\"rc-section-title\">{rightsCenterSettings.consents_section_title || 'Manage your Consents here!'}</h2>\n {dirty && (\n <button className=\"rc-btn-primary\" onClick={() => handleSave()}>\n Save Changes\n </button>\n )}\n </div>\n {showSaveModal && (\n <div className=\"rc-modal-overlay\">\n <div className=\"rc-modal rc-modal-small\">\n <div className=\"rc-modal-success\">\n <CheckCircle2 className=\"rc-success-icon\" />\n <h3 className=\"rc-modal-title\">Changes Saved</h3>\n <p className=\"rc-modal-subtitle\">Your consent preferences have been updated.</p>\n <div className=\"rc-modal-actions\">\n <button className=\"rc-btn-primary\" onClick={() => setShowSaveModal(false)}>OK</button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {consentsLoading && (\n <div className=\"rc-empty-state\">\n <Info className=\"rc-empty-state-icon\" />\n Loading consents...\n </div>\n )}\n\n {!consentsLoading && consents.length > 0 && (\n <div className=\"rc-consent-list\">\n {consents.map((p) => {\n const elements = getPurposeDataElements(p);\n const dataElementsText = elements.length > 0\n ? elements.map(el => el.label).join(', ')\n : 'Not specified';\n \n const activitiesText = resolveProcessingActivity(p);\n \n const consentedAccepted = normalizeConsentedValue(p.consented) === 'accepted';\n\n return (\n <div key={p.id} className=\"rc-consent-item\">\n <div className=\"rc-consent-card-row rc-consent-card-row-top\">\n <div className=\"rc-consent-purpose-block\">\n <h3 className=\"rc-consent-title\">{p.name || p.title}</h3>\n <span className={`rc-badge ${p.type === 'Mandatory' ? 'rc-badge-mandatory' : 'rc-badge-optional'}`}>\n {p.type === 'Mandatory' ? 'Necessary' : 'Optional'}\n </span>\n {p.isLegitimate && (\n <span className=\"rc-badge rc-badge-legitimate\">\n Legitimate Interest\n </span>\n )}\n </div>\n\n <div className=\"rc-consent-meta-block\">\n <span className=\"rc-detail-label\">Expiry Period:</span>{' '}\n <span className=\"rc-detail-value\">{resolveExpiry(p)}</span>\n </div>\n\n <div className=\"rc-consent-toggle-wrap\">\n {!p.isLegitimate && (\n <label className=\"rc-switch\">\n <input\n type=\"checkbox\"\n checked={consentedAccepted}\n onChange={() => handleToggle(p.id)}\n />\n <span className=\"rc-slider\"></span>\n </label>\n )}\n </div>\n </div>\n\n <div className=\"rc-consent-card-row rc-consent-card-row-middle\">\n <div className=\"rc-consent-meta-block\">\n <span className=\"rc-detail-label\">Processing Activity:</span>{' '}\n <span className=\"rc-detail-value\">{activitiesText}</span>\n </div>\n <div className=\"rc-status-item\">\n <span className=\"rc-status-label\">Consented:</span>\n <span className={`rc-status-pill rc-status-pill-consent ${consentedAccepted ? 'rc-status-yes' : 'rc-status-no'}`}>\n {consentedAccepted ? 'Yes' : 'No'}\n </span>\n </div>\n </div>\n\n {elements.length > 0 && (\n <div className=\"rc-consent-card-row rc-consent-card-row-bottom\">\n <span className=\"rc-detail-label\">Data Elements:</span>\n <div className=\"rc-pills-wrap\">\n {elements.map((el, i) => (\n <span key={i} className=\"rc-element-pill\">{el.label}</span>\n ))}\n </div>\n </div>\n )}\n \n {p.description && p.description !== p.name && p.description !== p.title && (\n <div className=\"rc-consent-description\">\n {p.description}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {!consentsLoading && consents.length === 0 && (\n <div className=\"rc-empty-state\">\n <Info className=\"rc-empty-state-icon\" />\n You currently have no consent records to display.\n </div>\n )}\n\n </div>\n )}\n\n {/* ------------------ RIGHTS TAB ------------------ */}\n {activeTab === 'Rights' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">{rightsCenterSettings.rights_section_title || 'Your Data Rights'}</h2>\n <p className=\"rc-section-subtitle\">You can access, correct, delete, or export your data.</p>\n\n <div className=\"rc-rights-actions\">\n <button className=\"rc-btn-primary\" onClick={() => { setAccessConfirmed(false); setShowAccessModal(true); }}>\n Request to Access My Data\n </button>\n <button className=\"rc-btn-primary\" onClick={() => setShowDeleteModal(true)}>\n Request to Delete My Data\n </button>\n </div>\n\n {showAccessModal && (\n <div className=\"rc-modal-overlay\">\n <div className=\"rc-modal rc-modal-small\">\n {!accessConfirmed ? (\n <div className=\"rc-modal-content\">\n <Info className=\"rc-warning-icon\" />\n <h3 className=\"rc-modal-title\">Confirm Access Request</h3>\n <p className=\"rc-modal-subtitle\">\n Submit request to access your data?\n </p>\n <div className=\"rc-modal-actions\">\n <button className=\"rc-btn-primary\" onClick={handleAccessRequest}>\n Confirm Request\n </button>\n <button className=\"rc-btn-secondary\" onClick={() => setShowAccessModal(false)}>\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <div className=\"rc-modal-success\">\n <CheckCircle2 className=\"rc-success-icon\" />\n <h3 className=\"rc-modal-title\">Request Submitted</h3>\n <p className=\"rc-modal-subtitle\">Your access request has been submitted successfully.</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {showDeleteModal && (\n <div className=\"rc-modal-overlay\">\n <div className=\"rc-modal rc-modal-small\">\n {!deleteConfirmed ? (\n <div className=\"rc-modal-content\">\n <Info className=\"rc-warning-icon\" />\n <h3 className=\"rc-modal-title\">Confirm Data Deletion</h3>\n <p className=\"rc-modal-subtitle\">\n Are you sure you want to request data deletion? This action cannot be undone.\n </p>\n <div className=\"rc-modal-actions\">\n <button className=\"rc-btn-danger\" onClick={handleDeleteRequest}>\n Confirm Deletion\n </button>\n <button className=\"rc-btn-secondary\" onClick={() => setShowDeleteModal(false)}>\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <div className=\"rc-modal-success\">\n <CheckCircle2 className=\"rc-success-icon\" />\n <h3 className=\"rc-modal-title\">Request Submitted</h3>\n <p className=\"rc-modal-subtitle\">Your data deletion request has been submitted successfully!</p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* ------------------ TRANSPARENCY TAB ------------------ */}\n {activeTab === 'Transparency' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">Transparency</h2>\n <p className=\"rc-section-subtitle\">Learn how we collect, use, and protect your data</p>\n <p className=\"rc-transparency-text\">\n {rightsCenterSettings.transparency_description ||\n \"We collect your data to provide better services and comply with regulations. Your data is stored securely and used only for the purposes you've consented to.\"}\n </p>\n </div>\n )}\n\n {/* ------------------ DPO TAB ------------------ */}\n {activeTab === 'DPO' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">DPO Information</h2>\n\n <div className=\"rc-dpo-preview-list\">\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Full Name</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.full_name || 'Not available'}</p>\n </div>\n\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Email</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.email || 'Not available'}</p>\n </div>\n\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Appointment Date</div>\n <p className=\"rc-dpo-preview-value\">{formatDateValue(dpoInfo?.appointment_date)}</p>\n </div>\n\n {rightsCenterSettings.dpo_qualifications_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Qualifications</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.qualifications || 'Not available'}</p>\n </div>\n )}\n\n {rightsCenterSettings.dpo_responsibilities_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Responsibilities</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.responsibilities || 'Not available'}</p>\n </div>\n )}\n\n {rightsCenterSettings.dpo_working_hours_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Working Hours</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.working_hours || 'Not available'}</p>\n </div>\n )}\n\n {rightsCenterSettings.dpo_response_time_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Response Time</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.response_time || 'Not available'}</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* ------------------ NOMINEE TAB ------------------ */}\n {activeTab === 'Nominee' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">{rightsCenterSettings.nominees_section_title || 'Appoint Nominee'}</h2>\n <p className=\"rc-section-subtitle\">Appoint someone to manage your data rights on your behalf</p>\n\n <div className=\"rc-btn-primary\">\n <div className=\"rc-btn-title\">⚠️</div>\n <p>Your nominee will be able to exercise all data rights on your behalf.</p>\n </div>\n\n {nominee && !editing ? (\n <div className=\"rc-nominee-details-grid\">\n <div className=\"rc-nominee-item\">\n <User className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Name</span>\n <span className=\"rc-nominee-value\">{nominee.nominee_name}</span>\n </div>\n </div>\n\n <div className=\"rc-nominee-item\">\n <User className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Relationship</span>\n <span className=\"rc-nominee-value\">{nominee.relationship}</span>\n </div>\n </div>\n\n <div className=\"rc-nominee-item\">\n <Mail className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Email</span>\n <span className=\"rc-nominee-value\">{nominee.nominee_email}</span>\n </div>\n </div>\n\n <div className=\"rc-nominee-item\">\n <Clock className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Mobile</span>\n <span className=\"rc-nominee-value\">{nominee.nominee_mobile}</span>\n </div>\n </div>\n\n {nominee.purpose_of_appointment && (\n <div className=\"rc-nominee-item rc-nominee-fullwidth\">\n <Info className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Purpose of Appointment</span>\n <span className=\"rc-nominee-value\">{nominee.purpose_of_appointment}</span>\n </div>\n </div>\n )}\n\n <div className=\"rc-nominee-actions-fullwidth\">\n <button className=\"rc-btn-primary\" onClick={() => {\n setEditing(true);\n setNomineeForm({\n nominee_name: nominee.nominee_name || '',\n relationship: nominee.relationship || '',\n nominee_email: nominee.nominee_email || '',\n nominee_mobile: nominee.nominee_mobile || '',\n purpose_of_appointment: nominee.purpose_of_appointment || ''\n });\n }}>\n Edit\n </button>\n <button className=\"rc-btn-danger\" onClick={handleDeleteNominee}>Delete</button>\n </div>\n </div>\n ) : (\n <form className=\"rc-nominee-form\" onSubmit={handleNomineeSubmit}>\n <div className=\"rc-form-row\">\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Name *</label>\n <input\n type=\"text\"\n className=\"rc-form-input\"\n placeholder=\"Full name of nominee\"\n value={nomineeForm.nominee_name}\n onChange={e => setNomineeForm({ ...nomineeForm, nominee_name: e.target.value })}\n required\n />\n </div>\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Relationship *</label>\n <select\n className=\"rc-form-select\"\n value={nomineeForm.relationship}\n onChange={e => setNomineeForm({ ...nomineeForm, relationship: e.target.value })}\n required\n >\n <option value=\"\">Select relationship</option>\n <option>Spouse</option>\n <option>Parent</option>\n <option>Child</option>\n <option>Sibling</option>\n <option>Other</option>\n </select>\n </div>\n </div>\n\n <div className=\"rc-form-row\">\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Email *</label>\n <input\n type=\"email\"\n className=\"rc-form-input\"\n placeholder=\"nominee@example.com\"\n value={nomineeForm.nominee_email}\n onChange={e => setNomineeForm({ ...nomineeForm, nominee_email: e.target.value })}\n required\n />\n </div>\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Mobile Number *</label>\n <input\n type=\"tel\"\n className=\"rc-form-input\"\n placeholder=\"+1234567890\"\n value={nomineeForm.nominee_mobile}\n onChange={e => setNomineeForm({ ...nomineeForm, nominee_mobile: e.target.value })}\n required\n />\n </div>\n </div>\n\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Purpose of Appointment</label>\n <textarea\n className=\"rc-form-textarea\"\n placeholder=\"Explain why you are appointing this nominee\"\n rows=\"4\"\n value={nomineeForm.purpose_of_appointment || ''}\n onChange={e => setNomineeForm({ ...nomineeForm, purpose_of_appointment: e.target.value })}\n />\n </div>\n\n <div className=\"rc-form-actions\">\n <button type=\"submit\" className=\"rc-btn-primary\">\n {editing ? 'Update Nominee' : 'Send Verification Code'}\n </button>\n {editing && (\n <button type=\"button\" className=\"rc-btn-secondary\" onClick={() => setEditing(false)}>\n Cancel\n </button>\n )}\n </div>\n </form>\n )}\n </div>\n )}\n\n {/* ------------------ GRIEVANCE TAB ------------------ */}\n {activeTab === 'Grievance' && (\n <div className=\"rc-content\">\n {rightsCenterSettings.grievance_mode === 'external' ? (\n <div>\n <h2 className=\"rc-section-title\">Grievance</h2>\n <p className=\"rc-section-subtitle\">Grievance requests are handled on your organization portal.</p>\n <button\n className=\"rc-btn-primary\"\n onClick={() => {\n if (rightsCenterSettings.grievance_external_url) {\n window.open(rightsCenterSettings.grievance_external_url, '_blank', 'noopener,noreferrer');\n }\n }}\n disabled={!rightsCenterSettings.grievance_external_url}\n >\n Open Grievance Portal\n </button>\n </div>\n ) : (\n <React.Fragment>\n <div className=\"rc-section-header\">\n <div>\n <h2 className=\"rc-section-title\">Grievance Tickets</h2>\n <p className=\"rc-section-subtitle\">Submit privacy concerns or view your existing tickets</p>\n </div>\n <button className=\"rc-btn-primary\" onClick={() => setShowForm(!showForm)}>\n Create New Ticket\n </button>\n </div>\n\n {showForm && (\n <form className=\"rc-grievance-form\" onSubmit={(e) => {\n handleGrievanceSubmit(e);\n setShowForm(false);\n }}>\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Subject *</label>\n <input\n type=\"text\"\n className=\"rc-form-input\"\n placeholder=\"Brief description of your concern\"\n value={grievanceForm.subject}\n onChange={(e) => setGrievanceForm({ ...grievanceForm, subject: e.target.value })}\n required\n />\n </div>\n\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Category *</label>\n <select\n className=\"rc-form-select\"\n value={grievanceForm.category}\n onChange={(e) => setGrievanceForm({ ...grievanceForm, category: e.target.value })}\n required\n >\n <option value=\"\">Select category</option>\n <option value=\"Privacy Concern\">Privacy Concern</option>\n <option value=\"Data Access\">Data Access</option>\n <option value=\"Other\">Other</option>\n </select>\n </div>\n\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Description *</label>\n <textarea\n className=\"rc-form-textarea\"\n placeholder=\"Detailed description of your concern or request\"\n rows=\"4\"\n value={grievanceForm.description || ''}\n onChange={(e) => setGrievanceForm({ ...grievanceForm, description: e.target.value })}\n required\n />\n </div>\n\n <div className=\"rc-form-actions\">\n <button type=\"submit\" className=\"rc-btn-primary\">Submit Ticket</button>\n <button type=\"button\" className=\"rc-btn-secondary\" onClick={() => setShowForm(false)}>\n Cancel\n </button>\n </div>\n </form>\n )}\n\n <div className=\"rc-tickets-section\">\n <h3 className=\"rc-tickets-title\">Your Tickets</h3>\n {tickets.length === 0 ? (\n <div className=\"rc-empty-state\">\n <p>No tickets found. Create your first grievance ticket above.</p>\n </div>\n ) : (\n <div className=\"rc-ticket-list\">\n {tickets.map((ticket, index) => (\n <div key={index} className=\"rc-ticket-item\">\n <div className=\"rc-ticket-header\">\n <h4 className=\"rc-ticket-subject\">{ticket.subject}</h4>\n <span className=\"rc-ticket-status\">{ticket.status || 'Open'}</span>\n </div>\n <p className=\"rc-ticket-description\">{ticket.description}</p>\n <div className=\"rc-ticket-meta\">\n <span className=\"rc-ticket-meta-item\">Ticket: {ticket.ticket_id}</span>\n <span className=\"rc-ticket-meta-item\">Category: {ticket.category}</span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </React.Fragment>\n )}\n </div>\n )}\n </React.Fragment>\n )}\n </div>\n );\n}\n"],"names":["normalizePurposes","purposes","defaultSelection","normalized","map","p","rawPurpose","isLegitimate","is_legitimate","isMandatory","is_mandatory","_extends","legalBasis","withdrawable","frequency","consented","isDynamic","is_dynamic","normalizePurpose","Array","isArray","getPriority","concat","sort","a","b","sortPurposes","translateDynamic","text","lang","snapshot","_textMap$text","textMap","text_map","detectBannerCase","hasNotice","some","hasConsent","KEY_TO_SOURCE","consent_by","decline_rights","expiry_type","accept","reject_all","accept_all","accept_only_necessary","accept_selected","i_consent","necessary","data_elements","legal_entities","tools","processing_activities","data_processors","legitimate_interest","only_necessary","save_preferences","legitimate_use_tab","purposes_tab","next_button","ok_button","until_withdrawn","scroll_to_bottom","consent_notice","expires_in","one_time","optional","profile_based","informational","consent_tab","reconsent_tab","processing","consent_sections","purpose_description","expiration","status","no_data_elements","no_processors","select_purpose_hint","activities","cookie_preferences","cookie_preferences_desc","BannerTranslationContext","createContext","language","translationVersion","setLanguage","translate","key","BannerTranslationProvider","_ref","children","_useState","useState","initialLanguage","setLanguageState","_useState2","setTranslationVersion","useCallback","v","vars","_textMap$sourceText","sourceText","replace","_","k","interpolate","React","createElement","Provider","value","useBannerTranslation","useContext","LanguageProvider","FALLBACK_LANGUAGES","code","label","LANGUAGE_ENGLISH_NAMES","en","as","bn","doi","gu","hi","kn","gom","mai","ml","mr","ne","or","pa","sa","sat","sd","ta","te","ur","ModernBannerHeader","_snapshot$languages","logoUrl","orgName","bannerTitle","disclaimerText","_ref$showLanguage","showLanguage","_useBannerTranslation","isLangOpen","setIsLangOpen","languages","length","currentLang","find","l","processPlaceholder","translatedTitle","title","companyName","disclaimer","className","src","alt","style","color","wordBreak","onClick","fill","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","d","backgroundColor","borderColor","_ref2","englishName","showSubtitle","fontWeight","CollapsibleDataSection","items","isOpen","onToggle","_ref$chevronLeft","chevronLeft","type","item","id","name","ModernPurposeCard","freq","purpose","banner","_ref$showNecessaryTag","showNecessaryTag","_ref$isUpdated","isUpdated","_ref$isNew","isNew","_ref$isRemoved","isRemoved","_ref$isExpired","isExpired","openSection","setOpenSection","isAccepted","isUUID","val","test","frequencyLabel","rawExpiry","expiryLabel","expiry","expiryPeriod","expiry_period","translatedText","match","digits","slice","formatExpiryText","handleToggleSection","section","dataElements","processingActivities","dataProcessors","legalEntities","renderDiffInline","field","currentContent","diff","field_diff","fieldDiff","getDiffFor","old_value","oldValue","opacity","textDecoration","display","alignItems","padding","borderRadius","fontSize","textTransform","letterSpacing","marginLeft","verticalAlign","lineHeight","description","activity","idx","maxWidth","overflow","textOverflow","whiteSpace","border","checked","onChange","e","target","showProcessors","ModernBannerFooter","footerText","htmlContent","linkText","url","fullUrl","trim","dangerouslySetInnerHTML","__html","ModernBannerActions","onRejectAll","onConsentAll","onAcceptSelected","onAcceptMandatory","actionButtonText","rejectAllText","rejectAllColor","acceptAllText","onlyNecessaryText","onlyNecessaryColor","_ref$purposes","_ref$isBottomReached","isBottomReached","_ref$hasUserInteracte","hasUserInteracted","_ref$isSplitLayout","isSplitLayout","_ref$showAcceptAll","showAcceptAll","_ref$minimal","minimal","resolveText","fallbackKey","fallbackValue","anyOptionalAccepted","filter","disabledClasses","buttonBase","splitLayoutContent","Fragment","disabled","defaultLayoutContent","GroupHeader","TabButton","isActive","badge","role","tabId","panelId","undefined","background","badgeColor","primaryColor","TabPanel","_ref3","labelledBy","hidden","LegitimateUseContent","_ref4","noticePurposes","ConsentPurposesContent","_ref5","allConsentPurposes","onChangePurpose","groups","g","group","gIdx","ReconsentContent","_ref6","versionDiff","reconsentUiMode","hasOtherTabs","isExpiryReconsent","reconsentSource","hasMixedExpiry","changedFields","changed_fields","effectiveMode","console","log","purposesToShow","changed_purpose_ids","changedPurposeIds","includes","added_purpose_ids","addedPurposeIds","Boolean","marginBottom","gap","flexShrink","marginTop","_ref7","new_value","minWidth","String","removed_purposes","removedPurposes","position","rp","NoticeOnlyBannerInner","_banner$purposes","onAcknowledge","actionLoading","settings","bannerSettings","acknowledgeText","noticeAcknowledgeText","setIsBottomReached","scrollRef","useRef","useEffect","current","_scrollRef$current","scrollHeight","clientHeight","fontType","fontFamily","logo_url","ref","onScroll","_e$target","scrollTop","mandatoryLabel","PurposeRow","t","CompactPurposeRow","isExpanded","toggleExpand","_React$useState","openSections","setOpenSections","toggleSection","prev","_extends2","stopPropagation","join","elements","processors","registry","center_modal","_banner$purposes2","_banner$bannerSetting","secondaryColor","finalPrimaryColor","finalSecondaryColor","warningMessage","width","height","cx","cy","r","x1","y1","x2","y2","savePreferencesColor","generalNoticeTemplate","tabbed_banner","_ref8","_tabs$","_tabs$2","_tabs$3","_tabs$4","_tabs$5","onAcknowledgeNotice","bannerCase","uiState","settingsOverride","reconsentCampaignId","reconsentOnly","expiryReconsentRequestId","isReconsentOnly","bannerId","endsWith","hasReconsent","_ref9","_ref9$noticePurposes","_ref9$consentPurposes","consentPurposes","tabs","push","buildTabs","reconsentTabIndex","findIndex","activeTab","setActiveTab","styleVars","currentTab","isLastTab","isReconsentTab","isLegitimateTab","isPurposesTab","tabBar","tab","footerActions","justifyContent","points","scrollWarnings","preferences_modal","compact","savePreferencesText","floating_card","_banner$banner_settin","_banner$banner_settin2","onPersonalize","layoutClass","dynamicFooter","useMemo","withLinks","banner_settings","banner_title","disclaimer_text","notice_only","props","inline_single_row","isLoading","general_compact_list","expandedRows","setExpandedRows","_extends3","general_split_pane","_activePurpose$proces","_activePurpose$dataEl","_activePurpose$legalE","_activePurpose$tools","selectedPurposeId","setSelectedPurposeId","activePurpose","isSelected","_catch","body","recover","result","then","_finallyRethrows","finalizer","bind","EMPTY_ARRAY","HCaseWarningPopup","onProceed","onBack","isHard","h_case_logging_strategy","popupMessage","h_case_warning_message","proceedText","h_case_proceed_button_text","backText","h_case_back_button_text","h_case_back_button_color","h_case_proceed_button_color","normalizeUrl","baseUrl","startsWith","cleanBase","TruConsentModal","apiKey","organizationId","userId","assetId","apiUrl","apiBaseUrl","_props$theme","theme","_props$companyName","onClose","onSubmit","token","setBanner","setIsLoading","_useState3","fetchError","setFetchError","_useState4","visible","setVisible","setShowFullNotice","_useState6","bannerFetchAt","setBannerFetchAt","fetchStartRef","_useState7","setReconsentCampaignId","_useState8","setReconsentUiMode","_useState9","setVersionDiff","_useState0","reconsentCampaignStatus","setReconsentCampaignStatus","_useState1","reconsentIsDedicatedCp","setReconsentIsDedicatedCp","_useState10","setReconsentSource","_useState11","setExpiryReconsentRequestId","closeButtonClickedRef","effectiveOrgId","_useState12","resolvedAssetId","setResolvedAssetId","resolvedCompanyName","organizationName","organization","effectiveBaseUrl","resolvedLogoUrl","warn","effectiveAssetId","JSON","parse","atob","split","asset_id","error","fetchUrl","path","bId","aId","uId","encodeURIComponent","headers","etagKey","cachedEtag","sessionStorage","getItem","cachedBannerKey","performance","now","fetch","res","Error","cached","ok","newEtag","get","setItem","json","stringify","data","_data$bannerSettings","fetchMs","toFixed","Date","normalizedTranslationsSnapshot","translationsSnapshot","translations_snapshot","Object","keys","reconsentMode","reconsentPurposes","consentStatus","initializedPurposes","msg","message","extraMeta","reconsent_campaign_id","expiry_reconsent_request_id","engine","_bannerData$bannerSet","bannerData","_ref$previousConsent","previousConsent","_ref$bannerFetchAt","_ref$bannerFetchStart","bannerFetchStart","_ref$extraMetadata","extraMetadata","bannerDisplayAt","setBannerDisplayAt","displayMs","requestId","crypto","randomUUID","sessionId","Math","random","toString","actionTakenRef","actionRunningRef","noticeLoggedAtRef","setActionLoading","_useState5","setError","show","action","intendedPurposes","hCaseData","setHCaseData","setHasUserInteracted","initialPurposes","c","purpose_id","filterDynamicPurposes","setPurposes","mandatoryConsentPurposes","optionalConsentPurposes","noticeOnly","consentOnly","isHCase","hasRequiredConsent","deriveUIState","buildHeaders","sendNoticeShown","metadata","Promise","resolve","_temp3","_temp2","formattedNoticePurposes","purposeId","version","purpose_type","collectionPointVersion","noticeMetadata","event_type","banner_fetched_at","banner_displayed_at","payload","consentLanguage","collectionPointId","collectionPoint","consentTimestamp","source","_temp","method","keepalive","reject","sendSuppressionUpdate","purposePayload","declinedIds","declinedPurposeIds","sendLogEvent","rawPurposes","formattedPurposes","collection_point_version","user_interaction_at","notice_logged_at","_wasThrown","_result2","togglePurpose","newStatus","checkHCaseIntercept","customPurposes","targetPurposes","acceptAll","acceptedPurposes","enhancedMetadata","button_used","_wasThrown2","_result3","rejectAll","declinedPurposes","_wasThrown3","_result4","onlyNecessary","mandatoryPurposes","_wasThrown4","_result5","savePreferences","totalCount","acceptedCount","_wasThrown5","_result6","closeBanner","_temp4","noActionPurposes","acknowledgeNotice","_wasThrown6","_result7","handleHCaseProceed","finalAction","h_case_warning_shown","h_case_acknowledged","_wasThrown7","_result8","handleHCaseBack","actions","hCaseActions","useConsentEngine","activeBanner","close","handleAcceptAll","handleRejectAll","handleOnlyNecessary","handleSavePreferences","handleAcknowledgeNotice","rawTemplateKey","templateKey","themeClass","ReactDOM","createPortal","document","TemplateComponent","textAlign","content","baseProps","wrapperStyle","TruConsent","_iteratorSymbol","Symbol","iterator","_settle","pact","state","s","_Pact","o","observer","prototype","onFulfilled","onRejected","this","callback","_this","_isSettledPact","thenable","DEFAULT_RIGHTS_CENTER_SETTINGS","background_color","primary_text_color","secondary_text_color","button_color","button_text_color","font_family","show_consents_section","show_rights_section","show_nominees_section","show_transparency_section","show_dpo_section","show_grievance_section","grievance_mode","grievance_external_url","consents_section_title","rights_section_title","nominees_section_title","dpo_qualifications_enabled","dpo_responsibilities_enabled","dpo_working_hours_enabled","dpo_response_time_enabled","transparency_description","normalizeArrayResponse","withQuery","queryObj","entries","qs","URLSearchParams","firstDefined","call","arguments","toReadableValue","fallback","_firstDefined","normalizeConsentedValue","toLowerCase","hexToRgba","hex","alpha","clean","full","ch","intVal","Number","parseInt","isNaN","RightCenter","authToken","rightsCenterSettings","setRightsCenterSettings","isInitializing","setIsInitializing","responseCacheRef","Map","userInteractionAtRef","authHeaders","dpoInfo","setDpoInfo","nominees","setNominees","editing","setEditing","nominee_name","relationship","nominee_email","nominee_mobile","purpose_of_appointment","nomineeForm","setNomineeForm","nominee","tickets","setTickets","setShowGrievanceForm","subject","category","grievanceForm","setGrievanceForm","enabled","rcThemeVars","bg","primaryText","secondaryText","primary","buttonText","cloneJson","_e","getJson","options","_result","bypassCache","set","cacheKey","_exit","has","_fetch","fetchRightsCenterSettings","_exit2","_temp6","lastError","query","base","_temp5","check","step","_cycle","next","done","_fixup","TypeError","values","i","array","_forTo","_forOf","unwrapDataPayload","normalizeRightsCenterSettings","_fetch2","fetchRightsTabData","allSettled","normalizeObjectResponse","requestApi","_temp1","_temp9","_temp8","detail","_temp7","_temp0","_fetch3","consents","setConsents","initialConsents","setInitialConsents","consentsLoading","setConsentsLoading","dirty","setDirty","_useState13","showSaveModal","setShowSaveModal","_useState14","showDeleteModal","setShowDeleteModal","_useState15","showAccessModal","setShowAccessModal","_useState16","deleteConfirmed","setDeleteConfirmed","_useState17","accessConfirmed","setAccessConfirmed","_useState18","showForm","setShowForm","_useState19","Set","setChangedPurposeIds","normalizeStatus","fetchUserConsents","_temp10","bannersData","allBanners","userStatusData","userOverview","collectionPoints","uniquePurposesMap","forEach","pid","purposeType","timestamp","cp","_cp$latest_consent","_cp$latestConsent","_cp$latest_consent2","_cp$latestConsent2","pcList","latest_consent","purpose_consents","latestConsent","purposeConsents","logTimestamp","getTime","pc","entry","de","from","initialMap","it","clear","bootstrap","createRightsRequest","_exit5","_temp12","user_id","reason","requested_at","toISOString","_temp11","purposesToSave","interaction_type","logged_at","session_id","interaction_to_save_ms","alert","handleSave","CheckCircle2","Info","el","activitiesText","processing_activity","processingActivity","resolveProcessingActivity","consentedAccepted","expiry_period_id","resolveExpiry","newValue","add","size","_temp13","setTimeout","_temp14","full_name","email","date","toLocaleDateString","formatDateValue","appointment_date","qualifications","responsibilities","working_hours","response_time","User","Mail","Clock","preventDefault","client_user_id","placeholder","required","rows","window","open","handleGrievanceSubmit","ticket","index","ticket_id"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/runtime/purposeAdapter.js","../src/runtime/TranslationContext.jsx","../src/runtime/bannerState.js","../src/templates/shared/ModernBannerHeader.jsx","../src/templates/shared/CollapsibleDataSection.jsx","../src/templates/shared/ModernPurposeCard.jsx","../src/templates/shared/ModernBannerFooter.jsx","../src/templates/shared/ModernBannerActions.jsx","../src/templates/general_consent/TabbedBannerUI.jsx","../src/templates/general_consent/InlineSingleRowUI.jsx","../src/templates/general_consent/CompactListUI.jsx","../src/runtime/templateRegistry.js","../src/templates/general_consent/BannerUI.jsx","../src/templates/general_consent/PreferencesModalUI.jsx","../src/templates/cookie_consent/CookieBannerUI.jsx","../src/templates/notice_only/NoticeOnlyBanner.jsx","../src/templates/general_consent/SplitPaneUI.jsx","../src/runtime/useConsentEngine.js","../src/core/HCaseWarningPopup.jsx","../src/core/TruConsentModal.jsx","../src/core/TruConsent.jsx","../src/runtime/cookieStorage.js","../src/runtime/gtagBridge.js","../src/core/TruCookieConsent.jsx","../src/core/RightCenter.jsx"],"sourcesContent":["/**\n * purposeAdapter.js\n *\n * Normalizes raw purpose objects from the API into a consistent shape\n * used by the Consent Engine and template layer.\n */\n\n/**\n * Normalize a single raw purpose object.\n *\n * @param {object} rawPurpose - Purpose as returned by the /v1/banners API\n * @param {string} defaultSelection - One of 'all' | 'mandatory_only' | 'none'\n * @returns {object} Normalized purpose\n */\nexport function normalizePurpose(rawPurpose, defaultSelection = 'mandatory_only') {\n const isLegitimate = !!(rawPurpose.is_legitimate || rawPurpose.isLegitimate);\n const isMandatory = !!(rawPurpose.is_mandatory || rawPurpose.isMandatory);\n\n // Legal basis: legitimate interest purposes are notice-basis\n const legalBasis = isLegitimate ? 'notice' : 'consent';\n\n // Withdrawable: only consent-basis purposes with recurring frequency\n const withdrawable = !isLegitimate && rawPurpose.frequency === 'recurring';\n\n // Initial consent state\n let checked;\n if (isLegitimate || isMandatory) {\n // Notice/legitimate interest or mandatory purposes are always active by default\n checked = 'accepted';\n } else if (defaultSelection === 'all') {\n checked = 'accepted';\n } else if (defaultSelection === 'none') {\n checked = 'declined';\n } else {\n // Default to 'mandatory_only' behavior\n checked = 'declined';\n }\n\n return {\n ...rawPurpose,\n isLegitimate,\n isMandatory,\n legalBasis,\n withdrawable,\n consented: checked,\n // Preserve isDynamic as-is (defaults to false if not present)\n isDynamic: !!(rawPurpose.is_dynamic || rawPurpose.isDynamic),\n };\n}\n\n/**\n * Normalize an array of raw purposes and sort them by hierarchy.\n * Hierarchy: Legitimate > Necessary > Purpose-based (Recurring) > Optional (One-time)\n *\n * @param {Array} purposes - Array of raw purpose objects\n * @param {string} defaultSelection - 'all' | 'mandatory_only' | 'none'\n * @returns {Array} Normalized and sorted purposes\n */\nexport function normalizePurposes(purposes, defaultSelection = 'mandatory_only') {\n const normalized = (purposes || []).map(p => normalizePurpose(p, defaultSelection));\n return sortPurposes(normalized);\n}\n\n/**\n * Sort purposes by hierarchy: Legitimate > Necessary > Recurring > One-time.\n *\n * @param {Array} purposes - Normalized purposes\n * @returns {Array} Sorted purposes\n */\nexport function sortPurposes(purposes) {\n if (!purposes || !Array.isArray(purposes)) return [];\n \n const getPriority = (p) => {\n // 1. Legitimate Interest\n if (p.isLegitimate) return 1;\n // 2. Necessary / Mandatory\n if (p.isMandatory) return 2;\n // 3. Purpose-based (Recurring)\n if (p.frequency === 'recurring') return 3;\n // 4. Optional (One-time)\n if (p.frequency === 'one_off') return 4;\n return 5;\n };\n\n return [...purposes].sort((a, b) => getPriority(a) - getPriority(b));\n}\n\n/**\n * Filter dynamic purposes based on previous consent.\n *\n * - Static purposes → always included\n * - Dynamic purpose never seen → show\n * - Dynamic purpose previously consented (accepted) → hide\n * - Dynamic purpose previously rejected → show (suppression logic applies externally)\n *\n * @param {Array} purposes - Normalized purposes\n * @param {Array} previousConsent - Previous consent records [{id, consented}]\n * @returns {Array} Filtered purposes\n */\nexport function filterDynamicPurposes(purposes, previousConsent = []) {\n return purposes.filter(p => {\n if (!p.isDynamic) return true; // Static purposes always included\n const prev = previousConsent.find(c => c.id === p.id || c.purpose_id === p.id);\n if (!prev) return true; // Never seen → show\n // Consented → hide; rejected → show (suppression logic applies)\n return prev.consented !== 'accepted' && prev.status !== 'accepted';\n });\n}\nexport const translateDynamic = (text) => text || '';\n","import React, { createContext, useContext, useMemo } from 'react';\n\nconst DEFAULT_CTX = {\n translate: (text) => text || '',\n selectedLanguage: 'en',\n availableLanguages: [],\n languageLabels: {},\n onLanguageChange: () => {},\n};\n\nconst TranslationCtx = createContext(DEFAULT_CTX);\n\nexport const useTranslate = () => useContext(TranslationCtx).translate;\nexport const useLanguage = () => {\n const { selectedLanguage, availableLanguages, languageLabels, onLanguageChange } = useContext(TranslationCtx);\n return { selectedLanguage, availableLanguages, languageLabels, onLanguageChange };\n};\n\nexport function TranslationProvider({ children, lang, snapshot, onLanguageChange }) {\n // API returns snapshot with text_map (snake_case); support both forms\n const textMap = snapshot?.text_map || snapshot?.textMap;\n\n // Use snapshot.languages array if provided by API; fallback to extracting from textMap keys\n const { availableLanguages, languageLabels } = useMemo(() => {\n if (snapshot?.languages?.length) {\n const langs = snapshot.languages;\n const labels = {};\n langs.forEach(({ code, label }) => { labels[code] = label; });\n const codes = langs.map(l => l.code);\n if (!codes.includes('en')) codes.unshift('en');\n return { availableLanguages: codes, languageLabels: labels };\n }\n if (!textMap) return { availableLanguages: [], languageLabels: {} };\n const firstEntry = Object.values(textMap)[0];\n if (!firstEntry || typeof firstEntry !== 'object') return { availableLanguages: [], languageLabels: {} };\n const snapshotLangs = Object.keys(firstEntry).filter(l => l !== 'en');\n return { availableLanguages: ['en', ...snapshotLangs], languageLabels: {} };\n }, [snapshot, textMap]);\n\n // Build a lowercase-keyed lookup map for case-insensitive translation\n const lowerCaseMap = useMemo(() => {\n if (!textMap) return {};\n const map = {};\n Object.entries(textMap).forEach(([key, val]) => {\n map[key.toLowerCase()] = val;\n });\n return map;\n }, [textMap]);\n\n // Normalise a long text for prefix-based matching:\n // - collapse whitespace, lowercase\n // - strip leading underscore from HTML attribute values (_blank → blank, _Blank → blank)\n // so that keys mangled by camelCase conversion still match\n const _normLongKey = (s) => s.replace(/\\s+/g, ' ').replace(/_blank/gi, 'blank').trim().toLowerCase();\n\n // Build a prefix-keyed map for long texts (footer HTML, etc.) where key may differ by\n // a few characters (e.g. _blank → Blank from camelCase conversion, extra whitespace).\n // Key = first 60 normalised chars (enough to be unique, past the target=… attribute).\n const prefixMap = useMemo(() => {\n if (!textMap) return {};\n const map = {};\n Object.entries(textMap).forEach(([key, val]) => {\n if (key.length > 80) {\n const prefix = _normLongKey(key).slice(0, 60);\n if (!map[prefix]) map[prefix] = val;\n }\n });\n return map;\n }, [textMap]);\n\n const translate = useMemo(() => (text) => {\n if (!text) return '';\n if (!lang || lang === 'en' || !textMap) return text;\n // 1. Exact match\n const exact = textMap[text]?.[lang];\n if (exact) return exact;\n // 2. Case-insensitive fallback\n const lower = lowerCaseMap[text.toLowerCase()]?.[lang];\n if (lower) return lower;\n // 3. Prefix fallback for long strings (handles footer HTML key variations)\n if (text.length > 80) {\n const prefix = _normLongKey(text).slice(0, 60);\n const prefixVal = prefixMap[prefix]?.[lang];\n if (prefixVal) return prefixVal;\n }\n return text;\n }, [lang, textMap, lowerCaseMap, prefixMap]);\n\n const ctx = useMemo(() => ({\n translate,\n selectedLanguage: lang || 'en',\n availableLanguages,\n languageLabels,\n onLanguageChange,\n }), [translate, lang, availableLanguages, languageLabels, onLanguageChange]);\n\n return <TranslationCtx.Provider value={ctx}>{children}</TranslationCtx.Provider>;\n}\n","/**\n * bannerState.js\n *\n * Derives UI state from normalized purposes.\n * Used by useConsentEngine and templates to decide rendering behaviour.\n */\n\n/**\n * Banner display cases:\n * CASE 1 — Legitimate + Other purposes → Tab-based UI\n * CASE 2 — Only consent purposes (no legitimate) → Normal banner (no tabs)\n * CASE 3 — Only legitimate purposes → Single-tab / notice-only UI\n */\nexport const BANNER_CASE = {\n TABBED: 1, // Legitimate + consent → two tabs\n NORMAL: 2, // Consent only → standard banner\n NOTICE_ONLY: 3, // Legitimate only → single tab / OK button\n};\n\n/**\n * Determine which banner case applies.\n *\n * @param {Array} purposes - Normalized purposes\n * @returns {number} One of BANNER_CASE values\n */\nexport function detectBannerCase(purposes = []) {\n const hasNotice = purposes.some(p => p.legalBasis === 'notice');\n const hasConsent = purposes.some(p => p.legalBasis === 'consent');\n\n if (hasNotice && hasConsent) return BANNER_CASE.TABBED;\n if (hasConsent && !hasNotice) return BANNER_CASE.NORMAL;\n if (hasNotice && !hasConsent) return BANNER_CASE.NOTICE_ONLY;\n\n // Fallback (empty purposes)\n return BANNER_CASE.NORMAL;\n}\n\n/**\n * Derive the UI state from a list of normalized purposes.\n *\n * @param {Array} purposes - Array of normalized purposes (with legalBasis)\n * @returns {object} UI state descriptor\n */\nexport function deriveUIState(purposes = []) {\n const noticePurposes = purposes.filter(p => p.legalBasis === 'notice');\n const consentPurposes = purposes.filter(p => p.legalBasis === 'consent');\n\n // Separate consent purposes into mandatory (profile-based) and optional\n const mandatoryConsentPurposes = consentPurposes.filter(p => p.isMandatory);\n const optionalConsentPurposes = consentPurposes.filter(p => !p.isMandatory);\n\n return {\n /** True when ONLY notice/legitimate-interest purposes exist (no consent needed) */\n noticeOnly: consentPurposes.length === 0 && noticePurposes.length > 0,\n\n /** True when ONLY consent purposes exist (no notice purposes) */\n consentOnly: noticePurposes.length === 0 && consentPurposes.length > 0,\n\n /** H-Case: both notice AND consent purposes exist */\n isHCase: noticePurposes.length > 0 && consentPurposes.length > 0,\n\n /** At least one consent purpose is mandatory */\n hasRequiredConsent: consentPurposes.some(p => p.isMandatory),\n\n /** Which banner case to use */\n bannerCase: detectBannerCase(purposes),\n\n /** Segmented purpose lists for action handlers */\n noticePurposes,\n consentPurposes,\n\n /** Further breakdown of consent purposes */\n mandatoryConsentPurposes,\n optionalConsentPurposes,\n };\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useLanguage, useTranslate } from '../../runtime/TranslationContext';\n\nconst processPlaceholder = (text, orgName) => (text || '').replace(/\\[Organization Name\\]/g, orgName);\n\nconst getFallbackLabel = (lang) => {\n try {\n return new Intl.DisplayNames([lang], { type: 'language' }).of(lang);\n } catch {\n return lang.toUpperCase();\n }\n};\n\nfunction LanguagePicker({ selectedLanguage, availableLanguages, languageLabels, onLanguageChange }) {\n const [open, setOpen] = useState(false);\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClickOutside = (e) => {\n if (ref.current && !ref.current.contains(e.target)) setOpen(false);\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const getLabel = (lang) => languageLabels?.[lang] || getFallbackLabel(lang);\n const currentLabel = getLabel(selectedLanguage);\n\n return (\n <div ref={ref} style={{ position: 'relative', flexShrink: 0, marginLeft: 'auto' }}>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"tru-lang-btn\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '0.75em',\n fontWeight: 600,\n padding: '4px 8px',\n borderRadius: '6px',\n border: '1px solid var(--banner-border)',\n backgroundColor: 'var(--banner-bg)',\n color: 'var(--banner-text)',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n }}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n >\n {currentLabel}\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n\n {open && (\n <div\n role=\"listbox\"\n style={{\n position: 'absolute',\n top: 'calc(100% + 4px)',\n right: 0,\n minWidth: '140px',\n maxHeight: '220px',\n overflowY: 'auto',\n backgroundColor: 'var(--banner-bg)',\n border: '1px solid var(--banner-border)',\n borderRadius: '8px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.12)',\n zIndex: 9999,\n }}\n >\n {availableLanguages.map((lang) => {\n const label = getLabel(lang);\n const isSelected = lang === selectedLanguage;\n return (\n <button\n key={lang}\n role=\"option\"\n aria-selected={isSelected}\n type=\"button\"\n onClick={() => { onLanguageChange(lang); setOpen(false); }}\n style={{\n display: 'block',\n width: '100%',\n textAlign: 'left',\n padding: '7px 12px',\n fontSize: '0.8em',\n fontWeight: isSelected ? 700 : 400,\n backgroundColor: isSelected ? 'var(--banner-hover-bg)' : 'transparent',\n color: 'var(--banner-text)',\n border: 'none',\n cursor: 'pointer',\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'var(--banner-hover-bg)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = isSelected ? 'var(--banner-hover-bg)' : 'transparent'; }}\n >\n {label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nexport default function ModernBannerHeader({ logoUrl, orgName, bannerTitle, disclaimerText }) {\n const { selectedLanguage, availableLanguages, languageLabels, onLanguageChange } = useLanguage();\n const translate = useTranslate();\n\n // Translate raw text then substitute org name placeholders.\n // Google Translate translates \"[Organization Name]\" into the target language's equivalent\n // (e.g. Tamil: \"[நிறுவனத்தின் பெயர்]\"), so we replace ANY [...] not followed by ( to handle all languages.\n const translateWithOrg = (text) => {\n if (!text) return text;\n const translated = translate(text);\n return (translated || text)\n .replace(/\\[[^\\]()]+\\](?!\\()/g, orgName || '')\n .replace(/\\{\\{companyName\\}\\}/g, orgName || '');\n };\n\n const title = bannerTitle\n ? translateWithOrg(bannerTitle)\n : (orgName\n // textMap stores \"Consent by {{companyName}}\" — translate then substitute\n ? (translate('Consent by {{companyName}}') || `Consent by {{companyName}}`).replace('{{companyName}}', orgName)\n : translate('Consent Notice'));\n\n const disclaimer = translateWithOrg(disclaimerText);\n\n const showPicker = availableLanguages.length > 1;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {logoUrl && <img src={logoUrl} alt={`${orgName} logo`} className=\"tru-banner-logo h-7 w-auto flex-shrink-0\" />}\n <h2 className=\"tru-banner-title text-[1.25em] font-bold leading-tight break-words overflow-wrap-anywhere flex-1\" style={{ color: 'var(--banner-text)', wordBreak: 'break-word' }}>{title}</h2>\n {showPicker && (\n <LanguagePicker\n selectedLanguage={selectedLanguage}\n availableLanguages={availableLanguages}\n languageLabels={languageLabels}\n onLanguageChange={onLanguageChange}\n />\n )}\n </div>\n {disclaimer && (\n <div className=\"tru-disclaimer-box border text-[0.9375em] leading-normal rounded-lg py-2 px-3 italic\"\n style={{ backgroundColor: 'var(--banner-info-bg)', borderColor: 'var(--banner-info-border)', color: 'var(--banner-info-text)' }}>\n {disclaimer}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\nexport default function CollapsibleDataSection({ title, items, isOpen, onToggle, chevronLeft = false }) {\n const translateDynamic = useTranslate();\n\n return (\n <div className=\"tru-data-section border-t\" style={{ borderColor: 'var(--banner-border)' }}>\n <button\n type=\"button\"\n className=\"w-full flex items-center py-2 text-[0.85em] font-medium gap-2\"\n style={{ color: 'var(--banner-text)' }}\n onClick={onToggle}\n >\n {chevronLeft && (\n <svg\n className={`w-3.5 h-3.5 text-gray-400 transition-transform ${isOpen ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n\n <span className=\"flex-1 text-left\">{translateDynamic(title)} ({items.length})</span>\n\n {!chevronLeft && (\n <svg className={`w-4 h-4 transform transition-transform ${isOpen ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )}\n </button>\n {isOpen && (\n <div className={`${chevronLeft ? 'pl-5' : ''} py-1.5 flex flex-wrap gap-1.5`}>\n {items.map((item) => (\n <div key={item.id} className=\"border rounded-full px-3 py-1 text-[0.875em]\"\n style={{ backgroundColor: 'var(--banner-btn-secondary-bg)', borderColor: 'var(--banner-btn-secondary-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name)}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport CollapsibleDataSection from './CollapsibleDataSection';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\nexport default function ModernPurposeCard({ purpose, banner, onToggle, mandatoryLabel, showNecessaryTag = false, isUpdated = false, isNew = false, isRemoved = false, isExpired = false }) {\n const [openSection, setOpenSection] = useState(null);\n const translateDynamic = useTranslate();\n const isMandatory = purpose.isMandatory;\n const isAccepted = purpose.consented === 'accepted' || purpose.consented === true;\n const isUUID = (val) => typeof val === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(val);\n\n const formatExpiryText = (text) => {\n if (!text || isUUID(text)) return translateDynamic('Until withdrawn');\n const t = translateDynamic(text) || text;\n if (t === 'one_time' || t === 'one_off') return translateDynamic('One-time');\n if (t === 'never') return translateDynamic('never');\n if (t.match(/^\\d+[a-zA-Z]+$/)) {\n const digits = t.match(/^\\d+/)[0];\n const unit = t.slice(digits.length);\n return `${digits} ${unit}`;\n }\n return t;\n };\n\n const formatFrequency = (freq) => {\n if (!freq) return null;\n if (freq === 'one_off' || freq === 'one_time') return translateDynamic('One-time');\n if (freq === 'recurring') return null;\n return null;\n };\n\n // Frequency takes display priority for one-time purposes\n const frequencyLabel = formatFrequency(purpose.frequency);\n\n // Try expiry fields in priority order; skip UUIDs\n const rawExpiry = [\n purpose.expiryLabel,\n purpose.expiry_type,\n purpose.expiry,\n purpose.expiryPeriod,\n purpose.expiry_period,\n ].find(v => v && !isUUID(v));\n\n // One-time frequency always shows \"One-time\" regardless of expiry_period value\n const expiryLabel = frequencyLabel || (rawExpiry ? formatExpiryText(rawExpiry) : 'Until withdrawn');\n\n const handleToggleSection = (section) => {\n setOpenSection(openSection === section ? null : section);\n };\n\n // Use per-purpose entities from the purpose object (support both camelCase and snake_case from DB snapshots)\n const dataElements = purpose.dataElements || purpose.data_elements || [];\n const processingActivities = purpose.processingActivities || purpose.processing_activities || [];\n const legalEntities = purpose.legalEntities || purpose.legal_entities || [];\n const tools = purpose.tools || [];\n\n // Combine legal entities and tools for Data Processors section\n const dataProcessors = [...legalEntities, ...tools];\n\n const getDiffFor = (field) => {\n return (purpose.field_diff || purpose.fieldDiff || []).find(d => d.field === field);\n };\n\n const renderDiffInline = (field, currentContent) => {\n const diff = getDiffFor(field);\n if (!diff) return currentContent;\n return (\n <div className=\"inline-flex items-center gap-1 flex-wrap\">\n <span className=\"px-1 py-0 rounded bg-red-50 text-red-600 line-through opacity-60 text-[0.85em] font-normal\">\n {diff.old_value || diff.oldValue || '—'}\n </span>\n <span className=\"text-gray-400 text-[0.8em]\">→</span>\n <span className=\"px-1 py-0 rounded bg-green-50 text-green-700 font-bold text-[0.95em]\">\n {currentContent}\n </span>\n </div>\n );\n };\n\n return (\n <div className=\"tru-purpose-card border rounded-xl p-2 shadow-sm hover:shadow-md transition-shadow duration-200\"\n style={{ backgroundColor: 'var(--banner-bg)', borderColor: 'var(--banner-border)', opacity: isRemoved ? 0.75 : 1 }}>\n <div className=\"flex justify-between items-start gap-2\">\n <div className=\"flex-1 space-y-0.5\">\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <h3 className=\"font-bold text-[1em]\" style={{ color: 'var(--banner-text)', textDecoration: isRemoved ? 'line-through' : 'none' }}>\n {renderDiffInline('name', translateDynamic(purpose.name))}\n </h3>\n {(isUpdated || isNew || isExpired) && (\n <span style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 7px',\n borderRadius: '999px',\n fontSize: '0.62rem',\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n backgroundColor: isExpired ? '#d97706' : isNew ? '#10b981' : '#3b82f6',\n color: '#ffffff',\n marginLeft: '6px',\n verticalAlign: 'middle',\n lineHeight: 1,\n }}>\n {isExpired ? translateDynamic('Expired') : isNew ? translateDynamic('New') : translateDynamic('Updated')}\n </span>\n )}\n </div>\n\n {purpose.description && (\n <p className=\"text-[0.8em] opacity-80\" style={{ color: 'var(--banner-text-muted)' }}>\n {translateDynamic(purpose.description)}\n </p>\n )}\n\n {/* Processing Activities as Pills */}\n {processingActivities.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {processingActivities.map((activity, idx) => (\n <span key={idx} className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-[0.75em] font-medium border\"\n style={{\n backgroundColor: 'var(--banner-btn-secondary-bg)',\n color: 'var(--banner-text-muted)',\n borderColor: 'var(--banner-btn-secondary-border)',\n maxWidth: '140px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'inline-block',\n }}>\n {translateDynamic(activity.name || activity)}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Right Column: Actions & Meta Row */}\n <div className=\"flex flex-col items-end gap-1.5 shrink-0\">\n <div className=\"h-6 flex items-center\">\n {isRemoved ? (\n <span style={{\n fontSize: '0.65rem',\n fontWeight: 700,\n backgroundColor: '#ef4444',\n color: '#fff',\n padding: '3px 6px',\n borderRadius: '4px',\n textTransform: 'uppercase'\n }}>\n {translateDynamic('Removed')}\n </span>\n ) : !purpose.isLegitimate && (\n <div className=\"flex items-center gap-2\">\n {showNecessaryTag ? (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[0.6em] font-bold uppercase tracking-wide shrink-0\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', border: '1px solid var(--banner-danger-text)' }}>\n {translateDynamic('Necessary')}\n </span>\n ) : !isMandatory && (\n <span className=\"text-[10px] font-bold uppercase tracking-tight\" style={{ color: 'var(--banner-text-muted)' }}>{translateDynamic('Accept')}</span>\n )}\n <label className=\"switch scale-90 origin-right\">\n <input type=\"checkbox\" checked={isAccepted} onChange={(e) => onToggle(purpose.id, e.target.checked ? 'accepted' : 'declined')} />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </label>\n </div>\n )}\n </div>\n\n <div className=\"flex flex-wrap flex-col items-end gap-0.5 min-w-[80px]\">\n <span className=\"text-[0.7em] font-medium italic\" style={{ color: 'var(--banner-text-muted)', opacity: 0.8 }}>\n {isRemoved ? translateDynamic('No longer required') : renderDiffInline('expiry_period', (rawExpiry && !frequencyLabel) ? `${translateDynamic('Expires in')} ${expiryLabel}` : expiryLabel)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Difference Summary - REMOVED for integrated view */}\n\n {/* Sections - Collapsible */}\n <div className=\"mt-1 space-y-1\">\n {dataElements.length > 0 && (\n <CollapsibleDataSection\n title=\"Data Elements\"\n items={dataElements}\n isOpen={openSection === 'data_elements'}\n onToggle={() => handleToggleSection('data_elements')}\n />\n )}\n\n {banner?.showProcessors !== false && dataProcessors.length > 0 && (\n <CollapsibleDataSection\n title=\"Data Processors\"\n items={dataProcessors}\n isOpen={openSection === 'data_processors'}\n onToggle={() => handleToggleSection('data_processors')}\n />\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\nfunction convertMarkdownLinks(text) {\n return text.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_, linkText, url) => {\n let fullUrl = url.trim();\n if (!fullUrl.match(/^[a-zA-Z]+:\\/\\//)) fullUrl = `https://${fullUrl}`;\n return `<a href=\"${fullUrl}\" class=\"hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: var(--banner-primary-color);\">${linkText}</a>`;\n });\n}\n\nexport default function ModernBannerFooter({ footerText, orgName }) {\n const translate = useTranslate();\n if (!footerText) return null;\n // Translate first (textMap key is the raw footer with [Organization Name] placeholder).\n // Google Translate may translate the placeholder too, so replace ANY [...] not followed by ( with orgName.\n const translatedRaw = translate(footerText);\n const processedText = (translatedRaw || footerText)\n .replace(/\\[[^\\]()]+\\](?!\\()/g, orgName || '')\n .replace(/\\{\\{companyName\\}\\}/g, orgName || '');\n const htmlContent = convertMarkdownLinks(processedText);\n return (\n <div\n className=\"tru-footer-box text-center text-[0.8125em] border rounded-lg px-3 py-2 leading-normal italic mb-2 w-full\"\n style={{ backgroundColor: 'var(--banner-info-bg)', borderColor: 'var(--banner-info-border)', color: 'var(--banner-info-text)' }}\n dangerouslySetInnerHTML={{ __html: htmlContent }}\n />\n );\n}\n","import React from 'react';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\nexport default function ModernBannerActions({\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n actionButtonText,\n rejectAllText,\n rejectAllColor,\n acceptAllText,\n onlyNecessaryText,\n onlyNecessaryColor,\n primaryColor,\n purposes = [],\n isBottomReached = false,\n hasUserInteracted = false,\n isSplitLayout = false,\n showAcceptAll = true,\n minimal = false\n}) {\n const translate = useTranslate();\n const anyOptionalAccepted = purposes\n .filter(p => !p.isMandatory)\n .some(p => p.consented === 'accepted' || p.consented === true);\n\n const disabledClasses = \"opacity-50 cursor-not-allowed\";\n const buttonBase = \"px-3 py-1.5 text-[0.8125em] font-bold rounded-lg transition-all duration-200 shadow-sm whitespace-nowrap flex-shrink-0\";\n\n if (isSplitLayout) {\n const splitLayoutContent = (\n <>\n {!isBottomReached && (\n <p className=\"text-[10px] mb-2 text-center animate-pulse\" style={{ color: 'var(--banner-text-muted)' }}>\n {translate('Please scroll to the bottom to enable actions')}\n </p>\n )}\n <div className=\"tru-actions-row tru-actions-center\">\n <button\n onClick={onRejectAll}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (rejectAllColor || '#dc2626') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-reject ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {translate(rejectAllText || 'Reject All')}\n </button>\n\n <button\n onClick={onAcceptMandatory}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (onlyNecessaryColor || '#f97316') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-necessary ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {translate(onlyNecessaryText || 'Only Necessary')}\n </button>\n\n {showAcceptAll && (\n <button\n onClick={onConsentAll}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? '#10b981' : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-accept ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {translate(actionButtonText || acceptAllText || 'Accept All')}\n </button>\n )}\n </div>\n </>\n );\n\n if (minimal) return <div className=\"w-full\">{splitLayoutContent}</div>;\n\n return (\n <div className=\"px-4 py-3 border-t\" style={{ backgroundColor: 'var(--banner-hover-bg)', borderColor: 'var(--banner-border)' }}>\n {splitLayoutContent}\n </div>\n );\n }\n\n const defaultLayoutContent = (\n <div className=\"w-full\">\n {!isBottomReached && (\n <p className=\"text-[10px] mb-2 text-center animate-pulse\" style={{ color: 'var(--banner-text-muted)' }}>\n {translate('Please scroll to the bottom to enable actions')}\n </p>\n )}\n <div className=\"tru-actions-row tru-actions-center\">\n <button\n onClick={onRejectAll}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (rejectAllColor || '#dc2626') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-reject ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {translate(rejectAllText || 'Reject All')}\n </button>\n\n <button\n onClick={onAcceptMandatory}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? (onlyNecessaryColor || '#f97316') : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-necessary ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {translate(onlyNecessaryText || 'Only Necessary')}\n </button>\n\n <button\n onClick={() => {\n if (anyOptionalAccepted || hasUserInteracted) {\n onAcceptSelected?.();\n } else {\n onConsentAll();\n }\n }}\n disabled={!isBottomReached}\n style={{ backgroundColor: isBottomReached ? '#10b981' : 'var(--banner-border)' }}\n className={`tru-btn tru-btn-accept ${buttonBase} text-white hover:opacity-90 ${!isBottomReached ? disabledClasses : ''}`}\n >\n {translate(actionButtonText || acceptAllText || 'I Consent')}\n </button>\n </div>\n </div>\n );\n\n if (minimal) return defaultLayoutContent;\n\n return (\n <div className=\"px-4 py-2.5 border-t\" style={{ backgroundColor: 'var(--banner-hover-bg)', borderColor: 'var(--banner-border)' }}>\n {defaultLayoutContent}\n </div>\n );\n}\n","/**\n * TabbedBannerUI.jsx\n *\n * Dynamic tab-based consent banner that adapts to four cases:\n * CASE 1 (TABBED) — Legitimate + consent purposes → 2 tabs (+ Re-consent if campaign)\n * CASE 2 (NORMAL) — Consent purposes only → no tabs (+ Re-consent tab if campaign)\n * CASE 3 (NOTICE_ONLY) — Legitimate purposes only → single Informational tab (+ Re-consent if campaign)\n * RE-CONSENT — Any case with active campaign → Re-consent tab appended; auto-lands there\n */\nimport React, { useState, useRef, useEffect, Fragment } from 'react';\nimport { BANNER_CASE } from '../../runtime/bannerState';\nimport { useTranslate } from '../../runtime/TranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction GroupHeader({ title }) {\n return <div className=\"tru-group-heading\">{title}</div>;\n}\n\nfunction TabButton({ label, isActive, onClick, tabId, panelId, badge, badgeColor, primaryColor }) {\n return (\n <button\n role=\"tab\"\n id={tabId}\n aria-selected={isActive}\n aria-controls={panelId}\n onClick={onClick}\n className=\"tru-tab-button\"\n data-active={isActive || undefined}\n >\n {label}\n {badge && (\n <span style={{\n marginLeft: '5px',\n background: badgeColor || primaryColor,\n color: '#fff',\n fontSize: '0.58rem',\n fontWeight: 700,\n padding: '2px 6px',\n borderRadius: '999px',\n verticalAlign: 'middle',\n letterSpacing: '0.04em',\n textTransform: 'uppercase',\n lineHeight: 1,\n display: 'inline-flex',\n alignItems: 'center',\n }}>\n {badge}\n </span>\n )}\n </button>\n );\n}\n\nfunction TabPanel({ id, labelledBy, children, isActive }) {\n return (\n <div\n role=\"tabpanel\"\n id={id}\n aria-labelledby={labelledBy}\n hidden={!isActive}\n className=\"tru-tab-panel\"\n >\n {children}\n </div>\n );\n}\n\nfunction LegitimateUseContent({ noticePurposes, banner, settings }) {\n return (\n <div className=\"tru-legitimate-content\">\n <div className=\"tru-purposes-list\">\n {noticePurposes.map((p) => (\n <ModernPurposeCard key={p.id} purpose={p} banner={banner} onToggle={() => {}} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ConsentPurposesContent({ allConsentPurposes, banner, onChangePurpose, settings }) {\n const translate = useTranslate();\n const groups = [\n {\n title: translate('Necessary'),\n items: allConsentPurposes.filter(p => p.isMandatory && !p.isDynamic)\n },\n {\n title: translate('Optional'),\n items: allConsentPurposes.filter(p => !p.isMandatory && !p.isDynamic)\n },\n {\n title: translate('Profile Based'),\n items: allConsentPurposes.filter(p => p.isDynamic)\n }\n ].filter(g => g.items.length > 0);\n\n return (\n <div className=\"tru-consent-content\">\n <div className=\"tru-purposes-list\">\n {groups.map((group, gIdx) => (\n <React.Fragment key={gIdx}>\n <GroupHeader title={group.title} />\n {group.items.map((p) => (\n <ModernPurposeCard\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n showNecessaryTag={p.isDynamic && p.isMandatory}\n />\n ))}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n}\n\n/** Re-consent tab: shows version diff summary (or expiry notice) + purpose toggles. */\nfunction ReconsentContent({ purposes, versionDiff, reconsentUiMode, banner, onChangePurpose, primaryColor, hasOtherTabs, reconsentSource }) {\n const isExpiryReconsent = reconsentSource === 'expiry';\n const hasMixedExpiry = !isExpiryReconsent && purposes.some(p => p.isExpired);\n const changedFields = (!isExpiryReconsent && versionDiff?.changed_fields) || (!isExpiryReconsent && versionDiff?.changedFields) || [];\n const changedPurposeIds = new Set((!isExpiryReconsent && versionDiff?.changed_purpose_ids) || (!isExpiryReconsent && versionDiff?.changedPurposeIds) || []);\n\n // If there are other tabs (Consent/Info), we only show changes here.\n // Otherwise we respect the API mode.\n const effectiveMode = hasOtherTabs ? 'diff_only' : reconsentUiMode;\n console.log('[TruConsent] ReconsentContent purposes:', purposes.map(p => ({ id: p.id, name: p.name, isExpired: p.isExpired, isUpdated: p.isUpdated, isNew: p.isNew })), 'effectiveMode:', effectiveMode, 'versionDiff:', versionDiff);\n\n let purposesToShow = effectiveMode === 'diff_only'\n ? purposes.filter(p =>\n (versionDiff?.changed_purpose_ids || versionDiff?.changedPurposeIds || []).includes(p.id) ||\n (versionDiff?.added_purpose_ids || versionDiff?.addedPurposeIds || []).includes(p.id) ||\n Boolean(p.isExpired)\n )\n : purposes;\n\n // Fallback: If \"Changes Only\" results in nothing (e.g. only global text changed), \n // show everything so the tab isn't empty.\n if (purposesToShow.length === 0 && purposes.length > 0) {\n purposesToShow = purposes;\n }\n\n return (\n <div className=\"tru-reconsent-content\">\n {/* Notice banner */}\n <div style={{\n background: `${primaryColor}14`, // ~8% opacity\n border: `1px solid ${primaryColor}33`, // ~20% opacity\n borderRadius: '6px',\n padding: '0.6rem 0.75rem',\n marginBottom: '0.75rem',\n fontSize: '0.8rem',\n color: primaryColor,\n display: 'flex',\n gap: '0.5rem',\n alignItems: 'flex-start',\n }}>\n <span style={{ flexShrink: 0 }}>🔄</span>\n <span>\n {isExpiryReconsent\n ? <><strong>Consent Expired</strong> — Your consent for these purposes has expired. Please review and re-confirm your preferences below.</>\n : <><strong>Consent Update Required</strong> — Some terms have changed since you last consented. Please review and re-confirm your preferences below.</>\n }\n {hasMixedExpiry && (\n <span style={{ display: 'block', marginTop: '0.35rem', opacity: 0.85 }}>\n Some purposes are also marked <strong>Expired</strong> and require re-confirmation.\n </span>\n )}\n </span>\n </div>\n\n {/* CP-level field diff (e.g. name or description changed) */}\n {changedFields.length > 0 && (\n <div style={{\n background: 'var(--banner-hover-bg, rgba(0,0,0,0.03))',\n border: '1px solid var(--banner-border, #e5e7eb)',\n borderRadius: '6px',\n padding: '0.6rem 0.75rem',\n marginBottom: '0.75rem',\n fontSize: '0.78rem',\n }}>\n <div style={{ fontWeight: 600, marginBottom: '0.35rem', fontSize: '0.75rem', textTransform: 'uppercase', letterSpacing: '0.05em', opacity: 0.6 }}>\n What changed\n </div>\n {changedFields.map(({ field, old_value, new_value }) => (\n <div key={field} style={{ display: 'flex', gap: '0.4rem', alignItems: 'baseline', marginBottom: '0.2rem' }}>\n <span style={{ fontWeight: 600, minWidth: 90, textTransform: 'capitalize' }}>{field.replace(/_/g, ' ')}:</span>\n <span style={{ textDecoration: 'line-through', opacity: 0.5, wordBreak: 'break-all' }}>{String(old_value ?? '—')}</span>\n <span style={{ opacity: 0.4, flexShrink: 0 }}>→</span>\n <span style={{ color: 'var(--banner-primary-color, #3b82f6)', wordBreak: 'break-all' }}>{String(new_value ?? '—')}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Purpose cards */}\n <div className=\"tru-purposes-list\">\n {purposesToShow.length === 0 && (versionDiff?.removed_purposes || versionDiff?.removedPurposes || []).length === 0 ? (\n <div style={{ color: 'var(--banner-muted, #888)', fontSize: '0.85rem', padding: '0.5rem 0' }}>\n No specific purposes require re-consent.\n </div>\n ) : (\n <React.Fragment>\n {purposesToShow.map((p) => (\n <div key={p.id} style={{ position: 'relative' }}>\n <ModernPurposeCard\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n isUpdated={!isExpiryReconsent && !p.isExpired && (versionDiff?.changed_purpose_ids || versionDiff?.changedPurposeIds || []).includes(p.id)}\n isNew={!isExpiryReconsent && !p.isExpired && (versionDiff?.added_purpose_ids || versionDiff?.addedPurposeIds || []).includes(p.id)}\n isExpired={isExpiryReconsent || Boolean(p.isExpired)}\n />\n </div>\n ))}\n\n {/* Removed Purposes Section */}\n {(versionDiff?.removed_purposes || versionDiff?.removedPurposes || []).map((rp) => (\n <div key={rp.id} style={{ position: 'relative', marginTop: '0.5rem' }}>\n <ModernPurposeCard\n purpose={rp}\n banner={banner}\n onToggle={() => {}} /* No-op for removed purposes */\n isRemoved={true}\n />\n </div>\n ))}\n </React.Fragment>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build the ordered tab list for the current banner case + re-consent state.\n *\n * reconsentOnly = true → dedicated re-consent CP (new_collection_point method).\n * The CP exists solely for re-consent so we skip Informational and Consent tabs\n * entirely and show only the Re-consent tab.\n */\nfunction buildTabs(bannerCase, hasReconsent, reconsentOnly, translate) {\n const t = translate || ((x) => x);\n if (reconsentOnly) {\n return [{ key: 'reconsent', label: t('Re-consent') }];\n }\n const tabs = [];\n if (bannerCase === BANNER_CASE.TABBED || bannerCase === BANNER_CASE.NOTICE_ONLY) {\n tabs.push({ key: 'legitimate', label: t('Informational') });\n }\n if (bannerCase === BANNER_CASE.TABBED || bannerCase === BANNER_CASE.NORMAL) {\n tabs.push({ key: 'purposes', label: t('Consent') });\n }\n if (hasReconsent) {\n tabs.push({ key: 'reconsent', label: t('Re-consent') });\n }\n return tabs;\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport default function TabbedBannerUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n onAcknowledgeNotice,\n hasUserInteracted,\n actionLoading,\n bannerCase,\n uiState,\n settings: settingsOverride,\n // Re-consent props\n reconsentCampaignId,\n reconsentUiMode,\n versionDiff,\n reconsentOnly,\n reconsentSource,\n expiryReconsentRequestId,\n}) {\n const scrollRef = useRef(null);\n const [isBottomReached, setIsBottomReached] = useState(false);\n const translate = useTranslate();\n\n const settings = settingsOverride || banner?.bannerSettings || {};\n const isReconsentOnly = reconsentOnly || (banner?.bannerId && banner.bannerId.endsWith('-rc'));\n const hasReconsent = Boolean(reconsentCampaignId) || Boolean(expiryReconsentRequestId);\n\n // Use Campaign Blue (#3b82f6) if re-consent is active, otherwise use settings primary color\n const primaryColor = (hasReconsent || isReconsentOnly) ? '#3b82f6' : (settings.primaryColor || '#3b82f6');\n\n const { noticePurposes = [], consentPurposes = [] } = uiState || {};\n\n const tabs = buildTabs(bannerCase, hasReconsent, reconsentOnly || isReconsentOnly, translate);\n\n // Auto-land on the Re-consent tab when an active campaign is present.\n // Fall back to 0 if Re-consent tab somehow isn't in the list.\n const reconsentTabIndex = tabs.findIndex(t => t.key === 'reconsent');\n const [activeTab, setActiveTab] = useState(\n hasReconsent && reconsentTabIndex >= 0 ? reconsentTabIndex : 0\n );\n\n // Reset scroll gate on tab change\n const handleScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n if (scrollHeight - scrollTop <= clientHeight + 5) setIsBottomReached(true);\n };\n\n useEffect(() => {\n if (scrollRef.current) {\n const { scrollHeight, clientHeight } = scrollRef.current;\n setIsBottomReached(scrollHeight <= clientHeight);\n }\n }, [banner?.purposes, activeTab]);\n\n const styleVars = {\n '--font-type': settings.fontType,\n '--font-size': settings.fontSize,\n '--banner-primary-color': primaryColor,\n '--banner-secondary-color': settings.secondaryColor || '#555',\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n const currentTab = tabs[activeTab];\n const isFirstTab = activeTab === 0;\n const isLastTab = activeTab === tabs.length - 1;\n const isReconsentTab = currentTab?.key === 'reconsent';\n const isLegitimateTab = currentTab?.key === 'legitimate';\n const isPurposesTab = currentTab?.key === 'purposes';\n\n // Shared tab bar (rendered the same way regardless of case)\n const tabBar = tabs.length > 1 ? (\n <div className=\"tru-tabs-bar\" role=\"tablist\" aria-label=\"Consent sections\">\n {tabs.map((tab, idx) => (\n <TabButton\n key={tab.key}\n label={tab.label}\n isActive={activeTab === idx}\n onClick={() => setActiveTab(idx)}\n tabId={'tab-' + tab.key}\n panelId={'panel-' + tab.key}\n badge={tab.badge}\n badgeColor={tab.badgeColor}\n primaryColor={primaryColor}\n />\n ))}\n </div>\n ) : (\n <div className=\"tru-tabs-bar\" role=\"tablist\" aria-label=\"Consent sections\">\n <TabButton\n label={tabs[0]?.label}\n isActive={true}\n onClick={() => {}}\n tabId={'tab-' + tabs[0]?.key}\n panelId={'panel-' + tabs[0]?.key}\n badge={tabs[0]?.badge}\n badgeColor={tabs[0]?.badgeColor}\n primaryColor={primaryColor}\n />\n </div>\n );\n\n // Shared footer actions\n const footerActions = (\n <div className=\"tru-actions-row\" style={{ display: 'flex', justifyContent: 'flex-end', width: '100%' }}>\n {/* Informational / Legitimate tab: Next button */}\n {isLegitimateTab && !isLastTab && (\n <button\n className={`tru-btn tru-btn-primary ${!isBottomReached ? 'opacity-50 cursor-not-allowed' : ''}`}\n style={{ backgroundColor: isBottomReached ? primaryColor : 'var(--banner-border)' }}\n onClick={() => isBottomReached && setActiveTab(activeTab + 1)}\n disabled={!isBottomReached}\n >\n {translate('Next')}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ marginLeft: 6 }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n )}\n\n {/* Informational-only (no more tabs after): OK button */}\n {isLegitimateTab && isLastTab && (\n <button\n className=\"tru-btn tru-btn-primary\"\n style={{ backgroundColor: primaryColor }}\n onClick={onAcknowledgeNotice}\n disabled={actionLoading}\n >\n {actionLoading ? translate('Processing...') : (settings.noticeAcknowledgeText || translate('Ok'))}\n </button>\n )}\n\n {/* Consent tab: standard actions; Next if Re-consent tab follows */}\n {isPurposesTab && !isLastTab && (\n <button\n className={`tru-btn tru-btn-primary ${!isBottomReached ? 'opacity-50 cursor-not-allowed' : ''}`}\n style={{ backgroundColor: isBottomReached ? primaryColor : 'var(--banner-border)' }}\n onClick={() => isBottomReached && setActiveTab(activeTab + 1)}\n disabled={!isBottomReached}\n >\n {translate('Next')}\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ marginLeft: 6 }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n )}\n {isPurposesTab && isLastTab && (\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={banner?.purposes || []}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={primaryColor}\n isBottomReached={isBottomReached}\n hasUserInteracted={hasUserInteracted}\n minimal={true}\n />\n )}\n\n {/* Re-consent tab: same submit actions, labelled for re-consent context */}\n {isReconsentTab && (\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={banner?.purposes || []}\n actionButtonText={settings.actionButtonText || 'Re-consent'}\n rejectAllText={settings.rejectAllText || 'Decline'}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText || 'Re-consent All'}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={primaryColor}\n isBottomReached={isBottomReached}\n hasUserInteracted={hasUserInteracted}\n minimal={true}\n />\n )}\n </div>\n );\n\n // Single shared scroll warning lines (shown inside scroll area, below content)\n const scrollWarnings = (\n <Fragment>\n {isLegitimateTab && (\n <div className=\"tru-legitimate-disclaimer\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <p>{translate('No action is needed — this notice is for your awareness and is logged for transparency.')}</p>\n </div>\n )}\n {isPurposesTab && banner?.purposes?.some(p => p.consented === 'declined' || p.consented === false) && (\n <div className=\"tru-warning-bar\" style={{ marginTop: 16 }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <p>{translate('Your explicit consent is required to proceed. You may accept or decline, and can update your preferences anytime from the Rights Centre.')}</p>\n </div>\n )}\n </Fragment>\n );\n\n // -----------------------------------------------------------------------\n // Unified render — all cases share the same shell; only tab definitions differ\n // -----------------------------------------------------------------------\n const rootClass = reconsentOnly\n ? 'tru-banner-root tru-banner-reconsent-only'\n : tabs.length > 1\n ? 'tru-banner-root tru-banner-tabbed'\n : bannerCase === BANNER_CASE.NOTICE_ONLY\n ? 'tru-banner-root tru-banner-notice-only'\n : 'tru-banner-root tru-banner-normal';\n\n return (\n <div className={rootClass} style={styleVars}>\n <div className=\"tru-banner-header-area\">\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={settings.bannerTitle}\n disclaimerText={settings.disclaimerText}\n />\n </div>\n\n {tabBar}\n\n <div ref={scrollRef} onScroll={handleScroll} className=\"tru-banner-scroll-area\">\n {/* Legitimate / Informational tab */}\n {tabs.some(t => t.key === 'legitimate') && (\n <TabPanel id=\"panel-legitimate\" labelledBy=\"tab-legitimate\" isActive={isLegitimateTab}>\n <LegitimateUseContent\n noticePurposes={noticePurposes}\n banner={banner}\n settings={settings}\n companyName={companyName}\n />\n </TabPanel>\n )}\n\n {/* Consent tab */}\n {tabs.some(t => t.key === 'purposes') && (\n <TabPanel id=\"panel-purposes\" labelledBy=\"tab-purposes\" isActive={isPurposesTab}>\n <ConsentPurposesContent\n allConsentPurposes={consentPurposes}\n banner={banner}\n onChangePurpose={onChangePurpose}\n settings={settings}\n companyName={companyName}\n />\n </TabPanel>\n )}\n\n {/* Re-consent tab */}\n {hasReconsent && (\n <TabPanel id=\"panel-reconsent\" labelledBy=\"tab-reconsent\" isActive={isReconsentTab}>\n <ReconsentContent\n purposes={banner?.purposes || []}\n versionDiff={versionDiff}\n reconsentUiMode={reconsentUiMode}\n banner={banner}\n onChangePurpose={onChangePurpose}\n primaryColor={primaryColor}\n hasOtherTabs={tabs.length > 1}\n reconsentSource={reconsentSource}\n />\n </TabPanel>\n )}\n\n {scrollWarnings}\n </div>\n\n <div className=\"tru-banner-footer-area\">\n <ModernBannerFooter footerText={settings.footerText} orgName={companyName} />\n {footerActions}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useTranslate } from '../../runtime/TranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerActions from '../shared/ModernBannerActions';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\n\nfunction PurposeRow({ purpose, onChangePurpose, settings }) {\n const translateDynamic = useTranslate();\n const isMandatory = purpose.isMandatory;\n const isAccepted = purpose.consented === 'accepted' || purpose.consented === true;\n const mandatoryLabel = settings.mandatoryLabel || 'Necessary';\n\n const dataElements = purpose.dataElements || [];\n const _legalEntities = purpose.legalEntities || [];\n const _tools = purpose.tools || [];\n const dataProcessors = [..._legalEntities, ..._tools];\n\n return (\n <tr className=\"border-b transition-colors hover:bg-gray-50/50\" style={{ borderColor: 'var(--banner-border)' }}>\n {/* Column 1: Purpose Name & Description */}\n <td className=\"py-3 px-4 min-w-[200px]\">\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"font-bold text-[0.85em]\" style={{ color: 'var(--banner-text)' }}>\n {translateDynamic(purpose.name)}\n </span>\n {isMandatory && (\n <span className=\"text-[0.6em] uppercase font-black px-1.5 py-0.5 rounded-md tracking-wider border shrink-0\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', borderColor: 'var(--banner-danger-text)' }}>\n {mandatoryLabel}\n </span>\n )}\n </div>\n <p className=\"text-[0.7em] leading-tight text-gray-500 line-clamp-2 max-w-[400px]\" title={translateDynamic(purpose.description)}>\n {translateDynamic(purpose.description)}\n </p>\n </div>\n </td>\n\n {/* Column 2: Data Elements */}\n <td className=\"py-3 px-3 min-w-[250px]\">\n <div className=\"flex flex-wrap gap-1\">\n {dataElements.length > 0 ? dataElements.map((item, idx) => (\n <span key={idx} className=\"px-2 py-0.5 rounded text-[0.65em] border whitespace-nowrap\"\n style={{ backgroundColor: 'var(--banner-card-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item)}\n </span>\n )) : <span className=\"text-[0.65em] text-gray-400 italic\">No data elements</span>}\n </div>\n </td>\n\n {/* Column 3: Data Processors */}\n <td className=\"py-3 px-3 min-w-[220px]\">\n <div className=\"flex flex-wrap gap-1\">\n {dataProcessors.length > 0 ? dataProcessors.map((item, idx) => (\n <span key={idx} className=\"px-2 py-0.5 rounded text-[0.65em] border whitespace-nowrap\"\n style={{ backgroundColor: 'var(--banner-card-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item)}\n </span>\n )) : <span className=\"text-[0.65em] text-gray-400 italic\">No processors</span>}\n </div>\n </td>\n\n {/* Column 4: Expiration */}\n <td className=\"py-3 px-3 min-w-[120px]\">\n <span className=\"text-[0.7em] text-gray-500\">\n {purpose.expiryPeriod ? `Expires in ${translateDynamic(purpose.expiryPeriod)}` : '-'}\n </span>\n </td>\n\n {/* Column 5: Action / Status */}\n <td className=\"py-3 px-4 text-right\">\n <div className=\"flex items-center justify-end gap-3\">\n {!isMandatory ? (\n <label className=\"switch scale-[0.8] origin-right cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={isAccepted}\n onChange={(e) => onChangePurpose(purpose.id, e.target.checked ? 'accepted' : 'declined')}\n />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </label>\n ) : (\n <div className=\"w-10 h-5\" /> // Spacer for alignment\n )}\n </div>\n </td>\n </tr>\n );\n}\n\nexport default function InlineSingleRowUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n hasUserInteracted,\n primaryColor,\n actionLoading\n}) {\n const settings = banner?.bannerSettings || {};\n const finalPrimaryColor = primaryColor || settings.primaryColor || '#3b82f6';\n const purposes = banner?.purposes || [];\n\n if (purposes.length === 0) return null;\n\n const footerText = settings.footerText;\n\n return (\n <div className=\"w-full h-full bg-white border rounded-xl overflow-hidden shadow-2xl flex flex-col\" style={{ borderColor: 'var(--banner-border)' }}>\n {/* Header Area */}\n <div className=\"flex-shrink-0 pt-3.5 pb-2 px-4 border-b bg-gray-50 relative z-20\" style={{ borderColor: 'var(--banner-border)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={settings.bannerTitle}\n disclaimerText={settings.disclaimerText}\n />\n </div>\n\n {/* Spreadsheet Table Container */}\n <div className=\"flex-1 overflow-x-auto overflow-y-auto w-full scrollbar-thin scrollbar-thumb-gray-200\">\n <table className=\"w-full border-collapse text-left border-hidden\">\n <thead className=\"bg-gray-50 sticky top-0 z-10\" style={{ backgroundColor: 'var(--banner-hover-bg)' }}>\n <tr className=\"border-b\" style={{ borderColor: 'var(--banner-border)' }}>\n <th className=\"py-4 px-4 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">Purpose / Description</th>\n <th className=\"py-4 px-3 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">Data Elements</th>\n <th className=\"py-4 px-3 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">Data Processors</th>\n <th className=\"py-4 px-3 text-[0.7em] font-black uppercase tracking-wider text-gray-500\">Expiration</th>\n <th className=\"py-4 px-4 text-[0.7em] font-black uppercase tracking-wider text-gray-500 text-right\">Status</th>\n </tr>\n </thead>\n <tbody>\n {purposes.map(purpose => (\n <PurposeRow\n key={purpose.id}\n purpose={purpose}\n onChangePurpose={onChangePurpose}\n settings={settings}\n />\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Bottom Footer Actions */}\n <div className=\"p-4 border-t bg-gray-50/50\" style={{ borderColor: 'var(--banner-border)' }}>\n {footerText && (\n <div className=\"mb-4\">\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n compact={true}\n />\n </div>\n )}\n\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n isLoading={actionLoading}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={finalPrimaryColor}\n purposes={purposes}\n isBottomReached={true} // Always allow actions in spreadsheet view\n showAcceptAll={true}\n />\n </div>\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { useTranslate } from '../../runtime/TranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\nimport CollapsibleDataSection from '../shared/CollapsibleDataSection';\n\n// Individual compact row\nfunction CompactPurposeRow({ purpose, banner, onToggle, isExpanded, toggleExpand }) {\n const translateDynamic = useTranslate();\n const settings = banner?.bannerSettings || {};\n const [openSections, setOpenSections] = React.useState({});\n\n const toggleSection = (section) => {\n setOpenSections(prev => ({ ...prev, [section]: !prev[section] }));\n };\n\n const isMandatory = purpose.isMandatory;\n const isAccepted = purpose.consented === 'accepted' || purpose.consented === true;\n const primaryColor = settings.primaryColor || '#3b82f6';\n const mandatoryLabel = settings.mandatoryLabel || 'Necessary';\n\n // Use per-purpose entities\n const dataElements = purpose.dataElements || [];\n const processingActivities = purpose.processingActivities || [];\n const _legalEntities = purpose.legalEntities || [];\n const _tools = purpose.tools || [];\n const dataProcessors = [..._legalEntities, ..._tools];\n\n return (\n <div className=\"border rounded-lg mb-2 overflow-hidden bg-white\" style={{ borderColor: isExpanded ? primaryColor : 'var(--banner-border)' }}>\n <div\n className=\"flex items-center justify-between p-3 gap-3 cursor-pointer hover:bg-gray-50 transition-colors\"\n onClick={toggleExpand}\n >\n {/* Left: Title & Expand Icon */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <svg\n className={`w-4 h-4 text-gray-400 transition-transform ${isExpanded ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <h3 className=\"font-bold text-[0.85em] truncate text-gray-800\">\n {translateDynamic(purpose.name)}\n </h3>\n {purpose.expiryPeriod && (\n <span className=\"text-[0.7em] text-gray-400 font-normal italic ml-1 shrink-0\">\n (Expires in {translateDynamic(purpose.expiryPeriod)})\n </span>\n )}\n </div>\n\n {/* Right: Actions */}\n <div className=\"flex items-center gap-3 shrink-0\" onClick={(e) => e.stopPropagation()}>\n {isMandatory ? (\n <span className=\"text-[0.65em] uppercase font-extrabold px-1.5 py-0.5 rounded-md tracking-wider border\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', borderColor: 'var(--banner-danger-text)' }}>\n {mandatoryLabel}\n </span>\n ) : (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <span className=\"text-[0.7em] font-medium uppercase text-gray-500 hidden sm:inline\">\n {isAccepted ? 'Accept' : 'Declined'}\n </span>\n <div className=\"switch scale-[0.8] origin-right m-0\">\n <input\n type=\"checkbox\"\n checked={isAccepted}\n onChange={(e) => onToggle(purpose.id, e.target.checked ? 'accepted' : 'declined')}\n />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </div>\n </label>\n )}\n </div>\n </div>\n\n {/* Expanded Content */}\n {isExpanded && (\n <div className=\"p-3 pt-0 border-t bg-gray-50 bg-opacity-30\" style={{ borderColor: 'var(--banner-border)' }}>\n <p className=\"text-[0.8em] text-gray-600 mt-2 mb-3 leading-relaxed\">\n {translateDynamic(purpose.description)}\n </p>\n\n <div className=\"space-y-2\">\n {processingActivities.length > 0 && (\n <div className=\"text-[0.8em] text-gray-500\">\n <span className=\"font-semibold text-gray-700\">Activities:</span>{' '}\n {processingActivities.map(a => translateDynamic(a.name || a)).join(', ')}\n </div>\n )}\n {dataElements.length > 0 && (\n <CollapsibleDataSection\n title=\"Data Elements\"\n items={dataElements}\n isOpen={!!openSections.elements}\n onToggle={() => toggleSection('elements')}\n chevronLeft={true}\n />\n )}\n {settings.showProcessors !== false && dataProcessors.length > 0 && (\n <CollapsibleDataSection\n title=\"Data Processors\"\n items={dataProcessors}\n isOpen={!!openSections.processors}\n onToggle={() => toggleSection('processors')}\n chevronLeft={true}\n />\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default function CompactListUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n hasUserInteracted,\n actionLoading,\n error,\n}) {\n const settings = banner?.bannerSettings || {};\n\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const footerText = settings.footerText;\n const purposes = banner?.purposes || [];\n\n // State to track which rows are expanded (default to first purpose if present)\n const [expandedRows, setExpandedRows] = useState(\n purposes.length > 0 ? { [purposes[0].id]: true } : {}\n );\n\n const toggleRow = (id) => {\n setExpandedRows(prev => ({\n ...prev,\n [id]: !prev[id]\n }));\n };\n\n return (\n <div className=\"flex flex-col h-full w-full bg-white rounded-xl shadow-2xl overflow-hidden\">\n <div className=\"flex-shrink-0 pt-3.5 pb-2 px-4 border-b bg-gray-50\" style={{ borderColor: 'var(--banner-border)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n <div className=\"flex-1 px-4 py-3 overflow-y-auto bg-white\">\n {purposes.map((p) => (\n <CompactPurposeRow\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n isExpanded={!!expandedRows[p.id]}\n toggleExpand={() => toggleRow(p.id)}\n />\n ))}\n </div>\n\n <div className=\"flex-shrink-0 border-t px-4 py-3 bg-gray-50\" style={{ borderColor: 'var(--banner-border)' }}>\n <div className=\"mb-3\">\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n compact={true}\n />\n </div>\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n isLoading={actionLoading}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={settings.primaryColor}\n purposes={purposes}\n isBottomReached={true} // For compact list, we don't force scroll\n />\n </div>\n </div>\n );\n}\n","/**\n * templateRegistry.js\n *\n * Maps template keys (from banner_settings) to React components.\n * Replaces the if/else tree in TruConsentModal.\n */\n\nimport BannerUI from '../templates/general_consent/BannerUI';\nimport PreferencesModalUI from '../templates/general_consent/PreferencesModalUI';\nimport TabbedBannerUI from '../templates/general_consent/TabbedBannerUI';\nimport CookieBannerUI from '../templates/cookie_consent/CookieBannerUI';\nimport NoticeOnlyBanner from '../templates/notice_only/NoticeOnlyBanner';\nimport InlineSingleRowUI from '../templates/general_consent/InlineSingleRowUI';\nimport CompactListUI from '../templates/general_consent/CompactListUI';\nimport SplitPaneUI from '../templates/general_consent/SplitPaneUI';\n\nconst registry = {\n center_modal: BannerUI,\n tabbed_banner: TabbedBannerUI,\n preferences_modal: PreferencesModalUI,\n floating_card: CookieBannerUI,\n notice_only: NoticeOnlyBanner,\n inline_single_row: InlineSingleRowUI,\n general_compact_list: CompactListUI,\n general_split_pane: SplitPaneUI,\n};\n\n/**\n * Get the template component for a given key.\n * Falls back to BannerUI if the key is not recognized.\n *\n * @param {string} key - Template key from banner_settings\n * @returns {React.Component} Template component\n */\nexport const getTemplate = (key) => registry[key] || registry['center_modal'];\n\n/**\n * Check if a given key is a registered template.\n *\n * @param {string} key\n * @returns {boolean}\n */\nexport const isRegistered = (key) => key in registry;\n","import React, { useState, useRef, useEffect } from 'react';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\nexport default function BannerUI({ banner, companyName, logoUrl, onChangePurpose, onRejectAll, onConsentAll, onAcceptSelected, onAcceptMandatory, hasUserInteracted, primaryColor, secondaryColor }) {\n const translate = useTranslate();\n const [isBottomReached, setIsBottomReached] = useState(false);\n const scrollRef = useRef(null);\n\n // Use bannerSettings from API if available, otherwise fall back to props\n const settings = banner?.bannerSettings || {};\n const finalPrimaryColor = settings.primaryColor || primaryColor || '#3b82f6';\n const finalSecondaryColor = settings.secondaryColor || secondaryColor || '#555';\n const footerText = settings.footerText;\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const actionButtonText = settings.actionButtonText;\n\n const handleScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n // 5px threshold for \"bottom\"\n if (scrollHeight - scrollTop <= clientHeight + 5) {\n setIsBottomReached(true);\n }\n };\n\n // Check if content is already visible without scrolling\n useEffect(() => {\n if (scrollRef.current) {\n const { scrollHeight, clientHeight } = scrollRef.current;\n if (scrollHeight <= clientHeight) {\n setIsBottomReached(true);\n } else {\n setIsBottomReached(false);\n }\n }\n }, [banner?.purposes]);\n\n const styleVars = {\n '--font-type': settings.fontType,\n '--font-size': settings.fontSize,\n '--banner-primary-color': finalPrimaryColor,\n '--banner-secondary-color': finalSecondaryColor,\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n return (\n <div className=\"rounded-2xl flex flex-col overflow-hidden text-left h-full border\" style={{ ...styleVars, backgroundColor: 'var(--banner-bg)', color: 'var(--banner-text)', borderColor: 'var(--banner-border)' }}>\n <div className=\"flex-shrink-0 pt-3.5 pb-2 px-3 border-b flex flex-col gap-2\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 px-5 py-2.5 space-y-2.5 overflow-y-auto\"\n style={{ backgroundColor: 'var(--banner-bg)' }}\n >\n {banner?.purposes?.map((p) => (\n <ModernPurposeCard\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={onChangePurpose}\n />\n ))}\n\n {banner?.purposes?.some(p => p.consented === 'declined' || p.consented === false) && settings.warningMessage && (\n <div className=\"py-2 px-3 border rounded-lg flex items-start gap-2.5 animate-in fade-in slide-in-from-top-1 duration-200\"\n style={{ backgroundColor: 'var(--banner-warning-bg)', borderColor: 'var(--banner-warning-border)' }}>\n <svg\n className=\"mt-0.5 flex-shrink-0 opacity-70\"\n width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\"\n style={{ color: 'var(--banner-warning-text)' }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <p className=\"text-[0.75em] leading-normal font-medium\" style={{ color: 'var(--banner-warning-text)' }}>\n {translate(settings.warningMessage)}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"flex-shrink-0 border-t px-4 py-1.5\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n />\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={banner?.purposes || []}\n actionButtonText={actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={finalPrimaryColor}\n isBottomReached={isBottomReached}\n hasUserInteracted={hasUserInteracted}\n isSplitLayout={banner?.bannerSettings?.generalNoticeTemplate === 'preferences_modal'}\n />\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\nfunction PreferencesModalUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n settings\n}) {\n const translate = useTranslate();\n const bannerSettings = banner?.bannerSettings || settings || {};\n const finalPrimaryColor = bannerSettings.primaryColor || '#3b82f6';\n\n const styleVars = {\n '--preferences-primary-color': finalPrimaryColor,\n fontFamily: bannerSettings.fontType || 'inherit',\n fontSize: bannerSettings.fontSize || 'inherit',\n };\n\n const orgName = companyName || 'TruConsent';\n const purposes = banner?.purposes || [];\n\n return (\n <div className=\"preferences-modal-content\" style={styleVars}>\n <div className=\"preferences-header block w-full relative\">\n <ModernBannerHeader\n logoUrl={logoUrl || bannerSettings.logoUrl}\n orgName={orgName}\n bannerTitle={bannerSettings.bannerTitle || 'Cookie Preferences'}\n disclaimerText={bannerSettings.disclaimerText || 'We use cookies to enhance your browsing experience and analyze our traffic. Please choose which types of cookies you want to allow.'}\n />\n </div>\n\n <div className=\"preferences-purpose-list scrollbar-thin scrollbar-thumb-gray-200 mt-2\">\n {purposes.map((purpose) => (\n <div key={purpose.id} className=\"preferences-purpose-card-wrapper mb-3\">\n <ModernPurposeCard\n purpose={purpose}\n banner={banner}\n onToggle={onChangePurpose}\n />\n </div>\n ))}\n </div>\n\n <div className=\"preferences-footer-container\">\n {bannerSettings.footerText && (\n <div className=\"preferences-footer-text\">\n <ModernBannerFooter\n footerText={bannerSettings.footerText}\n orgName={companyName}\n compact={true}\n />\n </div>\n )}\n <div className=\"preferences-actions\">\n <button\n type=\"button\"\n className=\"preferences-btn preferences-btn-essential\"\n onClick={onAcceptMandatory}\n >\n {translate(bannerSettings.onlyNecessaryText || 'Only Necessary')}\n </button>\n <div className=\"preferences-actions-right\">\n <button\n type=\"button\"\n className=\"preferences-btn preferences-btn-save\"\n style={{ color: finalPrimaryColor, border: '1px solid var(--banner-border)' }}\n onClick={onAcceptSelected}\n >\n {translate(bannerSettings.savePreferencesText || 'Save My Preferences')}\n </button>\n <button\n type=\"button\"\n className=\"preferences-btn preferences-btn-accept\"\n style={{ backgroundColor: '#10b981', color: 'white' }}\n onClick={onConsentAll}\n >\n {translate(bannerSettings.actionButtonText || bannerSettings.acceptAllText || 'Accept All')}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default PreferencesModalUI;\n","import React, { useMemo } from 'react';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\n/**\n * CookieBannerUI\n *\n * Simplified summary-first cookie consent UI.\n * Actions (Accept All, Reject All, Personalize) are delegated to the parent.\n */\nexport default function CookieBannerUI({\n banner,\n companyName,\n logoUrl,\n onConsentAll,\n onAcceptMandatory,\n onPersonalize,\n primaryColor,\n secondaryColor,\n layoutClass,\n footerText,\n}) {\n const translate = useTranslate();\n const processPlaceholder = (text) => translate(text || '').replace(/\\[[^\\]()]+\\](?!\\()/g, companyName || '').replace(/\\{\\{companyName\\}\\}/g, companyName || '');\n\n /**\n * Simple markdown link converter for [text](url)\n */\n const convertMarkdownLinks = (text) => {\n const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n return text.replace(markdownLinkRegex, (match, linkText, url) => {\n let fullUrl = url.trim();\n if (!fullUrl.match(/^[a-zA-Z]+:\\/\\//)) {\n fullUrl = `https://${fullUrl}`;\n }\n return `<a href=\"${fullUrl}\" class=\"mcm-link\" target=\"_blank\" rel=\"noopener noreferrer\">${linkText}</a>`;\n });\n };\n\n const styleVars = {\n '--banner-primary-color': primaryColor || '#16a34a',\n '--banner-secondary-color': secondaryColor || '#0f172a',\n };\n\n // Build the dynamic footer content\n const dynamicFooter = useMemo(() => {\n if (!footerText) return null;\n const processed = processPlaceholder(footerText);\n const withLinks = convertMarkdownLinks(processed);\n\n return (\n <div\n className=\"mcm-cookie-summary-footer-links dynamic\"\n dangerouslySetInnerHTML={{ __html: withLinks }}\n />\n );\n }, [footerText, companyName]);\n\n return (\n <div className={`mcm-cookie-banner-ui ${layoutClass}`} style={styleVars}>\n <div className={`mcm-cookie-summary ${layoutClass}`}>\n <div className=\"mcm-cookie-summary-content\">\n <h2 className=\"mcm-cookie-summary-title\">\n {processPlaceholder(banner?.banner_settings?.banner_title || 'Cookie Consent')}\n </h2>\n <p className=\"mcm-cookie-summary-text\">\n {processPlaceholder(banner?.banner_settings?.disclaimer_text || 'We use cookies to improve your experience on our site.')}\n </p>\n </div>\n\n {layoutClass === 'floating-card' && <hr />}\n\n <div className=\"mcm-cookie-summary-actions\">\n <button\n type=\"button\"\n className=\"mcm-summary-btn primary\"\n style={{ backgroundColor: styleVars['--banner-primary-color'] }}\n onClick={onConsentAll}\n >\n {translate('Accept All')}\n </button>\n <button\n type=\"button\"\n className=\"mcm-summary-btn secondary\"\n onClick={onAcceptMandatory}\n >\n {translate('Accept Only Necessary')}\n </button>\n <button\n type=\"button\"\n className=\"mcm-summary-btn text\"\n onClick={onPersonalize}\n >\n {translate('Personalize Cookies')}\n </button>\n </div>\n\n {layoutClass === 'floating-card' && <hr />}\n\n {dynamicFooter}\n\n <div className={`mcm-powered-by ${layoutClass === 'bottom-bar' ? 'vertical' : ''}`}>\n Powered by <span className=\"mcm-brand\">truConsent</span>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernPurposeCard from '../shared/ModernPurposeCard';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport { useTranslate } from '../../runtime/TranslationContext';\n\n/**\n * NoticeOnlyBanner\n *\n * Informational banner for collections that have ONLY notice/legitimate-interest purposes.\n * - Read-only purpose list (no toggles — all show \"Always Active\")\n * - Single \"I Understand\" button → fires notice_shown → closes\n * - No Reject All, no Save Preferences\n */\nexport default function NoticeOnlyBanner({\n banner,\n companyName,\n logoUrl,\n onAcknowledge,\n actionLoading,\n}) {\n const translate = useTranslate();\n const settings = banner?.bannerSettings || {};\n const primaryColor = settings.primaryColor || '#3b82f6';\n const footerText = settings.footerText;\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const acknowledgeText = settings.noticeAcknowledgeText || 'I Understand';\n\n const [isBottomReached, setIsBottomReached] = useState(false);\n const scrollRef = useRef(null);\n\n const handleScroll = (e) => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n if (scrollHeight - scrollTop <= clientHeight + 5) {\n setIsBottomReached(true);\n }\n };\n\n useEffect(() => {\n if (scrollRef.current) {\n const { scrollHeight, clientHeight } = scrollRef.current;\n if (scrollHeight <= clientHeight) {\n setIsBottomReached(true);\n }\n }\n }, [banner?.purposes]);\n\n const styleVars = {\n '--font-type': settings.fontType,\n '--font-size': settings.fontSize,\n '--banner-primary-color': primaryColor,\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n return (\n <div\n className=\"rounded-2xl flex flex-col overflow-hidden text-left h-full border\"\n style={{\n ...styleVars,\n backgroundColor: 'var(--banner-bg)',\n color: 'var(--banner-text)',\n borderColor: 'var(--banner-border)',\n }}\n >\n {/* Header */}\n <div\n className=\"flex-shrink-0 pt-3.5 pb-2 px-3 border-b flex flex-col gap-2\"\n style={{\n borderColor: 'var(--banner-border)',\n backgroundColor: 'var(--banner-hover-bg)',\n }}\n >\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logo_url}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n {/* Purpose Cards — all read-only */}\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"flex-1 px-5 py-2.5 space-y-2.5 overflow-y-auto\"\n style={{ backgroundColor: 'var(--banner-bg)' }}\n >\n {banner?.purposes?.map((p) => (\n <ModernPurposeCard\n key={p.id}\n purpose={p}\n banner={banner}\n onToggle={() => { }} // No-op: notice purposes are read-only\n mandatoryLabel={translate('Always Active')}\n />\n ))}\n </div>\n\n {/* Footer + Single Action */}\n <div\n className=\"flex-shrink-0 border-t px-4 py-2.5\"\n style={{\n borderColor: 'var(--banner-border)',\n backgroundColor: 'var(--banner-hover-bg)',\n }}\n >\n {footerText && (\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n />\n )}\n\n <div className=\"flex justify-center mt-2\">\n <button\n type=\"button\"\n className=\"px-8 py-2.5 rounded-lg font-semibold text-white text-sm transition-all duration-200 hover:opacity-90 disabled:opacity-50\"\n style={{ backgroundColor: primaryColor }}\n onClick={onAcknowledge}\n disabled={actionLoading}\n >\n {actionLoading ? translate('Processing...') : translate(acknowledgeText)}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n","import React, { useState } from 'react';\nimport { useTranslate } from '../../runtime/TranslationContext';\nimport ModernBannerHeader from '../shared/ModernBannerHeader';\nimport ModernBannerFooter from '../shared/ModernBannerFooter';\nimport ModernBannerActions from '../shared/ModernBannerActions';\n\nexport default function SplitPaneUI({\n banner,\n companyName,\n logoUrl,\n onChangePurpose,\n onRejectAll,\n onConsentAll,\n onAcceptSelected,\n onAcceptMandatory,\n hasUserInteracted,\n actionLoading,\n primaryColor,\n secondaryColor\n}) {\n const settings = banner?.bannerSettings || {};\n const purposes = banner?.purposes || [];\n\n const bannerTitle = settings.bannerTitle;\n const disclaimerText = settings.disclaimerText;\n const footerText = settings.footerText;\n const finalPrimaryColor = settings.primaryColor || primaryColor || '#3b82f6';\n const mandatoryLabel = settings.mandatoryLabel || 'Necessary';\n\n const translateDynamic = useTranslate();\n const [selectedPurposeId, setSelectedPurposeId] = useState(purposes.length > 0 ? purposes[0].id : null);\n\n const activePurpose = purposes.find(p => p.id === selectedPurposeId) || purposes[0];\n\n return (\n <div\n className=\"flex flex-col mx-auto bg-white rounded-xl shadow-2xl overflow-hidden text-left\"\n style={{\n height: '85vh',\n width: '100%',\n border: '1px solid var(--banner-border)',\n backgroundColor: 'var(--banner-bg)',\n color: 'var(--banner-text)'\n }}\n >\n {/* Header - Removing extra padding/margins */}\n <div className=\"flex-shrink-0 pt-3 px-4 border-b flex flex-col\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerHeader\n logoUrl={logoUrl || settings.logoUrl}\n orgName={companyName}\n bannerTitle={bannerTitle}\n disclaimerText={disclaimerText}\n />\n </div>\n\n {/* Split Content Area */}\n <div className=\"flex flex-1 overflow-hidden min-h-0\">\n\n {/* Left Side: Purpose List */}\n <div className=\"w-1/3 border-r overflow-y-auto\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-bg)' }}>\n {purposes.map((p) => {\n const isMandatory = p.isMandatory;\n const isAccepted = p.consented === 'accepted' || p.consented === true;\n const isSelected = p.id === selectedPurposeId;\n\n return (\n <div\n key={p.id}\n onClick={() => setSelectedPurposeId(p.id)}\n className={`p-4 border-b cursor-pointer transition-colors ${isSelected ? 'bg-[var(--banner-hover-bg)]' : 'hover:bg-[var(--banner-hover-bg)]/50'}`}\n style={{ borderColor: 'var(--banner-border)' }}\n >\n <div className=\"flex items-center justify-between mb-1\">\n <div className=\"flex flex-col flex-1 min-w-0\">\n <h3 className={`font-bold text-[0.95em] truncate ${isSelected ? 'text-[var(--banner-primary-color)]' : ''}`}>\n {translateDynamic(p.name)}\n </h3>\n {p.expiryPeriod && (\n <span className=\"text-[0.7em] text-[var(--banner-text-muted)] italic font-normal\">\n Expires in {translateDynamic(p.expiryPeriod)}\n </span>\n )}\n </div>\n <div onClick={(e) => e.stopPropagation()} className=\"shrink-0 ml-2\">\n {isMandatory ? (\n <span className=\"text-[0.65em] uppercase font-extrabold px-2 py-0.5 rounded-md tracking-wider border\"\n style={{ backgroundColor: 'var(--banner-danger-bg)', color: 'var(--banner-danger-text)', borderColor: 'var(--banner-danger-text)' }}>\n {mandatoryLabel}\n </span>\n ) : (\n <label className=\"switch scale-75 origin-right\">\n <input\n type=\"checkbox\"\n checked={isAccepted}\n onChange={(e) => onChangePurpose(p.id, e.target.checked ? 'accepted' : 'declined')}\n />\n <span className=\"track\" />\n <span className=\"thumb\" />\n </label>\n )}\n </div>\n </div>\n <p className=\"text-[0.8em] text-[var(--banner-text-muted)] line-clamp-2 leading-tight\">\n {translateDynamic(p.description)}\n </p>\n </div>\n );\n })}\n </div>\n\n {/* Right Side: Detail View */}\n <div className=\"flex-1 overflow-y-auto p-6 bg-white\" style={{ backgroundColor: 'var(--banner-bg)' }}>\n {activePurpose ? (\n <div className=\"space-y-6\">\n <div>\n <h2 className=\"text-xl font-bold mb-3\" style={{ color: 'var(--banner-text)' }}>\n {translateDynamic(activePurpose.name)}\n </h2>\n <p className=\"text-[0.95em] leading-relaxed\" style={{ color: 'var(--banner-text-muted)' }}>\n {translateDynamic(activePurpose.description)}\n </p>\n </div>\n\n {/* Processing Activities */}\n {activePurpose.processingActivities?.length > 0 && (\n <div className=\"border-t pt-6\" style={{ borderColor: 'var(--banner-border)' }}>\n <h4 className=\"text-[0.85em] font-bold mb-2 uppercase tracking-wide\" style={{ color: 'var(--banner-text)' }}>\n Processing Activities\n </h4>\n <div className=\"flex flex-wrap gap-1.5\">\n {activePurpose.processingActivities.map((a, idx) => (\n <span key={idx} className=\"px-2.5 py-1 rounded-full text-[0.75em] font-medium border\"\n style={{ backgroundColor: 'var(--banner-btn-secondary-bg)', color: 'var(--banner-text-muted)', borderColor: 'var(--banner-btn-secondary-border)' }}>\n {translateDynamic(a.name || a)}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Data Elements (Direct List) */}\n {activePurpose.dataElements?.length > 0 && (\n <div className=\"border-t pt-6\" style={{ borderColor: 'var(--banner-border)' }}>\n <h4 className=\"text-[0.85em] font-bold mb-2 uppercase tracking-wide\" style={{ color: 'var(--banner-text)' }}>\n Data Elements ({activePurpose.dataElements.length})\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n {activePurpose.dataElements.map((item, idx) => (\n <span key={idx} className=\"px-3 py-1 rounded-full text-[0.8em] border\"\n style={{ backgroundColor: 'var(--banner-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item)}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Data Processors (Direct List) */}\n {settings.showProcessors !== false && (activePurpose.legalEntities?.length > 0 || activePurpose.tools?.length > 0) && (\n <div className=\"border-t pt-6\" style={{ borderColor: 'var(--banner-border)' }}>\n <h4 className=\"text-[0.85em] font-bold mb-2 uppercase tracking-wide\" style={{ color: 'var(--banner-text)' }}>\n Data Processors ({[...(activePurpose.legalEntities || []), ...(activePurpose.tools || [])].length})\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n {[...(activePurpose.legalEntities || []), ...(activePurpose.tools || [])].map((item, idx) => (\n <span key={idx} className=\"px-3 py-1 rounded-full text-[0.8em] border\"\n style={{ backgroundColor: 'var(--banner-bg)', borderColor: 'var(--banner-border)', color: 'var(--banner-text-muted)' }}>\n {translateDynamic(item.name || item)}\n </span>\n ))}\n </div>\n </div>\n )}\n\n </div>\n ) : (\n <div className=\"h-full flex items-center justify-center text-[var(--banner-text-muted)] italic\">\n Select a purpose from the left to view details\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex-shrink-0 border-t px-4 py-2\" style={{ borderColor: 'var(--banner-border)', backgroundColor: 'var(--banner-hover-bg)' }}>\n <ModernBannerFooter\n footerText={footerText}\n orgName={companyName}\n />\n <ModernBannerActions\n onRejectAll={onRejectAll}\n onConsentAll={onConsentAll}\n onAcceptSelected={onAcceptSelected}\n onAcceptMandatory={onAcceptMandatory}\n purposes={purposes}\n isLoading={actionLoading}\n actionButtonText={settings.actionButtonText}\n rejectAllText={settings.rejectAllText}\n rejectAllColor={settings.rejectAllColor}\n acceptAllText={settings.acceptAllText}\n onlyNecessaryText={settings.onlyNecessaryText}\n onlyNecessaryColor={settings.onlyNecessaryColor}\n savePreferencesColor={settings.savePreferencesColor}\n primaryColor={finalPrimaryColor}\n isBottomReached={true}\n isSplitLayout={true}\n showAcceptAll={true}\n hasUserInteracted={hasUserInteracted}\n />\n </div>\n </div>\n );\n}\n","/**\n * useConsentEngine.js\n *\n * Custom React hook that extracts all consent logic from TruConsentModal\n * into a reusable, testable unit.\n *\n * Manages: purpose normalization, dynamic filtering, action handlers,\n * event logging (with notice_shown separation), and H-Case intercept.\n */\n\nimport { useState, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { normalizePurposes, filterDynamicPurposes } from './purposeAdapter';\nimport { deriveUIState } from './bannerState';\n\n/** Generate a simple session ID for metadata tracking */\nfunction generateSessionId() {\n return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * @param {object} options\n * @param {object} options.bannerData - Raw banner data from API\n * @param {string} options.apiUrl - Full API base (e.g. https://api.truconsent.com)\n * @param {string} options.apiBaseUrl - Short base URL override\n * @param {string} options.apiKey - API key (mutually exclusive with token for auth)\n * @param {string} options.token - JWT token\n * @param {string} options.effectiveOrgId - Resolved organization ID\n * @param {string} options.userId - User/device ID\n * @param {string} options.assetId - Asset ID (required for API key, optional for JWT)\n * @param {function} options.onSubmit - Optional custom submission handler\n * @param {Array} options.previousConsent - Previous consent records for dynamic filtering\n * @param {number} options.bannerFetchAt - Absolute timestamp when banner fetch completed\n * @returns {object} Consent engine interface\n */\nconst EMPTY_ARRAY = [];\n\nexport default function useConsentEngine({\n bannerData,\n apiUrl,\n apiBaseUrl,\n apiKey,\n token,\n effectiveOrgId,\n userId,\n assetId,\n onSubmit,\n previousConsent = EMPTY_ARRAY,\n bannerFetchAt = null,\n bannerFetchStart = null,\n extraMetadata = {},\n}) {\n // --- Performance Tracking ---\n const [bannerDisplayAt, setBannerDisplayAt] = useState(null);\n\n // Capture display time when bannerData becomes available\n useEffect(() => {\n if (bannerData && !bannerDisplayAt) {\n setBannerDisplayAt(Date.now());\n if (bannerFetchStart) {\n const displayMs = (performance.now() - bannerFetchStart).toFixed(1);\n console.log(`[TruConsent] Banner displayed after ${displayMs}ms`);\n }\n }\n }, [bannerData, bannerDisplayAt, bannerFetchStart]);\n\n // --- Request ID & Session ID (stable for this banner render) ---\n const [requestId] = useState(() => crypto.randomUUID());\n const [sessionId] = useState(() => generateSessionId());\n\n // --- Refs for action gating ---\n const actionTakenRef = useRef(false);\n const actionRunningRef = useRef(false);\n const noticeLoggedAtRef = useRef(null);\n\n // --- Loading / error state ---\n const [actionLoading, setActionLoading] = useState(false);\n const [error, setError] = useState('');\n\n // --- H-Case state ---\n const [hCaseData, setHCaseData] = useState({ show: false, action: null, intendedPurposes: null });\n\n // --- User interaction tracking ---\n const [hasUserInteracted, setHasUserInteracted] = useState(false);\n\n // --- Normalize & filter purposes ---\n const defaultSelection = bannerData?.bannerSettings?.defaultSelection || 'mandatory_only';\n\n const initialPurposes = useMemo(() => {\n const normalized = normalizePurposes(bannerData?.purposes, defaultSelection);\n return filterDynamicPurposes(normalized, previousConsent);\n }, [bannerData?.purposes, defaultSelection, previousConsent]);\n\n const [purposes, setPurposes] = useState(initialPurposes);\n\n // *** FIX: Sync purposes when bannerData loads after initial render ***\n useEffect(() => {\n if (initialPurposes.length > 0) {\n setPurposes(initialPurposes);\n }\n }, [initialPurposes]);\n\n // --- UI State ---\n const uiState = useMemo(() => deriveUIState(purposes), [purposes]);\n\n // --- Build auth headers ---\n const buildHeaders = useCallback(() => {\n const headers = {\n 'Content-Type': 'application/json',\n 'X-Org-Id': effectiveOrgId,\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n } else if (apiKey) {\n headers['X-API-Key'] = apiKey;\n }\n return headers;\n }, [token, apiKey, effectiveOrgId]);\n\n // --- Send notice_shown for notice purposes ---\n const sendNoticeShown = useCallback(async (metadata = {}) => {\n if (uiState.noticePurposes.length === 0) return;\n\n try {\n const formattedNoticePurposes = uiState.noticePurposes.map(p => ({\n purposeId: p.id,\n version: p.version || 'v1.0',\n consented: 'shown',\n purpose_type: 'legitimate_interest',\n is_mandatory: !!(p.is_mandatory || p.isMandatory),\n }));\n\n const collectionPointVersion = bannerData?.version || 'v1.0';\n\n const noticeMetadata = {\n sessionId,\n ...metadata,\n event_type: 'notice_shown',\n performance: {\n banner_fetched_at: bannerFetchAt,\n banner_displayed_at: bannerDisplayAt,\n }\n };\n\n const payload = {\n userId,\n requestId,\n assetId: assetId || undefined,\n consentLanguage: 'en',\n collectionPointId: bannerData?.collectionPoint,\n collectionPointVersion,\n consentTimestamp: Date.now(),\n source: 'npm',\n purposes: formattedNoticePurposes,\n action: 'notice_shown',\n metadata: noticeMetadata,\n };\n\n if (onSubmit) {\n await onSubmit(payload);\n } else {\n const requestUrl = apiUrl\n ? `${apiUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`\n : `${apiBaseUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`;\n\n const res = await fetch(requestUrl, {\n method: 'POST',\n headers: buildHeaders(),\n keepalive: true,\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n console.warn(`[TruConsent] notice_shown log failed with status ${res.status}`);\n }\n }\n // Mark when notice logging completed\n noticeLoggedAtRef.current = Date.now();\n } catch (e) {\n console.error('Failed to log notice_shown:', e);\n }\n }, [uiState.noticePurposes, userId, requestId, assetId, onSubmit, apiUrl, apiBaseUrl, bannerData, buildHeaders, bannerFetchAt, bannerDisplayAt, sessionId]);\n\n // notice_shown is logged only when the user explicitly clicks a button (acknowledgeNotice / i_understand)\n\n const sendSuppressionUpdate = useCallback((purposePayload) => {\n if (onSubmit) return; // custom submit handler — skip suppression call\n const declinedIds = (purposePayload || purposes)\n .filter(p => p.consented === 'declined' || p.consented === false)\n .map(p => p.id)\n .filter(Boolean);\n if (!declinedIds.length || !userId) return;\n\n const baseUrl = apiUrl || apiBaseUrl;\n const suppressionUrl = `${baseUrl}/api/v1/internal/consent/suppression`;\n fetch(suppressionUrl, {\n method: 'POST',\n headers: buildHeaders(),\n keepalive: true,\n body: JSON.stringify({ userId, declinedPurposeIds: declinedIds }),\n }).catch(e => console.warn('[TruConsent] suppression update failed:', e));\n }, [purposes, userId, onSubmit, apiUrl, apiBaseUrl, buildHeaders]);\n\n const sendLogEvent = useCallback(async (action, purposePayload, metadata) => {\n if (!bannerData || actionRunningRef.current) return;\n\n if (action !== 'no_action') {\n actionTakenRef.current = true;\n }\n\n actionRunningRef.current = true;\n try {\n // Build purposes in the required format: purposeId, version, consented\n const rawPurposes = purposePayload || purposes;\n const formattedPurposes = rawPurposes.map(p => {\n const isLegitimate = p.legalBasis === 'notice' || p.isLegitimate || p.is_legitimate;\n \n // For legitimate interest, the status should be 'shown' regardless of UI 'accepted' state\n const consentedStatus = isLegitimate ? 'shown' : (p.consented === true ? 'accepted' : p.consented === false ? 'declined' : (p.consented || 'declined'));\n \n return {\n purposeId: p.id,\n version: p.version || 'v1.0',\n consented: consentedStatus,\n purpose_type: p.purpose_type || (isLegitimate ? 'legitimate_interest' : 'consent'),\n is_mandatory: !!(p.is_mandatory || p.isMandatory)\n };\n });\n\n const collectionPointVersion = bannerData?.version || 'v1.0';\n\n const payload = {\n userId,\n requestId,\n assetId: assetId || undefined,\n consentLanguage: 'en',\n collectionPointId: bannerData?.collectionPoint,\n collectionPointVersion,\n consentTimestamp: Date.now(),\n source: 'npm',\n purposes: formattedPurposes,\n action,\n metadata: {\n sessionId,\n ...extraMetadata,\n ...metadata,\n collection_point_version: collectionPointVersion,\n performance: {\n banner_fetched_at: bannerFetchAt,\n banner_displayed_at: bannerDisplayAt,\n user_interaction_at: Date.now(),\n notice_logged_at: noticeLoggedAtRef.current,\n }\n },\n };\n\n if (onSubmit) {\n await onSubmit(payload);\n } else {\n // Step 1: Record consent log\n const requestUrl = apiUrl\n ? `${apiUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`\n : `${apiBaseUrl}/api/v1/internal/consent/${bannerData.collectionPoint}`;\n\n const res = await fetch(requestUrl, {\n method: 'POST',\n headers: buildHeaders(),\n keepalive: true,\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n if (res.status === 401) throw new Error('Unauthorized - Invalid API key');\n if (res.status === 403) throw new Error('Forbidden - Your origin or API key scope is not allowed to record consent');\n if (res.status === 429) throw new Error('Rate limit exceeded - Please try again later');\n throw new Error('Failed to record consent event');\n }\n\n // Step 2: Update suppression tracking (fire-and-forget, does not block)\n sendSuppressionUpdate(rawPurposes);\n }\n } catch (e) {\n console.error('Failed to log consent event:', e);\n throw e;\n } finally {\n actionRunningRef.current = false;\n }\n }, [bannerData, userId, purposes, requestId, assetId, onSubmit, apiUrl, apiBaseUrl, buildHeaders, bannerFetchAt, bannerDisplayAt, sessionId, sendSuppressionUpdate]);\n\n // --- Toggle a single purpose ---\n const togglePurpose = useCallback((purposeId, newStatus) => {\n setHasUserInteracted(true);\n setPurposes(prev =>\n prev.map(p => p.id === purposeId ? { ...p, consented: newStatus } : p)\n );\n }, []);\n\n // --- H-Case intercept check ---\n // Only triggers when a MANDATORY consent purpose is NOT accepted\n const checkHCaseIntercept = useCallback((action, customPurposes = null) => {\n const targetPurposes = customPurposes || purposes;\n const hasDeclinedMandatory = targetPurposes.some(\n p => p.isMandatory && p.legalBasis === 'consent' &&\n (p.consented === 'declined' || p.consented === false)\n );\n\n if (hasDeclinedMandatory && !hCaseData.show) {\n setHCaseData({ show: true, action, intendedPurposes: targetPurposes });\n return true; // intercepted\n }\n return false;\n }, [purposes, hCaseData.show]);\n\n // =====================================================================\n // ACTION HANDLERS\n // =====================================================================\n\n /** Accept All: Approved for all purposes */\n const acceptAll = useCallback(async (metadata = {}) => {\n setActionLoading(true);\n setError('');\n try {\n const acceptedPurposes = purposes.map(p => ({\n ...p,\n consented: 'accepted',\n }));\n\n const enhancedMetadata = { ...metadata, button_used: 'accept_all' };\n await sendLogEvent('Approved', acceptedPurposes, enhancedMetadata);\n return 'Approved';\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n }\n }, [purposes, sendLogEvent]);\n\n /** Reject All: Declined for all purposes */\n const rejectAll = useCallback(async (metadata = {}) => {\n const declinedPurposes = purposes.map(p => ({\n ...p,\n consented: 'declined',\n }));\n\n // Intercept if mandatory consent is being declined\n if (checkHCaseIntercept('Declined', declinedPurposes)) return null;\n\n setActionLoading(true);\n setError('');\n try {\n const enhancedMetadata = { ...metadata, button_used: 'reject_all' };\n await sendLogEvent('Declined', declinedPurposes, enhancedMetadata);\n return 'Declined';\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n }\n }, [purposes, checkHCaseIntercept, sendLogEvent]);\n\n /** Only Necessary: accept mandatory, decline optional */\n const onlyNecessary = useCallback(async (metadata = {}) => {\n setActionLoading(true);\n setError('');\n try {\n // Construct payload: mandatory accepted, optional declined\n const mandatoryPurposes = purposes.map(p => ({\n ...p,\n consented: p.isMandatory ? 'accepted' : 'declined',\n }));\n\n const enhancedMetadata = { ...metadata, button_used: 'only_necessary' };\n\n // If there are optional purposes, it's partial; otherwise approved\n const hasOptional = purposes.some(p => !p.isMandatory && p.legalBasis === 'consent');\n const action = hasOptional ? 'Partially Consented' : 'Approved';\n\n await sendLogEvent(action, mandatoryPurposes, enhancedMetadata);\n return action;\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n }\n }, [purposes, sendLogEvent]);\n\n /** Save Preferences / I Consent */\n const savePreferences = useCallback(async (metadata = {}) => {\n // Intercept if mandatory consent is not accepted\n const hasDeclinedMandatory = purposes.some(\n p => p.isMandatory && p.legalBasis === 'consent' &&\n (p.consented === 'declined' || p.consented === false)\n );\n if (hasDeclinedMandatory && checkHCaseIntercept('Partially Consented')) return null;\n\n setActionLoading(true);\n setError('');\n try {\n const enhancedMetadata = {\n button_used: 'save_preferences',\n ...metadata,\n };\n\n const consentPurposes = purposes.filter(p => p.legalBasis === 'consent');\n const totalCount = consentPurposes.length;\n const acceptedCount = consentPurposes.filter(p => p.consented === 'accepted' || p.consented === true).length;\n \n let action;\n if (totalCount > 0) {\n if (acceptedCount === 0) {\n action = 'Declined';\n } else if (acceptedCount === totalCount) {\n action = 'Approved';\n } else {\n action = 'Partially Consented';\n }\n } else {\n action = 'Approved'; // No consent-based purposes to decline\n }\n\n await sendLogEvent(action, purposes, enhancedMetadata);\n return action;\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n }\n }, [purposes, checkHCaseIntercept, sendLogEvent]);\n\n /** Close Banner: No Action */\n const closeBanner = useCallback(async () => {\n if (!actionTakenRef.current) {\n // Force all consent purposes to declined, legitimate interest stays shown\n const noActionPurposes = purposes.map(p => {\n const isLegitimate = p.legalBasis === 'notice' || p.isLegitimate || p.is_legitimate;\n return { ...p, consented: isLegitimate ? 'shown' : 'declined' };\n });\n await sendLogEvent('No Action', noActionPurposes, { button_used: 'close' });\n actionTakenRef.current = true;\n }\n return 'No Action';\n }, [purposes, sendLogEvent]);\n\n /** Notice-only: I Understand — fires notice_shown only */\n const acknowledgeNotice = useCallback(async (metadata = {}) => {\n setActionLoading(true);\n setError('');\n try {\n await sendNoticeShown({ ...metadata, button_used: 'i_understand' });\n actionTakenRef.current = true;\n return 'notice_shown';\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n }\n }, [sendNoticeShown]);\n\n // =====================================================================\n // H-CASE POPUP HANDLERS\n // =====================================================================\n\n /**\n * Proceed / OK button in H-Case popup.\n * - Allow Override (soft_first): \"Proceed Anyway\" → Partially Consented\n * - Enforce Acknowledgment (hard_immediate): \"OK\" → Partially Consented\n * Both strategies submit Partially Consented.\n */\n const handleHCaseProceed = useCallback(async () => {\n setActionLoading(true);\n setError('');\n try {\n const metadata = {\n h_case_warning_shown: true,\n h_case_acknowledged: true,\n button_used: 'h_case_proceed',\n };\n\n const finalAction = hCaseData.action || 'Partially Consented';\n await sendLogEvent(finalAction, hCaseData.intendedPurposes, metadata);\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n return finalAction;\n } catch (e) {\n setError('Something went wrong. Please try again.');\n return null;\n } finally {\n setActionLoading(false);\n }\n }, [sendLogEvent, hCaseData]);\n\n /**\n * Go Back button in H-Case popup (Allow Override mode only).\n * NO logging — just dismiss popup and return to banner.\n */\n const handleHCaseBack = useCallback(() => {\n setHCaseData({ show: false, action: null, intendedPurposes: null });\n // No logging — user goes back to the banner to change selections\n }, []);\n\n return {\n // State\n purposes,\n uiState,\n actionLoading,\n error,\n hCaseData,\n requestId,\n actionTakenRef,\n hasUserInteracted,\n\n // Actions\n actions: {\n acceptAll,\n rejectAll,\n onlyNecessary,\n savePreferences,\n closeBanner,\n togglePurpose,\n acknowledgeNotice,\n },\n\n // H-Case handlers\n hCaseActions: {\n handleHCaseProceed,\n handleHCaseBack,\n },\n\n // Internals (exposed for TruConsentModal compatibility)\n sendLogEvent,\n };\n}\n","\nimport React from 'react';\n\nexport default function HCaseWarningPopup({\n settings,\n onProceed,\n onBack,\n primaryColor\n}) {\n const strategy = settings.h_case_logging_strategy || 'soft_first';\n const isHard = strategy === 'hard_immediate';\n\n const popupMessage = settings.h_case_warning_message || 'Important: You have not provided consent for one or more required items. Please acknowledge this to continue.';\n const proceedText = settings.h_case_proceed_button_text || (isHard ? 'OK' : 'Proceed Anyway');\n const backText = settings.h_case_back_button_text || 'Go Back';\n\n return (\n <div className=\"mcm-hcase-overlay\">\n <div className=\"mcm-hcase-container\">\n <div className=\"mcm-hcase-icon\">\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#f59e0b\" strokeWidth=\"2\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n </div>\n <h3 className=\"mcm-hcase-title\">Consent Required</h3>\n <p className=\"mcm-hcase-message\">{popupMessage}</p>\n\n <div className=\"mcm-hcase-actions\">\n {!isHard && (\n <button\n className=\"mcm-hcase-btn back\"\n onClick={onBack}\n style={{ backgroundColor: settings.h_case_back_button_color || '#f3f4f6' }}\n >\n {backText}\n </button>\n )}\n <button\n className=\"mcm-hcase-btn proceed\"\n style={{ backgroundColor: settings.h_case_proceed_button_color || primaryColor || '#3b82f6' }}\n onClick={onProceed}\n >\n {proceedText}\n </button>\n </div>\n </div>\n <style>{`\n .mcm-hcase-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.35);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 99999;\n animation: mcmFadeIn 0.3s ease-out;\n }\n .mcm-hcase-container {\n background: white;\n border-radius: 20px;\n padding: 40px;\n max-width: 480px;\n width: 90%;\n text-align: center;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n transform: translateY(0);\n animation: mcmSlideUp 0.3s ease-out;\n }\n .mcm-hcase-icon {\n margin-bottom: 20px;\n display: flex;\n justify-content: center;\n animation: mcmPop 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .mcm-hcase-title {\n font-size: 1.5rem;\n font-weight: 800;\n color: #111827;\n margin-bottom: 16px;\n letter-spacing: -0.025em;\n }\n .mcm-hcase-message {\n font-size: 1rem;\n color: #4b5563;\n line-height: 1.6;\n margin-bottom: 32px;\n }\n .mcm-hcase-actions {\n display: flex;\n gap: 16px;\n justify-content: center;\n }\n .mcm-hcase-btn {\n padding: 12px 28px;\n border-radius: 12px;\n font-size: 1rem;\n font-weight: 700;\n border: none;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .mcm-hcase-btn:active {\n transform: scale(0.95);\n }\n .mcm-hcase-btn.back {\n background: #f3f4f6;\n color: #374151;\n }\n .mcm-hcase-btn.back:hover {\n background: #e5e7eb;\n transform: translateY(-1px);\n }\n .mcm-hcase-btn.proceed {\n color: white;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n }\n .mcm-hcase-btn.proceed:hover {\n filter: brightness(1.05);\n transform: translateY(-1px);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n @keyframes mcmFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes mcmSlideUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes mcmPop {\n from { opacity: 0; transform: scale(0.5); }\n to { opacity: 1; transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n","// TruConsentModal.jsx\nimport React, { useEffect, useState, useRef, useCallback } from 'react';\nimport * as ReactDOM from 'react-dom';\nimport '../styles/consent-modal.css';\n\nimport { normalizePurposes } from '../runtime/purposeAdapter';\nimport { TranslationProvider } from '../runtime/TranslationContext';\nimport { deriveUIState, BANNER_CASE, detectBannerCase } from '../runtime/bannerState';\nimport { getTemplate } from '../runtime/templateRegistry';\nimport useConsentEngine from '../runtime/useConsentEngine';\nimport TabbedBannerUI from '../templates/general_consent/TabbedBannerUI';\n\nimport HCaseWarningPopup from './HCaseWarningPopup';\n\n// Helper to normalize relative logo URLs\nconst normalizeUrl = (url, baseUrl) => {\n if (!url || !baseUrl) return url;\n if (url.startsWith('http') || url.startsWith('data:')) return url;\n \n const cleanBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const cleanUrl = url.startsWith('/') ? url : `/${url}`;\n \n return `${cleanBase}${cleanUrl}`;\n};\n\nexport default function TruConsentModal(props) {\n const {\n apiKey,\n organizationId,\n bannerId,\n userId,\n assetId,\n apiUrl,\n apiBaseUrl,\n theme = 'light',\n logoUrl,\n companyName = 'Mars Company',\n onClose,\n onSubmit,\n token,\n } = props;\n\n const [banner, setBanner] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [fetchError, setFetchError] = useState(null);\n const [visible, setVisible] = useState(true);\n const [selectedLanguage, setSelectedLanguage] = useState('en');\n const [showFullNotice, setShowFullNotice] = useState(false);\n const [bannerFetchAt, setBannerFetchAt] = useState(null);\n const fetchStartRef = useRef(null);\n\n // Re-consent state — auto-detected from banner API response\n const [reconsentCampaignId, setReconsentCampaignId] = useState(null);\n const [reconsentUiMode, setReconsentUiMode] = useState('full_cp');\n const [versionDiff, setVersionDiff] = useState(null);\n const [reconsentCampaignStatus, setReconsentCampaignStatus] = useState(null);\n // True when the banner is served from a dedicated re-consent CP (new_collection_point method).\n // In this case only the Re-consent tab should be shown.\n const [reconsentIsDedicatedCp, setReconsentIsDedicatedCp] = useState(false);\n // \"version_update\" (existing) or \"expiry\" (new)\n const [reconsentSource, setReconsentSource] = useState(null);\n // ID of the ExpiryReconsentRequest — sent in consent log metadata for resolution\n const [expiryReconsentRequestId, setExpiryReconsentRequestId] = useState(null);\n\n const closeButtonClickedRef = useRef(false);\n\n const effectiveOrgId = organizationId;\n\n // Resolve assetId: prop > JWT-decoded (only for JWT/consent-link flow)\n const [resolvedAssetId, setResolvedAssetId] = useState(assetId || null);\n\n // Derive company / logo from banner.organization when available\n const resolvedCompanyName =\n (banner && (banner.organizationName || (banner.organization && banner.organization.name))) ||\n companyName;\n\n const effectiveBaseUrl = apiUrl || apiBaseUrl;\n \n // Prioritize explicitly passed logoUrl prop over backend organization logo\n const resolvedLogoUrl = logoUrl || ((banner && banner.organization && banner.organization.logoUrl)\n ? normalizeUrl(banner.organization.logoUrl, effectiveBaseUrl)\n : null);\n console.log('[TruConsent] resolvedLogoUrl:', resolvedLogoUrl, { logoUrl, effectiveBaseUrl });\n\n // =====================================================================\n // FETCH BANNER DATA\n // =====================================================================\n\n\n useEffect(() => {\n if (!bannerId) {\n setIsLoading(false);\n return;\n }\n if (!userId) {\n console.warn('TruConsent: Valid userId or deviceId is highly recommended but not provided.');\n }\n if (!token && !apiKey) {\n setIsLoading(false);\n return;\n }\n if (!effectiveOrgId) {\n setIsLoading(false);\n return;\n }\n\n // Determine assetId: explicit prop or from JWT\n let effectiveAssetId = assetId || null;\n if (!effectiveAssetId && token) {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n effectiveAssetId = payload.asset_id;\n } catch (e) {\n console.warn('TruConsent: Failed to decode JWT token', e);\n }\n }\n setResolvedAssetId(effectiveAssetId);\n\n // For API key auth, assetId is required\n if (apiKey && !effectiveAssetId) {\n console.error('TruConsent: assetId is required when using API key authentication');\n setIsLoading(false);\n return;\n }\n\n // ── Unified endpoint: GET /api/v1/consent/{asset_id}/{banner_id} ──────────\n const basePath = '/api/v1/internal/consent';\n\n const buildFetchUrl = (baseUrl, path, bId, aId, uId) => {\n const effectivePath = aId ? `${path}/${aId}/${bId}` : `${path}/${bId}`;\n const url = `${baseUrl}${effectivePath}`;\n return uId ? `${url}?userId=${encodeURIComponent(uId)}` : url;\n };\n\n const fetchUrl = apiUrl\n ? buildFetchUrl(apiUrl, basePath, bannerId, effectiveAssetId, userId)\n : buildFetchUrl(apiBaseUrl, basePath, bannerId, effectiveAssetId, userId);\n\n const headers = {\n 'Content-Type': 'application/json',\n 'X-Org-Id': effectiveOrgId,\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n } else if (apiKey) {\n headers['X-API-Key'] = apiKey;\n }\n\n // ETag-based conditional fetch: send cached ETag so server can return 304\n // when banner config hasn't changed (eliminates JSON transfer + parsing).\n // Only used for non-userId fetches since user-specific data is always live.\n const etagKey = `truConsent_etag_${bannerId}`;\n const cachedEtag = !userId ? sessionStorage.getItem(etagKey) : null;\n const cachedBannerKey = `truConsent_banner_${bannerId}`;\n if (cachedEtag) {\n headers['If-None-Match'] = cachedEtag;\n }\n\n setIsLoading(true);\n fetchStartRef.current = performance.now();\n console.log('[TruConsent] Banner fetch START →', fetchUrl);\n fetch(fetchUrl, { headers })\n .then((res) => {\n if (res.status === 401) {\n throw new Error('Unauthorized - Invalid or missing API key');\n }\n if (res.status === 403) {\n throw new Error('Forbidden - This domain is not authorized to display this content');\n }\n if (res.status === 429) {\n throw new Error('Rate limit exceeded - Please try again in a moment');\n }\n // 304: banner unchanged — use sessionStorage cache\n if (res.status === 304) {\n const cached = sessionStorage.getItem(cachedBannerKey);\n if (cached) return JSON.parse(cached);\n }\n if (!res.ok) throw new Error('Service temporarily unavailable - Please try again later');\n // Store ETag and response body for future conditional requests\n const newEtag = res.headers.get('etag');\n if (newEtag && !userId) {\n sessionStorage.setItem(etagKey, newEtag);\n return res.json().then((d) => {\n sessionStorage.setItem(cachedBannerKey, JSON.stringify(d));\n return d;\n });\n }\n return res.json();\n })\n .then((data) => {\n const fetchMs = (performance.now() - fetchStartRef.current).toFixed(1);\n setBannerFetchAt(Date.now());\n console.log(`[TruConsent] Banner fetched in ${fetchMs}ms →`, fetchUrl);\n\n // Auto-detect re-consent context from banner API response\n if (data.reconsentMode) {\n setReconsentCampaignId(data.reconsentCampaignId || null);\n setReconsentUiMode(data.reconsentUiMode || 'full_cp');\n setVersionDiff(data.versionDiff || null);\n setReconsentCampaignStatus(data.reconsentCampaignStatus || null);\n setReconsentIsDedicatedCp(Boolean(data.reconsentIsDedicatedCp) || (bannerId && bannerId.endsWith('-rc')));\n setReconsentSource(data.reconsentSource || 'version_update');\n setExpiryReconsentRequestId(data.expiryReconsentRequestId || null);\n // For temp_profile: replace purposes with campaign-scoped ones\n if (data.reconsentPurposes && data.reconsentPurposes.length > 0) {\n data = { ...data, purposes: data.reconsentPurposes };\n }\n }\n\n // AUTO-HIDE if user is already fully consented (Progressive Consent)\n // Skip auto-hide when in re-consent mode — the DP must re-confirm\n if (!data.reconsentMode && (data.consentStatus === 'complete' || (!data.purposes || data.purposes.length === 0))) {\n setVisible(false);\n if (onClose) onClose('no_action');\n return;\n }\n\n // Normalize purposes using purposeAdapter\n const bs = data.bannerSettings || data.banner_settings || {};\n const defaultSelection = bs.defaultSelection || bs.default_selection || 'mandatory_only';\n const initializedPurposes = normalizePurposes(data.purposes, defaultSelection);\n\n setBanner({\n ...data,\n purposes: initializedPurposes,\n });\n })\n .catch((e) => {\n const fetchMs = fetchStartRef.current ? (performance.now() - fetchStartRef.current).toFixed(1) : 'unknown';\n console.error(`[TruConsent] Banner fetch ERROR after ${fetchMs}ms:`, e);\n \n // Improve \"Failed to fetch\" message (usually network or CORS)\n let msg = e.message || 'Failed to load banner configuration';\n if (msg === 'Failed to fetch') {\n msg = 'Unable to connect to the server. Please check your internet connection or allowed domains.';\n }\n \n setFetchError(msg);\n })\n .finally(() => setIsLoading(false));\n }, [bannerId, apiKey, effectiveOrgId, apiBaseUrl, apiUrl, assetId, token]);\n\n // =====================================================================\n // CONSENT ENGINE HOOK\n // =====================================================================\n const extraMeta = {\n ...(reconsentCampaignId ? { reconsent_campaign_id: reconsentCampaignId } : {}),\n ...(expiryReconsentRequestId ? { expiry_reconsent_request_id: expiryReconsentRequestId } : {}),\n };\n\n const engine = useConsentEngine({\n bannerData: banner,\n apiUrl,\n apiBaseUrl,\n apiKey,\n token,\n effectiveOrgId,\n userId,\n assetId: resolvedAssetId,\n onSubmit,\n bannerFetchAt,\n bannerFetchStart: fetchStartRef.current,\n extraMetadata: extraMeta,\n });\n\n const {\n purposes: enginePurposes,\n uiState,\n actionLoading,\n error,\n hCaseData,\n hasUserInteracted,\n actions,\n hCaseActions,\n } = engine;\n\n // Sync engine purposes back to banner state (for template props)\n // Normalize bannerSettings — API may return either camelCase (bannerSettings) or snake_case (banner_settings)\n const rawBannerSettings = banner?.bannerSettings || banner?.banner_settings;\n const activeBanner = banner ? {\n ...banner,\n purposes: enginePurposes,\n bannerSettings: rawBannerSettings ? {\n ...rawBannerSettings,\n logoUrl: normalizeUrl(rawBannerSettings.logoUrl || rawBannerSettings.logo_url, effectiveBaseUrl)\n } : rawBannerSettings,\n organization: banner.organization ? {\n ...banner.organization,\n logoUrl: normalizeUrl(banner.organization.logoUrl || banner.organization.logo_url, effectiveBaseUrl)\n } : banner.organization\n } : null;\n\n // =====================================================================\n // CLOSE HANDLERS\n // =====================================================================\n const close = (type) => {\n setVisible(false);\n if (onClose) onClose(type);\n };\n\n const handleCloseClick = async () => {\n closeButtonClickedRef.current = true;\n const result = await actions.closeBanner();\n close(result || 'no_action');\n };\n\n // Wrap engine actions to also close the modal\n const handleAcceptAll = async () => {\n const result = await actions.acceptAll();\n if (result) close(result);\n };\n\n const handleRejectAll = async () => {\n const result = await actions.rejectAll();\n if (result) close(result);\n };\n\n const handleOnlyNecessary = async () => {\n const result = await actions.onlyNecessary();\n if (result) close(result);\n };\n\n const handleSavePreferences = async () => {\n const result = await actions.savePreferences();\n if (result) close(result);\n };\n\n const handleAcknowledgeNotice = async () => {\n const result = await actions.acknowledgeNotice();\n if (result) close(result);\n };\n\n const handleHCaseProceed = async () => {\n const result = await hCaseActions.handleHCaseProceed();\n if (result) close(result);\n };\n\n const handleLanguageChange = useCallback((lang) => {\n setSelectedLanguage(lang);\n }, []);\n\n if (!visible) return null;\n\n // =====================================================================\n // STYLING\n // =====================================================================\n // Normalize snake_case → camelCase for settings the API may return in either form\n const rawSettings = rawBannerSettings || {};\n const settings = {\n ...rawSettings,\n footerText: rawSettings.footerText || rawSettings.footer_text,\n disclaimerText: rawSettings.disclaimerText || rawSettings.disclaimer_text,\n bannerTitle: rawSettings.bannerTitle || rawSettings.banner_title,\n primaryColor: rawSettings.primaryColor || rawSettings.primary_color,\n secondaryColor: rawSettings.secondaryColor || rawSettings.secondary_color,\n fontType: rawSettings.fontType || rawSettings.font_type,\n fontSize: rawSettings.fontSize || rawSettings.font_size,\n actionButtonText: rawSettings.actionButtonText || rawSettings.action_button_text,\n rejectAllText: rawSettings.rejectAllText || rawSettings.reject_all_text,\n rejectAllColor: rawSettings.rejectAllColor || rawSettings.reject_all_color,\n acceptAllText: rawSettings.acceptAllText || rawSettings.accept_all_text,\n onlyNecessaryText: rawSettings.onlyNecessaryText || rawSettings.only_necessary_text,\n onlyNecessaryColor: rawSettings.onlyNecessaryColor || rawSettings.only_necessary_color,\n defaultSelection: rawSettings.defaultSelection || rawSettings.default_selection,\n showProcessors: rawSettings.showProcessors ?? rawSettings.show_processors,\n generalNoticeTemplate: rawSettings.generalNoticeTemplate || rawSettings.general_notice_template,\n noticeAcknowledgeText: rawSettings.noticeAcknowledgeText || rawSettings.notice_acknowledge_text,\n logoUrl: rawSettings.logoUrl || rawSettings.logo_url,\n mandatoryLabel: rawSettings.mandatoryLabel || rawSettings.mandatory_label,\n };\n const styleVars = {\n '--font-type': settings.fontType || 'Verdana',\n '--font-size': settings.fontSize || '14px',\n '--banner-primary-color': settings.primaryColor || '#3b82f6',\n '--banner-secondary-color': settings.secondaryColor || '#555',\n fontFamily: settings.fontType || 'inherit',\n fontSize: settings.fontSize || 'inherit',\n };\n\n // =====================================================================\n // TEMPLATE SELECTION (via registry)\n // =====================================================================\n const isCookieConsent = banner?.consentType === 'cookie_consent';\n\n // Detect banner case for tabbed UI\n const bannerCase = uiState ? uiState.bannerCase : BANNER_CASE.NORMAL;\n\n // Determine if we should use the tabbed banner UI.\n // Use tabbed UI by default for the center_modal template, or explicitly via tabbed_banner.\n // Other templates (floating_card, preferences_modal, etc.) keep their own UI.\n const rawTemplateKey = settings.generalNoticeTemplate || 'center_modal';\n const useTabbedUI = rawTemplateKey === 'tabbed_banner' || rawTemplateKey === 'center_modal';\n\n const templateKey = useTabbedUI ? 'tabbed_banner' : rawTemplateKey;\n\n const layoutClass = templateKey.replace(/_/g, '-');\n const themeClass = theme === 'dark' ? 'trubanner-theme-dark' : '';\n\n // Loading spinner\n if (isLoading) {\n return ReactDOM.createPortal(\n <div className={`mcm-overlay ${themeClass}`}>\n <div className=\"mcm-spinner\" />\n </div>,\n document.body\n );\n }\n\n // =====================================================================\n // RENDER TEMPLATE\n // =====================================================================\n const TemplateComponent = getTemplate(templateKey);\n\n // Build template-specific props\n const buildTemplateProps = () => {\n const baseProps = {\n banner: activeBanner,\n companyName: resolvedCompanyName,\n logoUrl: resolvedLogoUrl,\n actionLoading,\n };\n\n if (templateKey === 'tabbed_banner') {\n return {\n ...baseProps,\n hasUserInteracted,\n onChangePurpose: actions.togglePurpose,\n onRejectAll: handleRejectAll,\n onConsentAll: handleAcceptAll,\n onAcceptSelected: handleSavePreferences,\n onAcceptMandatory: handleOnlyNecessary,\n onAcknowledgeNotice: handleAcknowledgeNotice,\n bannerCase,\n uiState,\n settings,\n // Re-consent props — auto-detected from banner API\n reconsentCampaignId,\n reconsentUiMode,\n versionDiff,\n reconsentOnly: reconsentIsDedicatedCp,\n reconsentSource,\n expiryReconsentRequestId,\n };\n }\n\n if (templateKey === 'notice_only') {\n return {\n ...baseProps,\n onAcknowledge: handleAcknowledgeNotice,\n };\n }\n\n if (templateKey === 'floating_card') {\n return {\n ...baseProps,\n onAcceptMandatory: handleOnlyNecessary,\n onConsentAll: handleAcceptAll,\n onPersonalize: () => setShowFullNotice(true),\n primaryColor: settings.primaryColor,\n secondaryColor: settings.secondaryColor,\n layoutClass,\n footerText: settings.footerText,\n settings,\n };\n }\n\n if (templateKey === 'preferences_modal') {\n return {\n ...baseProps,\n hasUserInteracted,\n onChangePurpose: actions.togglePurpose,\n onRejectAll: handleRejectAll,\n onConsentAll: handleAcceptAll,\n onAcceptSelected: handleSavePreferences,\n onAcceptMandatory: handleOnlyNecessary,\n onClose,\n settings,\n };\n }\n\n // Default: center_modal (BannerUI), general_compact_list, general_split_pane, inline_single_row\n return {\n ...baseProps,\n hasUserInteracted,\n onChangePurpose: actions.togglePurpose,\n onRejectAll: handleRejectAll,\n onConsentAll: handleAcceptAll,\n onAcceptSelected: handleSavePreferences,\n onAcceptMandatory: handleOnlyNecessary,\n settings,\n };\n };\n const isInline = false;\n\n // ── Re-consent: already-consented guard ──────────────────────────────\n if (reconsentCampaignId && reconsentCampaignStatus === 'consented') {\n return ReactDOM.createPortal(\n <div className={`mcm-overlay ${themeClass}`} style={styleVars}>\n <div className=\"mcm-modal\" style={{ textAlign: 'center', padding: '2rem' }}>\n <div style={{ fontSize: '2rem', marginBottom: '0.5rem' }}>✅</div>\n <h2 style={{ marginBottom: '0.5rem', fontSize: '1.1rem', fontWeight: 600 }}>\n Re-consent Provided\n </h2>\n <p style={{ color: '#aaa', fontSize: '0.9rem' }}>\n You have already provided re-consent for this update.\n </p>\n </div>\n </div>,\n document.body\n );\n }\n\n const content = (\n <TranslationProvider\n lang={selectedLanguage}\n snapshot={banner?.translationsSnapshot || banner?.translations_snapshot}\n onLanguageChange={handleLanguageChange}\n >\n <React.Fragment>\n {error && (\n <div className=\"mcm-error\" role=\"alert\">\n {error}\n </div>\n )}\n\n {fetchError ? (\n <div className=\"mcm-error-view\">\n <div className=\"mcm-error-icon\">⚠️</div>\n <h2 className=\"mcm-error-title\">Unable to Load Consent</h2>\n <p className=\"mcm-error-desc\">\n {fetchError}\n </p>\n </div>\n ) : activeBanner && (\n <TemplateComponent {...buildTemplateProps()} />\n )}\n\n {hCaseData.show && (\n <HCaseWarningPopup\n settings={rawBannerSettings || {}}\n onProceed={handleHCaseProceed}\n onBack={hCaseActions.handleHCaseBack}\n primaryColor={rawBannerSettings?.primaryColor || rawBannerSettings?.primary_color}\n />\n )}\n </React.Fragment>\n </TranslationProvider>\n );\n\n const isWide = templateKey === 'inline_single_row' || templateKey === 'general_split_pane';\n const wrapperStyle = {\n ...styleVars,\n ...(isWide ? { maxWidth: '1100px', width: '90vw' } : {})\n };\n\n if (isInline) {\n return (\n <div className={`mcm-inline-wrapper ${themeClass}`} style={wrapperStyle}>\n {content}\n </div>\n );\n }\n\n return ReactDOM.createPortal(\n <div className={`mcm-overlay ${layoutClass} ${themeClass}`} style={styleVars}>\n <div className={`mcm-wrapper ${layoutClass}`} style={wrapperStyle}>\n <button\n className=\"mcm-close-btn\"\n onClick={handleCloseClick}\n aria-label=\"Close consent banner\"\n >\n &times;\n </button>\n <div\n className=\"mcm-container\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {content}\n </div>\n </div>\n </div>,\n document.body\n );\n}\n","import React from 'react';\nimport TruConsentModal from './TruConsentModal';\n\n/**\n * TruConsent - Auto-showing cookie consent modal\n * \n * Displays a modal popup immediately on mount with loading state.\n * The modal fetches banner data and shows cookie consent UI.\n * \n * @param {string} apiKey - API key for authentication\n * @param {string} organizationId - Organization ID (e.g., 'cobuildx', 'client-dev')\n * @param {string} bannerId - Banner/Collection Point ID to display\n * @param {string} userId - User ID for consent tracking\n * @param {string} assetId - Asset ID (required when using API key auth)\n * @param {string} apiBaseUrl - Base URL for API (optional)\n * @param {string} logoUrl - Company logo URL (optional)\n * @param {string} companyName - Company name (optional)\n * @param {function} onClose - Callback when modal closes (optional)\n */\n\nexport default function TruConsent({\n apiKey,\n organizationId,\n bannerId,\n userId,\n assetId,\n apiUrl,\n apiBaseUrl,\n theme,\n logoUrl,\n companyName,\n onClose\n}) {\n // Auto-show modal on mount - TruConsentModal handles loading state internally\n return (\n <TruConsentModal\n apiKey={apiKey}\n organizationId={organizationId}\n bannerId={bannerId}\n userId={userId}\n assetId={assetId}\n apiUrl={apiUrl}\n apiBaseUrl={apiBaseUrl}\n theme={theme}\n logoUrl={logoUrl}\n companyName={companyName}\n onClose={onClose}\n />\n );\n}","/**\n * cookieStorage.js\n *\n * Consent persistence for the cookie-consent flow.\n * Stores consent in a browser cookie only (365 days).\n * Storage key: \"tru_consent\"\n */\n\nconst STORAGE_KEY = 'tru_consent';\nconst COOKIE_DAYS = 365;\n\nfunction _setCookie(value) {\n const d = new Date();\n d.setTime(d.getTime() + COOKIE_DAYS * 24 * 60 * 60 * 1000);\n document.cookie = `${STORAGE_KEY}=${encodeURIComponent(value)};expires=${d.toUTCString()};path=/;SameSite=Lax`;\n}\n\nfunction _getCookie() {\n const prefix = STORAGE_KEY + '=';\n for (const part of document.cookie.split(';')) {\n const c = part.trim();\n if (c.startsWith(prefix)) {\n try { return decodeURIComponent(c.slice(prefix.length)); } catch { return null; }\n }\n }\n return null;\n}\n\nfunction _deleteCookie() {\n document.cookie = `${STORAGE_KEY}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\n}\n\nexport function saveConsent(data) {\n _setCookie(JSON.stringify(data));\n}\n\nexport function loadConsent() {\n const raw = _getCookie();\n if (!raw) return null;\n try { return JSON.parse(raw); } catch { return null; }\n}\n\nexport function hasConsent() {\n return _getCookie() !== null;\n}\n\nexport function clearConsent() {\n _deleteCookie();\n}\n","/**\n * gtagBridge.js\n *\n * Google Consent Mode bridge for the React cookie-consent flow.\n * Ported from truTagManager/src/core/gtagBridge.js — same logic, ES-module exports.\n * Compatible with GTM Consent Mode v2.\n */\n\nconst KNOWN_STORAGE_KEYS = [\n 'analytics_storage', 'ad_storage', 'ad_user_data', 'ad_personalization',\n 'functionality_storage', 'personalization_storage', 'security_storage',\n];\n\nfunction ensureGtag() {\n window.dataLayer = window.dataLayer || [];\n if (typeof window.gtag !== 'function') {\n window.gtag = function () { window.dataLayer.push(arguments); };\n }\n}\n\nfunction isKnown(key) { return KNOWN_STORAGE_KEYS.includes(key); }\n\nfunction applyDecision(target, key, granted) {\n if (!key || !isKnown(key)) return;\n if (granted) { target[key] = 'granted'; }\n else if (target[key] !== 'granted') { target[key] = 'denied'; }\n}\n\nfunction baseDefaults() {\n return {\n analytics_storage: 'denied',\n ad_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n functionality_storage: 'granted',\n personalization_storage: 'denied',\n security_storage: 'granted',\n wait_for_update: 500,\n };\n}\n\nfunction buildUpdate(consentState, config) {\n const update = baseDefaults();\n delete update.wait_for_update;\n\n if (config?.category_details?.length) {\n for (const cat of config.category_details) {\n const { gtag_storage_key: key, slug, is_essential } = cat;\n if (!key || !slug) continue;\n if (Object.prototype.hasOwnProperty.call(consentState, slug)) {\n applyDecision(update, key, !!consentState[slug]);\n } else if (is_essential) {\n applyDecision(update, key, true);\n }\n }\n return update;\n }\n\n // Fallback for configs without category_details\n applyDecision(update, 'analytics_storage', !!(consentState.analytics || consentState.site_performance));\n applyDecision(update, 'ad_storage', !!(consentState.ads || consentState.advertising || consentState.marketing));\n applyDecision(update, 'ad_user_data', !!consentState.ad_user_data);\n applyDecision(update, 'ad_personalization', !!consentState.ad_personalization);\n applyDecision(update, 'functionality_storage', consentState.functionality !== false);\n applyDecision(update, 'personalization_storage', !!(consentState.personalization || consentState.preferences));\n applyDecision(update, 'security_storage', consentState.security !== false);\n return update;\n}\n\nfunction buildDefaults(config, categories) {\n const defaults = baseDefaults();\n if (config?.category_details?.length) {\n for (const cat of config.category_details) {\n const { gtag_storage_key: key, is_essential, default_state } = cat;\n if (!key || !isKnown(key)) continue;\n applyDecision(defaults, key, is_essential === true || default_state === 'granted');\n }\n return defaults;\n }\n if (categories) {\n applyDecision(defaults, 'analytics_storage', !!(categories.analytics || categories.site_performance));\n applyDecision(defaults, 'ad_storage', !!(categories.ads || categories.advertising || categories.marketing));\n applyDecision(defaults, 'functionality_storage', categories.functionality !== false);\n applyDecision(defaults, 'security_storage', categories.security !== false);\n }\n return defaults;\n}\n\nexport function setConsentDefaults(config, categories) {\n ensureGtag();\n window.gtag('consent', 'default', buildDefaults(config, categories));\n}\n\nexport function updateConsentMode(consentState, config) {\n ensureGtag();\n window.gtag('consent', 'update', buildUpdate(consentState, config));\n window.dataLayer.push({ event: 'tru_consent_update', tru_consent: consentState });\n}\n\nexport function isGtmPresent() {\n return !!(window.dataLayer && window.google_tag_manager);\n}\n","import React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { saveConsent, loadConsent, hasConsent, clearConsent } from '../runtime/cookieStorage';\nimport { setConsentDefaults, updateConsentMode } from '../runtime/gtagBridge';\n\n/**\n * TruCookieConsent\n *\n * Standalone React component for cookie consent. Works independently of\n * TruConsentModal — it talks to the cookie-consent API\n * (GET /api/v1/internal/sdk/cookie-consent, POST .../log), persists consent\n * in a browser cookie, and fires Google Consent Mode signals.\n *\n * Props:\n * apiUrl {string} Full base URL e.g. \"https://api.truconsent.io\"\n * apiKey {string} X-API-Key header value\n * orgId {string} X-Org-Id header value (tenant slug)\n * assetId {string} Scope config to a specific asset\n * theme {string} \"light\" | \"dark\" (default \"light\")\n * onClose {function} Called after the user makes a choice\n */\nexport default function TruCookieConsent({ apiUrl, apiKey, orgId, assetId, theme = 'light', onClose }) {\n const [config, setConfig] = useState(null);\n const [visible, setVisible] = useState(false);\n const [showPreferences, setShowPreferences] = useState(false);\n const [categoryState, setCategoryState] = useState({});\n const configRef = useRef(null);\n\n // ── Helpers ──────────────────────────────────────────────────────────────\n\n const buildHeaders = useCallback(() => {\n const h = { 'Content-Type': 'application/json' };\n if (apiKey) h['X-API-Key'] = apiKey;\n if (orgId) h['X-Org-Id'] = orgId;\n return h;\n }, [apiKey, orgId]);\n\n const baseUrl = (apiUrl || '').replace(/\\/$/, '');\n\n /** Map category_details → { slug: bool } — essential always true */\n const buildCategories = useCallback((cfg, overrides = {}) => {\n const cats = {};\n for (const cat of (cfg?.category_details || [])) {\n cats[cat.slug] = cat.is_essential === true ? true : (overrides[cat.slug] ?? false);\n }\n return cats;\n }, []);\n\n const buildAllGranted = useCallback((cfg) => {\n const cats = {};\n for (const cat of (cfg?.category_details || [])) {\n cats[cat.slug] = true;\n }\n return cats;\n }, []);\n\n const buildAllDenied = useCallback((cfg) => buildCategories(cfg, {}), [buildCategories]);\n\n /** POST consent log to backend */\n const logConsent = useCallback((action, categories) => {\n if (!baseUrl) return;\n const url = `${baseUrl}/api/v1/internal/sdk/cookie-consent/log`;\n try {\n fetch(url, {\n method: 'POST',\n headers: buildHeaders(),\n body: JSON.stringify({\n action,\n categories,\n asset_id: assetId || null,\n timestamp: new Date().toISOString(),\n user_agent: navigator.userAgent,\n }),\n keepalive: true,\n }).catch(() => {});\n } catch { /* silently ignore — consent logging must never break the page */ }\n }, [baseUrl, buildHeaders, assetId]);\n\n /** Persist, fire GTM, log, close */\n const applyConsent = useCallback((action, categories) => {\n const cfg = configRef.current;\n saveConsent({ categories, action, timestamp: new Date().toISOString(), version: cfg?.version || '1.0' });\n updateConsentMode(categories, cfg);\n logConsent(action, categories);\n setVisible(false);\n setShowPreferences(false);\n onClose?.();\n }, [logConsent, onClose]);\n\n // ── Public window API ─────────────────────────────────────────────────────\n\n useEffect(() => {\n window.truCookieConsent = {\n openSettings: () => { setVisible(true); setShowPreferences(true); },\n acceptAll: () => {\n const cfg = configRef.current;\n if (cfg) applyConsent('accept_all', buildAllGranted(cfg));\n },\n rejectAll: () => {\n const cfg = configRef.current;\n if (cfg) applyConsent('reject_all', buildAllDenied(cfg));\n },\n hasConsented: () => hasConsent(),\n reset: () => { clearConsent(); setVisible(true); setShowPreferences(false); },\n getCategories: () => loadConsent()?.categories || null,\n };\n return () => { delete window.truCookieConsent; };\n }, [applyConsent, buildAllGranted, buildAllDenied]);\n\n // ── Init: check stored consent, set GTM defaults, fetch config ───────────\n\n useEffect(() => {\n // Restore GTM signals from stored consent before anything else\n const stored = loadConsent();\n if (stored?.categories) {\n updateConsentMode(stored.categories, null);\n // Already consented — don't show banner\n return;\n }\n\n // No stored consent — set safe defaults (all denied) while we load\n setConsentDefaults(null, null);\n\n if (!baseUrl || !apiKey) return;\n\n // Fetch config from API\n let url = `${baseUrl}/api/v1/internal/sdk/cookie-consent`;\n if (assetId) url += `?asset_id=${encodeURIComponent(assetId)}`;\n\n fetch(url, { headers: buildHeaders() })\n .then(r => r.ok ? r.json() : Promise.reject(r.status))\n .then(cfg => {\n configRef.current = cfg;\n setConfig(cfg);\n setCategoryState(buildCategories(cfg));\n setConsentDefaults(cfg, null);\n setVisible(true);\n })\n .catch(() => {\n // API unreachable — fail silently, do not show banner\n });\n }, [baseUrl, apiKey, buildHeaders, assetId, buildCategories]);\n\n // ── Action handlers ───────────────────────────────────────────────────────\n\n const handleAcceptAll = useCallback(() => {\n applyConsent('accept_all', buildAllGranted(configRef.current));\n }, [applyConsent, buildAllGranted]);\n\n const handleAcceptMandatory = useCallback(() => {\n applyConsent('accept_only_necessary', buildAllDenied(configRef.current));\n }, [applyConsent, buildAllDenied]);\n\n const handleSavePreferences = useCallback(() => {\n const cfg = configRef.current;\n const allOptional = (cfg?.category_details || []).filter(c => !c.is_essential);\n const allAccepted = allOptional.every(c => categoryState[c.slug]);\n const noneAccepted = allOptional.every(c => !categoryState[c.slug]);\n const action = allAccepted ? 'accept_all' : noneAccepted ? 'reject_all' : 'save_preferences';\n applyConsent(action, categoryState);\n }, [applyConsent, categoryState]);\n\n const handleTogglePurpose = useCallback((purposeId, accepted) => {\n const cfg = configRef.current;\n const cat = cfg?.category_details?.find(c => c.id === purposeId || c.slug === purposeId);\n if (!cat || cat.is_essential) return; // essential purposes cannot be toggled\n setCategoryState(prev => ({ ...prev, [cat.slug]: accepted }));\n }, []);\n\n // ── Nothing to render ─────────────────────────────────────────────────────\n\n if (!visible || !config) return null;\n\n const t = config.theme || {};\n const layout = _normalizeLayout(config.template);\n const position = config.position || 'bottom';\n const side = config.side || 'right';\n const primaryColor = t.btnAccept || t.primary || '#3b82f6';\n const secondaryColor = t.btnReject || '#374151';\n const settingsColor = t.btnSettings || '#f3f4f6';\n const settingsText = t.btnSettings ? '#ffffff' : (t.text || '#111827');\n\n const categoryDetails = config.category_details || [];\n const modalTitle = (config.settings_text || 'Privacy Preferences').replace(/\\[Organization Name\\]/g, config.company_name || '');\n\n const title = (config.banner_title || 'Cookie Consent').replace(/\\[Organization Name\\]/g, config.company_name || '');\n const message = (config.banner_message || '').replace(/\\[Organization Name\\]/g, config.company_name || '');\n\n const css = `\n :root {\n --banner-bg: ${t.bg || '#ffffff'};\n --banner-text: ${t.text || '#111827'};\n --banner-text-muted: #6b7280;\n --banner-primary-color: ${primaryColor};\n --banner-secondary-color: ${secondaryColor};\n --banner-settings-color: ${settingsColor};\n --banner-settings-text: ${settingsText};\n --banner-border: ${t.border || '#e5e7eb'};\n --banner-card-bg: ${t.cardBg || '#f9fafb'};\n --banner-hover-bg: #f3f4f6;\n }\n #tru-cmp-banner {\n position: fixed; z-index: 2147483647;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n box-sizing: border-box; opacity: 0;\n transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n ${layout !== 'floating-card' ? (position === 'top' ? 'top: 0;' : 'bottom: 0;') : ''}\n }\n #tru-cmp-banner.tru-visible { opacity: 1; transform: translate(0) !important; }\n .mcm-cookie-banner-ui.bottom-bar {\n left: 0; right: 0; background: var(--banner-bg);\n ${position === 'top' ? 'border-bottom: 1px solid var(--banner-border);' : 'border-top: 1px solid var(--banner-border);'}\n box-shadow: ${position === 'top' ? '0 4px 20px rgba(0,0,0,0.08)' : '0 -4px 20px rgba(0,0,0,0.08)'};\n transform: translateY(${position === 'top' ? '-100%' : '100%'});\n }\n #tru-cmp-banner.floating-card {\n ${position === 'top' ? 'top: 8px;' : 'bottom: 8px;'}\n ${side === 'left' ? 'left: 8px; right: auto;' : 'right: 8px; left: auto;'}\n width: 380px; max-width: calc(100vw - 16px); background: var(--banner-bg);\n border-radius: 1rem; border: 1px solid var(--banner-border);\n box-shadow: 0 16px 40px -8px rgba(0,0,0,0.2);\n transform: translateY(${position === 'top' ? '-20px' : '20px'});\n overflow: hidden; display: flex; flex-direction: column; align-items: stretch;\n }\n .mcm-cookie-summary { padding: 1rem 0 0 0; display: flex; flex-direction: column; width: 100%; box-sizing: border-box; flex: 0 0 auto; }\n .mcm-cookie-summary-content { padding: 0 1rem; }\n .mcm-cookie-summary.bottom-bar {\n display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; justify-content: space-between;\n padding: 0.75rem 0 0 0; max-width: 100%; margin: 0 auto; gap: 0.4rem 0; min-height: 64px; box-sizing: border-box;\n }\n .mcm-cookie-summary.bottom-bar .mcm-cookie-summary-content { flex: 1 1 auto; min-width: 400px; padding: 0 0 0 1rem; display: flex; flex-direction: column; justify-content: center; }\n .mcm-cookie-summary-title { font-size: 1.05rem; font-weight: 800; color: var(--banner-text); margin: 0 0 0.2rem 0; border: none; line-height: 1.2; letter-spacing: -0.02em; }\n .mcm-cookie-summary.bottom-bar .mcm-cookie-summary-title { font-size: 1.2rem; margin-bottom: 0.15rem; }\n .mcm-cookie-summary-text { font-size: 0.8125rem; line-height: 1.3; color: var(--banner-text-muted); margin: 0; text-align: left; }\n .mcm-cookie-summary-actions-wrap { padding: 0.375rem 1rem 0.25rem 1rem; }\n .mcm-cookie-summary.bottom-bar .mcm-cookie-summary-actions-wrap { padding: 0; }\n .mcm-cookie-summary-actions { display: flex; flex-direction: column; gap: 0.5rem; }\n .mcm-secondary-row { display: flex; gap: 0.5rem; }\n .mcm-secondary-row .mcm-summary-btn { flex: 1; }\n .mcm-cookie-summary.bottom-bar .mcm-cookie-summary-actions { flex: 0 0 auto; display: flex; flex-direction: row; align-items: center; justify-content: center; gap: 0.5rem; height: 100%; margin: 0; padding: 0 1rem 0 0; }\n .mcm-cookie-summary.bottom-bar .mcm-secondary-row { display: contents; }\n .mcm-summary-btn { flex: 1; min-height: 40px; padding: 0.5rem 1rem; border-radius: 0.5rem; font-weight: 700; font-size: 0.8125rem; cursor: pointer; transition: all 0.2s cubic-bezier(0.4,0,0.2,1); border: 2px solid transparent; text-align: center; font-family: inherit; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; }\n .mcm-cookie-summary.bottom-bar .mcm-summary-btn { width: auto; min-width: 160px; height: 44px; padding: 0 1.5rem; margin: 0; display: flex; align-items: center; justify-content: center; }\n .mcm-summary-btn.primary { background-color: var(--banner-primary-color); color: white; }\n .mcm-summary-btn.primary:hover { filter: brightness(1.05); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.15); }\n .mcm-summary-btn.secondary { background-color: var(--banner-secondary-color); color: #ffffff; border-color: var(--banner-secondary-color); }\n .mcm-summary-btn.secondary:hover { filter: brightness(1.1); }\n .mcm-summary-btn.text { background-color: var(--banner-settings-color); color: var(--banner-settings-text); border: ${t.btnSettings ? 'none' : '1px solid var(--banner-border)'}; }\n .mcm-summary-btn.text:hover { filter: brightness(0.95); }\n .mcm-full-hr { border: 0; border-top: 1px solid var(--banner-border); margin: 0; width: 100%; }\n .mcm-cookie-summary-footer-area { padding: 4px 1rem; line-height: 1; }\n .mcm-cookie-summary.bottom-bar .mcm-cookie-summary-footer-area { padding: 0.2rem 0; flex: 1 1 100%; }\n .mcm-footer-links-row { display: flex; justify-content: center; gap: 2rem; width: 100%; flex-wrap: wrap; align-items: center; }\n .mcm-footer-link { font-size: 0.72rem; color: var(--banner-text-muted); text-decoration: none; font-weight: 600; line-height: 1; display: inline-flex; align-items: center; }\n .mcm-footer-link:hover { color: var(--banner-text); text-decoration: underline; }\n .mcm-powered-by { font-size: 0.65rem; color: var(--banner-text-muted); text-align: center; background-color: #f8fafc; border-top: 1px solid var(--banner-border); padding: 0.15rem 0; width: 100%; flex: 1 1 100%; order: 10; opacity: 1; margin: 0; display: flex; align-items: center; justify-content: center; gap: 3px; letter-spacing: 0.02em; font-weight: 500; }\n .mcm-brand { font-weight: 800; color: var(--banner-text); }\n @media (max-width: 768px) {\n .mcm-cookie-banner-ui.floating-card { width: calc(100% - 16px); left: 8px; right: 8px; bottom: 8px; max-width: none; border-radius: 0.875rem; }\n .mcm-cookie-summary.bottom-bar { flex-direction: column; padding: 1.5rem; align-items: stretch; gap: 1rem; }\n .mcm-cookie-summary.bottom-bar .mcm-cookie-summary-actions { flex-direction: column; width: 100%; }\n .mcm-cookie-summary.bottom-bar .mcm-summary-btn { width: 100%; }\n .mcm-cookie-summary.bottom-bar .mcm-cookie-summary-content { min-width: 0; }\n .mcm-footer-links-row { gap: 0.85rem; }\n }\n\n /* ── Preferences Modal ── */\n #tp-modal {\n --tp-bg: ${t.bg || '#ffffff'};\n --tp-text: ${t.text || '#111827'};\n --tp-muted: #64748b;\n --tp-primary: ${primaryColor};\n --tp-border: ${t.border || '#e5e7eb'};\n --tp-card: ${t.cardBg || '#f8fafc'};\n --tp-hover: #f8fafc;\n --tp-ok: #10b981;\n }\n #tp-overlay { position: fixed; inset: 0; background: rgba(2,6,23,0.6); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); z-index: 2147483646; opacity: 0; transition: opacity 0.3s ease; }\n #tp-overlay.tp-show { opacity: 1; }\n #tp-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%,-52%) scale(0.98); z-index: 2147483647; background: var(--tp-bg); border-radius: 1.25rem; width: calc(100% - 32px); max-width: 540px; height: 540px; max-height: 88vh; display: flex; flex-direction: column; box-shadow: 0 25px 50px -12px rgba(0,0,0,0.25), 0 0 0 1px rgba(0,0,0,0.05); opacity: 0; transition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.16,1,0.3,1); font-family: -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif; overflow: hidden; color: var(--tp-text); }\n #tp-modal.tp-show { opacity: 1; transform: translate(-50%,-50%) scale(1); }\n #tp-modal.tp-side-panel { top: 0; left: auto; right: 0; bottom: 0; transform: translateX(100%); width: 33%; min-width: 400px; max-width: 100%; height: 100vh; max-height: 100vh; border-radius: 0; transition: transform 0.4s cubic-bezier(0.16,1,0.3,1), opacity 0.3s ease; }\n #tp-modal.tp-side-panel.tp-show { transform: translateX(0); opacity: 1; }\n #tp-modal.tp-side-panel .tp-footer { padding: 0; }\n #tp-modal.tp-side-panel .tp-actions { padding: 0.875rem 1.5rem; }\n @media (max-width: 640px) { #tp-modal.tp-side-panel { width: 100%; min-width: 100%; } }\n .tp-header { display: flex; align-items: center; gap: 1rem; padding: 1rem 1.5rem; border-bottom: 1px solid var(--tp-border); flex-shrink: 0; }\n .tp-header-text { flex: 1; min-width: 0; }\n .tp-title { margin: 0; font-size: 1.125rem; font-weight: 800; color: var(--tp-text); line-height: 1.2; letter-spacing: -0.01em; }\n .tp-subtitle { margin: 0.15rem 0 0; font-size: 0.8125rem; color: var(--tp-muted); font-weight: 500; }\n .tp-close { flex-shrink: 0; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; background: var(--tp-card); border: 1px solid var(--tp-border); border-radius: 8px; color: var(--tp-muted); cursor: pointer; transition: all 0.2s; }\n .tp-close:hover { background: var(--tp-hover); color: var(--tp-text); transform: scale(1.05); }\n .tp-intro { padding: 0.75rem 1.5rem; background: var(--tp-card); border-bottom: 1px solid var(--tp-border); }\n .tp-intro p { margin: 0; font-size: 0.875rem; line-height: 1.45; color: var(--tp-muted); font-weight: 450; }\n .tp-body { flex: 1; overflow-y: auto; padding-bottom: 1rem; }\n .tp-body::-webkit-scrollbar { width: 6px; }\n .tp-body::-webkit-scrollbar-thumb { background: var(--tp-border); border-radius: 10px; }\n .tp-list { padding: 1rem 1.5rem; display: flex; flex-direction: column; gap: 0.75rem; }\n .tp-card { border: 1.5px solid var(--tp-border); border-left: 5px solid var(--tp-border); border-radius: 1rem; padding: 0.5rem 0.75rem; background: var(--tp-bg); transition: all 0.3s cubic-bezier(0.4,0,0.2,1); }\n .tp-card.essential { border-left-color: var(--tp-ok); }\n .tp-card.enabled { border-left-color: var(--tp-primary); background: var(--tp-card); }\n .tp-card:hover { box-shadow: 0 4px 12px -2px rgba(0,0,0,0.08); transform: translateY(-1px); }\n .tp-card-row { display: flex; align-items: flex-start; gap: 1.25rem; }\n .tp-card-info { flex: 1; min-width: 0; }\n .tp-card-control { flex-shrink: 0; padding-top: 4px; }\n .tp-cat-name-container { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; margin-bottom: 0.15rem; }\n .tp-cat-name { font-size: 0.9375rem; font-weight: 700; color: var(--tp-text); }\n .tp-cat-desc { margin: 0; font-size: 0.875rem; color: var(--tp-muted); line-height: 1.6; font-weight: 450; }\n .tp-badge-necessary { background: #fff5f5; color: #e03131; border: 1.5px solid #e03131; padding: 2px 8px; border-radius: 6px; font-size: 10px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.05em; display: inline-flex; align-items: center; line-height: 1; }\n .tp-switch { position: relative; width: 44px; height: 24px; cursor: pointer; display: block; }\n .tp-switch input { position: absolute; opacity: 0; width: 0; height: 0; }\n .tp-track { position: absolute; inset: 0; background: var(--tp-border); border-radius: 24px; transition: all 0.3s ease; }\n .tp-thumb { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; border-radius: 50%; background: #fff; box-shadow: 0 2px 4px rgba(0,0,0,0.15); transition: transform 0.3s cubic-bezier(0.16,1,0.3,1); }\n .tp-switch input:checked + .tp-track { background: var(--tp-primary); }\n .tp-switch input:checked + .tp-track + .tp-thumb { transform: translateX(20px); }\n .tp-expanders { border-top: 1px solid var(--tp-border); margin-top: 0.75rem; padding-top: 0.15rem; }\n .tp-data-section:not(:last-child) { border-bottom: 1px solid var(--tp-border); }\n .tp-section-btn { width: 100%; display: flex; align-items: center; gap: 0.75rem; background: none; border: none; padding: 0.5rem 0; cursor: pointer; color: var(--tp-muted); font-size: 0.8125rem; font-weight: 600; font-family: inherit; text-align: left; }\n .tp-section-btn:hover { color: var(--tp-text); }\n .tp-section-count { min-width: 20px; height: 20px; padding: 0 6px; background: var(--tp-card); border: 1.5px solid var(--tp-border); border-radius: 6px; font-size: 0.6875rem; font-weight: 800; display: flex; align-items: center; justify-content: center; color: var(--tp-text); }\n .tp-section-label { flex: 1; opacity: 0.9; }\n .tp-pill-row { display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.15rem 0 0.5rem 0; }\n .tp-pill { font-size: 0.75rem; font-weight: 500; padding: 3px 10px; border-radius: 8px; background: var(--tp-card); border: 1.5px solid var(--tp-border); color: var(--tp-text); }\n .tp-footer { display: flex; flex-direction: column; align-items: stretch; padding: 0; border-top: 1px solid var(--tp-border); background: var(--tp-card); flex-shrink: 0; }\n .tp-branding { font-size: 0.6875rem; color: var(--tp-muted); font-weight: 500; display: flex; align-items: center; justify-content: center; gap: 3px; height: 32px; background: #f3f4f6; border-top: 1px solid var(--tp-border); letter-spacing: 0.02em; line-height: 1; }\n .tp-brand { font-weight: 800; color: var(--tp-text); }\n .tp-actions { display: flex; justify-content: space-between; align-items: center; gap: 0.75rem; padding: 0.875rem 1.5rem; }\n .tp-secondary-actions { display: flex; gap: 0.75rem; align-items: center; }\n .tp-btn { justify-content: center; height: 38px; padding: 0 0.75rem; border-radius: 0.5rem; font-size: 0.8125rem; font-weight: 700; cursor: pointer; border: 1.5px solid transparent; transition: all 0.2s cubic-bezier(0.4,0,0.2,1); font-family: inherit; white-space: nowrap; display: inline-flex; align-items: center; gap: 0.5rem; line-height: 1; }\n .tp-btn:active { transform: scale(0.97); }\n .tp-btn-outline { background: var(--tp-bg); border-color: var(--tp-border); color: var(--tp-text); }\n .tp-btn-outline:hover { background: var(--tp-hover); border-color: var(--tp-text); }\n .tp-btn-primary { background: var(--tp-primary); color: #fff; border-color: var(--tp-primary); }\n .tp-btn-primary:hover { filter: brightness(1.05); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.1); }\n @media (max-width: 640px) {\n .tp-actions { flex-direction: column; width: 100%; gap: 0.5rem; padding: 1rem; align-items: stretch; }\n .tp-secondary-actions { flex-direction: column; width: 100%; gap: 0.5rem; }\n .tp-btn { width: 100%; justify-content: center; padding: 0.5rem; }\n }\n `;\n\n return createPortal(\n <>\n <style>{css}</style>\n\n {!showPreferences && (\n <div\n id=\"tru-cmp-banner\"\n className={`mcm-cookie-banner-ui ${layout}`}\n ref={el => {\n if (el && !el.classList.contains('tru-visible')) {\n setTimeout(() => el.classList.add('tru-visible'), 10);\n }\n }}\n role=\"dialog\"\n aria-label=\"Cookie Consent\"\n >\n <div className={`mcm-cookie-summary ${layout}`}>\n <div className=\"mcm-cookie-summary-content\">\n <h2 className=\"mcm-cookie-summary-title\">{title}</h2>\n <p className=\"mcm-cookie-summary-text\">{message}</p>\n </div>\n\n {layout === 'floating-card' && <hr className=\"mcm-full-hr\" />}\n\n <div className=\"mcm-cookie-summary-actions-wrap\">\n <div className=\"mcm-cookie-summary-actions\">\n <button className=\"mcm-summary-btn primary\" onClick={handleAcceptAll}>\n {config.accept_text || 'Accept All'}\n </button>\n <button className=\"mcm-summary-btn secondary\" onClick={handleAcceptMandatory}>\n {config.reject_text || 'Reject All'}\n </button>\n <button className=\"mcm-summary-btn text\" onClick={() => setShowPreferences(true)}>\n {config.settings_text || 'Manage Preferences'}\n </button>\n </div>\n </div>\n\n <hr className=\"mcm-full-hr\" />\n\n <div className=\"mcm-cookie-summary-footer-area\">\n <div className=\"mcm-footer-links-row\">\n <a href={config.privacy_policy_url || '#'} className=\"mcm-footer-link\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a>\n <a href={config.cookie_policy_url || '#'} className=\"mcm-footer-link\" target=\"_blank\" rel=\"noopener noreferrer\">Terms and Conditions</a>\n </div>\n </div>\n\n {config.show_powered_by !== false && (\n <div className=\"mcm-powered-by\">\n Powered by <span className=\"mcm-brand\">truConsent</span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {showPreferences && (\n <>\n <div\n id=\"tp-overlay\"\n ref={el => el && setTimeout(() => el.classList.add('tp-show'), 10)}\n onClick={() => setShowPreferences(false)}\n />\n <div\n id=\"tp-modal\"\n className={config.preferences_template === 'side_panel' ? 'tp-side-panel' : ''}\n ref={el => el && setTimeout(() => el.classList.add('tp-show'), 10)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Privacy Preferences\"\n >\n <div className=\"tp-header\">\n <div className=\"tp-header-text\">\n <h2 className=\"tp-title\">{modalTitle}</h2>\n <p className=\"tp-subtitle\">Control how your data is used on this site</p>\n </div>\n <button type=\"button\" className=\"tp-close\" onClick={() => setShowPreferences(false)} aria-label=\"Close\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div className=\"tp-body\">\n <div className=\"tp-intro\">\n <p>When you visit any website, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to.</p>\n </div>\n <div className=\"tp-list\">\n {categoryDetails.map(cat => {\n const isEssential = cat.is_essential === true;\n const isChecked = categoryState[cat.slug] === true;\n const dataElements = cat.data_elements || [];\n return (\n <div key={cat.slug} className={`tp-card ${isEssential ? 'essential' : isChecked ? 'enabled' : ''}`}>\n <div className=\"tp-card-row\">\n <div className=\"tp-card-info\">\n <div className=\"tp-cat-name-container\">\n <span className=\"tp-cat-name\">{cat.name}</span>\n {isEssential && <span className=\"tp-badge-necessary\">Necessary</span>}\n </div>\n {cat.description && <p className=\"tp-cat-desc\">{cat.description}</p>}\n </div>\n <div className=\"tp-card-control\">\n <label className=\"tp-switch\">\n <input\n type=\"checkbox\"\n checked={isChecked}\n disabled={isEssential}\n onChange={e => !isEssential && handleTogglePurpose(cat.id || cat.slug, e.target.checked)}\n />\n <span className=\"tp-track\" />\n <span className=\"tp-thumb\" />\n </label>\n </div>\n </div>\n {dataElements.length > 0 && (\n <TpDataSection title=\"Data Collected\" items={dataElements} uid={`${cat.slug}-data`} />\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"tp-footer\">\n <div className=\"tp-actions\">\n <button type=\"button\" className=\"tp-btn tp-btn-primary\" onClick={handleSavePreferences}>\n Save Preferences\n </button>\n <div className=\"tp-secondary-actions\">\n <button type=\"button\" className=\"tp-btn tp-btn-outline\" onClick={handleAcceptMandatory}>\n Save Necessary Only\n </button>\n <button type=\"button\" className=\"tp-btn tp-btn-outline\" onClick={handleAcceptAll}>\n Accept All\n </button>\n </div>\n </div>\n <div className=\"tp-branding\">\n Powered by <span className=\"tp-brand\">truConsent</span>\n </div>\n </div>\n </div>\n </>\n )}\n </>,\n document.body\n );\n}\n\nfunction TpDataSection({ title, items, uid }) {\n const [open, setOpen] = useState(false);\n if (!items || items.length === 0) return null;\n return (\n <div className=\"tp-data-section\">\n <button type=\"button\" className=\"tp-section-btn\" onClick={() => setOpen(o => !o)}>\n <span className=\"tp-section-count\">{items.length}</span>\n <span className=\"tp-section-label\">{title}</span>\n <svg className={`tp-chevron${open ? ' open' : ''}`} width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ transform: open ? 'rotate(180deg)' : 'none', transition: 'transform 0.2s' }}>\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n {open && (\n <div className=\"tp-pill-row\">\n {items.map((item, i) => <span key={i} className=\"tp-pill\" title={item.description || ''}>{item.name}</span>)}\n </div>\n )}\n </div>\n );\n}\n\nfunction _normalizeLayout(template) {\n const raw = (template || '').toString().trim().toLowerCase();\n if (raw === 'floating_bar' || raw === 'floating-bar' || raw === 'floating_card') return 'floating-card';\n if (raw === 'bottom_bar' || raw === 'bottombar') return 'bottom-bar';\n return raw || 'bottom-bar';\n}\n","\nimport React, { useState, useEffect, useMemo, useRef } from 'react';\nimport {\n Mail,\n Clock,\n Info,\n CheckCircle2,\n User,\n} from 'lucide-react';\nimport '../styles/RightCenter.css';\n \n /** Generate a simple session ID for metadata tracking */\n function generateSessionId() {\n return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\nconst DEFAULT_RIGHTS_CENTER_SETTINGS = {\n background_color: 'transparent',\n primary_text_color: '#111827',\n secondary_text_color: '#4b5563',\n button_color: '#65a30d',\n button_text_color: '#0b1120',\n font_family: 'sans-serif',\n show_consents_section: true,\n show_rights_section: true,\n show_nominees_section: true,\n show_transparency_section: false,\n show_dpo_section: false,\n show_grievance_section: true,\n grievance_mode: 'truconsent',\n grievance_external_url: '',\n consents_section_title: 'Consents',\n rights_section_title: 'Your Data Rights',\n nominees_section_title: 'Nominees',\n dpo_qualifications_enabled: true,\n dpo_responsibilities_enabled: true,\n dpo_working_hours_enabled: true,\n dpo_response_time_enabled: true,\n transparency_description: '',\n};\n\nconst unwrapDataPayload = (payload) => {\n if (!payload || typeof payload !== 'object') return null;\n if (payload.data && typeof payload.data === 'object') return payload.data;\n return payload;\n};\n\nconst normalizeRightsCenterSettings = (payload) => {\n const data = unwrapDataPayload(payload) || {};\n return {\n ...DEFAULT_RIGHTS_CENTER_SETTINGS,\n ...data,\n };\n};\n\nconst normalizeArrayResponse = (payload) => {\n if (Array.isArray(payload)) return payload;\n if (Array.isArray(payload?.data)) return payload.data;\n return [];\n};\n\nconst normalizeObjectResponse = (payload) => {\n if (payload && typeof payload === 'object' && payload.data && typeof payload.data === 'object') {\n return payload.data;\n }\n return payload && typeof payload === 'object' ? payload : null;\n};\n\nconst withQuery = (path, queryObj = {}) => {\n const entries = Object.entries(queryObj).filter(([, v]) => v !== null && v !== undefined && String(v) !== '');\n if (!entries.length) return path;\n const qs = new URLSearchParams(entries.map(([k, v]) => [k, String(v)])).toString();\n return `${path}?${qs}`;\n};\n\nconst firstDefined = (...values) => values.find((v) => v !== undefined && v !== null && v !== '');\n\nconst toReadableValue = (value, fallback = 'Not specified') => {\n if (value === undefined || value === null || value === '') return fallback;\n if (typeof value === 'string' || typeof value === 'number') return String(value);\n if (typeof value === 'object') {\n return String(firstDefined(value.label, value.name, value.title, value.value, value.id) ?? fallback);\n }\n return fallback;\n};\n\nconst normalizeConsentedValue = (value) => {\n if (value === true) return 'accepted';\n if (value === false) return 'declined';\n if (typeof value === 'string') {\n const normalized = value.toLowerCase();\n if (['accepted', 'approved', 'yes', 'true'].includes(normalized)) return 'accepted';\n if (['declined', 'rejected', 'no', 'false'].includes(normalized)) return 'declined';\n return value;\n }\n return value;\n};\n\nconst resolveExpiry = (purpose) =>\n toReadableValue(\n firstDefined(purpose?.expiry_period, purpose?.expiry_type, purpose?.expiry, purpose?.expiry_period_id),\n 'Not specified'\n );\n\nconst resolveProcessingActivity = (purpose) => {\n const activities = Array.isArray(purpose?.processingActivities || purpose?.processing_activities) ? (purpose.processingActivities || purpose.processing_activities) : [];\n if (activities.length > 0) {\n return activities.map(a => a.name || a.label || a.title || 'Unknown Activity').join(', ');\n }\n return toReadableValue(\n firstDefined(\n purpose?.processing_activity,\n purpose?.processingActivity,\n purpose?.activity\n ),\n 'Not specified'\n );\n};\n\nconst formatDateValue = (value) => {\n if (!value) return 'Not available';\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleDateString();\n};\n\nconst getPurposeDataElements = (purpose) => {\n const elements = Array.isArray(purpose?.dataElements || purpose?.data_elements) ? (purpose.dataElements || purpose.data_elements) : [];\n return elements\n .map((el) => ({\n label:\n (typeof el === 'string' || typeof el === 'number'\n ? String(el)\n : el?.name || el?.label || el?.title || String(el?.id || '')),\n description: el?.description || '',\n }))\n .filter((el) => el.label);\n};\n\nconst hexToRgba = (hex, alpha) => {\n if (typeof hex !== 'string') return null;\n const clean = hex.replace('#', '').trim();\n if (![3, 6].includes(clean.length)) return null;\n const full = clean.length === 3 ? clean.split('').map((ch) => ch + ch).join('') : clean;\n const intVal = Number.parseInt(full, 16);\n if (Number.isNaN(intVal)) return null;\n const r = (intVal >> 16) & 255;\n const g = (intVal >> 8) & 255;\n const b = intVal & 255;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n};\n\nexport default function RightCenter({ userId, apiKey, organizationId, apiUrl, apiBaseUrl, assetId, authToken }) {\n\n const [rightsCenterSettings, setRightsCenterSettings] = useState(DEFAULT_RIGHTS_CENTER_SETTINGS);\n const [activeTab, setActiveTab] = useState('Consent');\n const [isInitializing, setIsInitializing] = useState(true);\n const responseCacheRef = useRef(new Map());\n const noticeLoggedAtRef = useRef(Date.now());\n const userInteractionAtRef = useRef(null);\n\n // auth headers for backend (tenant-aware)\n const authHeaders = {};\n if (apiKey) authHeaders['X-API-Key'] = apiKey;\n if (organizationId) authHeaders['X-Org-Id'] = organizationId;\n if (userId) authHeaders['X-User-Id'] = userId;\n if (authToken) authHeaders['Authorization'] = `Bearer ${authToken}`;\n\n // --- DPO Info ---\n const [dpoInfo, setDpoInfo] = useState(null);\n\n // --- Nominees ---\n const [nominees, setNominees] = useState([]);\n const [editing, setEditing] = useState(false);\n const [nomineeForm, setNomineeForm] = useState({\n nominee_name: '',\n relationship: '',\n nominee_email: '',\n nominee_mobile: '',\n purpose_of_appointment: '',\n });\n\n const nominee = nominees[0] || null;\n\n // --- Grievance Tickets ---\n const [tickets, setTickets] = useState([]);\n const [showGrievanceForm, setShowGrievanceForm] = useState(false);\n const [grievanceForm, setGrievanceForm] = useState({\n subject: '',\n category: '',\n description: '',\n });\n\n const tabs = useMemo(() => {\n const tabConfig = [\n { label: 'Consent', enabled: rightsCenterSettings.show_consents_section },\n { label: 'Rights', enabled: rightsCenterSettings.show_rights_section },\n { label: 'Nominee', enabled: rightsCenterSettings.show_nominees_section },\n { label: 'Grievance', enabled: rightsCenterSettings.show_grievance_section },\n { label: 'Transparency', enabled: rightsCenterSettings.show_transparency_section },\n { label: 'DPO', enabled: rightsCenterSettings.show_dpo_section },\n ];\n return tabConfig.filter((tab) => tab.enabled !== false).map((tab) => tab.label);\n }, [rightsCenterSettings]);\n\n useEffect(() => {\n if (!tabs.includes(activeTab)) {\n setActiveTab(tabs[0] || 'Consent');\n }\n }, [activeTab, tabs]);\n\n const rcThemeVars = useMemo(\n () => {\n const bg = rightsCenterSettings.background_color || '#020617';\n const primaryText = rightsCenterSettings.primary_text_color || '#e5e7eb';\n const secondaryText = rightsCenterSettings.secondary_text_color || '#9ca3af';\n const primary = rightsCenterSettings.button_color || '#65a30d';\n const buttonText = rightsCenterSettings.button_text_color || '#0b1120';\n\n return {\n '--banner-card-bg': bg,\n '--banner-bg': bg,\n '--banner-hover-bg': hexToRgba(primaryText, 0.08) || 'rgba(255, 255, 255, 0.06)',\n '--banner-text': primaryText,\n '--banner-text-muted': secondaryText,\n '--banner-primary-color': primary,\n '--banner-border': hexToRgba(secondaryText, 0.45) || 'rgba(107, 114, 128, 0.45)',\n '--banner-info-bg': hexToRgba(primary, 0.12) || 'rgba(101, 163, 13, 0.12)',\n '--banner-info-border': hexToRgba(primary, 0.25) || 'rgba(101, 163, 13, 0.25)',\n '--banner-success-bg': 'rgba(34, 197, 94, 0.18)',\n '--banner-success-text': '#166534',\n '--banner-danger-bg': 'rgba(239, 68, 68, 0.18)',\n '--banner-danger-text': '#991b1b',\n '--banner-danger-btn': '#dc2626',\n '--banner-danger-btn-hover': '#b91c1c',\n '--banner-warning-bg': 'rgba(245, 158, 11, 0.12)',\n '--banner-warning-border': 'rgba(245, 158, 11, 0.28)',\n '--banner-warning-text': '#fbbf24',\n '--banner-overlay': 'rgba(2, 6, 23, 0.72)',\n '--font-type': rightsCenterSettings.font_family || 'sans-serif',\n '--rc-btn-text': buttonText,\n };\n },\n [rightsCenterSettings]\n );\n\n const cloneJson = (value) => {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch (_e) {\n return value;\n }\n };\n\n const getJson = async (path, options = {}) => {\n const bypassCache = !!options.bypassCache;\n const base = apiUrl || apiBaseUrl || '';\n const url = `${base}${path}`;\n const cacheKey = `GET:${url}`;\n\n if (!bypassCache && responseCacheRef.current.has(cacheKey)) {\n return cloneJson(responseCacheRef.current.get(cacheKey));\n }\n\n let res;\n try {\n res = await fetch(url, { headers: authHeaders });\n } catch (error) {\n throw error;\n }\n\n if (!res.ok) {\n throw new Error(`GET failed (${res.status}) for ${path}`);\n }\n\n const payload = await res.json();\n if (!bypassCache) {\n responseCacheRef.current.set(cacheKey, cloneJson(payload));\n }\n return payload;\n };\n\n const fetchRightsCenterSettings = async () => {\n const query = assetId ? `?asset_id=${encodeURIComponent(assetId)}` : '';\n const base = apiUrl || apiBaseUrl || '';\n if (!base) return;\n\n const candidates = [`${base}/api/v1/internal/rights-center/settings/global${query}`];\n\n let lastError = null;\n\n for (const url of candidates) {\n let res;\n try {\n res = await fetch(url, { headers: authHeaders });\n } catch (e) {\n lastError = e;\n continue;\n }\n\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n throw new Error(`GET failed (${res.status}) for rights center settings`);\n }\n lastError = new Error(`GET failed (${res.status}) for rights center settings`);\n continue;\n }\n\n const payload = await res.json();\n setRightsCenterSettings(normalizeRightsCenterSettings(payload));\n return;\n }\n\n if (lastError) throw lastError;\n };\n\n const fetchRightsTabData = async () => {\n await Promise.allSettled([\n getJson('/api/v1/internal/dpo')\n .then((payload) => setDpoInfo(normalizeObjectResponse(payload))),\n getJson(`/api/v1/internal/nominee/user/${userId}`)\n .then((payload) => setNominees(normalizeArrayResponse(payload))),\n getJson(`/api/v1/internal/grievance/user/${userId}`)\n .then((payload) => setTickets(normalizeArrayResponse(payload))),\n ]);\n };\n\n const requestApi = async (method, path, payload = null) => {\n const base = apiUrl || apiBaseUrl || '';\n const url = `${base}${path}`;\n let res;\n\n try {\n res = await fetch(url, {\n method,\n headers: payload ? { 'Content-Type': 'application/json', ...authHeaders } : authHeaders,\n body: payload ? JSON.stringify(payload) : undefined,\n });\n } catch (e) {\n throw e;\n }\n\n if (!res) {\n throw new Error(`No response for ${path}`);\n }\n\n if (!res.ok) {\n let detail = '';\n try {\n const body = await res.json();\n detail = body?.detail ? `: ${body.detail}` : '';\n } catch (_e) {\n // Ignore response parse issues and fall back to status-only error.\n }\n throw new Error(`Request failed (${res.status}) for ${path}${detail}`);\n }\n\n return res;\n };\n\n // ------ Handlers ------\n\n const handleNomineeSubmit = e => {\n e.preventDefault();\n const payload = { user_id: userId, client_user_id: userId, ...nomineeForm };\n\n const method = nominee && editing ? 'PUT' : 'POST';\n const path = nominee && editing ? `/api/v1/internal/nominee/${nominee.id}` : '/api/v1/internal/nominee';\n\n requestApi(method, path, payload)\n .then(() => getJson(`/api/v1/internal/nominee/user/${userId}`, { bypassCache: true }))\n .then(payload => {\n setNominees(normalizeArrayResponse(payload));\n setEditing(false);\n setNomineeForm({\n nominee_name: '',\n relationship: '',\n nominee_email: '',\n nominee_mobile: '',\n purpose_of_appointment: '',\n });\n })\n .catch(console.error);\n };\n\n const handleDeleteNominee = () => {\n if (!nominee) return;\n requestApi('DELETE', `/api/v1/internal/nominee/${nominee.id}`)\n .then(() => {\n // Clear cache and re-fetch\n return getJson(`/api/v1/internal/nominee/user/${userId}`, { bypassCache: true });\n })\n .then(payload => setNominees(normalizeArrayResponse(payload)))\n .catch(console.error);\n };\n\n const handleGrievanceSubmit = (e) => {\n e.preventDefault();\n const payload = {\n client_user_id: userId,\n subject: grievanceForm.subject,\n category: grievanceForm.category,\n description: grievanceForm.description,\n };\n requestApi('POST', '/api/v1/internal/grievance', payload)\n .then((r) => r.json())\n .then((t) => {\n setTickets((prev) => [t, ...prev]);\n setShowGrievanceForm(false);\n setGrievanceForm({ subject: '', category: '', description: '' });\n })\n .catch(console.error);\n };\n\n\n // Consent tab state\n const [consents, setConsents] = useState([]);\n const [initialConsents, setInitialConsents] = useState({}); // { purposeId: status }\n const [consentsLoading, setConsentsLoading] = useState(true);\n const [dirty, setDirty] = useState(false);\n const [showSaveModal, setShowSaveModal] = useState(false);\n\n // Rights / deletion modal state\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [showAccessModal, setShowAccessModal] = useState(false);\n const [deleteConfirmed, setDeleteConfirmed] = useState(false);\n const [accessConfirmed, setAccessConfirmed] = useState(false);\n\n // Grievance tab state\n const [showForm, setShowForm] = useState(false);\n const [changedPurposeIds, setChangedPurposeIds] = useState(new Set());\n \n // --- Auditing State ---\n const [sessionId] = useState(() => generateSessionId());\n \n\n const normalizeStatus = (val) => {\n if (val === 'accepted' || val === 'declined') return val;\n if (val === 'approved') return 'accepted';\n if (val === 'rejected') return 'declined';\n if (typeof val === 'boolean') return val ? 'accepted' : 'declined';\n if (typeof val === 'string') {\n const v = val.toLowerCase();\n if (v === 'yes' || v === 'true') return 'accepted';\n if (v === 'no' || v === 'false') return 'declined';\n }\n return val; // could be 'pending' or undefined\n };\n\n // Fetch all purposes (via banners) and merge with latest user status overview\n const fetchUserConsents = async (options = {}) => {\n const bypassCache = !!options.bypassCache;\n setConsentsLoading(true);\n try {\n const assetQuery = assetId ? { asset_id: assetId } : {};\n \n // 1. Fetch ALL banners for this asset (the template)\n const bannersData = await getJson(withQuery('/api/v1/internal/consent', assetQuery), { bypassCache });\n const allBanners = normalizeArrayResponse(bannersData);\n\n // 2. Fetch the latest user status overview\n const userStatusData = await getJson(withQuery('/api/v1/internal/consent/user-consent-status', { userId }), { bypassCache });\n const userOverview = userStatusData?.collectionPoints || [];\n\n // 3. Create a unique map of purposes\n const uniquePurposesMap = new Map();\n\n // Seed from template banners\n allBanners.forEach(banner => {\n (banner.purposes || []).forEach(p => {\n const pid = String(p.id || '');\n const status = String(p.status || '').toLowerCase();\n if (!pid || status !== 'active') return;\n\n if (!uniquePurposesMap.has(pid)) {\n const purposeType = String(p.purpose_type || '').toLowerCase();\n const isMandatory = (p.isMandatory || p.is_mandatory || purposeType.includes('mandatory'));\n\n uniquePurposesMap.set(pid, {\n ...p,\n id: pid,\n title: p.name,\n consented: normalizeStatus(p.consented) || 'declined',\n timestamp: 0,\n type: isMandatory ? 'Mandatory' : 'Optional',\n isLegitimate: !!(p.is_legitimate || p.isLegitimate),\n dataElements: p.data_elements || p.dataElements || [],\n processingActivities: p.processing_activities || p.processingActivities || [],\n });\n }\n });\n });\n\n // Merge results from the DB overview\n userOverview.forEach(cp => {\n const pcList = cp.latest_consent?.purpose_consents || cp.latestConsent?.purposeConsents || [];\n const logTimestamp = new Date(cp.latest_consent?.timestamp || cp.latestConsent?.timestamp || 0).getTime();\n \n pcList.forEach(pc => {\n const pid = String(pc.purpose_id || pc.id || pc.purposeId || '');\n const status = normalizeStatus(pc.status || pc.consented);\n if (!pid) return;\n\n let entry = uniquePurposesMap.get(pid);\n if (entry) {\n // Only update if this log is newer than what we have\n if (logTimestamp > entry.timestamp) {\n entry.consented = status;\n entry.timestamp = logTimestamp;\n \n // Use enriched metadata from backend if available\n const de = pc.data_elements || pc.dataElements;\n if (de && de.length > 0) {\n entry.dataElements = de;\n }\n const pa = pc.processing_activities || pc.processingActivities;\n if (pa && pa.length > 0) {\n entry.processingActivities = pa;\n }\n if (pc.description) {\n entry.description = pc.description;\n }\n if (pc.name || pc.title) {\n entry.name = pc.name || pc.title;\n entry.title = pc.name || pc.title;\n }\n }\n }\n });\n });\n\n const items = Array.from(uniquePurposesMap.values());\n setConsents(items);\n const initialMap = {};\n items.forEach(it => {\n initialMap[it.id] = it.consented;\n });\n setInitialConsents(initialMap);\n setChangedPurposeIds(new Set());\n setDirty(false);\n } catch (e) {\n console.error('Error fetching user consents:', e);\n } finally {\n setConsentsLoading(false);\n }\n };\n\n useEffect(() => {\n noticeLoggedAtRef.current = Date.now();\n userInteractionAtRef.current = null;\n }, [userId, assetId]);\n\n useEffect(() => {\n let isActive = true;\n\n const bootstrap = async () => {\n setIsInitializing(true);\n responseCacheRef.current.clear();\n\n await Promise.allSettled([\n fetchRightsCenterSettings(),\n fetchRightsTabData(),\n fetchUserConsents({ bypassCache: true }),\n ]);\n\n if (isActive) {\n setIsInitializing(false);\n }\n };\n\n bootstrap().catch(console.error);\n return () => {\n isActive = false;\n };\n }, [userId, apiUrl, apiBaseUrl, apiKey, organizationId, assetId, authToken]);\n\n const handleToggle = (purposeId) => {\n if (!userInteractionAtRef.current) {\n userInteractionAtRef.current = Date.now();\n }\n \n let newValue;\n setConsents((prev) =>\n prev.map((c) => {\n if (c.id === purposeId) {\n newValue = c.consented === 'accepted' ? 'declined' : 'accepted';\n return { ...c, consented: newValue };\n }\n return c;\n })\n );\n\n setChangedPurposeIds((prev) => {\n const next = new Set(prev);\n if (newValue !== initialConsents[purposeId]) {\n next.add(purposeId);\n } else {\n next.delete(purposeId);\n }\n setDirty(next.size > 0);\n return next;\n });\n };\n\n const handleSave = async () => {\n try {\n if (!userId) {\n throw new Error('Cannot save consent: userId is required');\n }\n if (!organizationId) {\n throw new Error('Cannot save consent: organizationId (X-Org-Id) is required');\n }\n\n // Only include purposes that were actually toggled by the user\n const uniquePurposesMap = new Map();\n consents.forEach((c) => {\n if (changedPurposeIds.has(c.id) && !uniquePurposesMap.has(c.id)) {\n uniquePurposesMap.set(c.id, {\n id: c.id,\n name: c.name,\n consented: normalizeConsentedValue(c.consented),\n });\n }\n });\n\n const purposesToSave = Array.from(uniquePurposesMap.values());\n\n if (purposesToSave.length === 0) {\n setChangedPurposeIds(new Set());\n setDirty(false);\n return;\n }\n\n // Action is either 'approved' if any purpose is accepted, or 'revoked' if all are declined.\n const hasApproval = purposesToSave.some(\n (p) => p.consented === 'accepted'\n );\n const action = hasApproval ? 'approved' : 'revoked';\n\n \n const now = Date.now();\n const payload = {\n userId,\n purposes: purposesToSave,\n action,\n assetId,\n source: 'right center npm',\n metadata: {\n button_used: 'save',\n interaction_type: 'rights_center',\n logged_at: new Date().toISOString(),\n session_id: sessionId,\n notice_logged_at: noticeLoggedAtRef.current,\n user_interaction_at: userInteractionAtRef.current,\n performance: {\n interaction_to_save_ms: (noticeLoggedAtRef.current && userInteractionAtRef.current) \n ? (now - userInteractionAtRef.current) : null\n }\n }\n };\n\n // Purpose-based save to truAPI backend endpoint\n await requestApi('POST', '/api/v1/internal/consent/rights-center', payload);\n\n // Reset baseline state and re-fetch to ensure sync\n setChangedPurposeIds(new Set());\n setDirty(false);\n setShowSaveModal(true);\n await fetchUserConsents({ bypassCache: true });\n } catch (e) {\n console.error(e);\n setShowSaveModal(false);\n alert(\"Failed to save consent preferences. Please try again.\");\n }\n };\n\n const createRightsRequest = async (type) => {\n if (type === 'access') {\n await requestApi('POST', '/api/v1/internal/rights-requests/access-request', {\n user_id: userId,\n subject: 'Data Access Request',\n description: 'User requested access to personal data from Rights Center.',\n metadata: {\n asset_id: assetId,\n source: 'Rights Center',\n },\n });\n return;\n }\n\n await requestApi('POST', '/api/v1/internal/rights-requests/deletion-request', {\n user_id: userId,\n reason: 'User requested data deletion from Rights Center',\n metadata: {\n asset_id: assetId,\n requested_at: new Date().toISOString(),\n source: 'Rights Center',\n },\n });\n };\n\n const handleAccessRequest = async () => {\n try {\n await createRightsRequest('access');\n setAccessConfirmed(true);\n setTimeout(() => {\n setShowAccessModal(false);\n }, 1500);\n } catch (error) {\n console.error('Error submitting access request:', error);\n alert('Failed to submit access request. Please try again later.');\n }\n };\n\n const handleDeleteRequest = async () => {\n try {\n await createRightsRequest('delete');\n\n setDeleteConfirmed(true);\n setTimeout(() => {\n setShowDeleteModal(false);\n }, 1500);\n } catch (error) {\n console.error('Error submitting deletion request:', error);\n alert('Failed to submit deletion request. Please try again later.');\n }\n };\n\n return (\n <div className=\"rc-container\" style={rcThemeVars}>\n {isInitializing && (\n <div className=\"rc-initial-loader\" role=\"status\" aria-live=\"polite\">\n <div className=\"rc-spinner\" />\n <span>Loading Rights Center...</span>\n </div>\n )}\n\n {!isInitializing && (\n <React.Fragment>\n {/* Tabs Navigation */}\n <nav className=\"rc-tabs\">\n {tabs.map((tab) => (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n disabled={consentsLoading && consents.length === 0}\n className={`rc-tab ${activeTab === tab ? 'rc-tab-active' : ''}`}\n >\n {tab}\n </button>\n ))}\n </nav>\n\n {/* ------------------ CONSENT TAB ------------------ */}\n {activeTab === 'Consent' && (\n <div className=\"rc-content\">\n <div className=\"rc-section-header\">\n <h2 className=\"rc-section-title\">{rightsCenterSettings.consents_section_title || 'Manage your Consents here!'}</h2>\n {dirty && (\n <button className=\"rc-btn-primary\" onClick={() => handleSave()}>\n Save Changes\n </button>\n )}\n </div>\n {showSaveModal && (\n <div className=\"rc-modal-overlay\">\n <div className=\"rc-modal rc-modal-small\">\n <div className=\"rc-modal-success\">\n <CheckCircle2 className=\"rc-success-icon\" />\n <h3 className=\"rc-modal-title\">Changes Saved</h3>\n <p className=\"rc-modal-subtitle\">Your consent preferences have been updated.</p>\n <div className=\"rc-modal-actions\">\n <button className=\"rc-btn-primary\" onClick={() => setShowSaveModal(false)}>OK</button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {consentsLoading && (\n <div className=\"rc-empty-state\">\n <Info className=\"rc-empty-state-icon\" />\n Loading consents...\n </div>\n )}\n\n {!consentsLoading && consents.length > 0 && (\n <div className=\"rc-consent-list\">\n {consents.map((p) => {\n const elements = getPurposeDataElements(p);\n const dataElementsText = elements.length > 0\n ? elements.map(el => el.label).join(', ')\n : 'Not specified';\n \n const activitiesText = resolveProcessingActivity(p);\n \n const consentedAccepted = normalizeConsentedValue(p.consented) === 'accepted';\n\n return (\n <div key={p.id} className=\"rc-consent-item\">\n <div className=\"rc-consent-card-row rc-consent-card-row-top\">\n <div className=\"rc-consent-purpose-block\">\n <h3 className=\"rc-consent-title\">{p.name || p.title}</h3>\n <span className={`rc-badge ${p.type === 'Mandatory' ? 'rc-badge-mandatory' : 'rc-badge-optional'}`}>\n {p.type === 'Mandatory' ? 'Necessary' : 'Optional'}\n </span>\n {p.isLegitimate && (\n <span className=\"rc-badge rc-badge-legitimate\">\n Legitimate Interest\n </span>\n )}\n </div>\n\n <div className=\"rc-consent-meta-block\">\n <span className=\"rc-detail-label\">Expiry Period:</span>{' '}\n <span className=\"rc-detail-value\">{resolveExpiry(p)}</span>\n </div>\n\n <div className=\"rc-consent-toggle-wrap\">\n {!p.isLegitimate && (\n <label className=\"rc-switch\">\n <input\n type=\"checkbox\"\n checked={consentedAccepted}\n onChange={() => handleToggle(p.id)}\n />\n <span className=\"rc-slider\"></span>\n </label>\n )}\n </div>\n </div>\n\n <div className=\"rc-consent-card-row rc-consent-card-row-middle\">\n <div className=\"rc-consent-meta-block\">\n <span className=\"rc-detail-label\">Processing Activity:</span>{' '}\n <span className=\"rc-detail-value\">{activitiesText}</span>\n </div>\n <div className=\"rc-status-item\">\n <span className=\"rc-status-label\">Consented:</span>\n <span className={`rc-status-pill rc-status-pill-consent ${consentedAccepted ? 'rc-status-yes' : 'rc-status-no'}`}>\n {consentedAccepted ? 'Yes' : 'No'}\n </span>\n </div>\n </div>\n\n {elements.length > 0 && (\n <div className=\"rc-consent-card-row rc-consent-card-row-bottom\">\n <span className=\"rc-detail-label\">Data Elements:</span>\n <div className=\"rc-pills-wrap\">\n {elements.map((el, i) => (\n <span key={i} className=\"rc-element-pill\">{el.label}</span>\n ))}\n </div>\n </div>\n )}\n \n {p.description && p.description !== p.name && p.description !== p.title && (\n <div className=\"rc-consent-description\">\n {p.description}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {!consentsLoading && consents.length === 0 && (\n <div className=\"rc-empty-state\">\n <Info className=\"rc-empty-state-icon\" />\n You currently have no consent records to display.\n </div>\n )}\n\n </div>\n )}\n\n {/* ------------------ RIGHTS TAB ------------------ */}\n {activeTab === 'Rights' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">{rightsCenterSettings.rights_section_title || 'Your Data Rights'}</h2>\n <p className=\"rc-section-subtitle\">You can access, correct, delete, or export your data.</p>\n\n <div className=\"rc-rights-actions\">\n <button className=\"rc-btn-primary\" onClick={() => { setAccessConfirmed(false); setShowAccessModal(true); }}>\n Request to Access My Data\n </button>\n <button className=\"rc-btn-primary\" onClick={() => setShowDeleteModal(true)}>\n Request to Delete My Data\n </button>\n </div>\n\n {showAccessModal && (\n <div className=\"rc-modal-overlay\">\n <div className=\"rc-modal rc-modal-small\">\n {!accessConfirmed ? (\n <div className=\"rc-modal-content\">\n <Info className=\"rc-warning-icon\" />\n <h3 className=\"rc-modal-title\">Confirm Access Request</h3>\n <p className=\"rc-modal-subtitle\">\n Submit request to access your data?\n </p>\n <div className=\"rc-modal-actions\">\n <button className=\"rc-btn-primary\" onClick={handleAccessRequest}>\n Confirm Request\n </button>\n <button className=\"rc-btn-secondary\" onClick={() => setShowAccessModal(false)}>\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <div className=\"rc-modal-success\">\n <CheckCircle2 className=\"rc-success-icon\" />\n <h3 className=\"rc-modal-title\">Request Submitted</h3>\n <p className=\"rc-modal-subtitle\">Your access request has been submitted successfully.</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {showDeleteModal && (\n <div className=\"rc-modal-overlay\">\n <div className=\"rc-modal rc-modal-small\">\n {!deleteConfirmed ? (\n <div className=\"rc-modal-content\">\n <Info className=\"rc-warning-icon\" />\n <h3 className=\"rc-modal-title\">Confirm Data Deletion</h3>\n <p className=\"rc-modal-subtitle\">\n Are you sure you want to request data deletion? This action cannot be undone.\n </p>\n <div className=\"rc-modal-actions\">\n <button className=\"rc-btn-danger\" onClick={handleDeleteRequest}>\n Confirm Deletion\n </button>\n <button className=\"rc-btn-secondary\" onClick={() => setShowDeleteModal(false)}>\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <div className=\"rc-modal-success\">\n <CheckCircle2 className=\"rc-success-icon\" />\n <h3 className=\"rc-modal-title\">Request Submitted</h3>\n <p className=\"rc-modal-subtitle\">Your data deletion request has been submitted successfully!</p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* ------------------ TRANSPARENCY TAB ------------------ */}\n {activeTab === 'Transparency' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">Transparency</h2>\n <p className=\"rc-section-subtitle\">Learn how we collect, use, and protect your data</p>\n <p className=\"rc-transparency-text\">\n {rightsCenterSettings.transparency_description ||\n \"We collect your data to provide better services and comply with regulations. Your data is stored securely and used only for the purposes you've consented to.\"}\n </p>\n </div>\n )}\n\n {/* ------------------ DPO TAB ------------------ */}\n {activeTab === 'DPO' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">DPO Information</h2>\n\n <div className=\"rc-dpo-preview-list\">\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Full Name</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.full_name || 'Not available'}</p>\n </div>\n\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Email</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.email || 'Not available'}</p>\n </div>\n\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Appointment Date</div>\n <p className=\"rc-dpo-preview-value\">{formatDateValue(dpoInfo?.appointment_date)}</p>\n </div>\n\n {rightsCenterSettings.dpo_qualifications_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Qualifications</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.qualifications || 'Not available'}</p>\n </div>\n )}\n\n {rightsCenterSettings.dpo_responsibilities_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Responsibilities</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.responsibilities || 'Not available'}</p>\n </div>\n )}\n\n {rightsCenterSettings.dpo_working_hours_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Working Hours</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.working_hours || 'Not available'}</p>\n </div>\n )}\n\n {rightsCenterSettings.dpo_response_time_enabled && (\n <div className=\"rc-dpo-preview-item\">\n <div className=\"rc-dpo-preview-label\">Response Time</div>\n <p className=\"rc-dpo-preview-value\">{dpoInfo?.response_time || 'Not available'}</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* ------------------ NOMINEE TAB ------------------ */}\n {activeTab === 'Nominee' && (\n <div className=\"rc-content\">\n <h2 className=\"rc-section-title\">{rightsCenterSettings.nominees_section_title || 'Appoint Nominee'}</h2>\n <p className=\"rc-section-subtitle\">Appoint someone to manage your data rights on your behalf</p>\n\n <div className=\"rc-btn-primary\">\n <div className=\"rc-btn-title\">⚠️</div>\n <p>Your nominee will be able to exercise all data rights on your behalf.</p>\n </div>\n\n {nominee && !editing ? (\n <div className=\"rc-nominee-details-grid\">\n <div className=\"rc-nominee-item\">\n <User className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Name</span>\n <span className=\"rc-nominee-value\">{nominee.nominee_name}</span>\n </div>\n </div>\n\n <div className=\"rc-nominee-item\">\n <User className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Relationship</span>\n <span className=\"rc-nominee-value\">{nominee.relationship}</span>\n </div>\n </div>\n\n <div className=\"rc-nominee-item\">\n <Mail className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Email</span>\n <span className=\"rc-nominee-value\">{nominee.nominee_email}</span>\n </div>\n </div>\n\n <div className=\"rc-nominee-item\">\n <Clock className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Mobile</span>\n <span className=\"rc-nominee-value\">{nominee.nominee_mobile}</span>\n </div>\n </div>\n\n {nominee.purpose_of_appointment && (\n <div className=\"rc-nominee-item rc-nominee-fullwidth\">\n <Info className=\"rc-nominee-icon\" />\n <div>\n <span className=\"rc-nominee-label\">Purpose of Appointment</span>\n <span className=\"rc-nominee-value\">{nominee.purpose_of_appointment}</span>\n </div>\n </div>\n )}\n\n <div className=\"rc-nominee-actions-fullwidth\">\n <button className=\"rc-btn-primary\" onClick={() => {\n setEditing(true);\n setNomineeForm({\n nominee_name: nominee.nominee_name || '',\n relationship: nominee.relationship || '',\n nominee_email: nominee.nominee_email || '',\n nominee_mobile: nominee.nominee_mobile || '',\n purpose_of_appointment: nominee.purpose_of_appointment || ''\n });\n }}>\n Edit\n </button>\n <button className=\"rc-btn-danger\" onClick={handleDeleteNominee}>Delete</button>\n </div>\n </div>\n ) : (\n <form className=\"rc-nominee-form\" onSubmit={handleNomineeSubmit}>\n <div className=\"rc-form-row\">\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Name *</label>\n <input\n type=\"text\"\n className=\"rc-form-input\"\n placeholder=\"Full name of nominee\"\n value={nomineeForm.nominee_name}\n onChange={e => setNomineeForm({ ...nomineeForm, nominee_name: e.target.value })}\n required\n />\n </div>\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Relationship *</label>\n <select\n className=\"rc-form-select\"\n value={nomineeForm.relationship}\n onChange={e => setNomineeForm({ ...nomineeForm, relationship: e.target.value })}\n required\n >\n <option value=\"\">Select relationship</option>\n <option>Spouse</option>\n <option>Parent</option>\n <option>Child</option>\n <option>Sibling</option>\n <option>Other</option>\n </select>\n </div>\n </div>\n\n <div className=\"rc-form-row\">\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Email *</label>\n <input\n type=\"email\"\n className=\"rc-form-input\"\n placeholder=\"nominee@example.com\"\n value={nomineeForm.nominee_email}\n onChange={e => setNomineeForm({ ...nomineeForm, nominee_email: e.target.value })}\n required\n />\n </div>\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Mobile Number *</label>\n <input\n type=\"tel\"\n className=\"rc-form-input\"\n placeholder=\"+1234567890\"\n value={nomineeForm.nominee_mobile}\n onChange={e => setNomineeForm({ ...nomineeForm, nominee_mobile: e.target.value })}\n required\n />\n </div>\n </div>\n\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Purpose of Appointment</label>\n <textarea\n className=\"rc-form-textarea\"\n placeholder=\"Explain why you are appointing this nominee\"\n rows=\"4\"\n value={nomineeForm.purpose_of_appointment || ''}\n onChange={e => setNomineeForm({ ...nomineeForm, purpose_of_appointment: e.target.value })}\n />\n </div>\n\n <div className=\"rc-form-actions\">\n <button type=\"submit\" className=\"rc-btn-primary\">\n {editing ? 'Update Nominee' : 'Send Verification Code'}\n </button>\n {editing && (\n <button type=\"button\" className=\"rc-btn-secondary\" onClick={() => setEditing(false)}>\n Cancel\n </button>\n )}\n </div>\n </form>\n )}\n </div>\n )}\n\n {/* ------------------ GRIEVANCE TAB ------------------ */}\n {activeTab === 'Grievance' && (\n <div className=\"rc-content\">\n {rightsCenterSettings.grievance_mode === 'external' ? (\n <div>\n <h2 className=\"rc-section-title\">Grievance</h2>\n <p className=\"rc-section-subtitle\">Grievance requests are handled on your organization portal.</p>\n <button\n className=\"rc-btn-primary\"\n onClick={() => {\n if (rightsCenterSettings.grievance_external_url) {\n window.open(rightsCenterSettings.grievance_external_url, '_blank', 'noopener,noreferrer');\n }\n }}\n disabled={!rightsCenterSettings.grievance_external_url}\n >\n Open Grievance Portal\n </button>\n </div>\n ) : (\n <React.Fragment>\n <div className=\"rc-section-header\">\n <div>\n <h2 className=\"rc-section-title\">Grievance Tickets</h2>\n <p className=\"rc-section-subtitle\">Submit privacy concerns or view your existing tickets</p>\n </div>\n <button className=\"rc-btn-primary\" onClick={() => setShowForm(!showForm)}>\n Create New Ticket\n </button>\n </div>\n\n {showForm && (\n <form className=\"rc-grievance-form\" onSubmit={(e) => {\n handleGrievanceSubmit(e);\n setShowForm(false);\n }}>\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Subject *</label>\n <input\n type=\"text\"\n className=\"rc-form-input\"\n placeholder=\"Brief description of your concern\"\n value={grievanceForm.subject}\n onChange={(e) => setGrievanceForm({ ...grievanceForm, subject: e.target.value })}\n required\n />\n </div>\n\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Category *</label>\n <select\n className=\"rc-form-select\"\n value={grievanceForm.category}\n onChange={(e) => setGrievanceForm({ ...grievanceForm, category: e.target.value })}\n required\n >\n <option value=\"\">Select category</option>\n <option value=\"Privacy Concern\">Privacy Concern</option>\n <option value=\"Data Access\">Data Access</option>\n <option value=\"Other\">Other</option>\n </select>\n </div>\n\n <div className=\"rc-form-group\">\n <label className=\"rc-form-label\">Description *</label>\n <textarea\n className=\"rc-form-textarea\"\n placeholder=\"Detailed description of your concern or request\"\n rows=\"4\"\n value={grievanceForm.description || ''}\n onChange={(e) => setGrievanceForm({ ...grievanceForm, description: e.target.value })}\n required\n />\n </div>\n\n <div className=\"rc-form-actions\">\n <button type=\"submit\" className=\"rc-btn-primary\">Submit Ticket</button>\n <button type=\"button\" className=\"rc-btn-secondary\" onClick={() => setShowForm(false)}>\n Cancel\n </button>\n </div>\n </form>\n )}\n\n <div className=\"rc-tickets-section\">\n <h3 className=\"rc-tickets-title\">Your Tickets</h3>\n {tickets.length === 0 ? (\n <div className=\"rc-empty-state\">\n <p>No tickets found. Create your first grievance ticket above.</p>\n </div>\n ) : (\n <div className=\"rc-ticket-list\">\n {tickets.map((ticket, index) => (\n <div key={index} className=\"rc-ticket-item\">\n <div className=\"rc-ticket-header\">\n <h4 className=\"rc-ticket-subject\">{ticket.subject}</h4>\n <span className=\"rc-ticket-status\">{ticket.status || 'Open'}</span>\n </div>\n <p className=\"rc-ticket-description\">{ticket.description}</p>\n <div className=\"rc-ticket-meta\">\n <span className=\"rc-ticket-meta-item\">Ticket: {ticket.ticket_id}</span>\n <span className=\"rc-ticket-meta-item\">Category: {ticket.category}</span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </React.Fragment>\n )}\n </div>\n )}\n </React.Fragment>\n )}\n </div>\n );\n}\n"],"names":["normalizePurposes","purposes","defaultSelection","normalized","map","p","rawPurpose","isLegitimate","is_legitimate","isMandatory","is_mandatory","_extends","legalBasis","withdrawable","frequency","consented","isDynamic","is_dynamic","normalizePurpose","Array","isArray","getPriority","concat","sort","a","b","sortPurposes","TranslationCtx","createContext","translate","text","selectedLanguage","availableLanguages","languageLabels","onLanguageChange","useTranslate","useContext","TranslationProvider","_ref","children","lang","snapshot","textMap","text_map","_useMemo","useMemo","_snapshot$languages","languages","length","langs","labels","forEach","_ref2","code","label","codes","l","includes","unshift","firstEntry","Object","values","snapshotLangs","keys","filter","lowerCaseMap","entries","_ref3","val","toLowerCase","_normLongKey","s","replace","trim","prefixMap","_ref4","key","prefix","slice","_textMap$text","_lowerCaseMap$text$to","exact","lower","_prefixMap$prefix","prefixVal","ctx","React","createElement","Provider","value","detectBannerCase","hasNotice","some","hasConsent","LanguagePicker","_useState","useState","open","setOpen","ref","useRef","useEffect","handleClickOutside","e","current","contains","target","document","addEventListener","removeEventListener","getLabel","Intl","DisplayNames","type","of","_unused","toUpperCase","getFallbackLabel","currentLabel","style","position","flexShrink","marginLeft","onClick","className","display","alignItems","gap","fontSize","fontWeight","padding","borderRadius","border","backgroundColor","color","cursor","whiteSpace","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","points","role","top","right","minWidth","maxHeight","overflowY","boxShadow","zIndex","isSelected","textAlign","onMouseEnter","currentTarget","onMouseLeave","ModernBannerHeader","_useContext","logoUrl","orgName","bannerTitle","disclaimerText","_useLanguage","translateWithOrg","title","disclaimer","showPicker","src","alt","wordBreak","borderColor","CollapsibleDataSection","items","isOpen","onToggle","_ref$chevronLeft","chevronLeft","translateDynamic","d","item","id","name","ModernPurposeCard","freq","purpose","banner","_ref$showNecessaryTag","showNecessaryTag","_ref$isUpdated","isUpdated","_ref$isNew","isNew","_ref$isRemoved","isRemoved","_ref$isExpired","isExpired","openSection","setOpenSection","isAccepted","isUUID","test","frequencyLabel","rawExpiry","expiryLabel","expiry_type","expiry","expiryPeriod","expiry_period","find","v","t","match","digits","unit","formatExpiryText","handleToggleSection","section","dataElements","data_elements","processingActivities","processing_activities","dataProcessors","legalEntities","legal_entities","tools","renderDiffInline","field","currentContent","diff","field_diff","fieldDiff","getDiffFor","old_value","oldValue","opacity","textDecoration","textTransform","letterSpacing","verticalAlign","lineHeight","description","activity","idx","maxWidth","overflow","textOverflow","checked","onChange","showProcessors","ModernBannerFooter","footerText","htmlContent","_","linkText","url","fullUrl","dangerouslySetInnerHTML","__html","ModernBannerActions","onRejectAll","onConsentAll","onAcceptSelected","onAcceptMandatory","actionButtonText","rejectAllText","rejectAllColor","acceptAllText","onlyNecessaryText","onlyNecessaryColor","_ref$purposes","_ref$isBottomReached","isBottomReached","_ref$hasUserInteracte","hasUserInteracted","_ref$isSplitLayout","isSplitLayout","_ref$showAcceptAll","showAcceptAll","_ref$minimal","minimal","anyOptionalAccepted","disabledClasses","buttonBase","splitLayoutContent","Fragment","disabled","defaultLayoutContent","GroupHeader","TabButton","isActive","badge","tabId","panelId","undefined","background","badgeColor","primaryColor","TabPanel","labelledBy","hidden","LegitimateUseContent","noticePurposes","ConsentPurposesContent","_ref5","allConsentPurposes","onChangePurpose","groups","g","group","gIdx","ReconsentContent","_ref6","versionDiff","reconsentUiMode","hasOtherTabs","isExpiryReconsent","reconsentSource","hasMixedExpiry","changedFields","changed_fields","effectiveMode","console","log","purposesToShow","changed_purpose_ids","changedPurposeIds","added_purpose_ids","addedPurposeIds","Boolean","marginBottom","marginTop","_ref7","new_value","String","removed_purposes","removedPurposes","rp","PurposeRow","settings","mandatoryLabel","CompactPurposeRow","isExpanded","toggleExpand","bannerSettings","_React$useState","openSections","setOpenSections","toggleSection","prev","_extends2","stopPropagation","join","elements","processors","registry","center_modal","_banner$purposes","_banner$purposes2","_banner$bannerSetting","companyName","secondaryColor","setIsBottomReached","scrollRef","finalPrimaryColor","finalSecondaryColor","_scrollRef$current","scrollHeight","clientHeight","fontType","fontFamily","onScroll","_e$target","scrollTop","warningMessage","cx","cy","r","x1","y1","x2","y2","savePreferencesColor","generalNoticeTemplate","tabbed_banner","_ref8","_tabs$","_tabs$2","_tabs$3","_tabs$4","_tabs$5","onAcknowledgeNotice","actionLoading","bannerCase","uiState","settingsOverride","reconsentCampaignId","reconsentOnly","expiryReconsentRequestId","isReconsentOnly","bannerId","endsWith","hasReconsent","_ref9","_ref9$noticePurposes","_ref9$consentPurposes","consentPurposes","tabs","x","push","buildTabs","reconsentTabIndex","findIndex","_useState2","activeTab","setActiveTab","styleVars","currentTab","isLastTab","isReconsentTab","isLegitimateTab","isPurposesTab","tabBar","tab","footerActions","justifyContent","noticeAcknowledgeText","scrollWarnings","preferences_modal","compact","savePreferencesText","floating_card","_banner$banner_settin","_banner$banner_settin2","onPersonalize","layoutClass","processPlaceholder","dynamicFooter","withLinks","banner_settings","banner_title","disclaimer_text","notice_only","onAcknowledge","acknowledgeText","logo_url","inline_single_row","isLoading","general_compact_list","expandedRows","setExpandedRows","_extends3","general_split_pane","_activePurpose$proces","_activePurpose$dataEl","_activePurpose$legalE","_activePurpose$tools","selectedPurposeId","setSelectedPurposeId","activePurpose","_catch","body","recover","result","then","_finallyRethrows","finalizer","bind","EMPTY_ARRAY","HCaseWarningPopup","onProceed","onBack","isHard","h_case_logging_strategy","popupMessage","h_case_warning_message","proceedText","h_case_proceed_button_text","backText","h_case_back_button_text","h_case_back_button_color","h_case_proceed_button_color","normalizeUrl","baseUrl","startsWith","TruConsentModal","props","_rawSettings$showProc","apiKey","organizationId","userId","assetId","apiUrl","apiBaseUrl","_props$theme","theme","_props$companyName","onClose","onSubmit","token","setBanner","setIsLoading","_useState3","fetchError","setFetchError","_useState4","visible","setVisible","_useState5","setSelectedLanguage","setShowFullNotice","_useState7","bannerFetchAt","setBannerFetchAt","fetchStartRef","_useState8","setReconsentCampaignId","_useState9","setReconsentUiMode","_useState0","setVersionDiff","_useState1","reconsentCampaignStatus","setReconsentCampaignStatus","_useState10","reconsentIsDedicatedCp","setReconsentIsDedicatedCp","_useState11","setReconsentSource","_useState12","setExpiryReconsentRequestId","closeButtonClickedRef","effectiveOrgId","_useState13","resolvedAssetId","setResolvedAssetId","resolvedCompanyName","organizationName","organization","effectiveBaseUrl","resolvedLogoUrl","warn","effectiveAssetId","JSON","parse","atob","split","asset_id","error","fetchUrl","path","bId","aId","uId","encodeURIComponent","headers","etagKey","cachedEtag","sessionStorage","getItem","cachedBannerKey","performance","now","fetch","res","status","Error","cached","ok","newEtag","get","setItem","json","stringify","data","fetchMs","toFixed","Date","reconsentMode","reconsentPurposes","consentStatus","bs","initializedPurposes","default_selection","msg","message","extraMeta","reconsent_campaign_id","expiry_reconsent_request_id","engine","_bannerData$bannerSet","bannerData","_ref$previousConsent","previousConsent","_ref$bannerFetchAt","_ref$bannerFetchStart","bannerFetchStart","_ref$extraMetadata","extraMetadata","bannerDisplayAt","setBannerDisplayAt","displayMs","requestId","crypto","randomUUID","sessionId","Math","random","toString","actionTakenRef","actionRunningRef","noticeLoggedAtRef","setActionLoading","setError","_useState6","show","action","intendedPurposes","hCaseData","setHCaseData","setHasUserInteracted","initialPurposes","c","purpose_id","filterDynamicPurposes","setPurposes","mandatoryConsentPurposes","optionalConsentPurposes","noticeOnly","consentOnly","isHCase","hasRequiredConsent","deriveUIState","buildHeaders","useCallback","sendNoticeShown","metadata","Promise","resolve","_temp3","_temp2","formattedNoticePurposes","purposeId","version","purpose_type","collectionPointVersion","noticeMetadata","event_type","banner_fetched_at","banner_displayed_at","payload","consentLanguage","collectionPointId","collectionPoint","consentTimestamp","source","_temp","method","keepalive","reject","sendSuppressionUpdate","purposePayload","declinedIds","declinedPurposeIds","sendLogEvent","rawPurposes","formattedPurposes","collection_point_version","user_interaction_at","notice_logged_at","_wasThrown","_result2","togglePurpose","newStatus","checkHCaseIntercept","customPurposes","targetPurposes","acceptAll","acceptedPurposes","enhancedMetadata","button_used","_wasThrown2","_result3","rejectAll","declinedPurposes","_wasThrown3","_result4","onlyNecessary","mandatoryPurposes","_wasThrown4","_result5","savePreferences","totalCount","acceptedCount","_wasThrown5","_result6","closeBanner","_temp4","noActionPurposes","acknowledgeNotice","_wasThrown6","_result7","handleHCaseProceed","finalAction","h_case_warning_shown","h_case_acknowledged","_wasThrown7","_result8","handleHCaseBack","actions","hCaseActions","useConsentEngine","rawBannerSettings","activeBanner","close","handleAcceptAll","handleRejectAll","handleOnlyNecessary","handleSavePreferences","handleAcknowledgeNotice","handleLanguageChange","rawSettings","footer_text","primary_color","secondary_color","font_type","font_size","action_button_text","reject_all_text","reject_all_color","accept_all_text","only_necessary_text","only_necessary_color","show_processors","general_notice_template","notice_acknowledge_text","mandatory_label","rawTemplateKey","templateKey","themeClass","ReactDOM","createPortal","TemplateComponent","content","translationsSnapshot","translations_snapshot","wrapperStyle","TruConsent","STORAGE_KEY","_getCookie","_step","_iterator","_createForOfIteratorHelperLoose","cookie","done","decodeURIComponent","loadConsent","raw","_unused2","KNOWN_STORAGE_KEYS","ensureGtag","window","dataLayer","gtag","arguments","isKnown","applyDecision","granted","setConsentDefaults","config","categories","_config$category_deta2","defaults","analytics_storage","ad_storage","ad_user_data","ad_personalization","functionality_storage","personalization_storage","security_storage","wait_for_update","category_details","_step2","_iterator2","cat","gtag_storage_key","is_essential","default_state","analytics","site_performance","ads","advertising","marketing","functionality","security","buildDefaults","updateConsentMode","consentState","_config$category_deta","update","slug","prototype","hasOwnProperty","call","personalization","preferences","buildUpdate","event","tru_consent","TruCookieConsent","orgId","setConfig","showPreferences","setShowPreferences","categoryState","setCategoryState","configRef","h","buildCategories","cfg","overrides","cats","_overrides$cat$slug","buildAllGranted","buildAllDenied","logConsent","timestamp","toISOString","user_agent","navigator","userAgent","applyConsent","setTime","getTime","COOKIE_DAYS","toUTCString","truCookieConsent","openSettings","hasConsented","reset","getCategories","_loadConsent","stored","handleAcceptMandatory","allOptional","allAccepted","every","noneAccepted","handleTogglePurpose","accepted","_cfg$category_details","layout","template","side","btnAccept","primary","btnReject","settingsColor","btnSettings","settingsText","categoryDetails","modalTitle","settings_text","company_name","banner_message","bg","cardBg","el","classList","setTimeout","add","accept_text","reject_text","href","privacy_policy_url","rel","cookie_policy_url","show_powered_by","preferences_template","isEssential","isChecked","TpDataSection","uid","o","transform","transition","i","_iteratorSymbol","Symbol","iterator","_settle","pact","state","_Pact","observer","onFulfilled","onRejected","this","callback","_this","_isSettledPact","thenable","DEFAULT_RIGHTS_CENTER_SETTINGS","background_color","primary_text_color","secondary_text_color","button_color","button_text_color","font_family","show_consents_section","show_rights_section","show_nominees_section","show_transparency_section","show_dpo_section","show_grievance_section","grievance_mode","grievance_external_url","consents_section_title","rights_section_title","nominees_section_title","dpo_qualifications_enabled","dpo_responsibilities_enabled","dpo_working_hours_enabled","dpo_response_time_enabled","transparency_description","normalizeArrayResponse","withQuery","queryObj","qs","URLSearchParams","firstDefined","toReadableValue","fallback","_firstDefined","normalizeConsentedValue","hexToRgba","hex","alpha","clean","full","ch","intVal","Number","parseInt","isNaN","RightCenter","authToken","rightsCenterSettings","setRightsCenterSettings","isInitializing","setIsInitializing","responseCacheRef","Map","userInteractionAtRef","authHeaders","dpoInfo","setDpoInfo","nominees","setNominees","editing","setEditing","nominee_name","relationship","nominee_email","nominee_mobile","purpose_of_appointment","nomineeForm","setNomineeForm","nominee","tickets","setTickets","setShowGrievanceForm","subject","category","grievanceForm","setGrievanceForm","enabled","rcThemeVars","primaryText","secondaryText","buttonText","cloneJson","_e","getJson","options","_result","bypassCache","set","cacheKey","_exit","has","_fetch","fetchRightsCenterSettings","_exit2","_temp6","lastError","query","base","_temp5","check","step","_cycle","next","_fixup","TypeError","array","_forTo","_forOf","unwrapDataPayload","normalizeRightsCenterSettings","_fetch2","fetchRightsTabData","allSettled","normalizeObjectResponse","requestApi","_temp1","_temp9","_temp8","detail","_temp7","_temp0","_fetch3","consents","setConsents","initialConsents","setInitialConsents","consentsLoading","setConsentsLoading","dirty","setDirty","showSaveModal","setShowSaveModal","_useState14","showDeleteModal","setShowDeleteModal","_useState15","showAccessModal","setShowAccessModal","_useState16","deleteConfirmed","setDeleteConfirmed","_useState17","accessConfirmed","setAccessConfirmed","_useState18","showForm","setShowForm","_useState19","Set","setChangedPurposeIds","normalizeStatus","fetchUserConsents","_temp10","bannersData","allBanners","userStatusData","userOverview","collectionPoints","uniquePurposesMap","pid","purposeType","cp","_cp$latest_consent","_cp$latestConsent","_cp$latest_consent2","_cp$latestConsent2","pcList","latest_consent","purpose_consents","latestConsent","purposeConsents","logTimestamp","pc","entry","de","pa","from","initialMap","it","clear","bootstrap","createRightsRequest","_exit5","_temp12","user_id","reason","requested_at","_temp11","purposesToSave","interaction_type","logged_at","session_id","interaction_to_save_ms","alert","handleSave","CheckCircle2","Info","activitiesText","activities","processing_activity","processingActivity","resolveProcessingActivity","consentedAccepted","expiry_period_id","resolveExpiry","newValue","size","_temp13","_temp14","full_name","email","date","toLocaleDateString","formatDateValue","appointment_date","qualifications","responsibilities","working_hours","response_time","User","Mail","Clock","preventDefault","client_user_id","placeholder","required","rows","handleGrievanceSubmit","ticket","index","ticket_id"],"mappings":"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"}