diff options
| author | Adam Soltys <[email protected]> | 2026-06-15 23:46:46 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-06-15 23:46:46 -0700 |
| commit | b312abb4432cb3258c896541babd9a31c9aabca9 (patch) | |
| tree | 66d381d32d1fd61f66b426110b1d4a5fba79c5cd /src | |
| parent | eedba2f7f78b2ed5297a28ee88c70466ff13aa67 (diff) | |
| download | coinosv3-b312abb4432cb3258c896541babd9a31c9aabca9.tar.gz coinosv3-b312abb4432cb3258c896541babd9a31c9aabca9.zip | |
Add footer; default to public explorers (proxy via localStorage opt-in)
- Footer: "made with ♥ by Adam Soltys" (links adamsoltys.com) and "source
available on GitHub" (links the repo).
- Explorer endpoint now defaults to the public explorers; a rate-limited
machine can opt into a proxy via localStorage('explorer-proxy'). Correct for
a hosted multi-user deploy (each visitor uses their own IP).
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Diffstat (limited to 'src')
| -rw-r--r-- | src/api.js | 15 | ||||
| -rw-r--r-- | src/app.js | 15 | ||||
| -rw-r--r-- | src/style.css | 3 |
3 files changed, 29 insertions, 4 deletions
@@ -6,9 +6,18 @@ // - a 429 from ANY request immediately backs off ALL subsequent requests // (global exponential pause), easing back as requests succeed. -// TEMPORARY: route explorer traffic through a VPS while this IP is rate-limited -// by mempool.space. Set PROXY = '' to go back to the public explorers directly. -const PROXY = 'http://51.79.52.200:8088'; +// Explorer endpoint. Defaults to the public explorers (correct for a hosted, +// multi-user deploy — each visitor uses their own IP). A specific machine whose +// IP is rate-limited can opt into a proxy at runtime: +// localStorage.setItem('explorer-proxy', 'http://51.79.52.200:8088') +// (http proxy only works when the page itself is served over http/localhost). +const PROXY = (() => { + try { + return localStorage.getItem('explorer-proxy') || ''; + } catch { + return ''; + } +})(); const BACKENDS = PROXY ? { @@ -73,8 +73,21 @@ function h(tag, attrs = {}, ...children) { } const root = document.getElementById('app'); +function footer() { + return h( + 'div', + { class: 'footer small muted center' }, + 'made with ', + h('span', { style: 'color:#e25555' }, '♥'), + ' by ', + h('a', { href: 'https://adamsoltys.com', target: '_blank', rel: 'noopener' }, 'Adam Soltys'), + h('span', { class: 'faint' }, ' · '), + h('a', { href: 'https://github.com/asoltys/cold', target: '_blank', rel: 'noopener' }, 'source available on GitHub') + ); +} + function render() { - root.replaceChildren(ui.screen === 'wallet' ? walletScreen() : unlockScreen()); + root.replaceChildren(ui.screen === 'wallet' ? walletScreen() : unlockScreen(), footer()); } wallet.subscribe(render); diff --git a/src/style.css b/src/style.css index 2d11662..160cca2 100644 --- a/src/style.css +++ b/src/style.css @@ -208,6 +208,9 @@ textarea { resize: vertical; min-height: 84px; font-family: var(--mono); font-si .toast.show { opacity: 1; transform: translateX(-50%) translateY(0); } .words .w.masked .t { color: var(--faint); letter-spacing: 2px; } +.footer { margin-top: 28px; padding-bottom: 8px; } +.footer a { color: var(--accent-ink); font-weight: 600; } + /* Clickable unit labels (BTC/sats) — look like text, toggle the global unit. */ .unit-tag { background: none; border: 0; padding: 0; margin: 0; font: inherit; cursor: pointer; |
