Skip to content

Improve activity feed design#2634

Open
jancborchardt wants to merge 4 commits into
masterfrom
feat/activity-stream-layout
Open

Improve activity feed design#2634
jancborchardt wants to merge 4 commits into
masterfrom
feat/activity-stream-layout

Conversation

@jancborchardt
Copy link
Copy Markdown
Member

@jancborchardt jancborchardt commented Jun 2, 2026

Improve overall design of activity feed:

  • Remove unnecessary h1 heading which duplicated the active nav entry. Keep it in the code for semantics/accessibility
  • Make app-content the scroll container so the scrollbar isn't floating (this was just a bit unelegant)
  • Make activity date headings sticky on scroll (with logic to look nice at the breakpoints)
  • Add bottom whitespace below the end-of-feed message so it’s not stuck to the bottom

Before

Screencast.From.2026-06-02.02-09-05.webm

After

Screencast.From.2026-06-02.01-59-25.webm

Breakpoint example:

Screencast.From.2026-06-02.02-01-05.webm

AI-assisted: Claude Code (Opus 4.8)

@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 2, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@jancborchardt jancborchardt moved this to 🏗️ At engineering in 🖍 Design team Jun 2, 2026
@jancborchardt jancborchardt force-pushed the feat/activity-stream-layout branch 4 times, most recently from e8f2b72 to 1956162 Compare June 2, 2026 09:52
@jancborchardt jancborchardt requested a review from kra-mo June 3, 2026 10:30
@jancborchardt
Copy link
Copy Markdown
Member Author

@artonge @miaulalala any comments or feedback? :)

The <h1> showed the active filter's name, which the app navigation
already indicates, so it only added visual noise. Keep it in the DOM for
document semantics and screen readers but hide it with hidden-visually,
and drop its now-unused visual styling so it cannot affect layout. Adjust
the stream e2e tests to assert the heading's content rather than its
visibility.

AI-assisted: Claude Code (Opus 4.8)
Signed-off-by: Jan C. Borchardt <925062+jancborchardt@users.noreply.github.com>
The scroll container was the centred, max-width content column, so its
scrollbar floated in the middle of the viewport. Move scrolling to the
full-width container and clamp the readable column in an inner wrapper,
so the scrollbar sits at the edge of app-content while the content stays
readable. The column width becomes a shared --activity-feed-max-width.

AI-assisted: Claude Code (Opus 4.8)
Signed-off-by: Jan C. Borchardt <925062+jancborchardt@users.noreply.github.com>
Group each day's activities in a section whose date heading sticks to the
top while that day is in view, with the next day pushing the previous one
up. The heading fades feed items out beneath it and is sized/aligned to
the app navigation toggle. Its indent to clear the toggle eases in from
the content-area width (a query container), so it accounts for the space
the open navigation takes rather than the raw viewport.

Add unit tests for the heading's Today/Yesterday/full-date labels.

AI-assisted: Claude Code (Opus 4.8)
Signed-off-by: Jan C. Borchardt <925062+jancborchardt@users.noreply.github.com>
Give the "No more activities." message generous, viewport-scaled space
below it so the end of the feed isn't cramped against the bottom edge.

AI-assisted: Claude Code (Opus 4.8)
Signed-off-by: Jan C. Borchardt <925062+jancborchardt@users.noreply.github.com>
@jancborchardt jancborchardt force-pushed the feat/activity-stream-layout branch from 1956162 to 7ff0f18 Compare June 3, 2026 13:45
@jancborchardt
Copy link
Copy Markdown
Member Author

Rebased again :)

@miaulalala
Copy link
Copy Markdown
Collaborator

@artonge @miaulalala any comments or feedback? :)

I'll check it out and test it Monday. From the screencasts it looks like a nice refinement, thanks!

<NcAppContent class="activity-app">
<h1 class="activity-app__heading">
<!-- Kept for document semantics / screen readers, but visually hidden -->
<h1 class="activity-app__heading hidden-visually">
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's not depend on a global class and have all the needed css here in this file :).

Comment thread js/activity-app.mjs
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to compile the assets in every commits.

<style scoped lang="scss">
.activity-app {
// Max width of the readable content column
--activity-feed-max-width: 924px;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you move the var declaration close its usage?
Also, why 924px?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I see that 924 is from before 👍

Comment on lines +373 to +374
// Full width so the scrollbar sits at the edge of app-content
height: 100%;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Full width", but sets the height, is the comment correct and code?

Comment on lines +60 to +62
// Separate consecutive groups. Inside the <section> (not a margin between them)
// so the date stays pinned across the gap and the next date docks right as the
// group ends, instead of the push feeling early.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment is weirdly written, can you double-check it?

// once the gutter clears the toggle.
padding-inline-start: calc(max(
0px,
var(--app-navigation-padding, 8px) + var(--default-clickable-area)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need default values for the var()? I think we can assume that they are always available.

Comment on lines +92 to +97
padding-inline-start: calc(max(
0px,
var(--app-navigation-padding, 8px) + var(--default-clickable-area)
- var(--default-grid-baseline, 4px)
- max(0px, (100cqi - var(--activity-feed-max-width)) / 2)
));
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't we come up with something simpler? I look quite complex for what we are trying to achieve.

text-align: center;
}

&__loading-indicator--end {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the new class necessary? Can't we add that to the existing class?

Copy link
Copy Markdown
Member

@kra-mo kra-mo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool, but we should actually standardize floating toolbars/headers as this stuff is a common headache.

Copy link
Copy Markdown
Collaborator

@artonge artonge left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocking until other comments are resolved :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: 🏗️ At engineering

Development

Successfully merging this pull request may close these issues.

4 participants