Skip to content

feat(call): Improve Speaker view layout - #19035

Merged
Antreesy merged 10 commits into
mainfrom
feat/stripe-local-video-tile
Aug 25, 2026
Merged

feat(call): Improve Speaker view layout#19035
Antreesy merged 10 commits into
mainfrom
feat/stripe-local-video-tile

Conversation

@DorraJaouad

@DorraJaouad DorraJaouad commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

☑️ Resolves

It is also a pre requesite for flexible stripe (Restructured the stripe to also include local video)

AI (if applicable)

  • The content of this PR was partly or fully generated using AI

🖌️ UI Checklist

🖼️ Screenshots / Screencasts

BEFORE

Screen.Recording.2026-08-19.at.21.48.21.mov

AFTER

Screen.Recording.2026-08-19.at.21.44.34.mov
image

🚧 Tasks

  • Dark mode for tiles fix in stripe

🏁 Checklist

  • 🌏 Tested with different browsers / clients:
    • Chromium (Chrome / Edge / Opera / Brave)
    • Firefox
    • Safari
    • Talk Desktop
    • Integrations with Files sidebar and other apps
    • Not risky to browser differences / client
  • 🖌️ Design was reviewed, approved or inspired by the design team
  • ⛑️ Tests are included or not possible
  • 📗 User documentation in https://github.com/nextcloud/documentation/tree/master/user_manual/talk has been updated or is not required

@nextcloud-command nextcloud-command added the AI assisted This PR contains AI-assisted commits label Aug 19, 2026
@DorraJaouad
DorraJaouad force-pushed the feat/stripe-local-video-tile branch from f9daf03 to 4592082 Compare August 19, 2026 19:43
@nimishavijay

nimishavijay commented Aug 20, 2026

Copy link
Copy Markdown
Member

Looking really nice! The ratios are much better now on small screens :) Some feedback for design:

  • We don't do a gradient background that cuts off very often (I removed it in the dashboard because it looked out of place there too), so I'd say we get rid of it. We could then move the toggle and pagination to inside the speaker row to show they are connected. at the worst case, it will overlap with the users own video which I think it currently does anyway.
  • Instead of showing the pagination only on hovering the toggle button, we can show it whenever we hover the entire speaker row so it's easier to find.
  • instead of showing a chevron-right we should show a chevron-down when the toggle is not hovered, otherwise it gives the impression that that button is for paginating but as soon as you hover you realize it's for toggling.
  • I also tried disconnecting them completely and adding a simple fade so that we don't have too many animations
  • More than one page of pagination doesn't show it centered? possibly a bug

All together will look like this:

talk.speaker.row.mp4

@DorraJaouad

Copy link
Copy Markdown
Contributor Author

We could then move the toggle and pagination to inside the speaker row to show they are connected

I don't see it as connected though. The control should trigger something that covers what it will move, like a background or frame on the stripe. With only floating position, it is not clear its boundaries. Maybe keep a background without fade it on hover?

instead of showing a chevron-right we should show a chevron-down when the toggle is not hovered, otherwise it gives the impression that that button is for paginating but as soon as you hover you realize it's for toggling

The chevron right and left should be shown without hover to know there are more participants. I perceived toggling as a secondary action comparing to pagination but we can show them on both level like < | V and on hover it extends

also tried disconnecting them completely and adding a simple fade so that we don't have too many animations

I think that animation keeps the screen clean and not overwhelming, only showing what is necessary at the right state

ore than one page of pagination doesn't show it centered? possibly a bug

Only the last page is not centered but it is aligned to the start, because there can be one video or two in that page hanging in the middle, my thinking was better to align them so it is perceived a good continuity of the stripe

@Antreesy

Copy link
Copy Markdown
Contributor

When alone in the call:
image
image

and adding a simple fade

I would also prefer this. Maybe show pagination buttons as a detached element, then on follow-up you'd need a place to put 'Hide yourself' button somewhere anyway

it gives the impression that that button is for paginating

Maybe more generic icon as an indicator for controls, and other buttons shows up on hover?
image

because there can be one video or two in that page hanging in the middle

I mentioned before we should change a couple of lines, so last page in pagination just overlaps with page N-1, and shows as many tiles as it: #18355 (comment)
So for 13 participants with max 5+self in line, it would show [1-5][6-10][9-13]

What would also allow to drop first two commits with alignStart, which makes no sense to have IMO

@nimishavijay

Copy link
Copy Markdown
Member

I don't see it as connected though. The control should trigger something that covers what it will move, like a background or frame on the stripe. With only floating position, it is not clear its boundaries. Maybe keep a background without fade it on hover?

The chevron right and left should be shown without hover to know there are more participants.

Hmm, another idea I had was to have 2 full height buttons on either side, similar to the left/right buttons in the dashboard events. That would make it pretty clear, but I liked your idea of the small pill button because I don't have to drag my mouse across the screen to go back to the previous "page". What do you think?

I think that animation keeps the screen clean and not overwhelming, only showing what is necessary at the right state

Yes, agreed that we don't need to show it at all times, only commented on the animation itself. Instead of extending it, we can have a simple fade (see screenshare)

