Skip to content

feat(ui): add the bottom-of-page back-to-index link to validators and subnets (#6432)#6499

Merged
JSONbored merged 1 commit into
JSONbored:mainfrom
real-venus:fix/6432-back-to-index-links
Jul 17, 2026
Merged

feat(ui): add the bottom-of-page back-to-index link to validators and subnets (#6432)#6499
JSONbored merged 1 commit into
JSONbored:mainfrom
real-venus:fix/6432-back-to-index-links

Conversation

@real-venus

Copy link
Copy Markdown
Contributor

Summary

blocks.$ref.tsx and extrinsics.$hash.tsx both close their loaded body with a
← All blocks / ← All extrinsics link, and accounts.$ss58.tsx has one too.
validators.$hotkey.tsx had none, and subnets.$netuid.tsx only had one inside its
notFoundComponent — never in the successful render. Those are the two longest detail
pages in the app, so a reader who scrolls to the end is furthest from the masthead
breadcrumb exactly where the convenience link is missing.

What Changed

Added one to each, at the same spot and with the same styling the two reference pages use:
after the content sections, ahead of the endpoint snippet. On subnets.$netuid.tsx the
link sits outside the tab switch, so it's there whichever tab the reader ends on.

The wording question

The issue asks to confirm intent before standardizing accounts.$ss58.tsx's
← Account lookup. Confirmed — and it should stay as-is:

/accounts is a lookup form, not an index. Its own copy reads "Look up a Bittensor
account by ss58 address (hotkey or coldkey)"
and it renders a search input, because there
is no list of every chain account to go back to. ← All accounts would name a page that
doesn't exist.

The pages that do point at real directories use the ← All X form, and their labels are
truthful:

Page Destination Label
validators.$hotkey /validators — "Network-wide validator directory" ← All validators (new)
subnets.$netuid /subnets — "Every active Finney netuid" ← All subnets (new)
accounts.$ss58 /accounts — a lookup form ← Account lookup (unchanged)

So the label tracks what the destination actually is, rather than being uniform for its own
sake. That reasoning is recorded as a comment at the link itself, so the next person to
notice the inconsistency finds the answer in the code rather than in this PR.

providers.$slug.tsx is out of scope — the issue's Requirements and Deliverables name only
validators.$hotkey.tsx and subnets.$netuid.tsx.

Screenshots

Captured at the contract's fixed viewports (1280×800 / 768×1024 / 375×812), themes forced
via mg-theme, before served from a worktree at the merge-base, both servers verified to
have the brand faces loaded so the pair shares one typeface.

capture-pr-screenshots.mjs can't drive this one — --section pins a section's top under
the sticky header, but the link sits above the section it precedes, and in before there
is no link to anchor on at all. The included capture-back-link-screenshots.mjs follows the
same contract with a scroll strategy that anchors on a landmark present in both variants.

validators.$hotkey — ← All validators

Viewport · Theme Before After
Desktop · Light
before

after
Desktop · Dark
before

after
Tablet · Light
before

after
Tablet · Dark
before

after
Mobile · Light
before

after
Mobile · Dark
before

after

subnets.$netuid — ← All subnets

Viewport · Theme Before After
Desktop · Light
before

after
Desktop · Dark
before

after
Tablet · Light
before

after
Tablet · Dark
before

after
Mobile · Light
before

after
Mobile · Dark
before

after

Validation

  • npm run lint --workspace=apps/ui — clean
  • npm run format:check --workspace=apps/ui — clean
  • npm run typecheck --workspace=apps/ui — clean
  • npm test --workspace=apps/ui — 1060/1060 passed
  • npm run test:e2e --workspace=apps/ui — 26/26 passed
  • npm run build --workspace=apps/ui — clean

Registry Safety

  • Links a tracked, currently-open issue (Closes #6432) — required.
  • No secrets, PATs, wallet data, private dashboards, private URLs, or validator-local state.
  • No generated artifacts touched — apps/ui/** only, 4 files.
  • routeTree.gen.ts untouched; screenshots hosted on a fork branch, not committed here.

Closes #6432

… subnets (JSONbored#6432)

blocks.$ref.tsx and extrinsics.$hash.tsx both close their loaded body with a
"<- All blocks"/"<- All extrinsics" link, and accounts.$ss58.tsx has one too.
validators.$hotkey.tsx had none, and subnets.$netuid.tsx only had one inside
its notFoundComponent -- never in the successful render. Those are the two
longest detail pages in the app, so a reader who scrolls to the end is furthest
from the masthead breadcrumb exactly where the convenience link is missing.

Add one to each, at the same spot and with the same styling the two reference
pages use: after the content sections, ahead of the endpoint snippet. On
subnets the link sits outside the tab switch, so it is there whichever tab the
reader ends on.

On the wording the issue asks to confirm rather than assume: accounts.$ss58.tsx
keeps "<- Account lookup" instead of being normalized to "<- All accounts".
/accounts is a lookup form, not an index -- its own copy reads "Look up a
Bittensor account by ss58 address" and it renders a search input, because there
is no list of every chain account to go back to. "<- All accounts" would name a
page that doesn't exist. The pages that do point at real directories
(/validators is a "validator directory", /subnets lists "every active Finney
netuid") use the "<- All X" form, so the label tracks what the destination
actually is. Recorded that reasoning at the link itself.
@real-venus
real-venus requested a review from JSONbored as a code owner July 17, 2026 12:16
@superagent-security

Copy link
Copy Markdown

Superagent didn't find any vulnerabilities or security issues in this PR.

@codecov

codecov Bot commented Jul 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.85%. Comparing base (9b785a1) to head (f20326d).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #6499   +/-   ##
=======================================
  Coverage   97.85%   97.85%           
=======================================
  Files         174      174           
  Lines       22196    22196           
  Branches     8798     8798           
=======================================
  Hits        21721    21721           
  Misses         81       81           
  Partials      394      394           
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@loopover-orb loopover-orb Bot added the gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier. label Jul 17, 2026
@loopover-orb

loopover-orb Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Warning

⏸️ LoopOver review result - manual review recommended

Review updated: 2026-07-17 17:30:07 UTC

4 files · 1 AI reviewer · no blockers · CI green · clean

⏸️ Suggested Action - Manual Review

  • Touches a guarded path — held for manual review: This PR changes guardrail-protected path(s): apps/ui/src/routes/accounts.$ss58.tsx (matched apps/ui/**), apps/ui/src/routes/subnets.$netuid.tsx (matched apps/ui/**), apps/ui/src/routes/validators.$hotkey.tsx (matched apps/ui/**), apps/ui/tests/e2e/capture-back-link-screenshots.mjs (matched apps/ui/**).

Review summary
The AI review returned non-blocking notes for this change but did not include a separate narrative summary. Review the nits below before deciding this PR.

Nits — 4 non-blocking
  • No manual before/after screenshot table is included in the PR body; the repo's automated capture pipeline will supply evidence if eligible.
  • The capture script's /subnets/1 anchor-off-footer heuristic (footerTop - viewport*0.75) is a fragile positioning trick that could drift if footer height changes; consider anchoring on a stable element id instead.
  • Verify the linked issue Inconsistent in-page "back to index" link across detail pages #6432 is fully closed by this PR given the external brief notes 'partial' coverage — confirm no other detail pages (e.g. providers.$slug.tsx) were expected to be included, though the PR description explicitly scopes providers as out of scope.
  • Touches a guarded path — held for manual review — A maintainer must review and merge this change.

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ⚠️ Gate result — Not blocking (Advisory; not blocking this PR.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #6432
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (1 linked issue).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 166 registered-repo PR(s), 89 merged, 20 issue(s).
Contributor context ✅ Confirmed Gittensor contributor real-venus; Gittensor profile; 166 PR(s), 20 issue(s).
Review context
  • Author: real-venus
  • Role context: outside_contributor
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: TypeScript, JavaScript, Python, Rust, CSS, MDX, Svelte, Swift
  • Official Gittensor activity: 166 PR(s), 20 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Triage stale or unlinked PRs.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask &lt;question&gt; answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat &lt;question&gt; answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
/ mobile before / (mobile)
before / (mobile)
after / (mobile)
after / (mobile)

Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 17, 2026
@JSONbored
JSONbored merged commit df79c04 into JSONbored:main Jul 17, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier. manual-review Gittensor contributor context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Inconsistent in-page "back to index" link across detail pages

2 participants