Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
83b2018
docs(ux): add identity + dashpay redesign wireframe
lklimek Apr 22, 2026
405f2a1
docs(ux): address review findings for identity redesign wireframe
lklimek Apr 22, 2026
5da317d
docs(ux): add identity picker, collapse switcher to one row
lklimek Apr 22, 2026
eb14099
docs(ux): breadcrumb switcher, populated Contacts, reorder frames
lklimek Apr 22, 2026
444515f
docs(identity-hub): Phase 1 planning artifacts
lklimek Apr 23, 2026
73e62bb
feat(identity-hub): add feature flag, enum variant, and module scaffold
lklimek Apr 23, 2026
b551e7f
feat(identity-hub): wire left-nav entry and AppState registration
lklimek Apr 23, 2026
d5506db
feat(identity-hub): add breadcrumb pill and identity pill components
lklimek Apr 23, 2026
779d608
test(identity-hub): add kittest integration tests for hub scaffold
lklimek Apr 23, 2026
f81a635
docs(identity-hub): update components catalog and user stories
lklimek Apr 23, 2026
191b157
fix(identity-hub): address CodeRabbit review findings on PR #842
lklimek Apr 23, 2026
b7ac2ee
feat(identity-hub): add tab bar and onboarding empty state
lklimek Apr 23, 2026
00e28cf
feat(identity-hub): add identity picker grid
lklimek Apr 23, 2026
e599075
feat(identity-hub): add Activity tab shell with filter chips
lklimek Apr 23, 2026
9767242
feat(identity-hub): add Contacts tab with gated + populated states
lklimek Apr 23, 2026
2e8d34b
feat(identity-hub): add Home tab with hero and onboarding checklist
lklimek Apr 23, 2026
901584c
feat(identity-hub): add Settings tab
lklimek Apr 23, 2026
4df0aad
fix(identity-hub): debounce Contacts LoadContacts dispatch to once pe…
lklimek Apr 23, 2026
0152895
feat(identity-hub): add SwitchIdentityHubTab AppAction and wire Conta…
lklimek Apr 23, 2026
84da7d6
docs(identity-hub): clarify Contacts accept/decline/cancel wiring plan
lklimek Apr 23, 2026
3b16ca9
docs(identity-hub): update components reference and user stories
lklimek Apr 23, 2026
86c3972
refactor(identity-hub): move hub-specific components to src/ui/identity/
lklimek Apr 23, 2026
a0fdf94
fix(identity-hub): wire dead buttons on Home/Contacts/Activity
lklimek Apr 23, 2026
4674c4c
fix(identity-hub): adapt hub to platform-wallet (#860) APIs after rebase
lklimek Jun 29, 2026
5f590f4
fix(identity-hub): make the Identities hub island fill the panel width
lklimek Jun 29, 2026
82b6691
feat(identity-hub): app-scoped selected wallet/identity foundation
lklimek Jun 29, 2026
1315a8b
feat(identity-hub): wire the breadcrumb wallet/identity switcher
lklimek Jun 29, 2026
261dc06
test(identity-hub): land IT-SWITCH-04 + stale-selection reconcile (se…
lklimek Jun 29, 2026
cc2d84c
fix(identity-hub): clear derived wallet on wallet-less identity selec…
lklimek Jun 29, 2026
1b97099
docs(identity): app-scoped selection screen-migration plan (W2-W5)
lklimek Jun 30, 2026
9355876
feat(contracts): obey app-scoped selected identity in register/update…
lklimek Jun 30, 2026
a5e87a0
feat(identity): default DPNS registration to the app-scoped identity …
lklimek Jun 30, 2026
954d2d4
feat(dashpay): sync DashPay screens with the app-scoped selected iden…
lklimek Jun 30, 2026
8f8b9dd
feat(tokens): default the token creator to the app-scoped identity (W4)
lklimek Jun 30, 2026
f6082e3
feat(wallets,tools): seed wallet-scoped and tool screens from the app…
lklimek Jun 30, 2026
319aab6
test(identity): lock session-local and no-sync identity pickers (W5)
lklimek Jun 30, 2026
c7c8890
style: apply nightly fmt across W2-W5 migration files
lklimek Jun 30, 2026
c9a0b32
test(identity-selector): add QA-001 write-back and QA-003 inert-lock …
lklimek Jun 30, 2026
b524681
docs(user-stories): mark IDH-003 multi-identity switching implemented
lklimek Jun 30, 2026
66e899e
test(identity-selector): add QA-001 egui-kittest write-back keystone …
lklimek Jun 30, 2026
0cd8a09
fix(identity-hub): T28 network-switch refresh · T29 LoadContactReques…
lklimek Jun 30, 2026
2518380
fix(identity-hub): V1 hero compact sizing · V2 social-profile card pl…
lklimek Jun 30, 2026
5bbb151
feat(identity-hub): V3 checklist visual rework + T10 full-row clickab…
lklimek Jun 30, 2026
22fc3eb
refactor(identity-hub): T08/T11/T12 implement ComponentResponse for t…
lklimek Jun 30, 2026
ced5e2a
fix(identity-hub): T17/T21 picker slot overwrite + deferred profile b…
lklimek Jun 30, 2026
ab1af9e
style(identity-hub): apply nightly fmt
lklimek Jun 30, 2026
8135bf1
fix(identity-hub): QA-001/T21 commit submitted snapshot, not current …
lklimek Jun 30, 2026
6697d95
revert(identity-hub): QA-002/T29 remove premature LoadContactRequests…
lklimek Jun 30, 2026
0ef59c3
fix(identity-hub): QA-003/004/006 avatar readiness, contact_id contra…
lklimek Jun 30, 2026
b05497d
style(identity-hub): apply nightly fmt
lklimek Jun 30, 2026
f85424d
fix(identity-hub): QA-001 follow-ups — clear pending_save on error, T…
lklimek Jun 30, 2026
40be6be
feat(dashpay): hydrate hub Contacts Received/Sent from contact reques…
lklimek Jun 30, 2026
1768c09
Merge branch 'docs/platform-wallet-migration-design' into feat/identi…
lklimek Jun 30, 2026
5f3772c
feat(identity): operate-as screens obey the app-scoped selected ident…
lklimek Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,19 @@ native-dialog = "0.9.0"
raw-cpuid = "11.5.0"

[features]
default = ["identity-hub"]
testing = []
bench = []
mcp = ["dep:rmcp", "rmcp/server", "rmcp/macros", "rmcp/transport-streamable-http-server", "dep:axum", "dep:subtle"]
cli = ["dep:rmcp", "rmcp/server", "rmcp/macros", "rmcp/client", "rmcp/transport-io", "rmcp/transport-streamable-http-client-reqwest", "dep:clap", "dep:clap_complete"]
headless = ["cli", "mcp"]
# New unified Identities hub UI section (four-tab: Home/Contacts/Activity/Settings).
# Default-enabled. Disable to get a smaller compile surface when iterating on legacy
# Identities / Dashpay screens only.
identity-hub = []
# Unified Activity timeline aggregator. Off by default — the aggregator backend does
# not exist yet; when off, the Activity tab renders a gated "coming soon" message.
identity-hub-activity-feed = ["identity-hub"]

[dev-dependencies]
egui_kittest = { version = "0.35.0", features = ["eframe"] }
Expand Down Expand Up @@ -145,7 +153,7 @@ debug = "line-tables-only"

[lints.rust.unexpected_cfgs]
level = "warn"
check-cfg = ["cfg(tokio_unstable)", "cfg(feature, values(\"testing\", \"bench\", \"mcp\", \"cli\", \"headless\"))"]
check-cfg = ["cfg(tokio_unstable)", "cfg(feature, values(\"testing\", \"bench\", \"mcp\", \"cli\", \"headless\", \"identity-hub\", \"identity-hub-activity-feed\"))"]


[lints.clippy]
Expand Down
136 changes: 136 additions & 0 deletions docs/ai-design/2026-04-22-identity-dashpay-redesign/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# Identity + DashPay Redesign Wireframe

This directory contains the design specification and interactive wireframe for the unified
Identities section of Dash Evo Tool 2. The redesign collapses the current two left-nav
entries — Dashpay and Identities — into a single **Identities** section with four tabs:
Home, Contacts, Activity, and Settings.

The critical distinction throughout this design: **Identity** is the primary on-chain Dash
Platform object (keys, DPNS usernames, credit balance). **Social profile** is optional
extended metadata — display name, bio, avatar — layered on top via a DashPay Profile
document. Many identities never have a social profile. The Contacts tab is gated on a social
profile existing. The nav label remains `Identities` (plural, unchanged from the codebase).

## How to view

Serve locally to avoid font-loading CORS restrictions:

```
cd docs/ai-design/2026-04-22-identity-dashpay-redesign
python3 -m http.server 8000
```

Then open `http://localhost:8000/wireframe.html` in Chromium or Firefox.

Google Fonts (Noto Sans) is loaded via `<link>`. If your network blocks it, the fallback
stack (system-ui / Segoe UI / Helvetica) takes over — the layout is unaffected.

## Controls

| Control | Location | What it does |
|---|---|---|
| Persona toggle | Top-right of page header | Switches between Alex / Priya / Jordan. Arrow-key navigation supported. Flips `body[data-persona]` which CSS uses to show/hide `.adv` (Priya+Jordan) and `.dev` (Jordan only) elements. Default: Alex. |
| Theme toggle | Top-right of page header | Flips `<html data-theme>` between `light` and `dark`. Updates `aria-pressed`. No persistence — resets on reload. |
| Advanced expanders | Inside frames | Native `<details>/<summary>` — click to expand/collapse. Frame 8 Advanced is open by default (Priya context). |

## Frames

| # | Caption |
|---|---|
| 1 | Onboarding empty state — breadcrumb shows `(no wallet yet)` and `(no identity yet)` placeholders |
| 2 | Identity picker — grid shown when ≥ 2 identities are loaded (4 cards + add-new card); breadcrumb shows wallet pill + `(choose an identity)` |
| 3 | Identity Home — Alex with social profile (canonical). Annotation callout documents no-profile state (see design-spec §B.3) |
| 4 | Contacts — populated: 2 received requests (amber), 5 active contacts, 2 sent requests (blue) |
| 5 | Activity tab |
| 6 | Send sheet — compose step |
| 7 | Settings — Priya, Advanced expanded (multi-wallet interactive breadcrumb) |
| 8 | App chrome reference — breadcrumb switcher variants A (Alex), B (Priya), C (empty state placeholders) |

## Placeholder token legend

No unresolved `{{PLACEHOLDER_TOKEN}}` strings remain in `wireframe.html`. Every dynamic
value from `design-spec.md` is rendered with representative sample data:

| Token in design-spec.md | Wireframe sample value | Design-spec section |
|---|---|---|
| `{amount}` | `2.450 DASH`, `0.500 DASH`, etc. | §B.2, §B.7 |
| `{handle}` | `@alex.dash`, `@priya.dash` | §A.2, §B.2 |
| `{wallet_name}` | `Main Wallet`, `Masternode Ops` | §A.3 |
| `{fiat_code}` | `USD` | §B.2, §B.7 |
| `{fiat_amount}` | `214.30`, `43.70` | §B.2, §B.7 |
| `{fee_amount}` | `0.00002 DASH` | §B.7 |
| `{total_amount}` | `0.50002 DASH` | §B.7 |
| `{credit_amount}` | `50,000 credits` | §B.7 |
| `{counterparty_name}` | `@carol.dash`, `@dave.dash` | §B.6, §B.7 |
| `{network_name}` | `Mainnet`, `Testnet` | §D tooltip 15 |
| `{max}` | `200` | §B.8 |
| `{reason}` | `voting` | §B.3 |

## Screenshot capture

Capture all 8 frames in light and dark mode using Playwright (requires `npx playwright`):

```
npx playwright screenshot \
--full-page \
http://localhost:8000/wireframe.html \
wireframe-full.png
```

For individual frames at 1280x800, use the Playwright Node API targeting each
`section[aria-labelledby]` element, iterating over personas `alex`, `priya`, `jordan` and
themes `light`, `dark`. This produces up to 48 PNGs (8 frames x 3 personas x 2 themes).

## Design decisions recorded since initial commit

- **Shadow alphas**: wireframe shadow CSS values (`0.08`–`0.30`) are intentionally brighter
than `theme.rs` egui alpha bytes (`8`–`30` / 255 ≈ `0.031`–`0.118`). The wireframe is the
visual target; `theme.rs` needs updating in the implementation PR. See design-spec.md §E.
- **Secondary Home actions**: Add funds / Send to wallet / Send to another identity are
visible to all personas, no `.adv` gate. Persona-specific funding paths are inside the
wizard, not on the Home row. See design-spec.md §G9.
- **Local nickname vs. DPNS aliases**: `QualifiedIdentity.alias` is renamed `Local nickname`
in Settings — not deprecated. See design-spec.md §G7.
- **Identity pill dropdown ordering**: Local nickname → DPNS username → shortened ID.
Search activates at 7+ identities. Drag-reorder deferred. See design-spec.md §G6.
- **Breadcrumb as switcher**: the wallet + identity switcher is now embedded directly in the
breadcrumb (`Identities › [wallet pill] › [identity pill]`). The old standalone switcher
row under the breadcrumb is removed. Placeholder text `(no wallet yet)`, `(no identity yet)`,
and `(choose an identity)` ensures all three segments are always present. Alex's wallet pill
is `.subdued` (non-interactive); Priya/Jordan's wallet pill is `.switcher-interactive`.
Pills use reduced vertical padding (2px) so the topbar stays single-line. See design-spec §A.3.
- **Identity picker page (F2) has no switcher segments filled**: the picker IS the selector.
Wallet pill is shown (subdued for Alex, interactive for Priya), but identity segment is the
`(choose an identity)` placeholder until a card is clicked.
- **Consolidated Identity Home (F3)**: a single frame covers both social-profile-set and
no-profile states. The no-profile state is documented via an annotation callout pointing to
design-spec §B.3. No separate "Priya, no social profile" frame.
- **Populated Contacts (F4)**: replaces the gated-state frame. Three sections: received
requests (amber, rendered first), active contacts (5 rows with search), sent requests
(muted blue). Gated state is now documented in §B.4.1 — shown inline in the active
contacts section when the identity has no social profile.
- **App chrome reference moved to F8**: opening with the component reference confused readers.
Moving it to the end means users encounter the actual screens first. Caption updated to
"App chrome reference" to signal this is a reference frame, not a starting point.
- **Identity picker card heading hierarchy**: display name preferred over DPNS handle, which is preferred over shortened Identity ID. This matches the priority order already established for the breadcrumb pill (see §A.3 / §G6) and avoids a separate rule set.
- **Picker avatar sizing**: 72×72 px chosen as a midpoint between the 40 px contact list avatar and the 96 px hero avatar, giving enough surface for a legible monogram glyph without dominating the card at ≥ 260 px width.
- **Picker card hover elevation**: shadow increases from `--shadow-small` to `--shadow-medium` on hover — same elevation step used by all other interactive cards in the design. No border-color change on standard cards (the add-new card switches from dashed to solid Dash Blue instead, since that border is its defining visual element).

## Known limitations

- Static visual reference only — not a clickable prototype.
- No real network calls; all data is hard-coded sample values.
- Persona toggle and theme toggle work; tab switching and dropdown interactions do not.
- Send sheet Retry / Review flow is shown statically; button states are for illustration.
- Google Fonts require a network connection; system fallback activates offline.

## Links

- [design-spec.md](./design-spec.md) — full UX specification (IA, screens, wording audit,
tooltip catalog, visual direction)
- [docs/personas/everyday-user.md](../../personas/everyday-user.md) — Alex Torres persona
- [docs/personas/power-user.md](../../personas/power-user.md) — Priya Nakamura persona
- [docs/personas/platform-developer.md](../../personas/platform-developer.md) — Jordan Kim
- [src/ui/theme.rs](../../../src/ui/theme.rs) — authoritative token source
(DashColors, Spacing, Shape, Shadow, Typography)
- [docs/ux-design-patterns.md](../../ux-design-patterns.md) — UI/UX reference card
Loading
Loading