Shortcut: Ctrl+Shift+M -> Ctrl+Shift+E. Chrome owns Ctrl+Shift+M as
'switch profile' and E matches the Greek spelling (Ermis).
Sidebar discoverability: new bundled add-on at bundled-addons/hermes/
registers a left-strip icon + launcher panel. The panel is a thin chrome
(mark + 'Open Messages' + shortcut hint) that forwards clicks through
api.onMessage -> ipcMain.emit('hermes-open-request') -> openHermesWindow.
All real messaging code stays in main.js — add-on is purely for discovery.
Address book: opt-in vCard (.vcf) import. Dialog in the Add Contact modal
lets the user pick a file; main.js parses BEGIN:VCARD blocks for X-BNS-NAME
/ X-NOSTR-NPUB / X-NOSTR-PUBKEY plus .bch names and npubs mentioned in
NOTE fields. Candidates are previewed per-contact with checkboxes; nothing
is added until the user confirms. Non-matching vCards are returned too (so
the user can still add manually) rather than silently dropped. Nothing is
uploaded; parsing is local.
site/hermes: status badge flipped from 'designed - not yet built' to
'MVP - desktop'. New 'What ships today' grid covers threaded chat, send by
name, address book, local history (all live) and mobile + Tor (next /
planned). Hero carries the new Ctrl+Shift+E shortcut and a link to
/hermes/branding.
site/hermes/branding: new page. Mark SVG (winged envelope, two variants
for 16-20px and 24-160px display sizes), palette (reuses Silent Mode
tokens + an amber accent that's distinctly warm-yellow, not Hermes-orange
— so it never collides with Hermès the fashion house), name explanation
(English Hermes / Greek Ermis), voice notes, do/don't table, MPL-2.0
attribution.
Hermes/MOBILE-RECOMMENDATION.md: analysis of three mobile paths (inside
Ariadne / standalone / hybrid). Recommendation is Option 1: ship as a
screen inside Ariadne. Reuses the wallet seed, aligns with the design
doc's 'one seed many purposes' architecture, lowest total cost.
69 lines
3 KiB
HTML
69 lines
3 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Hermes</title>
|
|
<style>
|
|
:root { color-scheme: light dark;
|
|
--bg:#0e131c; --panel:#141a24; --line:rgba(255,255,255,.09);
|
|
--ink:#e7eaf1; --mut:#8b98a9; --dim:#5e6678; --acid:#d6ff3d;
|
|
--amber:#f4c430; }
|
|
@media (prefers-color-scheme: light) {
|
|
:root { --bg:#f8faff; --panel:#ffffff; --line:rgba(0,0,0,.10);
|
|
--ink:#1a1f2b; --mut:#5c6577; --dim:#8a93a5;
|
|
--acid:#088A66; }
|
|
}
|
|
* { box-sizing: border-box; }
|
|
html, body { margin: 0; height: 100%; }
|
|
body { background: var(--bg); color: var(--ink);
|
|
font: 14px/1.5 system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
|
|
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
|
padding: 24px 20px; text-align: center; gap: 14px; }
|
|
.mark { color: var(--acid); line-height: 0; }
|
|
.mark svg { width: 72px; height: 72px; display: block; }
|
|
h1 { margin: 0; font-size: 18px; font-weight: 600; letter-spacing: .3px; }
|
|
.lede { color: var(--mut); font-size: 13px; margin: 0; max-width: 260px; }
|
|
button { font: inherit; font-weight: 600; cursor: pointer;
|
|
background: var(--acid); color: #0a0d13; border: none;
|
|
padding: 10px 20px; border-radius: 999px; }
|
|
button:hover { filter: brightness(1.08); }
|
|
.shortcut { color: var(--dim); font-size: 11.5px; margin-top: 4px; }
|
|
.shortcut kbd { background: var(--panel); border: 1px solid var(--line);
|
|
border-radius: 4px; padding: 1px 6px; font-family: ui-monospace, monospace;
|
|
font-size: 10.5px; color: var(--ink); }
|
|
.err { color: #f6768a; font-size: 12px; min-height: 1em; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="mark" aria-hidden="true">
|
|
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
|
|
<g fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
|
|
<rect x="20" y="23" width="24" height="18" rx="2"/>
|
|
<path d="M20 25 L32 35 L44 25"/>
|
|
<path d="M20 30 L7 27"/>
|
|
<path d="M20 34 L8 36"/>
|
|
<path d="M44 30 L57 27"/>
|
|
<path d="M44 34 L56 36"/>
|
|
</g>
|
|
</svg>
|
|
</div>
|
|
<h1>Hermes</h1>
|
|
<p class="lede">Message anyone by their <code>.bch</code> name. Sealed-sender DMs over Nostr.</p>
|
|
<button id="openBtn">Open Messages</button>
|
|
<div class="shortcut">or press <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd></div>
|
|
<div class="err" id="err"></div>
|
|
|
|
<script>
|
|
const bridge = window.silentmode && typeof window.silentmode.invoke === "function" ? window.silentmode : null;
|
|
const err = (m) => { document.getElementById("err").textContent = m || ""; };
|
|
document.getElementById("openBtn").addEventListener("click", async () => {
|
|
err("");
|
|
if (!bridge) { err("sidebar bridge unavailable"); return; }
|
|
try {
|
|
const r = await bridge.invoke("open-messages");
|
|
if (!r || r.ok !== true) err("could not open messages window");
|
|
} catch (e) { err("error: " + (e && e.message || e)); }
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|