feat(layout-v2): reading-focused sidebar redesign#6197
Merged
Conversation
Addresses the top council feedback on the v2 reading layout: "everything is hidden, you have to remember the icons, and streak/cores/reputation aren't visible." All changes are gated behind the v2 layout (laptop+); v1 is untouched. - Labelled rail icons (Home, Squads, Discover, Saved, Quests, Profile, Alerts) - Profile avatar at the rail top with a reading-streak status ring + Plus badge, opening a production-style profile dropdown (reputation/cores, theme, support) - Home panel hub: Pinned squads, Recent pages, and an Explore entry that folds Discover in; hover-to-peek collapsed sidebar with a rail->panel safe zone - Explore hub: section tabs + a Sort dropdown (replaces the second tab row), extended to the Discussions feed - New-post rail button opens a create menu; single-panel settings with "Back to app"; always-visible reading-streak ring on the avatar Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The Squads rail list rendered SquadFavoriteButton without `asPin`, so it showed the v1 star even in v2. Wire NetworkSection's squad rows through the existing `createSquadMenuItem` helper (removing the duplicated inline row builder) and pass `asPin` only from the v2 sidebar — v1 keeps the star. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ects Engineering review follow-ups. The redesign is meant to be v2-only, but a few shared-component tweaks leaked into v1 (production). Gate them behind opt-in props (default = v1 behavior) so v1/production is unchanged while v2 keeps the intended polish: - Section: hover-only collapse arrow + 1px item gap now behind a `compact` prop, set only by the v2 sidebar. v1 keeps the always-visible arrow. - ProfileSectionItem/ProfileSection: external-link icon reveal-on-hover behind a `linkIconHoverOnly` prop; the v2 profile/support menus opt in, production keeps the always-visible icon. - ProfileMenuHeader: tightened name/handle gap behind a `compact` prop. Correctness fixes: - Scope the sidebar's global Escape handler to when focus is inside the sidebar, so a global Escape (closing a modal, blurring a field) no longer resets the pinned panel to Home. - useStreakRingState: only run the 5-minute escalation interval when it can actually change state (enabled, not yet read today, at-risk day). Cleanups: - Clear `isCreateHovered` on blur (mirror the focus handler). - Remove the now-orphaned `directoryTabs` branch from FeedExploreHeader (the PR removed its only caller; superseded by ExploreSectionTabs). - useInteractivePopup: drop empty group sets from the module registry. - SidebarProfileStats: import largeNumberFormat directly (no barrel). - SettingsLayout: use the max-w-3xl token instead of max-w-[48rem]. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
rebelchris
approved these changes
Jun 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Engineering-ready migration of the v2 reading-layout sidebar redesign (design exploration in #6177), rebuilt cleanly on top of
main. Addresses the top council feedback: "everything is hidden, you have to remember the icons, and streak/cores/reputation aren't visible."All behavior is gated behind the v2 layout (
useLayoutVariant, laptop+). v1 is untouched.Highlights
Engineering notes (polish over the design branch)
This branch is the design exploration (~100 commits, several add-then-revert cycles) distilled to its final net state, with the following cleanups applied so it's review-ready:
pnpm-lock.yamlchurn — the@floating-ui/reacthover-intent experiment was reverted; the only remaining lock delta was an incidental transitive@floating-ui/dombump with nopackage.jsonchange. Removed.fields/Dropdown'siconOnlystyling, which also affected the v1FeedExploreHeaderdate filter. RevertedDropdowntomainand scoped the square styling to the newExploreSortDropdownviaclassName.button(per the "don't add context to shared primitives" guideline).SidebarRailStatscomponent (the streak now lives on the avatar viaStreakRing), simplifiedStreakPopoverto its single used placement, and stripped theEarnPopanimation-comparison lab from the Storybook story (kept the real stories).createSquadMenuItem,PinnedSection,SquadFavoriteButton'sasPin) butNetworkSectionstill rendered the v1 star. Routed its rows throughcreateSquadMenuItem(removing a duplicated inline builder) and passasPinonly from the v2 sidebar — v1 keeps the star.Shared components — v2 polish gated behind opt-in props (v1/production unchanged)
The redesign is v2-only, so the shared-component tweaks the design introduced are gated behind props that default to the existing v1 behavior:
Section— hover-only collapse arrow + 1px item gap behind acompactprop (set only by the v2 sidebar); v1 keeps its always-visible arrow. Also fixes title-less sections getting stuck hidden.ProfileSectionItem/ProfileSection— external-link icon reveal-on-hover behind alinkIconHoverOnlyprop; the v2 profile/support menus opt in, production keeps the always-visible icon. (Internal-route hover-prefetch kept — invisible perf win.)ProfileMenuHeader— tighter name/handle gap behind acompactprop; also returnsnullwhen there's no user (strict-typecheck guard).NotificationsBell— newrail/railHideLabelprops are confined to theif (rail)branch (v2 only); the v1/mobileButtonpath is unchanged.Correctness & cleanup fixes (engineering review)
useStreakRingState's 5-minute timer only runs when it can change state (enabled, not yet read today, at-risk day).isCreateHoveredon blur; removed the orphaneddirectoryTabsbranch fromFeedExploreHeader; drop empty group sets from theuseInteractivePopupregistry; directlargeNumberFormatimport;max-w-3xltoken.Testing
node ./scripts/typecheck-strict-changed.js— clean.eslinton all changed shared + webapp files — clean.🤖 Generated with Claude Code
Preview domain
https://claude-competent-leakey-6f742a.preview.app.daily.dev