| 01-federation-mesh-hardening |
03 |
ui |
| vue |
| css |
| wallet |
| branding |
| reduced-motion |
|
| phase |
provides |
| 01-federation-mesh-hardening |
ScreensaverRing.vue's existing default/compact size variants and segment-pulse animation, plus the two paid-tick surfaces (SendBitcoinModal's ripple burst, WalletScanModal's plain circle) |
|
|
| A third `badge` ring variant (160px / 192px, --viz-radius 80px / 96px) sized to sit inside a modal card |
| The site-wide prefers-reduced-motion guard ScreensaverRing was missing entirely, now covering every variant including the two pre-existing ones |
| Both paid-tick surfaces rendering the identical branded ring |
|
|
| added |
patterns |
|
|
| New size variants on a shared visual component are added as their own class + mapping, never as a transform scale of an existing one — a scaled ring would also scale its segment stroke widths and blur, which is why 01-UI-SPEC.md ruled out the transform hack. |
|
|
| created |
modified |
| neode-ui/src/components/__tests__/ScreensaverRing.test.ts |
| neode-ui/src/components/__tests__/PaidTick.test.ts |
|
| neode-ui/src/components/ScreensaverRing.vue |
| neode-ui/src/components/SendBitcoinModal.vue |
| neode-ui/src/components/WalletScanModal.vue |
|
|
| Composition is identical on both surfaces: a `position: relative` badge-sized container holding <ScreensaverRing size="badge" /> with the checkmark core absolutely centred over it — so the two paid ticks cannot drift apart visually. |
| SendBitcoinModal keeps its burst-pop/burst-draw check animation; only the three ripple `burst-ring` spans and the burst-ripple keyframes were removed, since the ring now carries the motion. |
| WalletScanModal's core was kept at 6rem (it had no ripple to replace, just a w-24 circle) against SendBitcoinModal's 7rem, preserving each surface's existing checkmark proportion rather than homogenising them. |
| The reduced-motion guard was added to ScreensaverRing itself rather than per call site, so the screensaver and SystemDangerZone variants gain it too — 01-UI-SPEC.md flagged its total absence as a real gap this phase should close. |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
The payment-success tick in SendBitcoinModal renders the EQ-segment ring, not a CSS ripple burst |
FED-06 |
| kind |
ref |
status |
| unit |
neode-ui/src/components/__tests__/PaidTick.test.ts#SendBitcoinModal: payment success shows exactly one badge ring, no ripple burst |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
The scan-modal paid tick renders the same ring, so the paid tick is identical on every surface |
FED-06 |
| kind |
ref |
status |
| unit |
…#WalletScanModal: success pane shows the same badge ring and keeps its checkmark |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
A badge variant exists at 160px/192px with --viz-radius 80px/96px, alongside untouched default and compact variants |
FED-06 |
| kind |
ref |
status |
| unit |
neode-ui/src/components/__tests__/ScreensaverRing.test.ts#maps each size variant to its own ring class; #keeps the existing variants off the badge class |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
Success amount numerals and SENT / Done copy are unchanged — only the ring geometry behind the checkmark changed |
FED-06 |
| kind |
ref |
status |
| unit |
…#SendBitcoinModal… asserts the 12,345 amount and SENT copy still render |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D5 |
SystemDangerZone and Screensaver continue to render compact and default unchanged |
FED-06 |
| kind |
ref |
status |
| other |
git status shows Screensaver.vue and SystemDangerZone.vue untouched; viz-ring-compact occurrence count unchanged at 3 |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D6 |
Segment animation is disabled under prefers-reduced-motion for every size variant |
FED-06 |
| kind |
ref |
status |
| other |
@media (prefers-reduced-motion: reduce) { .viz-segment { animation: none; opacity: 0.55 } } — exactly one such block in ScreensaverRing.vue |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D7 |
The badge ring fits inside the modal card without clipping at either breakpoint |
FED-06 |
| kind |
ref |
status |
| manual_procedural |
NOT yet observed live — see Deviations. Geometric check only: 160px badge inside a max-w-2xl card is ~344px of usable width at a 390px viewport and 672px at desktop, so the ring cannot exceed the card box. |
deferred |
|
|
true |
|
|
55min |
2026-08-01 |
complete |