@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
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
var e={_section_nav:`── Navegación ──────────────────────────────────────────`,"nav.dashboard":`Panel`,"nav.consentBanners":`Banners de consentimiento`,"nav.consentTemplates":`Plantillas de cookies`,"nav.uiTemplates":`Plantillas de UI`,"nav.profiles":`Perfiles`,"nav.consents":`Consentimientos`,"nav.visitors":`Visitantes`,"nav.users":`Usuarios`,"nav.roles":`Roles`,"nav.sites":`Sitios`,"nav.vendors":`Proveedores TCF`,"nav.reports":`Informes`,"nav.audit":`Registro de auditoría`,"nav.api":`API`,"nav.settings":`Ajustes`,"nav.adminDashboard":`Panel de administración`,_section_layout:`── Diseño ───────────────────────────────────────────`,"layout.expandSidebar":`Expandir barra lateral`,"layout.collapseSidebar":`Contraer barra lateral`,"layout.signOut":`Cerrar sesión`,"layout.toggleDark":`Cambiar a modo oscuro`,"layout.toggleLight":`Cambiar a modo claro`,"layout.poweredBy":`Desarrollado por`,_section_common:`── Común ───────────────────────────────────────────`,"common.loading":`Cargando…`,"common.searching":`Buscando…`,"common.save":`Guardar`,"common.saving":`Guardando…`,"common.cancel":`Cancelar`,"common.close":`Cerrar`,"common.delete":`Eliminar`,"common.edit":`Editar`,"common.create":`Crear`,"common.confirm":`Confirmar`,"common.noData":`Sin datos`,"common.search":`Search…`,"common.perPage":`Por página`,"common.goToPage":`Ir a la página`,"common.pageOfTotal":`Página {{page}} de {{total}}`,"common.noResults":`No results match your search.`,"common.exportCsv":`Exportar CSV`,"common.duplicate":`Duplicar`,"common.active":`Activo`,"common.inactive":`Inactivo`,"common.name":`Nombre`,"common.email":`Correo electrónico`,"common.status":`Estado`,"common.created":`Creado`,"common.id":`ID`,"common.add":`Añadir`,"common.remove":`Eliminar`,"common.revoke":`Revocar`,"common.required":`Obligatorio`,"common.version":`Versión`,"common.locale":`Configuración regional`,"common.country":`País`,"common.source":`Origen`,"common.grantAll":`Conceder todo`,"common.revokeAll":`Revocar todo`,"common.granted":`concedido`,"common.page":`Página {{n}}`,"common.prev":`Anterior`,"common.next":`Siguiente`,"common.you":`Tú`,"common.default":`predeterminado`,"common.hide":`Ocultar`,"common.show":`Mostrar`,"common.activate":`Activar`,"common.deactivate":`Desactivar`,"common.newRole":`Nuevo rol`,"common.copyToClipboard":`Copiar al portapapeles`,"common.back":`Atrás`,"common.copyId":`Copiar ID`,"common.mandatory":`obligatorio`,"common.optional":`Opcional`,"common.roles":`Roles`,"common.showPassword":`Mostrar contraseña`,"common.hidePassword":`Ocultar contraseña`,"common.updated":`Actualizado`,"common.locked":`Bloqueado`,_section_locale:`── Selector de idioma ─────────────────────────────`,"locale.en":`Inglés`,"locale.switcherAria":`Cambiar idioma`,_section_login:`── Inicio de sesión ───────────────────────────────`,"login.title":`{{appName}} Admin`,"login.subtitle":`Inicia sesión en tu cuenta`,"login.email":`Correo electrónico`,"login.emailPlaceholder":`admin@example.com`,"login.password":`Contraseña`,"login.submit":`Iniciar sesión`,"login.submitting":`Iniciando sesión…`,"login.error.invalid":`Correo electrónico o contraseña no válidos`,"login.devSignIn":`⚡ Dev: iniciar sesión como user@consenti.dev`,_section_setupWizard:`── Asistente de configuración ───────────────────`,"setupWizard.welcome.title":`Bienvenido a {{appName}}`,"setupWizard.welcome.body":`Configuremos la gestión del consentimiento. Solo tomará un minuto: le mostraremos lo que está configurado y le ayudaremos a instalar un conjunto inicial de perfiles de cumplimiento.`,"setupWizard.welcome.docsLink":`Ver documentación`,"setupWizard.welcome.howItWorksLink":`Cómo funciona Consenti`,"setupWizard.welcome.getStarted":`Comenzar`,"setupWizard.welcome.skip":`Omitir configuración`,"setupWizard.config.title":`Su configuración`,"setupWizard.config.subtitle":`Esto es lo que Consenti obtuvo de su configuración y variables de entorno, combinado con valores predeterminados razonables. Los secretos están ocultos.`,"setupWizard.back":`Atrás`,"setupWizard.continue":`Continuar`,"setupWizard.profiles.title":`Perfiles de cumplimiento predeterminados`,"setupWizard.profiles.subtitle":`Consenti incluye 8 perfiles de cumplimiento predefinidos que cubren las principales normativas de privacidad a nivel mundial. Elija cuáles instalar ahora — puede añadir más después.`,"setupWizard.profiles.selectAll":`Instalar los 8 perfiles predeterminados`,"setupWizard.profiles.installAndContinue":`Instalar y continuar`,"setupWizard.profiles.skipAndContinue":`Omitir y continuar`,"setupWizard.profiles.error":`No se pudieron instalar los perfiles seleccionados. Puede intentarlo de nuevo más tarde desde Perfiles.`,"setupWizard.confirmation.title":`Todo listo`,"setupWizard.confirmation.seededSummary":`{{count}} perfil(es) de cumplimiento instalado(s).`,"setupWizard.confirmation.noneSeeded":`No se instaló ningún perfil — puede crear uno en cualquier momento desde Perfiles.`,"setupWizard.confirmation.readinessTitle":`Antes de salir a producción`,"setupWizard.confirmation.readinessJsonStorage":`Está usando el controlador de almacenamiento de archivos JSON — adecuado para desarrollo, pero cambie a un controlador de base de datos (node:sqlite, PostgreSQL, MySQL, MongoDB) para producción.`,"setupWizard.confirmation.readinessDefaultCredentials":`No se configuraron credenciales de administrador — Consenti está usando credenciales de demostración. Configure CONSENTI_ADMIN_EMAIL y CONSENTI_ADMIN_PASSWORD antes de salir a producción.`,"setupWizard.confirmation.howItWorks":`Cómo funciona Consenti`,"setupWizard.confirmation.goToDashboard":`Ir al panel`,_section_dashboard:`── Panel ─────────────────────────────────────────`,"dashboard.title":`Panel`,"dashboard.stats.totalConsents":`Consentimientos totales`,"dashboard.stats.totalVisitors":`Visitantes totales`,"dashboard.stats.accepted":`Aceptados`,"dashboard.stats.acceptedSub":`≥80% de cookies concedidas`,"dashboard.stats.rejected":`Rechazados`,"dashboard.stats.rejectedSub":`≤20% de cookies concedidas`,"dashboard.chart.timeline":`Consentimientos (últimos 30 días)`,"dashboard.chart.timelineAria":`Gráfico de la línea de tiempo de consentimientos`,"dashboard.chart.countries":`Principales países`,"dashboard.chart.noData":`Sin datos.`,"dashboard.chart.noCountryData":`Sin datos de países.`,"dashboard.gpc.label":`Tasa de detección de GPC`,"dashboard.gpc.sub":`{{detected}} de {{total}} consentimientos`,"dashboard.viewReports":`Ver informes completos →`,_section_reports:`── Informes ──────────────────────────────────────────`,"reports.title":`Informes`,"reports.filters.from":`Desde`,"reports.filters.to":`Hasta`,"reports.filters.apply":`Aplicar`,"reports.optin.total":`Decisiones totales`,"reports.optin.granted":`Concedido`,"reports.optin.denied":`Denegado`,"reports.optin.managed":`Parcialmente gestionado`,"reports.optin.byDate":`Tendencia de aceptación`,"reports.optin.byDateAria":`Decisiones de aceptación a lo largo del tiempo`,"reports.optin.byLocale":`Por idioma`,"reports.category.title":`Por categoría`,"reports.legend.granted":`Concedido`,"reports.legend.denied":`Denegado`,"reports.legend.objected":`Objetado`,"reports.legend.managed":`Gestionado`,_section_consents:`── Consentimientos ───────────────────────────────`,"consents.title":`Registros de consentimiento`,"consents.filterFrom":`Desde`,"consents.filterTo":`Hasta`,"consents.filterGpc":`Solo GPC`,"consents.records":`{{n}} registros`,"consents.empty":`Aún no hay registros de consentimiento.`,"consents.col.visitorId":`ID del visitante`,"consents.col.profile":`Perfil`,"consents.col.locale":`Configuración regional`,"consents.col.gpc":`GPC`,"consents.col.age":`Edad`,"consents.col.source":`Origen`,"consents.col.created":`Creado`,"consents.gpcYes":`Sí`,"consents.ageVerified":`Verificado`,"consents.searchPlaceholder":`Buscar visitante, perfil, idioma, origen…`,"consents.detail.title":`Registro de consentimiento`,"consents.detail.updated":`Actualizado`,"consents.detail.consentJson":`Datos de consentimiento`,"consents.detail.signature":`Firma`,"consents.detail.signed":`Firmado`,"consents.detail.unsigned":`Sin firmar`,_section_visitors:`── Visitantes ───────────────────────────────────`,"visitors.title":`Visitantes`,"visitors.empty":`Aún no hay visitantes registrados.`,"visitors.col.visitorId":`ID del visitante`,"visitors.col.country":`País`,"visitors.col.firstSeen":`Primera vez visto`,"visitors.col.lastSeen":`Última vez visto`,"visitors.searchPlaceholder":`Buscar ID de visitante, país…`,"visitors.detail.title":`Visitante`,"visitors.detail.region":`Región`,"visitors.detail.city":`Ciudad`,_section_users:`── Usuarios ──────────────────────────────────────`,"users.title":`Usuarios`,"users.count":`{{n}} usuarios`,"users.newUser":`+ Nuevo usuario`,"users.createForm.title":`Crear usuario`,"users.createForm.namePlaceholder":`Nombre`,"users.createForm.emailPlaceholder":`Correo electrónico`,"users.createForm.passwordPlaceholder":`Contraseña`,"users.createForm.confirmPasswordPlaceholder":`Confirmar contraseña`,"users.createForm.selectRole":`Seleccionar rol…`,"users.createForm.passwordMismatch":`Las contraseñas no coinciden`,"users.createForm.error":`No se pudo crear el usuario`,"users.col.status":`Estado`,"users.status.active":`Activo`,"users.status.inactive":`Inactivo`,"users.action.activate":`Activar`,"users.action.deactivate":`Desactivar`,"users.dialog.delete.title":`¿Eliminar al usuario "{{name}}"?`,"users.dialog.delete.message":`Esta cuenta de usuario se eliminará de forma permanente.`,_section_roles:`── Roles y permisos ─────────────────────────────`,"roles.title":`Roles y permisos`,"roles.list.heading":`Roles`,"roles.list.empty":`Aún no hay roles. Crea uno para empezar.`,"roles.form.roleNameLabel":`Nombre del rol`,"roles.form.roleNamePlaceholder":`p. ej., Editor`,"roles.form.descriptionLabel":`Descripción`,"roles.form.descriptionPlaceholder":`Descripción opcional`,"roles.perms.heading":`Permisos — {{name}}`,"roles.perms.selectPrompt":`Selecciona un rol para gestionar los permisos`,"roles.perms.clickPrompt":`Haz clic en un rol a la izquierda para ver y gestionar sus permisos.`,"roles.perms.noPerms":`No hay permisos definidos en el sistema.`,"roles.error.load":`No se pudieron cargar los roles.`,"roles.error.create":`No se pudo crear el rol.`,"roles.error.update":`No se pudo actualizar el rol.`,"roles.error.delete":`No se pudo eliminar el rol.`,"roles.error.perm":`No se pudo actualizar el permiso.`,"roles.dialog.delete.title":`¿Eliminar el rol "{{name}}"?`,"roles.dialog.delete.message":`Los usuarios asignados a este rol perderán sus permisos inmediatamente.`,"roles.aria.editRole":`Editar rol`,"roles.aria.deleteRole":`Eliminar rol`,"roles.superAdminLocked":`El rol «super_admin» está protegido: no se puede renombrar, eliminar ni modificar sus permisos.`,_section_profiles:`── Perfiles ──────────────────────────────────────`,"profiles.title":`Perfiles`,"profiles.count":`{{n}} perfiles`,"profiles.countSingular":`{{n}} perfil`,"profiles.newProfile":`+ Nuevo perfil`,"profiles.empty":`Aún no hay perfiles. Crea uno para empezar.`,"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":`Nombre`,"profiles.col.defaultLocale":`Configuración regional predeterminada`,"profiles.col.templates":`Plantillas`,"profiles.col.created":`Creado`,"profiles.template.cookie":`Cookie:`,"profiles.template.ui":`UI:`,"profiles.action.copyId":`Copiar ID del perfil`,"profiles.action.copySlug":`Copy compliance group slug`,"profiles.action.copying":`Copiando…`,"profiles.dialog.delete.title":`¿Eliminar "{{name}}"?`,"profiles.dialog.delete.message":`Este perfil y todo su contenido de idioma se eliminarán de forma permanente.`,"profiles.dialog.copy.title":`¿Copiar "{{name}}"?`,"profiles.dialog.copy.message":`Este perfil y todo su contenido de idioma se duplicarán.`,"profiles.error.copy":`No se pudo copiar el perfil.`,"profiles.error.activate":`No se pudo activar el perfil.`,"profiles.error.deactivate":`No se pudo desactivar el perfil.`,_section_profileEditor:`── Editor de perfiles ────────────────────────────`,"profileEditor.title.new":`Nuevo perfil`,"profileEditor.title.edit":`Editar perfil`,"profileEditor.title.loading":`Editor de perfiles`,"profileEditor.step.config":`Configuración del perfil`,"profileEditor.step.templates":`Plantillas`,"profileEditor.step.ageGateModal":`Verificación de edad`,"profileEditor.step.content":`Contenido`,"profileEditor.step.mainBanner":`Banner principal`,"profileEditor.step.gpcBanner":`Banner GPC`,"profileEditor.step.prefModal":`Modal de preferencias`,"profileEditor.config.profileName":`Nombre del perfil`,"profileEditor.config.profileNamePlaceholder":`Mi sitio web`,"profileEditor.config.defaultLocale":`Configuración regional predeterminada`,"profileEditor.config.allowedDomains":`Dominios permitidos`,"profileEditor.config.allowedDomainsHint":`Admite comodines (*.example.com). Déjalo vacío para permitir todos.`,"profileEditor.config.regulations":`Regulaciones de cumplimiento`,"profileEditor.config.reg.gdprLabel":`RGPD`,"profileEditor.config.reg.gdprDesc":`Opt-in UE/EEE. No se realiza seguimiento hasta que se otorgue el consentimiento. El banner se muestra en la primera visita.`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`Opt-out para California. Las cookies se conceden por defecto. Proporciona un disparador de "No vender".`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`California 2023. Opt-out para venta/compartición; opt-in para datos sensibles. GPC respetado.`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`India 2023. Opt-in como RGPD. GPC no reconocido. Se requiere aviso del fiduciario de datos.`,"profileEditor.config.darkMode":`Activar modo oscuro`,"profileEditor.config.darkModeHint":`Aplica tokens de color oscuros al widget de consentimiento para sitios con tema oscuro.`,"profileEditor.config.dpdpa.heading":`DPDPA — Campos obligatorios del aviso de consentimiento`,"profileEditor.config.dpdpa.fiduciary":`Nombre del fiduciario de datos`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`Correo electrónico del responsable de quejas`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`Descripción del propósito`,"profileEditor.config.dpdpa.purposePlaceholder":`Recopilamos tus datos para personalizar tu experiencia…`,"profileEditor.config.ageGate":`Activar verificación de edad`,"profileEditor.config.ageGateHint":`Pedir a los visitantes que confirmen su edad antes de mostrar las opciones de consentimiento. La edad mínima varía según la normativa — 13 (COPPA), 16 (RGPD Art. 8, por defecto).`,"profileEditor.config.ageGateSection.heading":`Verificación de edad — Campos obligatorios`,"profileEditor.config.ageGateSection.minimumAge":`Edad mínima`,"profileEditor.config.ageGateSection.minimumAgeHint":`Valores habituales: 13 (COPPA), 16 (RGPD Art. 8, por defecto).`,"profileEditor.config.ageGateSection.requireParentalConsent":`Requerir consentimiento parental`,"profileEditor.config.ageGateSection.requireParentalConsentHint":`Si se rechaza, se envía una solicitud de consentimiento parental en lugar de denegar todo.`,"profileEditor.templates.cookieTemplate":`Plantilla de cookie`,"profileEditor.templates.cookieTemplateHint":`Define qué cookies/propósitos aparecen en el modal de preferencias. Todos los campos se derivan de la plantilla — de solo lectura en el perfil.`,"profileEditor.templates.selectCookie":`— Selecciona una plantilla de cookie —`,"profileEditor.templates.uiTemplate":`Plantilla de UI`,"profileEditor.templates.uiTemplateHint":`Define la disposición del banner/modal, la cantidad de botones y la estructura de categorías. Agrega el texto en los pasos 3–5.`,"profileEditor.templates.selectUi":`— Selecciona una plantilla de UI —`,"profileEditor.templates.noTemplate":`No se ha seleccionado ninguna plantilla.`,"profileEditor.templates.previewPrompt":`Selecciona una plantilla de cookie y una plantilla de UI para ver una vista previa en vivo.`,"profileEditor.templates.categoriesCount":`categorías`,"profileEditor.templates.buttonsTotal":`botones en total`,"profileEditor.content.loadDefaults":`Cargar valores predeterminados`,"profileEditor.content.loadDefaultsTitle":`Rellenar esta sección con valores predeterminados en inglés`,"profileEditor.content.loadDefaultsNotice":`Los valores predeterminados son solo en inglés — tradúcelos usando la pestaña de idioma de arriba.`,"profileEditor.content.importError":`No se pudo analizar el archivo cargado. Asegúrate de que coincida con el formato de plantilla de idioma de Consenti.`,"profileEditor.content.mainBanner":`Banner principal`,"profileEditor.content.gpcBanner":`Banner GPC`,"profileEditor.content.prefModal":`Modal de preferencias`,"profileEditor.content.heading":`Encabezado`,"profileEditor.content.subheading":`Subencabezado`,"profileEditor.content.bodyText":`Texto principal`,"profileEditor.content.introText":`Texto de introducción (opcional)`,"profileEditor.content.buttonLabels":`Etiquetas de botones`,"profileEditor.content.categoryHeading":`Encabezado de categoría`,"profileEditor.content.categoryDesc":`Descripción de categoría`,"profileEditor.content.categoryFallback":`Categoría {{n}}`,"profileEditor.content.buttonLabelPlaceholder":`Texto del botón…`,"profileEditor.content.categoryDescPlaceholder":`Descripción de esta categoría de cookies…`,"profileEditor.content.liDescription":`Descripción del interés legítimo (opcional)`,"profileEditor.content.liDescriptionPlaceholder":`Nos basamos en un interés legítimo porque…`,"profileEditor.content.liDescriptionHint":`Tu justificación de la prueba de ponderación del RGPD para basarte en el interés legítimo, mostrada a los visitantes. Opcional — también puedes cubrir esto en la descripción de la categoría anterior.`,"profileEditor.content.mainBannerHeadingPlaceholder":`Valoramos tu privacidad`,"profileEditor.content.mainBannerBodyPlaceholder":`Usamos cookies para mejorar tu experiencia…`,"profileEditor.content.gpcHeadingPlaceholder":`Se detectó Global Privacy Control`,"profileEditor.content.prefHeadingPlaceholder":`Preferencias de privacidad`,"profileEditor.content.prefSubheadingPlaceholder":`Gestiona tus preferencias de cookies a continuación.`,"profileEditor.content.prefIntroPlaceholder":`Introducción opcional sobre las categorías…`,"profileEditor.content.noContent":`Selecciona una plantilla de UI en el paso 2 para comenzar a editar el contenido.`,"profileEditor.content.loadingTemplate":`Cargando plantilla…`,"profileEditor.nav.nextTemplates":`Siguiente: Plantillas`,"profileEditor.nav.nextContent":`Siguiente: Contenido`,"profileEditor.nav.nextAgeGate":`Siguiente: Verificación de edad`,"profileEditor.nav.nextMainBanner":`Siguiente: Banner principal`,"profileEditor.nav.nextGpcBanner":`Siguiente: Banner GPC`,"profileEditor.nav.nextPrefModal":`Siguiente: Modal de preferencias`,"profileEditor.action.create":`Crear perfil`,"profileEditor.action.save":`Guardar perfil`,"profileEditor.error.nameRequired":`El nombre del perfil es obligatorio.`,"profileEditor.error.nameRequiredContinue":`El nombre del perfil es obligatorio antes de continuar.`,"profileEditor.error.cookieRequired":`Selecciona una plantilla de cookie.`,"profileEditor.error.cookieContinue":`Selecciona una plantilla de cookie para continuar.`,"profileEditor.error.uiRequired":`Selecciona una plantilla de UI.`,"profileEditor.error.uiContinue":`Selecciona una plantilla de UI para continuar.`,"profileEditor.error.failed":`No se pudo guardar el perfil.`,"profileEditor.error.load":`No se pudo cargar el perfil.`,"profileEditor.table.noNoCookies":`No hay cookies definidas en esta plantilla.`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`Base legal`,"profileEditor.table.mandatory":`Obligatorio`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.tcfVendor":`Proveedor TCF`,"profileEditor.table.cpraCategory":`Categoría CPRA`,"profileEditor.table.cookies":`Cookies`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`Importar`,"profileEditor.export.jsonTitle":`Descargar contenido de idioma como JSON`,"profileEditor.export.csvTitle":`Descargar contenido de idioma como CSV para traducción`,"profileEditor.export.importTitle":`Subir JSON o CSV traducido`,"profileEditor.newLink":`+ Nuevo ↗`,_section_consentTemplates:`── Plantillas de cookies ─────────────────────────`,"consentTemplates.title":`Plantillas de cookies`,"consentTemplates.count":`{{n}} plantillas`,"consentTemplates.countSingular":`{{n}} plantilla`,"consentTemplates.new":`+ Nueva plantilla de cookies`,"consentTemplates.empty.title":`Aún no hay plantillas de cookies.`,"consentTemplates.empty.hint":`Las plantillas de cookies definen la lista de cookies/propósitos para tus perfiles de consentimiento. Crea una para reutilizarla en varios perfiles.`,"consentTemplates.search.placeholder":`Search consent templates…`,"consentTemplates.col.name":`Name`,"consentTemplates.col.cookies":`Cookies`,"consentTemplates.col.categories":`Categories`,"consentTemplates.required":`obligatorio`,"consentTemplates.dialog.delete.title":`¿Eliminar "{{name}}"?`,"consentTemplates.dialog.delete.message":`Esta plantilla de cookies se eliminará de forma permanente. Los perfiles vinculados perderán sus definiciones de cookies.`,"consentTemplates.editor.title.new":`Nueva plantilla de cookies`,"consentTemplates.editor.title.edit":`Editar plantilla de cookies`,"consentTemplates.editor.name":`Nombre de la plantilla`,"consentTemplates.editor.namePlaceholder":`p. ej., Google Analytics + Ads`,"consentTemplates.editor.nameRequired":`El nombre de la plantilla es obligatorio.`,"consentTemplates.editor.definitions":`Definiciones de cookies`,"consentTemplates.editor.empty":`Aún no hay cookies definidas. Añade una arriba.`,"consentTemplates.editor.addCookie":`+ Añadir cookie`,"consentTemplates.editor.idNoMatches":`No hay claves conocidas que coincidan — aún puedes escribir un ID personalizado`,"consentTemplates.editor.error.allIds":`Todas las cookies deben tener un ID.`,"consentTemplates.editor.error.uniqueIds":`Los IDs de cookie deben ser únicos.`,"consentTemplates.editor.error.failed":`No se pudo guardar la plantilla.`,"consentTemplates.editor.error.notFound":`Plantilla no encontrada.`,"consentTemplates.editor.action.create":`Crear plantilla`,"consentTemplates.editor.action.save":`Guardar plantilla`,"consentTemplates.editor.showTcf":`Proveedores TCF`,"consentTemplates.editor.showCpra":`Categoría CPRA`,"consentTemplates.editor.infoHint":`Haz clic en un encabezado de columna para obtener más información`,"consentTemplates.editor.infoUsage":`Uso`,"consentTemplates.editor.infoLaws":`Orientación regulatoria`,"consentTemplates.editor.infoExamples":`Ejemplos`,"consentTemplates.col.id":`ID de cookie`,"consentTemplates.col.idShort":`ID / Nombre`,"consentTemplates.col.gpc":`Respetar señal GPC`,"consentTemplates.col.gpcShort":`GPC`,"consentTemplates.col.tcfVendor":`IDs de proveedores TCF`,"consentTemplates.col.cpraCategory":`Categoría de datos CPRA`,"consentTemplates.col.tcfVendorShort":`Proveedor TCF`,"consentTemplates.col.cpraCategoryShort":`Categoría CPRA`,"consentTemplates.col.purpose":`Propósito de la cookie`,"consentTemplates.col.purposeShort":`Propósito`,"consentTemplates.purpose.necessary":`Necesaria`,"consentTemplates.purpose.functional":`Funcional`,"consentTemplates.purpose.preferences":`Preferencias`,"consentTemplates.purpose.analytics":`Analítica`,"consentTemplates.purpose.marketing":`Marketing`,"consentTemplates.editor.purposePlaceholder":`Seleccionar propósito…`,"consentTemplates.editor.error.purpose":`Cada cookie debe tener un propósito.`,_section_uiTemplates:`── Plantillas de UI ──────────────────────────────`,"uiTemplates.title":`Plantillas de UI`,"uiTemplates.count":`{{n}} plantillas`,"uiTemplates.countSingular":`{{n}} plantilla`,"uiTemplates.new":`+ Nueva plantilla de UI`,"uiTemplates.empty.title":`Aún no hay plantillas de UI.`,"uiTemplates.empty.hint":`Las plantillas de UI definen la configuración visual — posiciones, botones, categorías — de tus banners y modales de consentimiento.`,"uiTemplates.search.placeholder":`Search UI templates…`,"uiTemplates.col.name":`Name`,"uiTemplates.col.positions":`Positions`,"uiTemplates.col.buttons":`Buttons`,"uiTemplates.mainBanner":`Banner principal:`,"uiTemplates.gpcBanner":`Banner GPC:`,"uiTemplates.modal":`Modal:`,"uiTemplates.categories":`{{n}} categorías`,"uiTemplates.dialog.delete.title":`¿Eliminar "{{name}}"?`,"uiTemplates.dialog.delete.message":`Esta plantilla de UI se eliminará de forma permanente. Los perfiles vinculados perderán sus ajustes de UI.`,"uiTemplates.editor.title.new":`Nueva plantilla de UI`,"uiTemplates.editor.title.edit":`Editar plantilla de UI`,"uiTemplates.editor.name":`Nombre de la plantilla`,"uiTemplates.editor.nameRequired":`El nombre de la plantilla es obligatorio.`,"uiTemplates.editor.namePlaceholder":`p. ej., Diseño estándar RGPD`,"uiTemplates.editor.loading":`Cargando plantilla…`,"uiTemplates.editor.tabMain":`Banner principal`,"uiTemplates.editor.tabGpc":`Banner GPC`,"uiTemplates.editor.tabModal":`Modal de preferencias`,"uiTemplates.editor.mainBannerHint":`Se muestra en la primera visita cuando aún no se ha registrado el consentimiento.`,"uiTemplates.editor.gpcBannerHint":`Se muestra en lugar del banner principal cuando se detecta una señal GPC (autoHonorGPC activado).`,"uiTemplates.editor.error.notFound":`Plantilla no encontrada.`,"uiTemplates.editor.error.buttons":`Todos los botones deben tener un id.`,"uiTemplates.editor.error.uniqueButtonIds":`Button IDs must be unique.`,"uiTemplates.editor.error.customButtons":`Todos los botones de acción "personalizados" deben tener cookies seleccionadas.`,"uiTemplates.editor.error.catIds":`Todos los IDs de categoría son obligatorios.`,"uiTemplates.editor.error.uniqueCatIds":`Los IDs de categoría deben ser únicos.`,"uiTemplates.editor.error.catCookies":`Cada categoría debe incluir al menos una cookie.`,"uiTemplates.editor.error.failed":`No se pudo guardar la plantilla.`,"uiTemplates.editor.action.create":`Crear plantilla`,"uiTemplates.editor.action.save":`Guardar plantilla`,_section_sites:`── Sitios / Inquilinos ─────────────────────────────`,"sites.title":`Sitios / Inquilinos`,"sites.createNew":`Crear sitio nuevo`,"sites.namePlaceholder":`Nombre del sitio`,"sites.slugPlaceholder":`slug (p. ej., site-a)`,"sites.col.name":`Nombre`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Creado`,"sites.empty":`Aún no hay sitios.`,"sites.dialog.delete.title":`¿Eliminar "{{name}}"?`,"sites.dialog.delete.message":`Este sitio y todos los datos asociados se eliminarán de forma permanente. Esto no se puede deshacer.`,"sites.error.create":`No se pudo crear el sitio.`,_section_vendors:`── Proveedores TCF ─────────────────────────────────`,"vendors.title":`Lista de proveedores TCF`,"vendors.info.title":`¿Qué es la lista de proveedores TCF?`,"vendors.searchPlaceholder":`Buscar proveedores…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} proveedores`,"vendors.loading":`Cargando lista de proveedores…`,"vendors.noResults":`No se encontraron proveedores.`,"vendors.col.id":`ID`,"vendors.col.name":`Nombre`,"vendors.col.purposes":`Propósitos`,"vendors.col.liPurposes":`Propósitos de interés legítimo`,"vendors.col.specialPurposes":`Propósitos especiales`,"vendors.pagination":`Página {{page}} de {{totalPages}} · {{total}} proveedores en total`,"vendors.prev":`← Anterior`,"vendors.next":`Siguiente →`,"tcfRegistration.title":`Es necesario volver a confirmar el registro TCF`,"tcfRegistration.body":`compliance.tcf está habilitado con cmpId {{cmpId}} (versión {{cmpVersion}}), pero este registro aún no se ha confirmado — TCF se trata como deshabilitado: sin window.__tcfapi en el widget, sin tcfString en los registros de consentimiento.`,"tcfRegistration.deregistered":`Este cmpId fue dado de baja en IAB Europe el {{date}}. La confirmación está bloqueada hasta que registre un nuevo cmpId y actualice la configuración de su servidor.`,"tcfRegistration.notFound":`Este cmpId aún no se encontró en la lista CMP de IAB en caché. El registro puede tardar en propagarse — pruebe "Actualizar estado" dentro de un rato.`,"tcfRegistration.checkbox":`TCF está habilitado y hemos registrado este cmpId ({{cmpId}}, versión {{cmpVersion}}) con IAB Europe.`,"tcfRegistration.confirmButton":`Confirmar registro`,"tcfRegistration.refreshStatus":`Actualizar estado`,"tcfRegistration.loadError":`No se pudo cargar el estado de registro TCF.`,"tcfRegistration.confirmError":`No se pudo confirmar el registro TCF.`,"gppRegistration.title":`Es necesario volver a confirmar el registro GPP`,"gppRegistration.body":`compliance.gpp está habilitado con cmpId {{cmpId}} (versión {{cmpVersion}}), pero este registro aún no se ha confirmado — GPP se trata como deshabilitado: sin window.__gpp en el widget, sin gppString en los registros de consentimiento.`,"gppRegistration.checkbox":`GPP está habilitado y hemos registrado este cmpId ({{cmpId}}, versión {{cmpVersion}}).`,"gppRegistration.confirmButton":`Confirmar registro`,"gppRegistration.loadError":`No se pudo cargar el estado de registro GPP.`,"gppRegistration.confirmError":`No se pudo confirmar el registro GPP.`,_section_audit:`── Registro de auditoría ─────────────────────────`,"audit.title":`Registro de auditoría`,"audit.empty":`Aún no hay eventos de auditoría.`,"audit.col.time":`Hora`,"audit.col.action":`Acción`,"audit.col.resource":`Recurso`,"audit.col.resourceId":`ID del recurso`,"audit.col.actor":`Actor`,"audit.actor.system":`sistema`,"audit.viewHistory":`Comparar`,"audit.searchPlaceholder":`Buscar acción, recurso, actor…`,"audit.detail.title":`Entrada de auditoría`,"audit.detail.oldData":`Datos anteriores`,"audit.detail.newData":`Datos nuevos`,_section_apiConfig:`── Configuración de la API ───────────────────────`,"apiConfig.title":`Configuración de la API`,"apiConfig.public.heading":`API pública`,"apiConfig.public.about.text":`Usada por el widget para enviar y gestionar el consentimiento. No tiene token de autenticación: los orígenes permitidos abajo son su único control de acceso.`,"apiConfig.public.about.link":`Abrir referencia de la API pública en consenti.dev`,"apiConfig.admin.heading":`API de administrador`,"apiConfig.admin.about.text":`Usa estos tokens para llamar a la API de administrador de Consenti desde scripts, CI/CD o integraciones del lado del servidor. Cada ruta, formato de solicitud/respuesta y encabezado de autenticación está documentado en consenti.dev.`,"apiConfig.admin.about.link":`Abrir referencia de la API de administrador en consenti.dev`,"apiConfig.endpoint.heading":`Endpoint`,"apiConfig.endpoint.hint":`URL base para este despliegue, resuelta a partir de tu configuración.`,"apiConfig.origins.heading":`Orígenes permitidos`,"apiConfig.origins.hint":`Solo se aceptarán solicitudes desde estos orígenes. Usa * para permitir todos (no recomendado en producción).`,"apiConfig.origins.publicNote":`La API pública no tiene token de autenticación: esta lista es su único control de acceso.`,"apiConfig.origins.adminNote":`Una capa adicional sobre la autenticación por token Bearer. Incluye el propio origen de este panel ({{origin}}) para no bloquearte a ti mismo.`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`No hay orígenes configurados: actualmente se permiten todos los orígenes.`,"apiConfig.origins.errorDuplicate":`Ya está en la lista.`,"apiConfig.origins.errorSave":`No se pudo guardar. Inténtalo de nuevo.`,"apiConfig.origins.remove":`Eliminar`,"apiConfig.tokens.heading":`Tokens de API de administrador`,"apiConfig.tokens.hint":`Tokens Bearer para acceso del servidor y CI/CD a la API de administración de Consenti. Pásalos como Authorization: Bearer <token>. Nunca los expongas en código del lado del cliente: conceden acceso administrativo completo.`,"apiConfig.tokens.created":`Token creado: cópialo ahora, no se volverá a mostrar.`,"apiConfig.tokens.placeholder":`Nombre del token (p. ej., despliegue CI)`,"apiConfig.tokens.empty":`Aún no hay tokens.`,"apiConfig.tokens.errorName":`El nombre es obligatorio`,"apiConfig.tokens.errorCreate":`No se pudo crear el token`,"apiConfig.tokens.col.name":`Nombre`,"apiConfig.tokens.col.status":`Estado`,"apiConfig.tokens.col.created":`Creado`,"apiConfig.tokens.status.active":`Activo`,"apiConfig.tokens.status.revoked":`Revocado`,"apiConfig.tokens.status.expired":`Expired`,"apiConfig.tokens.col.expires":`Expires`,"apiConfig.tokens.expiresLabel":`Expires (optional)`,"apiConfig.tokens.expiresNever":`Never`,"apiConfig.tokens.dialog.title":`¿Revocar este token de API?`,"apiConfig.tokens.dialog.message":`Cualquier aplicación que use este token perderá el acceso de inmediato.`,"apiConfig.tokens.reactivate":`Reactivar`,"apiConfig.tokens.deleteDialog.title":`¿Eliminar permanentemente este token de API?`,"apiConfig.tokens.deleteDialog.message":`Esto elimina el registro del token por completo y no se puede deshacer. Ya no será posible reactivarlo.`,_section_settings:`── Ajustes ───────────────────────────────────────`,"settings.title":`Ajustes`,"settings.account.heading":`Cuenta`,"settings.account.email":`Correo electrónico:`,"settings.account.roles":`Roles:`,"settings.account.id":`ID:`,"settings.account.changePassword":`Cambiar contraseña`,"settings.export.heading":`Exportar datos`,"settings.export.hint":`Descarga todos los registros de consentimiento o los registros de auditoría.`,"settings.export.consentCsv":`Consentimientos CSV`,"settings.export.consentXlsx":`Consentimientos XLSX`,"settings.export.consentJson":`Consentimientos JSON`,"settings.export.auditCsv":`Auditoría CSV`,"settings.about.heading":`Acerca de`,"settings.about.text":`Consenti v0.1.0 — Plataforma de gestión de consentimientos de código abierto, de estilo RGPD.`,"settings.about.license":`Licencia Apache 2.0.`,_section_changePassword:`── Cambiar contraseña ───────────────────────────`,"changePassword.title":`Cambiar contraseña`,"changePassword.hint":`Elige una contraseña segura de al menos 12 caracteres.`,"changePassword.success":`Contraseña actualizada correctamente.`,"changePassword.newPassword":`Nueva contraseña`,"changePassword.newPasswordPlaceholder":`Mín. 12 caracteres`,"changePassword.confirmPassword":`Confirmar nueva contraseña`,"changePassword.confirmPasswordPlaceholder":`Repite la nueva contraseña`,"changePassword.submit":`Actualizar contraseña`,"changePassword.submitting":`Guardando…`,"changePassword.error.minLength":`La contraseña debe tener al menos 12 caracteres.`,"changePassword.error.mismatch":`Las contraseñas no coinciden.`,"changePassword.error.failed":`No se pudo actualizar la contraseña.`,"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":`Restablecer contraseña`,"users.edit.resetPasswordHint":`(déjalo en blanco para mantener la contraseña actual)`,"users.edit.newPassword":`Nueva contraseña`,"users.edit.confirmNewPassword":`Confirmar nueva contraseña`,"users.edit.passwordTooShort":`La contraseña debe tener al menos 12 caracteres`,"users.superAdminLocked":`Las cuentas de superadministrador están protegidas y no se pueden editar ni eliminar.`,"users.detail.title":`Usuario`,"users.detail.allSites":`Todos los sitios`,"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":`Mejorar accesibilidad`,"profileEditor.config.enhanceAccessibilityHint":`Aplica el tamaño mínimo de botones WCAG 2.1 AA (44px), anillos de foco visibles y etiquetas para lectores de pantalla al widget de consentimiento.`,"profileEditor.config.showFooterMetadata":`Mostrar metadatos en el pie`,"profileEditor.config.showFooterMetadataHint":`Muestra una franja en el banner y modal con el ID de consentimiento, fecha, versión del perfil y un enlace a la configuración de privacidad.`,"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)`,"profileEditor.content.copyLocale":`Copiar contenido de idioma`,"profileEditor.content.copyLocaleTitle":`Copiar el contenido de esta sección desde otro idioma ya creado`,"profileEditor.copyLocale.confirmTitle":`¿Reemplazar el contenido existente?`,"profileEditor.copyLocale.confirmMessage":`Esta sección ya tiene contenido en {{locale}}. Copiar desde {{source}} lo eliminará y lo reemplazará por completo.`,"profileEditor.copyLocale.confirmAction":`Reemplazar`,_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":`Paso {{step}} de {{total}}`,"uiTemplates.editor.wizard.next":`Siguiente`,"uiTemplates.editor.wizard.back":`Atrás`,"uiTemplates.editor.stackButtonsOnBreakpoint":`Apilar botones (px)`,"uiTemplates.editor.stackButtonsOnBreakpointHint":`Los botones se apilan verticalmente por debajo de este ancho. 0 = desactivado. Predeterminado: 576.`,"uiTemplates.editor.trapFocus":`Retener foco`,"uiTemplates.editor.trapFocusHint":`Confina el foco de teclado (Tab) en el contenedor de consentimiento mientras este banner o modal sea visible.`,"uiTemplates.editor.showForgetMe":`🗑️ Mostrar botón "Olvídame"`,"uiTemplates.editor.showForgetMeHint":`Añade un control de eliminación de autoservicio al modal de preferencias para los visitantes que ya tienen una decisión de consentimiento guardada — el punto de entrada del widget para los derechos de supresión equivalentes del RGPD Art. 17, CCPA/CPRA, LGPD Art. 18, UK GDPR, DPDPA, KVKK, POPIA, PDPA-TH y APPI. Elimina mediante el mismo endpoint que DELETE /consent/:visitorId de la API.`,"uiTemplates.editor.fieldInfo.title":`Referencia de campos`,"uiTemplates.editor.fieldInfo.headingTag.label":`Etiqueta de encabezado`,"uiTemplates.editor.fieldInfo.headingTag.description":`La etiqueta HTML usada para el encabezado principal del banner o modal. Controla el esquema del documento y cómo los lectores de pantalla anuncian la región.`,"uiTemplates.editor.fieldInfo.headingTag.highlights":`Elige h1–h6 según la jerarquía de encabezados de tu página — no saltes niveles (p. ej. h4 después de un h1 de página).
|
|
6
|
+
Se permite una etiqueta personalizada (p. ej. div, p) si no quieres que se anuncie como encabezado.
|
|
7
|
+
Se aplica de forma independiente al Banner Principal, al Banner GPC y al Modal de Preferencias.`,"uiTemplates.editor.fieldInfo.style.label":`Estilo`,"uiTemplates.editor.fieldInfo.style.description":`El peso visual de un botón — Primario, Secundario, Acento o Texto. Es puramente estético; no cambia lo que hace el botón.`,"uiTemplates.editor.fieldInfo.style.highlights":`Primario: máximo énfasis, normalmente tu llamada a la acción principal (p. ej. Aceptar todo).
|
|
8
|
+
Secundario: menor énfasis, fondo neutro acorde a tu tema — para opciones alternativas (p. ej. Gestionar preferencias).
|
|
9
|
+
Acento: un color de resalte distinto, separado de Primario/Secundario — por defecto es rojo salvo que definas un color de acento personalizado, así que resérvalo para una llamada fuerte como Rechazar todo.
|
|
10
|
+
Texto: estilo mínimo tipo enlace — Consenti aplica este estilo automáticamente a los botones con acción Enlace.`,"uiTemplates.editor.fieldInfo.action.label":`Acción`,"uiTemplates.editor.fieldInfo.action.description":`Qué ocurre cuando el visitante hace clic en este botón.`,"uiTemplates.editor.fieldInfo.action.highlights":`Personalizada: concede o deniega las cookies seleccionadas abajo — se usa para Aceptar todo / Rechazar todo / Aceptar seleccionadas.
|
|
11
|
+
Enviar: guarda los interruptores que el visitante haya configurado en el Modal de Preferencias.
|
|
12
|
+
Gestionar: abre el Modal de Preferencias desde un botón del banner.
|
|
13
|
+
Cerrar: cierra el banner o modal sin cambiar el consentimiento.
|
|
14
|
+
Enlace: abre una URL externa (p. ej. Política de Privacidad) — usa el estilo Texto por defecto.`,"uiTemplates.editor.fieldInfo.cookies.label":`Cookies a conceder/denegar`,"uiTemplates.editor.fieldInfo.cookies.description":`Qué finalidades de cookies concede o deniega este botón de acción Personalizada al hacer clic.`,"uiTemplates.editor.fieldInfo.cookies.highlights":`Obligatorio cuando la Acción es Personalizada.
|
|
15
|
+
Usa * para seleccionar todas las finalidades de cookies definidas (p. ej. Aceptar todo / Rechazar todo).
|
|
16
|
+
Selecciona finalidades específicas para crear botones de consentimiento parcial como "Aceptar solo analítica".`,"uiTemplates.editor.fieldInfo.trapFocus.label":`Atrapar foco`,"uiTemplates.editor.fieldInfo.trapFocus.description":`Confina el foco de teclado (Tab) en el contenedor de consentimiento mientras este banner o modal sea visible.`,"uiTemplates.editor.fieldInfo.trapFocus.highlights":`Evita que Tab / Shift+Tab mueva el foco al contenido de la página oculto tras la superposición.
|
|
17
|
+
Recomendado para modales y cualquier banner con superposición, para que los usuarios de teclado y lectores de pantalla no puedan acceder a contenido inaccesible.
|
|
18
|
+
No es necesario en banners no bloqueantes sin superposición.`,"uiTemplates.editor.fieldInfo.buttonId.label":`ID del botón`,"uiTemplates.editor.fieldInfo.buttonId.description":`Un identificador único legible por máquina para este botón, p. ej. accept-all o reject-all.`,"uiTemplates.editor.fieldInfo.buttonId.highlights":`No es el texto visible — la etiqueta visible se define por idioma en el paso de contenido del perfil.
|
|
19
|
+
Debe ser único dentro de su propia sección (Banner Principal, Banner GPC, Modal de Preferencias); el mismo id puede reutilizarse entre secciones porque nunca se muestran juntas.
|
|
20
|
+
Se usa en los registros de consentimiento y analítica para identificar qué botón pulsó el visitante.`,"uiTemplates.editor.fieldInfo.localeSwitcher.label":`Mostrar selector de idioma`,"uiTemplates.editor.fieldInfo.localeSwitcher.description":`Muestra un selector de idioma en este banner o modal para que los visitantes puedan cambiar de idioma sin salir del flujo de consentimiento.`,"uiTemplates.editor.fieldInfo.localeSwitcher.highlights":`Solo es útil si el perfil tiene configurado más de un idioma en su paso de contenido.
|
|
21
|
+
Se puede activar de forma independiente para el Banner Principal, el Banner GPC y el Modal de Preferencias.`,"uiTemplates.editor.fieldInfo.forgetMe.label":`Olvídame`,"uiTemplates.editor.fieldInfo.forgetMe.description":`Muestra un botón en el modal de preferencias, debajo de las categorías, que permite a un visitante recurrente eliminar su registro de consentimiento guardado sin que el sitio tenga que enlazarlo desde otra parte.`,"uiTemplates.editor.fieldInfo.forgetMe.highlights":`Solo se muestra a los visitantes que ya tienen una decisión de consentimiento guardada — de lo contrario no hay nada que eliminar.
|
|
22
|
+
Elimina mediante el mismo endpoint DELETE /consent/:visitorId que widget.deleteConsent()/reConsent().
|
|
23
|
+
La etiqueta del botón se redacta por idioma en el paso de contenido del perfil, no aquí.
|
|
24
|
+
Emite consenti:forgetMeRequested antes y consenti:forgotten después — una aplicación anfitriona puede usarlos para ejecutar su propio flujo de eliminación verificado por identidad en otros sistemas.
|
|
25
|
+
Solo para el Modal de Preferencias — no existe un equivalente para el Banner Principal ni el Banner GPC.`,_section_howItWorks:`── Cómo funciona Consenti ────────────────────────────`,"nav.howItWorks":`Cómo funciona Consenti`,"howItWorks.title":`Cómo funciona Consenti`,"howItWorks.intro":`Consenti es una plataforma de gestión de consentimiento de código abierto, de estilo RGPD. Gestiona la recopilación, almacenamiento e informes de consentimiento de cookies para sus sitios web. Esta guía le explica el flujo de trabajo principal y describe cada sección del panel.`,"howItWorks.workflow.heading":`Flujo de trabajo principal`,"howItWorks.workflow.step1.title":`Definir categorías de cookies`,"howItWorks.workflow.step1.desc":`Vaya a Banners de consentimiento → Plantillas de cookies y cree una plantilla con todas las categorías de cookies de su sitio (p. ej., análisis, marketing). Establezca la base legal y la caducidad de cada categoría.`,"howItWorks.workflow.step2.title":`Diseñar la interfaz de consentimiento`,"howItWorks.workflow.step2.desc":`Vaya a Banners de consentimiento → Plantillas de UI y configure el diseño visual de su banner y modal de preferencias — etiquetas de botones, colores, estilo de diseño y visualización de categorías.`,"howItWorks.workflow.step3.title":`Crear un perfil de consentimiento`,"howItWorks.workflow.step3.desc":`Vaya a Banners de consentimiento → Perfiles y combine una Plantilla de cookies con una Plantilla de UI. Añada texto traducido para cada idioma, habilite las normativas necesarias (RGPD, CCPA, DPDPA) y publique.`,"howItWorks.workflow.step4.title":`Integrar el widget`,"howItWorks.workflow.step4.desc":`Copie su clave de API desde API → Configuración y añada la etiqueta de script de Consenti a su sitio web. El widget obtiene su perfil publicado y muestra el banner de consentimiento automáticamente.`,"howItWorks.workflow.step5.title":`Monitorear y auditar`,"howItWorks.workflow.step5.desc":`Use las páginas Consentimientos y Visitantes para revisar registros de consentimiento en tiempo real. Use el Registro de auditoría para un historial inalterable de todas las acciones administrativas como evidencia de cumplimiento.`,"howItWorks.features.heading":`Funcionalidades del panel`,"howItWorks.features.dashboard.title":`Panel`,"howItWorks.features.dashboard.desc":`La pantalla principal muestra KPIs en tiempo real — total de consentimientos, tasa de aceptación, tasa de rechazo y un gráfico de series temporales. Úselo para detectar tendencias y evaluar el impacto de los cambios en el banner.`,"howItWorks.features.reports.title":`Informes`,"howItWorks.features.reports.desc":`Tendencia de aceptación en un rango de fechas, más desgloses por categoría e idioma (concedido/denegado/objetado). Requiere el permiso stats:view.`,"howItWorks.features.consentTemplates.title":`Plantillas de cookies`,"howItWorks.features.consentTemplates.desc":`Listas reutilizables de categorías de cookies. Cada categoría tiene un ID, base legal (consentimiento, interés legítimo, necesario), gestión de señal GPC, caducidad y mapeo opcional de proveedor TCF o categoría CPRA.`,"howItWorks.features.uiTemplates.title":`Plantillas de UI`,"howItWorks.features.uiTemplates.desc":`Controla la apariencia del banner de consentimiento, el aviso GPC y el modal de preferencias. Configure conjuntos de botones, etiquetas de encabezado, opacidad de superposición y orden de visualización de categorías.`,"howItWorks.features.profiles.title":`Perfiles`,"howItWorks.features.profiles.desc":`Un perfil es la unidad desplegable. Vincula una Plantilla de cookies con una Plantilla de UI, almacena contenido multilingüe y sigue un número de versión para retroceder. Solo un perfil por dominio puede estar activo a la vez.`,"howItWorks.features.consents.title":`Consentimientos`,"howItWorks.features.consents.desc":`Un registro buscable y filtrable de todos los registros de consentimiento enviados por los visitantes. Cada registro muestra el ID de visitante, perfil utilizado, idioma, señal GPC, decisiones de consentimiento y marca de tiempo.`,"howItWorks.features.visitors.title":`Visitantes`,"howItWorks.features.visitors.desc":`Una lista de identificadores de visitantes únicos en sus sitios, con su país, fecha de primer acceso y fecha de último acceso. Los IDs de visitante son UUID seudónimos almacenados sin direcciones IP.`,"howItWorks.features.users.title":`Usuarios`,"howItWorks.features.users.desc":`Gestione las cuentas de administrador que pueden iniciar sesión en este panel. Asigne roles, active o desactive cuentas y restrinja usuarios a sitios específicos en implementaciones multitenant.`,"howItWorks.features.roles.title":`Roles`,"howItWorks.features.roles.desc":`Defina conjuntos de permisos con nombre (p. ej., Visor, Editor, Administrador). Asigne permisos granulares como consent:view, profile:edit o audit:view a cada rol y luego asigne roles a los usuarios.`,"howItWorks.features.vendors.title":`Proveedores`,"howItWorks.features.vendors.desc":`Explore la Lista Global de Proveedores (GVL) de IAB para buscar IDs de proveedores TCF, propósitos declarados y propósitos de interés legítimo. Use estos IDs al configurar categorías de cookies en sus plantillas.`,"howItWorks.features.audit.title":`Registro de auditoría`,"howItWorks.features.audit.desc":`Un registro de solo adición e inalterable de cada acción administrativa — guardados de perfiles, cambios de usuarios, creación de claves de API y más. Necesario para las obligaciones de responsabilidad del RGPD.`,"howItWorks.features.api.title":`API y claves`,"howItWorks.features.api.desc":`Genere y revoque tokens de API, configure orígenes CORS permitidos para la API pública de consentimiento y explore la referencia interactiva de OpenAPI para entender cada endpoint.`,"howItWorks.features.settings.title":`Configuración`,"howItWorks.features.settings.desc":`Vea los detalles de su cuenta, cambie su contraseña y exporte datos de consentimiento o auditoría como CSV, XLSX o JSON para análisis sin conexión o presentaciones regulatorias.`,"howItWorks.docs.heading":`Documentación completa`,"howItWorks.docs.text":`Guías detalladas, referencias de configuración, ejemplos de integración y un playground en vivo están disponibles en el sitio de documentación de Consenti.`,"howItWorks.docs.link":`Abrir consenti.dev/docs →`,"howItWorks.consentFlow.heading":`Flujo de consentimiento extremo a extremo`,"howItWorks.consentFlow.step1.title":`Widget inicializado`,"howItWorks.consentFlow.step1.desc":`El script de Consenti se carga en el navegador del visitante y lee su configuración (clave API, compliance.type). Si ya existe una cookie de consentimiento válida y no expirada, el widget se cierra silenciosamente — no se muestra ningún banner.`,"howItWorks.consentFlow.step2.title":`Jurisdicción detectada`,"howItWorks.consentFlow.step2.desc":`Si compliance.type es 'auto', el widget llama a GET /resolve-profile enviando la zona horaria, el encabezado Accept-Language y la dirección IP del visitante. El servidor asigna estas señales a un complianceGroup mediante el mapa de país → conformidad integrado.`,"howItWorks.consentFlow.step3.title":`Perfil obtenido`,"howItWorks.consentFlow.step3.desc":`El widget obtiene el perfil activo para el complianceGroup resuelto y el idioma del visitante. La respuesta es un objeto JSON plano con todo el texto del banner, las categorías de cookies, los ajustes de la interfaz y los indicadores de regulación — listo para renderizar.`,"howItWorks.consentFlow.step4.title":`Banner renderizado`,"howItWorks.consentFlow.step4.desc":`El widget renderiza el banner o el modal de preferencias usando la plantilla UI del perfil. Las categorías obligatorias están marcadas previamente y no pueden desmarcarse. Las categorías opcionales muestran su base legal (consentimiento o interés legítimo).`,"howItWorks.consentFlow.step5.title":`Consentimiento enviado`,"howItWorks.consentFlow.step5.desc":`Cuando el visitante actúa (Aceptar todo, Rechazar todo o Guardar preferencias), el widget envía un POST a la API con el registro de consentimiento: ID de visitante, versión del perfil, estado por categoría (otorgado/denegado/objetado), señal GPC, marca de tiempo e idioma.`,"howItWorks.consentFlow.step6.title":`Almacenado y auditado`,"howItWorks.consentFlow.step6.desc":`La API valida la carga útil, almacena el registro de consentimiento y añade una entrada al registro de auditoría de solo anexión. El registro del visitante se actualiza con el país y las fechas de primera/última visita. El widget escribe la cookie de consentimiento para que visitas futuras omitan el banner.`,"howItWorks.profileResolution.heading":`Algoritmo de resolución de perfil`,"howItWorks.profileResolution.intro":`Cuando llega un visitante, Consenti resuelve en cinco pasos qué perfil de consentimiento mostrar.`,"howItWorks.profileResolution.step1.title":`Señales geográficas recopiladas`,"howItWorks.profileResolution.step1.desc":`El widget envía tres señales a GET /resolve-profile: la zona horaria del navegador (Intl.DateTimeFormat), el encabezado Accept-Language (o parámetro lang), y la dirección IP del lado del servidor.`,"howItWorks.profileResolution.step2.title":`País determinado`,"howItWorks.profileResolution.step2.desc":`El servidor intenta en orden: (1) geolocalización por IP a través del geoDataProvider configurado; (2) tabla de zona horaria → país; (3) heurística de etiqueta de idioma → país (p. ej. 'es' → ES). El primer resultado no vacío prevalece.`,"howItWorks.profileResolution.step3.title":`Grupo de cumplimiento asignado`,"howItWorks.profileResolution.step3.desc":`El código de país ISO-3166-1 alfa-2 (más el código de región/estado opcional) se busca en el mapa integrado PAÍS → GRUPO_DE_CUMPLIMIENTO. Una anulación regional (p. ej. US/CA → optOutCalifornia) tiene prioridad sobre el valor predeterminado del país.`,"howItWorks.profileResolution.step4.title":`Perfil activo localizado`,"howItWorks.profileResolution.step4.desc":`El sistema consulta la base de datos para encontrar el perfil activo cuyo complianceGroup coincida con el grupo resuelto. Solo un perfil por complianceGroup puede estar activo a la vez. Si no existe ninguno, se devuelve 404 y el widget puede usar un profileOverride.`,"howItWorks.profileResolution.step5.title":`Idioma resuelto`,"howItWorks.profileResolution.step5.desc":`El mejor idioma se elige mediante: (1) coincidencia exacta con el idioma solicitado por el widget; (2) coincidencia por prefijo de idioma (p. ej. 'es-AR' → 'es'); (3) idioma resuelto por el proveedor; (4) defaultLocale del perfil. El JSON resuelto se sirve desde un archivo estático (perfiles publicados) o directamente desde la base de datos (vistas previas).`,"howItWorks.complianceGroups.heading":`Grupos de cumplimiento`,"howItWorks.complianceGroups.intro":`Cada país del mundo se asigna a uno de ocho grupos de cumplimiento. Cada grupo determina el modelo de consentimiento que debe seguir el widget.`,"howItWorks.complianceGroups.optIn.title":`optIn — GDPR / ePrivacy Opt-In estricto`,"howItWorks.complianceGroups.optIn.desc":`Se requiere consentimiento previo antes de establecer cookies no esenciales. Los visitantes deben tener la opción genuina de rechazar, la retirada debe ser tan fácil como dar el consentimiento, y se deben ofrecer opciones granulares por categoría.`,"howItWorks.complianceGroups.optIn.laws":`GDPR, Directiva ePrivacy, UK GDPR, PECR, revFADP (CH), KVKK (TR), PDPA (TH) y otras leyes nacionales estrictas`,"howItWorks.complianceGroups.optIn.countries":`Todos los estados miembros de la UE, Reino Unido, Suiza, Turquía, Tailandia, Islandia, Liechtenstein, Noruega, Guernsey, Gibraltar y otros países con normas ePrivacy estrictas`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — India DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`La Ley de Protección de Datos Personales Digitales de India 2023 requiere consentimiento explícito opt-in. Obligaciones adicionales: nombrar un Data Fiduciary, proporcionar un aviso de consentimiento dedicado y respaldar los derechos de los Data Principals. Establezca el campo dpdpaDataFiduciary en su perfil.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Ley de Protección de Datos Personales Digitales 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`India (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — Marco legal múltiple de China`,"howItWorks.complianceGroups.optInChina.desc":`La gobernanza de datos de China requiere consentimiento explícito bajo la PIPL, combinado con obligaciones de la Ley de Seguridad de Datos (DSL) y la Ley de Ciberseguridad (CSL). Requisitos adicionales aplican a transferencias transfronterizas de datos y clasificación de datos.`,"howItWorks.complianceGroups.optInChina.laws":`Ley de Protección de Información Personal (PIPL), Ley de Seguridad de Datos (DSL), Ley de Ciberseguridad (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`China (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — California CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Los datos pueden recopilarse por defecto, pero los consumidores deben tener una opción clara de opt-out de la venta o compartición de sus datos personales. La señal GPC (Global Privacy Control) debe respetarse como un opt-out válido.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`Estados Unidos — California (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Otros estados de EE. UU.`,"howItWorks.complianceGroups.optOutUSState.desc":`Modelado según el marco de opt-out de California. Los consumidores pueden optar por no participar en publicidad dirigida y la venta de datos personales. Varios estados exigen respetar la señal 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":`Estados Unidos — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — Privacidad general / Consentimiento`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`Existe una ley general de privacidad pero no impone un requisito estricto de banner de cookies al estilo PECR/ePrivacy. La mejor práctica es ofrecer una opción de consentimiento para cookies no esenciales y un aviso de privacidad claro, pero el umbral legal es inferior al opt-in del GDPR.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Ley 25 (CA), LGPD (BR — usar hybridBrazil), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID y muchos otros`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Canadá, Australia, Nueva Zelanda, Japón, Corea del Sur, Singapur, Malasia, Sudáfrica y muchos países de América Latina, África y Asia`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brasil LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`La LGPD de Brasil es similar al GDPR pero las cookies de analítica y publicidad pueden tratarse bajo la base legal de interés legítimo según la evaluación del responsable del tratamiento. Se muestra el banner, pero la base legal por categoría puede ser más matizada que el opt-in estricto del GDPR.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brasil (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Solo aviso de privacidad`,"howItWorks.complianceGroups.noticeOnly.desc":`No aplica ninguna regulación específica de cookies, o el régimen existente solo requiere un aviso de privacidad — no un banner obligatorio de opt-in u opt-out. Mostrar un banner de consentimiento sigue siendo recomendable para la transparencia, pero no está legalmente obligado.`,"howItWorks.complianceGroups.noticeOnly.laws":`Variable — países sin regulación dedicada de cookies / ePrivacy`,"howItWorks.complianceGroups.noticeOnly.countries":`Muchos países de África, Asia Central, el Caribe y el Pacífico no cubiertos por los grupos anteriores`,"howItWorks.enums.heading":`Referencia de valores clave`,"howItWorks.enums.legalBasis.heading":`legalBasis (categoría de cookie)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — La categoría está siempre activa independientemente del consentimiento (p. ej. sesión, autenticación). Nunca bloqueada por GPC o señales de opt-out.`,"howItWorks.enums.legalBasis.consent":`consent — Requiere opt-in explícito del visitante. Bloqueado por defecto; bloqueado por GPC en todas las jurisdicciones opt-in.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Se basa en el interés legítimo del responsable. Activo por defecto; el visitante puede objetar. Soft-bloqueado por GPC en algunas jurisdicciones (UE, Reino Unido).`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (por registro de categoría)`,"howItWorks.enums.consentStatus.granted":`granted — El visitante dio consentimiento explícito para esta categoría.`,"howItWorks.enums.consentStatus.denied":`denied — El visitante rechazó explícitamente el consentimiento para esta categoría.`,"howItWorks.enums.consentStatus.objected":`objected — El visitante objetó a una categoría de interés legítimo (opt-out, no un rechazo de consentimiento).`,"howItWorks.enums.geoProvider.heading":`Opciones de geoDataProvider`,"howItWorks.enums.geoProvider.default":`default / timezone — Usa la zona horaria del navegador (Intl.DateTimeFormat) para inferir el país, con respaldo en Accept-Language. Sin dependencia adicional.`,"howItWorks.enums.geoProvider.language":`language — Deriva el país solo del encabezado Accept-Language (p. ej. 'es' → ES, 'pt' → BR). Rápido pero impreciso.`,"howItWorks.enums.geoProvider.geoip":`geoip — Usa el paquete npm geoip-lite con una base de datos MaxMind Lite integrada. Requerido: npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Llama a ipinfo.io mediante HTTPS integrado (sin dependencia extra). Añade ~50–200 ms por primera visita.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Usa el paquete npm maxmind con un archivo local GeoLite2-City.mmdb. El más preciso. Requiere la variable de entorno MAXMIND_DB_PATH y npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`Función personalizada — Pase una CountryResolverFn a compliance.geoDataProvider para integrar cualquier proveedor de geo-IP o 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":`Detectado: {{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.content.forgetMeHeading":`Botón Olvídame`,"profileEditor.content.forgetMeHint":`Se muestra en el modal de preferencias, debajo de las categorías, cuando "Mostrar botón 'Olvídame'" está activado en el paso del Modal de Preferencias de la Plantilla de UI vinculada.`,"profileEditor.content.forgetMeLabel":`Etiqueta del botón`,"profileEditor.content.ageGateModal.heading":`Diálogo de verificación de edad`,"profileEditor.content.ageGateModal.headingPlaceholder":`¿Tienes 16 años o más?`,"profileEditor.content.ageGateModal.bodyText":`Texto principal`,"profileEditor.content.ageGateModal.bodyPlaceholder":`Confirma tu edad antes de mostrarte las preferencias de cookies.`,"profileEditor.content.ageGateModal.confirmButtonLabel":`Etiqueta del botón «Sí»`,"profileEditor.content.ageGateModal.confirmButtonPlaceholder":`Sí`,"profileEditor.content.ageGateModal.denyButtonLabel":`Etiqueta del botón «No»`,"profileEditor.content.ageGateModal.denyButtonPlaceholder":`No`,"profileEditor.content.ageGateModal.parentalConsent.heading":`Mensaje de consentimiento parental`,"profileEditor.content.ageGateModal.parentalConsent.headingPlaceholder":`Se requiere consentimiento parental`,"profileEditor.content.ageGateModal.parentalConsent.bodyText":`Texto principal`,"profileEditor.content.ageGateModal.parentalConsent.bodyPlaceholder":`Solo se usarán las cookies estrictamente necesarias hasta que un padre, madre o tutor verifique el consentimiento en tu nombre.`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonLabel":`Etiqueta del botón «OK»`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonPlaceholder":`OK`,"profileEditor.content.ageGateModal.loadDefaultsTitle":`Rellenar esta sección con texto predeterminado genérico para este idioma`,"profileEditor.error.missingRequiredContent":`Falta contenido obligatorio para el idioma «{{locale}}»; revisa la pestaña resaltada.`,"profileEditor.error.saveFailedMoreFields":`(y {{count}} campo(s) más necesitan atención)`,"profileEditor.nudge.title":`Campo opcional vacío`,"profileEditor.nudge.headingBlank":`Dejaste el encabezado vacío. Los visitantes verán el banner sin uno.`,"profileEditor.nudge.introBlank":`Dejaste el texto introductorio vacío. Los visitantes verán el panel de preferencias sin él.`,"profileEditor.nudge.addNow":`Añadir ahora`,"profileEditor.nudge.ignore":`Ignorar`,"profiles.error.delete":`No se pudo eliminar el perfil.`};export{e as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-
|
|
1
|
+
import{t as e}from"./createLucideIcon-DAiYBrnd.js";var t=e(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]);export{t};
|
|
@@ -0,0 +1,25 @@
|
|
|
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`,"common.locked":`Verrouillé`,_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`,"roles.superAdminLocked":`Le rôle « super_admin » est protégé : il ne peut être renommé, supprimé, ni voir ses permissions modifiées.`,_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.`,"profiles.error.copy":`Échec de la copie du profil.`,"profiles.error.activate":`Échec de l'activation du profil.`,"profiles.error.deactivate":`Échec de la désactivation du profil.`,_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.ageGateModal":`Vérification d'âge`,"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.config.ageGate":`Activer la vérification d'âge`,"profileEditor.config.ageGateHint":`Demander aux visiteurs de confirmer leur âge avant d'afficher les choix de consentement. L'âge minimum varie selon la réglementation — 13 (COPPA), 16 (RGPD Art. 8, par défaut).`,"profileEditor.config.ageGateSection.heading":`Vérification d'âge — Champs obligatoires`,"profileEditor.config.ageGateSection.minimumAge":`Âge minimum`,"profileEditor.config.ageGateSection.minimumAgeHint":`Valeurs courantes : 13 (COPPA), 16 (RGPD Art. 8, par défaut).`,"profileEditor.config.ageGateSection.requireParentalConsent":`Exiger le consentement parental`,"profileEditor.config.ageGateSection.requireParentalConsentHint":`En cas de refus, une demande de consentement parental est envoyée au lieu de tout refuser.`,"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.nextAgeGate":`Suivant : Vérification d'âge`,"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.col.categories":`Categories`,"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.`,"sites.error.create":`Échec de la création du site.`,_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 →`,"tcfRegistration.title":`L'enregistrement TCF doit être reconfirmé`,"tcfRegistration.body":`compliance.tcf est activé avec le cmpId {{cmpId}} (version {{cmpVersion}}), mais cet enregistrement n'a pas encore été confirmé — TCF est traité comme désactivé : pas de window.__tcfapi dans le widget, pas de tcfString sur les enregistrements de consentement.`,"tcfRegistration.deregistered":`Ce cmpId a été désenregistré auprès de l'IAB Europe le {{date}}. La confirmation est bloquée tant que vous n'avez pas enregistré un nouveau cmpId et mis à jour la configuration de votre serveur.`,"tcfRegistration.notFound":`Ce cmpId n'a pas encore été trouvé dans la liste CMP de l'IAB mise en cache. L'enregistrement peut prendre du temps à se propager — réessayez avec « Actualiser le statut » un peu plus tard.`,"tcfRegistration.checkbox":`TCF est activé, et nous avons enregistré ce cmpId ({{cmpId}}, version {{cmpVersion}}) auprès de l'IAB Europe.`,"tcfRegistration.confirmButton":`Confirmer l'enregistrement`,"tcfRegistration.refreshStatus":`Actualiser le statut`,"tcfRegistration.loadError":`Impossible de charger le statut d'enregistrement TCF.`,"tcfRegistration.confirmError":`Impossible de confirmer l'enregistrement TCF.`,"gppRegistration.title":`L'enregistrement GPP doit être reconfirmé`,"gppRegistration.body":`compliance.gpp est activé avec le cmpId {{cmpId}} (version {{cmpVersion}}), mais cet enregistrement n'a pas encore été confirmé — GPP est traité comme désactivé : pas de window.__gpp dans le widget, pas de gppString sur les enregistrements de consentement.`,"gppRegistration.checkbox":`GPP est activé, et nous avons enregistré ce cmpId ({{cmpId}}, version {{cmpVersion}}).`,"gppRegistration.confirmButton":`Confirmer l'enregistrement`,"gppRegistration.loadError":`Impossible de charger le statut d'enregistrement GPP.`,"gppRegistration.confirmError":`Impossible de confirmer l'enregistrement GPP.`,_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 de style 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.superAdminLocked":`Les comptes super-admin sont protégés et ne peuvent pas être modifiés ni supprimés.`,"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)`,"profileEditor.content.copyLocale":`Copier le contenu de la langue`,"profileEditor.content.copyLocaleTitle":`Copier le contenu de cette section depuis une autre langue déjà rédigée`,"profileEditor.copyLocale.confirmTitle":`Remplacer le contenu existant ?`,"profileEditor.copyLocale.confirmMessage":`Cette section contient déjà du contenu en {{locale}}. Copier depuis {{source}} le supprimera et le remplacera entièrement.`,"profileEditor.copyLocale.confirmAction":`Remplacer`,_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.`,"uiTemplates.editor.showForgetMe":`🗑️ Afficher le bouton « Oubliez-moi »`,"uiTemplates.editor.showForgetMeHint":`Ajoute un contrôle de suppression en libre-service à la fenêtre de préférences pour les visiteurs ayant déjà une décision de consentement enregistrée — le point d'entrée côté widget pour les droits d'effacement équivalents du RGPD Art. 17, CCPA/CPRA, LGPD Art. 18, UK GDPR, DPDPA, KVKK, POPIA, PDPA-TH et APPI. Supprime via le même endpoint que le DELETE /consent/:visitorId de l'API.`,"uiTemplates.editor.fieldInfo.title":`Référence des champs`,"uiTemplates.editor.fieldInfo.headingTag.label":`Balise de titre`,"uiTemplates.editor.fieldInfo.headingTag.description":`La balise HTML utilisée pour le titre principal de la bannière ou de la modale. Contrôle le plan du document et la façon dont les lecteurs d'écran annoncent la région.`,"uiTemplates.editor.fieldInfo.headingTag.highlights":`Choisissez h1–h6 selon la hiérarchie des titres de votre page — ne sautez pas de niveau (ex. h4 après un h1 de page).
|
|
6
|
+
Une balise personnalisée est autorisée (ex. div, p) si vous ne voulez pas qu'elle soit annoncée comme un titre.
|
|
7
|
+
S'applique indépendamment à la bannière principale, à la bannière GPC et à la modale de préférences.`,"uiTemplates.editor.fieldInfo.style.label":`Style`,"uiTemplates.editor.fieldInfo.style.description":`Le poids visuel d'un bouton — Primaire, Secondaire, Accent ou Texte. Purement esthétique ; cela ne change pas l'action du bouton.`,"uiTemplates.editor.fieldInfo.style.highlights":`Primaire : accent maximal, généralement votre appel à l'action principal (ex. Tout accepter).
|
|
8
|
+
Secondaire : accent réduit, fond neutre assorti à votre thème — pour des choix alternatifs (ex. Gérer les préférences).
|
|
9
|
+
Accent : une couleur de mise en avant distincte, séparée de Primaire/Secondaire — rouge par défaut sauf si vous définissez une couleur d'accent personnalisée ; réservez-la à un appel fort comme Tout refuser.
|
|
10
|
+
Texte : style minimal façon lien — Consenti applique ce style par défaut aux boutons d'action Lien.`,"uiTemplates.editor.fieldInfo.action.label":`Action`,"uiTemplates.editor.fieldInfo.action.description":`Ce qui se passe lorsque le visiteur clique sur ce bouton.`,"uiTemplates.editor.fieldInfo.action.highlights":`Personnalisée : accorde ou refuse les cookies sélectionnés ci-dessous — utilisée pour Tout accepter / Tout refuser / Accepter la sélection.
|
|
11
|
+
Envoyer : enregistre les interrupteurs définis par le visiteur dans la modale de préférences.
|
|
12
|
+
Gérer : ouvre la modale de préférences depuis un bouton de la bannière.
|
|
13
|
+
Fermer : ferme la bannière ou la modale sans modifier le consentement.
|
|
14
|
+
Lien : ouvre une URL externe (ex. politique de confidentialité) — utilise le style Texte par défaut.`,"uiTemplates.editor.fieldInfo.cookies.label":`Cookies à accorder/refuser`,"uiTemplates.editor.fieldInfo.cookies.description":`Quelles finalités de cookies ce bouton d'action Personnalisée accorde ou refuse au clic.`,"uiTemplates.editor.fieldInfo.cookies.highlights":`Obligatoire lorsque l'action est Personnalisée.
|
|
15
|
+
Utilisez * pour cibler toutes les finalités de cookies définies (ex. Tout accepter / Tout refuser).
|
|
16
|
+
Sélectionnez des finalités spécifiques pour créer des boutons de consentement partiel comme « Accepter uniquement l'analytique ».`,"uiTemplates.editor.fieldInfo.trapFocus.label":`Capturer le focus`,"uiTemplates.editor.fieldInfo.trapFocus.description":`Confine le focus clavier (Tab) dans le conteneur de consentement lorsque cette bannière ou modale est visible.`,"uiTemplates.editor.fieldInfo.trapFocus.highlights":`Empêche Tab / Maj+Tab de déplacer le focus vers le contenu de la page masqué derrière la superposition.
|
|
17
|
+
Recommandé pour les modales et toute bannière avec superposition, afin que les utilisateurs de clavier et de lecteur d'écran ne puissent pas atteindre un contenu inaccessible.
|
|
18
|
+
Non nécessaire pour les bannières non bloquantes sans superposition.`,"uiTemplates.editor.fieldInfo.buttonId.label":`ID du bouton`,"uiTemplates.editor.fieldInfo.buttonId.description":`Un identifiant unique lisible par machine pour ce bouton, ex. accept-all ou reject-all.`,"uiTemplates.editor.fieldInfo.buttonId.highlights":`Ce n'est pas le texte affiché — le libellé visible est défini par langue dans l'étape de contenu du profil.
|
|
19
|
+
Doit être unique au sein de sa propre section (bannière principale, bannière GPC, modale de préférences) ; le même id peut être réutilisé entre sections car elles ne sont jamais affichées ensemble.
|
|
20
|
+
Utilisé par les journaux de consentement et l'analytique pour identifier le bouton cliqué par le visiteur.`,"uiTemplates.editor.fieldInfo.localeSwitcher.label":`Afficher le sélecteur de langue`,"uiTemplates.editor.fieldInfo.localeSwitcher.description":`Affiche un menu de langue sur cette bannière ou modale afin que les visiteurs puissent changer de langue sans quitter le parcours de consentement.`,"uiTemplates.editor.fieldInfo.localeSwitcher.highlights":`Utile uniquement si le profil a plus d'une langue configurée dans son étape de contenu.
|
|
21
|
+
Peut être activé indépendamment pour la bannière principale, la bannière GPC et la modale de préférences.`,"uiTemplates.editor.fieldInfo.forgetMe.label":`Oubliez-moi`,"uiTemplates.editor.fieldInfo.forgetMe.description":`Affiche un bouton dans la fenêtre de préférences, sous les catégories, permettant à un visiteur récurrent de supprimer son enregistrement de consentement sans que le site n'ait à créer de lien ailleurs.`,"uiTemplates.editor.fieldInfo.forgetMe.highlights":`Affiché uniquement aux visiteurs ayant déjà une décision de consentement enregistrée — sinon il n'y a rien à supprimer.
|
|
22
|
+
Supprime via le même endpoint DELETE /consent/:visitorId que widget.deleteConsent()/reConsent().
|
|
23
|
+
Le libellé du bouton est rédigé par langue dans l'étape de contenu du profil, pas ici.
|
|
24
|
+
Déclenche consenti:forgetMeRequested avant, puis consenti:forgotten après — une application hôte peut s'y accrocher pour exécuter son propre flux de suppression avec vérification d'identité sur d'autres systèmes.
|
|
25
|
+
Modale de préférences uniquement — pas d'équivalent pour la bannière principale ou la bannière GPC.`,_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 de style 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.content.forgetMeHeading":`Bouton Oubliez-moi`,"profileEditor.content.forgetMeHint":`Affiché dans la fenêtre de préférences, sous les catégories, lorsque « Afficher le bouton 'Oubliez-moi' » est activé à l'étape Modale de préférences du modèle d'interface lié.`,"profileEditor.content.forgetMeLabel":`Libellé du bouton`,"profileEditor.content.ageGateModal.heading":`Fenêtre de vérification d'âge`,"profileEditor.content.ageGateModal.headingPlaceholder":`As-tu 16 ans ou plus ?`,"profileEditor.content.ageGateModal.bodyText":`Texte principal`,"profileEditor.content.ageGateModal.bodyPlaceholder":`Merci de confirmer ton âge avant d'afficher les préférences de cookies.`,"profileEditor.content.ageGateModal.confirmButtonLabel":`Libellé du bouton « Oui »`,"profileEditor.content.ageGateModal.confirmButtonPlaceholder":`Oui`,"profileEditor.content.ageGateModal.denyButtonLabel":`Libellé du bouton « Non »`,"profileEditor.content.ageGateModal.denyButtonPlaceholder":`Non`,"profileEditor.content.ageGateModal.parentalConsent.heading":`Message de consentement parental`,"profileEditor.content.ageGateModal.parentalConsent.headingPlaceholder":`Consentement parental requis`,"profileEditor.content.ageGateModal.parentalConsent.bodyText":`Texte principal`,"profileEditor.content.ageGateModal.parentalConsent.bodyPlaceholder":`Seuls les cookies strictement nécessaires seront utilisés jusqu'à ce qu'un parent ou tuteur vérifie le consentement en ton nom.`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonLabel":`Libellé du bouton « OK »`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonPlaceholder":`OK`,"profileEditor.content.ageGateModal.loadDefaultsTitle":`Remplir cette section avec un texte par défaut générique pour cette langue`,"profileEditor.error.missingRequiredContent":`Du contenu obligatoire manque pour la langue « {{locale}} » — vérifiez l'onglet mis en évidence.`,"profileEditor.error.saveFailedMoreFields":`(et {{count}} autre(s) champ(s) à corriger)`,"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`,"profiles.error.delete":`Échec de la suppression du profil.`};export{e as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
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}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.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-1{right:var(--spacing)}.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-\[12rem\]{max-width:12rem}.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)}.border-b-gray-900{border-bottom-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-purple-100{background-color:var(--color-purple-100)}.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-3{padding-top:calc(var(--spacing) * 3)}.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-5{padding-right:calc(var(--spacing) * 5)}.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-red-900{color:var(--color-red-900)}.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}.opacity-70{opacity:.7}.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-red-900:hover{color:var(--color-red-900)}.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\:flex{display:flex}}@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}
|