Skip to content

feat: migrate the sidebar and side panel to Item - #42819

Merged
ggazzo merged 24 commits into
developfrom
feat/item-bridges
Oct 16, 2026
Merged

ggazzo merged 24 commits into
developfrom
feat/item-bridges

Conversation

@juliajforesti

@juliajforesti juliajforesti commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Proposed changes (including videos or screenshots)

ARCH-2496
Migrates the Sidebar and Sidepanel components to the Item components, and applies the result to the sidebar, side panel and navbar search in the same PR.

It also makes the room search behave like the composer popups from #42820 when moving through it with a keyboard or a pointer: focus stays in the search field, one result is active at a time, the pointer and the arrow keys both move it, and the focus ring shows only when the keyboard picked it.

Room search after the arrow keys and then the pointer: develop keeps the ring on one result and the hover on another, this PR highlights one

Captured against open.rocket.chat with yarn dev:next, develop above and this PR below. Private room names are blurred.

Room search with keyboard then pointer, develop vs this PR

Fuselage

Renders the Sidebar and Sidepanel components with the Item family from RocketChat/fuselage#2281. The public rcx-sidebar-* classes stay in place.

  • SidebarItem, its parts and SidebarLink render with Item, ItemMedia, ItemIcon, ItemContent, ItemRow, ItemTitle, ItemDescription, ItemMeta and ItemActions.
  • New optional label prop on SidebarItemIcon names the icon for assistive technology.
  • SidebarGroupTitle, SidebarCollapseGroup and SidebarCollapseGroupMenu render as ItemGroupHeader, ItemGroup and ItemActions. The collapse group's list is named by its title. This keeps the restyled collapse group header from feat(fuselage): Restyle the sidebar collapse group header fuselage#2285.
  • Sidebar rows, links and the collapse group header use the md inset from the Item scale, set inside the components. It replaces the fixed 12px inset, and headers and rows line up.
  • SidebarItem can render as a container row: pass is='div' and put the new SidebarItemLink inside SidebarItemTitle. Only the title is the link, and it covers the whole row, so menus and buttons sit beside it instead of inside it. The new SidebarItemActions holds always-visible buttons, such as accepting or rejecting a call. SidebarItem also gets a highlighted prop. A div row drops href, target, rel and download. The default anchor row is unchanged.
  • SidebarItem forwards focused and focusVisible to Item, so a sidebar row can be a listbox's active option.
  • SidebarDivider renders as ItemDivider.
  • SidepanelList renders as an ItemGroup and SidepanelDivider as an ItemDivider, keeping the full-width line under SidepanelHeader.
  • Fix: SidebarCollapseGroup no longer passes its actions prop to the DOM.

Rocket.Chat

  • New navigation room rows are container rows (SidebarItem is='div' + SidebarItemLink): only the title is the link, and the menu and call buttons sit beside it in SidebarItemActions. Group headers use the bridged SidebarCollapseGroup, and the filters use Item parts.
  • Old sidebar rows render with the same RoomListItem; the Condensed, Medium and Extended templates are removed.
  • Navbar search rows use the bridged SidebarItem parts.
  • The room search keeps focus in the search field while the arrow keys move through the results, pointing at the active one with aria-activedescendant, as the combobox pattern expects. The result under the pointer becomes the one Enter opens.
  • Room icons are named for assistive technology (useRoomIconLabel), and UnreadBadge renders with Badge.

Issue(s)

Replaces RocketChat/fuselage#2295, and takes over the sidebar, side panel and navbar search parts of #42520.

Steps to test or reproduce

  • yarn workspace @rocket.chat/fuselage storybook: the Sidebar, SidebarItem and Sidepanel stories.
  • In the app, with both the old and the new navigation: room rows in every view mode, unread and selected rooms, group collapse, row menus, incoming call buttons, keyboard navigation between rows, and navbar search. Check with a keyboard and a screen reader.
  • In the room search, move through the results with the arrow keys and with the pointer: one result is highlighted at a time, Enter opens it, and typing keeps working while a result is active.

Further comments

Based on develop. The room search reuses useActiveDescendant, which landed with #42820.

The search commits sit on top, since they need the Item-based SidebarItem from this PR:

  1. feat(fuselage): SidebarItem forwards focused and focusVisible
  2. fix: the room search keeps focus on its combobox

Part of the Item migration, split by area:

Not changed here: the fuselage SidebarLink still renders its menu inside its anchor. Container rows are the way to keep menus and buttons out of the link.

Jest snapshots and the visual-regression baselines (arm64 image) were regenerated here. fuselage.api.md isn't part of this repository, so those changes were dropped.

Summary by CodeRabbit

  • New Features
    • Sidebar room rows now support condensed, medium, and extended layouts, with room titles linked separately from adjacent menus and call actions.
    • Room icons have accessible names, and incoming calls are identified for assistive technology.
    • Search keeps keyboard focus in the input while arrow keys navigate results. Enter opens the active result, including the row under the pointer.
  • Bug Fixes
    • Sidebar group controls support keyboard activation, and menus no longer trigger group collapsing.
    • Updated sidebar and side-panel layouts improve screen-reader labeling and accessibility.

@dionisio-bot

dionisio-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Looks like this PR is ready to merge! 🎉
If you have any trouble, please check the PR guidelines

@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 67e0b8aa-e7cd-4382-8c28-69ae73801ad6
📥 Commits

Reviewing files that changed from the base of the PR and between 5e6b6bd and b052793.

⛔ Files ignored due to path filters: 12
  • packages/fuselage/src/components/Sidebar/SidebarItem/__snapshots__/SidebarItem.spec.tsx.snap is excluded by !**/*.snap
  • packages/fuselage/src/components/Sidepanel/__snapshots__/Sidepanel.spec.tsx.snap is excluded by !**/*.snap
  • packages/fuselage/test/snapshots/navigation-sidebar--default-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-item--condensed-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-item--condensed-items-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-item--extended-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-item--medium-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-item--room-row-condensed-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-item--room-row-extended-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-item--room-row-medium-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidebar-media--default-desktop.png is excluded by !**/*.png
  • packages/fuselage/test/snapshots/navigation-sidepanel--default-desktop.png is excluded by !**/*.png
📒 Files selected for processing: 92
  • .changeset/item-sidebar-app.md
  • .changeset/search-active-option.md
  • .changeset/sidebar-collapse-group-actions.md
  • .changeset/sidebar-groups-item.md
  • .changeset/sidebar-item-container-rows.md
  • .changeset/sidebar-item-rows.md
  • .changeset/sidepanel-item.md
  • apps/meteor/client/components/RoomIcon/index.tsx
  • apps/meteor/client/components/RoomIcon/useRoomIconLabel.spec.ts
  • apps/meteor/client/components/RoomIcon/useRoomIconLabel.ts
  • apps/meteor/client/navbar/NavBarSearch/NavBarAISearch.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarAISearchListbox.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearch.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearchFilterSuggestionOption.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearchFilterSuggestions.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearchIntelligentSection.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearchItem.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearchItemSkeleton.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearchListbox.tsx
  • apps/meteor/client/navbar/NavBarSearch/NavBarSearchRoomSection.tsx
  • apps/meteor/client/navbar/NavBarSearch/hooks/useSearchActiveOption.spec.tsx
  • apps/meteor/client/navbar/NavBarSearch/hooks/useSearchActiveOption.ts
  • apps/meteor/client/navbar/NavBarSearch/hooks/useSearchNavigation.ts
  • apps/meteor/client/sidebar/Item/Condensed.stories.tsx
  • apps/meteor/client/sidebar/Item/Condensed.tsx
  • apps/meteor/client/sidebar/Item/Extended.stories.tsx
  • apps/meteor/client/sidebar/Item/Extended.tsx
  • apps/meteor/client/sidebar/Item/Medium.stories.tsx
  • apps/meteor/client/sidebar/Item/Medium.tsx
  • apps/meteor/client/sidebar/RoomList/RoomList.spec.tsx
  • apps/meteor/client/sidebar/RoomList/RoomList.tsx
  • apps/meteor/client/sidebar/RoomList/RoomListCollapser.spec.tsx
  • apps/meteor/client/sidebar/RoomList/RoomListCollapser.tsx
  • apps/meteor/client/sidebar/RoomList/RoomListRow.tsx
  • apps/meteor/client/sidebar/RoomList/RoomListRowWrapper.tsx
  • apps/meteor/client/sidebar/RoomList/SidebarItemTemplateWithData.tsx
  • apps/meteor/client/sidebar/RoomList/useSidebarListNavigation.ts
  • apps/meteor/client/sidebar/badges/UnreadBadge.tsx
  • apps/meteor/client/sidebar/hooks/useAvatarTemplate.tsx
  • apps/meteor/client/sidebar/hooks/useCollapsedGroups.ts
  • apps/meteor/client/sidebar/hooks/useShortcutOpenMenu.ts
  • apps/meteor/client/sidebar/hooks/useTemplateByViewMode.ts
  • apps/meteor/client/views/navigation/contexts/RoomsNavigationContext.ts
  • apps/meteor/client/views/navigation/hooks/useCollapsedGroups.ts
  • apps/meteor/client/views/navigation/sidebar/RoomList/OmnichannelFilters.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomList.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListCollapser.spec.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListCollapser.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListFiltersItem.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListFiltersItemBadge.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListItem.spec.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListItem.stories.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListItem.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/RoomListRowWrapper.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/SidebarItem.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/SidebarItemWithData.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/TeamCollabFilters.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/useSidebarListNavigation.ts
  • apps/meteor/client/views/navigation/sidebar/badges/UnreadBadge.tsx
  • apps/meteor/client/views/navigation/sidebar/hooks/useShortcutOpenMenu.ts
  • apps/meteor/tests/e2e/federation/page-objects/fragments/home-sidenav.ts
  • apps/meteor/tests/e2e/page-objects/fragments/sidebar.ts
  • apps/meteor/tests/e2e/sidebar.spec.ts
  • packages/fuselage/src/components/Sidebar/Sidebar.spec.tsx
  • packages/fuselage/src/components/Sidebar/Sidebar.styles.scss
  • packages/fuselage/src/components/Sidebar/SidebarCollapseGroup.tsx
  • packages/fuselage/src/components/Sidebar/SidebarCollapseGroupMenu.tsx
  • packages/fuselage/src/components/Sidebar/SidebarDivider.tsx
  • packages/fuselage/src/components/Sidebar/SidebarGroupTitle.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItem.spec.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItem.stories.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItem.styles.scss
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItem.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemActions.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemAvatarWrapper.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemCol.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemContent.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemIcon.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemLink.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemMenu.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemRow.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemStatusBullet.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemTimestamp.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/SidebarItemTitle.tsx
  • packages/fuselage/src/components/Sidebar/SidebarItem/index.ts
  • packages/fuselage/src/components/Sidebar/SidebarLink.tsx
  • packages/fuselage/src/components/Sidebar/helpers.tsx
  • packages/fuselage/src/components/Sidepanel/Sidepanel.spec.tsx
  • packages/fuselage/src/components/Sidepanel/Sidepanel.styles.scss
  • packages/fuselage/src/components/Sidepanel/SidepanelDivider.tsx
  • packages/fuselage/src/components/Sidepanel/SidepanelHeader.tsx
  • packages/fuselage/src/components/Sidepanel/SidepanelList.tsx
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Base automatically changed from chore/migrate-fuselage to develop October 15, 2026 20:34
@changeset-bot

changeset-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b052793

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 22 packages
Name Type
@rocket.chat/meteor Minor
@rocket.chat/fuselage Minor
@rocket.chat/uikit-playground Patch
@rocket.chat/core-typings Minor
@rocket.chat/fuselage-forms Patch
@rocket.chat/fuselage-toastbar Patch
@rocket.chat/fuselage-ui-kit Patch
@rocket.chat/gazzodown Patch
@rocket.chat/layout Patch
@rocket.chat/onboarding-ui Patch
@rocket.chat/storybook-config Patch
@rocket.chat/ui-account Patch
@rocket.chat/ui-avatar Patch
@rocket.chat/ui-client Patch
@rocket.chat/ui-composer Patch
@rocket.chat/ui-conference Patch
@rocket.chat/ui-media Patch
@rocket.chat/ui-video-conf Patch
@rocket.chat/ui-voip Patch
@rocket.chat/web-ui-registration Patch
@rocket.chat/ui-livekit Patch
@rocket.chat/rest-typings Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@codecov

codecov Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 89.81324% with 60 lines in your changes missing coverage. Please review.
✅ Project coverage is 70.61%. Comparing base (5e6b6bd) to head (b052793).
⚠️ Report is 1 commits behind head on develop.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop   #42819      +/-   ##
===========================================
+ Coverage    70.55%   70.61%   +0.05%     
===========================================
  Files         5414     5414              
  Lines       229897   230512     +615     
  Branches     41802    41902     +100     
===========================================
+ Hits        162201   162767     +566     
- Misses       62372    62432      +60     
+ Partials      5324     5313      -11     
Flag Coverage Δ
e2e 58.92% <63.35%> (+<0.01%) ⬆️
e2e-api 46.15% <ø> (+0.22%) ⬆️
unit 71.12% <90.56%> (+0.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@juliajforesti juliajforesti changed the title feat: Migrate Sidebar and Sidepanel to Item components feat: migrate the sidebar and side panel to Item Oct 15, 2026
@ggazzo ggazzo added the preview Builds a UI preview that Rocket.Chat Desktop can load label Oct 16, 2026
@ggazzo
ggazzo force-pushed the feat/item-bridges branch from 22b5d9f to 5ff4728 Compare October 16, 2026 01:20
@ggazzo ggazzo added preview Builds a UI preview that Rocket.Chat Desktop can load and removed preview Builds a UI preview that Rocket.Chat Desktop can load labels Oct 16, 2026
@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

🖥️ UI preview

Removed from ghcr.io/rocketchat/rocket.chat-web. Add the preview label again to publish a new one.

@ggazzo
ggazzo force-pushed the feat/item-bridges branch from ef8fcc1 to c5de651 Compare October 16, 2026 04:54
@ggazzo
ggazzo changed the base branch from develop to feat/item-meta-truncate October 16, 2026 04:54
@ggazzo
ggazzo force-pushed the feat/item-meta-truncate branch from 854224f to e54ebd8 Compare October 16, 2026 05:08
@ggazzo
ggazzo force-pushed the feat/item-bridges branch from c5de651 to fe5cd54 Compare October 16, 2026 05:12
@ggazzo
ggazzo force-pushed the feat/item-meta-truncate branch from e54ebd8 to 73fc215 Compare October 16, 2026 05:18
@ggazzo
ggazzo force-pushed the feat/item-bridges branch from fe5cd54 to 912586b Compare October 16, 2026 05:18
Base automatically changed from feat/item-meta-truncate to develop October 16, 2026 06:00
juliajforesti and others added 2 commits October 16, 2026 03:01
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juliajforesti and others added 13 commits October 16, 2026 03:01
…ItemLink` and `SidebarItemActions`

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…logy

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the bridged `SidebarItem`

Room rows are container rows: the title holds the `SidebarItemLink`, and menus and call buttons sit beside it in `SidebarItemActions`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…debarCollapseGroup`

Removes the `Condensed`, `Medium` and `Extended` templates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Forwards `focused` and `focusVisible` to `Item`, so a sidebar row used as a listbox option can be its active descendant.
…its results

The search field is a combobox, so it keeps DOM focus and points at the active result through `aria-activedescendant` instead of moving focus into the list. The result under the pointer becomes the active one, so a single row is highlighted and Enter opens it, and the focus ring shows only when the keyboard picked it.
@ggazzo
ggazzo force-pushed the feat/item-bridges branch from 912586b to b052793 Compare October 16, 2026 06:02
@ggazzo ggazzo added this to the 8.10.0 milestone Oct 16, 2026
@ggazzo
ggazzo marked this pull request as ready for review October 16, 2026 13:14
@ggazzo
ggazzo requested a review from a team as a code owner October 16, 2026 13:14
@coderabbitai coderabbitai Bot added type: bug type: feature Pull requests that introduces new feature labels Oct 16, 2026
@ggazzo ggazzo added the stat: QA assured Means it has been tested and approved by a company insider label Oct 16, 2026
@dionisio-bot dionisio-bot Bot added the stat: ready to merge PR tested and approved waiting for merge label Oct 16, 2026
@dionisio-bot
dionisio-bot Bot added this pull request to the merge queue Oct 16, 2026
@ggazzo
ggazzo removed this pull request from the merge queue due to a manual request Oct 16, 2026
@ggazzo
ggazzo merged commit 87667dc into develop Oct 16, 2026
71 of 72 checks passed
@ggazzo
ggazzo deleted the feat/item-bridges branch October 16, 2026 13:22
ivans-netto added a commit that referenced this pull request Oct 21, 2026
develop moved the sidebar to `Item` (#42819) and to one keyboard model for
lists of rows (#42842). The Teams panel follows both:
- rows take the new RoomListRow data (viewMode, showAvatar);
- the list uses the shared useSidebarListNavigation;
- a team header toggles with Enter and Space, like the Inbox groups. Left and
  Right now move between a row's controls, so they no longer collapse a team.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview Builds a UI preview that Rocket.Chat Desktop can load stat: QA assured Means it has been tested and approved by a company insider stat: ready to merge PR tested and approved waiting for merge type: bug type: feature Pull requests that introduces new feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants