refactor: rename project from dgray.io to kashilo.com

This commit is contained in:
2026-02-10 18:43:49 +01:00
parent 4e77ce92f3
commit 9069404942
60 changed files with 260 additions and 260 deletions

View File

@@ -26,7 +26,7 @@ class AppFooter extends HTMLElement {
}
getCurrency() {
return localStorage.getItem('dgray_currency') || 'USD'
return localStorage.getItem('kashilo_currency') || 'USD'
}
async loadXmrRates() {
@@ -54,7 +54,7 @@ class AppFooter extends HTMLElement {
this.innerHTML = /* html */`
<div class="footer-inner container">
<p class="footer-copyright">
&copy; ${year} dgray.io - <span data-i18n="footer.rights">${t('footer.rights')}</span>
&copy; ${year} kashilo.com - <span data-i18n="footer.rights">${t('footer.rights')}</span>
<span class="footer-swiss">🇨🇭 Made in Switzerland</span>
</p>
<span class="xmr-rate" title="CoinGecko">1 XMR ≈ ...</span>

View File

@@ -113,9 +113,9 @@ class AppHeader extends HTMLElement {
render() {
this.innerHTML = /* html */`
<div class="header-inner container">
<a href="#/" class="logo" aria-label="dgray.io ${t('common.home')}">
<img src="assets/logo-light.svg" alt="dgray.io" class="logo-img logo-light" width="100" height="28">
<img src="assets/logo-dark.svg" alt="dgray.io" class="logo-img logo-dark" width="100" height="28">
<a href="#/" class="logo" aria-label="kashilo.com ${t('common.home')}">
<img src="assets/logo-light.svg" alt="kashilo.com" class="logo-img logo-light" width="100" height="28">
<img src="assets/logo-dark.svg" alt="kashilo.com" class="logo-img logo-dark" width="100" height="28">
</a>
<div class="header-actions">

View File

@@ -319,14 +319,14 @@ class AuthModal extends HTMLElement {
}
downloadBackup() {
const content = `dgray.io Account Backup
const content = `kashilo.com Account Backup
========================
Your UUID (keep this secret!):
${this.generatedUuid}
Login URL:
https://dgray.io/#/login
https://kashilo.com/#/login
Created: ${new Date().toISOString()}
@@ -337,7 +337,7 @@ WARNING: If you lose this UUID, you cannot recover your account!
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = `dgray-backup-${this.generatedUuid.slice(0, 8)}.txt`
a.download = `kashilo-backup-${this.generatedUuid.slice(0, 8)}.txt`
a.click()
URL.revokeObjectURL(url)
}

View File

@@ -144,7 +144,7 @@ class LocationMap extends HTMLElement {
})
const response = await fetch(`${NOMINATIM_URL}?${params}`, {
headers: { 'User-Agent': 'dgray.io/1.0' }
headers: { 'User-Agent': 'kashilo.com/1.0' }
})
const results = await response.json()

View File

@@ -183,7 +183,7 @@ class LocationPicker extends HTMLElement {
const response = await fetch(`${NOMINATIM_URL}?${params}`, {
headers: {
'User-Agent': 'dgray.io/1.0'
'User-Agent': 'kashilo.com/1.0'
}
})

View File

@@ -15,8 +15,8 @@ class PageAbout extends HTMLElement {
getContent(lang) {
const content = {
de: /* html */`
<h1>Über dgray.io</h1>
<p>dgray.io ist eine Privacy-First Kleinanzeigen-Plattform. Nutzer können Anzeigen erstellen und über Ende-zu-Ende verschlüsselte Nachrichten kommunizieren — ohne persönliche Daten preiszugeben.</p>
<h1>Über kashilo.com</h1>
<p>kashilo.com ist eine Privacy-First Kleinanzeigen-Plattform. Nutzer können Anzeigen erstellen und über Ende-zu-Ende verschlüsselte Nachrichten kommunizieren — ohne persönliche Daten preiszugeben.</p>
<p>Die Bezahlung erfolgt ausschliesslich über Monero (XMR). Kein KYC, keine E-Mail, kein Tracking.</p>
<h2>Prinzipien</h2>
@@ -29,8 +29,8 @@ class PageAbout extends HTMLElement {
</ul>
`,
en: /* html */`
<h1>About dgray.io</h1>
<p>dgray.io is a privacy-first classifieds platform. Users can create listings and communicate via end-to-end encrypted messages — without revealing any personal data.</p>
<h1>About kashilo.com</h1>
<p>kashilo.com is a privacy-first classifieds platform. Users can create listings and communicate via end-to-end encrypted messages — without revealing any personal data.</p>
<p>Payments are made exclusively in Monero (XMR). No KYC, no email, no tracking.</p>
<h2>Principles</h2>
@@ -43,8 +43,8 @@ class PageAbout extends HTMLElement {
</ul>
`,
fr: /* html */`
<h1>À propos de dgray.io</h1>
<p>dgray.io est une plateforme de petites annonces axée sur la confidentialité. Les utilisateurs peuvent créer des annonces et communiquer via des messages chiffrés de bout en bout — sans révéler de données personnelles.</p>
<h1>À propos de kashilo.com</h1>
<p>kashilo.com est une plateforme de petites annonces axée sur la confidentialité. Les utilisateurs peuvent créer des annonces et communiquer via des messages chiffrés de bout en bout — sans révéler de données personnelles.</p>
<p>Les paiements s'effectuent exclusivement en Monero (XMR). Pas de KYC, pas d'e-mail, pas de tracking.</p>
<h2>Principes</h2>
@@ -57,8 +57,8 @@ class PageAbout extends HTMLElement {
</ul>
`,
it: /* html */`
<h1>Informazioni su dgray.io</h1>
<p>dgray.io è una piattaforma di annunci incentrata sulla privacy. Gli utenti possono creare annunci e comunicare tramite messaggi crittografati end-to-end — senza rivelare dati personali.</p>
<h1>Informazioni su kashilo.com</h1>
<p>kashilo.com è una piattaforma di annunci incentrata sulla privacy. Gli utenti possono creare annunci e comunicare tramite messaggi crittografati end-to-end — senza rivelare dati personali.</p>
<p>I pagamenti avvengono esclusivamente in Monero (XMR). Nessun KYC, nessuna email, nessun tracking.</p>
<h2>Principi</h2>
@@ -71,8 +71,8 @@ class PageAbout extends HTMLElement {
</ul>
`,
es: /* html */`
<h1>Acerca de dgray.io</h1>
<p>dgray.io es una plataforma de clasificados centrada en la privacidad. Los usuarios pueden crear anuncios y comunicarse mediante mensajes cifrados de extremo a extremo — sin revelar datos personales.</p>
<h1>Acerca de kashilo.com</h1>
<p>kashilo.com es una plataforma de clasificados centrada en la privacidad. Los usuarios pueden crear anuncios y comunicarse mediante mensajes cifrados de extremo a extremo — sin revelar datos personales.</p>
<p>Los pagos se realizan exclusivamente en Monero (XMR). Sin KYC, sin email, sin rastreo.</p>
<h2>Principios</h2>
@@ -85,8 +85,8 @@ class PageAbout extends HTMLElement {
</ul>
`,
pt: /* html */`
<h1>Sobre o dgray.io</h1>
<p>dgray.io é uma plataforma de classificados focada em privacidade. Os usuários podem criar anúncios e se comunicar por mensagens criptografadas de ponta a ponta — sem revelar dados pessoais.</p>
<h1>Sobre o kashilo.com</h1>
<p>kashilo.com é uma plataforma de classificados focada em privacidade. Os usuários podem criar anúncios e se comunicar por mensagens criptografadas de ponta a ponta — sem revelar dados pessoais.</p>
<p>Os pagamentos são feitos exclusivamente em Monero (XMR). Sem KYC, sem email, sem rastreamento.</p>
<h2>Princípios</h2>
@@ -99,8 +99,8 @@ class PageAbout extends HTMLElement {
</ul>
`,
ru: /* html */`
<h1>О dgray.io</h1>
<p>dgray.io — это платформа объявлений с приоритетом конфиденциальности. Пользователи могут создавать объявления и общаться через сквозное шифрование — без раскрытия личных данных.</p>
<h1>О kashilo.com</h1>
<p>kashilo.com — это платформа объявлений с приоритетом конфиденциальности. Пользователи могут создавать объявления и общаться через сквозное шифрование — без раскрытия личных данных.</p>
<p>Оплата осуществляется исключительно в Monero (XMR). Без KYC, без email, без отслеживания.</p>
<h2>Принципы</h2>

View File

@@ -17,17 +17,17 @@ class PageContact extends HTMLElement {
de: /* html */`
<h1>Kontakt</h1>
<p>Bei Fragen oder Problemen erreichst du uns unter:</p>
<p><strong>E-Mail:</strong> <a href="mailto:hello@dgray.io">hello@dgray.io</a></p>
<p><strong>E-Mail:</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`,
en: /* html */`
<h1>Contact</h1>
<p>For questions or issues, reach us at:</p>
<p><strong>Email:</strong> <a href="mailto:hello@dgray.io">hello@dgray.io</a></p>
<p><strong>Email:</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`,
fr: /* html */`
<h1>Contact</h1>
<p>Pour toute question ou problème, contactez-nous à :</p>
<p><strong>E-mail :</strong> <a href="mailto:hello@dgray.io">hello@dgray.io</a></p>
<p><strong>E-mail :</strong> <a href="mailto:hello@kashilo.com">hello@kashilo.com</a></p>
`
}
return content[lang] || content.de

View File

@@ -12,7 +12,7 @@ import '../location-picker.js'
import '../pow-captcha.js'
import '../image-cropper.js'
const STORAGE_KEY = 'dgray_create_draft'
const STORAGE_KEY = 'kashilo_create_draft'
class PageCreate extends HTMLElement {
constructor() {

View File

@@ -17,7 +17,7 @@ class PageImprint extends HTMLElement {
de: /* html */`
<h1>Impressum</h1>
<div class="legal-draft-notice">ENTWURF — Bitte durch eine Fachperson prüfen lassen.</div>
<p class="legal-meta">dgray.io — Anonymer Marktplatz | Stand: Februar 2026</p>
<p class="legal-meta">kashilo.com — Anonymer Marktplatz | Stand: Februar 2026</p>
<h2>1. Angaben gemäss Schweizer Recht</h2>
<p>Verantwortlich für diese Website:</p>
@@ -49,7 +49,7 @@ class PageImprint extends HTMLElement {
en: /* html */`
<h1>Legal Notice</h1>
<div class="legal-draft-notice">DRAFT — Please have this reviewed by a legal professional.</div>
<p class="legal-meta">dgray.io — Anonymous Marketplace | Last updated: February 2026</p>
<p class="legal-meta">kashilo.com — Anonymous Marketplace | Last updated: February 2026</p>
<h2>1. Information according to Swiss law</h2>
<p>Responsible for this website:</p>
@@ -81,7 +81,7 @@ class PageImprint extends HTMLElement {
fr: /* html */`
<h1>Mentions légales</h1>
<div class="legal-draft-notice">ÉBAUCHE — Veuillez faire vérifier ce document par un professionnel du droit.</div>
<p class="legal-meta">dgray.io — Marché anonyme | Mise à jour : février 2026</p>
<p class="legal-meta">kashilo.com — Marché anonyme | Mise à jour : février 2026</p>
<h2>1. Informations selon le droit suisse</h2>
<p>Responsable de ce site web :</p>
@@ -113,7 +113,7 @@ class PageImprint extends HTMLElement {
it: /* html */`
<h1>Avviso legale</h1>
<div class="legal-draft-notice">BOZZA — Si prega di far verificare questo documento da un professionista legale.</div>
<p class="legal-meta">dgray.io — Mercato anonimo | Aggiornamento: febbraio 2026</p>
<p class="legal-meta">kashilo.com — Mercato anonimo | Aggiornamento: febbraio 2026</p>
<h2>1. Informazioni secondo il diritto svizzero</h2>
<p>Responsabile di questo sito web:</p>
@@ -145,7 +145,7 @@ class PageImprint extends HTMLElement {
es: /* html */`
<h1>Aviso legal</h1>
<div class="legal-draft-notice">BORRADOR — Por favor, haga revisar este documento por un profesional legal.</div>
<p class="legal-meta">dgray.io — Mercado anónimo | Actualización: febrero 2026</p>
<p class="legal-meta">kashilo.com — Mercado anónimo | Actualización: febrero 2026</p>
<h2>1. Información según la legislación suiza</h2>
<p>Responsable de este sitio web:</p>
@@ -177,7 +177,7 @@ class PageImprint extends HTMLElement {
pt: /* html */`
<h1>Aviso legal</h1>
<div class="legal-draft-notice">RASCUNHO — Por favor, solicite a revisão deste documento por um profissional jurídico.</div>
<p class="legal-meta">dgray.io — Mercado anônimo | Atualização: fevereiro 2026</p>
<p class="legal-meta">kashilo.com — Mercado anônimo | Atualização: fevereiro 2026</p>
<h2>1. Informações conforme a legislação suíça</h2>
<p>Responsável por este site:</p>
@@ -209,7 +209,7 @@ class PageImprint extends HTMLElement {
ru: /* html */`
<h1>Правовая информация</h1>
<div class="legal-draft-notice">ЧЕРНОВИК — Пожалуйста, передайте этот документ на проверку юристу.</div>
<p class="legal-meta">dgray.io — Анонимный маркетплейс | Обновлено: февраль 2026</p>
<p class="legal-meta">kashilo.com — Анонимный маркетплейс | Обновлено: февраль 2026</p>
<h2>1. Сведения согласно швейцарскому праву</h2>
<p>Ответственный за данный сайт:</p>

View File

@@ -90,11 +90,11 @@ class PageListing extends HTMLElement {
updateMetaTags() {
if (!this.listing) return
const title = `${this.listing.title} dgray.io`
const title = `${this.listing.title} kashilo.com`
const description = (this.listing.description || '').substring(0, 160)
const imageId = this.listing.images?.[0]?.directus_files_id?.id || this.listing.images?.[0]?.directus_files_id
const imageUrl = imageId ? directus.getFileUrl(imageId, { width: 1200, height: 630, fit: 'cover' }) : 'https://dgray.io/assets/press/og-image.png'
const url = `https://dgray.io/#/listing/${this.listing.id}`
const imageUrl = imageId ? directus.getFileUrl(imageId, { width: 1200, height: 630, fit: 'cover' }) : 'https://kashilo.com/assets/press/og-image.png'
const url = `https://kashilo.com/#/listing/${this.listing.id}`
document.title = title
this._setMeta('description', description)
@@ -109,16 +109,16 @@ class PageListing extends HTMLElement {
}
resetMetaTags() {
const defaultTitle = 'dgray.io Anonymous Classifieds with Monero'
const defaultTitle = 'kashilo.com Anonymous Classifieds with Monero'
const defaultDesc = 'Buy and sell anonymously with Monero. No KYC, no email, E2E encrypted chat.'
const defaultImage = 'https://dgray.io/assets/press/og-image.png'
const defaultImage = 'https://kashilo.com/assets/press/og-image.png'
document.title = defaultTitle
this._setMeta('description', defaultDesc)
this._setMeta('og:title', defaultTitle, true)
this._setMeta('og:description', defaultDesc, true)
this._setMeta('og:image', defaultImage, true)
this._setMeta('og:url', 'https://dgray.io', true)
this._setMeta('og:url', 'https://kashilo.com', true)
this._setMeta('og:type', 'website', true)
this._setMeta('twitter:title', defaultTitle)
this._setMeta('twitter:description', defaultDesc)

View File

@@ -16,10 +16,10 @@ class PagePrivacy extends HTMLElement {
const content = {
de: /* html */`
<h1>Datenschutzerklärung</h1>
<p class="legal-meta">dgray.io — Anonymer Marktplatz | Stand: Februar 2026</p>
<p class="legal-meta">kashilo.com — 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>
<p>Verantwortlich für die Datenbearbeitung ist der Betreiber der Plattform kashilo.com mit Sitz in der Schweiz.</p>
<h2>2. Grundsatz</h2>
<p>Die Plattform wurde nach dem Prinzip der Datensparsamkeit konzipiert.</p>
@@ -67,10 +67,10 @@ class PagePrivacy extends HTMLElement {
`,
en: /* html */`
<h1>Privacy Policy</h1>
<p class="legal-meta">dgray.io — Anonymous Marketplace | Last updated: February 2026</p>
<p class="legal-meta">kashilo.com — 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>
<p>The controller for data processing is the operator of kashilo.com, based in Switzerland.</p>
<h2>2. Principle</h2>
<p>The platform was designed following the principle of data minimization.</p>
@@ -118,10 +118,10 @@ class PagePrivacy extends HTMLElement {
`,
fr: /* html */`
<h1>Politique de confidentialité</h1>
<p class="legal-meta">dgray.io — Marché anonyme | Mise à jour : février 2026</p>
<p class="legal-meta">kashilo.com — 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>
<p>Le responsable du traitement des données est l'exploitant de kashilo.com, domicilié en Suisse.</p>
<h2>2. Principe</h2>
<p>La plateforme a été conçue selon le principe de minimisation des données.</p>
@@ -169,10 +169,10 @@ class PagePrivacy extends HTMLElement {
`,
it: /* html */`
<h1>Informativa sulla privacy</h1>
<p class="legal-meta">dgray.io — Mercato anonimo | Aggiornamento: febbraio 2026</p>
<p class="legal-meta">kashilo.com — Mercato anonimo | Aggiornamento: febbraio 2026</p>
<h2>1. Titolare del trattamento</h2>
<p>Il titolare del trattamento dei dati è il gestore della piattaforma dgray.io con sede in Svizzera.</p>
<p>Il titolare del trattamento dei dati è il gestore della piattaforma kashilo.com con sede in Svizzera.</p>
<h2>2. Principio</h2>
<p>La piattaforma è stata progettata secondo il principio della minimizzazione dei dati.</p>
@@ -220,10 +220,10 @@ class PagePrivacy extends HTMLElement {
`,
es: /* html */`
<h1>Política de Privacidad</h1>
<p class="legal-meta">dgray.io — Mercado anónimo | Actualización: febrero 2026</p>
<p class="legal-meta">kashilo.com — Mercado anónimo | Actualización: febrero 2026</p>
<h2>1. Responsable del tratamiento</h2>
<p>El responsable del tratamiento de datos es el operador de la plataforma dgray.io con sede en Suiza.</p>
<p>El responsable del tratamiento de datos es el operador de la plataforma kashilo.com con sede en Suiza.</p>
<h2>2. Principio</h2>
<p>La plataforma fue diseñada según el principio de minimización de datos.</p>
@@ -271,10 +271,10 @@ class PagePrivacy extends HTMLElement {
`,
pt: /* html */`
<h1>Política de Privacidade</h1>
<p class="legal-meta">dgray.io — Mercado anônimo | Atualização: fevereiro 2026</p>
<p class="legal-meta">kashilo.com — Mercado anônimo | Atualização: fevereiro 2026</p>
<h2>1. Responsável pelo tratamento</h2>
<p>O responsável pelo tratamento de dados é o operador da plataforma dgray.io com sede na Suíça.</p>
<p>O responsável pelo tratamento de dados é o operador da plataforma kashilo.com com sede na Suíça.</p>
<h2>2. Princípio</h2>
<p>A plataforma foi projetada segundo o princípio da minimização de dados.</p>
@@ -322,10 +322,10 @@ class PagePrivacy extends HTMLElement {
`,
ru: /* html */`
<h1>Политика конфиденциальности</h1>
<p class="legal-meta">dgray.io — Анонимный маркетплейс | Обновлено: февраль 2026</p>
<p class="legal-meta">kashilo.com — Анонимный маркетплейс | Обновлено: февраль 2026</p>
<h2>1. Ответственный за обработку данных</h2>
<p>Ответственным за обработку данных является оператор платформы dgray.io с местонахождением в Швейцарии.</p>
<p>Ответственным за обработку данных является оператор платформы kashilo.com с местонахождением в Швейцарии.</p>
<h2>2. Принцип</h2>
<p>Платформа разработана по принципу минимизации данных.</p>

View File

@@ -146,11 +146,11 @@ class PageSettings extends HTMLElement {
}
getCurrentCurrency() {
return localStorage.getItem('dgray_currency') || 'USD'
return localStorage.getItem('kashilo_currency') || 'USD'
}
async setCurrency(currency) {
localStorage.setItem('dgray_currency', currency)
localStorage.setItem('kashilo_currency', currency)
window.dispatchEvent(new CustomEvent('currency-changed', { detail: { currency } }))
// Save to user profile if logged in
@@ -323,7 +323,7 @@ class PageSettings extends HTMLElement {
<a href="#/privacy">${t('footer.privacy')}</a>
<a href="#/terms">${t('footer.terms')}</a>
</div>
<p class="version">dgray.io v1.0.0</p>
<p class="version">kashilo.com v1.0.0</p>
</section>
</div>
</div>

View File

@@ -40,10 +40,10 @@ class PageTerms extends HTMLElement {
getContentDE() {
return /* html */`
<h1>Allgemeine Geschäftsbedingungen (AGB)</h1>
<p class="legal-meta">dgray.io — Anonymer Marktplatz | Stand: Februar 2026</p>
<p class="legal-meta">kashilo.com — 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.1 Diese AGB regeln die Nutzung der Plattform kashilo.com.</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>
@@ -114,10 +114,10 @@ class PageTerms extends HTMLElement {
getContentEN() {
return /* html */`
<h1>Terms of Service</h1>
<p class="legal-meta">dgray.io — Anonymous Marketplace | Last updated: February 2026</p>
<p class="legal-meta">kashilo.com — 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.1 These Terms of Service govern the use of the platform kashilo.com.</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>
@@ -188,10 +188,10 @@ class PageTerms extends HTMLElement {
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>
<p class="legal-meta">kashilo.com — 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.1 Les présentes CGU régissent l'utilisation de la plateforme kashilo.com.</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>
@@ -262,10 +262,10 @@ class PageTerms extends HTMLElement {
getContentIT() {
return /* html */`
<h1>Condizioni generali di utilizzo (CGU)</h1>
<p class="legal-meta">dgray.io — Mercato anonimo | Aggiornamento: febbraio 2026</p>
<p class="legal-meta">kashilo.com — Mercato anonimo | Aggiornamento: febbraio 2026</p>
<h2>1. Campo di applicazione</h2>
<p>1.1 Le presenti CGU disciplinano l'utilizzo della piattaforma dgray.io.</p>
<p>1.1 Le presenti CGU disciplinano l'utilizzo della piattaforma kashilo.com.</p>
<p>1.2 La piattaforma è gestita da una persona fisica con sede in Svizzera.</p>
<p>1.3 Utilizzando la piattaforma, l'utente accetta le presenti CGU.</p>
@@ -336,10 +336,10 @@ class PageTerms extends HTMLElement {
getContentES() {
return /* html */`
<h1>Condiciones generales de uso (CGU)</h1>
<p class="legal-meta">dgray.io — Mercado anónimo | Actualización: febrero 2026</p>
<p class="legal-meta">kashilo.com — Mercado anónimo | Actualización: febrero 2026</p>
<h2>1. Ámbito de aplicación</h2>
<p>1.1 Las presentes CGU regulan el uso de la plataforma dgray.io.</p>
<p>1.1 Las presentes CGU regulan el uso de la plataforma kashilo.com.</p>
<p>1.2 La plataforma es operada por una persona física con sede en Suiza.</p>
<p>1.3 Al utilizar la plataforma, el usuario acepta las presentes CGU.</p>
@@ -410,10 +410,10 @@ class PageTerms extends HTMLElement {
getContentPT() {
return /* html */`
<h1>Termos de Uso</h1>
<p class="legal-meta">dgray.io — Mercado anônimo | Atualização: fevereiro 2026</p>
<p class="legal-meta">kashilo.com — Mercado anônimo | Atualização: fevereiro 2026</p>
<h2>1. Âmbito de aplicação</h2>
<p>1.1 Estes Termos de Uso regulam a utilização da plataforma dgray.io.</p>
<p>1.1 Estes Termos de Uso regulam a utilização da plataforma kashilo.com.</p>
<p>1.2 A plataforma é operada por uma pessoa física com sede na Suíça.</p>
<p>1.3 Ao utilizar a plataforma, o usuário concorda com estes Termos de Uso.</p>
@@ -484,10 +484,10 @@ class PageTerms extends HTMLElement {
getContentRU() {
return /* html */`
<h1>Условия использования</h1>
<p class="legal-meta">dgray.io — Анонимный маркетплейс | Обновлено: февраль 2026</p>
<p class="legal-meta">kashilo.com — Анонимный маркетплейс | Обновлено: февраль 2026</p>
<h2>1. Область применения</h2>
<p>1.1 Настоящие Условия использования регулируют пользование платформой dgray.io.</p>
<p>1.1 Настоящие Условия использования регулируют пользование платформой kashilo.com.</p>
<p>1.2 Платформа управляется физическим лицом с местонахождением в Швейцарии.</p>
<p>1.3 Используя платформу, пользователь соглашается с настоящими Условиями использования.</p>

View File

@@ -11,14 +11,14 @@ import { setPersist, getPersist } from './directus/client.js'
import { cryptoService } from './crypto.js'
import { i18n } from '../i18n.js'
const AUTH_DOMAIN = 'dgray.io'
const AUTH_DOMAIN = 'kashilo.com'
class AuthService {
constructor() {
this.currentUser = null
this.listeners = new Set()
this.hashCache = new Map()
if (localStorage.getItem('dgray_remember') === '1') {
if (localStorage.getItem('kashilo_remember') === '1') {
setPersist(true)
}
}
@@ -142,7 +142,7 @@ class AuthService {
this.currentUser = null
this.clearStoredUuid()
localStorage.removeItem('dgray_remember')
localStorage.removeItem('kashilo_remember')
setPersist(false)
cryptoService.lock()
this.resetPreferencesToDefaults()
@@ -159,7 +159,7 @@ class AuthService {
const keysToRemove = []
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i)
if (key && key.startsWith('dgray_')) keysToRemove.push(key)
if (key && key.startsWith('kashilo_')) keysToRemove.push(key)
}
keysToRemove.forEach(k => localStorage.removeItem(k))
@@ -169,7 +169,7 @@ class AuthService {
for (let i = sessionStorage.length - 1; i >= 0; i--) {
const key = sessionStorage.key(i)
if (key && key.startsWith('dgray_')) sessionStorage.removeItem(key)
if (key && key.startsWith('kashilo_')) sessionStorage.removeItem(key)
}
}
@@ -180,7 +180,7 @@ class AuthService {
const defaultCurrency = 'USD'
const defaultLocale = 'en'
localStorage.setItem('dgray_currency', defaultCurrency)
localStorage.setItem('kashilo_currency', defaultCurrency)
localStorage.setItem('locale', defaultLocale)
window.dispatchEvent(new CustomEvent('currency-changed', { detail: { currency: defaultCurrency } }))
@@ -223,7 +223,7 @@ class AuthService {
if (this.currentUser.preferred_currency) {
const currency = this.currentUser.preferred_currency
localStorage.setItem('dgray_currency', currency)
localStorage.setItem('kashilo_currency', currency)
window.dispatchEvent(new CustomEvent('currency-changed', { detail: { currency } }))
}
if (this.currentUser.preferred_locale) {
@@ -261,7 +261,7 @@ class AuthService {
*/
storeUuid(uuid) {
const storage = getPersist() ? localStorage : sessionStorage
storage.setItem('dgray_uuid', uuid)
storage.setItem('kashilo_uuid', uuid)
}
/**
@@ -269,28 +269,28 @@ class AuthService {
* @returns {string|null}
*/
getStoredUuid() {
return sessionStorage.getItem('dgray_uuid') || localStorage.getItem('dgray_uuid')
return sessionStorage.getItem('kashilo_uuid') || localStorage.getItem('kashilo_uuid')
}
/**
* Clears stored UUID
*/
clearStoredUuid() {
sessionStorage.removeItem('dgray_uuid')
localStorage.removeItem('dgray_uuid')
sessionStorage.removeItem('kashilo_uuid')
localStorage.removeItem('kashilo_uuid')
}
setRememberMe(value) {
setPersist(value)
if (value) {
localStorage.setItem('dgray_remember', '1')
localStorage.setItem('kashilo_remember', '1')
} else {
localStorage.removeItem('dgray_remember')
localStorage.removeItem('kashilo_remember')
}
}
getRememberMe() {
return localStorage.getItem('dgray_remember') === '1'
return localStorage.getItem('kashilo_remember') === '1'
}
/**

View File

@@ -1,6 +1,6 @@
import { i18n } from '../i18n.js'
const POW_SERVER = 'https://pow.dgray.io'
const POW_SERVER = 'https://pow.kashilo.com'
let modalScriptLoaded = false
let modalScriptLoading = null
@@ -131,7 +131,7 @@ export async function pollUntilDone(invoiceId, options = {}) {
*/
export function getPendingInvoice(listingId) {
try {
const data = localStorage.getItem(`dgray_invoice_${listingId}`)
const data = localStorage.getItem(`kashilo_invoice_${listingId}`)
return data ? JSON.parse(data) : null
} catch (e) {
return null
@@ -145,7 +145,7 @@ export function getPendingInvoice(listingId) {
*/
export function savePendingInvoice(listingId, invoiceId) {
try {
localStorage.setItem(`dgray_invoice_${listingId}`, JSON.stringify({
localStorage.setItem(`kashilo_invoice_${listingId}`, JSON.stringify({
invoiceId,
createdAt: Date.now()
}))
@@ -159,7 +159,7 @@ export function savePendingInvoice(listingId, invoiceId) {
* @param {string} listingId
*/
export function clearPendingInvoice(listingId) {
localStorage.removeItem(`dgray_invoice_${listingId}`)
localStorage.removeItem(`kashilo_invoice_${listingId}`)
}
export default {

View File

@@ -10,8 +10,8 @@ class CategoriesService {
this.cache = null
this.cacheTimestamp = 0
this.cacheTimeout = 24 * 60 * 60 * 1000 // 24 hours
this.storageKey = 'dgray_categories'
this.storageTimestampKey = 'dgray_categories_ts'
this.storageKey = 'kashilo_categories'
this.storageTimestampKey = 'kashilo_categories_ts'
this._pending = null
this._loadFromStorage()
}

View File

@@ -6,9 +6,9 @@
* derived from the user's UUID via PBKDF2.
*/
const STORAGE_KEY = 'dgray_keypair'
const SALT_KEY = 'dgray_keypair_salt'
const LISTING_KEYS_STORAGE = 'dgray_listing_keys'
const STORAGE_KEY = 'kashilo_keypair'
const SALT_KEY = 'kashilo_keypair_salt'
const LISTING_KEYS_STORAGE = 'kashilo_listing_keys'
class CryptoService {
constructor() {

View File

@@ -195,7 +195,7 @@ export function convertFiat(amount, fromCurrency, toCurrency, rates) {
* @returns {string} Currency code (default: 'USD')
*/
export function getDisplayCurrency() {
return localStorage.getItem('dgray_currency') || 'USD'
return localStorage.getItem('kashilo_currency') || 'USD'
}
/**

View File

@@ -1,5 +1,5 @@
/**
* Directus API Service for dgray.io — Facade
* Directus API Service for kashilo.com — Facade
* Re-exports modular sub-services as a single backward-compatible singleton.
* @module services/directus
*/

View File

@@ -1,4 +1,4 @@
const DIRECTUS_URL = 'https://api.dgray.io'
const DIRECTUS_URL = 'https://api.kashilo.com'
let _persist = false
@@ -51,14 +51,14 @@ class DirectusClient {
// ── Token Management ──
loadTokens() {
const stored = sessionStorage.getItem('dgray_auth') || localStorage.getItem('dgray_auth')
const stored = sessionStorage.getItem('kashilo_auth') || localStorage.getItem('kashilo_auth')
if (stored) {
try {
const { accessToken, refreshToken, expiry } = JSON.parse(stored)
this.accessToken = accessToken
this.refreshToken = refreshToken
this.tokenExpiry = expiry
if (localStorage.getItem('dgray_auth')) {
if (localStorage.getItem('kashilo_auth')) {
_persist = true
}
this.scheduleTokenRefresh()
@@ -73,7 +73,7 @@ class DirectusClient {
this.refreshToken = refreshToken
this.tokenExpiry = Date.now() + (expiresIn * 1000)
_storage().setItem('dgray_auth', JSON.stringify({
_storage().setItem('kashilo_auth', JSON.stringify({
accessToken: this.accessToken,
refreshToken: this.refreshToken,
expiry: this.tokenExpiry
@@ -86,8 +86,8 @@ class DirectusClient {
this.accessToken = null
this.refreshToken = null
this.tokenExpiry = null
sessionStorage.removeItem('dgray_auth')
localStorage.removeItem('dgray_auth')
sessionStorage.removeItem('kashilo_auth')
localStorage.removeItem('kashilo_auth')
if (this.refreshTimeout) {
clearTimeout(this.refreshTimeout)

View File

@@ -1,7 +1,7 @@
import { directus } from './directus.js'
import { auth } from './auth.js'
const ANON_KEY = 'dgray_favorites'
const ANON_KEY = 'kashilo_favorites'
class FavoritesService {
constructor() {

View File

@@ -3,7 +3,7 @@
* Stores seller contact keys on first use, warns on key changes
*/
const PINNED_KEYS_STORAGE = 'dgray_pinned_keys'
const PINNED_KEYS_STORAGE = 'kashilo_pinned_keys'
class KeyPinningService {
constructor() {

View File

@@ -2,11 +2,11 @@
// Client must find nonce where SHA256(challenge + nonce) has N leading zeros
// Server-first: tries /pow/challenge endpoint, falls back to local generation
const POW_SERVER = 'https://pow.dgray.io'
const POW_SERVER = 'https://pow.kashilo.com'
const DIFFICULTY = 4
const SERVER_TIMEOUT_MS = 1500
const LOCAL_HMAC_KEY = 'dgray-pow-local-v1'
const LOCAL_HMAC_KEY = 'kashilo-pow-local-v1'
async function hmacSign(message) {
const enc = new TextEncoder()