Commit graph

23 commits

Author SHA1 Message Date
Local Dev
d27f1d250a i18n(sirius-x): translate the Web-Builder menu and Sirius Studio
Studio chrome, template picker, publish dialog, the shorter dashboard
menu and the Settings copy in all six languages. Dictionary cache version
bumped.
2026-09-17 01:40:12 +02:00
Local Dev
49e5752633 i18n(sirius-x): translate the dashboard in all six languages
Menu, panes, DNS table, transfer, export, settings and the new session
copy get German, Greek, Russian, Spanish, French and Portuguese entries;
Greek and Russian keep the "blockchain" wording. Dictionary cache version
bumped so returning visitors pick the new strings up.
2026-09-17 01:14:16 +02:00
Local Dev
f6459fe518 feat(sirius-x): dashboard with sidebar, persistent sign-in, full DNS panel
The portal was a flat page with tabs that asked for the password or PIN on
every visit and offered little beyond a records form. Owners need a
control panel they can live in.

Sign in once: the recovery phrase is kept encrypted under a
non-extractable browser key (IndexedDB) so the next visit opens the
dashboard silently; sign-out or the Settings toggle destroys it. Payments
approve with one click unless "Ask for PIN before payments" is on.

Dashboard: left menu (Overview, Domain names, My TLD list, Wallet,
Register name/TLD, Settings). Per-name detail with a summary, a DNS
record table (A, AAAA, CNAME, MX, TXT, NS, SRV, CAA) that signs the
manifest, content & hosting (h, s3, p, ip, tls), a redirect tab (u),
ownership transfer (UPD that re-issues the certificate to the recipient)
and zone-file/JSON export. Per-TLD detail with policy, on/off, owner
registration and the public list of names under it. Overview flags names
that point nowhere or lack DNS.
2026-09-17 01:09:20 +02:00
Local Dev
1d1538c0f9 fix(sirius-x): Greek copy says "blockchain", headline reads "Ονόματα τομέα στο blockchain"
Same reasoning as the Russian fix: "αλυσίδα" is a literal "chain" that
Greek readers do not use for a blockchain, which is normally written as
the loanword. Every Greek string now uses "blockchain" with the neuter
article in the right case. Dictionary cache version bumped.
2026-09-17 00:41:43 +02:00
Local Dev
3b08e34976 fix(sirius-x): Russian copy says "блокчейн", headline reads "Доменные имена в блокчейне"
"Цепочка" is a literal rendering of "chain" that Russian readers do not
use for a blockchain. The headline now states plainly that these are
domain names on the blockchain, and every other Russian string uses
"блокчейн" in the right case. Dictionary cache version bumped so
returning visitors pick up the new wording.
2026-09-17 00:39:45 +02:00
Local Dev
085824faf6 feat(sirius-x): language picker on the right with globe icon and flags
The native select sat mid-nav next to the font pill and was easy to miss.
Replace it with a custom dropdown placed just before the wallet button:
globe icon, the current language's flag and native name, a menu of all
languages with flags. Flags are tiny inline SVGs rather than emoji
(Windows renders flag emoji as bare letters) or a flag CDN (no third-party
request from the visitor's browser). Painted on window load so it lands
after the deferred nav scripts; keyboard: arrows, Escape, click outside.
2026-09-17 00:36:55 +02:00
Local Dev
08a0c8d33f feat(sirius-x): load the site in the reader's language, with a dropdown to switch
Visitors should not have to read English to register a name. The pages
stay authored in English; js/i18n.js picks the language from the saved
choice, ?lang=, or the browser, fetches i18n/<lang>.json (exact English
text -> translation) and rewrites text nodes, placeholders, titles and the
page title. A MutationObserver keeps script-built content (search rows,
register modal, portal rows, footer, profile menu) translated, so no page
script had to change. A dropdown in the top nav switches languages and
back to English losslessly. Code, hashes, addresses and record keys are
never touched. Ships German, Greek, Russian, Spanish, French and
Portuguese; the docs page keeps its English prose and only gains the
translated chrome.
2026-09-16 23:30:16 +02:00
Local Dev
55ddee18ec feat(sirius-x): TLD owner panel — owner-set price, on/off switch, private TLDs
A TLD owner needed to run their namespace without the operator: set what
every name under the TLD sells for, take the TLD off the public registry
for a while, and still register names under it themselves.

Both settings live on chain in the TLD's TUPD records (`price`, `hidden`)
because changes are rare and every client already walks the TLD beacon.
The gateway's /api/tlds now carries records, owner, price_usd and
hidden_by per TLD; pricing.js quotes the owner price ahead of the length
tiers and only trusts a TLD_BEACON-sourced list; the register flow refuses
hidden and frozen TLDs for the public but lets the owner through at the
platform share only (the 90% owner cut would be paid to themselves). The
portal's TLDs tab loads real holdings, shows price and on/off state, and
gives each TLD a one-click switch, a price/policy editor and an inline
"register a name under .tld" form. Docs and the design table describe the
two new records.
2026-09-16 21:28:18 +02:00
Local Dev
7635ed7721 feat(sirius-x): Deviant sky palette + Fraunces/Ubuntu reader toggle
Design translated from the /design canvas review. Sirius.X now shares
Deviant's "signal" theme background (layered sky-rim/mid gradients over
#050810) and the Silent Mode family typography stack.

Typography:
  Fraunces (opsz variable serif)   headings h1/h2/h3
  DM Sans                          body / UI
  JetBrains Mono                   code, hashes, mono cells
  Ubuntu                           opt-in Bitcoin Cash brand font,
                                   swaps everything at :root when
                                   <html data-font-cmp="ubuntu">
  All via Google Fonts, one <link> per page.

Font picker (js/theme.js):
  Small pill in the topnav (Fraunces default / Ubuntu alt) — persisted
  to localStorage.sirius-font. Sets the data-font-cmp attribute; the
  swap CSS lives in each page's <style> block so !important overrides
  page-local font-family declarations at the necessary specificity.
  Mono elements stay JetBrains Mono under both fonts.

Palette (cool sky vs old flat dark navy):
  --bg          #0b0e14 → #050810
  --panel2      #18202c → #0a0f1c  (matches Deviant --sky-mid)
  --line        rgba(255,255,255,.09) → .06
  --ink         #e7eaf1 → #f1f4fa
  --mut         #8b98a9 → #b8c2d4
  --dim         #5e6678 → #6a7488
  new: --sky-rim #131a2a, --chain-native #0AC18E (BCH brand green,
       reserved for chain-native badges/proofs like the Bitcoin.Cash
       body copy)

