Ship Theseus 0.2.5 50be20d6 (home page brand pass: .X acid + role badges)

Setup    50be20d6e3811445817e35c560dce1a4bbcc62004d6b0480848a211a654319ea
Portable 021afe629c61f2f49e95f936261649bdcff58c8b79bd0d903a8d10e6009740b0

Home page card grid gets a brand pass. Each title's TLD suffix (.X,
.bch, ...) is now styled in acid (--acid) with a soft text-shadow
glow. styledTitle() splits the domain on the last dot so capital
labels like "Theseus.X" render as ink + acid.

Card copy tightened per name:
  hello.bch         A small page on the blockchain itself.
  siatest.bch       A page with no server, backed by Sia.
  SilentMode.X      Infrastructure development for a decentralized web.
  Theseus.X         The Web Navigator - this browser's own address.
  Sirius.X          Register and manage BCDN names.
  Hephaestus.X      The forge - Silent Mode's code host.
  Prometheus.X      An app store - a marketplace for BCDN-hosted apps.
  Helios.X          Search engine for the decentralized web (in design).
  Hermes.X          Messaging - end-to-end encrypted over Nostr.

Badges: dropped the generic ".x" tag; each .X card carries its role
label instead. Palette assigns each role a distinct hue drawn from
the existing provenance colors, so the grid reads as families without
adding new brand values:
  Infrastructure / Registrar  acid
  Navigator                   blue
  Code host                   sia purple
  App store                   srv teal
  Search                      warn amber
  Messaging                   err coral

Descriptions brighten from --mut to --ink on card hover so the ink
color reads as the "acid touch" the user asked for without adding
literal green blocks to every card.

Deployed: scp installers + manifest + tools/ + releases/ pages to VPS,
sia-upload of both trees, verified HEAD 200 + manifest 0.2.5.
This commit is contained in:
Local Dev 2026-08-31 18:03:02 +02:00
parent 454255e963
commit 62d32573cf
3 changed files with 42 additions and 16 deletions

View file

