Owner profile header: GitHub-style composition — grouped action row, no dead space #403
Labels
No labels
actions
bug
cli
duplicate
enhancement
fork
forum
git storage
help wanted
insights
invalid
issues
moderation
oidc
ownership transfer
packages
pr/merge protection rules
projects
pull requests
question
releases
sponsorships
tags
webhooks
wiki
wontfix
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
crueber/walhub#403
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What's requested
The owner-profile header (
/:owner,web/src/pages/Repos.jsx) is already a composed two-column block after #395/#400 (identity left, avatar right) — this ticket closes the remaining gaps so it reads like GitHub's profile header and has zero dead space. Layout only; all gating, data flow, and cache behavior unchanged.Evidence (tree
f75a04b, web/src/pages/Repos.jsx)New repositoryrenders alone in a full-widthmb-3 flex justify-endrow. At any width that is a dead half-to-full-width band above the header — the exact "orphan row that knows nothing about the header" shape #395 removed for the avatar, now carried by the button. GitHub has no such band: profile actions sit inside the header block.text-xl(20px). GitHub's profile name is the largest text on the page (~24px /text-2xl); here the page reads with no visual anchor before the muted handle.mt-6whitespace — GitHub separates the profile header from the tab/repo content with a hairline divider; without it the header and the list run together.@ownerrenders only when a display name is set; location/timezone joined with·), but the vertical rhythm is genericmt-1/mt-3— GitHub tightens handle under the name (small muted, minimal gap) and gives bio a slightly larger gap than meta lines.Proposed design
One composed header, first element of the page (no sibling rows above it):
profile-header flex flex-col-reverse gap-4 sm:flex-row sm:items-start sm:justify-betweenfrom #395, addpb-6 border-b border-zinc-200 dark:border-zinc-700so the Repositories section (L441) starts on a clean rule.min-w-0 flex-1):h1bumped totext-2xl font-semibold.@{owner}handle directly under the name,text-sm muted, tight gap (mt-0.5).text-sm muted(mt-1).markdown-body mt-3unchanged (shared render pipeline, do not touch).mt-3 flex flex-wrap gap-2row containingNew repository(btn primary) — whencanWrite()— andEdit profile(btn) — whenprofile().can_edit— grouped together, GitHub-style, acting on the page the header names. Delete the standalonemb-3 flex justify-endblock (L309-315).shrink-0): unchanged from #395/#376 —h-24 w-24 rounded-fullwith ring, Regenerate/Remove grouped beneath, gated as today (self-only; the client never decides). Top-aligned with the h1 (sm:items-startalready does this).flex-col-reversestacking (avatar block on top, identity below, both full-width, buttons wrapping). The grouped action row wraps naturally; verify no root overflow at 390px.Architecture notes
user:{owner},repos:{owner}keys all unchanged), so no ETag/cache-class concern.can_editfor Edit profile,require_writefor New repository, self-or-admin for avatar actions (Repos.jsx L236-278). Layout must not change anyShowcondition.Acceptance criteria
New repositoryrenders inside the header's identity column action row (grouped withEdit profilewhen both gates pass)text-2xl; handle sits tight under itscrollWidth === clientWidth)Showgates byte-identical to pre-change (canWrite, can_edit, isSelf, userSrc)Fixed by #407 (branch fix/issue-403): grouped action row under the bio, h1 text-2xl + tight handle, bottom divider before Repositories. Gates byte-identical, zero fetch/cache changes; 46/46 header tests green, vite build green.
REVIEW PR #407 (fix/issue-403, commit
d47159a) — verified in scratch worktree /tmp/pr407, main worktree untouched (clean before/after; only pre-existing untracked .opencode/).All 7 acceptance criteria PASS, verified against the tree (no browser per review instructions — node tests + reasoning only):
mb-3 flex justify-endCTA block deleted; pre-header region (Show !isOrg → profile-header) contains no justify-end/mb-3/New-repository (checked programmatically).mt-3 flex flex-wrap gap-2div under the bio holding New repository (own canWrite gate) + Edit profile (own can_edit && !editing gate). Both-visible → both buttons, either → single button, both-hidden → empty div (12px mt-3 only; inherent to the byte-identical-gate constraint, not a finding). Order pinned: New leads, Edit follows.<h1 class=text-2xl font-semibold>, handle<p class=muted mt-0.5 text-sm>; location·timezone stays mt-1, bio markdown-body mt-3.pb-6 border-b border-zinc-200 dark:border-zinc-700; Repositories h3 keeps mt-6 below the rule.user:${owner()}) all intact.TESTS: targeted 46/46 green (profile-header-403: 8 new + profile-header + identity-nav); full suite 803 pass / 2 fail — the 2 failures are smoke.test.js (need live server), confirmed identical on main; vite build green (2.14s). No fixes needed, nothing pushed.
RECOMMENDATION: ready to merge.
Fixed by PR #407 (review clean — all 7 criteria pass, gates byte-identical, zero server changes), merged. Closing.