Copy — "no renewals" softened everywhere it appeared. Renewals will
be a per-TLD policy set by each TLD owner; the flat claim was wrong
across the board. Landing card, tld.html hero and body, plus the
og:description all updated.

Applied to: index.html, portal.html, tld.html, theseus/index.html,
brand/index.html, docs/index.html, admin/index.html.
2026-09-10 00:25:18 +02:00
Local Dev
caf11c2512 feat(sirius-x): raise TLD pricing to $25–$500; PIN gate on payment approval
TLD price tiers (pricing.js):
  1 char  $500  (was $10)
  2 char  $250  (was $8)
  3 char  $150  (was $6)
  4-6ch   $100  (was $5)
  7-10ch  $50   (was $5)
  11+ch   $25   (was $4)

Payment approval (register-flow.js):
  New stepApprove(...) gates the actual sign+broadcast on an explicit
  user gesture — PIN pad when a PIN blob exists on this device, wallet
  password otherwise. Same "3 wrong PINs → wipe, fall back to password"
  behavior as the sign-in unlock step. Wired between stepConfirm(Tld)?
  and stepRegister(Tld)? so both name mints and TLD mints require
  approval even when the wallet is already in memory.

tld.html fee card: reflects the new $25–$500 range instead of the
"≈ 1,250,000 sat · ≈ $5" placeholder.
2026-09-09 03:45:41 +02:00
Local Dev
495054ca8a feat(sirius-x/signin): PIN escrow — encrypted-at-rest quick unlock, 3-strike password fallback
Removes the sessionStorage plaintext-mnemonic cache (fixed under the
same commit) and replaces it with a PIN-encrypted blob in localStorage.
No plaintext secret ever touches disk or memory outside the live
BuiltInWallet object.

