site-sirius-x: use the Sirius.X brand mark, drop trailing slashes

Star emoji swapped for the site's own 4-point sparkle mark — same SVG
that ships as the favicon — everywhere it appeared: the topnav brand,
the hero mark, the "you're here" pill on the family-of-.x panel, the
footer, register.html, portal.html, tld.html, market/, docs/, admin/,
brand/, storage/, theseus/, studio.html, site-footer.js. Anyone who
opens Sirius.X now sees the acid-green sparkle instead of a browser
star emoji.

Internal links normalised to no trailing slash — href="./theseus/"
became href="./theseus" (Theseus, docs, market, admin). Cleaner URLs
in the address bar and no double-slash redirect step on the mirrors.
This commit is contained in:
Local Dev 2026-09-20 17:49:04 +02:00
parent f84304b0f7
commit 6618b38b2d
22 changed files with 837 additions and 217 deletions

View file

@ -93,7 +93,7 @@
<body> <body>
<nav class="topnav"> <nav class="topnav">
<a class="brand" href="../"><span class="g">Sirius.X</span></a> <a class="brand" href="../"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="../#try">Try it</a> <a href="../#try">Try it</a>
<a href="../#search-input">✏️ Register</a> <a href="../#search-input">✏️ Register</a>
<a href="../tld.html">🌐 TLD</a> <a href="../tld.html">🌐 TLD</a>
@ -388,7 +388,7 @@ $("mint-btn").addEventListener("click", async () => {
<script src="../js/pin-escrow.js?v=20260909pin"></script> <script src="../js/pin-escrow.js?v=20260909pin"></script>
<script src="../js/pricing.js?v=20260909tldhigh"></script> <script src="../js/pricing.js?v=20260909tldhigh"></script>
<script defer src="../js/site-footer.js?v=20260907rel"></script> <script defer src="../js/site-footer.js?v=20260907rel"></script>
<script defer src="../js/theme.js?v=20260910font"></script> <script defer src="../js/theme.js?v=20260920compact"></script>
<script defer src="../js/profile-menu.js?v=20260908tabs"></script> <script defer src="../js/profile-menu.js?v=20260908tabs"></script>
</body> </body>
</html> </html>

View file

@ -92,7 +92,7 @@
<body> <body>
<nav class="topnav"> <nav class="topnav">
<a class="brand" href="../"><span class="g">Sirius.X</span></a> <a class="brand" href="../"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="../#try">Try it</a> <a href="../#try">Try it</a>
<a href="../#search-input">✏️ Register</a> <a href="../#search-input">✏️ Register</a>
<a href="../tld.html">🌐 TLD</a> <a href="../tld.html">🌐 TLD</a>
@ -234,7 +234,7 @@
<script src="../js/pin-escrow.js?v=20260909pin"></script> <script src="../js/pin-escrow.js?v=20260909pin"></script>
<script src="../js/pricing.js?v=20260909tldhigh"></script> <script src="../js/pricing.js?v=20260909tldhigh"></script>
<script defer src="../js/site-footer.js?v=20260907rel"></script> <script defer src="../js/site-footer.js?v=20260907rel"></script>
<script defer src="../js/theme.js?v=20260910font"></script> <script defer src="../js/theme.js?v=20260920compact"></script>
<script defer src="../js/profile-menu.js?v=20260908tabs"></script> <script defer src="../js/profile-menu.js?v=20260908tabs"></script>
</body> </body>
</html> </html>

View file

@ -92,16 +92,16 @@
<script type="importmap"> <script type="importmap">
{ "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js" } } { "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js" } }
</script> </script>
<script src="../js/i18n.js?v=20260920d"></script> <script src="../js/i18n.js?v=20260920e"></script>
</head> </head>
<body> <body>
<nav class="topnav"> <nav class="topnav">
<a class="brand" href="../"><span class="g">Sirius.X</span></a> <a class="brand" href="../"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="../#try">Try it</a> <a href="../#try">Try it</a>
<a href="../#search-input">✏️ Register</a> <a href="../#search-input">✏️ Register</a>
<a href="../tld.html">🌐 TLD</a> <a href="../tld.html">🌐 TLD</a>
<a href="../market.html">🛒 Market</a> <a href="../market/">🛒 Market</a>
<a href="../theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a> <a href="../theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a>
<a href="../portal.html" class="portal">🔑 Sign in</a> <a href="../portal.html" class="portal">🔑 Sign in</a>
</nav> </nav>
@ -230,7 +230,7 @@
transaction — your certificate as input 0, the price to you as output 0 — with transaction — your certificate as input 0, the price to you as output 0 — with
<code>SIGHASH_SINGLE | ANYONECANPAY</code>. That signature says "whoever completes this <code>SIGHASH_SINGLE | ANYONECANPAY</code>. That signature says "whoever completes this
pays me this much"; it constrains nothing else. The gateway stores it and shows it on pays me this much"; it constrains nothing else. The gateway stores it and shows it on
the <a href="../market.html">market</a> after checking the signature, the on-chain the <a href="../market/">market</a> after checking the signature, the on-chain
owner and that the certificate is still unspent.</span></li> owner and that the certificate is still unspent.</span></li>
<li><b>Buyer completes.</b> <li><b>Buyer completes.</b>
<span>Verify the offer locally, add your coins, add the certificate output to your own <span>Verify the offer locally, add your coins, add the certificate output to your own
@ -606,7 +606,7 @@ process.exit(0);"</pre>
<script src="../js/pin-escrow.js?v=20260909pin"></script> <script src="../js/pin-escrow.js?v=20260909pin"></script>
<script src="../js/pricing.js?v=20260917market"></script> <script src="../js/pricing.js?v=20260917market"></script>
<script defer src="../js/site-footer.js?v=20260917market"></script> <script defer src="../js/site-footer.js?v=20260917market"></script>
<script defer src="../js/theme.js?v=20260910font"></script> <script defer src="../js/theme.js?v=20260920compact"></script>
<script defer src="../js/profile-menu.js?v=20260920m"></script> <script defer src="../js/profile-menu.js?v=20260920m"></script>
</body> </body>
</html> </html>

View file

@ -17,13 +17,9 @@
"Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Drei Dinge, die du sofort tun kannst. Registrar und TLD-Register laufen heute auf silentmode.st; Sirius.X ist das eigentliche Zuhause und führt sie hier zusammen.", "Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Drei Dinge, die du sofort tun kannst. Registrar und TLD-Register laufen heute auf silentmode.st; Sirius.X ist das eigentliche Zuhause und führt sie hier zusammen.",
"Register a name": "Namen registrieren", "Register a name": "Namen registrieren",
"Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Wähle ein Label, durchsuche alle TLDs des Registers auf einmal und präge das Namenszertifikat direkt in dein eigenes Wallet. Keine jährliche Verlängerung.", "Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Wähle ein Label, durchsuche alle TLDs des Registers auf einmal und präge das Namenszertifikat direkt in dein eigenes Wallet. Keine jährliche Verlängerung.",
"≈ 10,000 sat service fee · 1,300 sat chain dust · < 1 ¢": "≈ 10.000 sat Servicegebühr · 1.300 sat Chain-Dust · < 1 ¢",
"Chipnet placeholder. 90 % of the service fee flows to the TLD owner, 10 % to the platform.": "Chipnet-Platzhalter. 90 % der Servicegebühr gehen an den TLD-Inhaber, 10 % an die Plattform.",
"Search a name →": "Namen suchen →", "Search a name →": "Namen suchen →",
"Register a TLD": "TLD registrieren", "Register a TLD": "TLD registrieren",
"A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Eine TLD ist selbst ein Zertifikat auf der Kette. Jeder kann eine prägen — du wirst Registerbetreiber für jeden Second-Level-Namen darunter und verdienst 90 % der Gebühr jedes darunter registrierten Namens. Verlängerungen legt der Inhaber pro TLD fest.", "A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Eine TLD ist selbst ein Zertifikat auf der Kette. Jeder kann eine prägen — du wirst Registerbetreiber für jeden Second-Level-Namen darunter und verdienst 90 % der Gebühr jedes darunter registrierten Namens. Verlängerungen legt der Inhaber pro TLD fest.",
"≈ 1,250,000 sat service fee (≈ $5) · 1,300 sat chain dust": "≈ 1.250.000 sat Servicegebühr (≈ 5 $) · 1.300 sat Chain-Dust",
"Chipnet placeholder rate — mainnet will price by label length via an on-chain oracle.": "Chipnet-Platzhalterkurs — im Mainnet richtet sich der Preis per On-Chain-Orakel nach der Label-Länge.",
"Search a TLD →": "TLD suchen →", "Search a TLD →": "TLD suchen →",
"Operator admin →": "Betreiber-Admin →", "Operator admin →": "Betreiber-Admin →",
"Look up & verify": "Nachschlagen & prüfen", "Look up & verify": "Nachschlagen & prüfen",

View file

@ -17,13 +17,9 @@
"Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Τρία πράγματα που μπορείς να κάνεις τώρα. Ο registrar και το μητρώο TLD ζουν σήμερα στο silentmode.st· το Sirius.X είναι το κανονικό τους σπίτι και θα τα ενοποιήσει εδώ.", "Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Τρία πράγματα που μπορείς να κάνεις τώρα. Ο registrar και το μητρώο TLD ζουν σήμερα στο silentmode.st· το Sirius.X είναι το κανονικό τους σπίτι και θα τα ενοποιήσει εδώ.",
"Register a name": "Καταχώρηση ονόματος", "Register a name": "Καταχώρηση ονόματος",
"Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Διάλεξε μια ετικέτα, ψάξε ταυτόχρονα σε κάθε TLD του μητρώου, κόψε το πιστοποιητικό του ονόματος κατευθείαν στο δικό σου πορτοφόλι. Χωρίς ετήσια ανανέωση.", "Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Διάλεξε μια ετικέτα, ψάξε ταυτόχρονα σε κάθε TLD του μητρώου, κόψε το πιστοποιητικό του ονόματος κατευθείαν στο δικό σου πορτοφόλι. Χωρίς ετήσια ανανέωση.",
"≈ 10,000 sat service fee · 1,300 sat chain dust · < 1 ¢": "≈ 10.000 sat τέλος υπηρεσίας · 1.300 sat σκόνη blockchain · < 1 ¢",
"Chipnet placeholder. 90 % of the service fee flows to the TLD owner, 10 % to the platform.": "Προσωρινή τιμή chipnet. Το 90 % του τέλους πάει στον κάτοχο του TLD, το 10 % στην πλατφόρμα.",
"Search a name →": "Αναζήτηση ονόματος →", "Search a name →": "Αναζήτηση ονόματος →",
"Register a TLD": "Καταχώρηση TLD", "Register a TLD": "Καταχώρηση TLD",
"A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Ένα TLD είναι κι αυτό πιστοποιητικό στο blockchain. Οποιοσδήποτε μπορεί να το κόψει — γίνεσαι διαχειριστής μητρώου για κάθε όνομα δεύτερου επιπέδου κάτω από αυτό και κερδίζεις το 90 % του τέλους κάθε ονόματος που καταχωρείται εκεί. Οι ανανεώσεις είναι πολιτική ανά TLD που ορίζει ο κάτοχος.", "A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Ένα TLD είναι κι αυτό πιστοποιητικό στο blockchain. Οποιοσδήποτε μπορεί να το κόψει — γίνεσαι διαχειριστής μητρώου για κάθε όνομα δεύτερου επιπέδου κάτω από αυτό και κερδίζεις το 90 % του τέλους κάθε ονόματος που καταχωρείται εκεί. Οι ανανεώσεις είναι πολιτική ανά TLD που ορίζει ο κάτοχος.",
"≈ 1,250,000 sat service fee (≈ $5) · 1,300 sat chain dust": "≈ 1.250.000 sat τέλος υπηρεσίας (≈ 5 $) · 1.300 sat σκόνη blockchain",
"Chipnet placeholder rate — mainnet will price by label length via an on-chain oracle.": "Προσωρινή ισοτιμία chipnet — στο mainnet η τιμή θα ορίζεται από το μήκος της ετικέτας μέσω on-chain oracle.",
"Search a TLD →": "Αναζήτηση TLD →", "Search a TLD →": "Αναζήτηση TLD →",
"Operator admin →": "Διαχείριση operator →", "Operator admin →": "Διαχείριση operator →",
"Look up & verify": "Αναζήτηση & επαλήθευση", "Look up & verify": "Αναζήτηση & επαλήθευση",

View file

@ -17,13 +17,9 @@
"Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Tres cosas que puedes hacer ahora mismo. El registrador y el registro de TLD viven hoy en silentmode.st; Sirius.X es su hogar canónico y los consolidará aquí.", "Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Tres cosas que puedes hacer ahora mismo. El registrador y el registro de TLD viven hoy en silentmode.st; Sirius.X es su hogar canónico y los consolidará aquí.",
"Register a name": "Registrar un nombre", "Register a name": "Registrar un nombre",
"Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Elige una etiqueta, búscala en todos los TLD del registro a la vez y acuña el certificado del nombre directamente en tu propia cartera. Sin renovación anual.", "Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Elige una etiqueta, búscala en todos los TLD del registro a la vez y acuña el certificado del nombre directamente en tu propia cartera. Sin renovación anual.",
"≈ 10,000 sat service fee · 1,300 sat chain dust · < 1 ¢": "≈ 10 000 sat de tarifa de servicio · 1 300 sat de polvo de cadena · < 1 ¢",
"Chipnet placeholder. 90 % of the service fee flows to the TLD owner, 10 % to the platform.": "Valor provisional de chipnet. El 90 % de la tarifa va al dueño del TLD, el 10 % a la plataforma.",
"Search a name →": "Buscar un nombre →", "Search a name →": "Buscar un nombre →",
"Register a TLD": "Registrar un TLD", "Register a TLD": "Registrar un TLD",
"A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Un TLD es en sí mismo un certificado en la cadena. Cualquiera puede acuñar uno: te conviertes en operador del registro de cada nombre de segundo nivel bajo él y ganas el 90 % de la tarifa de cada nombre registrado. Las renovaciones son una política por TLD que fija el dueño.", "A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Un TLD es en sí mismo un certificado en la cadena. Cualquiera puede acuñar uno: te conviertes en operador del registro de cada nombre de segundo nivel bajo él y ganas el 90 % de la tarifa de cada nombre registrado. Las renovaciones son una política por TLD que fija el dueño.",
"≈ 1,250,000 sat service fee (≈ $5) · 1,300 sat chain dust": "≈ 1 250 000 sat de tarifa de servicio (≈ 5 $) · 1 300 sat de polvo de cadena",
"Chipnet placeholder rate — mainnet will price by label length via an on-chain oracle.": "Tasa provisional de chipnet — en mainnet el precio dependerá de la longitud de la etiqueta mediante un oráculo en cadena.",
"Search a TLD →": "Buscar un TLD →", "Search a TLD →": "Buscar un TLD →",
"Operator admin →": "Administración del operador →", "Operator admin →": "Administración del operador →",
"Look up & verify": "Consultar y verificar", "Look up & verify": "Consultar y verificar",

View file

@ -17,13 +17,9 @@
"Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Trois choses à faire dès maintenant. Le registrar et le registre des TLD vivent aujourd'hui sur silentmode.st ; Sirius.X est leur maison canonique et les regroupera ici.", "Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Trois choses à faire dès maintenant. Le registrar et le registre des TLD vivent aujourd'hui sur silentmode.st ; Sirius.X est leur maison canonique et les regroupera ici.",
"Register a name": "Enregistrer un nom", "Register a name": "Enregistrer un nom",
"Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Choisissez un libellé, cherchez-le dans tous les TLD du registre d'un coup, frappez le certificat du nom directement dans votre propre portefeuille. Sans renouvellement annuel.", "Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Choisissez un libellé, cherchez-le dans tous les TLD du registre d'un coup, frappez le certificat du nom directement dans votre propre portefeuille. Sans renouvellement annuel.",
"≈ 10,000 sat service fee · 1,300 sat chain dust · < 1 ¢": "≈ 10 000 sat de frais de service · 1 300 sat de poussière de chaîne · < 1 ¢",
"Chipnet placeholder. 90 % of the service fee flows to the TLD owner, 10 % to the platform.": "Valeur provisoire chipnet. 90 % des frais vont au propriétaire du TLD, 10 % à la plateforme.",
"Search a name →": "Chercher un nom →", "Search a name →": "Chercher un nom →",
"Register a TLD": "Enregistrer un TLD", "Register a TLD": "Enregistrer un TLD",
"A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Un TLD est lui-même un certificat sur la chaîne. N'importe qui peut en frapper un : vous devenez l'opérateur du registre pour chaque nom de second niveau en dessous, et gagnez 90 % des frais de chaque nom enregistré. Les renouvellements sont une politique par TLD fixée par le propriétaire.", "A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Un TLD est lui-même un certificat sur la chaîne. N'importe qui peut en frapper un : vous devenez l'opérateur du registre pour chaque nom de second niveau en dessous, et gagnez 90 % des frais de chaque nom enregistré. Les renouvellements sont une politique par TLD fixée par le propriétaire.",
"≈ 1,250,000 sat service fee (≈ $5) · 1,300 sat chain dust": "≈ 1 250 000 sat de frais de service (≈ 5 $) · 1 300 sat de poussière de chaîne",
"Chipnet placeholder rate — mainnet will price by label length via an on-chain oracle.": "Taux provisoire chipnet — sur mainnet, le prix dépendra de la longueur du libellé via un oracle on-chain.",
"Search a TLD →": "Chercher un TLD →", "Search a TLD →": "Chercher un TLD →",
"Operator admin →": "Administration opérateur →", "Operator admin →": "Administration opérateur →",
"Look up & verify": "Consulter et vérifier", "Look up & verify": "Consulter et vérifier",

View file

@ -17,13 +17,9 @@
"Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Três coisas que pode fazer agora mesmo. O registrador e o registo de TLD vivem hoje em silentmode.st; o Sirius.X é a sua casa canónica e vai consolidá-los aqui.", "Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Três coisas que pode fazer agora mesmo. O registrador e o registo de TLD vivem hoje em silentmode.st; o Sirius.X é a sua casa canónica e vai consolidá-los aqui.",
"Register a name": "Registar um nome", "Register a name": "Registar um nome",
"Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Escolha uma etiqueta, pesquise em todos os TLD do registo de uma vez e cunhe o certificado do nome diretamente na sua própria carteira. Sem renovação anual.", "Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Escolha uma etiqueta, pesquise em todos os TLD do registo de uma vez e cunhe o certificado do nome diretamente na sua própria carteira. Sem renovação anual.",
"≈ 10,000 sat service fee · 1,300 sat chain dust · < 1 ¢": "≈ 10 000 sat de taxa de serviço · 1 300 sat de poeira da cadeia · < 1 ¢",
"Chipnet placeholder. 90 % of the service fee flows to the TLD owner, 10 % to the platform.": "Valor provisório da chipnet. 90 % da taxa vai para o dono do TLD, 10 % para a plataforma.",
"Search a name →": "Procurar um nome →", "Search a name →": "Procurar um nome →",
"Register a TLD": "Registar um TLD", "Register a TLD": "Registar um TLD",
"A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Um TLD é, ele próprio, um certificado na cadeia. Qualquer pessoa pode cunhar um: torna-se operador do registo de cada nome de segundo nível sob ele e ganha 90 % da taxa de cada nome registado. As renovações são uma política por TLD definida pelo dono.", "A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "Um TLD é, ele próprio, um certificado na cadeia. Qualquer pessoa pode cunhar um: torna-se operador do registo de cada nome de segundo nível sob ele e ganha 90 % da taxa de cada nome registado. As renovações são uma política por TLD definida pelo dono.",
"≈ 1,250,000 sat service fee (≈ $5) · 1,300 sat chain dust": "≈ 1 250 000 sat de taxa de serviço (≈ 5 $) · 1 300 sat de poeira da cadeia",
"Chipnet placeholder rate — mainnet will price by label length via an on-chain oracle.": "Taxa provisória da chipnet — na mainnet o preço dependerá do comprimento da etiqueta através de um oráculo on-chain.",
"Search a TLD →": "Procurar um TLD →", "Search a TLD →": "Procurar um TLD →",
"Operator admin →": "Administração do operador →", "Operator admin →": "Administração do operador →",
"Look up & verify": "Consultar e verificar", "Look up & verify": "Consultar e verificar",

View file

@ -17,13 +17,9 @@
"Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Три вещи, которые можно сделать прямо сейчас. Регистратор и реестр TLD сегодня живут на silentmode.st; Sirius.X — их основной дом, и они переедут сюда.", "Three things you can do right now. The registrar and TLD-registry UIs live at silentmode.st today; Sirius.X is the canonical home and will consolidate them here.": "Три вещи, которые можно сделать прямо сейчас. Регистратор и реестр TLD сегодня живут на silentmode.st; Sirius.X — их основной дом, и они переедут сюда.",
"Register a name": "Зарегистрировать имя", "Register a name": "Зарегистрировать имя",
"Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Выберите метку, найдите её сразу во всех TLD реестра и выпустите сертификат имени прямо в свой кошелёк. Без ежегодного продления.", "Pick a label, search across every TLD in the registry at once, mint the name certificate straight into your own wallet. No yearly renewal.": "Выберите метку, найдите её сразу во всех TLD реестра и выпустите сертификат имени прямо в свой кошелёк. Без ежегодного продления.",
"≈ 10,000 sat service fee · 1,300 sat chain dust · < 1 ¢": "≈ 10 000 сат сервисный сбор · 1 300 сат «пыль» блокчейна · < 1 ¢",
"Chipnet placeholder. 90 % of the service fee flows to the TLD owner, 10 % to the platform.": "Заглушка для chipnet. 90 % сервисного сбора идёт владельцу TLD, 10 % — платформе.",
"Search a name →": "Найти имя →", "Search a name →": "Найти имя →",
"Register a TLD": "Зарегистрировать TLD", "Register a TLD": "Зарегистрировать TLD",
"A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "TLD — это тоже сертификат в блокчейне. Выпустить его может любой: вы становитесь оператором реестра для всех имён второго уровня под ним и получаете 90 % сбора с каждого зарегистрированного имени. Продление — политика каждого TLD, которую задаёт владелец.", "A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry operator for every second-level name under it, and earn 90 % of the fee on every name registered under it. Renewals are per-TLD policy set by the owner.": "TLD — это тоже сертификат в блокчейне. Выпустить его может любой: вы становитесь оператором реестра для всех имён второго уровня под ним и получаете 90 % сбора с каждого зарегистрированного имени. Продление — политика каждого TLD, которую задаёт владелец.",
"≈ 1,250,000 sat service fee (≈ $5) · 1,300 sat chain dust": "≈ 1 250 000 сат сервисный сбор (≈ $5) · 1 300 сат «пыль» блокчейна",
"Chipnet placeholder rate — mainnet will price by label length via an on-chain oracle.": "Курс-заглушка для chipnet — в mainnet цена будет зависеть от длины метки через ончейн-оракул.",
"Search a TLD →": "Найти TLD →", "Search a TLD →": "Найти TLD →",
"Operator admin →": "Панель оператора →", "Operator admin →": "Панель оператора →",
"Look up & verify": "Найти и проверить", "Look up & verify": "Найти и проверить",

View file

@ -133,17 +133,17 @@
<body> <body>
<nav class="topnav"> <nav class="topnav">
<a class="brand" href="./"><span class="g">Sirius.X</span></a> <a class="brand" href="./"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="#try">Try it</a> <a href="#try">Try it</a>
<a href="./#search-input">✏️ Register</a> <a href="./#search-input">✏️ Register</a>
<a href="./tld.html">🌐 TLD</a> <a href="./tld.html">🌐 TLD</a>
<a href="./market/">🛒 Market</a> <a href="./market">🛒 Market</a>
<a href="./theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus<span class="g">.X</span></a> <a href="./theseus"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus<span class="g">.X</span></a>
<a href="./portal.html" class="portal">🔑 Sign in</a> <a href="./portal.html" class="portal">🔑 Sign in</a>
</nav> </nav>
<header class="hero"> <header class="hero">
<div class="mark"></div> <div class="mark"><svg width="56" height="56" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg></div>
<h1>Names on the <span class="g">chain</span>.</h1> <h1>Names on the <span class="g">chain</span>.</h1>
<p class="tag">Sirius.X is the entry point for BCNR — Bitcoin Cash Name Registry. <p class="tag">Sirius.X is the entry point for BCNR — Bitcoin Cash Name Registry.
Register a top-level domain, register a name under one, look up records, Register a top-level domain, register a name under one, look up records,
@ -163,7 +163,7 @@
<div class="cta" style="margin-top:1.4rem"> <div class="cta" style="margin-top:1.4rem">
<a class="btn ghost" href="#try">Or browse what you can do →</a> <a class="btn ghost" href="#try">Or browse what you can do →</a>
<a class="btn ghost" href="./docs/">Read the docs</a> <a class="btn ghost" href="./docs">Read the docs</a>
</div> </div>
</header> </header>
@ -320,7 +320,7 @@
fee on every name registered under it. Renewals are per-TLD policy that you control.</p> fee on every name registered under it. Renewals are per-TLD policy that you control.</p>
<div class="cta"> <div class="cta">
<a class="btn acid" href="./tld.html">Search a TLD →</a> <a class="btn acid" href="./tld.html">Search a TLD →</a>
<a class="btn ghost" href="./admin/">Operator admin →</a> <a class="btn ghost" href="./admin">Operator admin →</a>
</div> </div>
</div> </div>
<div class="card"> <div class="card">
@ -339,7 +339,7 @@
<h3><span class="dot d-chain"></span> 🧭 Theseus Navigator</h3> <h3><span class="dot d-chain"></span> 🧭 Theseus Navigator</h3>
<p>The browser that speaks BCNR natively. Open <code>hello.bch</code> in the address bar — <p>The browser that speaks BCNR natively. Open <code>hello.bch</code> in the address bar —
it just resolves. TLS verified against on-chain fingerprints, no OS trust-store install.</p> it just resolves. TLS verified against on-chain fingerprints, no OS trust-store install.</p>
<div class="cta"><a class="btn ghost" href="./theseus/">Download →</a></div> <div class="cta"><a class="btn ghost" href="./theseus">Download →</a></div>
</div> </div>
</div> </div>
</section> </section>
@ -350,7 +350,7 @@
mainnet pricing, verification, and the operator runbook pointer — live on their own page so mainnet pricing, verification, and the operator runbook pointer — live on their own page so
they can grow without cluttering the landing.</p> they can grow without cluttering the landing.</p>
<div class="cta" style="justify-content:flex-start;margin-top:1rem"> <div class="cta" style="justify-content:flex-start;margin-top:1rem">
<a class="btn acid" href="./docs/">📚 Open the docs →</a> <a class="btn acid" href="./docs">📚 Open the docs →</a>
<a class="btn ghost" href="https://silentmode.st/tlds/">Current TLD list</a> <a class="btn ghost" href="https://silentmode.st/tlds/">Current TLD list</a>
</div> </div>
</section> </section>
@ -380,7 +380,7 @@
<div class="cta"><a class="btn ghost" href="https://silentmode.st/bns/silentmode.x/" rel="noopener">Open →</a></div> <div class="cta"><a class="btn ghost" href="https://silentmode.st/bns/silentmode.x/" rel="noopener">Open →</a></div>
</div> </div>
<div class="card"> <div class="card">
<h3><span class="dot d-chain"></span> Sirius.X <span class="pill">you're here</span></h3> <h3><span class="dot d-chain"></span> <svg width="16" height="16" viewBox="0 0 64 64" style="vertical-align:-3px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg>Sirius.X <span class="pill">you're here</span></h3>
<p>Names on Bitcoin Cash — register, resolve, verify, manage. This site.</p> <p>Names on Bitcoin Cash — register, resolve, verify, manage. This site.</p>
<div class="cta"><a class="btn ghost" href="./">Home →</a></div> <div class="cta"><a class="btn ghost" href="./">Home →</a></div>
</div> </div>
@ -388,7 +388,7 @@
<h3><span class="dot d-chain"></span> 🧭 Theseus.X</h3> <h3><span class="dot d-chain"></span> 🧭 Theseus.X</h3>
<p>The browser that speaks BCNR natively — Chromium build with the resolver baked in, <p>The browser that speaks BCNR natively — Chromium build with the resolver baked in,
no OS-level daemon or root-store install.</p> no OS-level daemon or root-store install.</p>
<div class="cta"><a class="btn ghost" href="./theseus/">Learn more →</a></div> <div class="cta"><a class="btn ghost" href="./theseus">Learn more →</a></div>
</div> </div>
<div class="card"> <div class="card">
<h3><span class="dot d-srv"></span> 🔥 Hephaestus.X</h3> <h3><span class="dot d-srv"></span> 🔥 Hephaestus.X</h3>

View file

