feat(frontend): rework the vesting dApp UI and restructure the app - #112
Merged
Conversation
Replace the table-and-card dashboard with a top-bar layout: navigation and the ledger status move out of the sidebar, every page carries its own header, grants are served at the root, and the grant filter and the role lens become dropdowns scoped to the page that uses them. Grant creation moves into a modal stepper built on a native dialog, and a toast now stays until dismissed and can carry a link. Restructure the source tree to match the layout rules the app now spells out in its own CLAUDE.md. features becomes pages, lib becomes utils, the icon collection is promoted, dialog components drop their Dialog suffix, and anything with a single consumer moves beside it.
Withdraw history comes off the ledger and is attributed by contract chain instead of being inferred, and the invented claim floor is gone. Outsized amounts are abbreviated with the exact figure still reachable, amount fields no longer quote a zero USD value, and the status filters now mean what their labels say. The app also gains its own error screens, a real loading state, icon actions and a Canton Coin mark. The session grace timer stops rebuilding the backend, and toast expiry runs off one clock owned by the store.
…seam The claim lineage walk is ledger work, not page work, so it moves behind the backend seam. Shared components take over the styling and the sums each of them owns, rules that had been written down twice collapse into one, and a dialog opens on mount instead of through a caller-managed flag while the button owns its own pending state. The token mark stays static until there is a second token to pick between, and the empty grants state says the one thing it knows.
Every state a sighted user can see now reaches assistive tech: waiting states announce, the milestone fields and the tooltip badge carry names, headings run in order, and each route sets its own title. The focus ring and the brand text meet contrast, the small controls meet the minimum target size, and the navigation stays reachable on a narrow viewport. Copy to clipboard no longer assumes a secure context, and the frontend CLAUDE.md records why the brand hues needed readable companions.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
No wallet ships in this monorepo, so the docs, dev scripts and wallet-service strings no longer read as if one does. Carpincho survives in the root CLAUDE.md alone, named as the wallet this stack was developed against rather than as a component of it.
gabitoesmiapodo
marked this pull request as draft
August 26, 2026 05:04
A participant rejects a package id in an ACS or update filter with INVALID_FIELD and requires the package-name reference, while a command still carries the resolved id. The two forms are not interchangeable, so the filter builder now owns the name form and takes an entity name. Verified against both a local participant and a hosted one.
Read by the project whose root directory is dapp/frontend, so it never collides with the root config the reference site uses. The build command runs from the workspace root because a production build resolves canton-connect and canton-dappbooster to their dist, which must exist before vite starts.
Its build shells out to dpm, which no build runner has, so the frontend build now excludes it the same way the PR gate does.
The bootstrap wrote a file the app fetched, so the two drifted apart on every run and a deployed build had no way to get one at all. The app now finds the operator among the connected user's ledger rights and reads its factory back for the package id and the disclosure blob. Pointing the wallet at another participant is now the whole of switching networks, and the bootstrap writes nothing. The deployment needs a session to read through, so it resolves after connect; a disconnected visitor gets each page's own connect card rather than a config error.
gabitoesmiapodo
marked this pull request as ready for review
August 26, 2026 18:36
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #109
The demo dApp was a sidebar-and-table shell that displayed inferred numbers and could not be driven without a mouse. This reworks the UI, sources grant activity from the ledger, and moves the source tree onto the layout rules the app now documents for itself.
Review guide
src/backend,src/storeandsrc/utilsVestingBackend.tsowns the new claim lineage walk;useVestingStore.tsowns the shared clock and the filterssrc/components,src/pagesandsrc/iconsare markup and styling onlydapp/frontend/CLAUDE.mdis new and states the layout rules the move follows — read it before questioning where a file landedCLAUDE.mdandcanton-dappbooster/CLAUDE.mdonly re-point paths the move invalidatedChanges
Deviations
canton-dappboosterCLAUDE.md updated in the same branch, since the move invalidated paths they namebiome.json$schemapin corrected to 2.5.10 to match the installed Biome; unrelated to the issueAcceptance criteria
Test plan
Automated tests
pnpm installat the repo rootpnpm -C dapp/frontend testpnpm lint,pnpm typecheckandpnpm buildat the rootManual verification
./scripts/dev-stack.sh install./scripts/dev-stack.sh up— containers, DAR, vesting bootstrap and the dApp dev serverBreaking changes
None.
Checklist
Screenshots
01-wallet.mp4
02-connect.mp4
03-tour.mp4
04-create.mp4
05-second.mp4
06-accept.mp4
07-grants.mp4
08-claim.mp4
09-cancel.mp4
10-wrap.mp4