New js/pin-escrow.js — WebCrypto PBKDF2(50k) + AES-GCM(256). Public
API on window.siriusPin: savePinBlob(mnemonic, pin), tryUnlock(pin),
hasPin(), attemptsUsed(), attemptsRemaining(), clear(), MAX_ATTEMPTS.
Iteration count is lighter than BuiltInWallet's 250k because a 4-6
digit PIN's key space is small anyway; the point is 'not plaintext at
rest,' not brute-force resistance — the durable secret is the full
password.

register-flow.js:
- After a fresh password unlock (Import / Create / Unlock), stepSetPin
  offers a 4-6 digit PIN with confirm — skippable with 'Not now'.
  Never overwrites an existing PIN blob.
- stepUnlock now shows a numeric PIN pad when a PIN blob is present;
  the password field only appears when the user opts to 'Use password
  instead' or after the blob was wiped.
- Wrong PIN → increment counter, surface 'N attempts left'. Third
  wrong PIN → wipe blob and route to a 'PIN reset' screen that hands
  off to the password form.
- Correct PIN → decrypt the mnemonic in-browser, rebuild the
  BuiltInWallet, finishSignIn(). Attempt counter resets to 0.

profile-menu.js:
- Sign-out clears the PIN blob (via siriusPin.clear()) alongside the
  siriusProfile so the device isn't quick-unlockable with a stale PIN.

All pages that host the sign-in flow now include pin-escrow.js. Same
tabbed layout in stepUnlock — the PIN pad and the password field both
live under 🔓 Unlock, transparent tab-switch works exactly as before.

Verified live:
- Fresh Import → 'Set a PIN' step → 4242 confirmed → blob written
- Reload → PIN pad, 3 attempts remaining
- Correct PIN 4242 → signed in, counter resets to 0
- 3 wrong PIN attempts → 'Wrong PIN — N attempts left' per attempt,
  then 'PIN locked — enter your full password to continue', blob
  wiped, next reload shows the password form
- localStorage contains only ciphertext + salt + iv + counter; no
  plaintext mnemonic anywhere on disk or in sessionStorage.
2026-09-09 01:31:18 +02:00
Local Dev
ce9248a327 feat(sirius-x): tier-based label pricing; badges on search cards + TLD list
Single source of truth (js/pricing.js) mirrored on landing, tld.html
and the mint flow — same label always shows the same price everywhere.

Name tiers (label part):
  1 char           $5.00  premium-1
  2 chars          $3.00  short-2
  3 chars          $2.00  short-3
  4–5 chars        $1.00  standard
  6–7 chars        $0.50  long
  8–16 chars       $0.25  extended
  17+ chars        $0.10  very-long
  all-digits       ×0.5   (less brandable)
  contains hyphen  ×0.7

TLD tiers (label part):
  1 char           $10.00  premium-1
  2 chars          $8.00   short-2
  3 chars          $6.00   short-3
  4–8 chars        $5.00   standard
  9+ chars         $4.00   long

Rendering:
  - Landing #search-results: acid-tinted price badge on each available
    row; grid grew a fourth column so name + badge + price + button
    all sit on one line
  - tld.html search result-card: same price badge next to the Register
    button on available TLDs
  - tld.html registered-TLDs table: new 'Mint price' column showing the
    tier price for every registered TLD, so buyers see the pricing
    ladder next to concrete examples

Mint pipe:
  - startFlow(name)/startTldFlow(label) resolve the label price via
    window.siriusPricing (default) but honour opts.serviceFeeSats when
    the caller passes one — leaves the door open for coupons /
    operator discounts / oracle overrides in a future revision without
    reshuffling call sites
  - The overridden service fee is threaded through quoteRegistration
    AND registerWithBuiltInWallet/registerWithExternalWallet so the
    confirm screen and the on-chain output agree

Chipnet placeholder rate (250,000 sat/USD) stays in pricing.js;
mainnet will swap in a live BCH/USD oracle. Operator-side discounts
and coupon codes are the next iteration — deliberately not disclosed
in this shipping copy.
2026-09-09 01:09:05 +02:00
Local Dev
0dc79c6c13 feat(sirius-x): show mint prices; reuse unlocked wallet for TLD/name mint
Two things:

