diff --git a/src/i18n/en.ts b/src/i18n/en.ts
index 4c2ddd2..05d2db4 100644
--- a/src/i18n/en.ts
+++ b/src/i18n/en.ts
@@ -6143,6 +6143,10 @@ walletUi: {
top10Hint: 'Reach the top 10 supporters',
},
trust: {
+ attributedNetwork: 'From people in your network',
+ attributedProviderHouse: 'From the community trust provider',
+ attributedProviderCustom: 'From the provider you chose',
+ howItWorks: 'How trust works',
flaggedNoticeTitle: 'Reported by trusted skaters',
flaggedNoticeDesc: 'Take care. Trusted people in the network have reported this account.',
flaggedReporterFollow: '{{count}} you follow',
@@ -7382,6 +7386,28 @@ walletUi: {
badge: 'Passes',
sellerHint: 'This seller’s venue issues access passes',
},
+ trustUi: {
+ seoTitle: 'How trust works',
+ seoDescription: 'How SkateSpots shows trust: three states, where scores come from, and why absence is not distrust.',
+ title: 'How trust works',
+ intro: 'Trust here is a signal, not a verdict. It comes from who you know, or from a provider you choose. We do not rank people globally.',
+ statesTitle: 'Three states',
+ verifiedTitle: 'Verified',
+ verifiedDesc: 'Someone in your network vouches for this account: a friend-of-a-friend, or your chosen provider.',
+ unknownTitle: 'Unknown',
+ unknownDesc: 'Nobody has vouched yet. This is where every new account starts.',
+ flaggedTitle: 'Flagged',
+ flaggedDesc: 'Trusted people reported this account. It is a warning to look closer, not proof of anything.',
+ absenceTitle: 'No badge is not distrust',
+ absenceDesc: 'Most accounts show nothing at all. That means no one in your network has vouched for them yet, not that something is wrong. Never read a missing mark as a negative.',
+ sourceTitle: 'Who computes it',
+ sourceDesc: 'By default we use your own network. You can also choose a trust provider that publishes signed scores over Nostr (NIP-85), or turn the display off. Flagged always shows, because it is a safety signal.',
+ endorsementTitle: 'Presence is not endorsement',
+ endorsementDesc: 'A verified mark means someone vouched, not that the person is good. A flag means trusted people reported them, not that they are guilty. Check the details before you decide.',
+ povTitle: 'It depends on the point of view',
+ povDesc: 'A score is relative to who is looking. A rank from one provider or one person is not comparable to another, and we never present one as an objective fact.',
+ settingsCta: 'Manage in Settings',
+ },
};
export default { ...en, ...batch3En, ...batch4En, ...legacyEn };
diff --git a/src/i18n/es.ts b/src/i18n/es.ts
index bf84b56..17535d1 100644
--- a/src/i18n/es.ts
+++ b/src/i18n/es.ts
@@ -6143,6 +6143,10 @@ walletUi: {
top10Hint: 'Entra en el top 10 de patrocinadores',
},
trust: {
+ attributedNetwork: 'De personas de tu red',
+ attributedProviderHouse: 'Del proveedor de confianza de la comunidad',
+ attributedProviderCustom: 'Del proveedor que elegiste',
+ howItWorks: 'Cómo funciona la confianza',
flaggedNoticeTitle: 'Reportada por patinadores de confianza',
flaggedNoticeDesc: 'Ten cuidado. Personas de confianza de la red han reportado esta cuenta.',
flaggedReporterFollow: '{{count}} que sigues',
@@ -7382,6 +7386,28 @@ walletUi: {
badge: 'Pases',
sellerHint: 'El local de este vendedor emite pases de acceso',
},
+ trustUi: {
+ seoTitle: 'Cómo funciona la confianza',
+ seoDescription: 'Cómo muestra SkateSpots la confianza: tres estados, de dónde vienen las puntuaciones y por qué la ausencia no es desconfianza.',
+ title: 'Cómo funciona la confianza',
+ intro: 'Aquí la confianza es una señal, no un veredicto. Viene de a quién conoces o de un proveedor que elijas. No clasificamos a las personas a nivel global.',
+ statesTitle: 'Tres estados',
+ verifiedTitle: 'Verificado',
+ verifiedDesc: 'Alguien de tu red respalda esta cuenta: un amigo de un amigo, o el proveedor que elegiste.',
+ unknownTitle: 'Desconocido',
+ unknownDesc: 'Nadie la ha respaldado todavía. Aquí empieza toda cuenta nueva.',
+ flaggedTitle: 'Marcado',
+ flaggedDesc: 'Personas de confianza han reportado esta cuenta. Es una advertencia para mirar más de cerca, no una prueba de nada.',
+ absenceTitle: 'Sin distintivo no es desconfianza',
+ absenceDesc: 'La mayoría de las cuentas no muestran nada. Significa que nadie de tu red las ha respaldado todavía, no que haya algo malo. Nunca interpretes la ausencia como algo negativo.',
+ sourceTitle: 'Quién lo calcula',
+ sourceDesc: 'Por defecto usamos tu propia red. También puedes elegir un proveedor de confianza que publique puntuaciones firmadas en Nostr (NIP-85), o desactivar la visualización. Marcado siempre aparece, porque es una señal de seguridad.',
+ endorsementTitle: 'Aparecer no es un aval',
+ endorsementDesc: 'Un distintivo verificado significa que alguien respaldó, no que la persona sea buena. Un marcado significa que personas de confianza la reportaron, no que sea culpable. Revisa los detalles antes de decidir.',
+ povTitle: 'Depende del punto de vista',
+ povDesc: 'Una puntuación es relativa a quién mira. Una clasificación de un proveedor o una persona no es comparable con otra, y nunca la presentamos como un hecho objetivo.',
+ settingsCta: 'Gestionar en Ajustes',
+ },
};
export default { ...es, ...batch3Es, ...batch4Es, ...legacyEs };
diff --git a/src/pages/TrustPage.tsx b/src/pages/TrustPage.tsx
new file mode 100644
index 0000000..9155a90
--- /dev/null
+++ b/src/pages/TrustPage.tsx
@@ -0,0 +1,127 @@
+import { useSeoMeta } from '@unhead/react';
+import { Link } from 'react-router-dom';
+import { Shield, CheckCircle2, HelpCircle, Flag, Users, Scale, AlertTriangle } from 'lucide-react';
+
+import { Button } from '@/components/ui/button';
+import { useTranslation } from '@/contexts/language';
+
+function Section({
+ icon: Icon,
+ color,
+ title,
+ children,
+}: {
+ icon: React.ComponentType<{ className?: string; style?: React.CSSProperties }>;
+ color: string;
+ title: string;
+ children: React.ReactNode;
+}) {
+ return (
+
+
+ );
+}
+
+/**
+ * Public explainer for the trust buckets. The badge has to be legible and
+ * attributable, and absence has to be explained (it is the common case), or the
+ * whole feature reads as an opaque verdict.
+ */
+export default function TrustPage() {
+ const { t } = useTranslation();
+ useSeoMeta({
+ title: t('trustUi.seoTitle'),
+ description: t('trustUi.seoDescription'),
+ });
+
+ return (
+