@ -41,14 +41,29 @@
position: relative; cursor: pointer; }
.card:hover { border-color: rgba(75,123,236,.4); background: var(--card-hi); transform: translateY(-2px); }
.card .n { font-weight: 600; color: var(--ink); font-size: 15.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* TLD suffix (.x, .bch, ...) rendered in the Silent Mode acid so the brand
accent reads instantly across the grid. Subtle glow reinforces it. */
.card .n .tld { color: var(--acid); font-weight: 700; letter-spacing: .3px;
text-shadow: 0 0 8px rgba(214,255,61,.35); }
.card .d { color: var(--mut); font-size: 13px; margin-top: 6px; line-height: 1.4; overflow: hidden;
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.card:hover .d { color: var(--ink); }
.card .row { display: flex; align-items: center; justify-content: space-between; margin-top: 12px; gap: 8px; }
.badge { display: inline-block; font-size: 10.5px; padding: 2px 9px; border-radius: 999px; letter-spacing: .02em; }
.b-on-chain { background: rgba(214,255,61,.14); color: var(--acid); }
.b-Sia { background: rgba(179,157,219,.14); color: var(--sia); }
.b-server { background: rgba(79,209,165,.14); color: var(--srv); }
.b-default { background: rgba(139,152,169,.14); color: var(--mut); }
/* Provenance-typed badges (which chain/storage backed the site). */
.b-on-chain { background: rgba(214,255,61,.14); color: var(--acid); }
.b-sia { background: rgba(179,157,219,.14); color: var(--sia); }
.b-server { background: rgba(79,209,165,.14); color: var(--srv); }
/* Product-role badges — same acid family with per-role hue shifts.
Kept muted so the badge is legible but doesn't compete with the title. */
.b-infrastructure { background: rgba(214,255,61,.10); color: var(--acid); }
.b-navigator { background: rgba(75,123,236,.14); color: #7ea3ff; }
.b-registrar { background: rgba(214,255,61,.10); color: var(--acid); }
.b-code-host { background: rgba(179,157,219,.14); color: var(--sia); }
.b-app-store { background: rgba(79,209,165,.14); color: var(--srv); }
.b-search { background: rgba(255,199,95,.14); color: #ffc75f; }
.b-messaging { background: rgba(246,118,138,.14); color: #f6768a; }
.b-default { background: rgba(139,152,169,.14); color: var(--mut); }
/* Edit affordances — hidden until Edit mode toggled */
.card .edit-actions { position: absolute; top: 8px; right: 8px; display: none; gap: 4px; }
@ -150,7 +165,18 @@
if (window.home && window.home.navigate) window.home.navigate(q);
else window.location.href = "https://duckduckgo.com/?q=" + encodeURIComponent(q);
});
function badgeClass(b) { return b ? "b-" + b : "b-default"; }
function badgeClass(b) {
// Normalize badge label into a CSS class (spaces + case → dashes / lower).
if (!b) return "b-default";
return "b-" + String(b).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
}
// Split a domain-style title so ".X" (or ".bch") can render in the acid brand
// color while the rest stays ink. Preserves capitals in the base label.
function styledTitle(t) {
const m = String(t).match(/^(.+?)(\.[A-Za-z]{1,10})$/);
if (!m) return esc(t);
return esc(m[1]) + '<span class="tld">' + esc(m[2]) + '</span>';
}
function render() {
const g = $("grid");
g.innerHTML = cards.map((c, i) => {
@ -160,7 +186,7 @@
<button class="ed" title="Edit"></button>
<button class="rm" title="Remove"></button>
</div>
<div class="n">${esc(c.title)}</div>
<div class="n">${styledTitle(c.title)}</div>
<div class="d">${esc(c.sub || c.url)}</div>
<div class="row">${badge}</div>
</div>`;

18
main.js
View file

@ -326,15 +326,15 @@ function emitUpdateAvailable() {
// can add/edit/remove via the page's edit mode. First-run seed = the classic
// Silent Mode showcase (hello.bch, theseus.bch, silentmode.bch, etc.).
const DEFAULT_HOME_CARDS = [
{ title: "hello.bch", url: "https://hello.bch/", sub: "A small page on the blockchain itself.", badge: "on-chain" },
{ title: "siatest.bch", url: "https://siatest.bch/", sub: "A page with no server, backed by Sia.", badge: "Sia" },
{ title: "silentmode.x", url: "https://silentmode.x/", sub: "The project's .x address.", badge: ".x" },
{ title: "theseus.x", url: "https://theseus.x/", sub: "This browser's own address.", badge: ".x" },
{ title: "sirius.x", url: "https://sirius.x/", sub: "Register and manage BCDN names.", badge: ".x" },
{ title: "hephaestus.x", url: "https://hephaestus.x/", sub: "Code host — Silent Mode's Forgejo.", badge: ".x" },
{ title: "prometheus.x", url: "https://prometheus.x/", sub: "Storage-as-a-product.", badge: ".x" },
{ title: "helios.x", url: "https://helios.x/", sub: "Discovery + navigation.", badge: ".x" },
{ title: "hermes.x", url: "https://hermes.x/", sub: "Messaging — NIP-17 over Nostr.", badge: ".x" },
{ title: "hello.bch", url: "https://hello.bch/", sub: "A small page on the blockchain itself.", badge: "on-chain" },
{ title: "siatest.bch", url: "https://siatest.bch/", sub: "A page with no server, backed by Sia.", badge: "Sia" },
{ title: "SilentMode.X", url: "https://silentmode.x/", sub: "Infrastructure development for a decentralized web.", badge: "Infrastructure" },
{ title: "Theseus.X", url: "https://theseus.x/", sub: "The Web Navigator — this browser's own address.", badge: "Navigator" },
{ title: "Sirius.X", url: "https://sirius.x/", sub: "Register and manage BCDN names.", badge: "Registrar" },
{ title: "Hephaestus.X", url: "https://hephaestus.x/", sub: "The forge — Silent Mode's code host.", badge: "Code host" },
{ title: "Prometheus.X", url: "https://prometheus.x/", sub: "An app store — a marketplace for BCDN-hosted apps.", badge: "App store" },
{ title: "Helios.X", url: "https://helios.x/", sub: "Search engine for the decentralized web (in design).", badge: "Search" },
{ title: "Hermes.X", url: "https://hermes.x/", sub: "Messaging — end-to-end encrypted over Nostr.", badge: "Messaging" },
];
const homeCardsFile = () => path.join(app.getPath("userData"), "home-cards.json");
function loadHomeCards() {

View file

@ -1,6 +1,6 @@
{
"name": "theseus-navigator",
"version": "0.2.4",
"version": "0.2.5",
"description": "Theseus Navigator — a browser that follows the thread. By Silent Mode, a Deviant project.",
"author": "Silent Mode",
"main": "main.js",