+ The profile's header and right column, for a Squad. The header
+ carries the cover, the round logo, the name with the verified badge,
+ one meta line and the stats, with every action as a Subtle button
+ and Join Squad last. Home is the products shelf, the composer,
+ pinned posts and one feed in infinite scroll. Search sits in the
+ header beside the options menu and opens Spotlight filtered to this
+ Squad; results get their own page.
+
+
+ Rules, FAQ, Members, Products and the other pages replace the centre
+ card under a back button and the page title. Edit page opens the
+ Manage area, laid out like profile settings: a grouped menu on
+ laptop, a list and then one page at a time on phones.
+
+
+ The right column holds the Verified Squad page card, View as a
+ visitor and the share card for the team, Rules, Team, Stack &
+ Tools, Analytics for admins, and Links. Below 1020px it becomes the
+ About tab beside Posts, above the composer.
+
+ ),
+};
diff --git a/packages/storybook/stories/squad-page/NoSidebarResearch.stories.tsx b/packages/storybook/stories/squad-page/NoSidebarResearch.stories.tsx
new file mode 100644
index 00000000000..ab4f5a1ff0e
--- /dev/null
+++ b/packages/storybook/stories/squad-page/NoSidebarResearch.stories.tsx
@@ -0,0 +1,2061 @@
+import type { ReactElement, ReactNode } from 'react';
+import React from 'react';
+import type { Meta, StoryObj } from '@storybook/react-vite';
+import classNames from 'classnames';
+import ExtensionProviders from '../extension/_providers';
+import { KitStyles } from './kit';
+
+const meta: Meta = {
+ title: 'Squad Page/4. Research',
+ parameters: { layout: 'fullscreen' },
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+};
+
+export default meta;
+
+// Desk research behind the no-sidebar direction: what the usability
+// literature says about replacing a pages column with in-page structure,
+// what thirty products do on a profile, community or organization page
+// that never had a sidebar, and ten ways to seat the sidebar's load in the
+// page, scored against that evidence. Ends with the composite written out
+// region by region.
+
+/* ------------------------------------------------------------ furniture */
+
+const Page = ({ children }: { children: ReactNode }): ReactElement => (
+
+);
+
+const chrome: Block[] = [
+ { l: 'daily.dev header and rail', t: 'muted', h: 1.25 },
+];
+const banner: Block[] = [{ l: 'Banner', t: 'chrome', h: 2 }];
+const identity = (cta = 'Follow'): Block[] => [
+ {
+ l: 'Avatar · CodeRabbit ✓ · coderabbit.ai · Developer tools · San Francisco · Since 2023 · 6.1k followers',
+ s: 8,
+ t: 'chrome',
+ h: 2.25,
+ },
+ { l: cta, s: 2, t: 'cta', h: 2.25 },
+ { l: 'Bell · Share · More', s: 2, t: 'chrome', h: 2.25 },
+];
+const mobileIdentity = (cta = 'Follow'): Block[][] => [
+ [{ l: 'Banner · avatar · CodeRabbit ✓ · meta', t: 'chrome', h: 2.5 }],
+ [
+ { l: cta, s: 8, t: 'cta' },
+ { l: 'More', s: 4, t: 'chrome' },
+ ],
+];
+const feed = (h = 6, s = 8): Block => ({ l: 'Posts feed', s, h, t: 'feed' });
+const supportColumn = (extra: Block[] = []): Block => ({
+ l: '',
+ s: 4,
+ stack: [
+ { l: 'Official company page', t: 'info' },
+ { l: 'Rules', t: 'info' },
+ { l: 'Team 8', t: 'info' },
+ { l: 'Links', t: 'info' },
+ ...extra,
+ ],
+});
+
+/* ------------------------------------------------------------ variations */
+
+interface Variation {
+ id: string;
+ title: string;
+ after: string;
+ carries: string;
+ strengths: string;
+ costs: string;
+ evidence: ReactNode;
+ bestWhen: string;
+ desktop: Block[][];
+ desktopCaption: string;
+ mobile: Block[][];
+ mobileCaption: string;
+}
+
+const variations: Variation[] = [
+ {
+ id: 'tabs',
+ title: 'Profile tabs',
+ after: 'X profile, GitHub organization, Hugging Face organization',
+ carries:
+ 'One underline row under the identity block: Posts, Releases, Products, Discussions, Polls. Rules, Team and Links are cards beside the feed on Posts only. Followers opens from the count. Manage is a menu on the header.',
+ strengths:
+ 'The pattern every visitor already knows. Areas are routed pages with their own URL, one preselected, which is what secondary navigation is supposed to be. The feed dominates Home.',
+ costs:
+ 'The row holds five comfortably and six at most. Rules and FAQ never get a tab, so on mobile they drop below the feed where an infinite list can bury them.',
+ evidence: (
+ <>
+ (one row, one or two word
+ labels, high-use tab first);{' '}
+ (every tab a URL,
+ counts allowed); .
+ >
+ ),
+ bestWhen: 'The page count stays at five or six and Home must be the feed.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ { l: 'Posts', s: 2, t: 'nav' },
+ { l: 'Releases', s: 2, t: 'nav' },
+ { l: 'Products', s: 3, t: 'nav' },
+ { l: 'Discussions', s: 3, t: 'nav' },
+ { l: 'Polls', s: 2, t: 'nav' },
+ ],
+ [feed(), supportColumn()],
+ ],
+ desktopCaption: 'Desktop, Posts tab',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [{ l: 'Posts · Releases · Products · Discu…', t: 'nav' }],
+ [feed(4, 12)],
+ [{ l: 'Rules · Team · Links below the feed', t: 'info' }],
+ ],
+ mobileCaption: 'Phone, row scrolls',
+ },
+ {
+ id: 'counted',
+ title: 'Counted tabs, Priority+',
+ after:
+ 'Product Hunt product hub, Kickstarter project, GitHub Settings and Teams tabs, Primer overflow',
+ carries:
+ 'The row carries everything the sidebar had: Posts, Releases 14, Products, Discussions 38, Polls, About, and Followers 6.1k. What does not fit the width folds right to left into a worded More. Admins get Manage 3 appended at the end of the same row, visible only to them.',
+ strengths:
+ 'Nothing is hidden that could be shown, and the hidden remainder is one labelled click away, which tests as well as fully visible navigation. Counts give every tab scent. It grows without a redesign: a new page is a new tab that lands in More on narrow screens.',
+ costs:
+ 'More is overlooked by some people the way "All filters" is, so only low-traffic pages may live there. The admin tab sits in the visitor row, which must be styled as a different kind of thing.',
+ evidence: (
+ <>
+ (combo
+ navigation matches visible: 50% vs 48% usage on desktop);{' '}
+ ;{' '}
+ ;{' '}
+ (tabs with counts
+ added because people jumped back and forth);{' '}
+ .
+ >
+ ),
+ bestWhen:
+ 'The page will grow past six areas and the team wants Manage one click from the public page.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ { l: 'Posts', s: 1, t: 'nav' },
+ { l: 'Releases 14', s: 2, t: 'nav' },
+ { l: 'Products', s: 2, t: 'nav' },
+ { l: 'Discussions 38', s: 2, t: 'nav' },
+ { l: 'Polls', s: 1, t: 'nav' },
+ { l: 'About', s: 1, t: 'nav' },
+ { l: 'More ▾', s: 1, t: 'nav' },
+ { l: 'Manage 3', s: 2, t: 'manage' },
+ ],
+ [feed(), supportColumn()],
+ ],
+ desktopCaption: 'Desktop, admin view; More holds Followers',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [
+ { l: 'Posts · Releases 14 · Produ…', s: 9, t: 'nav' },
+ { l: 'More', s: 3, t: 'nav' },
+ ],
+ [feed(4, 12)],
+ [{ l: 'Cards fold into About', t: 'info' }],
+ ],
+ mobileCaption: 'Phone, three visible plus More',
+ },
+ {
+ id: 'condensing',
+ title: 'Condensing header',
+ after: 'YouTube channel, LinkedIn Page on mobile, X, Instagram',
+ carries:
+ 'Any tab variant, plus a scroll rule: when the tab row reaches the top it sticks, and the hero collapses into it. Avatar, name, seal, Follow and the row become one 48px bar. The bell, share and More stay in the bar as icons.',
+ strengths:
+ 'The one thing the sidebar did that a header cannot, being there at every scroll depth, comes back without spending a column. Sticky menus tested 22% faster and were preferred by every participant who had a preference. Follow is always in reach without a second sticky bar.',
+ costs:
+ 'Every sticky pixel is paid on every page. Keep the bar to one row of readable text and tappable targets, opaque, and animate the collapse at scroll speed. On phones prefer a bar that hides on scroll-down and returns on scroll-up.',
+ evidence: (
+ <>
+ ;{' '}
+ ;{' '}
+ (a
+ second sticky CTA bar on listing pages won 0 of the tests);{' '}
+ .
+ >
+ ),
+ bestWhen: 'Always. This is a behaviour to add to whichever variant wins.',
+ desktop: [
+ chrome,
+ [
+ { l: 'Avatar · CodeRabbit ✓', s: 3, t: 'chrome', h: 1.75 },
+ {
+ l: 'Posts · Releases 14 · Products · Discussions 38 · Polls · About',
+ s: 6,
+ t: 'nav',
+ h: 1.75,
+ },
+ { l: 'Follow', s: 2, t: 'cta', h: 1.75 },
+ { l: 'Bell · ⋯', s: 1, t: 'chrome', h: 1.75 },
+ ],
+ [feed(7), supportColumn()],
+ ],
+ desktopCaption: 'Desktop, scrolled: hero collapsed into the sticky bar',
+ mobile: [
+ chrome,
+ [
+ { l: 'CodeRabbit ✓', s: 7, t: 'chrome' },
+ { l: 'Follow', s: 5, t: 'cta' },
+ ],
+ [{ l: 'Posts · Releases · Products…', t: 'nav' }],
+ [feed(6, 12)],
+ ],
+ mobileCaption: 'Phone, scrolled: returns on scroll-up',
+ },
+ {
+ id: 'home',
+ title: 'Curated Home, raw Posts',
+ after: 'Patreon Home vs Posts, YouTube channel Home, Steam hub All tab',
+ carries:
+ 'Home is a stack of owner-ordered shelves: pinned highlights, the latest release, the products, the poll of the week, the latest posts, each with "See all releases 14" and a clipped last card. Posts is the raw feed next to it. Releases, Products, Discussions and Polls keep their tabs.',
+ strengths:
+ 'A fed page always looks alive. Everything the company offers is visible in one scroll, which is the strongest sell to a prospect. Patreon made this its default for everyone, members included, and YouTube gives Home twelve sections.',
+ costs:
+ 'The feed no longer dominates Home; it starts one tab away. Shelves must never be the only route, most people never see past the first card, and each shelf needs a literal See all with its count. Twice the surface to keep tidy when the squad is young.',
+ evidence: (
+ <>
+ (Home is
+ what everyone sees first, Posts is chronological);{' '}
+ ;{' '}
+ ;{' '}
+ ;{' '}
+ (five frames,
+ position shown, no autoplay on mobile).
+ >
+ ),
+ bestWhen:
+ 'The page is a showcase first and a community second, and the feed delivers steadily enough to fill the shelves.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ { l: 'Home', s: 2, t: 'nav' },
+ { l: 'Posts', s: 2, t: 'nav' },
+ { l: 'Releases', s: 2, t: 'nav' },
+ { l: 'Products', s: 2, t: 'nav' },
+ { l: 'Discussions', s: 2, t: 'nav' },
+ { l: 'Polls', s: 2, t: 'nav' },
+ ],
+ [
+ {
+ l: '',
+ s: 8,
+ stack: [
+ { l: 'Pinned: CodeRabbit Triage · Latest release', t: 'feed' },
+ { l: 'Products shelf, See all 6 →', t: 'feed' },
+ { l: 'Poll of the week', t: 'feed' },
+ { l: 'Latest posts, See all →', t: 'feed', h: 2.5 },
+ ],
+ },
+ supportColumn(),
+ ],
+ ],
+ desktopCaption: 'Desktop, Home tab',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [{ l: 'Home · Posts · Releases · Prod…', t: 'nav' }],
+ [{ l: 'Pinned · latest release', t: 'feed' }],
+ [{ l: 'Products shelf ›', t: 'feed' }],
+ [{ l: 'Poll', t: 'feed' }],
+ [{ l: 'Latest posts', t: 'feed', h: 2.5 }],
+ ],
+ mobileCaption: 'Phone, shelves stack',
+ },
+ {
+ id: 'chips',
+ title: 'One feed, chips',
+ after: 'Threads and Bluesky feed switches, Discord forum tags',
+ carries:
+ 'There is one feed. Chips above it filter by kind: All, Posts, Releases, Polls, Discussions. Products, Rules and FAQ become widgets beside the feed with See all, and a page opened from a widget slides over the feed with a back button.',
+ strengths:
+ 'The most one-page of all. The feed dominates, the chips are the filter people look for first on any list, and on a phone the chip row is native.',
+ costs:
+ 'Chips are for filtering one list, not for moving between areas, and past six or eight kinds the toolbar stops scaling. Releases lose their log shape (months, kinds) unless the chip swaps the whole body, and a page opened from a widget is a modal in disguise. Products can never be a chip.',
+ evidence: (
+ <>
+ (two or
+ three chips, and the filter also stays in its regular place);{' '}
+ ;{' '}
+ (tabs group views of
+ one thing, not areas).
+ >
+ ),
+ bestWhen:
+ 'The squad is mostly posts of different kinds and has no Products or documents worth a page.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ { l: 'All', s: 1, t: 'nav' },
+ { l: 'Posts', s: 2, t: 'nav' },
+ { l: 'Releases', s: 2, t: 'nav' },
+ { l: 'Polls', s: 2, t: 'nav' },
+ { l: 'Discussions', s: 2, t: 'nav' },
+ { l: 'Latest ▾', s: 3, t: 'chrome' },
+ ],
+ [
+ feed(),
+ {
+ l: '',
+ s: 4,
+ stack: [
+ { l: 'Products, See all 6', t: 'info' },
+ { l: 'Rules · FAQ', t: 'info' },
+ { l: 'Team 8', t: 'info' },
+ { l: 'Links', t: 'info' },
+ ],
+ },
+ ],
+ ],
+ desktopCaption: 'Desktop, All',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [{ l: 'All · Posts · Releases · Polls ·…', t: 'nav' }],
+ [feed(5, 12)],
+ [{ l: 'Products · Rules · Team · Links', t: 'info' }],
+ ],
+ mobileCaption: 'Phone, chips scroll',
+ },
+ {
+ id: 'about',
+ title: 'About tab',
+ after:
+ 'Twitch About panels, LinkedIn Page About, Reddit About on mobile, Skool and Whop About tabs',
+ carries:
+ 'Everything that is not a stream of posts gets one tab: About. It holds the description, company facts, links, Rules and FAQ as accordions, the team with roles, and a followers preview with See all. Posts, Releases, Products, Discussions and Polls keep their tabs. The right column disappears entirely.',
+ strengths:
+ 'One labelled place for company information, which is what people expect on any organization page. Accordions suit many short independent sections and suit phones. No right rail to be blind to. It is exactly what Reddit, Skool and Whop show on a phone anyway.',
+ costs:
+ 'Rules are one click away from the composer instead of beside it. Reddit is the cautionary tale: when rules are not at the point of posting, people do not read them, and Reddit shipped a pre-post rules check to compensate. So the composer must carry a one-line rules link of its own.',
+ evidence: (
+ <>
+ ;{' '}
+ ;{' '}
+ ;{' '}
+ ;{' '}
+ ;{' '}
+ .
+ >
+ ),
+ bestWhen:
+ 'Mobile parity matters more than a full desktop right column, or as the phone fallback of any variant that has one.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ { l: 'Posts', s: 2, t: 'nav' },
+ { l: 'Releases', s: 2, t: 'nav' },
+ { l: 'Products', s: 2, t: 'nav' },
+ { l: 'Discussions', s: 2, t: 'nav' },
+ { l: 'Polls', s: 2, t: 'nav' },
+ { l: 'About', s: 2, t: 'nav' },
+ ],
+ [
+ {
+ l: '',
+ s: 12,
+ stack: [
+ { l: 'Description · company facts · links row', t: 'info' },
+ { l: 'Rules ▸ (accordion, expand all)', t: 'info' },
+ { l: 'FAQ ▸', t: 'info' },
+ { l: 'Team 8 with roles', t: 'info' },
+ { l: 'Followers 6,120 · See all', t: 'info' },
+ ],
+ },
+ ],
+ ],
+ desktopCaption: 'Desktop, About tab',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [{ l: 'Posts · Releases · Products · … About', t: 'nav' }],
+ [{ l: 'Description · links', t: 'info' }],
+ [{ l: 'Rules ▸', t: 'info' }],
+ [{ l: 'FAQ ▸', t: 'info' }],
+ [{ l: 'Team · Followers', t: 'info' }],
+ ],
+ mobileCaption: 'Phone, About tab',
+ },
+ {
+ id: 'rail',
+ title: 'Right rail cards',
+ after:
+ 'Reddit community sidebar, Skool About card, GitHub org Overview column',
+ carries:
+ 'The center is posts and nothing else. The right column carries a Pages card (Releases 14, Products, Discussions, Polls), an About card with description, counts and Follow, Rules as an accordion, Team, and Links. A page opens in the center with a back button. On a phone the column becomes an About tab.',
+ strengths:
+ 'The cleanest center. The column repeats on every page so orientation never changes. Skool puts the join button in this card and Reddit its description, rules and moderators.',
+ costs:
+ 'People have trained themselves to skip the right column: in one eyetracking case it took 0.8% of fixations for a quarter of the screen. Anything required, the navigation included, cannot live only there. This is the pages column with a different address, and it is the variant Reddit users could not find rules in on mobile.',
+ evidence: (
+ <>
+ ;{' '}
+ (sticky,
+ independently scrolling sidebar);{' '}
+ ;{' '}
+ (sidebars become an index
+ page or a sheet at narrow widths).
+ >
+ ),
+ bestWhen:
+ 'Desktop is the only surface that matters and the feed must be untouched by chrome.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ feed(8),
+ {
+ l: '',
+ s: 4,
+ stack: [
+ {
+ l: 'Pages: Releases 14 · Products · Discussions · Polls',
+ t: 'nav',
+ h: 2,
+ },
+ { l: 'About · 6.1k followers · Follow', t: 'info' },
+ { l: 'Rules ▸', t: 'info' },
+ { l: 'Team 8', t: 'info' },
+ { l: 'Links', t: 'info' },
+ ],
+ },
+ ],
+ ],
+ desktopCaption: 'Desktop, no row at all',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [
+ { l: 'Posts', s: 6, t: 'nav' },
+ { l: 'About', s: 6, t: 'nav' },
+ ],
+ [feed(5, 12)],
+ ],
+ mobileCaption: 'Phone, column becomes About',
+ },
+ {
+ id: 'anchors',
+ title: 'One page, anchors',
+ after:
+ 'Crunchbase and Wellfound section navigation, Kickstarter tab row, Slack app page anchors',
+ carries:
+ 'Everything on one long page in sections: latest posts, releases, products, the poll, rules, FAQ, team. A sticky "On this page" row (or a right-hand table of contents) scroll-spies the sections. Each list section shows five with Show more and its count. No routed sub-pages.',
+ strengths:
+ 'The whole company is one scroll and one URL, the way a company profile on Crunchbase or Wellfound reads. In-page links were used and liked by 9 of 11 participants when they had a specific need, and the table of contents gives a mental model of the page.',
+ costs:
+ 'Anchors are for pages of independent chunkable sections, not for a feed: an infinite feed cannot sit above anything. Long pages cost on phones. People ignore in-page links during first exploration, and Discussions or Polls as a section of five is a preview, not the page.',
+ evidence: (
+ <>
+ ;{' '}
+ (nothing
+ required below an infinite list);{' '}
+ (routed sections with prev and
+ next).
+ >
+ ),
+ bestWhen:
+ 'The page is a profile more than a feed: a young squad, or a company whose releases and products matter more than discussion.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ {
+ l: 'On this page: Posts · Releases 14 · Products 6 · Poll · Rules · FAQ · Team (sticky, scroll-spy)',
+ t: 'nav',
+ },
+ ],
+ [
+ {
+ l: '',
+ s: 9,
+ stack: [
+ { l: 'Latest posts (5) · Show more', t: 'feed', h: 2 },
+ { l: 'Releases (5 of 14) · Show more', t: 'feed', h: 2 },
+ { l: 'Products (6)', t: 'feed' },
+ { l: 'Poll', t: 'feed' },
+ { l: 'Rules · FAQ · Team', t: 'info' },
+ ],
+ },
+ { l: 'Table of contents (sticky)', s: 3, t: 'nav', h: 6 },
+ ],
+ ],
+ desktopCaption: 'Desktop, one URL',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [{ l: 'Posts · Releases · Products · Poll ·…', t: 'nav' }],
+ [{ l: 'Latest posts (5)', t: 'feed', h: 2 }],
+ [{ l: 'Releases (5 of 14)', t: 'feed', h: 2 }],
+ [{ l: 'Products · Poll · Rules…', t: 'feed', h: 2 }],
+ ],
+ mobileCaption: 'Phone, one long scroll',
+ },
+ {
+ id: 'highlights',
+ title: 'Highlights strip',
+ after:
+ 'Instagram highlights, Whop apps row on mobile, Discord Server Guide resources',
+ carries:
+ 'A strip of round buttons under the stats: every page and every link, one glyph and a short label each, external ones marked. The center is posts until a highlight is picked; the strip stays and marks the active one.',
+ strengths:
+ 'The most visual and the most phone-native, since the strip scrolls. External links get equal billing with pages, which suits a company whose docs and GitHub matter as much as its posts.',
+ costs:
+ 'A strip of twelve glyphs asks the visitor to read icons, and labels are short by force. Instagram just moved its own highlights ring into a tab, and its users predicted far less engagement for anything not on the ring. Pages and links mixed in one strip is the "never mix navigation kinds" rule broken on purpose.',
+ evidence: (
+ <>
+ ;{' '}
+ (labels, not icons,
+ carry scent); {' '}
+ (resources as clean pages off the channel list).
+ >
+ ),
+ bestWhen:
+ 'A mobile-first squad with few pages and many links, or as a links row only, under the bio.',
+ desktop: [
+ chrome,
+ banner,
+ identity(),
+ [
+ {
+ l: '◯ Releases ◯ Products ◯ Discussions ◯ Polls ◯ Rules ◯ FAQ ◯ Docs ↗ ◯ GitHub ↗ ◯ Discord ↗ ◯ X ↗',
+ t: 'nav',
+ h: 2.25,
+ },
+ ],
+ [
+ feed(),
+ {
+ l: '',
+ s: 4,
+ stack: [
+ { l: 'Official company page', t: 'info' },
+ { l: 'Team 8', t: 'info' },
+ ],
+ },
+ ],
+ ],
+ desktopCaption: 'Desktop, strip under the stats',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [{ l: '◯ ◯ ◯ ◯ ◯ ◯ ◯ →', t: 'nav', h: 2 }],
+ [feed(5, 12)],
+ ],
+ mobileCaption: 'Phone, strip scrolls',
+ },
+ {
+ id: 'sheet',
+ title: 'Pages sheet',
+ after: 'Discord mobile server drawer, Whop mobile, Primer bottom sheet',
+ carries:
+ 'The sidebar becomes a sheet. A "Pages" button beside Follow opens it over the feed with every page, document, link and the Manage section, exactly as the column was. The page itself is header and feed, full width.',
+ strengths:
+ 'Nothing is redesigned: the sidebar is kept and hidden. The feed gets the whole width. This is what every sidebar product does on a phone already.',
+ costs:
+ 'Hidden navigation is the best-measured failure in this list: 27% usage against 48% for visible on desktop, tasks 39% slower, discoverability down more than a fifth, and people open it later in the session. It is the control the other nine are measured against, not a candidate.',
+ evidence: (
+ <>
+ ;{' '}
+ (kept the
+ server column because people belong to many servers, and still drew
+ backlash); {' '}
+ (drill-in menus disorient and collide with Back).
+ >
+ ),
+ bestWhen: 'Never on desktop. On a phone, only for the Manage section.',
+ desktop: [
+ chrome,
+ banner,
+ [
+ { l: 'Avatar · CodeRabbit ✓ · meta', s: 6, t: 'chrome', h: 2.25 },
+ { l: '☰ Pages', s: 2, t: 'nav', h: 2.25 },
+ { l: 'Follow', s: 2, t: 'cta', h: 2.25 },
+ { l: 'Bell · ⋯', s: 2, t: 'chrome', h: 2.25 },
+ ],
+ [
+ {
+ l: 'Sheet: Home · Releases · Products · Discussions · Polls · Rules · FAQ · Links · Manage',
+ s: 4,
+ t: 'nav',
+ h: 7,
+ },
+ { l: 'Posts feed (dimmed)', s: 8, t: 'muted', h: 7 },
+ ],
+ ],
+ desktopCaption: 'Desktop, sheet open',
+ mobile: [
+ chrome,
+ ...mobileIdentity(),
+ [feed(3, 12)],
+ [{ l: 'Bottom sheet: pages…', t: 'nav', h: 3 }],
+ ],
+ mobileCaption: 'Phone, bottom sheet',
+ },
+];
+
+/* --------------------------------------------------------------- tables */
+
+const principles: { title: string; body: ReactNode }[] = [
+ {
+ title: 'Visible beats hidden, and combo equals visible.',
+ body: (
+ <>
+ In NN/g's study of 179 people on six live sites, hidden navigation
+ was used in 27% of desktop tasks against 48% for visible, with tasks 39%
+ slower and content discoverability down more than 20%. A row that shows
+ what fits and folds the rest into a labelled overflow scored the same as
+ fully visible.
+ >
+ ),
+ },
+ {
+ title:
+ 'Horizontal local navigation under the header, subordinate to daily.dev.',
+ body: (
+ <>
+ A company page is a subsite. Its areas are local navigation and the
+ documented alternative to the inverted-L sidebar is a row directly under
+ the page header, styled below the global chrome and above parent
+ categories. The sidebar's cost is content-to-chrome: NN/g's
+ example goes from 5:1 with a column to 12:1 without.{' '}
+ , ,{' '}
+
+ >
+ ),
+ },
+ {
+ title: 'Areas are routed pages styled as tabs, not in-page tabs.',
+ body: (
+ <>
+ One URL per area, one preselected, counts allowed as enhancement,
+ overflow into a menu when the row does not fit, at most two levels,
+ never a second stacked row. Shareable URLs also matter because AI
+ crawlers read raw HTML only. ,{' '}
+
+ >
+ ),
+ },
+ {
+ title: 'Five or six visible, the rest behind a word.',
+ body: (
+ <>
+ Carbon caps tabs at six, Apple at three to five on a phone, and Baymard
+ found horizontal toolbars stop scaling past six to eight kinds with the
+ More button overlooked by some. Priority+ is the responsive rule that
+ keeps the row honest at every width. ,{' '}
+ , ,{' '}
+
+ >
+ ),
+ },
+ {
+ title: 'Everything common to all areas sits above the row.',
+ body: (
+ <>
+ Identity, seal, meta strip, description, counts, Follow, bell, share and
+ links are utility and identity, not areas, so they live in the header.
+ One primary action; the rest secondary and rolled into one menu on small
+ screens. , ,{' '}
+ ,
+ >
+ ),
+ },
+ {
+ title: 'The landing view is hybrid: content first, doors above it.',
+ body: (
+ <>
+ A page that is only links to other pages adds a step and annoys. Product
+ Hunt's hub redesign drew "this page is a dead-end" and
+ "information hierarchy feels too flat". Render the default
+ area immediately under the row. A bento of eight doors is eight
+ promo-looking boxes with low scent. ,{' '}
+ ,
+ >
+ ),
+ },
+ {
+ title: 'Two levels of disclosure, and Manage is its own control.',
+ body: (
+ <>
+ Areas are level one, the Manage sub-areas level two; nothing deeper.
+ GitHub appends Settings and Teams to the same row only for the people
+ who may see them, which keeps management one click from the public page
+ without mixing it into the visitor's tabs. Nobody surfaces a
+ moderation queue on the public page. ,{' '}
+ ,
+ >
+ ),
+ },
+ {
+ title: 'Stick only what repeats, shrunk to a bar.',
+ body: (
+ <>
+ Sticky headers raise use of what is in them at the price of viewport on
+ every page. Collapse the hero into avatar, name, Follow and the row;
+ keep it opaque and one line tall; on phones let it return on scroll-up.
+ Never add a second sticky bar: pinned CTAs on listing pages won none of
+ 33 A/B tests. , ,{' '}
+
+ >
+ ),
+ },
+ {
+ title:
+ 'The right column is support, never the only home of anything required.',
+ body: (
+ <>
+ Right-rail blindness is measured: 0.8% of fixations for 25% of the
+ screen in one case. Reddit's sidebar rules were invisible on phones
+ for years, mods complained, and Reddit's 2025 answer was a pre-post
+ rules check rather than hoping people read the column. Cards there must
+ look like content and fold under the feed or into About when the width
+ goes. , ,{' '}
+ ,
+ >
+ ),
+ },
+ {
+ title: 'Shelves are shortcuts with a literal See all and a count.',
+ body: (
+ <>
+ Most people never see past the first card of a carousel, so a shelf can
+ preview an area but never be the only route to it. Five visible, a
+ clipped edge card, no autoplay, and "See all releases" as a
+ link rather than a tappable heading. ,{' '}
+ ,
+ >
+ ),
+ },
+ {
+ title: 'Infinite scroll for the feed only; nothing required below it.',
+ body: (
+ <>
+ Releases, followers and the moderation queue use Show more with counts
+ and restore position on Back. Rules and FAQ cannot depend on reaching
+ the end of a feed, which is the argument against stacking them under
+ posts on a phone.
+ >
+ ),
+ },
+ {
+ title: 'Labels are nouns with scent, plus counts.',
+ body: (
+ <>
+ Releases, Products, Discussions, Polls, Rules, FAQ, Followers. Not
+ Explore, Community or More from CodeRabbit. Counts on activity tabs
+ (Kickstarter's FAQ 19, Updates 45) tell people what is behind the
+ label before they click. ,
+ >
+ ),
+ },
+ {
+ title: 'On a phone: a scrolling row with a clipped last tab, then About.',
+ body: (
+ <>
+ Do not fold the row into a menu (hidden nav costs 15% time and about 30
+ points of usage on mobile). Offset the first tab and let the last one be
+ visibly cut so the row reads as scrollable. Four or five areas reachable
+ without scrolling the row. Accordions over anchors for rules and FAQ.
+ Admin sub-areas as a section menu, not drill-in sheets.{' '}
+ , ,
+ >
+ ),
+ },
+ {
+ title: 'The trust token lives on the name line and is echoed on people.',
+ body: (
+ <>
+ GitHub and Hugging Face write Verified beside the name; X gives
+ affiliates a small square of the parent logo and the org an Affiliates
+ tab; Stack Overflow marks recognized members and recommended answers;
+ Bluesky lets a tap on the check show who granted it. A word or a mark,
+ never a banner or a section. ,{' '}
+ , ,
+ >
+ ),
+ },
+];
+
+const fieldNotes: ReactNode[][] = [
+ [
+ 'X',
+ 'Six or seven sticky scrolling text tabs; orgs get an Affiliates tab; the 2026 redesign turns them into icon segments',
+ 'Header only: meta line, link, joined date, pinned post first in Posts',
+ 'Follow, bell, More (share, lists, mute, report)',
+ 'Edit profile swaps into the Follow slot; org tools in the global nav',
+ 'Same, icon tabs',
+ ],
+ [
+ 'YouTube',
+ 'Sticky tabs shown only when the channel has that content; Home is up to twelve owner-ordered shelves',
+ 'About dialog from "…more": description, up to 14 links, stats',
+ 'Subscribe, bell after subscribing, Join',
+ 'Customize channel and Manage videos replace Subscribe, open Studio',
+ 'Compressed header, sticky scrolling tabs',
+ ],
+ [
+ 'Reddit',
+ 'Feed and Wiki tabs plus sort chips; a highlights carousel of up to six pinned posts',
+ 'Right column: description, Rules accordion, Bookmarks, Moderators; on a phone "See more" opens an About screen',
+ 'Join, Create post, bell, More',
+ 'Mod Tools button top right, a separate hub',
+ 'Column collapses into About; rules went unread, so Post Check was added',
+ ],
+ [
+ 'LinkedIn Page',
+ 'Five to eight tabs; Home is a snapshot of the others; Jobs and Life only when they exist',
+ 'About tab with structured sections',
+ 'Follow, a custom button, More',
+ 'Separate admin view with its own left nav and "View as member"',
+ 'Chip row, compressed header',
+ ],
+ [
+ 'Instagram',
+ 'Icon tabs; Highlights moved from a ring under the bio into a tab in 2025',
+ 'Header: category label, bio, five links',
+ 'Follow, Message, Contact',
+ 'A full-width Professional dashboard row under the bio',
+ 'Canonical',
+ ],
+ [
+ 'Bluesky',
+ 'Eight scrolling tabs; feeds, lists and starter packs are tabs, not cards',
+ 'Bio only',
+ 'Follow, More',
+ 'Edit profile in the Follow slot',
+ 'Same',
+ ],
+ [
+ 'GitHub org',
+ 'Underline tabs with counts; Teams appended for members, Settings for owners',
+ 'README and pinned repos in the main column; People, Languages, Topics cards on the right of Overview only',
+ 'Follow, Sponsor',
+ 'Settings tab; pin and README in place; Public / Member view toggle',
+ 'Tabs scroll or overflow; cards stack under the README',
+ ],
+ [
+ 'Hugging Face org',
+ 'Tabs with counts (Collections 15, models 70)',
+ 'Team members as an avatar row with +270 under the header; org card in the main column; no sidebar',
+ 'Follow',
+ 'Edit-card button for members; settings on its own route',
+ 'Already one column',
+ ],
+ [
+ 'Product Hunt',
+ 'Tabs with counts and a More overflow; Overview is shelves',
+ 'Right cards on Overview only (awards, similar products, company info)',
+ 'Follow, upvote, Visit website',
+ 'Separate launch dashboard',
+ 'Cards stack; users called the hub "a dead-end" and "too flat"',
+ ],
+ [
+ 'Kickstarter',
+ 'Tab row with counts: FAQ 19, Updates 45, Comments 127k; Rewards tab added so backers stop jumping around',
+ 'Creator card in the right column; FAQ is a tab; risks at the bottom',
+ 'Back this project, Remind me, Share',
+ 'Separate creator dashboard',
+ 'Rewards column drops under the story',
+ ],
+ [
+ 'Skool',
+ 'Six or seven fixed tabs the owner can hide; category pills filter the feed',
+ 'Right About card on every tab: description, links, members and online counts, join button',
+ 'JOIN GROUP inside the About card',
+ 'SETTINGS button in the header',
+ 'Same tabs; the card becomes the About tab',
+ ],
+ [
+ 'Patreon',
+ 'Home (curated shelves) and Posts (chronological) plus owner-added links; other sections in a top-right menu',
+ 'Expandable About in the header, More menu',
+ '"Join for free" directly under the header, paid options below',
+ 'Edit page top right, a side panel with Public / Free / Paid preview',
+ 'Same page on mobile web',
+ ],
+ [
+ 'Whop (mobile)',
+ 'Home, Apps, Products, About tabs after the 2025 rebuild',
+ 'About tab holds the team; FAQ and benefits as storefront sections',
+ 'Owner-labelled Join or Subscribe',
+ 'Separate business dashboard; owners see the same tabs with owner tools',
+ 'Five-tab app bar under a tabbed page',
+ ],
+ [
+ 'Twitch',
+ 'Home, About, Schedule, Videos; Home is shelves',
+ 'About tab is info panels (rules, socials, specs) plus a social row',
+ 'Follow with bell, Subscribe',
+ 'Creator dashboard; panels edited in place with an Edit Panels toggle',
+ 'Tabs under the player; panels read-only',
+ ],
+ [
+ 'Steam hub',
+ 'Ten tabs; All is a mixed front page with official announcements pinned',
+ 'Right column: info, rules, moderators',
+ 'Follow',
+ 'Admin panel; developer label on posts',
+ 'Tabs wrap',
+ ],
+ [
+ 'dev.to org',
+ 'No tabs; one feed',
+ 'Cards beside the feed: Meet the team, posts and members counts, tech stack',
+ 'Follow; admins also see Settings and Admin links in the header',
+ 'Settings route with analytics',
+ 'Cards stack above the feed',
+ ],
+];
+
+const seatItems: Record = {
+ 'Home / posts': [
+ 'Posts tab',
+ 'Posts tab',
+ 'Posts tab',
+ 'Posts tab, Home is shelves',
+ 'All chip',
+ 'Posts tab',
+ 'The center',
+ 'First section',
+ 'The center',
+ 'The center',
+ ],
+ Releases: [
+ 'Tab',
+ 'Tab, count',
+ 'Tab',
+ 'Tab and shelf',
+ 'Chip',
+ 'Tab',
+ 'Pages card',
+ 'Section, anchor',
+ 'Glyph',
+ 'Sheet',
+ ],
+ Products: [
+ 'Tab',
+ 'Tab',
+ 'Tab',
+ 'Tab and shelf',
+ 'Widget, See all',
+ 'Tab',
+ 'Pages card',
+ 'Section',
+ 'Glyph',
+ 'Sheet',
+ ],
+ 'Discussions, Polls': [
+ 'Tabs',
+ 'Tabs, count',
+ 'Tabs',
+ 'Tabs, poll shelf',
+ 'Chips',
+ 'Tabs',
+ 'Pages card',
+ 'Sections (5)',
+ 'Glyphs',
+ 'Sheet',
+ ],
+ 'Rules, FAQ': [
+ 'Card by the feed',
+ 'About tab, card on Posts',
+ 'Card by the feed',
+ 'Card by the feed',
+ 'Widget',
+ 'About accordions',
+ 'Rail accordion',
+ 'Sections',
+ 'Glyphs',
+ 'Sheet',
+ ],
+ Links: [
+ 'Card',
+ 'Header link row',
+ 'Header link row',
+ 'Card',
+ 'Widget',
+ 'About, header row',
+ 'Rail card',
+ 'Header row',
+ 'Glyphs, marked',
+ 'Sheet',
+ ],
+ Followers: [
+ 'Count',
+ 'More, count on tab',
+ 'Count',
+ 'Count',
+ 'Count',
+ 'About preview',
+ 'About card',
+ 'Team section',
+ 'Count',
+ 'Sheet',
+ ],
+ Follow: [
+ 'Header',
+ 'Header',
+ 'Header, then the bar',
+ 'Header',
+ 'Header',
+ 'Header',
+ 'Header and rail card',
+ 'Header',
+ 'Header',
+ 'Header',
+ ],
+ Manage: [
+ 'Header menu',
+ 'Appended tab',
+ 'Header menu',
+ 'Header menu',
+ 'Header menu',
+ 'Header menu',
+ 'Rail card',
+ 'Header menu',
+ 'Glyph',
+ 'In the sheet',
+ ],
+};
+
+const scoreRows: Record = {
+ 'Visible at first paint': [
+ '5 areas',
+ '6 areas, More',
+ 'As the base',
+ '6 areas',
+ '4 chips',
+ '6 areas',
+ '4 in a card',
+ '7 anchors',
+ '8 to 10 glyphs',
+ '1 button',
+ ],
+ 'Feed first on Home': [
+ 'Yes',
+ 'Yes',
+ 'Yes',
+ 'No, one tab away',
+ 'Yes',
+ 'Yes',
+ 'Yes',
+ 'Yes, then sections',
+ 'Yes',
+ 'Yes',
+ ],
+ 'Rules from the composer': [
+ 'Beside it',
+ 'Beside it on Posts',
+ 'Beside it',
+ 'Beside it',
+ 'Beside it',
+ 'One click',
+ 'Rail, often unseen',
+ 'Same page',
+ 'One click',
+ 'Two clicks',
+ ],
+ 'Grows to': [
+ '6 tabs',
+ 'Unlimited via More',
+ 'As the base',
+ 'Unlimited shelves',
+ '5 chips',
+ '6 tabs and About',
+ 'Unlimited rows',
+ '8 anchors',
+ '8 glyphs',
+ 'Unlimited',
+ ],
+ Mobile: [
+ 'Row scrolls; cards sink',
+ 'Row scrolls, More; About',
+ 'Bar returns on scroll-up',
+ 'Shelves stack',
+ 'Chips scroll',
+ 'About tab',
+ 'Becomes About',
+ 'Long page',
+ 'Strip scrolls',
+ 'Bottom sheet',
+ ],
+ 'Strongest evidence': [
+ 'NN/g tabs; X, GitHub',
+ 'NN/g combo nav; Primer; Kickstarter',
+ 'Smashing 22% faster; NN/g sticky',
+ 'Patreon, YouTube',
+ 'Baymard promoted filters',
+ 'NN/g accordions; Twitch, Skool',
+ 'Reddit, Skool',
+ 'NN/g in-page links; Crunchbase',
+ 'Instagram, Whop',
+ 'Discord mobile',
+ ],
+ 'Evidence against': [
+ 'Overflows at 7',
+ 'More is overlooked by some',
+ 'Viewport cost per page',
+ 'Feed one click away; carousel blindness',
+ 'Chips are filters, not areas',
+ 'Rules a click from the composer',
+ 'Right-rail blindness 0.8%',
+ 'Nothing lives below a feed',
+ 'Icons carry no scent; IG moved its ring',
+ 'Hidden nav 27% vs 48%',
+ ],
+ Verdict: [
+ 'Base',
+ 'Spine',
+ 'Add to the spine',
+ 'One shelf, not a tab',
+ 'Sort, not nav',
+ 'The phone fallback',
+ 'Cards on Posts only',
+ 'For the About tab',
+ 'A links row only',
+ 'Manage on phones only',
+ ],
+};
+
+const manageOptions: ReactNode[][] = [
+ [
+ 'Appended tab',
+ 'Manage 3 at the end of the row, visible to staff only; inside it a second-level row: Moderation 3, Content feed, Analytics, Settings. Moderators see Moderation alone.',
+ 'GitHub Settings and Teams tabs, npm Settings and Billing',
+ 'One click from the public page, badge carries the queue, no new surface. Must read as a different kind of tab.',
+ ],
+ [
+ 'Header pill and panel',
+ 'A Manage pill beside Edit page opens a side panel with the same four sections and a Preview as Public / Follower / Moderator switch.',
+ 'Patreon Edit page panel, GitHub view-as toggle',
+ 'Keeps the row clean and gives preview for free. A panel over a page is a modal in disguise for anything long, like the queue.',
+ ],
+ [
+ 'Separate dashboard',
+ 'Manage opens a full admin surface with its own left nav, the way production has squad settings and moderation as pages today.',
+ 'LinkedIn admin view, YouTube Studio, Reddit Mod Tools',
+ 'Right for heavy work, but it brings the sidebar back for the people who use the page most and loses the "same page, more tools" feel.',
+ ],
+ [
+ 'In place',
+ 'Edit page on the header, pencil affordances on the about block, pins and shelves, a Feed settings strip on Releases for admins.',
+ 'Wellfound Edit Profile, G2 pencils, Hugging Face edit card, Twitch Edit Panels',
+ 'Not a home for the queue or analytics on its own. Pairs with the appended tab.',
+ ],
+];
+
+/* ---------------------------------------------------------------- views */
+
+const Legend = (): ReactElement => (
+
+ Ten ways to seat the sidebar in the page, and the evidence for each
+
+
+
+ The pages column carries eleven things: Home, Releases, Products,
+ Discussions, Polls, Rules, FAQ, the company links, Followers,
+ Follow, and the team's Manage section. Take the column away and
+ every one of them needs a seat in the header, the row, the center,
+ or the right column. This page collects what the usability
+ literature says about that move, what thirty products do on a
+ profile or organization page that never had a sidebar, ten ways to
+ seat the load scored against that evidence, and the composite
+ written out region by region at the end.
+
+
+ Short version: the field and the research agree. One counted tab row
+ under the identity block, everything common above it, the feed
+ rendered immediately below it, the docs in an About tab with support
+ cards beside the feed on desktop, a header that collapses into the
+ row on scroll, and Manage appended to the row for the people who may
+ see it.
+
+
+
+
+
+
+ {principles.map((rule, index) => (
+
+
+ {String(index + 1).padStart(2, '0')}
+
+
+
+ {rule.title}
+
+
{rule.body}
+
+
+ ))}
+
+
+
+
+
+
+ Consumer profiles, community platforms and developer organization
+ pages, read in September 2026. The full set covered thirty products;
+ these are the ones that changed a decision. Three things recur
+ everywhere: a counted tab row, the trust mark on the name line, and
+ management entered from the header but done somewhere else.
+
+
+
+
+
+
+
+
+ Each is drawn as a schematic at desktop and phone width, with the
+ colour telling what kind of thing each block is. The research led to
+ the chosen direction, which lives in Squad Page, 1. Direction.
+
+ The sidebar's Manage section is the part with no consumer
+ precedent: no product surfaces a moderation queue on the public
+ page. Four ways to seat it, with the products that do each.
+
+
+
+
+
+ Pick the appended tab, paired with in-place affordances. The queue
+ badge on the tab does the job the sidebar badge did, moderators get
+ one tab with one section, and a separate dashboard stays available
+ later for analytics if it outgrows a page.
+
+
+
+
+
+
+
+ No single variation wins on its own. The counted row is the spine
+ because it is the only one that scales, keeps everything visible
+ that can be, and has a documented equal to visible navigation. The
+ condensing header gives back the one thing the column did that a
+ header cannot. The About tab is the phone answer to the right column
+ and the natural home of Rules, FAQ and the team, while the desktop
+ keeps support cards beside the feed on Posts. The curated Home
+ survives as one pinned shelf at the top of Posts rather than a
+ second Home. Chips survive as the sort of one list. The highlights
+ strip survives as the header's link row. The sheet survives
+ only for Manage on a phone.
+
+
+
+
+
+
+
+
+
+
+
+
+ Banner (the X asset, 1500 by 500, anchored top), avatar
+ overlapping its bottom edge, name with the seal, then one meta
+ strip: coderabbit.ai · Developer tools · San Francisco, CA · Since
+ Apr 2023. The bio on one line with "more". A stats row:
+ Followers 6,120 · Posts 184 · Upvotes 12.3k, each a link. Under it
+ a link row of labelled icons, Docs, GitHub, X, YouTube, LinkedIn,
+ and "and 1 more" past five, then the team as an avatar
+ row of eight that opens Followers on the Moderators tab. Featured
+ and Private chips only when true.
+
+
+ Right cluster, one primary and the rest secondary: Follow (white)
+ or Following, the bell once following, Share, More with the
+ production items. Admins see Edit page and Boost before them.
+ Anonymous sees Sign up to follow and no bell. Blocked sees Follow
+ disabled and the strip below the row.
+
+
+
+
+ Posts · Releases 14 · Products · Discussions 38 · Polls 1 · About,
+ underline style, left-aligned, spanning the content width,
+ directly above what it controls. Followers is the first item in
+ More; Priority+ measures the width and moves the rightmost tabs
+ into More one at a time. Counts load together so the row never
+ shifts. Every tab is a routed URL, /squads/coderabbit/releases, so
+ links and crawlers get real pages. Staff see Manage 3 appended at
+ the far right, styled as the team's tab: dashed underline,
+ badge for the queue.
+
+
+
+
+ A pinned strip first (up to three, the team labels and expires
+ them, the way Reddit highlights work), then the composer or the
+ lock card with its reason, a one-line review note and a Rules
+ link, then a Latest | Top segmented control, then the infinite
+ feed. Own pending posts show as the strip above the feed. On
+ desktop the support column sits beside Posts only: Official
+ company page, Rules (first three, See all in About), Team 8,
+ Links. Every other tab is full width.
+
+
+
+
+ As the workspace pages, full width. Releases keeps its month
+ groups and the All · Features · Fixes · Betas chips as the filter
+ of that one list, with Show more and the count, and for admins the
+ Content feed strip naming the RSS source. Discussions and Polls
+ keep their composers under the posting rules.
+
+
+
+
+ Description in full, the company facts (website, size, location,
+ founded), the link row again, Rules as an accordion with expand
+ all, FAQ as an accordion, Team with roles, a Followers preview of
+ twelve with See all 6,120. Everything the right column shows on
+ desktop is here too, so nothing lives in the rail alone. Admins
+ get a pencil on each block.
+
+
+
+
+ Inside the tab a second-level segmented row: Moderation 3 ·
+ Content feed · Analytics · Settings. Moderators see Moderation
+ only. A Preview as switch (Public / Follower / Moderator) sits at
+ the right of that row. Nothing goes deeper than this level; a
+ queue item opens as the post does.
+
+
+
+
+ When the row reaches the top it sticks and the hero collapses into
+ it: avatar 24px, name, seal, Follow or Following, the row, bell
+ and More as icons. One line, opaque, 48px, animated at scroll
+ speed. No other sticky element on the page.
+
+
+
+
+ The banner shortens, the identity stacks, Follow spans the width
+ with More beside it. The row scrolls with the first tab offset and
+ the last visibly cut; More sits at its end. The support column
+ folds into About, and the Official company page card sits under
+ the bio instead. The sticky bar hides on scroll-down and returns
+ on scroll-up. Manage opens as a section menu of its four pages,
+ not a drill-in.
+
+
+
+
+ Private squads show the production wall on every tab and the
+ invitation landing; blocked users see Follow disabled and the
+ strip; a young page shows empty states in place of the pinned
+ strip and feed, with connect-the-feed for admins; featured adds
+ the chip; boost stays an admin header action. Vocabulary stays
+ Follow, Following, Followers.
+
+
+
+ ),
+};
diff --git a/packages/storybook/stories/squad-page/OfficialBadge.stories.tsx b/packages/storybook/stories/squad-page/OfficialBadge.stories.tsx
new file mode 100644
index 00000000000..16795e6f142
--- /dev/null
+++ b/packages/storybook/stories/squad-page/OfficialBadge.stories.tsx
@@ -0,0 +1,48 @@
+import type { ReactElement, ReactNode } from 'react';
+import React from 'react';
+import type { Meta, StoryObj } from '@storybook/react-vite';
+import ExtensionProviders from '../extension/_providers';
+import { KitStyles } from './kit';
+import { RulesWidget, VerifiedWidget } from './home';
+
+const meta: Meta = {
+ title: 'Squad Page/3. Verified badge',
+ parameters: { layout: 'fullscreen' },
+};
+
+export default meta;
+
+const Eyebrow = ({ children }: { children: ReactNode }): ReactElement => (
+
+ {children}
+
+);
+
+/** The chosen badge, Aurora, as it ships at the top of the widget column. */
+export const Overview: StoryObj = {
+ render: () => (
+
+
+
+
+
+ Squad page · The verified badge
+
Aurora
+
+ Frosted glass with a brand-purple hairline and two soft light
+ sources, cabbage and onion, behind the seal and four words. Picked
+ from 28 explorations; it is the Verified Squad page card at the
+ top of the right column. On phones the right column moves to the
+ About tab: the header shows the verified badge beside the name,
+ and the card sits at the top of About.
+
+
+
+
+
+
+
+
+
+ ),
+};
diff --git a/packages/storybook/stories/squad-page/archive/Navigation.stories.tsx b/packages/storybook/stories/squad-page/archive/Navigation.stories.tsx
new file mode 100644
index 00000000000..73af2e9e543
--- /dev/null
+++ b/packages/storybook/stories/squad-page/archive/Navigation.stories.tsx
@@ -0,0 +1,138 @@
+import type { ReactElement, ReactNode } from 'react';
+import React from 'react';
+import type { Meta, StoryObj } from '@storybook/react-vite';
+import ExtensionProviders from '../../extension/_providers';
+import { KitStyles, Viewer } from '../kit';
+import { WorkspaceStyles } from '../workspace';
+import { Nav, navPageIds, NavShell, specs } from './navigation';
+
+const meta: Meta = {
+ title: 'Squad Page/Archive/Navigation picks',
+ parameters: { layout: 'fullscreen' },
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+};
+
+export default meta;
+
+const Page = ({ children }: { children: ReactNode }): ReactElement => (
+
+ Of ten ways to carry the old pages column, these two were picked.
+ Chips filter one feed by kind; Shelves stack the latest release, the
+ products, the open poll and the latest posts. The direction combines
+ them: the chips on the feed, and the products shelf above it. See
+ Squad Page, 1. Direction.
+
+ Whop's idea is not a sidebar of widgets. It is that a community
+ is a small product the owner assembles: a left column of pages, each
+ page a different kind of thing (a feed, a chat, a document, a link,
+ a bounty board), and the main area becomes whatever the selected
+ page is. The owner adds, names, orders, sections and hides pages. A
+ visitor sees a place, not a profile.
+
+
+ For daily.dev this is a small structural change with a large product
+ surface. The v2 rail already exists and does not move. The
+ squad's pages take the second column. The main area renders the
+ page. Home is the only page that carries the identity block; every
+ other page is just its content, because the sidebar already says
+ where you are.
+
+
+ Real squad, real posts, real team. Products, the polls, the rules,
+ the links and the verified badge are illustrative. Click around in
+ the playground below; it is live.
+
+
+
+
+
+
+ Click the pages in the second column. Home is the identity block plus
+ the feed. Releases is the changelog as a log, Products the list of
+ what the company makes. Discussions is the feed with a posting rule;
+ Polls is the poll card, one vote each. Rules and FAQ are pages, and
+ the rules sit in a widget on Home too. The links open outside.
+
+
+
+
+
+
+ A person and a squad are the same kind of thing on daily.dev, so their
+ pages share one skeleton, and both get the same correction: the posts
+ are the page. Everything that used to stack down the column (the
+ readme, the stack, the CV, the roles) sits under one About tab, and
+ Posts is the default. Left: the profile on the new frame. Right: the
+ squad. Same card, cover, avatar seat, name, meta, actions, stats,
+ tabs, widget column. Only the nouns change.
+
+ {[
+ [
+ 'The rail',
+ 'Unchanged. The app: Home, Search, Explore, Squads, Streak, your account. Whop has the same thing on its far left, one icon per community.',
+ ],
+ [
+ 'The squad’s pages',
+ 'New. Owner-composed. Sections with labels, pages with icons and counts, admin-only Manage at the end. The Join button lives here for a visitor, so it is on screen on every page.',
+ ],
+ [
+ 'The page',
+ 'Whatever the selected page is. A page bar names it and holds its actions. Home is the only page with a cover and a name, because everywhere else the sidebar already says where you are.',
+ ],
+ ].map(([title, body], index) => (
+
+
+ 0{index + 1}
+
+
+ {title}
+
+ {body}
+
+ ))}
+
+
+
+
+
+
+
+
+
+ The subreddits developers actually live in (r/reactjs, r/rust,
+ r/golang, r/webdev, r/devops, r/ExperiencedDevs) and the company ones
+ (r/nextjs, r/supabase, r/cursor) converge on one shape. GitHub
+ Discussions ships that shape as its default categories, and every
+ Discord dev server names the same channels. daily.dev already has most
+ of the parts; what it lacks is the container.
+
+
+
+
+
+
+ Grouped the way a company thinks about it. Discussions and Polls are
+ the feed and the poll post with a rule each; Rules, Releases and
+ Products are the three pages that need new work.
+
+ On a phone the pages column folds into a horizontal strip of chips
+ under the squad name (Home, Releases, Products, Discussions, and so
+ on, in the owner's order) and the page fills the screen. The
+ squad name opens the full list as a sheet. Nothing is lost, and the
+ owner's order decides what is visible without scrolling, the
+ same as on desktop.
+
+
+
+
+
+
+
+
+
+
+
+ This is the direction. It is simpler than any of the eight layouts
+ before it because the page stops trying to be everything at once:
+ the sidebar is the table of contents and each page does one thing.
+ It is what X and Reddit feel like to use and what Whop lets an owner
+ build, and it fits daily.dev's v2 shell without moving anything
+ that exists.
+
+
+ Round two is not wasted. The tiles become the Home page's
+ optional strip (Activity, Top this week, Team) for squads that want
+ them, and the Shelf is how they collapse on a phone. Everything else
+ from rounds one and two can be retired.
+
+
+ ),
+};
diff --git a/packages/storybook/stories/squad-page/archive/chipPages.tsx b/packages/storybook/stories/squad-page/archive/chipPages.tsx
new file mode 100644
index 00000000000..a85463e7307
--- /dev/null
+++ b/packages/storybook/stories/squad-page/archive/chipPages.tsx
@@ -0,0 +1,197 @@
+import type { ReactElement } from 'react';
+import React, { createContext, useContext, useState } from 'react';
+import classNames from 'classnames';
+import {
+ Button,
+ ButtonSize,
+ ButtonVariant,
+} from '@dailydotdev/shared/src/components/buttons/Button';
+import {
+ DiscussIcon,
+ MegaphoneIcon,
+ PlusIcon,
+ UpvoteIcon,
+} from '@dailydotdev/shared/src/components/icons';
+import { IconSize } from '@dailydotdev/shared/src/components/Icon';
+import { entriesByMonth, formatDay, polls, squad, team } from '../data';
+import { Avatar, isAdmin, isJoined, isStaff, Viewer } from '../kit';
+import { PollList } from '@dailydotdev/shared/src/components/cards/poll/PollList';
+import type { Post } from '@dailydotdev/shared/src/graphql/posts';
+import { ContentSource, useWorkspace } from '../state';
+import { cardHandlers, Column, hidden, toPollPost } from '../workspace';
+
+// The Releases and Polls chips' pages, from before the feed dropped its
+// chips. Only the archived Navigation picks render them.
+
+/**
+ * The changelog as a log, not a feed: GitHub Releases' shape. Every post
+ * flaired as a release lands here grouped by month, newest first, with the
+ * kind as a filter. The Announcements channel is where they are discussed;
+ * this is where they are found.
+ */
+export const ReleasesPage = ({
+ viewer,
+ bare,
+}: {
+ viewer: Viewer;
+ bare?: boolean;
+}): ReactElement => {
+ const { source, empty } = useWorkspace();
+
+ return (
+
+ {source === ContentSource.Feed && (
+
+
+
+ Published from the company's feed,{' '}
+
+ {squad.feedUrl}
+
+ . Every item becomes a post here the hour it goes live.
+
+
+ Synced 2h ago
+
+
+ )}
+ {empty && (
+
+
+ No releases yet
+
+
+ {source === ContentSource.Feed
+ ? 'The feed is connected. The first item lands here the hour it is published.'
+ : 'Post the first release and it starts the log.'}
+
+
+ ))}
+
+
+ );
+};
+
+/**
+ * Polls, on the production poll card. The company asks, members vote in
+ * place, the card flips to its results. The click is caught before the
+ * card's own vote mutation so the story stays offline.
+ */
+export const PollsPage = ({
+ viewer,
+ bare,
+}: {
+ viewer: Viewer;
+ bare?: boolean;
+}): ReactElement => {
+ const [votes, setVotes] = useState>({});
+
+ return (
+
+
+
+ What the team wants to know from you. One vote each, results when you
+ vote.
+
+ {isStaff(viewer) ? (
+ }
+ >
+ New poll
+
+ ) : (
+
+ {polls.length} open
+
+ )}
+