Wire the first Sandbox UI screen to the live ledger backend.
Screen 1 Account Browser consuming GET /v1/accounts (PR #110) via a typed TanStack Query hook, replacing the mock-direct-read pattern.
Scope (matches verified AccountResponse = id, name, type, currency, status):
useAccounts(page, size) TanStack Query hook over GET /v1/accounts?page=&size=
- Typed API client + contract types (no invented fields)
/accounts route in Shell, sidebar Accounts navigable + active
- Accounts table: Account ID (mono), Name, Type pill, Currency, Status pill
- Server-authoritative pagination (page/size/totalPages/totalElements), Prev/Next
- loading / error+retry / empty states
- Vitest + RTL tests for all states and pagination
Out of scope: balance column, owner/avatar, created column, KPI strip, search, filters, page-size selector, real Keycloak login.
Spec: docs/plans/account-browser/spec.md
Wire the first Sandbox UI screen to the live ledger backend.
Screen 1 Account Browser consuming
GET /v1/accounts(PR #110) via a typed TanStack Query hook, replacing the mock-direct-read pattern.Scope (matches verified
AccountResponse= id, name, type, currency, status):useAccounts(page, size)TanStack Query hook overGET /v1/accounts?page=&size=/accountsroute in Shell, sidebarAccountsnavigable + activeOut of scope: balance column, owner/avatar, created column, KPI strip, search, filters, page-size selector, real Keycloak login.
Spec: docs/plans/account-browser/spec.md