Quote grouping sidebar

The Quotes lens's grouping chosen at the top of the content sidebar with the shipped split control. Sections & themes is the default and comes first; Sessions, the second choice, borrows the Sessions lens's web session list. Click the split control or a session in any frame; every frame follows.

artefact: shipped CSS and shipped stringscommentary: not the product
grouping
scheme
palette
platform
Commentary

What moved. The grouping control leaves the zone heading and becomes the sidebar's header: the slot left empty when the sidebar's “Contents” title was removed (SidebarLayout.tsx:437). The heading keeps naming the view (“Sections” or “Sessions”) with no action beside it while the sidebar is open; when it is closed, the control comes back to the heading. The default, Sections & themes, sits first in the control; Sessions is the second choice, so it sits second. Today the control lists them the other way round. The control is the shipped .dimension-toggle, run full width as the person picker runs it (person-picker.css), so there is no new CSS for the control.

What Sessions lists. The Sessions lens's web list, unchanged: .session-entry rows from SessionsSidebar.tsx, in both its study shapes. A 1:1 study shows the participant's code and name, then date. A study with several people per session shows the session number and a row per participant. The same width rules apply as in that lens: duration from 260px, weekday from 320px, full names and thumbnails from 360px (the defaults at SessionsSidebar.tsx:184; the live component measures the names). A click scrolls the quotes to that session's group, which already carries an anchor (session-quotes-<id> in QuoteSessions.tsx). It does not navigate to the transcript, which is what the same row does in the Sessions lens.

Same lens, same interactions. Sessions and Sections & themes are two arrangements of one lens of quotes, so nothing on a quote changes with the grouping: both build the same QuoteCard through QuoteGroup. The timecode still opens the video, the speaker badge still opens the transcript at that moment, and starring, tagging, hiding and editing are unchanged. Only the group's own header differs: “Session 3” is a fact, not something the researcher wrote, so it has no rename and no description. The rule for the build: change an interaction only where the new arrangement needs it.

The sidebar rows: what they keep, what they drop. They behave as the Sections and Themes links do: a smooth scroll to the group's anchor, the scroll spy marking the session in view (aria-current="location"), a click winning over the spy, the active row kept in view inside the sidebar, and the hover panel's auto-close. Cmd-click does what it does on a section link: the TOC's click handler takes every click, so it scrolls rather than opening a tab, for both. They drop the three things the same row does in the Sessions lens: opening the transcript, Cmd-click opening a transcript tab, and marking the session whose page you are on. The jump does not flash its target, as a section jump does not. The focus-on-open selector in SidebarLayout.tsx looks for .toc-link and needs .session-entry too.

Empty groups. The quote column already leaves out a group with no visible quotes, keeping one whose quotes are all hidden so its hidden-count badge can bring them back. The sidebar list must use that same filtered set. Today the Sections & themes list ignores filters altogether (TocSidebar.tsx fetches its own), so it should take the same fix in the same change.

On the Mac this is the web list, not the native session switcher: inside the Quotes lens the sidebar is HTML, and moving between the native and web versions as the grouping changes would be the expensive part. The Sessions lens keeps its native switcher.

Open, for the build

Strings

One change, the owner's: quotes.groupBy.session goes from “By session” to “Sessions”, in the control and the zone heading alike (QuoteSessions.tsx reads the same key for its heading). Rewording an en value is a change in all 21 locales, and most already have a translated “Sessions” in nav.sessions to lift from. Everything else is shipped: quotes.groupBy.label, quotes.groupBy.sectionsAndThemes, quotes.sections, quotes.themes, dashboard.coverageSession, nav.sessions.