1. Reuse the wallet the user already unlocked (adoptSignedInWallet).
   startFlow / startTldFlow were always calling stepWallet(), which
   showed the four-option wallet-choice and then prompted for the
   password again on 'Unlock'. Right after signing in, that meant
   entering the password twice to buy a TLD. Now both flows check
   window.siriusWallet at start and, if it's populated (built-in
   wallet in memory, or a WC-wrapper with a live session), skip
   straight to stepFund with state.wallet already set. Password is
   only asked when there is no in-memory wallet to reuse.

2. Prices are visible on the landing card + tld.html search:
   - name: '≈ 10,000 sat service fee · 1,300 sat chain dust · < 1 ¢'
     with a note that the 90/10 split applies (TLD owner gets 90 %)
   - TLD: '≈ 1,250,000 sat · ≈ ' with the incentive line
     ('you earn 90 % of the fee on every name registered under
     your TLD — forever, no renewals')
   Both labelled 'chipnet placeholder' — mainnet will price by
   label length via an on-chain oracle.

PIN as a lighter approval than the full password is a bigger design
change (encryption key derivation, cache lifetime, revocation) — not
in this commit; adopting the already-unlocked in-memory wallet is
the fix that removes the password-again symptom for now.
2026-09-09 00:30:05 +02:00
Local Dev
109e9e7351 feat(sirius-x): admin TLD hide/unhide + tabbed sign-in modal (4 direct actions)
Two features:

1. Operator can hide TLDs from the public /api/tlds listing so hidden
   TLDs stop appearing in name-search UIs. On-chain registrations
   under a hidden TLD keep resolving — this is a UX filter, not
   enforcement.

   Gateway (public-gateway.mjs):
   - Persistent HIDDEN_TLDS set backed by hidden-tlds.json next to
     the service script
   - GET /api/tld-visibility  -> {hidden:[...]}                (public)
   - POST /api/tld-visibility -> updates the list (operator-gated by
     Bearer BNS_OPERATOR_TOKEN env var; if unset, all writes refused
     so we default-deny)
   - /api/tlds filters out HIDDEN_TLDS; add ?include_hidden=1 to see
     everything (used by the admin panel to show all rows)
   - Operator token installed via systemd override on the VPS

   Admin panel:
   - New 'Operator token' card at the top of the TLD-registry section;
     token stored in sessionStorage (not localStorage) so a full
     browser close forgets it
   - Each TLD row got a 'Hidden from public' checkbox that POSTs on
     toggle and refreshes the table; failures roll back the checkbox
     and surface the error next to the token field

2. Wallet dropdown restored to 4 direct actions
   (Unlock / Create a wallet / Import a wallet / WizardConnect) and
   the shared mint/sign-in modal grew a tab strip so users can switch
   between the four wallet actions from any step without going back
   to a choice screen.

   register-flow.js:
   - renderTabs(active) prepended to stepCreate/stepImport/stepUnlock/
     stepExternal when signInOnly is set. Unlock tab only appears
     when a saved wallet exists.
   - Delegated click handler on the sheet routes tab clicks to the
     matching step; switching away from a live WC session tears it
     down first so we don't leak WebSockets.

   profile-menu.js:
   - Restored 4-item onboarding menu (Create/Import/WC plus Unlock
     when saved). Each item is a direct entry point; the tabbed modal
     lets the user pivot to any other option without closing.

Cache-buster bumped on all 8 sirius-x pages to ?v=20260908tabs.
2026-09-08 02:19:41 +02:00
Local Dev
e19226cbbb feat(sirius-x): choice-first wallet UX, Bitcoin Cash Domain Names in Theseus copy
Two changes:

1. Wallet dropdown simplified from three direct-action items into one
   'Sign in or create wallet' launcher (plus 🔓 Unlock when a saved
   wallet is present). The single item opens the shared modal at
   stepWallet — the choice screen showing all four options (Unlock /
   Create / Import / WizardConnect) as clear cards. Clicking a card
   reveals its form. Users see the options first, then commit to a
   path, instead of landing on a form for one path without seeing the
   others.

   register-flow.js's stepWallet grew a signInOnly-aware header ('Sign
   in or create a wallet' / 'Pick one. Your keys stay in this browser')
   so the choice screen reads as sign-in context, not a name mint.
   startSignIn still accepts direct-mode entry points (new/import/wc/
   unlock) for deep-links like portal.html?mode=X, but the nav dropdown
   funnels to 'choose' for the choice-first experience.

2. Theseus subpage copy updated per request: 'native .bch / BCNR name
   resolution built in' -> 'native Bitcoin Cash Domain Names resolution
   built in'. Meta description mirrored.
2026-09-08 01:43:35 +02:00
Local Dev
afeae356aa feat(sirius-x): 🔓 Unlock my wallet in nav dropdown when a saved wallet exists
Previously, the only way to unlock a wallet that had been saved in this
browser was to click Register (name or TLD), open the modal, and pick
'Unlock my browser wallet' from the wallet-choice step. From the nav
dropdown you could only start onboarding fresh (New / Import / WC).

profile-menu.js now checks localStorage for the BuiltInWallet's storage
key (bns.wallet.v1) at every render, and when a saved wallet is present
inserts a '🔓 Unlock my wallet' item at the top of the not-signed-in
dropdown — with a divider below it, so it reads as the primary action
and the Onboarding options stay available for adding a different wallet.

The dropdown click handler already lazy-loads register-flow.js and
calls window.siriusSignInWallet(action); register-flow.js's startSignIn
grew an 'unlock' mode that opens the modal directly at stepUnlock (the
password prompt). Same success path as every other sign-in: on unlock
success, siriusProfile is written and the modal closes with '✓ Signed
in' — the nav pill flips to the address without a reload.

Verified end-to-end on landing: saved wallet detected -> dropdown shows
Unlock as first item -> click -> password -> '✓ Signed in' -> pill
becomes 'qqyx49…zx8x seed ▾' with no reload. TLD mint from tld.html
also verified end-to-end: search 'e2etldtest' -> Register -> modal ->
Unlock -> password -> Fund -> Confirm (fee 1,250,000 sat + beacon dust
~1,300 sat) -> Register -> checking-availability -> loading-coins ->
'wallet is empty' (expected without chipnet funds; downstream code is
the same registerTldWithBuiltInWallet path the CLI uses).
2026-09-08 00:24:54 +02:00
Local Dev
bce4aa3529 feat(sirius-x): pencil Register icon + TLD mint via shared modal
Two UX polishes:

1. Register-tab icon flipped from 🪪 (identification-card emoji, renders
   as a hollow box in system-ui fonts without extended emoji) to ✏️
   (pencil), which reads as 'edit/create' and ships in every emoji font
   worth targeting. Changed across the nav on all 8 pages plus the
   footer injector's Product column. Kept the Register nav item — six
   items total in the nav, and from any subpage it's one click to the
   search on landing.

2. tld.html no longer duplicates the wallet-choice + mint flow inline.
   The Register button on a search result now hands the label off to
   the shared register-flow.js modal — same modal that name registration
   uses — via a new window.siriusRegisterTld(label, {serviceFeeSats})
   entry point.

   register-flow.js grew:
   - startTldFlow / window.siriusRegisterTld: sets state.tld and walks
     the modal through wallet-choice → Fund → stepConfirmTld → stepRegisterTld
     → stepDoneTld
   - stepConfirmTld: shows label + fee + owner, no per-name quote
   - stepRegisterTld: dispatches to registerTldWithBuiltInWallet or
     registerTldWithExternalWallet based on state.wallet/state.session
   - stepDoneTld: 'X is yours' with txid + certificate id + operator
     address, no record editor (a TLD certificate has no records to
     set immediately)
   - stepWallet / stepExternalConfirm branch on state.tld so the modal
     heading and the WC-confirm path route correctly

   tld.html trimmed: removed the entire signin-section + mint-section
   plus their inline handlers (~250 lines gone). Now just search +
   registered-TLDs list + a delegator to the shared modal. If a user
   is already signed in via the wallet dropdown, the modal recognises
   the saved wallet ('Unlock my browser wallet' button appears) instead
   of asking them to sign in again on this page.
2026-09-08 00:10:11 +02:00
Local Dev
5e0c971c23 feat(sirius-x): inline wallet dropdown — no navigation, no portal detour
Wallet dropdown items (New / Import / WizardConnect) were navigating
to portal.html?mode=X and asking the user to click again on arrival.
That is 'the sign in landing page which is not functioning' from the
user's perspective — a whole redirect for one form.

Now every dropdown item opens the mint modal (register-flow.js) inline
at the matching step, on whatever page the user is on:
  New         -> stepCreate  ('Create your wallet' — password + generate)
  Import      -> stepImport  ('Import a recovery phrase' — textarea)
  WizardConnect -> stepExternal ('Open your wallet' — QR/URI)

register-flow.js grew a signInOnly mode: state.name is null, the step
Back buttons close instead of going to a wallet-choice step there is
no context for, and on wallet-loaded the flow writes siriusProfile
and shows a 'Signed in' confirmation instead of Fund -> Confirm -> Mint.

WC signInOnly keeps the session alive (state.session) so a later
record edit can reuse it without a fresh QR handshake.

profile-menu.js: menu items became <a data-action='new|import|wc'>
and the click handler lazy-loads register-flow.js on demand — the
docs/brand/theseus pages don't ship it in their initial payload, so
their nav pill loads it the first time a wallet button is clicked and
caches it for subsequent opens. Falls back to portal.html?mode=X if
the module can't load. Cache-buster bumped so cached copies pick up
the new behavior.

Importmap for @bitauth/libauth added to docs/, brand/, theseus/ so
the bundle's bare specifier resolves when register-flow.js is
lazy-loaded from those pages.

Verified end-to-end on the live docs page: all three dropdown items
open the modal inline at the correct step, no console errors, no
navigation.
2026-09-07 23:52:12 +02:00
Local Dev
94bf3bcf68 feat(sirius-x): merge register.html into landing via shared mint flow
Register.html and the landing were running duplicate name-search UIs.
The register one was reported broken; the landing one already works
inline. Merged both into the landing:

- New js/register-flow.js — the full mint modal + wallet setup (Create /
  Import / Unlock / WizardConnect / Fund / Confirm / Register / Point
  it somewhere) extracted from register.html's <script type='module'>
  and turned into a shared module. Injects its own scoped modal HTML +
  CSS into the host page on load and exposes
  window.siriusRegisterName(fullName) as its public entry point.

- Landing search results now have Register buttons that call the shared
  flow directly. The whole 'search -> pick name -> mint' journey stays
  on one page, no redirects, no duplicate search UI to maintain.

- register.html reduced to a redirect stub: preserves ?q= if present,
  refreshes/JS-forwards to './' (landing), and shows a one-line
  'Name search moved to the home page' fallback for JS-off users.
  Old links keep working; no /register.html deep links are broken.

- All nav 'Register' entries now point at './#search-input' (or
  '../#search-input' on subpages), scrolling straight to the landing
  search box. Footer injector and every internal href updated the
  same way. Zero live href='.../register.html' left in the tree.

Verified: register.html?q=hello redirects to /?q=hello; landing
search 'fresh42abc' -> Register button -> modal opens with
'Register fresh42abc.bch' at the wallet-choice step.
2026-09-07 22:36:02 +02:00
Local Dev
b25fc40b0d feat(sirius-x/nav): use theseus.x compass SVG in Theseus button, not emoji
The nav's 'Theseus' link showed a generic 🧭 emoji, which renders
differently in every browser/OS and does not match theseus.x's
actual brand mark. Replaced with a small inline SVG of theseus.x's
compass (rounded dark square, N-half red, S-half acid) at 14x14 so
the button now carries theseus.x's real logo — recognisable and
identical everywhere.

Inlined the SVG rather than pointing at a shared asset so there's no
extra request per page and no relative-path arithmetic between root
and subdir pages. Applied to all 8 pages: landing, portal, register,
tld, theseus, docs, brand, admin.
2026-09-07 22:17:33 +02:00
Local Dev
57d7167900 feat(sirius-x): consistent top nav order, Theseus.X branding on theseus subpage
Nav consistency: subpages had Try it → Theseus → Register → TLD while
the landing had Try it → Register → TLD → Theseus. Reordered every
page to the landing's order, so the top nav is identical everywhere:

  Sirius.X | Try it | 🪪 Register | 🌐 TLD | 🧭 Theseus | 🔑 Sign in

(Admin adds its own 🛠 Admin between Theseus and Sign in since Admin
is the current page.)

Theseus subpage now carries Theseus.X's own branding: the compass
favicon (N-half red, S-half acid) copied from silentmode.st/bns/
theseus.x/assets/ lives under site-sirius-x/theseus/assets/, and the
subpage references it for <link rel=icon>, <link rel=mask-icon>, and
og:image. og:site_name flipped from 'Sirius.X' to 'Theseus Navigator'.
Hero mark swapped from the generic 🧭 emoji to the actual compass
SVG at 72px with a soft acid glow, so the page reads as Theseus at a
glance instead of borrowing Sirius's star.

Sign-in end-to-end verified on the live site:
- Landing dropdown → New wallet → portal auto-generates 12-word phrase
- Ack + Continue → me section revealed, siriusProfile written with
  {address, tokenAddress, source: 'seed', signedInAt}
- Nav pill updates to 'qzc2vx…yn93 seed ▾' without reload
- Sign out → profile cleared, portal reset, pill back to 'Wallet ▾'
- Wallet address derives deterministically from the fresh mnemonic
  (BuiltInWallet.create → deriveSeedFromBip39Mnemonic → HD path)
2026-09-07 22:05:45 +02:00
Local Dev
e4277832dd feat(sirius-x): footer everywhere, redesigned wallet button, dropdown auto-acts
Three UX fixes:

1. Beautiful footer on every page. Extracted the 4-column landing footer
   into js/site-footer.js — reads the nav brand link to derive per-page
   base ('./' at root, '../' in subdirs) so links resolve from any depth
   without duplicating the HTML across 8 pages. Every page now ships an
   empty <footer id="site-footer"></footer> and includes the injector;
   inline footer + its CSS block removed from landing too so the source
   stays in one place.

2. Wallet button redesign. Pill now shows a state dot (dim when not
   signed in, green with subtle glow when signed in), a monospace short
   address label when signed in ('qra6rs…7yl2') OR 'Wallet' when not,
   a WC/seed badge on signed-in state, and a subtle caret. Full border
   and hover states, proper aria-expanded/aria-label wiring. Dropdown
   menu itself upgraded: grid layout per item (icon column + title +
   hint), heavier backdrop blur, larger min-width, clearer typography.

3. Dropdown options actually do something. Removed the redundant 'Open
   sign-in page →' item — the other three all land on portal too, so
   listing 'open the page' as a fourth option was noise. On portal
   arrival, the ?mode= handler now AUTO-TRIGGERS the primary action for
   each mode:
     new    -> click Generate a phrase (12 words appear immediately)
     import -> focus the seed textarea (cursor ready to paste)
     wc     -> click Connect wallet (WC session starts, URI shown)
   No extra clicks between dropdown choice and the flow it names.

Cache-buster on the profile-menu.js include bumped to
?v=20260907wallet so cached copies pick up the new design; footer
injector at ?v=20260907rel.
2026-09-07 22:00:21 +02:00
Local Dev
cf04b583aa feat(sirius-x): public tld.html — search + mint a TLD end-to-end
Missing user-facing surface: minting a TLD required either the portal
(sign in first, register second, tucked under 'Signed in') or the
operator-only admin panel. New tld.html is a public, single-purpose
page that lets anyone go straight from label to certificate.

Flow: type a label → live check against /api/tlds → 'Register .foo →'
appears → sign-in cards (New / Import / WizardConnect) revealed inline
→ mint section shows label, address, price → submit walks through
'connected → checking-availability → loading-coins → building →
signing → broadcasting → registered'.

Wire is proven end-to-end (search returns a registerable card for
free labels, wallet flow generates a valid seed, address, submit
reaches 'wallet is empty' with a friendly faucet hint for the
signed-in address). Downstream of loading-coins is the same build/
sign/broadcast path exercised by every name registration.

Dispatch on wallet.source uses registerTldWithExternalWallet when
signed in via WC, else registerTldWithBuiltInWallet. Live TLD table
under the search shows every currently registered TLD with its
category; refreshes on successful mint.

Nav: '🌐 TLD' added to all 7 pages between Register and Brand.
Landing's 'Register a TLD' card now points here (previously linked
to the operator admin, which locked out anyone who isn't operator).
2026-09-07 20:39:11 +02:00