feat: register privacy/terms routes and unify legal page layouts
This commit is contained in:
@@ -13,6 +13,8 @@ import './pages/page-messages.js'
|
||||
import './pages/page-settings.js'
|
||||
import './pages/page-notifications.js'
|
||||
import './pages/page-not-found.js'
|
||||
import './pages/page-privacy.js'
|
||||
import './pages/page-terms.js'
|
||||
|
||||
class AppShell extends HTMLElement {
|
||||
constructor() {
|
||||
@@ -55,6 +57,8 @@ class AppShell extends HTMLElement {
|
||||
.register('/messages', 'page-messages')
|
||||
.register('/settings', 'page-settings')
|
||||
.register('/notifications', 'page-notifications')
|
||||
.register('/privacy', 'page-privacy')
|
||||
.register('/terms', 'page-terms')
|
||||
|
||||
router.handleRouteChange()
|
||||
}
|
||||
|
||||
261
js/components/pages/page-privacy.js
Normal file
261
js/components/pages/page-privacy.js
Normal file
@@ -0,0 +1,261 @@
|
||||
import { getCurrentLanguage, i18n } from '../../i18n.js'
|
||||
|
||||
class PagePrivacy extends HTMLElement {
|
||||
connectedCallback() {
|
||||
this.render()
|
||||
this.unsubscribe = i18n.subscribe(() => this.render())
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
if (this.unsubscribe) this.unsubscribe()
|
||||
}
|
||||
|
||||
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)
|
||||
332
js/components/pages/page-terms.js
Normal file
332
js/components/pages/page-terms.js
Normal file
@@ -0,0 +1,332 @@
|
||||
import { getCurrentLanguage, i18n } from '../../i18n.js'
|
||||
|
||||
class PageTerms extends HTMLElement {
|
||||
connectedCallback() {
|
||||
this.render()
|
||||
this.unsubscribe = i18n.subscribe(() => this.render())
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
if (this.unsubscribe) this.unsubscribe()
|
||||
}
|
||||
|
||||
render() {
|
||||
const lang = getCurrentLanguage()
|
||||
this.innerHTML = /* html */`
|
||||
<div class="legal-page">
|
||||
<a href="#/" class="back-link">← ${lang === 'de' ? 'Zurück zur Startseite' : lang === 'fr' ? 'Retour à l\'accueil' : 'Back to Home'}</a>
|
||||
<div class="legal-content">
|
||||
${this.getContent(lang)}
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
getContent(lang) {
|
||||
const content = {
|
||||
de: this.getContentDE,
|
||||
en: this.getContentEN,
|
||||
fr: this.getContentFR
|
||||
}
|
||||
return (content[lang] || content.en).call(this)
|
||||
}
|
||||
|
||||
getContentDE() {
|
||||
return /* html */`
|
||||
<h1>Allgemeine Geschäftsbedingungen (AGB)</h1>
|
||||
<p class="legal-meta">dgray.io — Anonymer Marktplatz | Stand: Februar 2026</p>
|
||||
|
||||
<h2>1. Geltungsbereich</h2>
|
||||
<p>1.1 Diese AGB regeln die Nutzung der Plattform dgray.io.</p>
|
||||
<p>1.2 Die Plattform wird betrieben von einer natürlichen Person mit Sitz in der Schweiz.</p>
|
||||
<p>1.3 Mit der Nutzung der Plattform erklärt sich die nutzende Person mit diesen AGB einverstanden.</p>
|
||||
|
||||
<h2>2. Leistungen der Plattform</h2>
|
||||
<p>2.1 Die Plattform stellt einen Online-Marktplatz zur Verfügung, auf dem Nutzer/innen Anzeigen für Waren und Dienstleistungen veröffentlichen und untereinander kommunizieren können.</p>
|
||||
<p>2.2 Die Plattform ist lediglich Vermittlerin und wird nicht Vertragspartei der zwischen den Nutzer/innen geschlossenen Verträge.</p>
|
||||
<p>2.3 Der Betreiber übernimmt keine Gewähr für die Richtigkeit, Vollständigkeit oder Qualität der veröffentlichten Anzeigen.</p>
|
||||
|
||||
<h2>3. Registrierung und Accounts</h2>
|
||||
<p>3.1 Die Nutzung erfordert keine Angabe persönlicher Daten. Die Registrierung erfolgt über eine anonyme UUID.</p>
|
||||
<p>3.2 Die UUID ist der einzige Zugang zum Account. Es besteht keine Möglichkeit, eine verlorene UUID wiederherzustellen.</p>
|
||||
<p>3.3 Pro Person darf nur ein aktiver Account geführt werden.</p>
|
||||
|
||||
<h2>4. Anzeigen</h2>
|
||||
<p>4.1 Nutzer/innen können Anzeigen für legale Waren und Dienstleistungen veröffentlichen.</p>
|
||||
<p>4.2 Der Betreiber behält sich vor, Anzeigen ohne Angabe von Gründen zu entfernen.</p>
|
||||
<p>4.3 Anzeigen sind zeitlich begrenzt (30 Tage) und werden danach automatisch archiviert.</p>
|
||||
|
||||
<h2>5. Gebühren und Zahlungen</h2>
|
||||
<p>5.1 Die Veröffentlichung einer Anzeige ist gebührenpflichtig. Die aktuelle Gebühr wird vor der Veröffentlichung angezeigt.</p>
|
||||
<p>5.2 Die Bezahlung erfolgt ausschliesslich in Monero (XMR).</p>
|
||||
<p>5.3 Bezahlte Gebühren werden nicht erstattet.</p>
|
||||
<p>5.4 Transaktionen zwischen Nutzer/innen erfolgen direkt und ohne Beteiligung der Plattform.</p>
|
||||
|
||||
<h2>6. Kommunikation</h2>
|
||||
<p>6.1 Die Plattform stellt einen Ende-zu-Ende verschlüsselten Chat zur Verfügung. Der Betreiber hat keinen Zugang zu den Nachrichteninhalten.</p>
|
||||
<p>6.2 Die Nutzer/innen sind für den Inhalt ihrer Nachrichten selbst verantwortlich.</p>
|
||||
|
||||
<h2>7. Haftung</h2>
|
||||
<p>7.1 Der Betreiber haftet nicht für:</p>
|
||||
<ul>
|
||||
<li>Schäden aus Transaktionen</li>
|
||||
<li>Verlust von Kryptowährungen</li>
|
||||
<li>Verlust des Zugangs durch verlorene UUID</li>
|
||||
<li>Verfügbarkeit der Plattform</li>
|
||||
<li>Nutzergenerierte Inhalte</li>
|
||||
</ul>
|
||||
<p>7.2 Die Haftung ist auf die bezahlten Gebühren beschränkt.</p>
|
||||
<p>7.3 Der Betreiber haftet nicht für indirekte Schäden oder entgangenen Gewinn.</p>
|
||||
|
||||
<h2>8. Datenschutz</h2>
|
||||
<p>8.1 Die Plattform erhebt so wenig personenbezogene Daten wie technisch möglich.</p>
|
||||
<p>8.2 Keine E-Mail-Adressen, Namen oder Standortdaten werden gespeichert.</p>
|
||||
<p>8.3 Nachrichten sind Ende-zu-Ende verschlüsselt.</p>
|
||||
<p>8.4 Es werden keine Analyse- oder Tracking-Dienste eingesetzt.</p>
|
||||
<p>8.5 Weitere Details in der Datenschutzerklärung.</p>
|
||||
|
||||
<h2>9. Sperrung und Kündigung</h2>
|
||||
<p>9.1 Die Nutzer/in kann ihren Account jederzeit durch Löschen der UUID beenden.</p>
|
||||
<p>9.2 Der Betreiber kann Accounts bei Verstössen sperren.</p>
|
||||
<p>9.3 Kein Anspruch auf Rückerstattung bei Sperrung.</p>
|
||||
|
||||
<h2>10. Änderungen der AGB</h2>
|
||||
<p>10.1 Der Betreiber kann diese AGB jederzeit ändern.</p>
|
||||
<p>10.2 Durch weitere Nutzung akzeptiert die Nutzer/in die neuen AGB.</p>
|
||||
|
||||
<h2>11. Anwendbares Recht und Gerichtsstand</h2>
|
||||
<p>11.1 Es gilt Schweizer Recht.</p>
|
||||
<p>11.2 Gerichtsstand ist der Sitz des Betreibers in der Schweiz.</p>
|
||||
|
||||
<h2>12. Salvatorische Klausel</h2>
|
||||
<p>Sollten einzelne Bestimmungen unwirksam sein, bleibt die Wirksamkeit der übrigen Bestimmungen unberührt.</p>
|
||||
|
||||
<p class="legal-meta">Letzte Aktualisierung: Februar 2026</p>
|
||||
`
|
||||
}
|
||||
|
||||
getContentEN() {
|
||||
return /* html */`
|
||||
<h1>Terms of Service</h1>
|
||||
<p class="legal-meta">dgray.io — Anonymous Marketplace | Last updated: February 2026</p>
|
||||
|
||||
<h2>1. Scope</h2>
|
||||
<p>1.1 These Terms of Service govern the use of the platform dgray.io.</p>
|
||||
<p>1.2 The platform is operated by a natural person based in Switzerland.</p>
|
||||
<p>1.3 By using the platform, the user agrees to these terms.</p>
|
||||
|
||||
<h2>2. Services</h2>
|
||||
<p>2.1 The platform provides an online marketplace where users can publish listings for goods and services and communicate with each other.</p>
|
||||
<p>2.2 The platform acts solely as an intermediary and does not become a party to contracts between users.</p>
|
||||
<p>2.3 The operator does not guarantee the accuracy, completeness, or quality of published listings.</p>
|
||||
|
||||
<h2>3. Registration and Accounts</h2>
|
||||
<p>3.1 No personal data is required. Registration is done via an anonymous UUID.</p>
|
||||
<p>3.2 The UUID is the sole access to the account. Lost UUIDs cannot be recovered.</p>
|
||||
<p>3.3 Only one active account per person is permitted.</p>
|
||||
|
||||
<h2>4. Listings</h2>
|
||||
<p>4.1 Users may publish listings for legal goods and services.</p>
|
||||
<p>4.2 The operator reserves the right to remove listings without stating reasons.</p>
|
||||
<p>4.3 Listings are limited to 30 days and are automatically archived thereafter.</p>
|
||||
|
||||
<h2>5. Fees and Payments</h2>
|
||||
<p>5.1 Publishing a listing requires a fee. The current fee is displayed before publication.</p>
|
||||
<p>5.2 Payment is made exclusively in Monero (XMR).</p>
|
||||
<p>5.3 Paid fees are non-refundable.</p>
|
||||
<p>5.4 Transactions between users are direct and without platform involvement.</p>
|
||||
|
||||
<h2>6. Communication</h2>
|
||||
<p>6.1 The platform provides end-to-end encrypted chat. The operator has no access to message content.</p>
|
||||
<p>6.2 Users are responsible for the content of their messages.</p>
|
||||
|
||||
<h2>7. Liability</h2>
|
||||
<p>7.1 The operator is not liable for:</p>
|
||||
<ul>
|
||||
<li>Damages from transactions</li>
|
||||
<li>Loss of cryptocurrency</li>
|
||||
<li>Loss of access due to lost UUID</li>
|
||||
<li>Platform availability</li>
|
||||
<li>User-generated content</li>
|
||||
</ul>
|
||||
<p>7.2 Liability is limited to fees paid.</p>
|
||||
<p>7.3 The operator is not liable for indirect damages or lost profits.</p>
|
||||
|
||||
<h2>8. Data Protection</h2>
|
||||
<p>8.1 The platform collects as little personal data as technically possible.</p>
|
||||
<p>8.2 No email addresses, names, or location data are stored.</p>
|
||||
<p>8.3 Messages are end-to-end encrypted.</p>
|
||||
<p>8.4 No analytics or tracking services are used.</p>
|
||||
<p>8.5 See the Privacy Policy for details.</p>
|
||||
|
||||
<h2>9. Suspension and Termination</h2>
|
||||
<p>9.1 Users can terminate their account at any time by deleting their UUID.</p>
|
||||
<p>9.2 The operator may suspend accounts for violations.</p>
|
||||
<p>9.3 No refund claim exists in case of suspension.</p>
|
||||
|
||||
<h2>10. Changes to Terms</h2>
|
||||
<p>10.1 The operator may change these terms at any time.</p>
|
||||
<p>10.2 Continued use constitutes acceptance of the updated terms.</p>
|
||||
|
||||
<h2>11. Governing Law and Jurisdiction</h2>
|
||||
<p>11.1 Swiss law applies.</p>
|
||||
<p>11.2 Place of jurisdiction is the operator's domicile in Switzerland.</p>
|
||||
|
||||
<h2>12. Severability</h2>
|
||||
<p>If any provision is found invalid, the remaining provisions remain in effect.</p>
|
||||
|
||||
<p class="legal-meta">Last updated: February 2026</p>
|
||||
`
|
||||
}
|
||||
|
||||
getContentFR() {
|
||||
return /* html */`
|
||||
<h1>Conditions Générales d'Utilisation (CGU)</h1>
|
||||
<p class="legal-meta">dgray.io — Marché anonyme | Mise à jour : février 2026</p>
|
||||
|
||||
<h2>1. Champ d'application</h2>
|
||||
<p>1.1 Les présentes CGU régissent l'utilisation de la plateforme dgray.io.</p>
|
||||
<p>1.2 La plateforme est exploitée par une personne physique domiciliée en Suisse.</p>
|
||||
<p>1.3 En utilisant la plateforme, l'utilisateur accepte les présentes CGU.</p>
|
||||
|
||||
<h2>2. Services</h2>
|
||||
<p>2.1 La plateforme met à disposition un marché en ligne où les utilisateurs peuvent publier des annonces et communiquer entre eux.</p>
|
||||
<p>2.2 La plateforme agit uniquement en tant qu'intermédiaire et ne devient pas partie aux contrats entre utilisateurs.</p>
|
||||
<p>2.3 L'exploitant ne garantit pas l'exactitude, l'exhaustivité ou la qualité des annonces publiées.</p>
|
||||
|
||||
<h2>3. Inscription et comptes</h2>
|
||||
<p>3.1 Aucune donnée personnelle n'est requise. L'inscription se fait via un UUID anonyme.</p>
|
||||
<p>3.2 L'UUID est le seul accès au compte. Les UUID perdus ne peuvent pas être récupérés.</p>
|
||||
<p>3.3 Un seul compte actif par personne est autorisé.</p>
|
||||
|
||||
<h2>4. Annonces</h2>
|
||||
<p>4.1 Les utilisateurs peuvent publier des annonces pour des biens et services légaux.</p>
|
||||
<p>4.2 L'exploitant se réserve le droit de supprimer des annonces sans justification.</p>
|
||||
<p>4.3 Les annonces sont limitées à 30 jours et sont automatiquement archivées.</p>
|
||||
|
||||
<h2>5. Frais et paiements</h2>
|
||||
<p>5.1 La publication d'une annonce est payante. Les frais sont affichés avant la publication.</p>
|
||||
<p>5.2 Le paiement s'effectue exclusivement en Monero (XMR).</p>
|
||||
<p>5.3 Les frais payés ne sont pas remboursables.</p>
|
||||
<p>5.4 Les transactions entre utilisateurs sont directes et sans intervention de la plateforme.</p>
|
||||
|
||||
<h2>6. Communication</h2>
|
||||
<p>6.1 La plateforme fournit un chat chiffré de bout en bout. L'exploitant n'a pas accès au contenu des messages.</p>
|
||||
<p>6.2 Les utilisateurs sont responsables du contenu de leurs messages.</p>
|
||||
|
||||
<h2>7. Responsabilité</h2>
|
||||
<p>7.1 L'exploitant n'est pas responsable :</p>
|
||||
<ul>
|
||||
<li>Des dommages liés aux transactions</li>
|
||||
<li>De la perte de cryptomonnaies</li>
|
||||
<li>De la perte d'accès due à un UUID perdu</li>
|
||||
<li>De la disponibilité de la plateforme</li>
|
||||
<li>Du contenu généré par les utilisateurs</li>
|
||||
</ul>
|
||||
<p>7.2 La responsabilité est limitée aux frais payés.</p>
|
||||
<p>7.3 L'exploitant n'est pas responsable des dommages indirects ou des pertes de bénéfices.</p>
|
||||
|
||||
<h2>8. Protection des données</h2>
|
||||
<p>8.1 La plateforme collecte le minimum de données personnelles techniquement nécessaire.</p>
|
||||
<p>8.2 Aucune adresse e-mail, nom ou donnée de localisation n'est stocké.</p>
|
||||
<p>8.3 Les messages sont chiffrés de bout en bout.</p>
|
||||
<p>8.4 Aucun service d'analyse ou de suivi n'est utilisé.</p>
|
||||
<p>8.5 Voir la politique de confidentialité pour plus de détails.</p>
|
||||
|
||||
<h2>9. Suspension et résiliation</h2>
|
||||
<p>9.1 Les utilisateurs peuvent résilier leur compte à tout moment en supprimant leur UUID.</p>
|
||||
<p>9.2 L'exploitant peut suspendre les comptes en cas de violation.</p>
|
||||
<p>9.3 Aucun remboursement en cas de suspension.</p>
|
||||
|
||||
<h2>10. Modifications des CGU</h2>
|
||||
<p>10.1 L'exploitant peut modifier les présentes CGU à tout moment.</p>
|
||||
<p>10.2 L'utilisation continue vaut acceptation des CGU modifiées.</p>
|
||||
|
||||
<h2>11. Droit applicable et for juridique</h2>
|
||||
<p>11.1 Le droit suisse est applicable.</p>
|
||||
<p>11.2 Le for juridique est le domicile de l'exploitant en Suisse.</p>
|
||||
|
||||
<h2>12. Clause de sauvegarde</h2>
|
||||
<p>Si une disposition est jugée invalide, les autres dispositions restent en vigueur.</p>
|
||||
|
||||
<p class="legal-meta">Dernière mise à jour : février 2026</p>
|
||||
`
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define('page-terms', PageTerms)
|
||||
|
||||
const style = document.createElement('style')
|
||||
style.textContent = /* css */`
|
||||
page-terms .legal-page {
|
||||
padding: var(--space-lg) 0;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
page-terms .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-terms .back-link:hover {
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
page-terms .legal-content h1 {
|
||||
font-size: var(--font-size-2xl);
|
||||
margin: 0 0 var(--space-xs);
|
||||
}
|
||||
|
||||
page-terms .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-terms .legal-content h2:first-of-type {
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
page-terms .legal-content p {
|
||||
line-height: 1.7;
|
||||
margin: 0 0 var(--space-sm);
|
||||
color: var(--color-text-secondary);
|
||||
}
|
||||
|
||||
page-terms .legal-content ul {
|
||||
margin: 0 0 var(--space-sm);
|
||||
padding-left: var(--space-lg);
|
||||
color: var(--color-text-secondary);
|
||||
}
|
||||
|
||||
page-terms .legal-content ul li {
|
||||
line-height: 1.7;
|
||||
margin-bottom: var(--space-xs);
|
||||
}
|
||||
|
||||
page-terms .legal-meta {
|
||||
color: var(--color-text-muted);
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
page-terms .legal-page {
|
||||
padding: var(--space-md) 0;
|
||||
}
|
||||
|
||||
page-terms .legal-content h1 {
|
||||
font-size: var(--font-size-xl);
|
||||
}
|
||||
|
||||
page-terms .legal-content h2 {
|
||||
font-size: var(--font-size-base);
|
||||
}
|
||||
}
|
||||
`
|
||||
document.head.appendChild(style)
|
||||
Reference in New Issue
Block a user