Phase 4 continuation. All touched files now under the file-size cap, and drive-by fixes unblock the types/core/react/vanilla builds which were broken at baseline. Splits - packages/types/src/state 505 -> 31 LOC barrel + state-flow/-assessment/-core - packages/core/src/client 521 -> 395 LOC + client-http 187 LOC (HTTP transport) - packages/react/src/provider 539 -> 460 LOC + provider-context 101 LOC - packages/vanilla/src/embed 611 -> 290 LOC + embed-banner 321 + embed-translations 78 Drive-by fixes (pre-existing typecheck/build failures) - types/rag.ts: rename colliding LegalDocument export to RagLegalDocument (the `export *` chain in index.ts was ambiguous; two consumers updated - core/modules/rag.ts drops unused import, vue/composables/useRAG.ts switches to the renamed symbol). - core/modules/rag.ts: wrap client searchRAG response to add the missing `query` field so the declared SearchResponse return type is satisfied. - react/provider.tsx: re-export useCompliance so ComplianceDashboard / ConsentBanner / DSRPortal legacy `from '../provider'` imports resolve. - vanilla/embed.ts + web-components/base.ts: default tenantId to '' so ComplianceClient construction typechecks. - vanilla/web-components/consent-banner.ts: tighten categories literal to `as const` so t.categories indexing narrows correctly. Verification: packages/types + core + react + vanilla all `pnpm build` clean with DTS emission. consent-sdk unaffected (still green). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
/**
|
|
* i18n string catalog for the vanilla embed SDK cookie banner.
|
|
*
|
|
* Phase 4: extracted from embed.ts.
|
|
*/
|
|
|
|
import type { ConsentPurpose } from '@breakpilot/compliance-sdk-types'
|
|
|
|
export type BannerLanguage = 'de' | 'en'
|
|
|
|
export interface CategoryCopy {
|
|
name: string
|
|
description: string
|
|
}
|
|
|
|
export interface BannerCopy {
|
|
title: string
|
|
description: string
|
|
acceptAll: string
|
|
rejectAll: string
|
|
settings: string
|
|
save: string
|
|
privacy: string
|
|
imprint: string
|
|
categories: Record<ConsentPurpose, CategoryCopy>
|
|
}
|
|
|
|
export const TRANSLATIONS: Record<BannerLanguage, BannerCopy> = {
|
|
de: {
|
|
title: 'Cookie-Einwilligung',
|
|
description:
|
|
'Wir verwenden Cookies, um Ihre Erfahrung zu verbessern. Weitere Informationen finden Sie in unserer Datenschutzerklärung.',
|
|
acceptAll: 'Alle akzeptieren',
|
|
rejectAll: 'Nur notwendige',
|
|
settings: 'Einstellungen',
|
|
save: 'Speichern',
|
|
privacy: 'Datenschutz',
|
|
imprint: 'Impressum',
|
|
categories: {
|
|
ESSENTIAL: { name: 'Notwendig', description: 'Erforderlich für die Grundfunktionen' },
|
|
FUNCTIONAL: { name: 'Funktional', description: 'Verbesserte Funktionen' },
|
|
ANALYTICS: { name: 'Analyse', description: 'Nutzungsstatistiken' },
|
|
MARKETING: { name: 'Marketing', description: 'Personalisierte Werbung' },
|
|
PERSONALIZATION: { name: 'Personalisierung', description: 'Angepasste Inhalte' },
|
|
THIRD_PARTY: { name: 'Drittanbieter', description: 'Externe Dienste' },
|
|
},
|
|
},
|
|
en: {
|
|
title: 'Cookie Consent',
|
|
description:
|
|
'We use cookies to improve your experience. For more information, please see our privacy policy.',
|
|
acceptAll: 'Accept All',
|
|
rejectAll: 'Reject Non-Essential',
|
|
settings: 'Settings',
|
|
save: 'Save',
|
|
privacy: 'Privacy Policy',
|
|
imprint: 'Imprint',
|
|
categories: {
|
|
ESSENTIAL: { name: 'Essential', description: 'Required for basic functionality' },
|
|
FUNCTIONAL: { name: 'Functional', description: 'Enhanced features' },
|
|
ANALYTICS: { name: 'Analytics', description: 'Usage statistics' },
|
|
MARKETING: { name: 'Marketing', description: 'Personalized advertising' },
|
|
PERSONALIZATION: { name: 'Personalization', description: 'Customized content' },
|
|
THIRD_PARTY: { name: 'Third Party', description: 'External services' },
|
|
},
|
|
},
|
|
}
|
|
|
|
export function createElement<K extends keyof HTMLElementTagNameMap>(
|
|
tag: K,
|
|
styles: Partial<CSSStyleDeclaration> = {},
|
|
attributes: Record<string, string> = {}
|
|
): HTMLElementTagNameMap[K] {
|
|
const el = document.createElement(tag)
|
|
Object.assign(el.style, styles)
|
|
Object.entries(attributes).forEach(([key, value]) => el.setAttribute(key, value))
|
|
return el
|
|
}
|