Maybe more generic icon as an indicator for controls, and other buttons shows up on hover?

Sure, rather than the camera controls icon maybe groups, recent actors, or switch accounts which is more related to showing the "participant" stripe? (also checked bottom panel open but IMO that is a niche icon that is not providing much info to the user)

Agreed with @Antreesy about the last page :)

@DorraJaouad

Copy link
Copy Markdown
Contributor Author

Hmm, another idea I had was to have 2 full height buttons on either side,

That was my first thought too but because we have another chevron up button, it wasn't well structured

@DorraJaouad
DorraJaouad force-pushed the feat/stripe-local-video-tile branch from 4592082 to 9bd71f7 Compare August 25, 2026 08:42
@DorraJaouad
DorraJaouad marked this pull request as ready for review August 25, 2026 08:42
@DorraJaouad
DorraJaouad requested a review from Antreesy August 25, 2026 08:42
@DorraJaouad DorraJaouad self-assigned this Aug 25, 2026
@Antreesy Antreesy added this to the ⛅ Next Beta/RC (35) milestone Aug 25, 2026
Antreesy

This comment was marked as resolved.

The stripe kept the default placement, so its tiles were always laid out
from the start of the row. They are now placed like the tiles of the
grid, which centers them.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
The local video was pinned next to the stripe with a size of its own,
so it was neither paginated nor placed like the tiles it sits with. It
now takes a slot of the stripe grid, exactly like it already does in the
full grid, and is centered with the other tiles when the stripe holds
every participant.

The local video keeps being left out of the recording, which is the only
mode not reserving a slot for it anymore.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
The stripe took 250px of the call view, which is more than it needs now
that its tiles are laid out like the tiles of the grid.

The compact tiles have to fit in what is left of the stripe once the
padding of its grid is taken out, so their minimum height follows.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
The columns of the grid shared whatever width was left, so a grid with
room to spare stretched its tiles far past the aspect ratio it aims for:
a stripe holding a few tiles laid them out at a ratio of 2 instead of
1.5. The number of columns is the only thing the layout can shrink, and
dropping a column only makes the remaining tiles wider, so the width of a
column is now capped and the room to spare is left around the tiles
rather than in them.

The columns no longer take the whole width once they are capped, so the
grid centers them.

The stripe aimed for square tiles, which is neither what its tiles are
capped to now nor what a camera gives, so every grid targets the same
aspect ratio and the mode does not have to be given to pick it.

The top padding of the stripe moves to its wrapper, as the height of the
grid is what the height of its tiles is derived from.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
The hypothetical tile height with one row less was divided by zero when
the grid had a single row, so removing a row looked better than removing
a column and the loop stopped without shrinking anything: a stripe kept
as many columns as the screen could hold, however few tiles it had.

An axis which is down to a single track is now never the one to remove,
which also makes the guards inside the branches redundant.

A grid holding nothing but the local video keeps a column for it, as an
implicit, content sized column would collapse to nothing as soon as the
camera is off.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
The stripe was paginated by two arrows sitting on its sides and
collapsed by a button of its own, which took room over the call and told
nothing about the pages there are.

The three of them now sit together over the top corner of the stripe, on
the surface the bottom bar puts its own buttons over the call and
painted with the dark palette the call view is painted with whichever
theme is set. Paging through the tiles and collapsing the stripe are two
controls of their own, so each of them keeps a surface of its own.

The controls are only there for as long as the call is being looked at,
and barely there until they are the ones hovered, as they sit over the
tiles. Paging only shows the arrows of the pages there are, so that a
stripe holding more participants than it can show says so, and unfolds
into the page it is on once it is hovered or focused.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
…area

The stripe slid down on its way out while being taken out of the flow
right away, so the promoted area took the room of the stripe as soon as
the transition started and was resized in one go while the stripe was
still on its way.

The stripe is now collapsed and expanded by its height, so the promoted
area is laid out again on every frame and follows it. The tiles keep
their height while it happens, so they slide out of the way rather than
being squashed, and the transition is left out for whoever asked not to
be shown motion.

The transition also runs both ways now: the classes of the shared
transitions are the ones of Vue 2, so only the way out was animated.

The box holding the grid is renamed on the way, as `wrapper` is also the
name of the root of VideoBottomBar, whose root is given the scope of the
grid and would be laid out over the whole height of its tile by the
rules of that box.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
…e videos do not divide evenly into pages.

Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
Signed-off-by: Dorra Jaouad <dorra.jaoued7@gmail.com>
@DorraJaouad
DorraJaouad force-pushed the feat/stripe-local-video-tile branch from b2d8aa7 to f7751e7 Compare August 25, 2026 11:31
@Antreesy
Antreesy enabled auto-merge August 25, 2026 11:37
@Antreesy
Antreesy merged commit a8e1f15 into main Aug 25, 2026
54 checks passed
@Antreesy
Antreesy deleted the feat/stripe-local-video-tile branch August 25, 2026 12:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI assisted This PR contains AI-assisted commits enhancement feature: call 📹 Voice and video calls feature: frontend 🖌️ "Web UI" client

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants