@consenti/api 0.3.0 → 0.4.0
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.
- package/README.md +212 -74
- package/dist/chunk-COR72NFQ.js +2 -0
- package/dist/chunk-COR72NFQ.js.map +1 -0
- package/dist/chunk-S2IEYESR.js +2 -0
- package/dist/chunk-S2IEYESR.js.map +1 -0
- package/dist/dashboard/assets/ApiConfig-CZMtYRfK.js +1 -0
- package/dist/dashboard/assets/{ArchivedProfileList-Bw-fx-BD.js → ArchivedProfileList-BlQ2gEWz.js} +1 -1
- package/dist/dashboard/assets/AuditLog-BpZoAFOe.js +1 -0
- package/dist/dashboard/assets/{ChangePassword-D2rPkzD1.js → ChangePassword-BZkP2dXQ.js} +1 -1
- package/dist/dashboard/assets/{ConfirmDialog-DTtw7VJ-.js → ConfirmDialog-BDlnfTdx.js} +1 -1
- package/dist/dashboard/assets/ConsentList-DgJMrhih.js +1 -0
- package/dist/dashboard/assets/ConsentTemplateEditor-DA7B5aI_.js +1 -0
- package/dist/dashboard/assets/ConsentTemplateList-DMPd2y5s.js +1 -0
- package/dist/dashboard/assets/HeadingTagInput-D2S9xDMJ.js +1 -0
- package/dist/dashboard/assets/{HowItWorks-AeyjfQGO.js → HowItWorks-CJCrdr3o.js} +1 -1
- package/dist/dashboard/assets/PermissionGate-C69dhwV1.js +1 -0
- package/dist/dashboard/assets/PreviewPane-D7mDeBT8.js +38 -0
- package/dist/dashboard/assets/ProfileEditor-CSFdOweN.js +2 -0
- package/dist/dashboard/assets/ProfileList-C4cIDrM6.js +1 -0
- package/dist/dashboard/assets/{ProfileVersionHistory-1h8sUgog.js → ProfileVersionHistory-CX5-Oupy.js} +2 -2
- package/dist/dashboard/assets/{RecordDetailModal-FaFhzQXi.js → RecordDetailModal-DIpGxfqA.js} +1 -1
- package/dist/dashboard/assets/Reports-B1Ww0ovT.js +1 -0
- package/dist/dashboard/assets/RoleList-CQ1GjR0W.js +1 -0
- package/dist/dashboard/assets/{Select-DjJNwlbY.js → Select-C_JusbT5.js} +1 -1
- package/dist/dashboard/assets/Settings-sIMVWQ0V.js +1 -0
- package/dist/dashboard/assets/SetupWizard-ChFBxqo3.js +1 -0
- package/dist/dashboard/assets/Table-BUxoz0YR.js +1 -0
- package/dist/dashboard/assets/TenantList-DCsT7ghb.js +1 -0
- package/dist/dashboard/assets/UITemplateEditor-BAaMnuOU.js +2 -0
- package/dist/dashboard/assets/UITemplateList-C3UMbnfs.js +1 -0
- package/dist/dashboard/assets/UserList-CHGNnS50.js +1 -0
- package/dist/dashboard/assets/VendorList-C-sswM1A.js +1 -0
- package/dist/dashboard/assets/VisitorList-DNB9Ia72.js +1 -0
- package/dist/dashboard/assets/check-D0g4XvmN.js +1 -0
- package/dist/dashboard/assets/client-CYntrO2g.js +1 -0
- package/dist/dashboard/assets/{copy-C01KoUUH.js → copy-DEi_W2TM.js} +1 -1
- package/dist/dashboard/assets/createLucideIcon-DAiYBrnd.js +1 -0
- package/dist/dashboard/assets/de-jwngydrC.js +25 -0
- package/dist/dashboard/assets/dist-GoiMJCTt.js +1 -0
- package/dist/dashboard/assets/es-B6Jp0OPe.js +25 -0
- package/dist/dashboard/assets/{external-link-DVe00ZBK.js → external-link-CFZxxe3W.js} +1 -1
- package/dist/dashboard/assets/fr-CshYcQPW.js +25 -0
- package/dist/dashboard/assets/index-Cr5M1Qy_.css +2 -0
- package/dist/dashboard/assets/index-Tr_BcjkN.js +26 -0
- package/dist/dashboard/assets/ja-CgjZNBrc.js +25 -0
- package/dist/dashboard/assets/{profiles-DmrdGv7t.js → profiles-C_SuoLJD.js} +1 -1
- package/dist/dashboard/assets/{roles-C0dJPFl4.js → roles-D7L936FV.js} +1 -1
- package/dist/dashboard/assets/rotate-ccw-clock-6y2NDrJ7.js +1 -0
- package/dist/dashboard/assets/search-DKwfLBOv.js +1 -0
- package/dist/dashboard/assets/templates-CIyMjskA.js +1 -0
- package/dist/dashboard/assets/{templates-B2xiivh4.js → templates-DY68xNys.js} +1 -1
- package/dist/dashboard/assets/{trash-2-BBnkdgm_.js → trash-2-eX9s6x8V.js} +1 -1
- package/dist/dashboard/assets/{trash-Dj1jhzHJ.js → trash-O30ycMcz.js} +1 -1
- package/dist/dashboard/assets/{useHashQuery-B5ytMIMp.js → useHashQuery-BDjUPXDR.js} +1 -1
- package/dist/dashboard/assets/{users-czK8LRVh.js → users-BRrNOK0W.js} +1 -1
- package/dist/dashboard/assets/x-BhZiH8AL.js +1 -0
- package/dist/dashboard/assets/zh-CN-BnLZkfBC.js +25 -0
- package/dist/dashboard/index.html +4 -4
- package/dist/dist-QJYW5KUK.js +2 -0
- package/dist/index.cjs +68 -68
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +214 -52
- package/dist/index.d.ts +214 -52
- package/dist/index.js +65 -65
- package/dist/index.js.map +1 -1
- package/dist/profiles-FCX454HS.js +2 -0
- package/dist/widget/widget.css +1 -1
- package/dist/widget/widget.js +1 -1
- package/package.json +24 -9
- package/dist/chunk-IY4L6MNB.js +0 -2
- package/dist/chunk-IY4L6MNB.js.map +0 -1
- package/dist/chunk-O5UG4OYI.js +0 -2
- package/dist/chunk-O5UG4OYI.js.map +0 -1
- package/dist/dashboard/assets/ApiConfig-CE-Noelz.js +0 -1
- package/dist/dashboard/assets/AuditLog-D6HiTQ1o.js +0 -1
- package/dist/dashboard/assets/ConsentList-BWOvPOMG.js +0 -1
- package/dist/dashboard/assets/ConsentTemplateEditor-BKIEnLmA.js +0 -1
- package/dist/dashboard/assets/ConsentTemplateList-DCys2nM3.js +0 -1
- package/dist/dashboard/assets/HeadingTagInput-BTjrdzlS.js +0 -1
- package/dist/dashboard/assets/PermissionGate-Bhhf7SMh.js +0 -1
- package/dist/dashboard/assets/PreviewPane-Dq5K1h2L.js +0 -35
- package/dist/dashboard/assets/ProfileEditor-BXtaE0tL.js +0 -2
- package/dist/dashboard/assets/ProfileList-CWKSAgu0.js +0 -1
- package/dist/dashboard/assets/Reports-DWEjQOKh.js +0 -1
- package/dist/dashboard/assets/RoleList-BSGoqlzp.js +0 -1
- package/dist/dashboard/assets/Settings-CVYrlyLm.js +0 -1
- package/dist/dashboard/assets/SetupWizard-4NTb5bZj.js +0 -1
- package/dist/dashboard/assets/Table-DH_jh8_N.js +0 -1
- package/dist/dashboard/assets/TenantList-5AwFtoHf.js +0 -1
- package/dist/dashboard/assets/UITemplateEditor-9A55scBe.js +0 -1
- package/dist/dashboard/assets/UITemplateList-BS7X4u4F.js +0 -1
- package/dist/dashboard/assets/UserList-SPkMyFRy.js +0 -1
- package/dist/dashboard/assets/VendorList-C5fPhr6U.js +0 -1
- package/dist/dashboard/assets/VisitorList-COP1SyNd.js +0 -1
- package/dist/dashboard/assets/check-o5cp1s2J.js +0 -1
- package/dist/dashboard/assets/client-ymc9nwWr.js +0 -1
- package/dist/dashboard/assets/createLucideIcon-MdjI3m3u.js +0 -1
- package/dist/dashboard/assets/de-DET92Jb5.js +0 -5
- package/dist/dashboard/assets/dist-DlhLroYC.js +0 -1
- package/dist/dashboard/assets/es-CJNunrnU.js +0 -5
- package/dist/dashboard/assets/fr-akfTuf5x.js +0 -5
- package/dist/dashboard/assets/history-CHTts_m2.js +0 -1
- package/dist/dashboard/assets/index-DW3qOrry.css +0 -2
- package/dist/dashboard/assets/index-H_Zm0X-u.js +0 -6
- package/dist/dashboard/assets/ja-B0nLWkOd.js +0 -5
- package/dist/dashboard/assets/search-Bd2RdDRh.js +0 -1
- package/dist/dashboard/assets/templates-CnMoLavN.js +0 -1
- package/dist/dashboard/assets/x-BRuyBEQP.js +0 -1
- package/dist/dashboard/assets/zh-CN-Dxg3G-BL.js +0 -5
- package/dist/dist-Z5RVTVBT.js +0 -2
- package/dist/profiles-XTYPWLVC.js +0 -2
- /package/dist/{dist-Z5RVTVBT.js.map → dist-QJYW5KUK.js.map} +0 -0
- /package/dist/{profiles-XTYPWLVC.js.map → profiles-FCX454HS.js.map} +0 -0
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
var e={_section_nav:`── Navigation ──────────────────────────────────────────`,"nav.dashboard":`Tableau de bord`,"nav.consentBanners":`Bannières de consentement`,"nav.consentTemplates":`Modèles de cookies`,"nav.uiTemplates":`Modèles d'interface`,"nav.profiles":`Profils`,"nav.consents":`Consentements`,"nav.visitors":`Visiteurs`,"nav.users":`Utilisateurs`,"nav.roles":`Rôles`,"nav.sites":`Sites`,"nav.vendors":`Fournisseurs TCF`,"nav.reports":`Rapports`,"nav.audit":`Journal d'audit`,"nav.api":`API`,"nav.settings":`Paramètres`,"nav.adminDashboard":`Tableau admin`,_section_layout:`── Mise en page ────────────────────────────────────`,"layout.expandSidebar":`Développer la barre latérale`,"layout.collapseSidebar":`Réduire la barre latérale`,"layout.signOut":`Se déconnecter`,"layout.toggleDark":`Passer en mode sombre`,"layout.toggleLight":`Passer en mode clair`,"layout.poweredBy":`Propulsé par`,_section_common:`── Général ────────────────────────────────────────`,"common.loading":`Chargement…`,"common.searching":`Recherche…`,"common.save":`Enregistrer`,"common.saving":`Enregistrement…`,"common.cancel":`Annuler`,"common.close":`Fermer`,"common.delete":`Supprimer`,"common.edit":`Modifier`,"common.create":`Créer`,"common.confirm":`Confirmer`,"common.noData":`Aucune donnée`,"common.search":`Search…`,"common.perPage":`Par page`,"common.goToPage":`Aller à la page`,"common.pageOfTotal":`Page {{page}} sur {{total}}`,"common.noResults":`No results match your search.`,"common.exportCsv":`Exporter CSV`,"common.duplicate":`Dupliquer`,"common.active":`Actif`,"common.inactive":`Inactif`,"common.name":`Nom`,"common.email":`E-mail`,"common.status":`Statut`,"common.created":`Créé`,"common.id":`ID`,"common.add":`Ajouter`,"common.remove":`Retirer`,"common.revoke":`Révoquer`,"common.required":`Obligatoire`,"common.version":`Version`,"common.locale":`Langue`,"common.country":`Pays`,"common.source":`Source`,"common.grantAll":`Tout autoriser`,"common.revokeAll":`Tout révoquer`,"common.granted":`accordé`,"common.page":`Page {{n}}`,"common.prev":`Préc`,"common.next":`Suiv`,"common.you":`Vous`,"common.default":`par défaut`,"common.hide":`Masquer`,"common.show":`Afficher`,"common.activate":`Activer`,"common.deactivate":`Désactiver`,"common.newRole":`Nouveau rôle`,"common.copyToClipboard":`Copier dans le presse-papiers`,"common.back":`Retour`,"common.copyId":`Copier l'ID`,"common.mandatory":`obligatoire`,"common.optional":`Optionnel`,"common.roles":`Rôles`,"common.showPassword":`Afficher le mot de passe`,"common.hidePassword":`Masquer le mot de passe`,"common.updated":`Mis à jour`,_section_locale:`── Sélecteur de langue ─────────────────────────────`,"locale.en":`Anglais`,"locale.switcherAria":`Changer de langue`,_section_login:`── Connexion ───────────────────────────────────────`,"login.title":`{{appName}} Admin`,"login.subtitle":`Connectez-vous à votre compte`,"login.email":`E-mail`,"login.emailPlaceholder":`admin@example.com`,"login.password":`Mot de passe`,"login.submit":`Se connecter`,"login.submitting":`Connexion…`,"login.error.invalid":`E-mail ou mot de passe invalide`,"login.devSignIn":`⚡ Dev : se connecter en tant que user@consenti.dev`,_section_setupWizard:`── Assistant de configuration ───────────────────`,"setupWizard.welcome.title":`Bienvenue sur {{appName}}`,"setupWizard.welcome.body":`Configurons votre gestion du consentement. Cela ne prendra qu'une minute — nous vous montrerons ce qui est configuré et vous aiderons à installer un premier jeu de profils de conformité.`,"setupWizard.welcome.docsLink":`Voir la documentation`,"setupWizard.welcome.howItWorksLink":`Comment fonctionne Consenti`,"setupWizard.welcome.getStarted":`Commencer`,"setupWizard.welcome.skip":`Passer la configuration`,"setupWizard.config.title":`Votre configuration`,"setupWizard.config.subtitle":`Voici ce que Consenti a déterminé à partir de votre configuration et de vos variables d'environnement, fusionné avec des valeurs par défaut raisonnables. Les secrets sont masqués.`,"setupWizard.back":`Retour`,"setupWizard.continue":`Continuer`,"setupWizard.profiles.title":`Profils de conformité par défaut`,"setupWizard.profiles.subtitle":`Consenti fournit 8 profils de conformité prêts à l'emploi couvrant les principales réglementations mondiales sur la vie privée. Choisissez ceux à installer maintenant — vous pourrez en ajouter d'autres plus tard.`,"setupWizard.profiles.selectAll":`Installer les 8 profils par défaut`,"setupWizard.profiles.installAndContinue":`Installer et continuer`,"setupWizard.profiles.skipAndContinue":`Passer et continuer`,"setupWizard.profiles.error":`Impossible d'installer les profils sélectionnés. Vous pourrez réessayer plus tard depuis Profils.`,"setupWizard.confirmation.title":`Tout est prêt`,"setupWizard.confirmation.seededSummary":`{{count}} profil(s) de conformité installé(s).`,"setupWizard.confirmation.noneSeeded":`Aucun profil n'a été installé — vous pouvez en créer un à tout moment depuis Profils.`,"setupWizard.confirmation.readinessTitle":`Avant de passer en production`,"setupWizard.confirmation.readinessJsonStorage":`Vous utilisez le pilote de stockage par fichier JSON — adapté au développement, mais passez à un pilote de base de données (node:sqlite, PostgreSQL, MySQL, MongoDB) pour la production.`,"setupWizard.confirmation.readinessDefaultCredentials":`Aucun identifiant administrateur n'a été configuré — Consenti utilise des identifiants de démonstration. Configurez CONSENTI_ADMIN_EMAIL et CONSENTI_ADMIN_PASSWORD avant de passer en production.`,"setupWizard.confirmation.howItWorks":`Comment fonctionne Consenti`,"setupWizard.confirmation.goToDashboard":`Aller au tableau de bord`,_section_dashboard:`── Tableau de bord ───────────────────────────────`,"dashboard.title":`Tableau de bord`,"dashboard.stats.totalConsents":`Total des consentements`,"dashboard.stats.totalVisitors":`Total des visiteurs`,"dashboard.stats.accepted":`Acceptés`,"dashboard.stats.acceptedSub":`≥80% des cookies accordés`,"dashboard.stats.rejected":`Refusés`,"dashboard.stats.rejectedSub":`≤20% des cookies accordés`,"dashboard.chart.timeline":`Consentements (30 derniers jours)`,"dashboard.chart.timelineAria":`Graphique du timeline des consentements`,"dashboard.chart.countries":`Pays principaux`,"dashboard.chart.noData":`Aucune donnée.`,"dashboard.chart.noCountryData":`Aucune donnée par pays.`,"dashboard.gpc.label":`Taux de détection GPC`,"dashboard.gpc.sub":`{{detected}} sur {{total}} consentements`,"dashboard.viewReports":`Voir les rapports complets →`,_section_reports:`── Rapports ──────────────────────────────────────────`,"reports.title":`Rapports`,"reports.filters.from":`Du`,"reports.filters.to":`Au`,"reports.filters.apply":`Appliquer`,"reports.optin.total":`Décisions totales`,"reports.optin.granted":`Accordé`,"reports.optin.denied":`Refusé`,"reports.optin.managed":`Partiellement géré`,"reports.optin.byDate":`Tendance d'acceptation`,"reports.optin.byDateAria":`Décisions d'acceptation dans le temps`,"reports.optin.byLocale":`Par langue`,"reports.category.title":`Par catégorie`,"reports.legend.granted":`Accordé`,"reports.legend.denied":`Refusé`,"reports.legend.objected":`Objecté`,"reports.legend.managed":`Géré`,_section_consents:`── Consentements ─────────────────────────────────`,"consents.title":`Enregistrements de consentement`,"consents.filterFrom":`De`,"consents.filterTo":`À`,"consents.filterGpc":`GPC uniquement`,"consents.records":`{{n}} enregistrements`,"consents.empty":`Aucun enregistrement de consentement pour le moment.`,"consents.col.visitorId":`ID visiteur`,"consents.col.profile":`Profil`,"consents.col.locale":`Langue`,"consents.col.gpc":`GPC`,"consents.col.age":`Âge`,"consents.col.source":`Source`,"consents.col.created":`Créé`,"consents.gpcYes":`Oui`,"consents.ageVerified":`Vérifié`,"consents.searchPlaceholder":`Rechercher visiteur, profil, langue, source…`,"consents.detail.title":`Enregistrement de consentement`,"consents.detail.updated":`Mis à jour`,"consents.detail.consentJson":`Données de consentement`,"consents.detail.signature":`Signature`,"consents.detail.signed":`Signé`,"consents.detail.unsigned":`Non signé`,_section_visitors:`── Visiteurs ─────────────────────────────────────`,"visitors.title":`Visiteurs`,"visitors.empty":`Aucun visiteur enregistré pour le moment.`,"visitors.col.visitorId":`ID visiteur`,"visitors.col.country":`Pays`,"visitors.col.firstSeen":`Vu pour la première fois`,"visitors.col.lastSeen":`Dernière visite`,"visitors.searchPlaceholder":`Rechercher ID visiteur, pays…`,"visitors.detail.title":`Visiteur`,"visitors.detail.region":`Région`,"visitors.detail.city":`Ville`,_section_users:`── Utilisateurs ─────────────────────────────────`,"users.title":`Utilisateurs`,"users.count":`{{n}} utilisateurs`,"users.newUser":`+ Nouvel utilisateur`,"users.createForm.title":`Créer un utilisateur`,"users.createForm.namePlaceholder":`Nom`,"users.createForm.emailPlaceholder":`E-mail`,"users.createForm.passwordPlaceholder":`Mot de passe`,"users.createForm.confirmPasswordPlaceholder":`Confirmer le mot de passe`,"users.createForm.selectRole":`Sélectionner un rôle…`,"users.createForm.passwordMismatch":`Les mots de passe ne correspondent pas`,"users.createForm.error":`Échec de la création de l'utilisateur`,"users.col.status":`Statut`,"users.status.active":`Actif`,"users.status.inactive":`Inactif`,"users.action.activate":`Activer`,"users.action.deactivate":`Désactiver`,"users.dialog.delete.title":`Supprimer l'utilisateur « {{name}} » ?`,"users.dialog.delete.message":`Ce compte utilisateur sera définitivement supprimé.`,_section_roles:`── Rôles & Permissions ───────────────────────────`,"roles.title":`Rôles & Permissions`,"roles.list.heading":`Rôles`,"roles.list.empty":`Aucun rôle pour le moment. Créez-en un pour commencer.`,"roles.form.roleNameLabel":`Nom du rôle`,"roles.form.roleNamePlaceholder":`ex. Éditeur`,"roles.form.descriptionLabel":`Description`,"roles.form.descriptionPlaceholder":`Description optionnelle`,"roles.perms.heading":`Permissions — {{name}}`,"roles.perms.selectPrompt":`Sélectionnez un rôle pour gérer les permissions`,"roles.perms.clickPrompt":`Cliquez sur un rôle à gauche pour voir et gérer ses permissions.`,"roles.perms.noPerms":`Aucune permission définie dans le système.`,"roles.error.load":`Impossible de charger les rôles.`,"roles.error.create":`Échec de la création du rôle.`,"roles.error.update":`Échec de la mise à jour du rôle.`,"roles.error.delete":`Échec de la suppression du rôle.`,"roles.error.perm":`Échec de la mise à jour de la permission.`,"roles.dialog.delete.title":`Supprimer le rôle « {{name}} » ?`,"roles.dialog.delete.message":`Les utilisateurs affectés à ce rôle perdront immédiatement ses permissions.`,"roles.aria.editRole":`Modifier le rôle`,"roles.aria.deleteRole":`Supprimer le rôle`,_section_profiles:`── Profils ───────────────────────────────────────`,"profiles.title":`Profils`,"profiles.count":`{{n}} profils`,"profiles.countSingular":`{{n}} profil`,"profiles.newProfile":`+ Nouveau profil`,"profiles.empty":`Aucun profil pour le moment. Créez-en un pour commencer.`,"profiles.search.placeholder":`Search profiles…`,"profiles.filter.status":`Status`,"profiles.filter.active":`Active`,"profiles.filter.inactive":`Inactive`,"profiles.archived.cta":`Archived Profiles`,"profiles.archived.title":`Archived Profiles`,"profiles.archived.back":`Back to profiles`,"profiles.archived.hint":`Profile-id directories found on disk with no matching database entry — deleted profiles whose version snapshots weren't. Click one to browse its version history.`,"profiles.archived.empty":`No archived profiles found.`,"profiles.archived.searchPlaceholder":`Search by profile ID…`,"profiles.archived.col.id":`Profile ID`,"profiles.archived.col.versions":`Versions`,"profiles.archived.col.lastModified":`Last Modified`,"profiles.archived.viewHistory":`View history`,"profiles.col.name":`Nom`,"profiles.col.defaultLocale":`Langue par défaut`,"profiles.col.templates":`Modèles`,"profiles.col.created":`Créé`,"profiles.template.cookie":`Cookie :`,"profiles.template.ui":`UI :`,"profiles.action.copyId":`Copier l'ID du profil`,"profiles.action.copySlug":`Copy compliance group slug`,"profiles.action.copying":`Copie…`,"profiles.dialog.delete.title":`Supprimer « {{name}} » ?`,"profiles.dialog.delete.message":`Ce profil et tout son contenu localisé seront définitivement supprimés.`,"profiles.dialog.copy.title":`Copier « {{name}} » ?`,"profiles.dialog.copy.message":`Ce profil et tout son contenu localisé seront dupliqués.`,_section_profileEditor:`── Éditeur de profil ─────────────────────────────`,"profileEditor.title.new":`Nouveau profil`,"profileEditor.title.edit":`Modifier le profil`,"profileEditor.title.loading":`Éditeur de profil`,"profileEditor.step.config":`Configuration du profil`,"profileEditor.step.templates":`Modèles`,"profileEditor.step.content":`Contenu`,"profileEditor.step.mainBanner":`Bannière principale`,"profileEditor.step.gpcBanner":`Bannière GPC`,"profileEditor.step.prefModal":`Modal préférences`,"profileEditor.config.profileName":`Nom du profil`,"profileEditor.config.profileNamePlaceholder":`Mon site web`,"profileEditor.config.defaultLocale":`Langue par défaut`,"profileEditor.config.allowedDomains":`Domaines autorisés`,"profileEditor.config.allowedDomainsHint":`Prend en charge les jokers (*.example.com). Laisser vide pour autoriser tous les domaines.`,"profileEditor.config.regulations":`Réglementations de conformité`,"profileEditor.config.reg.gdprLabel":`RGPD`,"profileEditor.config.reg.gdprDesc":`Opt-in UE/EEE. Aucun suivi tant que le consentement n'est pas donné. Bannière affichée à la première visite.`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`Opt-out Californie. Les cookies sont accordés par défaut. Fournir un déclencheur "Do Not Sell".`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`Californie 2023. Opt-out pour la vente/partage ; opt-in pour les données sensibles. GPC pris en compte.`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`Inde 2023. Opt-in comme le RGPD. GPC non reconnu. Avis du fiduciaire des données requis.`,"profileEditor.config.darkMode":`Activer le mode sombre`,"profileEditor.config.darkModeHint":`Applique des tokens de couleur sombre au widget de consentement pour les sites avec un thème sombre.`,"profileEditor.config.dpdpa.heading":`DPDPA — Champs obligatoires de l'avis de consentement`,"profileEditor.config.dpdpa.fiduciary":`Nom du fiduciaire des données`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`E-mail du responsable des réclamations`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`Description de la finalité`,"profileEditor.config.dpdpa.purposePlaceholder":`Nous collectons vos données pour personnaliser votre expérience…`,"profileEditor.templates.cookieTemplate":`Modèle de cookie`,"profileEditor.templates.cookieTemplateHint":`Définit quels cookies/finalités apparaissent dans la fenêtre de préférences. Tous les champs proviennent du modèle — lecture seule dans le profil.`,"profileEditor.templates.selectCookie":`— Sélectionnez un modèle de cookie —`,"profileEditor.templates.uiTemplate":`Modèle UI`,"profileEditor.templates.uiTemplateHint":`Définit la disposition du bannière/modal, le nombre de boutons et la structure des catégories. Vous ajoutez le texte dans les étapes 3–5.`,"profileEditor.templates.selectUi":`— Sélectionnez un modèle UI —`,"profileEditor.templates.noTemplate":`Aucun modèle sélectionné.`,"profileEditor.templates.previewPrompt":`Sélectionnez à la fois un modèle de cookie et un modèle UI pour voir un aperçu en direct.`,"profileEditor.templates.categoriesCount":`catégories`,"profileEditor.templates.buttonsTotal":`boutons au total`,"profileEditor.content.loadDefaults":`Charger les valeurs par défaut`,"profileEditor.content.loadDefaultsTitle":`Remplir cette section avec des valeurs par défaut en anglais`,"profileEditor.content.loadDefaultsNotice":`Les valeurs par défaut sont en anglais uniquement — traduisez-les via l'onglet de langue ci-dessus.`,"profileEditor.content.importError":`Impossible d'analyser le fichier téléchargé. Assurez-vous qu'il correspond au format de modèle de langue Consenti.`,"profileEditor.content.mainBanner":`Bannière principale`,"profileEditor.content.gpcBanner":`Bannière GPC`,"profileEditor.content.prefModal":`Modal de préférences`,"profileEditor.content.heading":`Titre`,"profileEditor.content.subheading":`Sous-titre`,"profileEditor.content.bodyText":`Texte`,"profileEditor.content.introText":`Texte d'introduction (optionnel)`,"profileEditor.content.buttonLabels":`Libellés des boutons`,"profileEditor.content.categoryHeading":`Titre de la catégorie`,"profileEditor.content.categoryDesc":`Description de la catégorie`,"profileEditor.content.categoryFallback":`Catégorie {{n}}`,"profileEditor.content.buttonLabelPlaceholder":`Texte du bouton…`,"profileEditor.content.categoryDescPlaceholder":`Description de cette catégorie de cookies…`,"profileEditor.content.liDescription":`Description de l'intérêt légitime (optionnel)`,"profileEditor.content.liDescriptionPlaceholder":`Nous nous appuyons sur un intérêt légitime car…`,"profileEditor.content.liDescriptionHint":`Votre justification du test de mise en balance RGPD pour le recours à l'intérêt légitime, affichée aux visiteurs. Optionnel — vous pouvez aussi l'inclure dans la description de la catégorie ci-dessus.`,"profileEditor.content.mainBannerHeadingPlaceholder":`Nous accordons de l'importance à votre vie privée`,"profileEditor.content.mainBannerBodyPlaceholder":`Nous utilisons des cookies pour améliorer votre expérience…`,"profileEditor.content.gpcHeadingPlaceholder":`Contrôle de confidentialité global détecté`,"profileEditor.content.prefHeadingPlaceholder":`Préférences de confidentialité`,"profileEditor.content.prefSubheadingPlaceholder":`Gérez vos préférences de cookies ci-dessous.`,"profileEditor.content.prefIntroPlaceholder":`Introduction optionnelle au-dessus des catégories…`,"profileEditor.content.noContent":`Sélectionnez un modèle UI à l'étape 2 pour commencer à modifier le contenu.`,"profileEditor.content.loadingTemplate":`Chargement du modèle…`,"profileEditor.nav.nextTemplates":`Suivant : Modèles`,"profileEditor.nav.nextContent":`Suivant : Contenu`,"profileEditor.nav.nextMainBanner":`Suivant : Bannière principale`,"profileEditor.nav.nextGpcBanner":`Suivant : Bannière GPC`,"profileEditor.nav.nextPrefModal":`Suivant : Modal préférences`,"profileEditor.action.create":`Créer le profil`,"profileEditor.action.save":`Enregistrer le profil`,"profileEditor.error.nameRequired":`Le nom du profil est requis.`,"profileEditor.error.nameRequiredContinue":`Le nom du profil est requis avant de continuer.`,"profileEditor.error.cookieRequired":`Sélectionnez un modèle de cookie.`,"profileEditor.error.cookieContinue":`Sélectionnez un modèle de cookie pour continuer.`,"profileEditor.error.uiRequired":`Sélectionnez un modèle UI.`,"profileEditor.error.uiContinue":`Sélectionnez un modèle UI pour continuer.`,"profileEditor.error.failed":`Échec de l'enregistrement du profil.`,"profileEditor.error.load":`Échec du chargement du profil.`,"profileEditor.table.noNoCookies":`Aucun cookie défini dans ce modèle.`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`Base légale`,"profileEditor.table.mandatory":`Obligatoire`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.tcfVendor":`Fournisseur TCF`,"profileEditor.table.cpraCategory":`Catégorie CPRA`,"profileEditor.table.cookies":`Cookies`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`Importer`,"profileEditor.export.jsonTitle":`Télécharger le contenu localisé en JSON`,"profileEditor.export.csvTitle":`Télécharger le contenu localisé en CSV pour traduction`,"profileEditor.export.importTitle":`Téléverser JSON ou CSV traduit`,"profileEditor.newLink":`+ Nouveau ↗`,_section_consentTemplates:`── Modèles de cookies ───────────────────────────`,"consentTemplates.title":`Modèles de cookies`,"consentTemplates.count":`{{n}} modèles`,"consentTemplates.countSingular":`{{n}} modèle`,"consentTemplates.new":`+ Nouveau modèle de cookie`,"consentTemplates.empty.title":`Aucun modèle de cookie pour le moment.`,"consentTemplates.empty.hint":`Les modèles de cookies définissent la liste des cookies/finalités pour vos profils de consentement. Créez-en un pour le réutiliser sur plusieurs profils.`,"consentTemplates.search.placeholder":`Search consent templates…`,"consentTemplates.col.name":`Name`,"consentTemplates.col.cookies":`Cookies`,"consentTemplates.required":`requis`,"consentTemplates.dialog.delete.title":`Supprimer « {{name}} » ?`,"consentTemplates.dialog.delete.message":`Ce modèle de cookie sera définitivement supprimé. Les profils liés perdront leurs définitions de cookies.`,"consentTemplates.editor.title.new":`Nouveau modèle de cookie`,"consentTemplates.editor.title.edit":`Modifier le modèle de cookie`,"consentTemplates.editor.name":`Nom du modèle`,"consentTemplates.editor.namePlaceholder":`ex. Google Analytics + Ads`,"consentTemplates.editor.nameRequired":`Le nom du modèle est requis.`,"consentTemplates.editor.definitions":`Définitions des cookies`,"consentTemplates.editor.empty":`Aucun cookie défini pour le moment. Ajoutez-en un ci‑dessus.`,"consentTemplates.editor.addCookie":`+ Ajouter un cookie`,"consentTemplates.editor.idNoMatches":`Aucune clé connue ne correspond — vous pouvez tout de même saisir un ID personnalisé`,"consentTemplates.editor.error.allIds":`Tous les cookies doivent avoir un ID.`,"consentTemplates.editor.error.uniqueIds":`Les IDs de cookie doivent être uniques.`,"consentTemplates.editor.error.failed":`Échec de l'enregistrement du modèle.`,"consentTemplates.editor.error.notFound":`Modèle introuvable.`,"consentTemplates.editor.action.create":`Créer le modèle`,"consentTemplates.editor.action.save":`Enregistrer le modèle`,"consentTemplates.editor.showTcf":`Fournisseurs TCF`,"consentTemplates.editor.showCpra":`Catégorie CPRA`,"consentTemplates.editor.infoHint":`Cliquez sur un en-tête de colonne pour en savoir plus`,"consentTemplates.editor.infoUsage":`Utilisation`,"consentTemplates.editor.infoLaws":`Règles réglementaires`,"consentTemplates.editor.infoExamples":`Exemples`,"consentTemplates.col.id":`ID du cookie`,"consentTemplates.col.idShort":`ID / Nom`,"consentTemplates.col.gpc":`Respecter le signal GPC`,"consentTemplates.col.gpcShort":`GPC`,"consentTemplates.col.tcfVendor":`IDs des fournisseurs TCF`,"consentTemplates.col.cpraCategory":`Catégorie de données CPRA`,"consentTemplates.col.tcfVendorShort":`Fournisseur TCF`,"consentTemplates.col.cpraCategoryShort":`Catégorie CPRA`,"consentTemplates.col.purpose":`Finalité du cookie`,"consentTemplates.col.purposeShort":`Finalité`,"consentTemplates.purpose.necessary":`Nécessaire`,"consentTemplates.purpose.functional":`Fonctionnel`,"consentTemplates.purpose.preferences":`Préférences`,"consentTemplates.purpose.analytics":`Analytique`,"consentTemplates.purpose.marketing":`Marketing`,"consentTemplates.editor.purposePlaceholder":`Sélectionner la finalité…`,"consentTemplates.editor.error.purpose":`Chaque cookie doit avoir une finalité.`,_section_uiTemplates:`── Modèles d'interface ───────────────────────────`,"uiTemplates.title":`Modèles d'interface`,"uiTemplates.count":`{{n}} modèles`,"uiTemplates.countSingular":`{{n}} modèle`,"uiTemplates.new":`+ Nouveau modèle UI`,"uiTemplates.empty.title":`Aucun modèle UI pour le moment.`,"uiTemplates.empty.hint":`Les modèles UI définissent la configuration visuelle — positions, boutons, catégories — pour vos bannières et modals de consentement.`,"uiTemplates.search.placeholder":`Search UI templates…`,"uiTemplates.col.name":`Name`,"uiTemplates.col.positions":`Positions`,"uiTemplates.col.buttons":`Buttons`,"uiTemplates.mainBanner":`Bannière principale :`,"uiTemplates.gpcBanner":`Bannière GPC :`,"uiTemplates.modal":`Modalité :`,"uiTemplates.categories":`{{n}} catégories`,"uiTemplates.dialog.delete.title":`Supprimer « {{name}} » ?`,"uiTemplates.dialog.delete.message":`Ce modèle UI sera définitivement supprimé. Les profils liés perdront leurs paramètres UI.`,"uiTemplates.editor.title.new":`Nouveau modèle UI`,"uiTemplates.editor.title.edit":`Modifier le modèle UI`,"uiTemplates.editor.name":`Nom du modèle`,"uiTemplates.editor.nameRequired":`Le nom du modèle est requis.`,"uiTemplates.editor.namePlaceholder":`ex. Disposition GDPR standard`,"uiTemplates.editor.loading":`Chargement du modèle…`,"uiTemplates.editor.tabMain":`Bannière principale`,"uiTemplates.editor.tabGpc":`Bannière GPC`,"uiTemplates.editor.tabModal":`Modal de préférences`,"uiTemplates.editor.mainBannerHint":`Affichée à la première visite lorsqu'aucun consentement n'a été enregistré.`,"uiTemplates.editor.gpcBannerHint":`Affichée à la place de la bannière principale lorsqu'un signal GPC est détecté (autoHonorGPC activé).`,"uiTemplates.editor.error.notFound":`Modèle introuvable.`,"uiTemplates.editor.error.buttons":`Tous les boutons doivent avoir un id.`,"uiTemplates.editor.error.uniqueButtonIds":`Button IDs must be unique.`,"uiTemplates.editor.error.customButtons":`Tous les boutons d'action « personnalisés » doivent avoir des cookies sélectionnés.`,"uiTemplates.editor.error.catIds":`Toutes les IDs de catégorie sont requises.`,"uiTemplates.editor.error.uniqueCatIds":`Les IDs de catégorie doivent être uniques.`,"uiTemplates.editor.error.catCookies":`Chaque catégorie doit inclure au moins un cookie.`,"uiTemplates.editor.error.failed":`Échec de l'enregistrement du modèle.`,"uiTemplates.editor.action.create":`Créer le modèle`,"uiTemplates.editor.action.save":`Enregistrer le modèle`,_section_sites:`── Sites / Tenants ───────────────────────────────`,"sites.title":`Sites / Tenants`,"sites.createNew":`Créer un site`,"sites.namePlaceholder":`Nom du site`,"sites.slugPlaceholder":`slug (ex. site-a)`,"sites.col.name":`Nom`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Créé`,"sites.empty":`Aucun site pour le moment.`,"sites.dialog.delete.title":`Supprimer « {{name}} » ?`,"sites.dialog.delete.message":`Ce site et toutes les données associées seront définitivement supprimés. Cette action est irréversible.`,_section_vendors:`── Fournisseurs TCF ──────────────────────────────`,"vendors.title":`Liste des fournisseurs TCF`,"vendors.info.title":`Qu'est-ce que la liste des fournisseurs TCF ?`,"vendors.searchPlaceholder":`Rechercher des fournisseurs…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} fournisseurs`,"vendors.loading":`Chargement de la liste des fournisseurs…`,"vendors.noResults":`Aucun fournisseur trouvé.`,"vendors.col.id":`ID`,"vendors.col.name":`Nom`,"vendors.col.purposes":`Finalités`,"vendors.col.liPurposes":`Finalités LI`,"vendors.col.specialPurposes":`Finalités spéciales`,"vendors.pagination":`Page {{page}} sur {{totalPages}} · {{total}} fournisseurs au total`,"vendors.prev":`← Préc`,"vendors.next":`Suiv →`,_section_audit:`── Journal d'audit ────────────────────────────────`,"audit.title":`Journal d'audit`,"audit.empty":`Aucun événement d'audit pour le moment.`,"audit.col.time":`Heure`,"audit.col.action":`Action`,"audit.col.resource":`Ressource`,"audit.col.resourceId":`ID de la ressource`,"audit.col.actor":`Acteur`,"audit.actor.system":`système`,"audit.viewHistory":`Comparer`,"audit.searchPlaceholder":`Rechercher action, ressource, acteur…`,"audit.detail.title":`Entrée d'audit`,"audit.detail.oldData":`Anciennes données`,"audit.detail.newData":`Nouvelles données`,_section_apiConfig:`── Configuration API ─────────────────────────────`,"apiConfig.title":`Configuration API`,"apiConfig.public.heading":`API publique`,"apiConfig.public.about.text":`Utilisée par le widget pour soumettre et gérer le consentement. Il n'y a pas de token d'authentification — les origins autorisés ci-dessous sont son seul contrôle d'accès.`,"apiConfig.public.about.link":`Ouvrir la référence de l'API publique sur consenti.dev`,"apiConfig.admin.heading":`API admin`,"apiConfig.admin.about.text":`Utilisez ces tokens pour appeler l'API admin de Consenti depuis des scripts, CI/CD ou des intégrations côté serveur. Chaque route, format de requête/réponse et en-tête d'authentification est documenté sur consenti.dev.`,"apiConfig.admin.about.link":`Ouvrir la référence de l'API admin sur consenti.dev`,"apiConfig.endpoint.heading":`Point de terminaison`,"apiConfig.endpoint.hint":`URL de base pour ce déploiement, résolue à partir de votre configuration.`,"apiConfig.origins.heading":`Origins autorisés`,"apiConfig.origins.hint":`Seules les requêtes provenant de ces origins seront acceptées. Utilisez * pour autoriser tous les origins (non recommandé en production).`,"apiConfig.origins.publicNote":`L'API publique n'a pas de token d'authentification — cette liste est son seul contrôle d'accès.`,"apiConfig.origins.adminNote":`Une couche supplémentaire par-dessus l'authentification par token Bearer. Incluez l'origin de ce tableau de bord ({{origin}}) pour éviter de vous exclure vous-même.`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`Aucun origin configuré — tous les origins sont actuellement autorisés.`,"apiConfig.origins.errorDuplicate":`Déjà dans la liste.`,"apiConfig.origins.errorSave":`Échec de l'enregistrement. Veuillez réessayer.`,"apiConfig.origins.remove":`Retirer`,"apiConfig.tokens.heading":`Tokens API admin`,"apiConfig.tokens.hint":`Tokens Bearer pour l'accès serveur et CI/CD à l'API admin Consenti. Passer en Authorization: Bearer <token>. Ne jamais exposer côté client — ces tokens donnent un accès admin complet.`,"apiConfig.tokens.created":`Token créé — copiez-le maintenant, il ne sera plus affiché.`,"apiConfig.tokens.placeholder":`Nom du token (ex. déploiement CI)`,"apiConfig.tokens.empty":`Aucun token pour le moment.`,"apiConfig.tokens.errorName":`Le nom est requis`,"apiConfig.tokens.errorCreate":`Échec de la création du token`,"apiConfig.tokens.col.name":`Nom`,"apiConfig.tokens.col.status":`Statut`,"apiConfig.tokens.col.created":`Créé`,"apiConfig.tokens.status.active":`Actif`,"apiConfig.tokens.status.revoked":`Révoqué`,"apiConfig.tokens.status.expired":`Expired`,"apiConfig.tokens.col.expires":`Expires`,"apiConfig.tokens.expiresLabel":`Expires (optional)`,"apiConfig.tokens.expiresNever":`Never`,"apiConfig.tokens.dialog.title":`Révoquer ce token API ?`,"apiConfig.tokens.dialog.message":`Toute application utilisant ce token perdra immédiatement l'accès.`,"apiConfig.tokens.reactivate":`Réactiver`,"apiConfig.tokens.deleteDialog.title":`Supprimer définitivement ce token API ?`,"apiConfig.tokens.deleteDialog.message":`Cela supprime entièrement l'enregistrement du token et ne peut pas être annulé. La réactivation ne sera plus possible.`,_section_settings:`── Paramètres ───────────────────────────────────`,"settings.title":`Paramètres`,"settings.account.heading":`Compte`,"settings.account.email":`E-mail :`,"settings.account.roles":`Rôles :`,"settings.account.id":`ID :`,"settings.account.changePassword":`Changer le mot de passe`,"settings.export.heading":`Exporter les données`,"settings.export.hint":`Télécharger tous les enregistrements de consentement ou les journaux d'audit.`,"settings.export.consentCsv":`Consentements CSV`,"settings.export.consentXlsx":`Consentements XLSX`,"settings.export.consentJson":`Consentements JSON`,"settings.export.auditCsv":`Audit CSV`,"settings.about.heading":`À propos`,"settings.about.text":`Consenti v0.1.0 — Plateforme open-source de gestion des consentements conforme au RGPD.`,"settings.about.license":`Licence Apache-2.0.`,_section_changePassword:`── Changer le mot de passe ────────────────────────`,"changePassword.title":`Changer le mot de passe`,"changePassword.hint":`Choisissez un mot de passe fort d'au moins 12 caractères.`,"changePassword.success":`Mot de passe mis à jour avec succès.`,"changePassword.newPassword":`Nouveau mot de passe`,"changePassword.newPasswordPlaceholder":`Min. 12 caractères`,"changePassword.confirmPassword":`Confirmer le nouveau mot de passe`,"changePassword.confirmPasswordPlaceholder":`Répétez le nouveau mot de passe`,"changePassword.submit":`Mettre à jour le mot de passe`,"changePassword.submitting":`Enregistrement…`,"changePassword.error.minLength":`Le mot de passe doit contenir au moins 12 caractères.`,"changePassword.error.mismatch":`Les mots de passe ne correspondent pas.`,"changePassword.error.failed":`Échec de la mise à jour du mot de passe.`,"login.showPassword":`Show password`,"login.hidePassword":`Hide password`,"users.allowedSites":`Allowed Sites`,"users.allowedSitesHint":`(leave empty to allow all)`,"users.edit.title":`Edit User: {{name}}`,"users.edit.error.save":`Failed to save changes.`,"users.edit.resetPassword":`Réinitialiser le mot de passe`,"users.edit.resetPasswordHint":`(laisser vide pour conserver le mot de passe actuel)`,"users.edit.newPassword":`Nouveau mot de passe`,"users.edit.confirmNewPassword":`Confirmer le nouveau mot de passe`,"users.edit.passwordTooShort":`Le mot de passe doit contenir au moins 12 caractères`,"users.detail.title":`Utilisateur`,"users.detail.allSites":`Tous les sites`,"profileEditor.import.imported":`Imported {{n}} locales: {{list}}`,"profileEditor.import.importedSingular":`Imported 1 locale: {{list}}`,"profileEditor.import.skipped":`Skipped {{n}} unrecognised locale keys: {{list}}`,"profileEditor.import.skippedSingular":`Skipped 1 unrecognised locale key: {{list}}`,"profileEditor.config.selectDefaultLocale":`Select default locale…`,"profileEditor.config.complianceGroup":`Compliance Group`,"profileEditor.config.complianceGroupNone":`None / Custom`,"profileEditor.config.customComplianceGroup":`Custom group name`,"profileEditor.config.customComplianceGroupPlaceholder":`e.g. internal-testing`,"profileEditor.config.customComplianceGroupHint":`Lower-kebab-case identifier. The widget's compliance.type config uses this to fetch the profile — required, since there's no other way to address it. Only one profile can be active per name at a time. No compliance-rule defaults are applied (those only exist for the built-in groups above).`,"profileEditor.config.gpcMode":`GPC Signal Mode`,"profileEditor.config.gpcModeDefault":`Default (inherit from compliance group)`,"profileEditor.config.gpcModePlaceholder":`Default`,"profileEditor.config.hidePoweredBy":`Hide "Powered by Consenti"`,"profileEditor.config.hidePoweredByHint":`Remove the branding link from the consent banner.`,"profileEditor.config.allowReceipt":`Allow consent receipt`,"profileEditor.config.allowReceiptHint":`Let visitors download a PDF receipt of their consent choices.`,"profileEditor.config.enhanceAccessibility":`Améliorer l'accessibilité`,"profileEditor.config.enhanceAccessibilityHint":`Applique la taille minimale des boutons WCAG 2.1 AA (44px), des anneaux de mise au point visibles et des étiquettes pour lecteurs d'écran au widget de consentement.`,"profileEditor.config.showFooterMetadata":`Afficher les métadonnées en pied`,"profileEditor.config.showFooterMetadataHint":`Affiche une bande dans la bannière et la modale avec l'ID de consentement, la date, la version du profil et un lien vers les paramètres de confidentialité.`,"profileEditor.conflict.title":`Active profile conflict`,"profileEditor.conflict.message":`Profile "{{name}}" is already active for this compliance group. Only one profile can be active per group.`,"profileEditor.conflict.deactivate":`Deactivate "{{name}}" and activate this one`,"profileEditor.conflict.saveInactive":`Save this profile as inactive`,"profileEditor.compliance.errors.heading":`Compliance errors — fix before continuing:`,"profileEditor.compliance.warnings.heading":`Compliance warnings:`,"profileEditor.compliance.warnings.acknowledge":`I acknowledge these warnings and wish to continue`,"profileEditor.compliance.preGrantOverridden":`Pre-grant was overridden for these parameters — this compliance group requires an explicit opt-in, so "Pre Grant" cannot stay enabled.`,"profileEditor.content.selectLocale":`Select locale…`,"profileEditor.content.addLocale":`+ Add locale`,"profileEditor.content.defaultLocaleLabel":`(default)`,_section_readability:`── Readability Warnings ─────────────────────────`,"readability.headingTooLong":`Heading is {{n}} characters — keep it under 80 for readability.`,"readability.avgSentenceLong":`Average sentence length is {{n}} words — aim for 25 or fewer.`,"readability.totalWordsLong":`Text is {{n}} words long — consider keeping banner copy under 150 words.`,"consentTemplates.editor.gpcMandatoryTitle":`Mandatory cookies are never auto-denied by GPC`,"consentTemplates.editor.loadDefaultsBtn":`Click here to load default cookies list`,"consentTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"consentTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"consentTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
|
|
2
|
-
|
|
3
|
-
Saving will update cookie definitions for all profiles using this template. Continue?`,"uiTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default structure (buttons, categories, positions).`,"uiTemplates.editor.loadDefaultsBtn":`Load Defaults`,"uiTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"uiTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"uiTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
|
|
4
|
-
|
|
5
|
-
Saving will apply UI changes to all profiles using this template. Continue?`,"uiTemplates.editor.wizard.stepOf":`Étape {{step}} sur {{total}}`,"uiTemplates.editor.wizard.next":`Suivant`,"uiTemplates.editor.wizard.back":`Retour`,"uiTemplates.editor.stackButtonsOnBreakpoint":`Empiler les boutons (px)`,"uiTemplates.editor.stackButtonsOnBreakpointHint":`Les boutons s'empilent verticalement en dessous de cette largeur. 0 = désactivé. Défaut : 576.`,"uiTemplates.editor.trapFocus":`Capturer le focus`,"uiTemplates.editor.trapFocusHint":`Confine le focus clavier (Tab) dans le conteneur de consentement lorsque cette bannière ou modale est visible.`,_section_howItWorks:`── Comment fonctionne Consenti ──────────────────────`,"nav.howItWorks":`Comment fonctionne Consenti`,"howItWorks.title":`Comment fonctionne Consenti`,"howItWorks.intro":`Consenti est une plateforme de gestion du consentement open-source conforme au RGPD. Elle gère la collecte, le stockage et le reporting du consentement aux cookies pour vos sites web. Ce guide présente le flux de travail principal et décrit chaque section du tableau de bord.`,"howItWorks.workflow.heading":`Flux de travail principal`,"howItWorks.workflow.step1.title":`Définir les catégories de cookies`,"howItWorks.workflow.step1.desc":`Accédez à Bannières de consentement → Modèles de cookies et créez un modèle listant toutes les catégories de cookies de votre site (ex. : analyse, marketing). Définissez la base légale et la durée de validité de chaque catégorie.`,"howItWorks.workflow.step2.title":`Concevoir l'interface de consentement`,"howItWorks.workflow.step2.desc":`Accédez à Bannières de consentement → Modèles UI et configurez la mise en page visuelle de votre bannière et de la modale de préférences — libellés des boutons, couleurs, style de mise en page et affichage des catégories.`,"howItWorks.workflow.step3.title":`Créer un profil de consentement`,"howItWorks.workflow.step3.desc":`Accédez à Bannières de consentement → Profils et combinez un Modèle de cookies avec un Modèle UI. Ajoutez du texte traduit pour chaque langue prise en charge, activez les réglementations requises (RGPD, CCPA, DPDPA) et publiez.`,"howItWorks.workflow.step4.title":`Intégrer le widget`,"howItWorks.workflow.step4.desc":`Copiez votre clé API depuis API → Configuration et ajoutez la balise script Consenti à votre site web. Le widget récupère votre profil publié et affiche automatiquement la bannière de consentement.`,"howItWorks.workflow.step5.title":`Surveiller et auditer`,"howItWorks.workflow.step5.desc":`Utilisez les pages Consentements et Visiteurs pour consulter les enregistrements de consentement en temps réel. Utilisez le Journal d'audit pour un historique infalsifiable de toutes les actions administratives comme preuve de conformité.`,"howItWorks.features.heading":`Fonctionnalités du tableau de bord`,"howItWorks.features.dashboard.title":`Tableau de bord`,"howItWorks.features.dashboard.desc":`L'écran d'accueil affiche des KPI en temps réel — total des consentements, taux d'acceptation, taux de refus et un graphique chronologique. Utilisez-le pour repérer les tendances et évaluer l'impact des modifications de bannière.`,"howItWorks.features.reports.title":`Rapports`,"howItWorks.features.reports.desc":`Tendance d'acceptation sur une plage de dates, ainsi que des répartitions par catégorie et par langue (accordé/refusé/objecté). Nécessite la permission stats:view.`,"howItWorks.features.consentTemplates.title":`Modèles de cookies`,"howItWorks.features.consentTemplates.desc":`Listes réutilisables de catégories de cookies. Chaque catégorie possède un ID, une base légale (consentement, intérêt légitime, nécessaire), la gestion du signal GPC, une durée de validité et un mappage optionnel vers un fournisseur TCF ou une catégorie CPRA.`,"howItWorks.features.uiTemplates.title":`Modèles UI`,"howItWorks.features.uiTemplates.desc":`Contrôle l'apparence de la bannière de consentement, de l'avis GPC et de la modale de préférences. Configurez les jeux de boutons, les balises d'en-tête, l'opacité du calque superposé et l'ordre d'affichage des catégories.`,"howItWorks.features.profiles.title":`Profils`,"howItWorks.features.profiles.desc":`Un profil est l'unité déployable. Il associe un Modèle de cookies à un Modèle UI, stocke le contenu multilingue et suit un numéro de version pour permettre les retours en arrière. Un seul profil par domaine peut être actif à la fois.`,"howItWorks.features.consents.title":`Consentements`,"howItWorks.features.consents.desc":`Un journal consultable et filtrable de tous les enregistrements de consentement soumis par les visiteurs. Chaque enregistrement affiche l'ID du visiteur, le profil utilisé, la langue, le signal GPC, les choix de consentement et l'horodatage.`,"howItWorks.features.visitors.title":`Visiteurs`,"howItWorks.features.visitors.desc":`Une liste d'identifiants de visiteurs uniques sur vos sites, avec leur pays, leur date de première visite et leur date de dernière visite. Les identifiants de visiteurs sont des UUID pseudonymes stockés sans adresses IP brutes.`,"howItWorks.features.users.title":`Utilisateurs`,"howItWorks.features.users.desc":`Gérez les comptes administrateurs pouvant se connecter à ce tableau de bord. Attribuez des rôles, activez ou désactivez des comptes et restreignez les utilisateurs à des sites spécifiques dans les déploiements multi-tenant.`,"howItWorks.features.roles.title":`Rôles`,"howItWorks.features.roles.desc":`Définissez des ensembles de permissions nommés (ex. : Lecteur, Éditeur, Administrateur). Attribuez des permissions granulaires telles que consent:view, profile:edit ou audit:view à chaque rôle, puis assignez des rôles aux utilisateurs.`,"howItWorks.features.vendors.title":`Fournisseurs`,"howItWorks.features.vendors.desc":`Parcourez la Liste mondiale des fournisseurs (GVL) de l'IAB pour rechercher les identifiants de fournisseurs TCF, les finalités déclarées et les finalités d'intérêt légitime. Utilisez ces identifiants lors de la configuration des catégories de cookies dans vos modèles.`,"howItWorks.features.audit.title":`Journal d'audit`,"howItWorks.features.audit.desc":`Un journal en ajout seul et infalsifiable de chaque action administrative — sauvegardes de profils, modifications d'utilisateurs, création de clés API et plus. Requis pour les obligations de responsabilité du RGPD.`,"howItWorks.features.api.title":`API et clés`,"howItWorks.features.api.desc":`Générez et révoquez des jetons API, configurez les origines CORS autorisées pour l'API publique de consentement et parcourez la référence interactive OpenAPI pour comprendre chaque point de terminaison.`,"howItWorks.features.settings.title":`Paramètres`,"howItWorks.features.settings.desc":`Consultez les détails de votre compte, changez votre mot de passe et exportez les données de consentement ou d'audit en CSV, XLSX ou JSON pour une analyse hors ligne ou une soumission réglementaire.`,"howItWorks.docs.heading":`Documentation complète`,"howItWorks.docs.text":`Des guides détaillés, des références de configuration, des exemples d'intégration et un playground en direct sont disponibles sur le site de documentation de Consenti.`,"howItWorks.docs.link":`Ouvrir consenti.dev/docs →`,"howItWorks.consentFlow.heading":`Flux de consentement de bout en bout`,"howItWorks.consentFlow.step1.title":`Initialisation du widget`,"howItWorks.consentFlow.step1.desc":`Le script Consenti se charge dans le navigateur du visiteur et lit votre configuration (clé API, compliance.type). Si un cookie de consentement valide et non expiré existe déjà, le widget se ferme silencieusement — aucune bannière n'est affichée.`,"howItWorks.consentFlow.step2.title":`Juridiction détectée`,"howItWorks.consentFlow.step2.desc":`Si compliance.type est 'auto', le widget appelle GET /resolve-profile en transmettant le fuseau horaire, l'en-tête Accept-Language et l'adresse IP du visiteur. Le serveur associe ces signaux à un complianceGroup à l'aide de la carte pays → conformité intégrée.`,"howItWorks.consentFlow.step3.title":`Profil récupéré`,"howItWorks.consentFlow.step3.desc":`Le widget récupère le profil actif pour le complianceGroup résolu et la langue du visiteur. La réponse est un objet JSON plat contenant tout le texte de la bannière, les catégories de cookies, les paramètres UI et les indicateurs réglementaires — prêt à être rendu.`,"howItWorks.consentFlow.step4.title":`Bannière affichée`,"howItWorks.consentFlow.step4.desc":`Le widget affiche la bannière ou la fenêtre modale de préférences selon le modèle UI du profil. Les catégories obligatoires sont pré-cochées et ne peuvent pas être désélectionnées. Les catégories optionnelles indiquent leur base juridique (consentement ou intérêt légitime).`,"howItWorks.consentFlow.step5.title":`Consentement soumis`,"howItWorks.consentFlow.step5.desc":`Lorsque le visiteur agit (Tout accepter, Tout refuser ou Enregistrer les préférences), le widget envoie un POST à l'API avec l'enregistrement de consentement : ID visiteur, version du profil, statut par catégorie (accordé/refusé/objecté), signal GPC, horodatage et langue.`,"howItWorks.consentFlow.step6.title":`Stocké et audité`,"howItWorks.consentFlow.step6.desc":`L'API valide la charge utile, stocke l'enregistrement de consentement et ajoute une entrée au journal d'audit en ajout seul. L'enregistrement du visiteur est mis à jour avec le pays et les dates de première/dernière visite. Le widget écrit le cookie de consentement pour que les visites futures passent outre la bannière.`,"howItWorks.profileResolution.heading":`Algorithme de résolution de profil`,"howItWorks.profileResolution.intro":`À l'arrivée d'un visiteur, Consenti résout en cinq étapes le profil de consentement à afficher.`,"howItWorks.profileResolution.step1.title":`Signaux géographiques collectés`,"howItWorks.profileResolution.step1.desc":`Le widget envoie trois signaux à GET /resolve-profile : le fuseau horaire du navigateur (Intl.DateTimeFormat), l'en-tête Accept-Language (ou le paramètre lang), et l'adresse IP côté serveur.`,"howItWorks.profileResolution.step2.title":`Pays déterminé`,"howItWorks.profileResolution.step2.desc":`Le serveur essaie dans l'ordre : (1) géolocalisation IP via le geoDataProvider configuré ; (2) table de correspondance fuseau horaire → pays ; (3) heuristique balise de langue → pays (ex. 'fr' → FR). La première correspondance non vide l'emporte.`,"howItWorks.profileResolution.step3.title":`Groupe de conformité associé`,"howItWorks.profileResolution.step3.desc":`Le code pays ISO-3166-1 alpha-2 (plus le code région/état optionnel) est recherché dans la carte PAYS → GROUPE_DE_CONFORMITÉ intégrée. Un remplacement régional (ex. US/CA → optOutCalifornia) prend la priorité sur le défaut du pays.`,"howItWorks.profileResolution.step4.title":`Profil actif trouvé`,"howItWorks.profileResolution.step4.desc":`Le système interroge la base de données pour trouver le profil actif dont le complianceGroup correspond au groupe résolu. Un seul profil par complianceGroup peut être actif à la fois. Si aucun n'existe, une erreur 404 est renvoyée et le widget peut revenir à un profileOverride.`,"howItWorks.profileResolution.step5.title":`Langue résolue`,"howItWorks.profileResolution.step5.desc":`La meilleure langue est choisie par : (1) correspondance exacte avec la langue demandée par le widget ; (2) correspondance par préfixe de langue (ex. 'fr-BE' → 'fr') ; (3) langue résolue par le fournisseur ; (4) defaultLocale du profil. Le JSON résolu est servi depuis un fichier statique (profils publiés) ou directement depuis la base de données (aperçus).`,"howItWorks.complianceGroups.heading":`Groupes de conformité`,"howItWorks.complianceGroups.intro":`Chaque pays du monde est associé à l'un des huit groupes de conformité. Chaque groupe détermine le modèle de consentement que le widget doit suivre.`,"howItWorks.complianceGroups.optIn.title":`optIn — RGPD / ePrivacy Opt-In strict`,"howItWorks.complianceGroups.optIn.desc":`Le consentement préalable est obligatoire avant tout cookie non essentiel. Les visiteurs doivent avoir la possibilité de refuser, le retrait doit être aussi simple que le consentement, et des choix granulaires par catégorie sont requis.`,"howItWorks.complianceGroups.optIn.laws":`RGPD, Directive ePrivacy, UK RGPD, PECR, revLPD (CH), KVKK (TR), PDPA (TH) et autres lois nationales strictes`,"howItWorks.complianceGroups.optIn.countries":`Tous les États membres de l'UE, Royaume-Uni, Suisse, Turquie, Thaïlande, Islande, Liechtenstein, Norvège, Guernesey, Gibraltar et autres pays avec des règles ePrivacy strictes`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — Inde DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`La loi indienne sur la protection des données personnelles numériques 2023 exige un consentement explicite opt-in. Obligations supplémentaires : nommer un Data Fiduciary, fournir une notice de consentement dédiée et soutenir les droits des Data Principals. Définissez le champ dpdpaDataFiduciary dans votre profil.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Digital Personal Data Protection Act 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`Inde (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — Cadre multi-lois chinois`,"howItWorks.complianceGroups.optInChina.desc":`La gouvernance des données en Chine exige un consentement explicite sous PIPL, combiné aux obligations de la loi sur la sécurité des données (DSL) et de la loi sur la cybersécurité (CSL). Des exigences supplémentaires s'appliquent aux transferts transfrontaliers et à la classification des données.`,"howItWorks.complianceGroups.optInChina.laws":`Loi sur la protection des informations personnelles (PIPL), Loi sur la sécurité des données (DSL), Loi sur la cybersécurité (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`Chine (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — Californie CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Les données peuvent être collectées par défaut, mais les consommateurs doivent disposer d'une option claire pour refuser la vente ou le partage de leurs données personnelles. Le signal GPC (Global Privacy Control) doit être respecté comme un opt-out valide.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`États-Unis — Californie (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Autres États américains`,"howItWorks.complianceGroups.optOutUSState.desc":`Inspiré du cadre californien d'opt-out. Les consommateurs peuvent refuser la publicité ciblée et la vente de données personnelles. Plusieurs États exigent le respect du signal GPC.`,"howItWorks.complianceGroups.optOutUSState.laws":`CDPA (VA), CPA (CO), CTDPA (CT), UCPA (UT), TDPSA (TX), DPDPA (DE), NJDPA (NJ), OCPA (OR), MCDPA (MN), MODPA (MD), KCDPA (KY), TIPA (TN), NDPA (NE), ICDPA (IA/IN), MCDPA (MT), NHPA (NH), RIDTPA (RI)`,"howItWorks.complianceGroups.optOutUSState.countries":`États-Unis — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — Confidentialité générale / Consentement`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`Une loi générale sur la protection des données s'applique mais n'impose pas de bannière cookie stricte de type PECR/ePrivacy. La meilleure pratique est d'offrir un choix de consentement pour les cookies non essentiels et une notice de confidentialité claire, mais l'exigence légale est inférieure au niveau opt-in du RGPD.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Loi 25 (CA), LGPD (BR — utiliser hybridBrazil), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID et de nombreux autres`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Canada, Australie, Nouvelle-Zélande, Japon, Corée du Sud, Singapour, Malaisie, Afrique du Sud, et de nombreux pays d'Amérique latine, d'Afrique et d'Asie`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brésil LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`La LGPD brésilienne est globalement similaire au RGPD, mais les cookies d'analyse et de publicité peuvent être traités sous la base de l'intérêt légitime selon l'évaluation du responsable de traitement. La bannière est affichée, mais la base juridique par catégorie peut être plus nuancée qu'un opt-in strict RGPD.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brésil (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Notice de confidentialité uniquement`,"howItWorks.complianceGroups.noticeOnly.desc":`Aucune réglementation spécifique aux cookies ne s'applique, ou le régime existant ne requiert qu'une notice de confidentialité — ni opt-in ni opt-out obligatoire. L'affichage d'une bannière de consentement reste recommandé pour la transparence, mais n'est pas légalement imposé.`,"howItWorks.complianceGroups.noticeOnly.laws":`Variable — pays sans réglementation dédiée aux cookies / à l'ePrivacy`,"howItWorks.complianceGroups.noticeOnly.countries":`Nombreux pays d'Afrique, d'Asie centrale, des Caraïbes et du Pacifique non couverts par les groupes ci-dessus`,"howItWorks.enums.heading":`Référence des valeurs clés`,"howItWorks.enums.legalBasis.heading":`legalBasis (catégorie de cookie)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — La catégorie est toujours active quelle que soit la décision de consentement (ex. session, authentification). Jamais bloquée par GPC ou les signaux d'opt-out.`,"howItWorks.enums.legalBasis.consent":`consent — Nécessite un opt-in explicite du visiteur. Bloqué par défaut ; bloqué par GPC dans toutes les juridictions opt-in.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Repose sur l'intérêt légitime du responsable de traitement. Actif par défaut ; le visiteur peut s'y opposer. Soft-bloqué par GPC dans certaines juridictions (UE, RU).`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (par enregistrement de catégorie)`,"howItWorks.enums.consentStatus.granted":`granted — Le visiteur a donné son consentement explicite pour cette catégorie.`,"howItWorks.enums.consentStatus.denied":`denied — Le visiteur a explicitement refusé son consentement pour cette catégorie.`,"howItWorks.enums.consentStatus.objected":`objected — Le visiteur s'est opposé à une catégorie à intérêt légitime (opt-out, pas un refus de consentement).`,"howItWorks.enums.geoProvider.heading":`Options geoDataProvider`,"howItWorks.enums.geoProvider.default":`default / timezone — Utilise le fuseau horaire du navigateur (Intl.DateTimeFormat) pour déduire le pays, avec repli sur Accept-Language. Aucune dépendance supplémentaire.`,"howItWorks.enums.geoProvider.language":`language — Déduit le pays uniquement depuis l'en-tête Accept-Language (ex. 'fr' → FR, 'pt' → BR). Rapide mais imprécis.`,"howItWorks.enums.geoProvider.geoip":`geoip — Utilise le package npm geoip-lite avec une base de données MaxMind Lite intégrée. Requis : npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Appelle ipinfo.io via HTTPS intégré (aucune dépendance supplémentaire). Ajoute ~50–200 ms par première visite.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Utilise le package npm maxmind avec un fichier local GeoLite2-City.mmdb. Le plus précis. Nécessite la variable d'environnement MAXMIND_DB_PATH et npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`Fonction personnalisée — Passez une CountryResolverFn à compliance.geoDataProvider pour intégrer n'importe quel fournisseur géo-IP ou CDN.`,"consentTemplates.editor.categories":`Consent Categories`,"consentTemplates.editor.addCategory":`+ Add Category`,"consentTemplates.editor.noCategories":`No categories defined yet. Add one above.`,"consentTemplates.editor.error.noCategories":`At least one category is required.`,"consentTemplates.editor.error.catIds":`All categories must have an ID.`,"consentTemplates.editor.error.uniqueCatIds":`Category IDs must be unique.`,"consentTemplates.editor.error.catCookies":`Every category must contain at least one parameter.`,"consentTemplates.editor.error.uncategorized":`Parameter "{{id}}" is not assigned to any category.`,"consentTemplates.editor.error.multiCategory":`Parameter "{{id}}" is assigned to more than one category.`,"consentTemplates.editor.error.purposeLegalBasisMismatch":`Parameter "{{id}}" has a non-necessary purpose but is assigned to a Mandatory category — this grants a tracking parameter with no consent gate.`,"consentTemplates.editor.warning.necessaryNotMandatory":`Parameter "{{id}}" has purpose "necessary" but is assigned to a non-Mandatory category — this may break site functionality since it can be denied.`,"cookieTemplates.editor.trackerDetected":`Détecté : {{vendor}}`,"consentTemplates.col.preGrantShort":`Pre Grant`,"profileEditor.config.expiryDays":`Re-consent Interval (days)`,"profileEditor.config.expiryDaysHint":`How many days until stored consent expires and the visitor is asked again.`,"profileEditor.error.expiryDays":`Expiry (days) must be at least 1.`,"profileEditor.error.customComplianceGroupRequired":`Enter a custom group name, or pick a compliance group above.`,"profileEditor.table.preGrant":`Pre Grant`,"profileEditor.table.preGrantLocked":`Already effectively pre-granted — only editable when the category's legal basis is Consent`,"profileEditor.content.receiptHeading":`Consent Receipt Checkbox`,"profileEditor.content.receiptHint":`Shown in the preference modal when "Allow consent receipt" is enabled in Step 1.`,"profileEditor.content.receiptLabel":`Checkbox label`,"profileEditor.content.receiptDescription":`Description`,"profileEditor.error.missingRequiredContent":`Du contenu obligatoire manque pour la langue « {{locale}} » — vérifiez l'onglet mis en évidence.`,"profileEditor.nudge.title":`Champ facultatif laissé vide`,"profileEditor.nudge.headingBlank":`Vous avez laissé le titre vide. Les visiteurs verront la bannière sans titre.`,"profileEditor.nudge.introBlank":`Vous avez laissé le texte d'introduction vide. Les visiteurs verront le panneau de préférences sans introduction.`,"profileEditor.nudge.addNow":`Ajouter maintenant`,"profileEditor.nudge.ignore":`Ignorer`};export{e as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-MdjI3m3u.js";var t=e(`history`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]]);export{t};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-800:oklch(43.2% .095 166.913);--color-teal-600:oklch(60% .118 184.704);--color-cyan-400:oklch(78.9% .154 211.53);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:#1abf85;--color-blue-700:#1abf85;--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-rose-500:oklch(64.5% .246 16.439);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-y-0{inset-block:0}.top-1\/2{top:50%}.top-5{top:calc(var(--spacing) * 5)}.top-full{top:100%}.-right-3\.5{right:calc(var(--spacing) * -3.5)}.right-0{right:0}.right-2\.5{right:calc(var(--spacing) * 2.5)}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-4{margin-block:calc(var(--spacing) * 4)}.my-7{margin-block:calc(var(--spacing) * 7)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-\[calc\(100vh-10rem\)\]{height:calc(100vh - 10rem)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-52{max-height:calc(var(--spacing) * 52)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[85vh\]{max-height:85vh}.min-h-\[33px\]{min-height:33px}.min-h-\[42px\]{min-height:42px}.min-h-\[56px\]{min-height:56px}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[100px\]{max-width:100px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-\[160px\]{min-width:160px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-2{--tw-translate-x:calc(var(--spacing) * 2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[1fr_1fr_1fr_2fr_auto\]{grid-template-columns:1fr 1fr 1fr 2fr auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{-moz-column-gap:calc(var(--spacing) * 2);column-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-50>:not(:last-child)){border-color:var(--color-gray-50)}:where(.divide-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-100{border-color:var(--color-blue-100)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-blue-400{border-color:var(--color-blue-400)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-400{border-color:var(--color-gray-400)}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-green-200{border-color:var(--color-green-200)}.border-purple-100{border-color:var(--color-purple-100)}.border-purple-300{border-color:var(--color-purple-300)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.border-transparent{border-color:#0000}.border-t-gray-900{border-top-color:var(--color-gray-900)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-50\/60{background-color:#eff6ff99}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/60{background-color:color-mix(in oklab, var(--color-blue-50) 60%, transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-950{background-color:var(--color-gray-950)}.bg-gray-950\/30{background-color:#0307124d}@supports (color:color-mix(in lab, red, red)){.bg-gray-950\/30{background-color:color-mix(in oklab, var(--color-gray-950) 30%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab, red, red)){.bg-green-900\/30{background-color:color-mix(in oklab, var(--color-green-900) 30%, transparent)}}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab, red, red)){.bg-red-900\/30{background-color:color-mix(in oklab, var(--color-red-900) 30%, transparent)}}.bg-rose-500{background-color:var(--color-rose-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-transparent{background-color:#0000}.bg-violet-100{background-color:var(--color-violet-100)}.bg-white{background-color:var(--color-white)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:0}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-1{padding-left:var(--spacing)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-200{color:var(--color-blue-200)}.text-blue-400{color:var(--color-blue-400)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-orange-700{color:var(--color-orange-700)}.text-orange-800{color:var(--color-orange-800)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.accent-amber-700{accent-color:var(--color-amber-700)}.accent-blue-600{accent-color:var(--color-blue-600)}.accent-gray-600{accent-color:var(--color-gray-600)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-cyan-400{--tw-ring-color:var(--color-cyan-400)}.blur-sm{--tw-blur:blur(var(--blur-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.first\:pt-0:first-child{padding-top:0}.last\:flex-none:last-child{flex:none}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:border-blue-400:focus-within{border-color:var(--color-blue-400)}.focus-within\:border-blue-500:focus-within{border-color:var(--color-blue-500)}.focus-within\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\:ring-blue-400:focus-within{--tw-ring-color:var(--color-blue-400)}.focus-within\:ring-blue-500:focus-within{--tw-ring-color:var(--color-blue-500)}.focus-within\:ring-red-400:focus-within{--tw-ring-color:var(--color-red-400)}@media (hover:hover){.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-amber-800:hover{background-color:var(--color-amber-800)}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-purple-50:hover{background-color:var(--color-purple-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-amber-700:hover{color:var(--color-amber-700)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-green-700:hover{color:var(--color-green-700)}.hover\:text-green-800:hover{color:var(--color-green-800)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-50:disabled{background-color:var(--color-gray-50)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\:block{display:block}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[280px_1fr\]{grid-template-columns:280px 1fr}}@media (width>=64rem){.lg\:col-span-4{grid-column:span 4/span 4}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[1fr_1fr_1fr_auto\]{grid-template-columns:1fr 1fr 1fr auto}}@media (width>=80rem){.xl\:sticky{position:sticky}.xl\:top-4{top:calc(var(--spacing) * 4)}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}}.dark\:border-gray-600:where(.dark,.dark *){border-color:var(--color-gray-600)}.dark\:border-gray-700:where(.dark,.dark *){border-color:var(--color-gray-700)}.dark\:border-green-800:where(.dark,.dark *){border-color:var(--color-green-800)}.dark\:border-red-800:where(.dark,.dark *){border-color:var(--color-red-800)}.dark\:bg-blue-900\/30:where(.dark,.dark *){background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:bg-gray-700:where(.dark,.dark *){background-color:var(--color-gray-700)}.dark\:bg-gray-700\/50:where(.dark,.dark *){background-color:#36415380}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-gray-700) 50%, transparent)}}.dark\:bg-gray-800:where(.dark,.dark *){background-color:var(--color-gray-800)}.dark\:bg-gray-900:where(.dark,.dark *){background-color:var(--color-gray-900)}.dark\:bg-green-900\/20:where(.dark,.dark *){background-color:#0d542b33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/20:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-green-900) 20%, transparent)}}.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:#82181a33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-red-900) 20%, transparent)}}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-gray-100:where(.dark,.dark *){color:var(--color-gray-100)}.dark\:text-gray-200:where(.dark,.dark *){color:var(--color-gray-200)}.dark\:text-gray-300:where(.dark,.dark *){color:var(--color-gray-300)}.dark\:text-gray-400:where(.dark,.dark *){color:var(--color-gray-400)}.dark\:text-gray-500:where(.dark,.dark *){color:var(--color-gray-500)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}@media (hover:hover){.dark\:hover\:bg-gray-700:where(.dark,.dark *):hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-700\/40:where(.dark,.dark *):hover{background-color:#36415366}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-gray-700\/40:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-gray-700) 40%, transparent)}}.dark\:hover\:bg-gray-800:where(.dark,.dark *):hover{background-color:var(--color-gray-800)}.dark\:hover\:text-gray-200:where(.dark,.dark *):hover{color:var(--color-gray-200)}.dark\:hover\:text-gray-300:where(.dark,.dark *):hover{color:var(--color-gray-300)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}}select,input[type=text],input:not([type]){min-height:30px}[contenteditable][data-placeholder]:not(:focus):before{content:attr(data-placeholder);color:#9ca3af;pointer-events:none;display:block}.no-underline{text-decoration:none!important}.dark .bg-white{background-color:#1f2937}.dark .bg-gray-50{background-color:#111827}.dark .bg-gray-100{background-color:#1f2937}.dark .bg-gray-200{background-color:#374151}.dark .text-gray-900{color:#f9fafb}.dark .text-gray-800{color:#f3f4f6}.dark .text-gray-700{color:#e5e7eb}.dark .text-gray-600{color:#d1d5db}.dark .border-gray-200{border-color:#374151}.dark .border-gray-300{border-color:#4b5563}.dark .divide-gray-200>*+*{border-color:#374151}.dark .shadow-sm{box-shadow:0 1px 2px #0000004d}.dark select,.dark input[type=text],.dark input[type=email],.dark input[type=password],.dark input[type=number],.dark input[type=search],.dark input:not([type]),.dark textarea{color:#f9fafb;background-color:#374151;border-color:#4b5563}.dark select option{color:#f9fafb;background-color:#1f2937}[contenteditable].dark,.dark [contenteditable]{color:#f9fafb;background-color:#374151}select,button,input[type=button],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer;accent-color:#14a76e}select:disabled,button:disabled,input[type=button]:disabled,input[type=submit]:disabled,input[type=radio]:disabled,input[type=checkbox]:disabled{cursor:not-allowed;opacity:.8;background-color:#f3f3f3}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Reports-DWEjQOKh.js","assets/createLucideIcon-MdjI3m3u.js","assets/client-ymc9nwWr.js","assets/ProfileList-CWKSAgu0.js","assets/check-o5cp1s2J.js","assets/copy-C01KoUUH.js","assets/history-CHTts_m2.js","assets/trash-Dj1jhzHJ.js","assets/ConfirmDialog-DTtw7VJ-.js","assets/Table-DH_jh8_N.js","assets/search-Bd2RdDRh.js","assets/profiles-DmrdGv7t.js","assets/dist-DlhLroYC.js","assets/PermissionGate-Bhhf7SMh.js","assets/ProfileEditor-BXtaE0tL.js","assets/PreviewPane-Dq5K1h2L.js","assets/x-BRuyBEQP.js","assets/templates-B2xiivh4.js","assets/templates-CnMoLavN.js","assets/Select-DjJNwlbY.js","assets/ProfileVersionHistory-1h8sUgog.js","assets/ArchivedProfileList-Bw-fx-BD.js","assets/ConsentTemplateList-DCys2nM3.js","assets/ConsentTemplateEditor-BKIEnLmA.js","assets/HeadingTagInput-BTjrdzlS.js","assets/debounce-DlvAAT2V.js","assets/UITemplateList-BS7X4u4F.js","assets/UITemplateEditor-9A55scBe.js","assets/ConsentList-BWOvPOMG.js","assets/useHashQuery-B5ytMIMp.js","assets/RecordDetailModal-FaFhzQXi.js","assets/VisitorList-COP1SyNd.js","assets/UserList-SPkMyFRy.js","assets/users-czK8LRVh.js","assets/roles-C0dJPFl4.js","assets/RoleList-BSGoqlzp.js","assets/trash-2-BBnkdgm_.js","assets/TenantList-5AwFtoHf.js","assets/VendorList-C5fPhr6U.js","assets/AuditLog-D6HiTQ1o.js","assets/Settings-CVYrlyLm.js","assets/ChangePassword-D2rPkzD1.js","assets/ApiConfig-CE-Noelz.js","assets/external-link-DVe00ZBK.js","assets/HowItWorks-AeyjfQGO.js","assets/SetupWizard-4NTb5bZj.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,d as n,f as r,i,l as a,m as o,o as s,p as c,r as l,t as u}from"./createLucideIcon-MdjI3m3u.js";import{i as d,n as f}from"./client-ymc9nwWr.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var p=`consenti_token`,m=30*6e4,h=6e4,g=[`mousemove`,`keydown`,`click`,`scroll`,`touchstart`];function _(e){if(!e)return null;try{let t=e.split(`.`)[1];if(!t)return null;let n=JSON.parse(atob(t.replace(/-/g,`+`).replace(/_/g,`/`))),r=n.exp;return r&&r<Math.floor(Date.now()/1e3)?null:{sub:n.sub,email:n.email,roles:n.roles??[],permissions:n.permissions??[]}}catch{return null}}var v=o({user:null,token:null,login:()=>{},logout:()=>{}});function y({children:n}){let[r,i]=t(()=>localStorage.getItem(p)),[o,c]=t(()=>_(localStorage.getItem(p))),l=s(Date.now()),u=e=>{localStorage.setItem(p,e),i(e),c(_(e))},y=()=>{localStorage.removeItem(p),i(null),c(null),window.location.hash=`#/login`};return a(()=>(window.addEventListener(f,y),()=>window.removeEventListener(f,y)),[]),a(()=>{let e=()=>{l.current=Date.now()};for(let t of g)window.addEventListener(t,e,{passive:!0});return()=>{for(let t of g)window.removeEventListener(t,e)}},[]),a(()=>{let e=setInterval(()=>{if(localStorage.getItem(p)){if(Date.now()-l.current>=m){y();return}d(`/auth/refresh`,{method:`POST`}).then(e=>u(e.token)).catch(()=>{})}},h);return()=>clearInterval(e)},[]),e(v.Provider,{value:{user:o,token:r,login:u,logout:y},children:n})}function b(){return n(v)}var x=o({theme:`light`,toggle:()=>{}});function ee({children:n}){let[r,i]=t(()=>{try{return localStorage.getItem(`dashboard-theme`)??`light`}catch{return`light`}});return a(()=>{document.documentElement.classList.toggle(`dark`,r===`dark`);try{localStorage.setItem(`dashboard-theme`,r)}catch{}},[r]),e(x.Provider,{value:{theme:r,toggle:()=>i(e=>e===`dark`?`light`:`dark`)},children:n})}var S=()=>n(x),C={appName:`Consenti`,appLogoPath:`./logo-dark.svg`,hidePoweredBy:!1};function te(){let e=window.__CONSENTI_CONFIG__;return e?{appName:e.appName,appLogoPath:e.appLogoPath,hidePoweredBy:e.hidePoweredBy}:C}var w=o(C);function ne({children:n}){let[r]=t(te);return e(w.Provider,{value:r,children:n})}function T(){return n(w)}var re=u(`chart-column`,[[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`,key:`c24i48`}],[`path`,{d:`M18 17V9`,key:`2bz60n`}],[`path`,{d:`M13 17V5`,key:`1frdt8`}],[`path`,{d:`M8 17v-3`,key:`17ska0`}]]),E=u(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),D=u(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]),O=u(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),ie=u(`circle-question-mark`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),ae=u(`clipboard-list`,[[`rect`,{width:`8`,height:`4`,x:`8`,y:`2`,rx:`1`,ry:`1`,key:`tgr4d6`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2`,key:`116196`}],[`path`,{d:`M12 11h4`,key:`1jrz19`}],[`path`,{d:`M12 16h4`,key:`n85exb`}],[`path`,{d:`M8 11h.01`,key:`1dfujw`}],[`path`,{d:`M8 16h.01`,key:`18s6g9`}]]),oe=u(`cookie`,[[`path`,{d:`M12 2a10 10 0 1 0 10 10 4 4 0 0 1-5-5 4 4 0 0 1-5-5`,key:`laymnq`}],[`path`,{d:`M8.5 8.5v.01`,key:`ue8clq`}],[`path`,{d:`M16 15.5v.01`,key:`14dtrp`}],[`path`,{d:`M12 12v.01`,key:`u5ubse`}],[`path`,{d:`M11 17v.01`,key:`1hyl5a`}],[`path`,{d:`M7 14v.01`,key:`uct60s`}]]),k=u(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]),A=u(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),j=u(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),se=u(`key`,[[`path`,{d:`m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4`,key:`g0fldk`}],[`path`,{d:`m21 2-9.6 9.6`,key:`1j0ho8`}],[`circle`,{cx:`7.5`,cy:`15.5`,r:`5.5`,key:`yqb3hr`}]]),ce=u(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),M=u(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),le=u(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),ue=u(`palette`,[[`path`,{d:`M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z`,key:`e79jfc`}],[`circle`,{cx:`13.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`1okk4w`}],[`circle`,{cx:`17.5`,cy:`10.5`,r:`.5`,fill:`currentColor`,key:`f64h9f`}],[`circle`,{cx:`6.5`,cy:`12.5`,r:`.5`,fill:`currentColor`,key:`qy21gx`}],[`circle`,{cx:`8.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`fotxhn`}]]),de=u(`plug`,[[`path`,{d:`M12 22v-5`,key:`1ega77`}],[`path`,{d:`M15 8V2`,key:`18g5xt`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`,key:`1xoxul`}],[`path`,{d:`M9 8V2`,key:`14iosj`}]]),fe=u(`satellite-dish`,[[`path`,{d:`M4 10a7.31 7.31 0 0 0 10 10Z`,key:`1fzpp3`}],[`path`,{d:`m9 15 3-3`,key:`88sc13`}],[`path`,{d:`M17 13a6 6 0 0 0-6-6`,key:`15cc6u`}],[`path`,{d:`M21 13A10 10 0 0 0 11 3`,key:`11nf8s`}]]),pe=u(`scroll-text`,[[`path`,{d:`M15 12h-5`,key:`r7krc0`}],[`path`,{d:`M15 8h-5`,key:`1khuty`}],[`path`,{d:`M19 17V5a2 2 0 0 0-2-2H4`,key:`zz82l3`}],[`path`,{d:`M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3`,key:`1ph1d7`}]]),me=u(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),N=u(`shield-check`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),he=u(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),ge=u(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),_e=u(`ticket-slash`,[[`path`,{d:`M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z`,key:`qn84l0`}],[`path`,{d:`m9.5 14.5 5-5`,key:`qviqfa`}]]),ve=u(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),P={_section_nav:`── Navigation ──────────────────────────────────────────`,"nav.dashboard":`Dashboard`,"nav.consentBanners":`Consent Banners`,"nav.consentTemplates":`Consent Templates`,"nav.uiTemplates":`UI Templates`,"nav.profiles":`Profiles`,"nav.consents":`Consents`,"nav.visitors":`Visitors`,"nav.users":`Users`,"nav.roles":`Roles`,"nav.sites":`Sites`,"nav.vendors":`TCF Vendors`,"nav.reports":`Reports`,"nav.audit":`Audit Log`,"nav.api":`API`,"nav.settings":`Settings`,"nav.adminDashboard":`Admin Dashboard`,_section_layout:`── Layout ───────────────────────────────────────────`,"layout.expandSidebar":`Expand sidebar`,"layout.collapseSidebar":`Collapse sidebar`,"layout.signOut":`Sign out`,"layout.toggleDark":`Switch to dark mode`,"layout.toggleLight":`Switch to light mode`,"layout.poweredBy":`Powered by`,_section_common:`── Common ───────────────────────────────────────────`,"common.loading":`Loading…`,"common.searching":`Searching…`,"common.save":`Save`,"common.saving":`Saving…`,"common.cancel":`Cancel`,"common.close":`Close`,"common.delete":`Delete`,"common.edit":`Edit`,"common.create":`Create`,"common.confirm":`Confirm`,"common.noData":`No data`,"common.search":`Search…`,"common.perPage":`Per page`,"common.goToPage":`Go to page`,"common.pageOfTotal":`Page {{page}} of {{total}}`,"common.noResults":`No results match your search.`,"common.exportCsv":`Export CSV`,"common.duplicate":`Duplicate`,"common.active":`Active`,"common.inactive":`Inactive`,"common.name":`Name`,"common.email":`Email`,"common.status":`Status`,"common.created":`Created`,"common.id":`ID`,"common.add":`Add`,"common.remove":`Remove`,"common.revoke":`Revoke`,"common.required":`Required`,"common.version":`Version`,"common.locale":`Locale`,"common.country":`Country`,"common.source":`Source`,"common.grantAll":`Grant all`,"common.revokeAll":`Revoke all`,"common.granted":`granted`,"common.page":`Page {{n}}`,"common.prev":`Prev`,"common.next":`Next`,"common.you":`You`,"common.default":`default`,"common.hide":`Hide`,"common.show":`Show`,"common.activate":`Activate`,"common.deactivate":`Deactivate`,"common.newRole":`New Role`,"common.copyToClipboard":`Copy to clipboard`,"common.back":`Back`,"common.copyId":`Copy ID`,"common.mandatory":`mandatory`,"common.optional":`Optional`,"common.roles":`Roles`,"common.showPassword":`Show password`,"common.hidePassword":`Hide password`,"common.updated":`Updated`,_section_locale:`── Locale Switcher ─────────────────────────────────`,"locale.en":`English`,"locale.switcherAria":`Switch language`,_section_login:`── Login ────────────────────────────────────────────`,"login.title":`{{appName}} Admin`,"login.subtitle":`Sign in to your account`,"login.email":`Email`,"login.emailPlaceholder":`admin@example.com`,"login.password":`Password`,"login.submit":`Sign in`,"login.submitting":`Signing in…`,"login.error.invalid":`Invalid email or password`,"login.showPassword":`Show password`,"login.hidePassword":`Hide password`,"login.devSignIn":`⚡ Dev: sign in as user@consenti.dev`,_section_setupWizard:`── Setup Wizard ─────────────────────────────────`,"setupWizard.welcome.title":`Welcome to {{appName}}`,"setupWizard.welcome.body":`Let's get your consent management set up. This will only take a minute — we'll show you what's configured and help you install a starter set of compliance profiles.`,"setupWizard.welcome.docsLink":`View documentation`,"setupWizard.welcome.howItWorksLink":`See how Consenti works`,"setupWizard.welcome.getStarted":`Get started`,"setupWizard.welcome.skip":`Skip setup`,"setupWizard.config.title":`Your configuration`,"setupWizard.config.subtitle":`Here's what Consenti resolved from your config and environment variables, merged with sensible defaults. Secrets are hidden.`,"setupWizard.back":`Back`,"setupWizard.continue":`Continue`,"setupWizard.profiles.title":`Default compliance profiles`,"setupWizard.profiles.subtitle":`Consenti ships 8 pre-built compliance profiles covering the major global privacy regulations. Choose which ones to install now — you can always add more later.`,"setupWizard.profiles.selectAll":`Install all 8 default profiles`,"setupWizard.profiles.installAndContinue":`Install & continue`,"setupWizard.profiles.skipAndContinue":`Skip & continue`,"setupWizard.profiles.error":`Could not install the selected profiles. You can try again later from Profiles.`,"setupWizard.confirmation.title":`You're all set`,"setupWizard.confirmation.seededSummary":`{{count}} compliance profile(s) installed.`,"setupWizard.confirmation.noneSeeded":`No profiles were installed — you can create one anytime from Profiles.`,"setupWizard.confirmation.readinessTitle":`Before you go live`,"setupWizard.confirmation.readinessJsonStorage":`You're using the JSON file storage driver — fine for development, but switch to a database driver (node:sqlite, PostgreSQL, MySQL, MongoDB) for production.`,"setupWizard.confirmation.readinessDefaultCredentials":`No admin credentials were configured — Consenti is using demo credentials. Set CONSENTI_ADMIN_EMAIL and CONSENTI_ADMIN_PASSWORD before going to production.`,"setupWizard.confirmation.howItWorks":`See How Consenti Works`,"setupWizard.confirmation.goToDashboard":`Go to Dashboard`,_section_dashboard:`── Dashboard ────────────────────────────────────`,"dashboard.title":`Dashboard`,"dashboard.stats.totalConsents":`Total Consents`,"dashboard.stats.totalVisitors":`Total Visitors`,"dashboard.stats.accepted":`Accepted`,"dashboard.stats.acceptedSub":`≥80% cookies granted`,"dashboard.stats.rejected":`Rejected`,"dashboard.stats.rejectedSub":`≤20% cookies granted`,"dashboard.chart.timeline":`Consents (last 30 days)`,"dashboard.chart.timelineAria":`Consent timeline chart`,"dashboard.chart.countries":`Top Countries`,"dashboard.chart.noData":`No data.`,"dashboard.chart.noCountryData":`No country data.`,"dashboard.gpc.label":`GPC Detection Rate`,"dashboard.gpc.sub":`{{detected}} of {{total}} consents`,"dashboard.viewReports":`View full reports →`,_section_reports:`── Reports ──────────────────────────────────────────`,"reports.title":`Reports`,"reports.filters.from":`From`,"reports.filters.to":`To`,"reports.filters.apply":`Apply`,"reports.optin.total":`Total Decisions`,"reports.optin.granted":`Granted`,"reports.optin.denied":`Denied`,"reports.optin.managed":`Partially Managed`,"reports.optin.byDate":`Opt-in trend`,"reports.optin.byDateAria":`Opt-in decisions over time`,"reports.optin.byLocale":`By locale`,"reports.category.title":`By category`,"reports.legend.granted":`Granted`,"reports.legend.denied":`Denied`,"reports.legend.objected":`Objected`,"reports.legend.managed":`Managed`,_section_consents:`── Consents ─────────────────────────────────────`,"consents.title":`Consent Records`,"consents.filterFrom":`From`,"consents.filterTo":`To`,"consents.filterGpc":`GPC only`,"consents.records":`{{n}} records`,"consents.empty":`No consent records yet.`,"consents.col.visitorId":`Visitor ID`,"consents.col.profile":`Profile`,"consents.col.locale":`Locale`,"consents.col.gpc":`GPC`,"consents.col.age":`Age`,"consents.col.source":`Source`,"consents.col.created":`Created`,"consents.gpcYes":`Yes`,"consents.ageVerified":`Verified`,"consents.searchPlaceholder":`Search visitor, profile, locale, source…`,"consents.detail.title":`Consent Record`,"consents.detail.updated":`Updated`,"consents.detail.consentJson":`Consent data`,"consents.detail.signature":`Signature`,"consents.detail.signed":`Signed`,"consents.detail.unsigned":`Not signed`,_section_visitors:`── Visitors ─────────────────────────────────────`,"visitors.title":`Visitors`,"visitors.empty":`No visitors recorded yet.`,"visitors.col.visitorId":`Visitor ID`,"visitors.col.country":`Country`,"visitors.col.firstSeen":`First Seen`,"visitors.col.lastSeen":`Last Seen`,"visitors.searchPlaceholder":`Search visitor ID, country…`,"visitors.detail.title":`Visitor`,"visitors.detail.region":`Region`,"visitors.detail.city":`City`,_section_users:`── Users ────────────────────────────────────────────`,"users.title":`Users`,"users.count":`{{n}} users`,"users.newUser":`+ New User`,"users.createForm.title":`Create User`,"users.createForm.namePlaceholder":`Name`,"users.createForm.emailPlaceholder":`Email`,"users.createForm.passwordPlaceholder":`Password`,"users.createForm.confirmPasswordPlaceholder":`Confirm password`,"users.createForm.selectRole":`Select role…`,"users.createForm.passwordMismatch":`Passwords do not match`,"users.createForm.error":`Failed to create user`,"users.col.status":`Status`,"users.status.active":`Active`,"users.status.inactive":`Inactive`,"users.action.activate":`Activate`,"users.action.deactivate":`Deactivate`,"users.dialog.delete.title":`Delete user "{{name}}"?`,"users.dialog.delete.message":`This user account will be permanently removed.`,"users.allowedSites":`Allowed Sites`,"users.allowedSitesHint":`(leave empty to allow all)`,"users.edit.title":`Edit User: {{name}}`,"users.edit.error.save":`Failed to save changes.`,"users.edit.resetPassword":`Reset Password`,"users.edit.resetPasswordHint":`(leave blank to keep current password)`,"users.edit.newPassword":`New password`,"users.edit.confirmNewPassword":`Confirm new password`,"users.edit.passwordTooShort":`Password must be at least 12 characters`,"users.detail.title":`User`,"users.detail.allSites":`All sites`,_section_roles:`── Roles & Permissions ──────────────────────────`,"roles.title":`Roles & Permissions`,"roles.list.heading":`Roles`,"roles.list.empty":`No roles yet. Create one to get started.`,"roles.form.roleNameLabel":`Role name`,"roles.form.roleNamePlaceholder":`e.g. Editor`,"roles.form.descriptionLabel":`Description`,"roles.form.descriptionPlaceholder":`Optional description`,"roles.perms.heading":`Permissions — {{name}}`,"roles.perms.selectPrompt":`Select a role to manage permissions`,"roles.perms.clickPrompt":`Click a role on the left to view and manage its permissions.`,"roles.perms.noPerms":`No permissions defined in the system.`,"roles.error.load":`Failed to load roles.`,"roles.error.create":`Failed to create role.`,"roles.error.update":`Failed to update role.`,"roles.error.delete":`Failed to delete role.`,"roles.error.perm":`Failed to update permission.`,"roles.dialog.delete.title":`Delete role "{{name}}"?`,"roles.dialog.delete.message":`Users assigned this role will lose its permissions immediately.`,"roles.aria.editRole":`Edit role`,"roles.aria.deleteRole":`Delete role`,_section_profiles:`── Profiles ──────────────────────────────────────`,"profiles.title":`Profiles`,"profiles.count":`{{n}} profiles`,"profiles.countSingular":`{{n}} profile`,"profiles.newProfile":`+ New Profile`,"profiles.empty":`No profiles yet. Create one to get started.`,"profiles.search.placeholder":`Search profiles…`,"profiles.filter.status":`Status`,"profiles.filter.active":`Active`,"profiles.filter.inactive":`Inactive`,"profiles.archived.cta":`Archived Profiles`,"profiles.archived.title":`Archived Profiles`,"profiles.archived.back":`Back to profiles`,"profiles.archived.hint":`Profile-id directories found on disk with no matching database entry — deleted profiles whose version snapshots weren't. Click one to browse its version history.`,"profiles.archived.empty":`No archived profiles found.`,"profiles.archived.searchPlaceholder":`Search by profile ID…`,"profiles.archived.col.id":`Profile ID`,"profiles.archived.col.versions":`Versions`,"profiles.archived.col.lastModified":`Last Modified`,"profiles.archived.viewHistory":`View history`,"profiles.col.name":`Name`,"profiles.col.defaultLocale":`Default Locale`,"profiles.col.templates":`Templates`,"profiles.col.created":`Created`,"profiles.template.cookie":`Cookie:`,"profiles.template.ui":`UI:`,"profiles.action.copyId":`Copy profile ID`,"profiles.action.copySlug":`Copy compliance group slug`,"profiles.action.copying":`Copying…`,"profiles.dialog.delete.title":`Delete "{{name}}"?`,"profiles.dialog.delete.message":`This profile and all its locale content will be permanently removed.`,"profiles.dialog.copy.title":`Copy "{{name}}"?`,"profiles.dialog.copy.message":`This profile and all its locale content will be duplicated.`,_section_profileEditor:`── Profile Editor ───────────────────────────`,"profileEditor.title.new":`New Profile`,"profileEditor.title.edit":`Edit Profile`,"profileEditor.title.loading":`Profile Editor`,"profileEditor.step.config":`Profile Config`,"profileEditor.step.templates":`Templates`,"profileEditor.step.content":`Content`,"profileEditor.step.mainBanner":`Main Banner`,"profileEditor.step.gpcBanner":`GPC Banner`,"profileEditor.step.prefModal":`Pref Modal`,"profileEditor.config.profileName":`Profile Name`,"profileEditor.config.profileNamePlaceholder":`My Website`,"profileEditor.config.defaultLocale":`Default Locale`,"profileEditor.config.allowedDomains":`Allowed Domains`,"profileEditor.config.allowedDomainsHint":`Supports wildcards (*.example.com). Leave empty to allow all.`,"profileEditor.config.regulations":`Compliance Regulations`,"profileEditor.config.reg.gdprLabel":`GDPR`,"profileEditor.config.reg.gdprDesc":`EU/EEA opt-in. No tracking until consent is given. Banner shown on first visit.`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`California opt-out. Cookies default granted. Provide a "Do Not Sell" trigger.`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`California 2023. Opt-out for sale/sharing; opt-in for sensitive data. GPC honored.`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`India 2023. Opt-in like GDPR. GPC not recognised. Data Fiduciary notice required.`,"profileEditor.config.darkMode":`Enable Dark Mode`,"profileEditor.config.darkModeHint":`Applies dark colour tokens to the consent widget for sites with a dark theme.`,"profileEditor.config.dpdpa.heading":`DPDPA — Required Consent Notice Fields`,"profileEditor.config.dpdpa.fiduciary":`Data Fiduciary Name`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`Grievance Officer Email`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`Purpose Description`,"profileEditor.config.dpdpa.purposePlaceholder":`We collect your data to personalise your experience…`,"profileEditor.templates.cookieTemplate":`Consent Template`,"profileEditor.templates.cookieTemplateHint":`Defines which parameters and categories appear in the preference modal, and each category's legal basis. All fields are derived from the template — read-only in the profile.`,"profileEditor.templates.selectCookie":`— Select a consent template —`,"profileEditor.templates.uiTemplate":`UI Template`,"profileEditor.templates.uiTemplateHint":`Defines banner/modal layout, button count, and category structure. You add text content in Steps 3–5.`,"profileEditor.templates.selectUi":`— Select a UI template —`,"profileEditor.templates.noTemplate":`No template selected.`,"profileEditor.templates.previewPrompt":`Select both a cookie template and a UI template to see a live preview.`,"profileEditor.templates.categoriesCount":`categories`,"profileEditor.templates.buttonsTotal":`buttons total`,"profileEditor.content.loadDefaults":`Load Defaults`,"profileEditor.content.loadDefaultsTitle":`Fill this section with compliance-aware English defaults`,"profileEditor.content.loadDefaultsNotice":`Load Defaults fills English text only — translate using the locale tab bar above.`,"profileEditor.content.importError":`Could not parse the uploaded file. Make sure it matches the Consenti locale template format.`,"profileEditor.content.mainBanner":`Main Banner`,"profileEditor.content.gpcBanner":`GPC Banner`,"profileEditor.content.prefModal":`Preference Modal`,"profileEditor.content.heading":`Heading`,"profileEditor.content.subheading":`Subheading`,"profileEditor.content.bodyText":`Body Text`,"profileEditor.content.introText":`Intro Text (optional)`,"profileEditor.content.buttonLabels":`Button Labels`,"profileEditor.content.categoryHeading":`Category Heading`,"profileEditor.content.categoryDesc":`Category Description`,"profileEditor.content.categoryFallback":`Category {{n}}`,"profileEditor.content.buttonLabelPlaceholder":`Button text…`,"profileEditor.content.categoryDescPlaceholder":`Description of this cookie category…`,"profileEditor.content.liDescription":`Legitimate Interest Description (optional)`,"profileEditor.content.liDescriptionPlaceholder":`We rely on legitimate interest because…`,"profileEditor.content.liDescriptionHint":`Your GDPR balancing-test justification for relying on legitimate interest, shown to visitors. Optional — you can also cover this in the category description above.`,"profileEditor.content.mainBannerHeadingPlaceholder":`We value your privacy`,"profileEditor.content.mainBannerBodyPlaceholder":`We use cookies to improve your experience…`,"profileEditor.content.gpcHeadingPlaceholder":`Global Privacy Control Detected`,"profileEditor.content.prefHeadingPlaceholder":`Privacy Preferences`,"profileEditor.content.prefSubheadingPlaceholder":`Manage your cookie preferences below.`,"profileEditor.content.prefIntroPlaceholder":`Optional intro above categories…`,"profileEditor.content.noContent":`Select a UI template in step 2 to begin editing content.`,"profileEditor.content.loadingTemplate":`Loading template…`,"profileEditor.nav.nextTemplates":`Next: Templates`,"profileEditor.nav.nextContent":`Next: Content`,"profileEditor.nav.nextMainBanner":`Next: Main Banner`,"profileEditor.nav.nextGpcBanner":`Next: GPC Banner`,"profileEditor.nav.nextPrefModal":`Next: Pref Modal`,"profileEditor.action.create":`Create Profile`,"profileEditor.action.save":`Save Profile`,"profileEditor.error.nameRequired":`Profile name is required.`,"profileEditor.error.nameRequiredContinue":`Profile name is required before continuing.`,"profileEditor.error.cookieRequired":`Select a consent template.`,"profileEditor.error.cookieContinue":`Select a consent template to continue.`,"profileEditor.error.uiRequired":`Select a UI template.`,"profileEditor.error.uiContinue":`Select a UI template to continue.`,"profileEditor.error.failed":`Failed to save profile.`,"profileEditor.error.load":`Failed to load profile.`,"profileEditor.table.noNoCookies":`No cookies defined in this template.`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`Legal Basis`,"profileEditor.table.mandatory":`Mandatory`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.tcfVendor":`TCF Vendor`,"profileEditor.table.cpraCategory":`CPRA Category`,"profileEditor.table.cookies":`Cookies`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`Import`,"profileEditor.export.jsonTitle":`Export all locale tabs as a single JSON file`,"profileEditor.export.csvTitle":`Download locale content as CSV for translation`,"profileEditor.export.importTitle":`Import JSON (all locales) or CSV (current locale)`,"profileEditor.import.imported":`Imported {{n}} locales: {{list}}`,"profileEditor.import.importedSingular":`Imported 1 locale: {{list}}`,"profileEditor.import.skipped":`Skipped {{n}} unrecognised locale keys: {{list}}`,"profileEditor.import.skippedSingular":`Skipped 1 unrecognised locale key: {{list}}`,"profileEditor.newLink":`+ New ↗`,"profileEditor.config.selectDefaultLocale":`Select default locale…`,"profileEditor.config.complianceGroup":`Compliance Group`,"profileEditor.config.complianceGroupNone":`None / Custom`,"profileEditor.config.customComplianceGroup":`Custom group name`,"profileEditor.config.customComplianceGroupPlaceholder":`e.g. internal-testing`,"profileEditor.config.customComplianceGroupHint":`Lower-kebab-case identifier. The widget's compliance.type config uses this to fetch the profile — required, since there's no other way to address it. Only one profile can be active per name at a time. No compliance-rule defaults are applied (those only exist for the built-in groups above).`,"profileEditor.config.gpcMode":`GPC Signal Mode`,"profileEditor.config.gpcModeDefault":`Default (inherit from compliance group)`,"profileEditor.config.gpcModePlaceholder":`Default`,"profileEditor.config.hidePoweredBy":`Hide "Powered by Consenti"`,"profileEditor.config.hidePoweredByHint":`Remove the branding link from the consent banner.`,"profileEditor.config.allowReceipt":`Allow consent receipt`,"profileEditor.config.allowReceiptHint":`Let visitors download a JSON receipt of their consent choices.`,"profileEditor.config.enhanceAccessibility":`Enhance Accessibility`,"profileEditor.config.enhanceAccessibilityHint":`Applies WCAG 2.1 AA button sizing (44px min-height), visible focus rings, and screen-reader labels to the consent widget.`,"profileEditor.config.showFooterMetadata":`Show Footer Metadata`,"profileEditor.config.showFooterMetadataHint":`Displays a strip in the banner and modal showing Consent ID, Date, Profile Version, and a Privacy Settings link.`,"profileEditor.conflict.title":`Active profile conflict`,"profileEditor.conflict.message":`Profile "{{name}}" is already active for this compliance group. Only one profile can be active per group.`,"profileEditor.conflict.deactivate":`Deactivate "{{name}}" and activate this one`,"profileEditor.conflict.saveInactive":`Save this profile as inactive`,"profileEditor.compliance.errors.heading":`Compliance errors — fix before continuing:`,"profileEditor.compliance.warnings.heading":`Compliance warnings:`,"profileEditor.compliance.warnings.acknowledge":`I acknowledge these warnings and wish to continue`,"profileEditor.compliance.preGrantOverridden":`Pre-grant was overridden for these parameters — this compliance group requires an explicit opt-in, so "Pre Grant" cannot stay enabled.`,"profileEditor.content.selectLocale":`Select locale…`,"profileEditor.content.addLocale":`+ Add locale`,"profileEditor.content.defaultLocaleLabel":`(default)`,_section_readability:`── Readability Warnings ─────────────────────────`,"readability.headingTooLong":`Heading is {{n}} characters — keep it under 80 for readability.`,"readability.avgSentenceLong":`Average sentence length is {{n}} words — aim for 25 or fewer.`,"readability.totalWordsLong":`Text is {{n}} words long — consider keeping banner copy under 150 words.`,_section_consentTemplates:`── Consent Templates ─────────────────────────`,"consentTemplates.title":`Consent Templates`,"consentTemplates.count":`{{n}} templates`,"consentTemplates.countSingular":`{{n}} template`,"consentTemplates.new":`+ New Consent Template`,"consentTemplates.empty.title":`No consent templates yet.`,"consentTemplates.empty.hint":`Consent templates define the list of parameters and categories for your consent profiles. Create one to reuse across multiple profiles.`,"consentTemplates.search.placeholder":`Search consent templates…`,"consentTemplates.col.name":`Name`,"consentTemplates.col.cookies":`Cookies`,"consentTemplates.required":`required`,"consentTemplates.dialog.delete.title":`Delete "{{name}}"?`,"consentTemplates.dialog.delete.message":`This consent template will be permanently removed. Profiles linked to it will lose their parameter and category definitions.`,"consentTemplates.editor.title.new":`New Consent Template`,"consentTemplates.editor.title.edit":`Edit Consent Template`,"consentTemplates.editor.name":`Template Name`,"consentTemplates.editor.namePlaceholder":`e.g. Google Analytics + Ads`,"consentTemplates.editor.nameRequired":`Template name is required.`,"consentTemplates.editor.definitions":`Cookie Definitions`,"consentTemplates.editor.empty":`No cookies defined yet. Add one above.`,"consentTemplates.editor.addCookie":`+ Add Cookie`,"consentTemplates.editor.idNoMatches":`No known keys match — you can still type a custom ID`,"consentTemplates.editor.error.allIds":`All cookies must have an ID.`,"consentTemplates.editor.error.uniqueIds":`Cookie IDs must be unique.`,"consentTemplates.editor.error.failed":`Failed to save template.`,"consentTemplates.editor.error.notFound":`Template not found.`,"consentTemplates.editor.action.create":`Create Template`,"consentTemplates.editor.action.save":`Save Template`,"consentTemplates.editor.showTcf":`TCF Vendors`,"consentTemplates.editor.showCpra":`CPRA Category`,"consentTemplates.editor.infoHint":`Click a column header to learn more`,"consentTemplates.editor.infoUsage":`Usage`,"consentTemplates.editor.infoLaws":`Regulatory guidance`,"consentTemplates.editor.infoExamples":`Examples`,"consentTemplates.editor.gpcMandatoryTitle":`Mandatory cookies are never auto-denied by GPC`,"consentTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default list of cookies based on Google Consent Mode`,"consentTemplates.editor.loadDefaultsBtn":`Load Defaults`,"consentTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"consentTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"consentTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
|
|
3
|
-
|
|
4
|
-
Saving will update cookie definitions for all profiles using this template. Continue?`,"consentTemplates.col.id":`Cookie ID`,"cookieTemplates.editor.legalBasis.mandatoryUsage":`Mandatory (Strictly Necessary): The cookie is always granted — the visitor cannot turn it off. Use only for cookies genuinely required for the site to function (session tokens, CSRF, load balancing).`,"cookieTemplates.editor.legalBasis.mandatoryLawName":`ePrivacy Dir. Recital 25`,"cookieTemplates.editor.legalBasis.mandatoryLawText":`"Strictly necessary" cookies are exempt from consent. Do not mark analytics or advertising cookies as Mandatory.`,"cookieTemplates.editor.legalBasis.examples":`Consent: analytics_storage · ad_storage · Legitimate Interest: server-side analytics · Mandatory: session · csrf_token · load_balancer_id`,"cookieTemplates.editor.trackerDetected":`Detected: {{vendor}}`,"consentTemplates.col.idShort":`ID / Name`,"consentTemplates.col.gpc":`Honor GPC Signal`,"consentTemplates.col.gpcShort":`GPC`,"consentTemplates.col.tcfVendor":`TCF Vendor IDs`,"consentTemplates.col.cpraCategory":`CPRA Data Category`,"consentTemplates.col.tcfVendorShort":`TCF Vendor`,"consentTemplates.col.cpraCategoryShort":`CPRA Category`,"consentTemplates.col.purpose":`Cookie Purpose`,"consentTemplates.col.purposeShort":`Purpose`,"consentTemplates.purpose.necessary":`Necessary`,"consentTemplates.purpose.functional":`Functional`,"consentTemplates.purpose.preferences":`Preferences`,"consentTemplates.purpose.analytics":`Analytics`,"consentTemplates.purpose.marketing":`Marketing`,"consentTemplates.editor.purposePlaceholder":`Select purpose…`,"consentTemplates.editor.error.purpose":`Every cookie must have a purpose.`,_section_uiTemplates:`── UI Templates ─────────────────────────────────`,"uiTemplates.title":`UI Templates`,"uiTemplates.count":`{{n}} templates`,"uiTemplates.countSingular":`{{n}} template`,"uiTemplates.new":`+ New UI Template`,"uiTemplates.empty.title":`No UI templates yet.`,"uiTemplates.empty.hint":`UI templates define the visual configuration — positions, buttons, categories — for your consent banners and modals.`,"uiTemplates.search.placeholder":`Search UI templates…`,"uiTemplates.col.name":`Name`,"uiTemplates.col.positions":`Positions`,"uiTemplates.col.buttons":`Buttons`,"uiTemplates.mainBanner":`Main banner:`,"uiTemplates.gpcBanner":`GPC banner:`,"uiTemplates.modal":`Modal:`,"uiTemplates.categories":`{{n}} categories`,"uiTemplates.dialog.delete.title":`Delete "{{name}}"?`,"uiTemplates.dialog.delete.message":`This UI template will be permanently removed. Profiles linked to it will lose their UI settings.`,"uiTemplates.editor.title.new":`New UI Template`,"uiTemplates.editor.title.edit":`Edit UI Template`,"uiTemplates.editor.name":`Template Name`,"uiTemplates.editor.nameRequired":`Template name is required.`,"uiTemplates.editor.namePlaceholder":`e.g. Standard GDPR Layout`,"uiTemplates.editor.loading":`Loading template…`,"uiTemplates.editor.tabMain":`Main Banner`,"uiTemplates.editor.tabGpc":`GPC Banner`,"uiTemplates.editor.tabModal":`Preference Modal`,"uiTemplates.editor.mainBannerHint":`Shown on first visit when no consent has been recorded.`,"uiTemplates.editor.gpcBannerHint":`Shown instead of the main banner when a GPC signal is detected (autoHonorGPC enabled).`,"uiTemplates.editor.error.notFound":`Template not found.`,"uiTemplates.editor.error.buttons":`All buttons must have an id.`,"uiTemplates.editor.error.customButtons":`All "custom" action buttons must have cookies selected.`,"uiTemplates.editor.error.catIds":`All category IDs are required.`,"uiTemplates.editor.error.uniqueCatIds":`Category IDs must be unique.`,"uiTemplates.editor.error.catCookies":`Each category must include at least one cookie.`,"uiTemplates.editor.error.failed":`Failed to save template.`,"uiTemplates.editor.action.create":`Create Template`,"uiTemplates.editor.action.save":`Save Template`,"uiTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default structure (buttons, categories, positions).`,"uiTemplates.editor.loadDefaultsBtn":`Load Defaults`,"uiTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"uiTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"uiTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
|
|
5
|
-
|
|
6
|
-
Saving will apply UI changes to all profiles using this template. Continue?`,"uiTemplates.editor.wizard.stepOf":`Step {{step}} of {{total}}`,"uiTemplates.editor.wizard.next":`Next`,"uiTemplates.editor.wizard.back":`Back`,"uiTemplates.editor.stackButtonsOnBreakpoint":`Stack Buttons Below (px)`,"uiTemplates.editor.stackButtonsOnBreakpointHint":`Buttons stack vertically below this viewport width. Set to 0 to disable. Default: 576.`,"uiTemplates.editor.trapFocus":`Trap Focus`,"uiTemplates.editor.trapFocusHint":`Confines keyboard Tab focus within the consent root while this banner or modal is visible.`,_section_sites:`── Sites / Tenants ───────────────────────────────`,"sites.title":`Sites / Tenants`,"sites.createNew":`Create new site`,"sites.namePlaceholder":`Site name`,"sites.slugPlaceholder":`slug (e.g. site-a)`,"sites.col.name":`Name`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Created`,"sites.empty":`No sites yet.`,"sites.dialog.delete.title":`Delete "{{name}}"?`,"sites.dialog.delete.message":`This site and all associated data will be permanently removed. This cannot be undone.`,_section_vendors:`── TCF Vendors ───────────────────────────────────`,"vendors.title":`TCF Vendor List`,"vendors.info.title":`What is the TCF Vendor List?`,"vendors.searchPlaceholder":`Search vendors…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} vendors`,"vendors.loading":`Loading vendor list…`,"vendors.noResults":`No vendors found.`,"vendors.col.id":`ID`,"vendors.col.name":`Name`,"vendors.col.purposes":`Purposes`,"vendors.col.liPurposes":`LI Purposes`,"vendors.col.specialPurposes":`Special Purposes`,"vendors.pagination":`Page {{page}} of {{totalPages}} · {{total}} vendors total`,"vendors.prev":`← Prev`,"vendors.next":`Next →`,_section_audit:`── Audit Log ─────────────────────────────────────`,"audit.title":`Audit Log`,"audit.empty":`No audit events yet.`,"audit.col.time":`Time`,"audit.col.action":`Action`,"audit.col.resource":`Resource`,"audit.col.resourceId":`Resource ID`,"audit.col.actor":`Actor`,"audit.actor.system":`system`,"audit.viewHistory":`Compare`,"audit.searchPlaceholder":`Search action, resource, actor…`,"audit.detail.title":`Audit Entry`,"audit.detail.oldData":`Old data`,"audit.detail.newData":`New data`,_section_apiConfig:`── API Configuration ─────────────────────────`,"apiConfig.title":`API Configuration`,"apiConfig.public.heading":`Public API`,"apiConfig.public.about.text":`Used by the widget to submit and manage consent. There is no auth token — Allowed Origins below is its only access gate.`,"apiConfig.public.about.link":`Open Public API reference on consenti.dev`,"apiConfig.admin.heading":`Admin API`,"apiConfig.admin.about.text":`Use these tokens to call the Consenti admin API from scripts, CI/CD, or server-side integrations. Every route, request/response shape, and auth header is documented on consenti.dev.`,"apiConfig.admin.about.link":`Open Admin API reference on consenti.dev`,"apiConfig.endpoint.heading":`Endpoint`,"apiConfig.endpoint.hint":`Base URL for this deployment, resolved from your configuration.`,"apiConfig.origins.heading":`Allowed Origins`,"apiConfig.origins.hint":`Only requests from these origins will be accepted. Use * to allow all (not recommended for production).`,"apiConfig.origins.publicNote":`The public API has no auth token — this list is its only access gate.`,"apiConfig.origins.adminNote":`An extra layer on top of Bearer-token auth. Include this dashboard's own origin ({{origin}}) to avoid locking yourself out.`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`No origins configured — all origins are currently allowed.`,"apiConfig.origins.errorDuplicate":`Already in the list.`,"apiConfig.origins.errorSave":`Failed to save. Please try again.`,"apiConfig.origins.remove":`Remove`,"apiConfig.tokens.heading":`Admin API Tokens`,"apiConfig.tokens.hint":`Bearer tokens for server-side and CI/CD access to the Consenti admin API. Pass as Authorization: Bearer <token>. Never expose in client-side code — these grant full admin access.`,"apiConfig.tokens.created":`Token created — copy it now, it won't be shown again.`,"apiConfig.tokens.placeholder":`Token name (e.g. CI deploy)`,"apiConfig.tokens.empty":`No tokens yet.`,"apiConfig.tokens.errorName":`Name is required`,"apiConfig.tokens.errorCreate":`Failed to create token`,"apiConfig.tokens.col.name":`Name`,"apiConfig.tokens.col.status":`Status`,"apiConfig.tokens.col.created":`Created`,"apiConfig.tokens.status.active":`Active`,"apiConfig.tokens.status.revoked":`Revoked`,"apiConfig.tokens.status.expired":`Expired`,"apiConfig.tokens.col.expires":`Expires`,"apiConfig.tokens.expiresLabel":`Expires (optional)`,"apiConfig.tokens.expiresNever":`Never`,"apiConfig.tokens.dialog.title":`Revoke this API token?`,"apiConfig.tokens.dialog.message":`Any application using this token will immediately lose access.`,"apiConfig.tokens.reactivate":`Reactivate`,"apiConfig.tokens.deleteDialog.title":`Permanently delete this API token?`,"apiConfig.tokens.deleteDialog.message":`This removes the token record entirely and cannot be undone. Reactivation will no longer be possible.`,_section_settings:`── Settings ──────────────────────────────────────`,"settings.title":`Settings`,"settings.account.heading":`Account`,"settings.account.email":`Email:`,"settings.account.roles":`Roles:`,"settings.account.id":`ID:`,"settings.account.changePassword":`Change Password`,"settings.export.heading":`Export Data`,"settings.export.hint":`Download all consent records or audit logs.`,"settings.export.consentCsv":`Consent CSV`,"settings.export.consentXlsx":`Consent XLSX`,"settings.export.consentJson":`Consent JSON`,"settings.export.auditCsv":`Audit CSV`,"settings.about.heading":`About`,"settings.about.text":`Consenti v0.1.0 — Open-source GDPR-compliant Consent Management Platform.`,"settings.about.license":`Apache 2.0 License.`,_section_changePassword:`── Change Password ───────────────────────────`,"changePassword.title":`Change Password`,"changePassword.hint":`Choose a strong password of at least 12 characters.`,"changePassword.success":`Password updated successfully.`,"changePassword.newPassword":`New Password`,"changePassword.newPasswordPlaceholder":`Min. 12 characters`,"changePassword.confirmPassword":`Confirm New Password`,"changePassword.confirmPasswordPlaceholder":`Repeat new password`,"changePassword.submit":`Update Password`,"changePassword.submitting":`Saving…`,"changePassword.error.minLength":`Password must be at least 12 characters.`,"changePassword.error.mismatch":`Passwords do not match.`,"changePassword.error.failed":`Failed to update password.`,_section_howItWorks:`── How Consenti Works ───────────────────────────────`,"nav.howItWorks":`How Consenti Works`,"howItWorks.title":`How Consenti Works`,"howItWorks.intro":`Consenti is an open-source, GDPR-compliant Consent Management Platform. It handles cookie consent collection, storage, and reporting for your websites. This guide walks you through the main workflow and describes every section of the dashboard.`,"howItWorks.workflow.heading":`Core Workflow`,"howItWorks.workflow.step1.title":`Define Cookie Categories`,"howItWorks.workflow.step1.desc":`Go to Consent Banners → Cookie Templates and create a template that lists every cookie category your site uses (e.g. analytics, marketing). Set the legal basis and expiry for each.`,"howItWorks.workflow.step2.title":`Design the Consent UI`,"howItWorks.workflow.step2.desc":`Go to Consent Banners → UI Templates and configure the visual layout of your banner and preference modal — button labels, colours, layout style, and category display.`,"howItWorks.workflow.step3.title":`Create a Consent Profile`,"howItWorks.workflow.step3.desc":`Go to Consent Banners → Profiles and combine a Cookie Template with a UI Template. Add translated text for every locale you support, enable the required regulations (GDPR, CCPA, DPDPA), and publish.`,"howItWorks.workflow.step4.title":`Embed the Widget`,"howItWorks.workflow.step4.desc":`Copy your API key from API → Config and add the Consenti script tag to your website. The widget fetches your published profile and shows the consent banner automatically.`,"howItWorks.workflow.step5.title":`Monitor and Audit`,"howItWorks.workflow.step5.desc":`Use the Consents and Visitors pages to review live consent records. Use the Audit Log for a tamper-evident history of all administrative actions for compliance evidence.`,"howItWorks.features.heading":`Dashboard Features`,"howItWorks.features.dashboard.title":`Dashboard`,"howItWorks.features.dashboard.desc":`The home screen shows real-time KPIs — total consents, acceptance rate, rejection rate, and a time-series chart. Use it to spot trends and gauge the impact of banner changes.`,"howItWorks.features.reports.title":`Reports`,"howItWorks.features.reports.desc":`Opt-in trend over a date range, plus category and locale breakdowns (granted/denied/objected). Requires the stats:view permission.`,"howItWorks.features.consentTemplates.title":`Consent Templates`,"howItWorks.features.consentTemplates.desc":`Reusable lists of consent parameters grouped into categories. Each category owns the legal basis (consent, legitimate interest, mandatory) for its parameters; parameters carry purpose, GPC signal handling, pre-grant, and optional TCF vendor or CPRA category mapping.`,"howItWorks.features.uiTemplates.title":`UI Templates`,"howItWorks.features.uiTemplates.desc":`Controls the look and feel of the consent banner, GPC notice, and preference modal. Configure button sets, heading tags, overlay opacity, and category display order.`,"howItWorks.features.profiles.title":`Profiles`,"howItWorks.features.profiles.desc":`A Profile is the deployable unit. It binds a Cookie Template + UI Template together, stores multi-locale content, and tracks a version number so you can roll back. Only one profile per domain can be active at a time.`,"howItWorks.features.consents.title":`Consents`,"howItWorks.features.consents.desc":`A searchable, filterable log of every individual consent record submitted by visitors. Each record shows the visitor ID, profile used, locale, GPC signal, consent choices, and timestamp.`,"howItWorks.features.visitors.title":`Visitors`,"howItWorks.features.visitors.desc":`A list of unique visitor identifiers seen across your sites, with their country, first-seen date, and last-seen date. Visitor IDs are pseudonymous UUIDs stored without raw IP addresses.`,"howItWorks.features.users.title":`Users`,"howItWorks.features.users.desc":`Manage the admin accounts that can log into this dashboard. Assign roles, activate or deactivate accounts, and restrict users to specific sites in multi-tenant deployments.`,"howItWorks.features.roles.title":`Roles`,"howItWorks.features.roles.desc":`Define named permission sets (e.g. Viewer, Editor, Admin). Assign granular permissions such as consent:view, profile:edit, or audit:view to each role, then assign roles to users.`,"howItWorks.features.vendors.title":`Vendors`,"howItWorks.features.vendors.desc":`Browse the IAB Global Vendor List (GVL) to look up TCF vendor IDs, declared purposes, and legitimate-interest purposes. Use these IDs when configuring cookie categories in your templates.`,"howItWorks.features.audit.title":`Audit Log`,"howItWorks.features.audit.desc":`An append-only, tamper-evident log of every administrative action — profile saves, user changes, API key creation, and more. Required for GDPR accountability obligations.`,"howItWorks.features.api.title":`API & Keys`,"howItWorks.features.api.desc":`Generate and revoke API tokens, configure allowed CORS origins for the public consent API, and browse the interactive OpenAPI reference to understand every endpoint.`,"howItWorks.features.settings.title":`Settings`,"howItWorks.features.settings.desc":`View your account details, change your password, and export consent or audit data as CSV, XLSX, or JSON for offline analysis or regulatory submission.`,"howItWorks.docs.heading":`Full Documentation`,"howItWorks.docs.text":`Detailed guides, configuration references, integration examples, and a live playground are available on the Consenti documentation site.`,"howItWorks.docs.link":`Open consenti.dev/docs →`,"howItWorks.consentFlow.heading":`End-to-End Consent Flow`,"howItWorks.consentFlow.step1.title":`Widget Initializes`,"howItWorks.consentFlow.step1.desc":`The Consenti script loads in the visitor's browser and reads your configuration (API key, compliance.type). If a valid, unexpired consent cookie already exists, the widget silently exits — no banner is shown.`,"howItWorks.consentFlow.step2.title":`Jurisdiction Detected`,"howItWorks.consentFlow.step2.desc":`If compliance.type is 'auto', the widget calls GET /resolve-profile passing the visitor's timezone, Accept-Language header, and IP address. The server maps these signals to a complianceGroup using the built-in country → compliance map.`,"howItWorks.consentFlow.step3.title":`Profile Fetched`,"howItWorks.consentFlow.step3.desc":`The widget fetches the active profile for the resolved complianceGroup and the visitor's locale. The response is a flat JSON object with all banner text, cookie categories, UI settings, and regulation flags — ready to render.`,"howItWorks.consentFlow.step4.title":`Banner Rendered`,"howItWorks.consentFlow.step4.desc":`The widget renders the banner or preference modal using the profile's UI template. Mandatory categories are pre-checked and cannot be deselected. Optional categories show their legal basis (consent or legitimate interest).`,"howItWorks.consentFlow.step5.title":`Consent Submitted`,"howItWorks.consentFlow.step5.desc":`When the visitor acts (Accept All, Reject Optional, or Save Preferences), the widget POSTs a consent record to the API with the visitor ID, profile version, per-category status (granted/denied/objected), GPC signal, timestamp, and locale.`,"howItWorks.consentFlow.step6.title":`Stored and Audited`,"howItWorks.consentFlow.step6.desc":`The API validates the payload, stores the consent record, and appends an entry to the append-only audit log. The visitor record is upserted with country and first/last-seen dates. The widget writes the consent cookie so future visits skip the banner.`,"howItWorks.profileResolution.heading":`Profile Resolution Algorithm`,"howItWorks.profileResolution.intro":`When a visitor arrives, Consenti resolves which consent profile to show in five steps.`,"howItWorks.profileResolution.step1.title":`Geo Signals Collected`,"howItWorks.profileResolution.step1.desc":`The widget sends three signals to GET /resolve-profile: the browser's Intl.DateTimeFormat timezone, the Accept-Language header (or lang query param), and the server-side IP address.`,"howItWorks.profileResolution.step2.title":`Country Determined`,"howItWorks.profileResolution.step2.desc":`The server tries in order: (1) IP geolocation via the configured geoDataProvider; (2) timezone → country table lookup; (3) language tag → country heuristic (e.g. 'de' → DE). The first non-empty match wins.`,"howItWorks.profileResolution.step3.title":`Compliance Group Mapped`,"howItWorks.profileResolution.step3.desc":`The ISO-3166-1 alpha-2 country code (plus optional region/state) is looked up in the embedded COUNTRY → COMPLIANCE_GROUP map. A region override (e.g. US/CA → optOutCalifornia) takes precedence over the country default.`,"howItWorks.profileResolution.step4.title":`Active Profile Located`,"howItWorks.profileResolution.step4.desc":`The system queries the database for the active profile whose complianceGroup matches the resolved group. Only one profile per complianceGroup may be active at a time. If none exists, a 404 is returned and the widget may fall back to a profileOverride.`,"howItWorks.profileResolution.step5.title":`Locale Resolved`,"howItWorks.profileResolution.step5.desc":`The best locale is picked by: (1) exact match with the widget's requested locale; (2) language-prefix match (e.g. 'de-AT' → 'de'); (3) geo-resolved locale from the provider; (4) the profile's defaultLocale. The resolved JSON is served from a static file (published profiles) or directly from the database (previews).`,"howItWorks.complianceGroups.heading":`Compliance Groups`,"howItWorks.complianceGroups.intro":`Every country in the world maps to one of eight compliance groups. Each group determines what consent model the widget must follow.`,"howItWorks.complianceGroups.optIn.title":`optIn — GDPR / ePrivacy Strict Opt-In`,"howItWorks.complianceGroups.optIn.desc":`Prior consent is required before any non-essential cookie is set. Visitors must be given a genuine choice to reject, withdrawal must be as easy as giving consent, and granular per-category choices are mandatory.`,"howItWorks.complianceGroups.optIn.laws":`GDPR, ePrivacy Directive, UK GDPR, PECR, revFADP (CH), KVKK (TR), PDPA (TH), and other strict national laws`,"howItWorks.complianceGroups.optIn.countries":`All EU member states, UK, Switzerland, Turkey, Thailand, Iceland, Liechtenstein, Norway, Guernsey, Gibraltar, and other countries with strict ePrivacy rules`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — India DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`India's Digital Personal Data Protection Act 2023 requires explicit opt-in consent. Additional obligations include naming a Data Fiduciary, providing a dedicated consent notice, and supporting Data Principal rights. Set the dpdpaDataFiduciary extra field in your profile.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Digital Personal Data Protection Act 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`India (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — China Multi-Law Stack`,"howItWorks.complianceGroups.optInChina.desc":`China's data governance requires explicit consent under PIPL, combined with obligations from the Data Security Law (DSL) and Cybersecurity Law (CSL). Additional requirements apply to cross-border data transfers and data classification.`,"howItWorks.complianceGroups.optInChina.laws":`Personal Information Protection Law (PIPL), Data Security Law (DSL), Cybersecurity Law (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`China (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — California CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Data may be collected by default but consumers must be provided with a clear 'Do Not Sell or Share My Personal Information' opt-out. The Global Privacy Control (GPC) browser signal must be honoured as a valid opt-out.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`United States — California (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Other US State Laws`,"howItWorks.complianceGroups.optOutUSState.desc":`Modelled on California's opt-out framework. Consumers can opt out of targeted advertising and the sale of personal data. Several states require GPC to be honoured. Covered businesses must provide clear opt-out mechanisms.`,"howItWorks.complianceGroups.optOutUSState.laws":`CDPA (VA), CPA (CO), CTDPA (CT), UCPA (UT), TDPSA (TX), DPDPA (DE), NJDPA (NJ), OCPA (OR), MCDPA (MN), MODPA (MD), KCDPA (KY), TIPA (TN), NDPA (NE), ICDPA (IA/IN), MCDPA (MT), NHPA (NH), RIDTPA (RI)`,"howItWorks.complianceGroups.optOutUSState.countries":`United States — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — General Privacy / Consent`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`A general privacy law applies but does not impose a strict PECR/ePrivacy-style cookie banner requirement. Best practice is to offer a consent choice for non-essential cookies and a clear privacy notice, but the legal threshold is lower than GDPR opt-in.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Law 25 (CA), LGPD (BR — use hybridBrazil), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID and many others`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Canada, Australia, New Zealand, Japan, South Korea, Singapore, Malaysia, South Africa, and many LatAm, African, and Asian countries`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brazil LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`Brazil's LGPD is broadly similar to GDPR but analytics and advertising cookies may be treated under the legitimate interest legal basis depending on the data controller's assessment. The banner is shown, but the category-level legal basis can be more nuanced than strict GDPR opt-in.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brazil (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Privacy Notice Only`,"howItWorks.complianceGroups.noticeOnly.desc":`No dedicated cookie regulation applies, or the existing regime requires only a privacy notice — not an opt-in or opt-out banner. Displaying a consent banner is still recommended for transparency, but is not strictly mandated by law.`,"howItWorks.complianceGroups.noticeOnly.laws":`Varies — countries with no dedicated cookie / ePrivacy regulation`,"howItWorks.complianceGroups.noticeOnly.countries":`Many countries in Africa, Central Asia, the Caribbean, and Pacific regions not covered by the above groups`,"howItWorks.enums.heading":`Key Values Reference`,"howItWorks.enums.legalBasis.heading":`legalBasis (cookie category)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — Category is always active regardless of consent (e.g. session, authentication). Never blocked by GPC or opt-out signals.`,"howItWorks.enums.legalBasis.consent":`consent — Requires explicit opt-in from the visitor. Blocked by default; blocked by GPC in all opt-in jurisdictions.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Relies on the controller's legitimate interest. Active by default; visitor can object. Soft-blocked by GPC in some jurisdictions (EU, UK).`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (per category record)`,"howItWorks.enums.consentStatus.granted":`granted — Visitor gave explicit consent for this category.`,"howItWorks.enums.consentStatus.denied":`denied — Visitor explicitly refused consent for this category.`,"howItWorks.enums.consentStatus.objected":`objected — Visitor objected to a legitimate-interest category (opt-out, not a refusal of consent).`,"howItWorks.enums.geoProvider.heading":`geoDataProvider options`,"howItWorks.enums.geoProvider.default":`default / timezone — Uses the browser timezone (Intl.DateTimeFormat) to infer country, falling back to Accept-Language. No extra dependency.`,"howItWorks.enums.geoProvider.language":`language — Derives country from Accept-Language only (e.g. 'de' → DE, 'pt' → BR). Fast but imprecise.`,"howItWorks.enums.geoProvider.geoip":`geoip — Uses the geoip-lite npm package with a bundled MaxMind Lite database. Requires: npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Calls ipinfo.io via built-in HTTPS (zero extra dependency). Adds ~50–200 ms per first-visit request.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Uses the maxmind npm package with a local GeoLite2-City.mmdb file. Most accurate. Requires MAXMIND_DB_PATH env var and npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`custom function — Pass a CountryResolverFn to compliance.geoDataProvider to integrate any geo-IP or CDN provider.`,"consentTemplates.editor.categories":`Consent Categories`,"consentTemplates.editor.addCategory":`+ Add Category`,"consentTemplates.editor.noCategories":`No categories defined yet. Add one above.`,"consentTemplates.editor.error.noCategories":`At least one category is required.`,"consentTemplates.editor.error.catIds":`All categories must have an ID.`,"consentTemplates.editor.error.uniqueCatIds":`Category IDs must be unique.`,"consentTemplates.editor.error.catCookies":`Every category must contain at least one parameter.`,"consentTemplates.editor.error.uncategorized":`Parameter "{{id}}" is not assigned to any category.`,"consentTemplates.editor.error.multiCategory":`Parameter "{{id}}" is assigned to more than one category.`,"consentTemplates.editor.error.purposeLegalBasisMismatch":`Parameter "{{id}}" has a non-necessary purpose but is assigned to a Mandatory category — this grants a tracking parameter with no consent gate.`,"consentTemplates.editor.warning.necessaryNotMandatory":`Parameter "{{id}}" has purpose "necessary" but is assigned to a non-Mandatory category — this may break site functionality since it can be denied.`,"consentTemplates.col.preGrantShort":`Pre Grant`,"profileEditor.config.expiryDays":`Re-consent Interval (days)`,"profileEditor.config.expiryDaysHint":`How many days until stored consent expires and the visitor is asked again.`,"profileEditor.error.expiryDays":`Expiry (days) must be at least 1.`,"profileEditor.error.customComplianceGroupRequired":`Enter a custom group name, or pick a compliance group above.`,"profileEditor.table.preGrant":`Pre Grant`,"profileEditor.table.preGrantLocked":`Already effectively pre-granted — only editable when the category's legal basis is Consent`,"profileEditor.content.receiptHeading":`Consent Receipt Checkbox`,"profileEditor.content.receiptHint":`Shown in the preference modal when "Allow consent receipt" is enabled in Step 1.`,"profileEditor.content.receiptLabel":`Checkbox label`,"profileEditor.content.receiptDescription":`Description`,"profileEditor.error.missingRequiredContent":`Some required content is missing for locale "{{locale}}" — check the highlighted tab.`,"profileEditor.nudge.title":`Optional field left blank`,"profileEditor.nudge.headingBlank":`You left the heading blank. Visitors will see the banner without one.`,"profileEditor.nudge.introBlank":`You left the intro text blank. Visitors will see the preferences panel without one.`,"profileEditor.nudge.addNow":`Add now`,"profileEditor.nudge.ignore":`Ignore`};function ye(e,t,n){let r=e[t]??t;if(!n)return r;for(let[e,t]of Object.entries(n))r=r.split(`{{${e}}}`).join(String(t));return r}var be=`modulepreload`,xe=function(e){return`/consenti/`+e},F={},I=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=xe(t,n),t=s(t),t in F)return;F[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:be,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},L={en:`English (en)`,es:`Español (es)`,fr:`Français (fr)`,de:`Deutsch (de)`,ja:`日本語 (ja)`,"zh-CN":`中文 (zh-CN)`},R=Object.keys(L),Se={es:()=>I(()=>import(`./es-CJNunrnU.js`).then(e=>e.default),[]),fr:()=>I(()=>import(`./fr-akfTuf5x.js`).then(e=>e.default),[]),de:()=>I(()=>import(`./de-DET92Jb5.js`).then(e=>e.default),[]),ja:()=>I(()=>import(`./ja-B0nLWkOd.js`).then(e=>e.default),[]),"zh-CN":()=>I(()=>import(`./zh-CN-Dxg3G-BL.js`).then(e=>e.default),[])},z={en:P};function B(e){if(z[e])return Promise.resolve(z[e]);let t=Se[e];return t?t().then(t=>(z[e]=t,t)):Promise.resolve(P)}var V=o({locale:`en`,setLocale:()=>{},t:e=>e});function Ce({children:n}){let[r,i]=t(()=>{try{let e=localStorage.getItem(`dashboard-locale`);return e&&R.includes(e)?e:`en`}catch{return`en`}}),[o,s]=t(z[r]??P);return a(()=>{r!==`en`&&!z[r]&&B(r).then(s)},[]),e(V.Provider,{value:{locale:r,setLocale:e=>{if(e!==r){i(e);try{localStorage.setItem(`dashboard-locale`,e)}catch{}z[e]?s(z[e]):B(e).then(s)}},t:(e,t)=>ye(o,e,t)},children:n})}var we=()=>n(V),H=()=>n(V).t,Te=j;function Ee(){let{locale:t,setLocale:n,t:r}=we();return e(`div`,{class:`flex items-center gap-1`,title:r(`locale.switcherAria`),children:[e(Te,{size:13,className:`text-gray-400 dark:text-gray-500 shrink-0`,"aria-hidden":`true`}),e(`select`,{value:t,onChange:e=>n(e.target.value),"aria-label":r(`locale.switcherAria`),disabled:R.length<=1,class:`text-xs text-gray-600 dark:text-gray-300 bg-transparent border-none outline-none cursor-pointer hover:text-gray-900 dark:hover:text-white appearance-none disabled:cursor-default`,children:R.map(t=>e(`option`,{value:t,children:L[t]},t))})]})}var U=o(()=>{});function De({setTitle:t,children:n}){return e(U.Provider,{value:t,children:n})}function W(e){let t=n(U);a(()=>{t(e)},[e,t])}var G=[{key:`nav.dashboard`,hash:`#/`,Icon:ce},{key:`nav.reports`,hash:`#/reports`,Icon:re,perm:`stats:view`},{type:`group`,key:`nav.consentBanners`,baseHash:`#/banners`,Icon:_e,children:[{key:`nav.consentTemplates`,hash:`#/banners/consent-templates`,Icon:oe},{key:`nav.uiTemplates`,hash:`#/banners/ui-templates`,Icon:ue},{key:`nav.profiles`,hash:`#/banners/profiles`,Icon:ae}]},{key:`nav.consents`,hash:`#/consents`,Icon:N},{key:`nav.visitors`,hash:`#/visitors`,Icon:ve},{key:`nav.users`,hash:`#/users`,Icon:se,perm:`user:view`},{key:`nav.roles`,hash:`#/roles`,Icon:he,perm:`role:view`},{key:`nav.sites`,hash:`#/tenants`,Icon:j,perm:`settings:update`,superadminOnly:!0},{key:`nav.vendors`,hash:`#/vendors`,Icon:fe,perm:`consent:view`},{key:`nav.audit`,hash:`#/audit`,Icon:pe,perm:`audit:view`},{key:`nav.api`,hash:`#/api/config`,Icon:de,perm:`settings:update`},{key:`nav.settings`,hash:`#/settings`,Icon:me},{key:`nav.howItWorks`,hash:`#/how-it-works`,Icon:ie}];function Oe({current:n,collapsed:r,onToggle:i}){let{user:a,logout:o}=b(),{appName:s,appLogoPath:l,hidePoweredBy:u}=T(),d=H(),[f,p]=t(()=>{let e=new Set;for(let t of G)`type`in t&&t.type===`group`&&n.startsWith(t.baseHash)&&e.add(t.baseHash);return e}),m=e=>{p(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},h=e=>n===e||e!==`#/`&&n.startsWith(e),g=e=>n.startsWith(e.baseHash),_=a?.roles.includes(`super_admin`)??!1,v=(e,t)=>(!t||_)&&(!e||a?.permissions.includes(e));return e(`aside`,{class:`${r?`w-14`:`w-56`} min-h-screen bg-gray-900 text-gray-100 flex flex-col transition-[width] duration-200 ease-in-out overflow-hidden shrink-0 border-r border-gray-700`,"aria-label":d(`nav.adminDashboard`),children:[e(`div`,{class:`px-3 py-5 border-b border-gray-700 flex items-center gap-2`,children:r?e(`div`,{class:`w-full flex justify-center`,children:l?e(`img`,{src:l,alt:s,class:`h-7 w-7 object-contain rounded`}):e(`img`,{src:`/icon.svg`,alt:s,class:`h-7 w-7`})}):e(`div`,{class:`min-w-0`,children:[l?e(`img`,{src:l,alt:s,class:`h-7 w-auto object-contain`}):e(`img`,{src:`/logo-dark.svg`,alt:s,class:`h-7 w-auto`}),e(`p`,{class:`text-xs text-gray-400 mt-0.5`,children:d(`nav.adminDashboard`)})]})}),e(`nav`,{class:`flex-1 py-4 overflow-y-auto`,"aria-label":d(`nav.adminDashboard`),children:G.filter(e=>v(e.perm,e.superadminOnly)).map(t=>{if(`type`in t&&t.type===`group`){let n=!r&&f.has(t.baseHash),i=g(t),a=t.children.filter(e=>v(e.perm));if(a.length===0)return null;let o=d(t.key);return e(`div`,{children:[e(`button`,{type:`button`,onClick:()=>{r?window.location.hash=a[0].hash:m(t.baseHash)},"aria-expanded":r?void 0:n,"aria-label":r?o:void 0,title:r?o:void 0,class:`w-full flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${r?`justify-center`:`justify-between`} ${i?`text-white bg-gray-800`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[e(`div`,{class:`flex items-center gap-3 ${r?``:`min-w-0`}`,children:[e(t.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!r&&e(`span`,{class:`truncate`,children:o})]}),!r&&e(E,{size:13,className:`shrink-0 text-gray-500 transition-transform ${n?`rotate-180`:``}`,"aria-hidden":`true`})]}),n&&e(`div`,{class:`bg-gray-950/30`,children:a.map(t=>{let n=h(t.hash),r=d(t.key);return e(`a`,{href:t.hash,"aria-current":n?`page`:void 0,class:`flex items-center gap-3 pl-8 pr-3 py-2 text-sm transition-colors ${n?`bg-blue-600 text-white`:`text-gray-400 hover:bg-gray-800 hover:text-white`}`,children:[e(t.Icon,{size:14,className:`shrink-0`,"aria-hidden":`true`}),r]},t.hash)})})]},t.baseHash)}let n=t,i=h(n.hash),a=d(n.key);return e(`a`,{href:n.hash,"aria-current":i?`page`:void 0,"aria-label":r?a:void 0,title:r?a:void 0,class:`flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${r?`justify-center`:``} ${i?`bg-blue-600 text-white`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[e(n.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!r&&a]},n.hash)})}),e(`div`,{class:`px-3 py-4 border-t border-gray-700 ${r?`flex justify-center`:``}`,children:[!r&&e(c,{children:[e(`p`,{class:`text-xs text-gray-400 truncate`,children:[a?.email,e(`br`,{}),e(`i`,{class:`text-gray-500`,children:a?.roles})]}),!u&&e(`p`,{class:`text-[10px] text-gray-600 mt-2`,children:[d(`layout.poweredBy`),` `,e(`a`,{href:`https://consenti.dev/?utm_source=dashboard&utm_medium=powered-by&utm_campaign=consenti-api`,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-gray-400 transition-colors`,children:`Consenti`})]})]}),r&&e(`button`,{onClick:o,"aria-label":d(`layout.signOut`),title:d(`layout.signOut`),class:`w-8 h-8 flex items-center justify-center rounded hover:bg-gray-700 text-gray-400 hover:text-white transition-colors`,children:e(M,{size:16,"aria-hidden":`true`})})]})]})}var K=le,q=ge;function ke({collapsed:t}){let{theme:n,toggle:r}=S(),i=H(),a=n===`dark`,o=i(a?`layout.toggleLight`:`layout.toggleDark`);return t?e(`button`,{onClick:r,"aria-label":o,title:o,class:`w-8 h-8 flex items-center justify-center rounded hover:bg-gray-700 text-gray-400 hover:text-white transition-colors`,children:a?e(K,{size:16,className:`text-cyan-400`}):e(q,{size:16,className:`text-gray-400`})}):e(`button`,{onClick:r,"aria-label":o,title:o,"aria-pressed":a,class:`relative flex items-center w-8 h-6 rounded-full px-0.5 transition-all duration-300 ${a?`bg-gray-900 ring-2 ring-cyan-400`:`bg-gray-600`}`,children:e(`span`,{class:`w-5 h-5 rounded-full flex items-center justify-center transition-all duration-300 ${a?`translate-x-2 bg-gray-800`:`translate-x-0 bg-white shadow`}`,children:a?e(K,{size:11,className:`text-cyan-400`}):e(q,{size:11,className:`text-amber-500`})})})}var Ae=M,je=O,Me=D;function J(){return typeof window<`u`&&window.innerWidth<768}function Ne({children:n,title:r,current:i}){let[o,s]=t(()=>J()),c=()=>s(e=>!e),{logout:l}=b(),u=H();return a(()=>{let e=()=>{J()&&s(!0)};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e(`div`,{class:`flex h-screen overflow-hidden dark:bg-gray-900`,children:[e(`div`,{class:`relative shrink-0`,children:[e(Oe,{current:i,collapsed:o,onToggle:c}),e(`button`,{onClick:c,"aria-label":u(o?`layout.expandSidebar`:`layout.collapseSidebar`),title:u(o?`layout.expandSidebar`:`layout.collapseSidebar`),class:`absolute top-5 -right-3.5 z-20 w-7 h-7 flex items-center justify-center bg-gray-800 border border-gray-600 rounded-full text-gray-300 hover:text-white hover:bg-gray-700 shadow-md transition-colors`,children:e(o?je:Me,{size:13})})]}),e(`div`,{class:`flex-1 flex flex-col min-w-0 overflow-hidden`,children:[e(`header`,{class:`shrink-0 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 px-6 py-3 flex items-center justify-between min-h-[56px]`,children:[r?e(`h1`,{class:`text-xl font-semibold text-gray-800 dark:text-gray-100`,children:r}):e(`span`,{}),e(`div`,{class:`flex items-center gap-3`,children:[e(ke,{}),e(Ee,{}),e(`button`,{onClick:l,"aria-label":u(`layout.signOut`),title:u(`layout.signOut`),class:`flex items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400 hover:text-gray-800 dark:hover:text-white transition-colors`,children:[e(Ae,{size:14,"aria-hidden":`true`}),u(`layout.signOut`)]})]})]}),e(`main`,{class:`flex-1 overflow-y-auto`,children:e(`div`,{class:`p-6`,children:n})})]})]})}var Pe=A,Fe=k;function Ie(){let{login:n}=b(),{appName:r,appLogoPath:i,hidePoweredBy:a}=T(),o=H(),[s,c]=t(``),[l,u]=t(``),[f,p]=t(!1),[m,h]=t(``),[g,_]=t(!1),v=async(e,t)=>{h(``),_(!0);try{let{token:r}=await d(`/auth/login`,{method:`POST`,body:JSON.stringify({email:e,password:t})});n(r),window.location.hash=`#/`}catch{h(o(`login.error.invalid`))}finally{_(!1)}};return e(`div`,{class:`min-h-screen bg-gray-50 flex flex-col items-center justify-center p-4`,style:{background:`linear-gradient(135deg, rgb(2, 6, 23) 0%, rgb(26, 52, 96) 40%, rgb(21, 101, 192) 75%, rgb(67, 160, 71) 100%)`},children:[i?e(`img`,{src:i,alt:r,class:`h-14 w-auto mx-auto mb-3 object-contain`}):null,e(`div`,{class:`bg-white rounded-xl shadow-sm border border-gray-200 p-8 w-full max-w-sm`,children:[e(`div`,{class:`mb-6 text-center`,children:[e(`h1`,{class:`text-xl font-bold text-gray-900`,children:o(`login.title`,{appName:r})}),e(`p`,{class:`text-sm text-gray-500 mt-1`,children:o(`login.subtitle`)})]}),e(`form`,{onSubmit:e=>{e.preventDefault(),v(s,l)},class:`space-y-4`,children:[e(`div`,{children:[e(`label`,{for:`login-email`,class:`block text-sm font-medium text-gray-700 mb-1`,children:o(`login.email`)}),e(`input`,{id:`login-email`,type:`email`,required:!0,value:s,onInput:e=>c(e.target.value),class:`w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500`,placeholder:o(`login.emailPlaceholder`),autocomplete:`email`})]}),e(`div`,{children:[e(`label`,{for:`login-password`,class:`block text-sm font-medium text-gray-700 mb-1`,children:o(`login.password`)}),e(`div`,{class:`relative`,children:[e(`input`,{id:`login-password`,type:f?`text`:`password`,required:!0,value:l,onInput:e=>u(e.target.value),class:`w-full border border-gray-300 rounded-lg px-3 py-2 pr-10 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500`,autocomplete:`current-password`}),e(`button`,{type:`button`,onClick:()=>p(e=>!e),"aria-label":o(f?`login.hidePassword`:`login.showPassword`),class:`absolute inset-y-0 right-0 flex items-center px-3 text-gray-400 hover:text-gray-600`,children:e(f?Fe:Pe,{size:16})})]})]}),m&&e(`p`,{role:`alert`,class:`text-sm text-red-600 bg-red-50 border border-red-200 rounded px-3 py-2`,children:m}),e(`button`,{type:`submit`,disabled:g,class:`w-full bg-blue-600 text-white rounded-lg px-4 py-2.5 text-sm font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors`,children:o(g?`login.submitting`:`login.submit`)})]}),!1,a||e(`p`,{class:`mt-5 text-center text-[11px] text-gray-400`,children:[o(`layout.poweredBy`),` `,e(`a`,{href:`https://consenti.dev/?utm_source=dashboard&utm_medium=powered-by&utm_campaign=consenti-api`,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-blue-500 transition-colors`,children:`Consenti`})]})]})]})}function Y({label:t,value:n,sub:r}){return e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[e(`p`,{class:`text-sm text-gray-500 dark:text-gray-400`,children:t}),e(`p`,{class:`text-3xl font-bold text-gray-900 dark:text-gray-100 mt-1`,children:n}),r&&e(`p`,{class:`text-xs text-gray-400 dark:text-gray-500 mt-1`,children:r})]})}function X({data:t,ariaLabel:n,noDataLabel:r}){if(t.length===0)return e(`p`,{class:`text-sm text-gray-400`,children:r});let i=Math.max(...t.map(e=>e.count),1),a=552/Math.max(t.length-1,1),o=t.map((e,t)=>({x:24+t*a,y:96-e.count/i*72,label:e.date.slice(5),count:e.count})),s=o.map((e,t)=>`${t===0?`M`:`L`} ${e.x} ${e.y}`).join(` `),c=`${s} L ${o[o.length-1].x} 96 L ${o[0].x} 96 Z`;return e(`svg`,{viewBox:`0 0 600 120`,class:`w-full`,role:`img`,"aria-label":n,children:[e(`defs`,{children:e(`linearGradient`,{id:`tl-grad`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[e(`stop`,{offset:`0%`,"stop-color":`#6366f1`,"stop-opacity":`0.3`}),e(`stop`,{offset:`100%`,"stop-color":`#6366f1`,"stop-opacity":`0.02`})]})}),e(`path`,{d:c,fill:`url(#tl-grad)`}),e(`path`,{d:s,fill:`none`,stroke:`#6366f1`,"stroke-width":`2`,"stroke-linejoin":`round`}),o.map((n,r)=>e(`g`,{children:[e(`circle`,{cx:n.x,cy:n.y,r:`3`,fill:`#6366f1`}),r%Math.max(Math.floor(t.length/6),1)===0&&e(`text`,{x:n.x,y:116,"text-anchor":`middle`,"font-size":`8`,fill:`#9ca3af`,children:n.label})]},r))]})}function Le({data:t,noDataLabel:n}){if(t.length===0)return e(`p`,{class:`text-sm text-gray-400`,children:n});let r=t.slice(0,8),i=Math.max(...r.map(e=>e.count),1);return e(`div`,{class:`space-y-2`,children:r.map(t=>e(`div`,{class:`flex items-center gap-2`,children:[e(`span`,{class:`text-xs text-gray-500 w-8 text-right`,children:t.country}),e(`div`,{class:`flex-1 bg-gray-100 rounded h-3 overflow-hidden`,children:e(`div`,{class:`h-full bg-indigo-500 rounded`,style:{width:`${t.count/i*100}%`},"aria-hidden":`true`})}),e(`span`,{class:`text-xs text-gray-600 w-8`,children:t.count})]},t.country))})}function Re({data:t,label:n,sub:r}){let i=2*Math.PI*36,a=t.rate/100*i;return e(`div`,{class:`flex items-center gap-4`,children:[e(`svg`,{width:`88`,height:`88`,viewBox:`0 0 88 88`,role:`img`,"aria-label":`${n}: ${t.rate}%`,children:[e(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#e5e7eb`,"stroke-width":`8`}),e(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#6366f1`,"stroke-width":`8`,"stroke-dasharray":`${a} ${i}`,"stroke-linecap":`round`,transform:`rotate(-90 44 44)`}),e(`text`,{x:`44`,y:`49`,"text-anchor":`middle`,"font-size":`16`,"font-weight":`bold`,fill:`currentColor`,class:`text-gray-800 dark:text-gray-100`,"aria-hidden":`true`,children:[t.rate,`%`]})]}),e(`div`,{children:[e(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300`,children:n}),e(`p`,{class:`text-xs text-gray-500 dark:text-gray-400`,children:r})]})]})}function ze({rows:t,noDataLabel:n,grantedLabel:r,deniedLabel:i,objectedLabel:a}){if(t.length===0)return e(`p`,{class:`text-sm text-gray-400`,children:n});let o=Math.max(...t.map(e=>e.granted+e.denied+e.objected),1);return e(`div`,{class:`space-y-3`,children:[e(`div`,{class:`flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400`,children:[e(`span`,{class:`flex items-center gap-1`,children:[e(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-emerald-500 inline-block`,"aria-hidden":`true`}),r]}),e(`span`,{class:`flex items-center gap-1`,children:[e(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-rose-500 inline-block`,"aria-hidden":`true`}),i]}),e(`span`,{class:`flex items-center gap-1`,children:[e(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-amber-500 inline-block`,"aria-hidden":`true`}),a]})]}),t.map(t=>{let n=t.granted+t.denied+t.objected;return e(`div`,{class:`flex items-center gap-2`,children:[e(`span`,{class:`text-xs text-gray-600 dark:text-gray-300 w-28 truncate`,title:t.label,children:t.label}),e(`div`,{class:`flex-1 bg-gray-100 dark:bg-gray-700 rounded h-3 overflow-hidden flex`,children:n>0&&e(c,{children:[e(`div`,{class:`h-full bg-emerald-500`,style:{width:`${t.granted/o*100}%`},"aria-hidden":`true`}),e(`div`,{class:`h-full bg-rose-500`,style:{width:`${t.denied/o*100}%`},"aria-hidden":`true`}),e(`div`,{class:`h-full bg-amber-500`,style:{width:`${t.objected/o*100}%`},"aria-hidden":`true`})]})}),e(`span`,{class:`text-xs text-gray-500 dark:text-gray-400 w-10 text-right`,children:n})]},t.label)})]})}var Z={overview:()=>d(`/stats/overview`),categories:()=>d(`/stats/categories`),timeline:(e=30)=>d(`/stats/timeline?days=${e}`),countries:()=>d(`/stats/countries`),gpc:()=>d(`/stats/gpc`)};function Be({current:n}){let r=H();W(r(`dashboard.title`));let[i,o]=t(null),[s,l]=t([]),[u,d]=t([]),[f,p]=t(null),[m,h]=t(!0);return a(()=>{Promise.all([Z.overview().then(o).catch(()=>{}),Z.timeline(30).then(l).catch(()=>{}),Z.countries().then(d).catch(()=>{}),Z.gpc().then(p).catch(()=>{})]).finally(()=>h(!1))},[]),e(c,{children:m?e(`p`,{role:`status`,"aria-live":`polite`,class:`text-gray-400 text-sm`,children:r(`common.loading`)}):e(`div`,{class:`space-y-6`,children:[i&&e(`div`,{class:`grid grid-cols-2 lg:grid-cols-4 gap-4`,children:[e(Y,{label:r(`dashboard.stats.totalConsents`),value:i.totalConsents}),e(Y,{label:r(`dashboard.stats.totalVisitors`),value:i.totalVisitors}),e(Y,{label:r(`dashboard.stats.accepted`),value:`${i.acceptedPct}%`,sub:r(`dashboard.stats.acceptedSub`)}),e(Y,{label:r(`dashboard.stats.rejected`),value:`${i.rejectedPct}%`,sub:r(`dashboard.stats.rejectedSub`)})]}),e(`div`,{class:`grid grid-cols-1 lg:grid-cols-2 gap-6`,children:[e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[e(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:r(`dashboard.chart.timeline`)}),e(X,{data:s,ariaLabel:r(`dashboard.chart.timelineAria`),noDataLabel:r(`dashboard.chart.noData`)})]}),e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[e(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:r(`dashboard.chart.countries`)}),e(Le,{data:u,noDataLabel:r(`dashboard.chart.noCountryData`)})]})]}),f&&e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:e(Re,{data:f,label:r(`dashboard.gpc.label`),sub:r(`dashboard.gpc.sub`,{detected:f.detected,total:f.total})})}),e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:e(`a`,{href:`#/reports`,class:`text-sm text-blue-600 dark:text-blue-400 hover:underline`,children:r(`dashboard.viewReports`)})})]})})}var Ve={status:()=>d(`/setup/status`),config:()=>d(`/setup/config`),complianceGroups:()=>d(`/setup/compliance-groups`),seedProfiles:e=>d(`/setup/seed-profiles`,{method:`POST`,body:JSON.stringify({groups:e})}),complete:()=>d(`/setup/complete`,{method:`POST`})},Q={Reports:()=>I(()=>import(`./Reports-DWEjQOKh.js`),__vite__mapDeps([0,1,2])),ProfileList:()=>I(()=>import(`./ProfileList-CWKSAgu0.js`),__vite__mapDeps([3,1,4,5,6,7,8,9,10,11,2,12,13])),ProfileEditor:()=>I(()=>import(`./ProfileEditor-BXtaE0tL.js`),__vite__mapDeps([14,1,4,15,8,16,11,2,12,17,18,19,10])),ProfileVersionHistory:()=>I(()=>import(`./ProfileVersionHistory-1h8sUgog.js`),__vite__mapDeps([20,1,16,11,2,19,10])),ArchivedProfileList:()=>I(()=>import(`./ArchivedProfileList-Bw-fx-BD.js`),__vite__mapDeps([21,1,9,10,11,2])),ConsentTemplateList:()=>I(()=>import(`./ConsentTemplateList-DCys2nM3.js`),__vite__mapDeps([22,1,2,5,7,8,9,10,12,17])),ConsentTemplateEditor:()=>I(()=>import(`./ConsentTemplateEditor-BKIEnLmA.js`),__vite__mapDeps([23,1,2,24,4,17,8,12,25,18])),UITemplateList:()=>I(()=>import(`./UITemplateList-BS7X4u4F.js`),__vite__mapDeps([26,1,2,5,7,8,9,10,17])),UITemplateEditor:()=>I(()=>import(`./UITemplateEditor-9A55scBe.js`),__vite__mapDeps([27,1,24,4,17,2,15,8,16,18])),ConsentList:()=>I(()=>import(`./ConsentList-BWOvPOMG.js`),__vite__mapDeps([28,1,2,29,10,9,30,16])),VisitorList:()=>I(()=>import(`./VisitorList-COP1SyNd.js`),__vite__mapDeps([31,1,2,29,10,9,30,16])),UserList:()=>I(()=>import(`./UserList-SPkMyFRy.js`),__vite__mapDeps([32,1,2,8,9,10,30,16,33,13,34])),RoleList:()=>I(()=>import(`./RoleList-BSGoqlzp.js`),__vite__mapDeps([35,1,4,36,8,16,34,2])),TenantList:()=>I(()=>import(`./TenantList-5AwFtoHf.js`),__vite__mapDeps([37,1,2,8,9,10])),VendorList:()=>I(()=>import(`./VendorList-C5fPhr6U.js`),__vite__mapDeps([38,1,2,25])),AuditLog:()=>I(()=>import(`./AuditLog-D6HiTQ1o.js`),__vite__mapDeps([39,1,2,6,29,10,9,30,16])),Settings:()=>I(()=>import(`./Settings-CVYrlyLm.js`),__vite__mapDeps([40,1,2])),ChangePassword:()=>I(()=>import(`./ChangePassword-D2rPkzD1.js`),__vite__mapDeps([41,1,33,2])),ApiConfig:()=>I(()=>import(`./ApiConfig-CE-Noelz.js`),__vite__mapDeps([42,1,2,4,5,43,36,8])),HowItWorks:()=>I(()=>import(`./HowItWorks-AeyjfQGO.js`),__vite__mapDeps([44,1])),SetupWizard:()=>I(()=>import(`./SetupWizard-4NTb5bZj.js`),__vite__mapDeps([45,1,4,43]))},He=i(()=>Q.Reports().then(e=>({default:e.Reports}))),Ue=i(()=>Q.ProfileList().then(e=>({default:e.ProfileList}))),We=i(()=>Q.ProfileEditor().then(e=>({default:e.ProfileEditor}))),Ge=i(()=>Q.ProfileVersionHistory().then(e=>({default:e.ProfileVersionHistory}))),Ke=i(()=>Q.ArchivedProfileList().then(e=>({default:e.ArchivedProfileList}))),qe=i(()=>Q.ConsentTemplateList().then(e=>({default:e.ConsentTemplateList}))),Je=i(()=>Q.ConsentTemplateEditor().then(e=>({default:e.ConsentTemplateEditor}))),Ye=i(()=>Q.UITemplateList().then(e=>({default:e.UITemplateList}))),Xe=i(()=>Q.UITemplateEditor().then(e=>({default:e.UITemplateEditor}))),Ze=i(()=>Q.ConsentList().then(e=>({default:e.ConsentList}))),Qe=i(()=>Q.VisitorList().then(e=>({default:e.VisitorList}))),$e=i(()=>Q.UserList().then(e=>({default:e.UserList}))),et=i(()=>Q.RoleList().then(e=>({default:e.RoleList}))),tt=i(()=>Q.TenantList().then(e=>({default:e.TenantList}))),nt=i(()=>Q.VendorList().then(e=>({default:e.VendorList}))),rt=i(()=>Q.AuditLog().then(e=>({default:e.AuditLogPage}))),it=i(()=>Q.Settings().then(e=>({default:e.Settings}))),at=i(()=>Q.ChangePassword().then(e=>({default:e.ChangePassword}))),ot=i(()=>Q.ApiConfig().then(e=>({default:e.ApiConfig}))),st=i(()=>Q.HowItWorks().then(e=>({default:e.HowItWorks}))),ct=i(()=>Q.SetupWizard().then(e=>({default:e.SetupWizard})));function lt(){for(let e of Object.values(Q))e().catch(()=>{})}function ut(e){typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e):window.setTimeout(e,1)}var dt=e(`div`,{class:`p-6 text-sm text-gray-400`,children:`Loading…`});function $(){return window.location.hash||`#/`}function ft(){let{user:n}=b(),[r,i]=t($),[o,s]=t(null),[c,u]=t(``);return a(()=>{let e=()=>i($());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),a(()=>{if(!n){s(null);return}Ve.status().then(({completed:e})=>s(e)).catch(()=>s(!0))},[n]),a(()=>{n&&ut(lt)},[n]),n?r===`#/setup`?o===!0?(window.location.hash=`#/`,null):e(l,{fallback:dt,children:e(ct,{onComplete:()=>s(!0)})}):o===!1?(r!==`#/setup`&&(window.location.hash=`#/setup`),null):r===`#/login`?(window.location.hash=`#/`,null):e(De,{setTitle:u,children:e(Ne,{title:c,current:r,children:e(l,{fallback:dt,children:pt(r)})})}):(r!==`#/login`&&(window.location.hash=`#/login`),e(Ie,{}))}function pt(t){if(t===`#/`||t===`#`)return e(Be,{current:t});if(t===`#/reports`)return e(He,{current:t});if(t===`#/banners/profiles`)return e(Ue,{current:t});if(t===`#/banners/profiles/new`)return e(We,{current:t});if(t===`#/banners/profiles/archived`)return e(Ke,{current:t});{let n=t.match(/^#\/banners\/profiles\/([^/]+)\/history(?:\?(.*))?$/);if(n){let r=new URLSearchParams(n[2]??``),i=e=>{let t=r.get(e);return t!==null&&Number.isInteger(Number(t))?Number(t):void 0},a=i(`version`),o=i(`compare`);return e(Ge,{id:n[1],current:t,...a===void 0?{}:{initialVersion:a},...o===void 0?{}:{compareVersion:o}})}}return t.startsWith(`#/banners/profiles/`)?e(We,{id:t.slice(19),current:t}):t===`#/banners/consent-templates`?e(qe,{current:t}):t===`#/banners/consent-templates/new`?e(Je,{current:t}):t.startsWith(`#/banners/consent-templates/`)?e(Je,{id:t.slice(28),current:t}):t===`#/banners/ui-templates`?e(Ye,{current:t}):t===`#/banners/ui-templates/new`?e(Xe,{current:t}):t.startsWith(`#/banners/ui-templates/`)?e(Xe,{id:t.slice(23),current:t}):t===`#/consents`||t.startsWith(`#/consents?`)?e(Ze,{current:t}):t===`#/visitors`||t.startsWith(`#/visitors?`)?e(Qe,{current:t}):t===`#/users`?e($e,{current:t}):t===`#/roles`?e(et,{current:t}):t===`#/tenants`?e(tt,{current:t}):t===`#/vendors`||t.startsWith(`#/vendors?`)?e(nt,{current:t}):t===`#/audit`||t.startsWith(`#/audit?`)?e(rt,{current:t}):t===`#/api/config`?e(ot,{current:t}):t===`#/settings`?e(it,{current:t}):t===`#/settings/change-password`?e(at,{current:t}):t===`#/how-it-works`?e(st,{current:t}):e(Be,{current:`#/`})}function mt(){return e(ee,{children:e(ne,{children:e(Ce,{children:e(y,{children:e(ft,{})})})})})}r(e(mt,{}),document.getElementById(`app`));export{b as _,X as a,N as c,k as d,O as f,S as g,T as h,Y as i,j as l,E as m,Z as n,W as o,D as p,ze as r,H as s,Ve as t,A as u};
|