Files
kashilo/js/components/pages/page-privacy.js

264 lines
13 KiB
JavaScript

import { getCurrentLanguage, i18n } from '../../i18n.js'
class PagePrivacy extends HTMLElement {
connectedCallback() {
this._unsubs = []
this.render()
this._unsubs.push(i18n.subscribe(() => this.render()))
}
disconnectedCallback() {
this._unsubs.forEach(fn => fn())
this._unsubs = []
}
getContent(lang) {
const content = {
de: /* html */`
<h1>Datenschutzerklärung</h1>
<p class="legal-meta">dgray.io — Anonymer Marktplatz | Stand: Februar 2026</p>
<h2>1. Verantwortlicher</h2>
<p>Verantwortlich für die Datenbearbeitung ist der Betreiber der Plattform dgray.io mit Sitz in der Schweiz.</p>
<h2>2. Grundsatz</h2>
<p>Die Plattform wurde nach dem Prinzip der Datensparsamkeit konzipiert.</p>
<h2>3. Welche Daten werden erhoben?</h2>
<p><strong>3.1 Daten, die wir NICHT erheben:</strong> Keine E-Mail-Adressen, keine Namen, keine Telefonnummern, keine Standortdaten der Nutzer, keine Zahlungsdaten.</p>
<p><strong>3.2 Registrierung:</strong> Ein kryptografischer Hash (SHA-256) der UUID wird als Benutzerkennung gespeichert. Die UUID selbst wird nicht gespeichert.</p>
<p><strong>3.3 Nutzung:</strong> Anzeigen (Titel, Beschreibung, Preis, Kategorie, Standort, Bilder), Nachrichten (Ende-zu-Ende verschlüsselt, nur Ciphertext gespeichert), Favoriten (lokal im Browser).</p>
<p><strong>3.4 Technische Daten:</strong> Server-Logs können temporär IP-Adressen und Zugriffszeiten enthalten.</p>
<h2>4. Cookies und lokale Speicherung</h2>
<p><strong>4.1</strong> Keine Cookies für Tracking oder Analyse.</p>
<p><strong>4.2</strong> localStorage: Spracheinstellung, Theme, Währung, Auth-Token, Favoriten, Kategorie-Cache.</p>
<p><strong>4.3</strong> Diese Daten verlassen den Browser nicht.</p>
<h2>5. Drittdienste</h2>
<p><strong>5.1 Directus (Backend):</strong> Selbst gehostet, keine Datenübertragung an Dritte.</p>
<p><strong>5.2 BTCPay Server (Zahlungen):</strong> Keine personenbezogenen Daten übertragen.</p>
<p><strong>5.3 CoinGecko API (Wechselkurse):</strong> Keine personenbezogenen Daten übertragen.</p>
<h2>6. Verschlüsselung</h2>
<p><strong>6.1</strong> Kommunikation ist Ende-zu-Ende verschlüsselt (NaCl/TweetNaCl).</p>
<p><strong>6.2</strong> Schlüssel werden im Browser generiert und gespeichert.</p>
<p><strong>6.3</strong> Server speichert nur verschlüsselten Ciphertext.</p>
<h2>7. Datenweitergabe</h2>
<p><strong>7.1</strong> Keine Weitergabe an Dritte zu Werbe- oder Marketingzwecken.</p>
<p><strong>7.2</strong> Herausgabe nur bei rechtlicher Verpflichtung durch Schweizer Behörden.</p>
<h2>8. Rechte der Nutzer</h2>
<p><strong>8.1</strong> Auskunft über gespeicherte Daten möglich.</p>
<p><strong>8.2</strong> Löschung durch Account-Löschung.</p>
<p><strong>8.3</strong> Datenportabilität auf Anfrage.</p>
<h2>9. Aufbewahrungsdauer</h2>
<p>Anzeigen: 30 Tage, Nachrichten: bis Löschung, Server-Logs: max. 7 Tage.</p>
<h2>10. Anwendbares Recht</h2>
<p>Schweizer Bundesgesetz über den Datenschutz (DSG).</p>
<h2>11. Änderungen</h2>
<p>Der Betreiber kann diese Datenschutzerklärung jederzeit anpassen.</p>
<p class="legal-meta">Letzte Aktualisierung: Februar 2026</p>
`,
en: /* html */`
<h1>Privacy Policy</h1>
<p class="legal-meta">dgray.io — Anonymous Marketplace | Last updated: February 2026</p>
<h2>1. Controller</h2>
<p>The controller for data processing is the operator of dgray.io, based in Switzerland.</p>
<h2>2. Principle</h2>
<p>The platform was designed following the principle of data minimization.</p>
<h2>3. What data is collected?</h2>
<p><strong>3.1 Data we do NOT collect:</strong> No email addresses, no names, no phone numbers, no user location data, no payment data.</p>
<p><strong>3.2 Registration:</strong> A cryptographic hash (SHA-256) of the UUID is stored as user identifier. The UUID itself is not stored.</p>
<p><strong>3.3 Usage:</strong> Listings (title, description, price, category, location, images), Messages (end-to-end encrypted, only ciphertext stored), Favorites (stored locally in browser).</p>
<p><strong>3.4 Technical data:</strong> Server logs may temporarily contain IP addresses and access times.</p>
<h2>4. Cookies and local storage</h2>
<p><strong>4.1</strong> No cookies for tracking or analytics.</p>
<p><strong>4.2</strong> localStorage: Language setting, theme, currency, auth token, favorites, category cache.</p>
<p><strong>4.3</strong> This data does not leave the browser.</p>
<h2>5. Third-party services</h2>
<p><strong>5.1 Directus (Backend):</strong> Self-hosted, no data transfer to third parties.</p>
<p><strong>5.2 BTCPay Server (Payments):</strong> No personal data transferred.</p>
<p><strong>5.3 CoinGecko API (Exchange rates):</strong> No personal data transferred.</p>
<h2>6. Encryption</h2>
<p><strong>6.1</strong> Communication is end-to-end encrypted (NaCl/TweetNaCl).</p>
<p><strong>6.2</strong> Keys are generated and stored in the browser.</p>
<p><strong>6.3</strong> Server stores only encrypted ciphertext.</p>
<h2>7. Data sharing</h2>
<p><strong>7.1</strong> No data shared with third parties for advertising or marketing purposes.</p>
<p><strong>7.2</strong> Disclosure only when legally required by Swiss authorities.</p>
<h2>8. User rights</h2>
<p><strong>8.1</strong> Right to information about stored data.</p>
<p><strong>8.2</strong> Deletion by deleting the account.</p>
<p><strong>8.3</strong> Data portability upon request.</p>
<h2>9. Retention period</h2>
<p>Listings: 30 days, Messages: until deletion, Server logs: max. 7 days.</p>
<h2>10. Governing law</h2>
<p>Swiss Federal Act on Data Protection (FADP).</p>
<h2>11. Changes</h2>
<p>The operator may update this privacy policy at any time.</p>
<p class="legal-meta">Last updated: February 2026</p>
`,
fr: /* html */`
<h1>Politique de confidentialité</h1>
<p class="legal-meta">dgray.io — Marché anonyme | Mise à jour : février 2026</p>
<h2>1. Responsable</h2>
<p>Le responsable du traitement des données est l'exploitant de dgray.io, domicilié en Suisse.</p>
<h2>2. Principe</h2>
<p>La plateforme a été conçue selon le principe de minimisation des données.</p>
<h2>3. Quelles données sont collectées ?</h2>
<p><strong>3.1 Données que nous ne collectons PAS :</strong> Aucune adresse e-mail, aucun nom, aucun numéro de téléphone, aucune donnée de localisation, aucune donnée de paiement.</p>
<p><strong>3.2 Inscription :</strong> Un hash cryptographique (SHA-256) de l'UUID est stocké comme identifiant. L'UUID lui-même n'est pas stocké.</p>
<p><strong>3.3 Utilisation :</strong> Annonces (titre, description, prix, catégorie, lieu, images), Messages (chiffrés de bout en bout, seul le texte chiffré est stocké), Favoris (stockés localement dans le navigateur).</p>
<p><strong>3.4 Données techniques :</strong> Les journaux serveur peuvent temporairement contenir des adresses IP et des heures d'accès.</p>
<h2>4. Cookies et stockage local</h2>
<p><strong>4.1</strong> Aucun cookie de suivi ou d'analyse.</p>
<p><strong>4.2</strong> localStorage : Langue, thème, devise, jeton d'authentification, favoris, cache des catégories.</p>
<p><strong>4.3</strong> Ces données ne quittent pas le navigateur.</p>
<h2>5. Services tiers</h2>
<p><strong>5.1 Directus (Backend) :</strong> Auto-hébergé, aucun transfert de données à des tiers.</p>
<p><strong>5.2 BTCPay Server (Paiements) :</strong> Aucune donnée personnelle transférée.</p>
<p><strong>5.3 CoinGecko API (Taux de change) :</strong> Aucune donnée personnelle transférée.</p>
<h2>6. Chiffrement</h2>
<p><strong>6.1</strong> La communication est chiffrée de bout en bout (NaCl/TweetNaCl).</p>
<p><strong>6.2</strong> Les clés sont générées et stockées dans le navigateur.</p>
<p><strong>6.3</strong> Le serveur ne stocke que du texte chiffré.</p>
<h2>7. Partage de données</h2>
<p><strong>7.1</strong> Aucune donnée partagée avec des tiers à des fins publicitaires ou marketing.</p>
<p><strong>7.2</strong> Divulgation uniquement sur obligation légale des autorités suisses.</p>
<h2>8. Droits des utilisateurs</h2>
<p><strong>8.1</strong> Droit d'accès aux données stockées.</p>
<p><strong>8.2</strong> Suppression par suppression du compte.</p>
<p><strong>8.3</strong> Portabilité des données sur demande.</p>
<h2>9. Durée de conservation</h2>
<p>Annonces : 30 jours, Messages : jusqu'à suppression, Journaux serveur : max. 7 jours.</p>
<h2>10. Droit applicable</h2>
<p>Loi fédérale suisse sur la protection des données (LPD).</p>
<h2>11. Modifications</h2>
<p>L'exploitant peut adapter cette politique de confidentialité à tout moment.</p>
<p class="legal-meta">Dernière mise à jour : février 2026</p>
`
}
return content[lang] || content.de
}
render() {
const lang = getCurrentLanguage()
const backLabel = { de: 'Zurück zur Startseite', en: 'Back to Home', fr: 'Retour à l\'accueil' }
this.innerHTML = /* html */`
<div class="legal-page">
<a href="#/" class="back-link">← ${backLabel[lang] || backLabel.en}</a>
<div class="legal-content">
${this.getContent(lang)}
</div>
</div>
`
}
}
customElements.define('page-privacy', PagePrivacy)
const style = document.createElement('style')
style.textContent = /* css */`
page-privacy .legal-page {
padding: var(--space-lg) 0;
max-width: 800px;
margin: 0 auto;
}
page-privacy .back-link {
display: inline-block;
color: var(--color-text-muted);
text-decoration: none;
font-size: var(--font-size-sm);
margin-bottom: var(--space-lg);
transition: color 0.2s;
}
page-privacy .back-link:hover {
color: var(--color-text);
}
page-privacy .legal-content h1 {
font-size: var(--font-size-2xl);
margin: 0 0 var(--space-xs);
}
page-privacy .legal-content h2 {
font-size: var(--font-size-lg);
margin: var(--space-xl) 0 var(--space-sm);
padding-top: var(--space-md);
border-top: 1px solid var(--color-border);
}
page-privacy .legal-content h2:first-of-type {
border-top: none;
}
page-privacy .legal-content p {
line-height: 1.7;
margin: 0 0 var(--space-sm);
color: var(--color-text-secondary);
}
page-privacy .legal-content ul {
margin: 0 0 var(--space-sm);
padding-left: var(--space-lg);
color: var(--color-text-secondary);
}
page-privacy .legal-content ul li {
line-height: 1.7;
margin-bottom: var(--space-xs);
}
page-privacy .legal-meta {
color: var(--color-text-muted);
font-size: var(--font-size-sm);
}
@media (max-width: 768px) {
page-privacy .legal-page {
padding: var(--space-md) 0;
}
page-privacy .legal-content h1 {
font-size: var(--font-size-xl);
}
page-privacy .legal-content h2 {
font-size: var(--font-size-base);
}
}
`
document.head.appendChild(style)