@ -666,7 +666,7 @@ function paintSell() {
st.className = "status ok"; st.textContent = "This name is listed on the market."; st.className = "status ok"; st.textContent = "This name is listed on the market.";
$("sell-form").classList.add("hidden"); $("sell-active").classList.remove("hidden"); $("sell-form").classList.add("hidden"); $("sell-active").classList.remove("hidden");
const p = BigInt(activeListing.price_sats); const p = BigInt(activeListing.price_sats);
$("sell-kv").innerHTML = [["Price", `${fmtInt(p)} sat (≈ ${esc(fmtUsd(Math.round(Number(p) / RATE() * 100) / 100))})`], ["Listed", esc(new Date(activeListing.created_at).toLocaleString())], ["Offer", `<code>${esc(activeListing.partial_tx.slice(0, 40))}…</code>`], ["Market page", `<a href="./market.html" target="_blank" rel="noopener">open →</a>`]] $("sell-kv").innerHTML = [["Price", `${fmtInt(p)} sat (≈ ${esc(fmtUsd(Math.round(Number(p) / RATE() * 100) / 100))})`], ["Listed", esc(new Date(activeListing.created_at).toLocaleString())], ["Offer", `<code>${esc(activeListing.partial_tx.slice(0, 40))}…</code>`], ["Market page", `<a href="./market/" target="_blank" rel="noopener">open →</a>`]]
.map(([k, v]) => `<div class="k">${k}</div><div class="v">${v}</div>`).join(""); .map(([k, v]) => `<div class="k">${k}</div><div class="v">${v}</div>`).join("");
} else { } else {
st.className = "status"; st.textContent = "Not for sale. Set a price to list it."; st.className = "status"; st.textContent = "Not for sale. Set a price to list it.";

View file

@ -22,7 +22,7 @@
(function () { (function () {
var STORE = "sirius-lang"; var STORE = "sirius-lang";
var CACHE = "sirius-i18n:"; var CACHE = "sirius-i18n:";
var VERSION = "20260920d"; // bump when dictionaries change var VERSION = "20260920e"; // bump when dictionaries change
var LANGS = { var LANGS = {
en: "English", en: "English",
de: "Deutsch", de: "Deutsch",

View file

@ -24,7 +24,7 @@
mount.innerHTML = ` mount.innerHTML = `
<div class="cols"> <div class="cols">
<div class="brand-col"> <div class="brand-col">
<div class="mark"></div> <div class="mark"><svg width="56" height="56" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg></div>
<h4>Sirius<span class="g">.X</span></h4> <h4>Sirius<span class="g">.X</span></h4>
<p>The home for names on Bitcoin Cash. Register a TLD, register a name, verify anything against the chain.</p> <p>The home for names on Bitcoin Cash. Register a TLD, register a name, verify anything against the chain.</p>
</div> </div>
@ -33,7 +33,7 @@
<ul> <ul>
<li><a href="${s("#search-input")}"> Register a name</a></li> <li><a href="${s("#search-input")}"> Register a name</a></li>
<li><a href="${s("tld.html")}">🌐 Register a TLD</a></li> <li><a href="${s("tld.html")}">🌐 Register a TLD</a></li>
<li><a href="${s("market.html")}">🛒 Names for sale</a></li> <li><a href="${s("market/")}">🛒 Names for sale</a></li>
<li><a href="${s("portal.html")}">🔑 My names portal</a></li> <li><a href="${s("portal.html")}">🔑 My names portal</a></li>
<li><a href="${s("theseus/")}">🧭 Theseus browser</a></li> <li><a href="${s("theseus/")}">🧭 Theseus browser</a></li>
</ul> </ul>

View file

@ -15,28 +15,64 @@
var initial = saved === "ubuntu" ? "ubuntu" : "fraunces"; var initial = saved === "ubuntu" ? "ubuntu" : "fraunces";
if (initial === "ubuntu") document.documentElement.setAttribute("data-font-cmp", "ubuntu"); if (initial === "ubuntu") document.documentElement.setAttribute("data-font-cmp", "ubuntu");
// Inject the picker into the topnav's right side when one exists. // Inject the picker's own base + positioning styles once, so pages
// Falls back to a fixed-position pill (bottom-right) for pages without // that never declared `.font-picker` in their stylesheet still render
// a topnav, so the choice is always available. // the widget correctly (previously the toggle appeared as raw browser
// buttons on pages that forgot to copy the CSS block). The styles are
// scoped to `.font-picker-float` so pages that DO define their own
// `.font-picker` styling win via source-order (this block runs first).
(function ensureStyles() {
if (document.getElementById("sirius-font-picker-style")) return;
var css =
// Every dimension is reset explicitly (bottom/left/height/width auto,
// margin 0, line-height 1) so this block wins over any per-page
// `.font-picker`/`.font-picker-float` styling — earlier pages declared
// .font-picker-float with bottom:20px, which combined with top:56px
// stretched the pill down the full viewport height.
".font-picker-float{" +
"position:fixed !important;top:56px !important;right:20px !important;" +
"bottom:auto !important;left:auto !important;" +
"height:auto !important;width:auto !important;margin:0 !important;" +
"z-index:30 !important;" +
"display:inline-flex !important;align-items:center;gap:2px;padding:2px !important;" +
"background:rgba(11,14,20,.82) !important;border:1px solid rgba(255,255,255,.08) !important;" +
"border-radius:999px !important;backdrop-filter:blur(10px);" +
"box-shadow:0 6px 20px rgba(0,0,0,.35);" +
"font-family:'JetBrains Mono',ui-monospace,monospace !important;" +
"font-size:10px !important;line-height:1 !important;" +
"letter-spacing:.12em !important;text-transform:uppercase !important" +
"}" +
".font-picker-float button{" +
"background:transparent !important;border:none !important;color:#6a7488 !important;" +
"padding:4px 10px !important;margin:0 !important;border-radius:999px !important;cursor:pointer;" +
"font-family:inherit !important;font-size:inherit !important;line-height:1 !important;" +
"letter-spacing:inherit !important;" +
"text-transform:inherit !important;transition:color .12s" +
"}" +
".font-picker-float button:hover{color:#f1f4fa !important}" +
".font-picker-float button.active{background:#d6ff3d !important;color:#050810 !important;font-weight:600 !important}" +
"@media (max-width:520px){.font-picker-float{top:auto !important;bottom:14px !important;right:14px !important}}";
var el = document.createElement("style");
el.id = "sirius-font-picker-style";
el.textContent = css;
document.head.appendChild(el);
})();
// Mount the picker as a floating pill in the page's top-right corner,
// just under the sticky nav's sign-in button. Was previously injected
// inline in the topnav; that placement crowded the nav on narrow
// viewports and left users hunting for the toggle. A fixed-position
// widget keeps the choice equally reachable on every page — including
// ones without a topnav — and does not participate in nav layout.
function paintPicker() { function paintPicker() {
var nav = document.querySelector(".topnav");
var host = nav || document.body;
var mount = document.createElement("div"); var mount = document.createElement("div");
mount.className = "font-picker"; mount.className = "font-picker font-picker-float";
mount.setAttribute("role", "group"); mount.setAttribute("role", "group");
mount.setAttribute("aria-label", "Reading font"); mount.setAttribute("aria-label", "Reading font");
mount.innerHTML = mount.innerHTML =
'<button data-font="fraunces" title="Silent Mode family (Fraunces)">Fraunces</button>' + '<button data-font="fraunces" title="Silent Mode family (Fraunces)">Fraunces</button>' +
'<button data-font="ubuntu" title="Bitcoin Cash brand font (Ubuntu)">Ubuntu</button>'; '<button data-font="ubuntu" title="Bitcoin Cash brand font (Ubuntu)">Ubuntu</button>';
if (nav) { document.body.appendChild(mount);
// Put it just before the sign-in link if present, else append.
var portalLink = nav.querySelector("a.portal");
if (portalLink) nav.insertBefore(mount, portalLink);
else nav.appendChild(mount);
} else {
mount.classList.add("font-picker-float");
host.appendChild(mount);
}
var btns = mount.querySelectorAll("button"); var btns = mount.querySelectorAll("button");
function refresh(v) { function refresh(v) {
for (var i = 0; i < btns.length; i++) { for (var i = 0; i < btns.length; i++) {

View file

@ -1,138 +1,7 @@
<!doctype html> <!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <title>Sirius.X market</title>
<title>Market — names for sale on Sirius.X</title> <link rel="canonical" href="./market">
<meta name="description" content="Buy and sell BCNR names. Every sale is one Bitcoin Cash transaction: the seller is paid in the same transaction that hands you the certificate, or not at all."> <meta http-equiv="refresh" content="0; url=./market/">
<link rel="icon" href="./assets/favicon.svg" type="image/svg+xml"> <script>location.replace("./market/" + location.search + location.hash);</script>
<link rel="preconnect" href="https://fonts.googleapis.com"> <p>Moved to <a href="./market">./market/</a>.</p>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root{--bg:#050810;--panel:#141a24;--panel2:#0a0f1c;--line:rgba(255,255,255,.06);--sky-mid:#0a0f1c;--sky-rim:#131a2a;
--ink:#f1f4fa;--mut:#b8c2d4;--dim:#6a7488;--acid:#d6ff3d;--ok:#4fd1a5;--taken:#f6768a;--warn:#ffc75f;
--serif:'Fraunces',Georgia,serif;--sans:'DM Sans',system-ui,sans-serif;--mono:'JetBrains Mono',ui-monospace,monospace}
*{box-sizing:border-box}
body{margin:0;background:radial-gradient(ellipse 1200px 600px at 50% -5%,var(--sky-rim) 0%,transparent 60%),var(--bg);background-attachment:fixed;color:var(--ink);font:15px/1.55 var(--sans);min-height:100vh}
h1,h2,h3{font-family:var(--serif)}
a{color:var(--acid)}
.topnav{position:sticky;top:0;z-index:20;display:flex;gap:2px;align-items:center;flex-wrap:wrap;padding:10px 1.2rem;background:rgba(11,14,20,.82);backdrop-filter:blur(10px)}
.topnav .brand{font-weight:600;color:var(--ink);text-decoration:none;margin-right:14px;font-size:15px}
.topnav .brand .g{color:var(--acid)}
.topnav a{color:var(--mut);text-decoration:none;padding:6px 12px;border-radius:8px;font-size:14px}
.topnav a:hover{color:var(--ink);background:var(--panel)}
.topnav a.here{color:var(--acid);background:rgba(214,255,61,.08)}
.topnav a.portal{margin-left:auto;background:rgba(214,255,61,.10);color:var(--acid);font-weight:500}
.wrap{max-width:900px;margin:0 auto;padding:0 1.2rem 3rem}
header.hero{text-align:center;padding:3rem 1.2rem 1rem}
.mark{font-size:44px;line-height:1}
h1{font-size:clamp(1.6rem,4.5vw,2.2rem);margin:.3rem 0}
h1 .g{color:var(--acid)}
.tag{color:var(--mut);max-width:620px;margin:0 auto}
.toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:18px 0 8px}
input[type=text],select{padding:9px 12px;border-radius:10px;border:1px solid #ffffff22;background:#0e131b;color:var(--ink);font:inherit;font-size:14px;outline:none}
select{appearance:auto}
.status{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px 14px;font-size:13px;color:var(--mut);margin-top:10px}
.status.err{border-left:3px solid var(--taken);color:var(--taken)}
.row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px 16px;align-items:center;padding:14px 16px;background:var(--panel2);border:1px solid var(--line);border-radius:12px;margin-top:8px}
.row .n{font-family:var(--mono);font-size:16px}
.row .n .tld{color:var(--acid)}
.row .price{font-family:var(--mono);text-align:right}
.row .price b{font-size:16px}
.row .price span{display:block;color:var(--dim);font-size:12px}
.row .meta{grid-column:1/-1;color:var(--dim);font-size:12px;display:flex;gap:10px;flex-wrap:wrap}
.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border-radius:10px;background:#4b7bec;color:#fff;font:inherit;font-size:14px;border:none;cursor:pointer;text-decoration:none;line-height:1.2}
.btn.acid{background:var(--acid);color:#0b0e14;font-weight:600}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--ink)}
.btn.small{padding:6px 11px;font-size:12.5px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.badge{display:inline-block;font-size:11px;padding:2px 9px;border-radius:999px;font-weight:600;background:rgba(214,255,61,.14);color:var(--acid)}
.empty{padding:28px;text-align:center;color:var(--mut);border:1px dashed var(--line);border-radius:12px;margin-top:10px}
.empty.big{padding:40px 24px;border-style:solid;background:var(--panel2)}
.empty.big .ico{font-size:34px;line-height:1;opacity:.8}
.empty.big h3{margin:.6rem 0 .3rem;font-family:var(--serif);font-size:1.25rem;color:var(--ink)}
.empty.big p{margin:0 auto;max-width:460px;font-size:14px}
.empty.big .cta{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:18px}
.toolbar[hidden],.status[hidden]{display:none}
@media (max-width:560px){.row > div:nth-child(3){grid-column:1/-1}.row > div:nth-child(3) .btn{width:100%;justify-content:center}}
.note{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--acid);border-radius:10px;padding:14px 18px;color:var(--mut);font-size:14px;margin-top:1.6rem}
.note b{color:var(--ink)}
/* buy dialog */
.modal{position:fixed;inset:0;background:rgba(6,9,14,.85);backdrop-filter:blur(3px);display:none;align-items:flex-start;justify-content:center;padding:4vh 1rem;overflow-y:auto;z-index:50}
.modal.open{display:flex}
.sheet{background:var(--panel);border:1px solid var(--line);border-radius:16px;max-width:560px;width:100%;padding:24px 26px;position:relative}
.sheet h3{margin:0 0 .3rem;font-family:var(--mono);font-size:1.2rem}
.sheet .sub{color:var(--mut);font-size:13px;margin:0 0 1rem}
.sheet .x{position:absolute;top:14px;right:16px;background:none;border:none;color:var(--dim);font-size:22px;cursor:pointer}
.kv{display:grid;grid-template-columns:150px 1fr;gap:6px 12px;font-size:13.5px}
.kv .k{color:var(--dim)} .kv .v{font-family:var(--mono);word-break:break-all}
.steps{margin-top:12px;font-family:var(--mono);font-size:12px;color:var(--mut);background:#0e131b;border:1px solid var(--line);border-radius:8px;padding:10px 12px;max-height:150px;overflow:auto;display:none}
.steps.on{display:block}
.steps div::before{content:" ";color:var(--acid)}
.msg{font-size:13px;margin-top:12px} .msg.err{color:var(--taken)} .msg.ok{color:var(--ok)}
.actions{display:flex;gap:10px;justify-content:flex-end;margin-top:16px}
footer{border-top:1px solid var(--line);padding:2rem 0 3rem;color:var(--dim);font-size:13px;text-align:center;margin-top:2.5rem}
@media (max-width:560px){.row{grid-template-columns:1fr auto}.row .price{grid-column:1/-1;text-align:left}}
</style>
<script src="./js/i18n.js?v=20260920d"></script>
</head>
<body>
<nav class="topnav">
<a class="brand" href="./"><span class="g">Sirius.X</span></a>
<a href="./#try">Try it</a>
<a href="./#search-input">✏️ Register</a>
<a href="./tld.html">🌐 TLD</a>
<a href="./market.html" class="here">🛒 Market</a>
<a href="./theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a>
<a href="./portal.html" class="portal">🔑 Sign in</a>
</nav>
<header class="hero">
<div class="mark">🛒</div>
<h1>Names <span class="g">for sale</span></h1>
<p class="tag">Every sale is a single Bitcoin Cash transaction. The seller signed an offer that pays them only when the
certificate moves to you — you add your coins, sign, broadcast. No escrow, no middleman, no way for either side to cheat.</p>
</header>
<div class="wrap">
<div class="toolbar">
<input type="text" id="q" placeholder="Filter names…" autocomplete="off" style="max-width:300px">
<select id="sort"><option value="price">Sort: price</option><option value="name">Sort: name</option><option value="new">Sort: newest</option></select>
<select id="tld"><option value="">All TLDs</option></select>
<span id="count" style="color:var(--dim);font-size:12.5px"></span>
</div>
<div class="status" id="status">Loading listings…</div>
<div id="list"></div>
<div class="note"><b>Selling a name?</b> Open it in your <a href="./portal.html">dashboard</a>, choose <b>Sell</b>, set a price. The listing is a signed offer stored by the gateway; cancelling it moves your certificate once so the old offer can never be used.</div>
</div>
<div class="modal" id="buy">
<div class="sheet">
<button class="x" id="buy-close" title="close">×</button>
<h3 id="buy-name"></h3>
<p class="sub">One transaction: your coins pay the seller, the certificate lands in your wallet, and the registry is told about the new owner. Records stay as they are — you can change them in the dashboard right after.</p>
<div class="kv" id="buy-kv"></div>
<div class="steps" id="buy-steps"></div>
<div class="msg" id="buy-msg"></div>
<div class="actions">
<button class="btn ghost" id="buy-cancel">Cancel</button>
<a class="btn ghost" id="buy-signin" href="./portal.html" hidden>Sign in to buy →</a>
<button class="btn acid" id="buy-go" disabled>Buy — sign &amp; broadcast</button>
</div>
</div>
</div>
<footer id="site-footer"></footer>
<script type="importmap">
{ "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js" } }
</script>
<script src="./js/session.js?v=20260917dash"></script>
<script src="./js/pricing.js?v=20260917market"></script>
<script type="module" src="./js/market.js?v=20260920m"></script>
<script defer src="./js/theme.js?v=20260910font"></script>
<script defer src="./js/site-footer.js?v=20260917market"></script>
<script defer src="./js/profile-menu.js?v=20260920m"></script>
</body>
</html>

161
market/index.html Normal file
View file

@ -0,0 +1,161 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Market — names for sale on Sirius.X</title>
<meta name="description" content="Buy and sell BCNR names. Every sale is one Bitcoin Cash transaction: the seller is paid in the same transaction that hands you the certificate, or not at all.">
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root{--bg:#050810;--panel:#141a24;--panel2:#0a0f1c;--line:rgba(255,255,255,.06);--sky-mid:#0a0f1c;--sky-rim:#131a2a;
--ink:#f1f4fa;--mut:#b8c2d4;--dim:#6a7488;--acid:#d6ff3d;--ok:#4fd1a5;--taken:#f6768a;--warn:#ffc75f;
--serif:'Fraunces',Georgia,serif;--sans:'DM Sans',system-ui,sans-serif;--mono:'JetBrains Mono',ui-monospace,monospace}
*{box-sizing:border-box}
body{margin:0;background:radial-gradient(ellipse 1200px 600px at 50% -5%,var(--sky-rim) 0%,transparent 60%),var(--bg);background-attachment:fixed;color:var(--ink);font:15px/1.55 var(--sans);min-height:100vh}
h1,h2,h3{font-family:var(--serif)}
a{color:var(--acid)}
/* Ubuntu reader-alt — swap when <html data-font-cmp="ubuntu"> */
html[data-font-cmp="ubuntu"] body,
html[data-font-cmp="ubuntu"] h1, html[data-font-cmp="ubuntu"] h2, html[data-font-cmp="ubuntu"] h3,
html[data-font-cmp="ubuntu"] p, html[data-font-cmp="ubuntu"] a, html[data-font-cmp="ubuntu"] button,
html[data-font-cmp="ubuntu"] span, html[data-font-cmp="ubuntu"] div,
html[data-font-cmp="ubuntu"] label, html[data-font-cmp="ubuntu"] input, html[data-font-cmp="ubuntu"] li{
font-family:'Ubuntu',system-ui,sans-serif !important
}
html[data-font-cmp="ubuntu"] code, html[data-font-cmp="ubuntu"] .mono{
font-family:var(--mono) !important
}
/* Font picker pill — floats in the top-right corner of the page,
just under the sticky nav's sign-in button. */
.font-picker{display:inline-flex;align-items:center;gap:2px;padding:2px;
background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:999px;
font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase}
.font-picker button{background:transparent;border:none;color:var(--dim);
padding:4px 10px;border-radius:999px;cursor:pointer;font-family:inherit;font-size:inherit;
letter-spacing:inherit;text-transform:inherit;transition:color .12s}
.font-picker button:hover{color:var(--ink)}
.font-picker button.active{background:var(--acid);color:var(--bg);font-weight:600}
.font-picker-float{position:fixed;top:56px;right:20px;z-index:30;
background:rgba(11,14,20,.82);backdrop-filter:blur(10px);box-shadow:0 6px 20px rgba(0,0,0,.35)}
.topnav{position:sticky;top:0;z-index:20;display:flex;gap:2px;align-items:center;flex-wrap:wrap;padding:10px 1.2rem;background:rgba(11,14,20,.82);backdrop-filter:blur(10px)}
.topnav .brand{font-weight:600;color:var(--ink);text-decoration:none;margin-right:14px;font-size:15px}
.topnav .brand .g{color:var(--acid)}
.topnav a{color:var(--mut);text-decoration:none;padding:6px 12px;border-radius:8px;font-size:14px}
.topnav a:hover{color:var(--ink);background:var(--panel)}
.topnav a.here{color:var(--acid);background:rgba(214,255,61,.08)}
.topnav a.portal{margin-left:auto;background:rgba(214,255,61,.10);color:var(--acid);font-weight:500}
.wrap{max-width:900px;margin:0 auto;padding:0 1.2rem 3rem}
header.hero{text-align:center;padding:3rem 1.2rem 1rem}
.mark{font-size:44px;line-height:1}
h1{font-size:clamp(1.6rem,4.5vw,2.2rem);margin:.3rem 0}
h1 .g{color:var(--acid)}
.tag{color:var(--mut);max-width:620px;margin:0 auto}
.toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:18px 0 8px}
input[type=text],select{padding:9px 12px;border-radius:10px;border:1px solid #ffffff22;background:#0e131b;color:var(--ink);font:inherit;font-size:14px;outline:none}
select{appearance:auto}
.status{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px 14px;font-size:13px;color:var(--mut);margin-top:10px}
.status.err{border-left:3px solid var(--taken);color:var(--taken)}
.row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px 16px;align-items:center;padding:14px 16px;background:var(--panel2);border:1px solid var(--line);border-radius:12px;margin-top:8px}
.row .n{font-family:var(--mono);font-size:16px}
.row .n .tld{color:var(--acid)}
.row .price{font-family:var(--mono);text-align:right}
.row .price b{font-size:16px}
.row .price span{display:block;color:var(--dim);font-size:12px}
.row .meta{grid-column:1/-1;color:var(--dim);font-size:12px;display:flex;gap:10px;flex-wrap:wrap}
.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border-radius:10px;background:#4b7bec;color:#fff;font:inherit;font-size:14px;border:none;cursor:pointer;text-decoration:none;line-height:1.2}
.btn.acid{background:var(--acid);color:#0b0e14;font-weight:600}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--ink)}
.btn.small{padding:6px 11px;font-size:12.5px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.badge{display:inline-block;font-size:11px;padding:2px 9px;border-radius:999px;font-weight:600;background:rgba(214,255,61,.14);color:var(--acid)}
.empty{padding:28px;text-align:center;color:var(--mut);border:1px dashed var(--line);border-radius:12px;margin-top:10px}
.empty.big{padding:40px 24px;border-style:solid;background:var(--panel2)}
.empty.big .ico{font-size:34px;line-height:1;opacity:.8}
.empty.big h3{margin:.6rem 0 .3rem;font-family:var(--serif);font-size:1.25rem;color:var(--ink)}
.empty.big p{margin:0 auto;max-width:460px;font-size:14px}
.empty.big .cta{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:18px}
.toolbar[hidden],.status[hidden]{display:none}
@media (max-width:560px){.row > div:nth-child(3){grid-column:1/-1}.row > div:nth-child(3) .btn{width:100%;justify-content:center}}
.note{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--acid);border-radius:10px;padding:14px 18px;color:var(--mut);font-size:14px;margin-top:1.6rem}
.note b{color:var(--ink)}
/* buy dialog */
.modal{position:fixed;inset:0;background:rgba(6,9,14,.85);backdrop-filter:blur(3px);display:none;align-items:flex-start;justify-content:center;padding:4vh 1rem;overflow-y:auto;z-index:50}
.modal.open{display:flex}
.sheet{background:var(--panel);border:1px solid var(--line);border-radius:16px;max-width:560px;width:100%;padding:24px 26px;position:relative}
.sheet h3{margin:0 0 .3rem;font-family:var(--mono);font-size:1.2rem}
.sheet .sub{color:var(--mut);font-size:13px;margin:0 0 1rem}
.sheet .x{position:absolute;top:14px;right:16px;background:none;border:none;color:var(--dim);font-size:22px;cursor:pointer}
.kv{display:grid;grid-template-columns:150px 1fr;gap:6px 12px;font-size:13.5px}
.kv .k{color:var(--dim)} .kv .v{font-family:var(--mono);word-break:break-all}
.steps{margin-top:12px;font-family:var(--mono);font-size:12px;color:var(--mut);background:#0e131b;border:1px solid var(--line);border-radius:8px;padding:10px 12px;max-height:150px;overflow:auto;display:none}
.steps.on{display:block}
.steps div::before{content:" ";color:var(--acid)}
.msg{font-size:13px;margin-top:12px} .msg.err{color:var(--taken)} .msg.ok{color:var(--ok)}
.actions{display:flex;gap:10px;justify-content:flex-end;margin-top:16px}
footer{border-top:1px solid var(--line);padding:2rem 0 3rem;color:var(--dim);font-size:13px;text-align:center;margin-top:2.5rem}
@media (max-width:560px){.row{grid-template-columns:1fr auto}.row .price{grid-column:1/-1;text-align:left}}
</style>
<script src="../js/i18n.js?v=20260920e"></script>
</head>
<body>
<nav class="topnav">
<a class="brand" href="../"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="../#try">Try it</a>
<a href="../#search-input">✏️ Register</a>
<a href="../tld.html">🌐 TLD</a>
<a href="./" class="here">🛒 Market</a>
<a href="../theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a>
<a href="../portal.html" class="portal">🔑 Sign in</a>
</nav>
<header class="hero">
<div class="mark">🛒</div>
<h1>Names <span class="g">for sale</span></h1>
<p class="tag">Every sale is a single Bitcoin Cash transaction. The seller signed an offer that pays them only when the
certificate moves to you — you add your coins, sign, broadcast. No escrow, no middleman, no way for either side to cheat.</p>
</header>
<div class="wrap">
<div class="toolbar">
<input type="text" id="q" placeholder="Filter names…" autocomplete="off" style="max-width:300px">
<select id="sort"><option value="price">Sort: price</option><option value="name">Sort: name</option><option value="new">Sort: newest</option></select>
<select id="tld"><option value="">All TLDs</option></select>
<span id="count" style="color:var(--dim);font-size:12.5px"></span>
</div>
<div class="status" id="status">Loading listings…</div>
<div id="list"></div>
<div class="note"><b>Selling a name?</b> Open it in your <a href="../portal.html">dashboard</a>, choose <b>Sell</b>, set a price. The listing is a signed offer stored by the gateway; cancelling it moves your certificate once so the old offer can never be used.</div>
</div>
<div class="modal" id="buy">
<div class="sheet">
<button class="x" id="buy-close" title="close">×</button>
<h3 id="buy-name"></h3>
<p class="sub">One transaction: your coins pay the seller, the certificate lands in your wallet, and the registry is told about the new owner. Records stay as they are — you can change them in the dashboard right after.</p>
<div class="kv" id="buy-kv"></div>
<div class="steps" id="buy-steps"></div>
<div class="msg" id="buy-msg"></div>
<div class="actions">
<button class="btn ghost" id="buy-cancel">Cancel</button>
<a class="btn ghost" id="buy-signin" href="../portal.html" hidden>Sign in to buy →</a>
<button class="btn acid" id="buy-go" disabled>Buy — sign &amp; broadcast</button>
</div>
</div>
</div>
<footer id="site-footer"></footer>
<script type="importmap">
{ "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js" } }
</script>
<script src="../js/session.js?v=20260917dash"></script>
<script src="../js/pricing.js?v=20260917market"></script>
<script type="module" src="../js/market.js?v=20260920m"></script>
<script defer src="../js/theme.js?v=20260920compact"></script>
<script defer src="../js/site-footer.js?v=20260917market"></script>
<script defer src="../js/profile-menu.js?v=20260920m"></script>
</body>
</html>

View file

@ -259,17 +259,17 @@
.addrow{grid-template-columns:1fr 1fr} .addrow{grid-template-columns:1fr 1fr}
} }
</style> </style>
<script src="./js/i18n.js?v=20260920d"></script> <script src="./js/i18n.js?v=20260920e"></script>
</head> </head>
<body> <body>
<nav class="topnav"> <nav class="topnav">
<a class="brand" href="./"><span class="g">Sirius.X</span></a> <a class="brand" href="./"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="./#try">Try it</a> <a href="./#try">Try it</a>
<a href="./#search-input">✏️ Register</a> <a href="./#search-input">✏️ Register</a>
<a href="./tld.html">🌐 TLD</a> <a href="./tld.html">🌐 TLD</a>
<a href="./market.html">🛒 Market</a> <a href="./market">🛒 Market</a>
<a href="./theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a> <a href="./theseus"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a>
<a href="./portal.html" class="portal here">🔑 Sign in</a> <a href="./portal.html" class="portal here">🔑 Sign in</a>
</nav> </nav>
@ -306,7 +306,7 @@
<button class="item" data-go="tlds"><span class="ic">🏷</span>My TLDs<span class="cnt" id="cnt-tlds">0</span></button> <button class="item" data-go="tlds"><span class="ic">🏷</span>My TLDs<span class="cnt" id="cnt-tlds">0</span></button>
<div class="sep"></div> <div class="sep"></div>
<button class="item" data-go="settings"><span class="ic"></span>Settings</button> <button class="item" data-go="settings"><span class="ic"></span>Settings</button>
<a class="item hidden" id="side-admin" href="./admin/"><span class="ic">🛠</span>Admin panel</a> <a class="item hidden" id="side-admin" href="./admin"><span class="ic">🛠</span>Admin panel</a>
<button class="item" id="side-signout"><span class="ic">🚪</span>Sign out</button> <button class="item" id="side-signout"><span class="ic">🚪</span>Sign out</button>
</aside> </aside>
@ -359,7 +359,7 @@
<div class="sub" data-sub="sell" hidden> <div class="sub" data-sub="sell" hidden>
<div class="card" style="margin-top:0"> <div class="card" style="margin-top:0">
<h3>Sell this name</h3> <h3>Sell this name</h3>
<p class="hint">You sign an offer once: "whoever pays me this price gets the certificate". The offer is stored by the gateway and shown on the <a href="./market.html" target="_blank" rel="noopener">market</a>. A buyer completes it in one transaction — you are paid in the same transaction that moves the name, or not at all. No escrow, nothing to trust.</p> <p class="hint">You sign an offer once: "whoever pays me this price gets the certificate". The offer is stored by the gateway and shown on the <a href="./market" target="_blank" rel="noopener">market</a>. A buyer completes it in one transaction — you are paid in the same transaction that moves the name, or not at all. No escrow, nothing to trust.</p>
<div class="status" id="sell-status">Checking the market…</div> <div class="status" id="sell-status">Checking the market…</div>
<div id="sell-form"> <div id="sell-form">
<div class="row" style="align-items:flex-end"> <div class="row" style="align-items:flex-end">
@ -602,7 +602,7 @@
</div> </div>
<div class="card"> <div class="card">
<h3>Reading, language &amp; help</h3> <h3>Reading, language &amp; help</h3>
<p class="hint">Font pill and language picker live in the top bar; both are remembered per browser. The technical documentation is at <a href="./docs/" target="_blank" rel="noopener">sirius-x/docs</a>.</p> <p class="hint">Font pill and language picker live in the top bar; both are remembered per browser. The technical documentation is at <a href="./docs" target="_blank" rel="noopener">sirius-x/docs</a>.</p>
</div> </div>
<div class="card"> <div class="card">
<h3>This device</h3> <h3>This device</h3>
@ -679,7 +679,7 @@
<script src="./js/pin-escrow.js?v=20260909pin"></script> <script src="./js/pin-escrow.js?v=20260909pin"></script>
<script src="./js/pricing.js?v=20260917market"></script> <script src="./js/pricing.js?v=20260917market"></script>
<script type="module" src="./js/dashboard.js?v=20260917bal"></script> <script type="module" src="./js/dashboard.js?v=20260917bal"></script>
<script defer src="./js/theme.js?v=20260910font"></script> <script defer src="./js/theme.js?v=20260920compact"></script>
<script defer src="./js/site-footer.js?v=20260917market"></script> <script defer src="./js/site-footer.js?v=20260917market"></script>
<script type="module" src="./js/register-flow.js?v=20260917bal"></script> <script type="module" src="./js/register-flow.js?v=20260917bal"></script>
<script defer src="./js/profile-menu.js?v=20260920m"></script> <script defer src="./js/profile-menu.js?v=20260920m"></script>

View file

@ -32,7 +32,7 @@
</head> </head>
<body> <body>
<div> <div>
<div class="mark"></div> <div class="mark"><svg width="56" height="56" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg></div>
<p>Redirecting to <a href="./">Sirius.X</a></p> <p>Redirecting to <a href="./">Sirius.X</a></p>
<p style="font-size:12.5px;color:#5e6678;margin-top:1rem">Name search moved to the home page.</p> <p style="font-size:12.5px;color:#5e6678;margin-top:1rem">Name search moved to the home page.</p>
</div> </div>

578
storage/index.html Normal file
View file

@ -0,0 +1,578 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Storage — Sirius.X (wireframe)</title>
<meta name="description" content="Wireframe for the Sirius.X portal Storage tab. Per-user Sia storage on Hephaestus. Not wired to a backend.">
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
<link rel="mask-icon" href="../assets/favicon.svg" color="#d6ff3d">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600;9..144,700&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root{
--bg:#050810; --panel:#141a24; --panel2:#0a0f1c; --line:rgba(255,255,255,.06);
--sky-mid:#0a0f1c; --sky-rim:#131a2a;
--ink:#f1f4fa; --mut:#b8c2d4; --dim:#6a7488; --acid:#d6ff3d;
--chain-native:#0AC18E; --forge:#ff8c00;
--ok:#4fd1a5; --taken:#f6768a; --warn:#ffc75f;
--serif:'Fraunces',Georgia,serif;
--sans:'DM Sans','Inter',system-ui,sans-serif;
--mono:'JetBrains Mono',ui-monospace,monospace;
}
*{box-sizing:border-box}
body{margin:0;
background:radial-gradient(ellipse 1200px 600px at 50% -5%,var(--sky-rim) 0%,transparent 60%),
radial-gradient(ellipse 900px 500px at 100% 100%,var(--sky-mid) 0%,transparent 55%),
radial-gradient(ellipse 900px 500px at 0% 100%,#0c1424 0%,transparent 55%),
var(--bg);
background-attachment:fixed;
color:var(--ink);font:15px/1.55 var(--sans);min-height:100vh;font-feature-settings:"ss01","ss02"}
h1,h2,h3{font-family:var(--serif);font-feature-settings:"ss01","ss02"}
code,.mono{font-family:var(--mono)}
a{color:var(--acid);text-decoration:none}
/* topnav (matches portal) */
.topnav{position:sticky;top:0;z-index:20;display:flex;gap:2px;align-items:center;flex-wrap:wrap;
padding:10px 1.2rem;background:rgba(11,14,20,.82);backdrop-filter:blur(10px)}
.topnav .brand{font-weight:600;color:var(--ink);text-decoration:none;margin-right:14px;font-size:15px;letter-spacing:.2px}
.topnav .brand .g{color:var(--acid)}
.topnav a{color:var(--mut);text-decoration:none;padding:6px 12px;border-radius:8px;font-size:14px}
.topnav a:hover{color:var(--ink);background:var(--panel)}
.topnav a.here{color:var(--acid);background:rgba(214,255,61,.08)}
.topnav a.portal{margin-left:auto;background:rgba(214,255,61,.10);color:var(--acid);font-weight:500}
/* dashboard shell */
.dash{display:grid;grid-template-columns:236px minmax(0,1fr);gap:26px;max-width:1200px;margin:0 auto;padding:1.4rem 1.2rem 3rem}
@media (min-width:1280px){
.dash{max-width:1720px;grid-template-columns:260px minmax(0,1fr);gap:34px;padding:1.6rem 2rem 3rem}
}
@media (max-width:800px){
.dash{grid-template-columns:1fr;gap:14px}
.side{position:static}
}
.side{position:sticky;top:68px;align-self:start;display:flex;flex-direction:column;gap:4px}
.side .who{padding:12px 14px;border-radius:12px;background:var(--panel);border:1px solid var(--line);margin-bottom:8px}
.side .who .lbl{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim)}
.side .who .addr{font-family:var(--mono);font-size:12px;color:var(--ink);word-break:break-all;margin-top:4px}
.side .who .net{font-size:11.5px;color:var(--dim);margin-top:4px}
.side .grp{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim);padding:12px 14px 4px}
.side .sep{height:1px;background:var(--line);margin:8px 6px}
.side button.item,.side a.item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:9px 12px;border-radius:10px;
background:transparent;border:1px solid transparent;color:var(--mut);font:inherit;font-size:14px;cursor:pointer;text-decoration:none;transition:all .12s}
.side .item .ic{width:20px;text-align:center;flex:none;opacity:.9}
.side .item .cnt{margin-left:auto;font-family:var(--mono);font-size:11px;padding:1px 7px;border-radius:999px;background:rgba(255,255,255,.08);color:var(--ink)}
.side .item:hover{color:var(--ink);background:rgba(255,255,255,.04)}
.side .item.active{color:var(--acid);background:rgba(214,255,61,.08);border-color:rgba(214,255,61,.18)}
.side .item.active .cnt{background:rgba(214,255,61,.2);color:var(--acid)}
/* content shared */
.content{min-width:0}
.ph{display:flex;flex-wrap:wrap;gap:14px;justify-content:space-between;align-items:flex-start;margin-bottom:14px}
.ph h2{font-size:1.35rem;margin:0}
.ph p{color:var(--mut);margin:.3rem 0 0;max-width:640px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px 22px}
.card + .card{margin-top:14px}
.btn{display:inline-flex;align-items:center;gap:6px;text-decoration:none;padding:9px 16px;border-radius:10px;background:#4b7bec;color:#fff;font-size:14px;border:none;cursor:pointer;font-family:inherit;line-height:1.2}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--ink)}
.btn.acid{background:var(--acid);color:#0b0e14;font-weight:600}
.btn.danger{background:rgba(246,118,138,.14);color:var(--taken);border:1px solid rgba(246,118,138,.35)}
.btn.small{padding:6px 11px;font-size:12.5px}
.btn:hover{filter:brightness(1.12)}
.btn:disabled{opacity:.45;cursor:not-allowed;filter:none}
.badge{display:inline-block;font-size:11px;padding:2px 9px;border-radius:999px;font-weight:600;line-height:1.6}
.b-x{background:rgba(214,255,61,.14);color:var(--acid)}
.b-warn{background:rgba(255,199,95,.14);color:var(--warn)}
.b-ok{background:rgba(79,209,165,.14);color:var(--ok)}
.b-off{background:rgba(246,118,138,.14);color:var(--taken)}
.b-dim{background:rgba(255,255,255,.06);color:var(--mut)}
.b-native{background:rgba(10,193,142,.14);color:var(--chain-native)}
.b-forge{background:rgba(255,140,0,.14);color:var(--forge)}
.muted{color:var(--mut);font-size:13px}
.dim{color:var(--dim);font-size:12.5px}
.hidden{display:none !important}
/* ---------- storage layout ---------- */
.quota{display:flex;flex-direction:column;gap:14px}
.quota-hdr{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.quota-hdr .tier-name{font-family:var(--serif);font-size:1.35rem;font-weight:500}
.quota-hdr .quota-line{font-family:var(--mono);color:var(--mut);font-size:14px}
.quota-hdr .quota-line b{color:var(--ink);font-weight:500}
.quota-hdr .renew{font-size:12.5px;color:var(--dim);margin-left:auto}
.bar{width:100%;height:10px;border-radius:999px;background:rgba(255,255,255,.04);overflow:hidden;border:1px solid var(--line)}
.bar > .fill{height:100%;background:linear-gradient(90deg,var(--acid),#a8e600);border-radius:999px;transition:width .3s}
.bar.warn > .fill{background:linear-gradient(90deg,var(--warn),#f59d00)}
.bar.over > .fill{background:linear-gradient(90deg,var(--taken),#e04e4e)}
.quota-detail{display:flex;gap:20px;flex-wrap:wrap;font-size:12.5px;color:var(--dim)}
.quota-detail b{color:var(--mut);font-weight:500;font-family:var(--mono)}
/* file browser */
.browser{display:grid;grid-template-columns:180px minmax(0,1fr);gap:16px;margin-top:14px}
@media (max-width:640px){.browser{grid-template-columns:1fr}}
.folders{display:flex;flex-direction:column;gap:2px;padding:4px 0}
.folders .fh{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim);padding:6px 10px 4px}
.folders button{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;background:transparent;border:1px solid transparent;color:var(--mut);font:inherit;font-size:13.5px;cursor:pointer;text-align:left;width:100%}
.folders button .ic{width:16px;text-align:center;opacity:.85}
.folders button:hover{color:var(--ink);background:rgba(255,255,255,.04)}
.folders button.active{color:var(--acid);background:rgba(214,255,61,.06);border-color:rgba(214,255,61,.15)}
.folders button .cnt{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--dim)}
.files{display:flex;flex-direction:column;gap:1px;background:var(--panel2);border:1px solid var(--line);border-radius:12px;overflow:hidden}
.files .toolbar{display:flex;gap:8px;padding:10px 14px;border-bottom:1px solid var(--line);align-items:center;background:rgba(255,255,255,.02)}
.files .toolbar .path{font-family:var(--mono);font-size:12.5px;color:var(--mut);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.files .toolbar .path .sep{color:var(--dim);margin:0 4px}
.files .toolbar .path .lock{color:var(--acid);margin-right:6px}
.files .toolbar .path .globe{color:var(--chain-native);margin-right:6px}
.files .row{display:grid;grid-template-columns:1fr 90px 110px 40px;gap:12px;align-items:center;padding:10px 14px;transition:background .1s}
.files .row:hover{background:rgba(255,255,255,.03)}
.files .row + .row{border-top:1px solid rgba(255,255,255,.03)}
.files .row.head{color:var(--dim);font-family:var(--mono);font-size:10.5px;letter-spacing:.15em;text-transform:uppercase;padding:8px 14px}
.files .row.head:hover{background:transparent}
.files .row .name{display:flex;gap:8px;align-items:center;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.files .row .name .ic{width:18px;text-align:center;flex:none}
.files .row .size{font-family:var(--mono);font-size:12px;color:var(--mut);text-align:right}
.files .row .date{font-family:var(--mono);font-size:12px;color:var(--dim)}
.files .row .more{color:var(--dim);cursor:pointer;text-align:right;padding:0 4px;user-select:none}
.files .row .more:hover{color:var(--ink)}
.drop{margin:12px 14px 14px;border:1.5px dashed rgba(255,255,255,.12);border-radius:10px;padding:22px;text-align:center;color:var(--mut);font-size:13.5px;transition:all .15s}
.drop.active{border-color:var(--acid);background:rgba(214,255,61,.03);color:var(--ink)}
.drop b{color:var(--acid);font-weight:500}
.drop .k{font-family:var(--mono);color:var(--dim);font-size:12px;display:block;margin-top:4px}
/* upgrade modal */
.modal-scrim{position:fixed;inset:0;z-index:100;background:rgba(4,6,11,.72);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;padding:20px}
.modal-scrim.show{display:flex}
.modal{background:var(--panel);border:1px solid var(--line);border-radius:16px;max-width:640px;width:100%;max-height:calc(100vh - 40px);overflow:auto;padding:22px 26px}
.modal h2{margin:0 0 6px;font-size:1.4rem}
.modal .close{float:right;background:none;border:0;color:var(--dim);font-size:22px;cursor:pointer;line-height:1;padding:0 4px;margin:-4px -8px 0 0}
.modal .close:hover{color:var(--ink)}
.plans{display:flex;flex-direction:column;gap:10px;margin:14px 0 18px}
.plan{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;border:1px solid var(--line);cursor:pointer;transition:all .12s;background:var(--panel2)}
.plan:hover{border-color:rgba(214,255,61,.28)}
.plan.sel{border-color:var(--acid);background:rgba(214,255,61,.05)}
.plan .radio{width:16px;height:16px;border-radius:50%;border:1.5px solid var(--dim);flex:none;position:relative}
.plan.sel .radio{border-color:var(--acid)}
.plan.sel .radio::after{content:'';position:absolute;inset:3px;background:var(--acid);border-radius:50%}
.plan .nm{flex:1;font-family:var(--serif);font-size:1.05rem;font-weight:500}
.plan .size{font-family:var(--mono);font-size:12.5px;color:var(--mut);width:130px}
.plan .price{font-family:var(--mono);font-size:14px;color:var(--ink);font-weight:500;width:80px;text-align:right}
.plan.current{opacity:.6;cursor:default}
.plan.current .nm::after{content:' — current';color:var(--dim);font-family:var(--sans);font-size:12px;font-weight:400}
.plan .save{font-family:var(--mono);font-size:10.5px;color:var(--acid);letter-spacing:.1em;margin-left:8px}
.pay-box{padding:18px 20px;border-radius:12px;background:linear-gradient(135deg,rgba(214,255,61,.04),rgba(10,193,142,.02));border:1px solid rgba(214,255,61,.16)}
.pay-box .amt{font-family:var(--serif);font-size:2rem;color:var(--acid);font-weight:400;letter-spacing:-.02em}
.pay-box .amt sub{font-family:var(--mono);font-size:12px;color:var(--mut);letter-spacing:0;vertical-align:baseline;margin-left:6px}
.pay-box .oracle{font-family:var(--mono);font-size:11.5px;color:var(--dim);margin-top:4px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pay-box .dot{width:6px;height:6px;border-radius:50%;background:var(--ok);animation:pulse 2s infinite ease-in-out}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
.modal .actions{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap;align-items:center}
.modal .actions .btn{flex:1;justify-content:center;padding:12px 18px;font-size:14.5px}
.modal .actions .btn.acid{flex:2}
.modal .alt{font-size:12px;color:var(--dim);margin-top:12px;text-align:center}
.modal .alt a{color:var(--mut)}
/* confirmation banner */
.banner{padding:14px 18px;border-radius:12px;background:rgba(79,209,165,.06);border:1px solid rgba(79,209,165,.24);color:var(--ink);margin-bottom:14px;display:flex;gap:12px;align-items:center}
.banner.warn{background:rgba(255,199,95,.06);border-color:rgba(255,199,95,.24)}
.banner.err{background:rgba(246,118,138,.06);border-color:rgba(246,118,138,.24)}
.banner .ic{font-size:20px;flex:none}
.banner .txt{flex:1;font-size:13.5px;color:var(--mut)}
.banner .txt b{color:var(--ink);font-weight:500}
.banner .close{background:none;border:0;color:var(--dim);font-size:18px;cursor:pointer;padding:0 4px}
.banner .close:hover{color:var(--ink)}
/* wireframe state picker (dev-only) */
.wf-picker{position:fixed;bottom:16px;right:16px;z-index:50;padding:8px 10px;border-radius:12px;background:rgba(20,26,36,.94);border:1px solid var(--line);font-family:var(--mono);font-size:11px;color:var(--dim);display:flex;flex-direction:column;gap:4px;backdrop-filter:blur(10px)}
.wf-picker .h{color:var(--acid);text-transform:uppercase;letter-spacing:.15em;font-size:9.5px;margin-bottom:2px}
.wf-picker button{background:transparent;border:0;color:var(--mut);cursor:pointer;font-family:inherit;font-size:11.5px;padding:3px 6px;border-radius:6px;text-align:left}
.wf-picker button:hover{color:var(--ink);background:rgba(255,255,255,.04)}
.wf-picker button.active{color:var(--acid);background:rgba(214,255,61,.08)}
</style>
</head>
<body>
<nav class="topnav">
<a class="brand" href="../"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="../#try">Try it</a>
<a href="../#search-input">✏️ Register</a>
<a href="../tld.html">🌐 TLD</a>
<a href="../market/">🛒 Market</a>
<a href="../portal.html" class="portal here">🔑 Storage</a>
</nav>
<div class="dash">
<!-- ============ sidebar ============ -->
<aside class="side" aria-label="Dashboard menu">
<div class="who">
<div class="lbl">Signed in</div>
<div class="addr">bitcoincash:qzrp…4qtx</div>
<div class="net">chipnet · 42,180 sat</div>
</div>
<button class="item"><span class="ic">🎨</span>Web-Builder</button>
<button class="item"><span class="ic">🌐</span>Domain names<span class="cnt">3</span></button>
<button class="item"><span class="ic">🏷</span>My TLDs<span class="cnt">1</span></button>
<button class="item active"><span class="ic">📦</span>Storage<span class="cnt" id="side-quota">120M</span></button>
<div class="sep"></div>
<button class="item"><span class="ic"></span>Settings</button>
<button class="item"><span class="ic">🚪</span>Sign out</button>
</aside>
<!-- ============ content ============ -->
<main class="content">
<!-- Confirmation banners appear here based on wireframe state -->
<div id="banner-confirming" class="banner warn hidden">
<div class="ic"></div>
<div class="txt"><b>Confirming payment.</b> 0.0462 BCH received — waiting for 1 confirmation (~10 min). Your plan activates automatically.</div>
<button class="close" onclick="dismissBanner(this)">×</button>
</div>
<div id="banner-upgraded" class="banner hidden">
<div class="ic"></div>
<div class="txt"><b>Silent Max is active.</b> Quota bumped to 50 GB private. Renews 2026-10-20.</div>
<button class="close" onclick="dismissBanner(this)">×</button>
</div>
<div id="banner-grace" class="banner err hidden">
<div class="ic"></div>
<div class="txt"><b>Over quota.</b> Files are read-only for 27 more days. Upgrade or delete files to restore write access.</div>
<button class="close" onclick="dismissBanner(this)">×</button>
</div>
<div class="ph">
<div>
<h2>Storage</h2>
<p id="hdr-sub">Files you host on Silent Mode's Sia backend. Public files get a URL anyone can open;
private files are encrypted in your browser with a key only your wallet can derive.</p>
</div>
<div style="display:flex;gap:8px;flex-wrap:wrap">
<button class="btn ghost small">↻ Refresh</button>
<button class="btn acid small" id="upgrade-btn" onclick="openModal()">Upgrade</button>
</div>
</div>
<!-- Quota card -->
<section class="card">
<div class="quota">
<div class="quota-hdr">
<span class="tier-name" id="tier-name">Silent Free</span>
<span class="badge b-dim" id="tier-badge">Free</span>
<span class="quota-line"><b id="q-used">120 MB</b> / <span id="q-cap">500 MB</span> private</span>
<span class="renew" id="renew-line" style="display:none">renews <b id="renew-date">2026-10-20</b></span>
</div>
<div class="bar" id="q-bar"><div class="fill" id="q-fill" style="width:24%"></div></div>
<div class="quota-detail">
<span>Public: <b>2.4 GB</b> · unlimited</span>
<span>Files: <b>47</b></span>
<span>Encryption: <b>on</b> for private</span>
<span id="credit-line" style="display:none">Credit: <b>$0.00</b></span>
</div>
</div>
</section>
<!-- File browser -->
<section class="card" style="padding:14px 14px 0">
<div class="browser">
<nav class="folders">
<div class="fh">Folders</div>
<button class="active" data-folder="private">
<span class="ic" style="color:var(--acid)">🔒</span>Private
<span class="cnt">12</span>
</button>
<button data-folder="public">
<span class="ic" style="color:var(--chain-native)">🌐</span>Public
<span class="cnt">35</span>
</button>
<button data-folder="shared">
<span class="ic">🔗</span>Shared
<span class="cnt">2</span>
</button>
<div class="fh" style="margin-top:8px">Actions</div>
<button><span class="ic"></span>New folder</button>
<button><span class="ic"></span>Upload</button>
</nav>
<div class="files">
<div class="toolbar">
<div class="path">
<span class="lock">🔒</span>
<span>private</span>
<span class="sep">/</span>
<span>projects</span>
</div>
<button class="btn ghost small">Share</button>
</div>
<div class="row head">
<span>Name</span>
<span class="size" style="text-align:right">Size</span>
<span class="date">Modified</span>
<span></span>
</div>
<div class="row">
<span class="name"><span class="ic">📁</span>silentmode-notes</span>
<span class="size"></span>
<span class="date">3d ago</span>
<span class="more"></span>
</div>
<div class="row">
<span class="name"><span class="ic">📁</span>contracts</span>
<span class="size"></span>
<span class="date">1w ago</span>
<span class="more"></span>
</div>
<div class="row">
<span class="name"><span class="ic">📄</span>hestia-outline.md</span>
<span class="size">14 KB</span>
<span class="date">just now</span>
<span class="more"></span>
</div>
<div class="row">
<span class="name"><span class="ic">📄</span>oracle-notes.txt</span>
<span class="size">4 KB</span>
<span class="date">2h ago</span>
<span class="more"></span>
</div>
<div class="row">
<span class="name"><span class="ic">🗄</span>backup-2026-09-18.tar.gz</span>
<span class="size">86 MB</span>
<span class="date">2d ago</span>
<span class="more"></span>
</div>
<div class="row">
<span class="name"><span class="ic">🖼</span>diagram.png</span>
<span class="size">220 KB</span>
<span class="date">4d ago</span>
<span class="more"></span>
</div>
<div class="row">
<span class="name"><span class="ic">🔑</span>keys.json.gpg</span>
<span class="size">2 KB</span>
<span class="date">2w ago</span>
<span class="more"></span>
</div>
<div class="drop" id="drop">
Drag files here, or <b>click to browse</b>
<span class="k">Encrypted in your browser before upload · max 100 MB per file on Free</span>
</div>
</div>
</div>
</section>
<!-- CLI hint -->
<section class="card" style="margin-top:14px">
<div style="display:flex;gap:10px;align-items:baseline;justify-content:space-between;flex-wrap:wrap">
<div>
<h3 style="margin:0 0 4px">CLI access</h3>
<p class="muted" style="margin:0">Upload from a script or CI with your Silent Mode PAT.
Encryption still happens client-side.</p>
</div>
<span class="badge b-dim" id="cli-tier">Free — via gateway</span>
</div>
<pre style="margin:12px 0 0;padding:12px 14px;background:var(--panel2);border:1px solid var(--line);border-radius:10px;font-family:var(--mono);font-size:12.5px;color:var(--mut);overflow:auto;line-height:1.6"><span style="color:var(--dim)"># upload a private file</span>
curl -H "Authorization: token $HESTIA_PAT" \
--data-binary @notes.md \
https://storage.silentmode.st/u/48291/private/notes.md
<span style="color:var(--dim)"># list your files</span>
curl -H "Authorization: token $HESTIA_PAT" \
https://storage.silentmode.st/u/48291/list</pre>
<p class="muted" id="cli-hint" style="margin:10px 0 0;font-size:12.5px">
<span class="badge b-warn">Pro / Max</span> get their own S3 credentials for direct
<code>rclone</code> / <code>aws s3</code> use.
</p>
</section>
</main>
</div>
<!-- ============ upgrade modal ============ -->
<div class="modal-scrim" id="modal">
<div class="modal">
<button class="close" onclick="closeModal()">×</button>
<h2>Plans</h2>
<p class="muted">Priced in USD, paid in BCH at the live oracle rate. All plans include unlimited public storage. Encryption is client-side, wallet-derived, always on for private files.</p>
<div class="plans" id="plans">
<div class="plan current" data-tier="free">
<span class="radio"></span>
<span class="nm">Silent Free</span>
<span class="size">500 MB private</span>
<span class="price">$0</span>
</div>
<div class="plan" data-tier="pro" onclick="selectPlan('pro')">
<span class="radio"></span>
<span class="nm">Silent Pro</span>
<span class="size">2 GB private</span>
<span class="price">$3<span class="save">·25% off GH</span></span>
</div>
<div class="plan sel" data-tier="max" onclick="selectPlan('max')">
<span class="radio"></span>
<span class="nm">Silent Max</span>
<span class="size">50 GB private</span>
<span class="price">$16<span class="save">·24% off GH</span></span>
</div>
</div>
<div class="pay-box">
<div style="display:flex;justify-content:space-between;align-items:baseline">
<div>
<div class="dim" style="font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;font-size:10px">Pay for 1 month</div>
<div class="amt" id="pay-amt">0.0462 BCH<sub>≈ $16.00</sub></div>
</div>
<span class="badge b-native" id="pay-tier">Silent Max</span>
</div>
<div class="oracle">
<span class="dot"></span>
<span>live oracle at <b style="color:var(--mut)" id="oracle-rate">$346.40</b> / BCH</span>
<span>·</span>
<span id="oracle-age">quoted 00:14 ago</span>
<span>·</span>
<span>refreshes in <span id="oracle-refresh">04:46</span></span>
</div>
</div>
<div class="actions">
<button class="btn ghost" onclick="closeModal()">Cancel</button>
<button class="btn acid" onclick="mockPay()">Pay from wallet →</button>
</div>
<div class="alt">
also accepts: <a href="#">QR code</a> · <a href="#">external wallet</a> · <a href="#">on-chain address</a>
</div>
</div>
</div>
<!-- ============ wireframe state picker (dev only) ============ -->
<div class="wf-picker">
<div class="h">Wireframe state</div>
<button class="active" onclick="setState('free')">Free · default</button>
<button onclick="setState('confirming')">Free · confirming</button>
<button onclick="setState('max-fresh')">Max · just upgraded</button>
<button onclick="setState('max-half')">Max · half full</button>
<button onclick="setState('grace')">Free · over quota</button>
</div>
<script>
const PLAN = {
free: {name:'Silent Free', badge:'Free', badgeCls:'b-dim', used:120, cap:500, capUnit:'MB', price:0, bch:0},
pro: {name:'Silent Pro', badge:'Pro', badgeCls:'b-forge', used:1200, cap:2, capUnit:'GB', price:3, bch:0.00866},
max: {name:'Silent Max', badge:'Max', badgeCls:'b-native',used:24800, cap:50, capUnit:'GB', price:16, bch:0.04620},
};
let currentTier = 'free';
let selectedTier = 'max';
function selectPlan(t){
selectedTier = t;
document.querySelectorAll('.plan').forEach(p=>p.classList.toggle('sel', p.dataset.tier === t));
const p = PLAN[t];
document.getElementById('pay-amt').innerHTML = p.bch.toFixed(5) + ' BCH<sub>≈ $' + p.price.toFixed(2) + '</sub>';
document.getElementById('pay-tier').className = 'badge ' + p.badgeCls;
document.getElementById('pay-tier').textContent = p.name;
}
function openModal(){ document.getElementById('modal').classList.add('show'); }
function closeModal(){ document.getElementById('modal').classList.remove('show'); }
function dismissBanner(el){ el.parentElement.classList.add('hidden'); }
function mockPay(){
closeModal();
setState('confirming');
// fake the SSE flow: confirming → upgraded after 3s
setTimeout(() => setState('max-fresh'), 3000);
}
function fmtBytes(x, unit){
if (unit === 'MB') return x < 1024 ? x + ' MB' : (x/1024).toFixed(1) + ' GB';
if (unit === 'GB') return x < 1 ? Math.round(x*1024) + ' MB' : x + ' GB';
return x + ' ' + unit;
}
function setState(s){
// reset banners
['confirming','upgraded','grace'].forEach(k =>
document.getElementById('banner-' + k).classList.add('hidden'));
// reset state-picker button
document.querySelectorAll('.wf-picker button').forEach(b => b.classList.remove('active'));
(document.querySelector(`.wf-picker button[onclick*="${s}"]`) || {classList:{add:()=>{}}}).classList.add('active');
let tier='free', usedMB=120, capMB=500, capLabel='500 MB', tierLabel='Silent Free',
badgeCls='b-dim', badgeLbl='Free', renew=false, credit=false, cliBadge='Free — via gateway';
if (s === 'confirming') {
document.getElementById('banner-confirming').classList.remove('hidden');
}
if (s === 'max-fresh') {
tier='max'; usedMB=120; capMB=50*1024; capLabel='50 GB'; tierLabel='Silent Max';
badgeCls='b-native'; badgeLbl='Max'; renew=true;
cliBadge='Max — direct S3';
document.getElementById('banner-upgraded').classList.remove('hidden');
}
if (s === 'max-half') {
tier='max'; usedMB=25*1024; capMB=50*1024; capLabel='50 GB'; tierLabel='Silent Max';
badgeCls='b-native'; badgeLbl='Max'; renew=true;
cliBadge='Max — direct S3';
}
if (s === 'grace') {
tier='free'; usedMB=580; capMB=500; capLabel='500 MB'; tierLabel='Silent Free';
badgeCls='b-dim'; badgeLbl='Free (over quota)'; credit=true;
document.getElementById('banner-grace').classList.remove('hidden');
}
currentTier = tier;
document.getElementById('tier-name').textContent = tierLabel;
document.getElementById('tier-badge').className = 'badge ' + badgeCls;
document.getElementById('tier-badge').textContent = badgeLbl;
const pct = Math.min(100, Math.round((usedMB / capMB) * 100));
document.getElementById('q-used').textContent = usedMB < 1024 ? usedMB + ' MB' : (usedMB/1024).toFixed(1) + ' GB';
document.getElementById('q-cap').textContent = capLabel;
document.getElementById('q-fill').style.width = pct + '%';
document.getElementById('q-bar').className = 'bar' + (pct >= 100 ? ' over' : pct >= 85 ? ' warn' : '');
document.getElementById('side-quota').textContent = usedMB < 1024 ? usedMB + 'M' : (usedMB/1024).toFixed(1) + 'G';
document.getElementById('renew-line').style.display = renew ? '' : 'none';
document.getElementById('credit-line').style.display = credit ? '' : 'none';
document.getElementById('cli-tier').textContent = cliBadge;
document.getElementById('cli-tier').className = 'badge ' + (tier === 'free' ? 'b-dim' : tier === 'pro' ? 'b-forge' : 'b-native');
// update available plans in modal (highlight current, remove .current from others)
document.querySelectorAll('.plan').forEach(p => {
p.classList.toggle('current', p.dataset.tier === tier);
if (p.dataset.tier === tier) p.classList.remove('sel');
});
if (tier === 'free') selectPlan('max');
else if (tier === 'pro') selectPlan('max');
else selectPlan('max');
}
// fake oracle refresh countdown (visual only)
let refreshLeft = 286;
setInterval(() => {
refreshLeft = refreshLeft > 0 ? refreshLeft - 1 : 300;
const m = Math.floor(refreshLeft / 60);
const s = refreshLeft % 60;
const el = document.getElementById('oracle-refresh');
if (el) el.textContent = String(m).padStart(2,'0') + ':' + String(s).padStart(2,'0');
}, 1000);
setState('free');
</script>
</body>
</html>

View file

@ -131,11 +131,11 @@
.muted{color:var(--mut);font-size:13px} .muted{color:var(--mut);font-size:13px}
code{font-family:var(--mono);background:#0e131b;border:1px solid var(--line);border-radius:6px;padding:1px 6px;font-size:12px} code{font-family:var(--mono);background:#0e131b;border:1px solid var(--line);border-radius:6px;padding:1px 6px;font-size:12px}
</style> </style>
<script src="./js/i18n.js?v=20260920d"></script> <script src="./js/i18n.js?v=20260920e"></script>
</head> </head>
<body> <body>
<div class="bar"> <div class="bar">
<a class="brand" href="./portal.html#studio"><span class="g">Sirius</span> Studio</a> <a class="brand" href="./portal.html#studio"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius</span> Studio</a>
<span class="name" id="site-name"></span> <span class="name" id="site-name"></span>
<select class="sel" id="tpl-select" title="Start from a template"> <select class="sel" id="tpl-select" title="Start from a template">
<option value="">Templates…</option> <option value="">Templates…</option>

View file

@ -101,11 +101,11 @@
<body> <body>
<nav class="topnav"> <nav class="topnav">
<a class="brand" href="../"><span class="g">Sirius.X</span></a> <a class="brand" href="../"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="../#try">Try it</a> <a href="../#try">Try it</a>
<a href="../#search-input">✏️ Register</a> <a href="../#search-input">✏️ Register</a>
<a href="../tld.html">🌐 TLD</a> <a href="../tld.html">🌐 TLD</a>
<a href="../market.html">🛒 Market</a> <a href="../market/">🛒 Market</a>
<a href="./" class="here"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a> <a href="./" class="here"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a>
<a href="../portal.html" class="portal">🔑 Sign in</a> <a href="../portal.html" class="portal">🔑 Sign in</a>
</nav> </nav>
@ -186,7 +186,7 @@ sha256sum &lt;downloaded-file&gt;.exe</pre>
<script src="../js/pin-escrow.js?v=20260909pin"></script> <script src="../js/pin-escrow.js?v=20260909pin"></script>
<script src="../js/pricing.js?v=20260909tldhigh"></script> <script src="../js/pricing.js?v=20260909tldhigh"></script>
<script defer src="../js/site-footer.js?v=20260907rel"></script> <script defer src="../js/site-footer.js?v=20260907rel"></script>
<script defer src="../js/theme.js?v=20260910font"></script> <script defer src="../js/theme.js?v=20260920compact"></script>
<script defer src="../js/profile-menu.js?v=20260908tabs"></script> <script defer src="../js/profile-menu.js?v=20260908tabs"></script>
</body> </body>
</html> </html>

View file

@ -115,17 +115,17 @@
<script type="importmap"> <script type="importmap">
{ "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js" } } { "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js" } }
</script> </script>
<script src="./js/i18n.js?v=20260920d"></script> <script src="./js/i18n.js?v=20260920e"></script>
</head> </head>
<body> <body>
<nav class="topnav"> <nav class="topnav">
<a class="brand" href="./"><span class="g">Sirius.X</span></a> <a class="brand" href="./"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg><span class="g">Sirius.X</span></a>
<a href="./#try">Try it</a> <a href="./#try">Try it</a>
<a href="./#search-input">✏️ Register</a> <a href="./#search-input">✏️ Register</a>
<a href="./tld.html" class="here">🌐 TLD</a> <a href="./tld.html" class="here">🌐 TLD</a>
<a href="./market.html">🛒 Market</a> <a href="./market">🛒 Market</a>
<a href="./theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a> <a href="./theseus"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a>
<a href="./portal.html" class="portal">🔑 Sign in</a> <a href="./portal.html" class="portal">🔑 Sign in</a>
</nav> </nav>
@ -307,7 +307,7 @@
<script src="./js/pricing.js?v=20260917market"></script> <script src="./js/pricing.js?v=20260917market"></script>
<script src="./js/session.js?v=20260917dash"></script> <script src="./js/session.js?v=20260917dash"></script>
<script src="./js/pin-escrow.js?v=20260909pin"></script> <script src="./js/pin-escrow.js?v=20260909pin"></script>
<script defer src="./js/theme.js?v=20260910font"></script> <script defer src="./js/theme.js?v=20260920compact"></script>
<script defer src="./js/site-footer.js?v=20260917market"></script> <script defer src="./js/site-footer.js?v=20260917market"></script>
<script defer src="./js/profile-menu.js?v=20260920m"></script> <script defer src="./js/profile-menu.js?v=20260920m"></script>
</body> </body>