Skip to content

Add unit tests for resources/Hooks/useFocusableRef and app/hooks/useCompact#1790

Closed
wakamex wants to merge 68 commits intofloating:developfrom
wakamex:swarm/worker-4-1772436557
Closed

Add unit tests for resources/Hooks/useFocusableRef and app/hooks/useCompact#1790
wakamex wants to merge 68 commits intofloating:developfrom
wakamex:swarm/worker-4-1772436557

Conversation

@wakamex
Copy link

@wakamex wakamex commented Mar 2, 2026

Implements frame-modernized-7jh.34: Add unit tests for resources/Hooks/useFocusableRef and app/hooks/useCompact

Changes

  • test/resources/Hooks/useFocusableRef/index.test.js — 8 tests:

    • Returns a ref object
    • Calls element.focus() after default 900ms delay when focus=true
    • Does NOT call element.focus() when focus=false
    • Does NOT call element.focus() when focus=undefined
    • Custom delay — focus called after specified delay, not default
    • Cleanup — clearTimeout called on unmount
    • No error when ref.current is null
    • Re-render with focus changing true→false clears timer
  • test/app/hooks/useCompact.test.js — 6 tests:

    • Returns a boolean
    • Returns false (full layout) when window.innerWidth is above breakpoint
    • Returns true (compact layout) when window.innerWidth is below breakpoint
    • Updates to compact when window resizes below the breakpoint
    • Updates to full when window resizes above the breakpoint
    • Removes event listener on unmount (cleanup)

All 76 component tests pass.

wakamex and others added 30 commits March 1, 2026 22:25
Remove dapp server, notify window, onboard window, and experimental
Babel plugins as the first step of Frame's architectural modernization.

- Strip 7 unused Babel plugins from .babelrc.json (do-expressions,
  pipeline-operator, function-bind, function-sent, throw-expressions,
  decorators, export-default-from) and their devDependencies
- Delete dapp server (main/dapps/, app/dapp/, main/windows/frames/,
  main/windows/extractColors/, main/windows/viewPreload.ts)
- Remove dapp-related IPC handlers, RPC methods, and send.frame.eth
  initialization from main process
- Remove 5 dapp deps (tar-fs, content-hash, ipfs-unixfs-importer,
  cheerio, get-pixels) and their type packages
- Delete notify window (app/notify/) and Notify class
- Delete onboard window (app/onboard/) and Onboard class
- Remove bundle scripts and Parcel targets for dapp, inject, notify,
  onboard
- Clean up FrameManager, createViewInstance, and other dead references

59 files changed, ~3,400 lines removed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Upgrade Electron from v23 (EOL, no security patches) to v40.6.0 with all
required dependency and API migrations:

Dependency upgrades:
- electron: 23.1.3 → 40.6.0
- electron-builder: 25.1.8 → 26.8.1
- electron-updater: 6.3.9 → 6.8.3
- electron-log: 4.4.8 → 5.3.0
- @sentry/electron: 4.3.0 → 7.8.0
- node-hid: 2.1.2 → 3.3.0
- @ledgerhq/hw-transport-node-hid-noevents: 6.30.5 → 6.31.10
- @ledgerhq/hw-transport-node-hid-singleton: 6.31.5 → 6.31.10
- @electron/notarize: 1.2.3 → 3.1.1
- @types/node: 18.14.6 → 22.13.5

Breaking change migrations:
- protocol.interceptFileProtocol → protocol.handle + net.fetch
- @sentry/electron imports split: /main for main process, /renderer for renderers
- electron-log resolvePath → resolvePathFn
- Remove skipTransformProcessType from setVisibleOnAllWorkspaces (removed in E38)
- Remove scrollBounce webPreference (removed in E28)
- Remove disableBlinkFeatures: 'Auxclick' (no-op in modern Chromium)
- Rename ignore-gpu-blacklist → ignore-gpu-blocklist
- Remove no-op Chromium flags (enable-accelerated-2d-canvas, enable-native-gpu-memory-buffers)
- Fix dialog.showMessageBoxSync to use windowless variant
- Remove unused @sentry/types devDependency
- Update tsconfig target/lib to es2023 for Node 24
- Update engines to electron 40, node >= 24.0.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TypeScript: 4.9.5 → 5.7.3
- ESLint: 8.35.0 → 9.18.0
- @eslint/js: 8.36.0 → 9.18.0
- Replace @typescript-eslint/eslint-plugin + parser (5.x) with
  unified typescript-eslint package (8.20.0)
- eslint-config-prettier: 8.7.0 → 10.0.1
- eslint-plugin-jest: 27.2.1 → 28.11.0
- eslint-plugin-react: 7.32.2 → 7.37.4
- eslint-plugin-react-hooks: 4.6.0 → 5.1.0
- eslint-plugin-testing-library: 5.10.2 → 7.1.1
- globals: 13.20.0 → 15.14.0
- ts-jest: 29.0.5 → 29.2.5
- Update eslint.config.mjs for new plugin APIs:
  - Use tseslint.configs.recommended spread for TS config
  - Use testing-library flat/react config
  - Remove dapp server inject reference (deleted in Phase 0)
- Remove ESLINT_USE_FLAT_CONFIG env var (default in ESLint 9)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Convert require/module.exports to import/export with type annotations:
- main/crypt/index.js → .ts
- main/crypt/typedDataUtils.js → .ts (add TypeField/TypeDefinitions/TypedData interfaces)
- main/launch/index.js → .ts
- main/menu/index.js → .ts (use Electron.MenuItemConstructorOptions)
- main/rpc/index.js → .ts (add RpcCallback type, typed function signatures)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace Parcel 2 bundler with electron-vite 5.0 for modern Electron build tooling:

- Add electron.vite.config.ts with main/preload/renderer targets
- Remove all @parcel/* dependencies (7 packages)
- Remove parcel, wait-on devDependencies
- Add electron-vite 5.0.0
- Update scripts: bundle → electron-vite build, dev → electron-vite dev
- Remove .parcelrc, scripts/bundler.mjs, scripts/run-dev.mjs
- Remove Parcel-specific package.json fields (alias, targets, bridge/tray/dash
  entry points, browserslist)
- Remove Parcel-related lavamoat allowScripts entries
- Update HTML files: remove CSP nonce (incompatible with Vite), remove
  stylesheet <link> tags (now imported via JS)
- Move stylus imports to JS entry points (app/tray/index.js, app/dash/index.js)
- Update initWindow() to use ELECTRON_RENDERER_URL for dev mode
- Update bridge/link safe origins from localhost:1234 to :5173
- Remove dead main:dapp IPC listener from bridge (dapp system removed in Phase 0)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tecture

- Replace dual tray/dash frameless windows with single standard BrowserWindow
- Add Zustand store (app/store.ts) with typed state and IPC sync
- Add typed IPC layer (app/ipc.ts) wrapping link.rpc/send/invoke
- Add new React app shell (app/index.tsx) with sidebar navigation
- Configure Tailwind CSS 4 via @tailwindcss/vite plugin
- Update electron.vite.config.ts for single renderer entry
- Remove old tray/dash app directories (~28K lines of class components + Stylus)
- Remove all .styl files, react-restore renderer store, actions.panel.js
- Remove react-is, stylus dependencies
- Update window references: showTray→showWindow, toggleTray→showWindow
- Keep system tray icon for quick show/hide via click

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace all ethers.js and @ethersproject/* imports with viem equivalents:
- isAddress, getAddress → viem
- isHexString → isHex from viem
- Interface + encodeFunctionData/decodeFunctionResult → viem ABI functions
- Contract class → direct eth_call with viem encoding
- BigNumber → native bigint
- Web3Provider → removed (no longer needed)
- computeAddress → publicKeyToAddress from viem/accounts
- estimateL1GasCost from @eth-optimism/sdk → custom l1Gas.ts using
  GasPriceOracle contract directly

Remove dependencies: ethers, @ethersproject/contracts, @ethersproject/providers,
@eth-optimism/sdk. Add dependency: viem 2.23.2.

Files migrated: 21 (main process, resources, tests, hardhat config)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- main/chains/index.js (641 lines) → TypeScript with full type annotations
  - Fixed Web3Provider bug from Phase 4 (undefined reference on line 236)
  - Removed index.d.ts declaration file (no longer needed)
- main/store/actions/index.js → TypeScript with named exports
  - Removed dead panelActions import (file was deleted in Phase 3)
  - Removed 21 unused actions (dapp, dash, frame-related)
  - Kept navDash (still used in main/accounts/index.ts)
- main/ens/ → TypeScript (index, artifacts/interfaces, artifacts/addresses)
- main/signers/hot/ → TypeScript (7 files: HotSigner, RingSigner, SeedSigner + workers)
- main/externalData/balances/erc-20-abi.js → TypeScript with Abi type
- resources/bridge/ and resources/link/ → TypeScript
- resources/Components/ → TypeScript (.tsx, 15 components)
- resources/Hooks/ → TypeScript (3 hooks)
- resources/Native/ and resources/svg/ → TypeScript
- Deleted dead code: main/ipfsRun/ (unused IPFS), main/flex/ (unused reverse RPC)
- Updated electron.vite.config.ts preload entry to .ts

Zero JS source files remain in main/ or resources/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Delete 5 react-restore components that can't work with Zustand
(Monitor, RingIcon, Filter, FooterAux, Native). Add store selectors
for balances, network metadata, tokens, permissions, origins, platform,
colorway, and pending requests. Expand IPC action helpers with ~30
typed wrappers for signer, account, chain, token, gas, and request
management. Create shared UI components: Address (truncated + copy),
Balance (formatted display), StatusDot (colored indicator), ChainBadge
(chain name + color), Modal (overlay dialog).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… Tokens, Settings

Replace placeholder views with full implementations. Accounts view
shows account list with balances, signer status, and ENS names;
detail panel with token balances, permissions, rename/remove; and
add-account forms for seed phrase, private key, keystore, watch
address, and hardware wallets. Request overlay with queue navigation
handles transaction review (gas fee editing), signature review
(plain, typed data, ERC-20 permits with countdown), access requests,
and chain/token addition requests. Signers view shows merged
live+saved signers with unlock/lock/reload/verify/remove actions.
Chains view displays networks with connection status, gas prices,
and toggle switches. Tokens view manages custom tokens with search,
add (fetch metadata), and remove. Settings view covers appearance,
behavior, privacy, hardware derivation, and reset.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… build succeeds

Fix 73+ TypeScript errors across 20 main-process files to get the full
electron-vite build passing (main + preload + renderer). Key changes:

- Replace @ethereumjs/util keccak256 (removed) with viem's keccak256
- Fix Chain import (default export used as named) with local type defs
- Fix viem decodeFunctionResult usage (returns value, not array)
- Add type declarations for 6 untyped modules (auto-launch, zxcvbn, etc.)
- Add missing externals to electron-vite config (react-restore, eth-provider)
- Fix type-only re-exports for Rollup compatibility
- Replace Node crypto.randomInt with Math.random for renderer compatibility
- Delete obsolete test files for removed dash/tray UI (2,378 lines)
- Delete orphaned RequestItem component and empty style directories

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create a compatibility layer (storeCompat.ts) using zustand/vanilla + immer
that preserves the existing store API: store('path') getter, store.action()
dispatch, store.observer(), and store.api.feed(). This drops the react-restore
dependency while requiring zero changes to the 26+ consumer files.

- Add zustand/vanilla store with immer-based path updates
- Implement u() update function compatible with react-restore's API
- Implement observer system and batched feed mechanism
- Remove react-restore from externals and type declarations
- All 237 store tests pass unchanged

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Onboarding: Shows a welcome screen when no accounts exist and the user
hasn't dismissed it. Steps through Welcome → Create Account → Done,
reusing the existing AddAccount component.

Send: Native ETH/ERC-20 send UI with chain selector, ENS resolution,
token selector from account balances, and amount input. Submits via
the existing provider's eth_sendTransaction flow, which creates a
request that goes through the approval overlay.

Both views are wired into the sidebar navigation and view router.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add the missing updateBadge store action that the updater module calls
when updates are available or ready to install. Add badge field to the
updater state schema. Show a top-of-window banner in the renderer when
an update is available, with Download/Install and Dismiss buttons.

The system tray integration already works from existing code — click
toggles window visibility, context menu has summon/dismiss/quit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace crashing @tailwindcss/vite plugin with pre-generated CSS using
Tailwind v4's compile API (scripts/generate-tailwind.cjs). Fix white
background by adding bg-gray-950 to the app root div. Fix ChainsView
crash by removing unused useColorway call and using primaryColor hex
directly. Add esbuild automatic JSX transform and emptyOutDir: false
to prevent renderer build from clearing bridge.js. Add screenshot
tooling for visual inspection of all 6 views.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@ledgerhq/hw-transport-node-hid-noevents and
hw-transport-node-hid-singleton were pinned to 6.31.10, a version
that was never published to npm (hallucinated during Phase 1 upgrade).
Fix to 6.31.0 and 6.32.0 respectively, restoring npm install.

Also wire generate-tailwind.cjs into prebuild and gitignore screenshots.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Display "Transaction · 2 of 5" instead of "Request 2 of 5" so users
know what kind of request they're looking at when flipping through
the queue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create app/types.ts with renderer-side type definitions for Account,
Signer, Chain, ChainMetadata, Token, Balance, AccountRequest, etc.
Update store, IPC layer, and all view components to use typed interfaces
instead of any. Zero any types remain in app/ source files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wire the summon shortcut (Alt+/) into the Settings view with a toggle
to enable/disable and a "Change" button that enters capture mode for
recording a new key combination. Uses existing resources/keyboard
infrastructure for key mapping and display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Display the estimated L1 data fee (cost to post calldata to Ethereum)
for transactions on Optimism, Base, and other OP Stack chains. Uses
chainUsesOptimismFees() to detect L2s and reads from request.chainData.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Below 768px: sidebar collapses behind a hamburger menu with overlay
backdrop, master-detail views (Accounts, Signers, Chains) switch to
list-or-detail navigation with back buttons, and content padding
adjusts. useCompact() hook listens to matchMedia for resize events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace `global?.navigator` with `typeof navigator !== 'undefined'`
to avoid ReferenceError in browser contexts where `global` is not
defined (e.g. when contextIsolation is enabled).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix viem migration issues: positional args in ENS decoder, single-value
  decodeFunctionResult in scan, parseAbi tuple syntax and reserved keyword
  rename (address address → address account), even-length hex padding
- Fix Zustand store re-entrancy: add notifying guard in storeCompat to
  prevent infinite recursion when observers trigger state updates
- Fix hot signer tests: ESM interop (import * as bip39), worker.js files,
  secp256k1 public key decompression for viem's publicKeyToAddress
- Fix mock store: dual export bug, add updateSigner/removeSigner stubs
- Fix test environments: jsdom docblocks for 8 React component/hook tests,
  async timer handling, parallel worker filesystem isolation
- Remove dead code: panel nav in addRequest, no-op actions (setSignerView,
  setPanelView, notify), store.notify calls in origins/rpc/HotSigner
- Exclude e2e tests from default run (require running Frame provider)
- Rewrite origins extension trust tests to use observer flow directly

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix CJS interop for external modules by adding Rollup output.interop: 'auto',
add missing externals (nebula, @ledgerhq/*), compile workers as separate entry
points, convert dynamic require() to static imports, remove dead content-hash
code from ENS module, and delete unused fonts/svg/RequestHeader.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate the entire state layer to valtio — a single, minimal proxy-based
library. Main process store uses `proxy()` for reactive state with
`subscribe()` for persistence and IPC sync. Renderer uses `useSnapshot()`
for React integration. All 96 store actions converted from update-function
pattern to plain mutation functions. Removes zustand, immer, and the
storeCompat shim. 55 files changed, 1027 tests passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pylon was Frame's proprietary infrastructure for RPC proxying, token
price rates, and NFT inventory. Since the original Frame project is
no longer maintained, these servers could go offline at any time.

- Remove Pylon inventory system entirely (only served ENS tokenId
  lookups in transaction descriptions, no UI consumed it)
- Replace Pylon WebSocket rate subscriptions with DefiLlama HTTP
  polling (/prices/current + /percentage endpoints, 30s interval)
- Replace Pylon WSS RPC endpoints with PublicNode HTTPS endpoints
  for all 8 supported chains
- Rename 'pylon' connection preset to 'public'
- Add migration 42 to convert existing users' connections
- Remove @framelabs/pylon-client dependency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add modernized stack, new features, and Pylon removal sections
covering the full scope of changes from upstream Frame.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hardcoded chain selector with dynamic list from useNetworks()
filtered to active chains. Auto-fetch token metadata (name, symbol,
decimals) with 500ms debounce when a valid contract address is pasted
and a chain is selected. Pre-filled fields remain editable so users
can override fetched values or fill manually on fetch failure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a BuyButton component with a provider selection dropdown (Ramp
Network, MoonPay, Transak) that opens the provider's URL with the
user's wallet address pre-filled. The button is chain-aware, appending
appropriate network parameters for Polygon, Arbitrum, Optimism, and
Base when available.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
wakamex and others added 27 commits March 1, 2026 22:25
Resolve conflicts in app/index.tsx, app/ipc.ts, app/store.ts, app/types.ts,
main/store/actions/index.ts, main/store/migrate/index.ts. Fix _version to 45
(highest migration). Add migration 43 to migration registry alongside 45.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Resolve conflicts across shared files. All migrations (43, 44, 45) now
registered. _version stays at 45. Verified Chains.send signature and
approveTransactionRequest callback type match txHash usage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Resolve conflicts in app/types.ts and main/store/actions/index.ts.
Health checker runs 30s polls on primary RPC, shows status in chain detail,
falls back to secondary when primary degrades.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- build.yml: trigger on main, use latest runners (ubuntu-latest,
  ubuntu-24.04-arm, macos-latest, windows-latest), make signing
  secrets optional so builds work unsigned
- compile-and-test.yml: trigger on main + PRs, remove deprecated
  Electronegativity scan
- notarize.js: skip notarization when Apple credentials aren't set

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use shell conditional with env var instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Run `allow-scripts auto` to add 5 unconfigured package entries
- Add `shell: bash` to NPM config step so it works on Windows

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Node 18 causes @electron/rebuild path errors. Node 22 matches
local dev environment and satisfies package.json engines constraint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
node-hid requires libusb headers to compile for Electron.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- compile-and-test: use `npm ci --ignore-scripts` since tsc and jest
  don't need Electron native module rebuilds
- build: use Node 20 LTS (Node 22 breaks node-addon-api C++ headers)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@lavamoat/allow-scripts 3.3.1 ignores $root$: false and runs the
root postinstall (electron-builder install-app-deps) which fails
rebuilding node-hid for Electron. Temporarily remove the postinstall
script before running allow-scripts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
electron-builder 26.8.1 no longer supports the publisherName
property in the win config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
node-hid's node-addon-api 3.x fails to compile against Electron 40
headers. Since we don't bundle native modules (they're excluded from
files) and the needed ones (keccak, secp256k1) are pre-built by
allow-scripts, skip the @electron/rebuild step entirely.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Without CSC_IDENTITY_AUTO_DISCOVERY=false, electron-builder tries
to auto-discover a signing identity on macOS even when CSC_LINK
is empty, causing the build to fail.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When CSC_LINK is set to empty string (from unset secrets),
electron-builder interprets it as a file path and fails. Remove
all signing env vars from the matrix level — electron-builder
skips signing when they're completely unset.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When CSC_LINK is unset (public CI / forks), set identity: null to
prevent electron-builder from falling back to ad-hoc signing on arm64,
which fails strict codesign verification with "nested code is modified
or invalid". Also conditionally set hardenedRuntime, entitlements, and
requirements since those only apply to proper code signing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The tray/window code loads icons via path.join(__dirname, './IconTemplate.png')
where __dirname is compiled/main, but copy-assets was putting them in
compiled/main/windows. Fixed the copy-assets path and added a vite plugin
so icons are also available during electron-vite dev.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
buildStart runs before vite empties the output directory, so copied
icons were getting deleted. writeBundle runs after output is written.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
subscribe(state) fired on every state mutation, re-registering the
Alt+/ shortcut hundreds of times. Now subscribes only to
state.main.shortcuts and skips if the shortcut hasn't changed.

Also downgraded noisy connection/shortcut logs to verbose.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dev mode was defaulting to verbose console logging, showing every
connection state check and token update. Changed default to info
for all environments (use LOG_LEVEL=verbose to restore).

Downgraded routine connection ON/OFF messages to verbose since
connect() is called on every state change, not just actual reconnects.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Devtools opened on every launch because isDev was true.
Now only opens with ENABLE_DEV_TOOLS=true explicitly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The FormHeader Back button lacked type="button", defaulting to
type="submit" per HTML spec. Since it appeared first in the DOM,
pressing Enter activated it instead of the actual submit button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After adding a watch address (or any account), the user was left on a
blank "Select an account" screen because onClose didn't pass the new
address back. Now each form passes the created address to onClose, and
AccountsView auto-selects it.

Also adds the first app-level component tests covering:
- Account type selection rendering
- Cancel without selecting
- Back button not submitting the form (type="button" regression)
- Watch address creation calls onClose with the address
- Error handling keeps the form open
- Enter key submits instead of triggering Back

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace Nebula (ipfs.nebula.land) ENS lookups with the existing viem-based
main/ens module for forward and reverse resolution. Simplify token loader
to use only the bundled default-tokens.json list. Make Etherscan API keys
user-configurable via Settings UI and persisted state instead of hardcoded.
Clear Frame CDN icon URLs from initial state. Update external whitelist
and Trezor manifest to reference wakamex/framed instead of frame.sh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- test/resources/Hooks/useFocusableRef/index.test.js: 8 tests covering
  ref return value, focus/no-focus behavior, custom delay, cleanup,
  null ref safety, and true→false re-render transition
- test/app/hooks/useCompact.test.js: 6 tests covering boolean return,
  initial width detection, resize event handling, and cleanup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@wakamex
Copy link
Author

wakamex commented Mar 2, 2026

Opened against wrong repo by automated tooling. Sorry for the noise.

@wakamex wakamex closed this Mar 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant