aboutsummaryrefslogtreecommitdiffstats
path: root/src/app.js
Commit message (Collapse)AuthorAgeFilesLines
* The mouse drag learns to catch a flick: release velocity over the last ↵Adam Soltys2026-09-021-7/+28
| | | | | | | ~100ms throws the card in the flick's direction, so a quick short pull changes accounts instead of demanding a half-width haul; a slow release still settles nearest Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* History becomes home: the tab bar slims to Receive | Send (tapping the lit ↵Adam Soltys2026-09-021-27/+87
| | | | | | | one puts it away), every landing — login, account creation, an account snapped into the carousel — is the account's own timeline, and that timeline is now SCOPED: Savings shows the on-chain ledger and gift reservations, Spending shows the ark side. The carousel meanwhile learns mouse and mind-reading: desktop gets a real grab-and-pull drag (snap lifted mid-drag, restored on the glide), the peeking neighbor switches on a single click, and the strip wears grab cursors. And a thread's avatars and author names finally go somewhere: profiles stack on top of the conversation and back returns to it Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* The carousel becomes what it was meant to be: two separate balance CARDS ↵Adam Soltys2026-09-021-54/+57
| | | | | | | riding a full-bleed strip — the neighbor card peeks in from the screen edge and snaps into place, instead of two faces crowding one card's chrome. The active card carries the move/top-up buttons and unfold panel; the peeking one stays a clean preview Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* The balance grows a card carousel: Spending and Savings become side-by-side ↵Adam Soltys2026-09-021-37/+82
| | | | | | | faces with the neighbor peeking at the card's edge, dragged and snapped by native scroll-snap — settling on a face IS the account switch, programmatic switches glide the carousel to match, and the old swipe-to-flip gesture yields to the carousel's own drag (it still serves single-face wallets) Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* Recipient search warms its pipes on focus, not first keystroke: the Primal ↵Adam Soltys2026-09-021-3/+5
| | | | | | | cache socket, the registrar's TLS session, and the NIP-50 relay connections each cost a handshake that used to land on the first query — the cold second of dead air. Touching the send recipient field, opening user search, or unfolding New message now pre-opens all three (throttled; the idle reaper still closes the socket a minute after real use) Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* Tab feedback at touch speed: the strip's active state flips with a direct ↵Adam Soltys2026-09-021-2/+14
| | | | | | | DOM write that paints in the same frame as the finger, and the heavy pane render runs after that paint (double-rAF) — running it synchronously on pointerdown meant even the button's own light-up waited out a 100ms+ rebuild Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* Tabs answer the finger, not the click: switching happens on pointerdown (the ↵Adam Soltys2026-09-021-1/+16
| | | | | | | click event lands 100-250ms after the touch, and a tab has no scroll ambiguity to wait out — keyboard activation keeps the click path), every button takes touch-action:manipulation so double-tap-zoom arbitration stops taxing quick taps, and the sliding pane pre-promotes to its own compositor layer — a slow mid-slide re-render was letting Chrome expose unpainted gray tiles at the viewport edges Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* The phone's Back button closes a payment's details instead of teleporting to ↵Adam Soltys2026-08-301-1/+5
| | | | | | | the last tab: the ark move/exit and gift detail views join NAV_FIELDS (an on-chain txDetail always had an entry; the ark rows — most Spending payments — minted none, so Back skipped the history list entirely), and their in-app Back buttons pop that entry rather than pushing another Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* A migrated coinos.io account keeps its face and its cover: the claim fetches ↵Adam Soltys2026-08-301-1/+9
| | | | | | | the legacy avatar and banner and fills the kind 0's empty slots (fill, never overwrite — an existing nostr identity keeps its own look), the wizard's punk picker steps aside for a profile that already has a picture, and v3 finally wears cover photos — nostr's standard kind-0 banner renders full-bleed across the top of every profile card with the avatar overlapping it, settable by URL or upload in the profile editor Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* The migration round trip stops eating its own homework: the ?migrated= ↵Adam Soltys2026-08-301-20/+67
| | | | | | | return is stashed synchronously at boot and claimed whenever the wallet actually opens (the old 1.5s one-shot silently dropped it), the wizard's 'I'm done, continue' state survives the trip to coinos.io as a persisted step, the legacy page shows the claim in progress instead of re-asking, and a finished claim advances the wizard by itself. Fresh-seed polish riding along: the spending-setup ask stops waiting out registrar round trips that only exist for restored wallets, and the header punk paints synchronously instead of after an async identity fetch Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
* A round's output can no longer strand: every refresh asks the server to drop ↵Adam Soltys2026-08-291-1/+4
| | | | | | | its unlock hash in the mailbox, and any device that finds such a breadcrumb with no matching action adopts the claim itself (input ids now read from the status response — the rescue needs no operator). History learns to tell the whole truth and nothing more: coins the server saw spent elsewhere get a folded row (skipping coins a known renewal consumed), renewals fold across devices on their unlock hash and appear only when they cost something, and a rescue records the fee the round actually took. The account page keeps its header icons when reached from an open wallet; the messages page folds the control/guestbook replay once per burst instead of painting every intermediate state — no more blinking messages from superseded ban lists or member counts crawling to their total, which now paints from last session's settled figure Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019WboeoetMF3MTmgT7Ew8yi
* The profile editor learns to take a photo, not just a URL: an Upload button ↵Adam Soltys2026-08-281-0/+3
| | | | | | | feeds the same signed nostr.build path the onboarding picker uses and fills the picture field with the result Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Max learns the ark rail: an ark address gets its own Max button filling the ↵Adam Soltys2026-08-281-1/+9
| | | | | | | whole spendable Spending balance — free sends mean the maximum really is the balance Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The sticker gets specific: v3 betaAdam Soltys2026-08-281-1/+1
| | | | | Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The logo wears its beta sticker — purple, tilted like staging's orange ↵Adam Soltys2026-08-281-2/+3
| | | | | | | one, present from the static boot shell's very first paint so it never pops in Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* A detail page doesn't survive changing accounts: switching ↵Adam Soltys2026-08-281-0/+6
| | | | | | | Spending↔Savings with a payment record open closes it and lands on Receive — the record belonged to the other side Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Forget-all keeps its word: the delete-everything warning lives inside the ↵Adam Soltys2026-08-281-3/+4
| | | | | | | logout popup now, and confirming it wipes on the spot and lands on the front door — no detour through the Accounts page that looked like the deed was done when only a confirm screen had opened Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Arrivals don't slide, only journeys do: the tab pane and balance face ↵Adam Soltys2026-08-281-3/+16
| | | | | | | animate for deliberate switches alone — the wallet's first frame after sign-in, and a background arkReady revealing Spending, simply appear in place Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The address is fetched while the key still turns in the lock: sign-in races ↵Adam Soltys2026-08-281-0/+3
| | | | | | | a registrar lookup against the seed work and seeds the name before first paint, so the Receive pane opens straight onto its QR instead of "setting up your payment address" Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The wallet remembers it has a spending side: the relay backup carries the ↵Adam Soltys2026-08-281-2/+7
| | | | | | | hint, stamped the moment spending becomes real, so a restore paints Spending from its first frame instead of reflowing when the name lookup catches up — and the sign-in toasts are gone, since a wallet appearing announces itself Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The wallet arrives without ceremony: sign-in swaps screens instantly (a ↵Adam Soltys2026-08-271-1/+8
| | | | | | | one-shot no-anim flag on the handover), and the spending-setup ask holds its tongue until the name restore has settled instead of flashing while the answer is seconds away Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* All three doors on the porch: Google, passkey, and Nostr sign-in stand ↵Adam Soltys2026-08-261-9/+11
| | | | | | | directly on the welcome screen — Google and passkey act in place, the Nostr button steps into the signer list as before Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The app arrives in movements: real ESM chunks split the bundle (entry 333KB, ↵Adam Soltys2026-08-261-3/+22
| | | | | | | shared chunks alongside, 61KB of gifts/NWC/hats deferred past first paint into slots that keep their hook seniority), the lazy scripts wear IIFE coats so their names can't collide with the page's — which is what silently broke the remote-signer button — nip98 moves out of the login module so minimal builds stop hauling backup relays, and the smoke test learns the front door's new steps while the regtest stack rises from its IBD nap Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The landing settles as one motion: the resolving shell now holds the frame ↵Adam Soltys2026-08-261-1/+5
| | | | | | | over every screen — an auto-restored wallet no longer flashes its home page — and the animation clock stands still until the profile has replaced the shell in place, so nothing slides twice Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Money stops arriving without a story: the mailbox checkpoint stays local ↵Adam Soltys2026-08-181-6/+7
| | | | | | | reading progress (a merged one skipped every unprocessed message), vtxos that beat their message here get a backfilled receive, and the commit stamp takes its own footer line Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The footer reads as a sentence: Running, then the hash, and only the hash is ↵Adam Soltys2026-08-181-3/+3
| | | | | | | the link Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The footer says what it stamps: the word commit, the short hash git actually ↵Adam Soltys2026-08-181-3/+4
| | | | | | | knows, and a link to it — the build token stays where it belongs, inside the service worker Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* A missing signer opens a door instead of a toast: the reconnect screen ↵Adam Soltys2026-08-181-0/+1
| | | | | | | offers the extension, the signer-app link, or a pasted key — same account enforced — and the silent reattach closes it on its own when it lands Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* A crashed render confesses instead of playing dead: the error goes on screen ↵Adam Soltys2026-08-181-0/+26
| | | | | | | with a Reload button, ending the silent every-tap-is-a-no-op brick Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The footer signs its build: one glance settles whether the PWA is running ↵Adam Soltys2026-08-181-1/+4
| | | | | | | today's code or last Tuesday's Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The top-up prompt counts money already on its way: a board awaiting ↵Adam Soltys2026-08-181-2/+4
| | | | | | | confirmation quiets both the card button and the wizard step Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* Money finds its way to Spending: the setup wizard ends with a top-up step ↵Adam Soltys2026-08-181-3/+25
| | | | | | | when Savings can fund one, and a low Spending face wears a one-tap Top up from Savings button Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The avatar ask learns to recognize a face: an identity with a published ↵Adam Soltys2026-08-171-1/+8
| | | | | | | picture skips the punk picker and lands straight on done Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* Old money stops surprising: a payment confirmed more than fifteen minutes ↵Adam Soltys2026-08-171-1/+6
| | | | | | | ago is news, not an event — the celebration is reserved for arrivals you could actually be waiting on Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* A picked punk publishes its full address: the avatar step stops writing ↵Adam Soltys2026-08-171-2/+5
| | | | | | | relative paths into kind 0, where they broke real faces on every other client Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The spending tap keeps its promise and then makes an offer: the account ↵Adam Soltys2026-08-171-3/+8
| | | | | | | exists before the username and avatar prompts, so declining them costs nothing Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* One tap grows the Spending side: same seed, named Spending, no wizard — ↵Adam Soltys2026-08-171-9/+14
| | | | | | | and deliberate latches carry timestamps so the phantom-healer only eats the legacy booleans Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The savings-only card offers the door: Set up a spending account sits right ↵Adam Soltys2026-08-171-2/+5
| | | | | | | on the balance instead of hiding behind a face you can't swipe to Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* Spending admits it exists: a wallet created AS Spending needs no further ↵Adam Soltys2026-08-171-4/+31
| | | | | | | proof, a name claimed inside the wizard latches on any network, and off-mainnet Receive shows the ark address instead of quietly handing out an on-chain one Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The phantom Spending flag heals itself: off mainnet, a spending side with no ↵Adam Soltys2026-08-171-1/+12
| | | | | | | balance and no history admits it was never set up Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* A mainnet name stops vouching for mutinynet spending: the claimed-address ↵Adam Soltys2026-08-171-2/+7
| | | | | | | evidence only counts on the network it was claimed on Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* One Back per screen: the outer step's back yields while the entropy page ↵Adam Soltys2026-08-171-2/+3
| | | | | | | holds the floor Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* Entropy gets a room of its own: a button beside Copy and Regenerate opens a ↵Adam Soltys2026-08-171-41/+64
| | | | | | | page of just text and Submit — the derivation happens once, on the way out, not under your fingers Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The entropy fold drops the arrow act: a plain Entropy button opens it on ↵Adam Soltys2026-08-171-2/+2
| | | | | | | both panes Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The import pane learns the entropy trick: the same fold, the same text, the ↵Adam Soltys2026-08-171-20/+40
| | | | | | | same wallet — typed entropy fills the phrase field with its derived words and clears only what it filled Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The entropy door moves behind the phrase: newcomers see one Generate button, ↵Adam Soltys2026-08-171-19/+26
| | | | | | | tinkerers unfold the toggle after — typing re-derives the words live, clearing restores the random draft Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* Own entropy means owned outcome: the typed text alone derives the seed, so ↵Adam Soltys2026-08-171-4/+7
| | | | | | | re-typing it is an import on any device — the warn-box says what that guarantee costs, and Regenerate bows out of a deterministic job Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The seed takes dice: an optional entropy field folds open on the generate ↵Adam Soltys2026-08-171-2/+18
| | | | | | | step, hashed with the device's own randomness so it can only strengthen the phrase — and the forget option now says all data, which is what it takes Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* One Log out button, one honest question: the popup offers the plain exit and ↵Adam Soltys2026-08-171-0/+1
| | | | | | | the full forget, each keeping its own warnings Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The profile grows a second, honest exit: Log out leaves the room, Log out & ↵Adam Soltys2026-08-171-0/+12
| | | | | | | forget this device burns it down — behind the Delete-all warning, which now also sweeps the cached balances and history it always implied Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz