| 01-federation-mesh-hardening |
13 |
ui |
| vue |
| onboarding |
| scroll |
| accessibility |
| reduced-motion |
|
| phase |
provides |
| 01-federation-mesh-hardening |
OnboardingSeedGenerate.vue's existing flex-column step layout — a scrolling content region between a fixed header and a fixed footer whose Continue button stays pinned and disabled until `confirmed` is ticked |
|
|
| An overflow-derived bottom scroll cue on the seed step that appears only when the confirmation tickbox is actually below the fold, scrolls it into view when activated, and disappears once it is visible |
| A vitest suite pinning the cue's show/hide contract, including the no-overflow no-render case |
|
|
| added |
patterns |
|
|
| Derive an affordance's visibility from a real measurement (scrollHeight vs clientHeight, plus getBoundingClientRect comparison of target vs container bottom) rather than a viewport-height guess — the cue is then structurally incapable of appearing when there is nothing below. |
| Measure with viewport-relative rects, not offsetTop/offsetHeight: offsetTop is relative to the nearest *positioned* ancestor, which here is the outer card (it carries `relative` for z-index stacking), not the scroll container. |
|
|
| created |
modified |
| neode-ui/src/views/__tests__/OnboardingScrollCue.test.ts |
|
| neode-ui/src/views/OnboardingSeedGenerate.vue |
|
|
| The cue is a sticky-bottom element inside the scroll region (gradient scrim + a glass pill reading 'One more step below' with a bobbing chevron), not a fixed overlay — so it rides the scroll container and cannot cover the fixed footer. |
| Wayfinding only: `revealConfirm` calls scrollIntoView on the tickbox label and nothing else. It never sets `confirmed`, never focuses or enables Continue, and never auto-ticks on scroll — pinned by a dedicated test. |
| Re-measure on scroll, window resize, and a ResizeObserver on the content wrapper, plus watches on `words` and `loading` — the word grid arrives asynchronously and changes height when the words/QR tabs switch, either of which can flip the region into overflow. |
| onMounted was restructured so listener setup runs on both paths (restored-from-sessionStorage and freshly generated). The previous early `return` on the restore path would otherwise have skipped setup entirely for a user navigating back. |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
On a short viewport the cue appears, telling the user there is more below |
UIFIX-03 |
| kind |
ref |
status |
| unit |
neode-ui/src/views/__tests__/OnboardingScrollCue.test.ts#renders the cue when there is overflow and the tickbox is below the fold |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
Activating the cue brings the tickbox into view in one action, without touching confirmation state |
UIFIX-03 |
| kind |
ref |
status |
| unit |
…#activating the cue scrolls the tickbox into view and never touches confirmed |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
The cue disappears once the tickbox is visible and does not reappear while it stays visible |
UIFIX-03 |
| kind |
ref |
status |
| unit |
…#removes the cue once scrolling brings the tickbox into view |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
On a tall viewport the cue never renders — no element, no reserved space, no layout shift |
UIFIX-03 |
| kind |
ref |
status |
| unit |
…#renders no cue when the scroll region reports no overflow |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D5 |
The cue is absent while the seed is generating (no tickbox to point at yet) and once the box is ticked |
UIFIX-03 |
| kind |
ref |
status |
| unit |
…#never shows the cue while loading, regardless of overflow; …#removes the cue once the tickbox is ticked |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D6 |
The cue's motion is disabled under prefers-reduced-motion, per the site-wide convention |
UIFIX-03 |
| kind |
ref |
status |
| other |
@media (prefers-reduced-motion: reduce) { .onb-cue-chevron { animation: none; } } in OnboardingSeedGenerate.vue's scoped style |
pass |
|
|
false |
|
|
70min |
2026-08-01 |
complete |