💄(frontend) add consistent spacing to picture-in-picture tiles

Add padding to StageFrame and bigger gaps so PiP tiles aren't flush with window.
This commit is contained in:
Cyril
2026-07-02 11:08:01 +02:00
parent 40ef420cda
commit 839a8f1c71
5 changed files with 29 additions and 17 deletions
@@ -26,6 +26,7 @@ export const PipFocusLayout = memo(
<ParticipantTile <ParticipantTile
key={getTrackKey(mainTrack)} key={getTrackKey(mainTrack)}
trackRef={mainTrack} trackRef={mainTrack}
disableTileControls
/> />
</MainSlot> </MainSlot>
)} )}
@@ -34,6 +35,7 @@ export const PipFocusLayout = memo(
<ParticipantTile <ParticipantTile
key={getTrackKey(thumbnailTrack)} key={getTrackKey(thumbnailTrack)}
trackRef={thumbnailTrack} trackRef={thumbnailTrack}
disableTileControls
/> />
</Thumbnail> </Thumbnail>
)} )}
@@ -48,9 +50,10 @@ const FocusContainer = styled('div', {
position: 'relative', position: 'relative',
width: '100%', width: '100%',
height: '100%', height: '100%',
borderRadius: '4px', borderRadius: '8px',
overflow: 'hidden', overflow: 'hidden',
backgroundColor: 'primaryDark.100', backgroundColor: 'primaryDark.100',
boxSizing: 'border-box',
}, },
}) })
@@ -58,6 +61,8 @@ const MainSlot = styled('div', {
base: { base: {
width: '100%', width: '100%',
height: '100%', height: '100%',
borderRadius: '8px',
overflow: 'hidden',
'& .lk-participant-media-video': { '& .lk-participant-media-video': {
objectFit: 'contain', objectFit: 'contain',
}, },
@@ -67,13 +72,13 @@ const MainSlot = styled('div', {
const Thumbnail = styled('div', { const Thumbnail = styled('div', {
base: { base: {
position: 'absolute', position: 'absolute',
right: '1rem', right: '1.25rem',
bottom: '1rem', bottom: '1.25rem',
width: '42%', width: '42%',
maxWidth: '220px', maxWidth: '220px',
minWidth: '140px', minWidth: '140px',
aspectRatio: '16 / 9', aspectRatio: '16 / 9',
borderRadius: '4px', borderRadius: '8px',
overflow: 'hidden', overflow: 'hidden',
boxShadow: 'md', boxShadow: 'md',
zIndex: 2, zIndex: 2,
@@ -41,7 +41,7 @@ export const PipGridLayout = memo(({ tracks }: PipGridLayoutProps) => {
<GridContainer ref={containerRef} style={gridStyle}> <GridContainer ref={containerRef} style={gridStyle}>
{tracks.map((track, index) => ( {tracks.map((track, index) => (
<GridCell key={getTrackKey(track)} style={placements[index]}> <GridCell key={getTrackKey(track)} style={placements[index]}>
<ParticipantTile trackRef={track} /> <ParticipantTile trackRef={track} disableTileControls />
</GridCell> </GridCell>
))} ))}
</GridContainer> </GridContainer>
@@ -54,7 +54,8 @@ const GridContainer = styled('div', {
width: '100%', width: '100%',
height: '100%', height: '100%',
display: 'grid', display: 'grid',
gap: '0.25rem', gap: '0.5rem',
boxSizing: 'border-box',
}, },
}) })
@@ -63,7 +64,7 @@ const GridCell = styled('div', {
position: 'relative', position: 'relative',
minWidth: 0, minWidth: 0,
minHeight: 0, minHeight: 0,
borderRadius: '4px', borderRadius: '8px',
overflow: 'hidden', overflow: 'hidden',
backgroundColor: 'primaryDark.100', backgroundColor: 'primaryDark.100',
// Paint on own layer so FLIP transforms don't trigger layout thrash. // Paint on own layer so FLIP transforms don't trigger layout thrash.
@@ -22,13 +22,13 @@ export const PipScreenShareLayout = memo(
<CameraTilesRow> <CameraTilesRow>
{cameraTracks.map((track) => ( {cameraTracks.map((track) => (
<CameraTile key={getTrackKey(track)}> <CameraTile key={getTrackKey(track)}>
<ParticipantTile trackRef={track} /> <ParticipantTile trackRef={track} disableTileControls />
</CameraTile> </CameraTile>
))} ))}
</CameraTilesRow> </CameraTilesRow>
)} )}
<ScreenShareSlot> <ScreenShareSlot>
<ParticipantTile trackRef={screenShareTrack} /> <ParticipantTile trackRef={screenShareTrack} disableTileControls />
</ScreenShareSlot> </ScreenShareSlot>
</LayoutContainer> </LayoutContainer>
) )
@@ -42,7 +42,8 @@ const LayoutContainer = styled('div', {
height: '100%', height: '100%',
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
gap: '0.25rem', gap: '0.5rem',
boxSizing: 'border-box',
overflow: 'hidden', overflow: 'hidden',
}, },
}) })
@@ -51,7 +52,8 @@ const CameraTilesRow = styled('div', {
base: { base: {
display: 'flex', display: 'flex',
flexDirection: 'row', flexDirection: 'row',
gap: '0.25rem', justifyContent: 'center',
gap: '0.5rem',
flexShrink: 0, flexShrink: 0,
height: '22%', height: '22%',
minHeight: '60px', minHeight: '60px',
@@ -62,9 +64,11 @@ const CameraTilesRow = styled('div', {
const CameraTile = styled('div', { const CameraTile = styled('div', {
base: { base: {
position: 'relative', position: 'relative',
flex: '1 1 0', flex: '0 1 auto',
height: '100%',
aspectRatio: '16 / 9',
minWidth: 0, minWidth: 0,
borderRadius: '4px', borderRadius: '8px',
overflow: 'hidden', overflow: 'hidden',
backgroundColor: 'primaryDark.100', backgroundColor: 'primaryDark.100',
'& .lk-participant-tile': { '& .lk-participant-tile': {
@@ -79,7 +83,7 @@ const ScreenShareSlot = styled('div', {
position: 'relative', position: 'relative',
flex: 1, flex: 1,
minHeight: 0, minHeight: 0,
borderRadius: '4px', borderRadius: '8px',
overflow: 'hidden', overflow: 'hidden',
backgroundColor: 'primaryDark.100', backgroundColor: 'primaryDark.100',
'& .lk-participant-tile': { '& .lk-participant-tile': {
@@ -25,8 +25,8 @@ const Container = styled('div', {
flex: 1, flex: 1,
minWidth: 0, minWidth: 0,
minHeight: 0, minHeight: 0,
marginLeft: '0.5rem', padding: '0.5rem',
marginRight: '0.5rem', boxSizing: 'border-box',
borderRadius: '4px', borderRadius: '4px',
overflow: 'hidden', overflow: 'hidden',
}, },
@@ -52,6 +52,7 @@ export function TrackRefContextIfNeeded(
interface ParticipantTileExtendedProps extends ParticipantTileProps { interface ParticipantTileExtendedProps extends ParticipantTileProps {
disableMetadata?: boolean disableMetadata?: boolean
disableTileControls?: boolean
} }
export const ParticipantTile: ( export const ParticipantTile: (
@@ -66,6 +67,7 @@ export const ParticipantTile: (
onParticipantClick, onParticipantClick,
disableSpeakingIndicator, disableSpeakingIndicator,
disableMetadata, disableMetadata,
disableTileControls,
...htmlProps ...htmlProps
}: ParticipantTileExtendedProps, }: ParticipantTileExtendedProps,
ref ref
@@ -231,7 +233,7 @@ export const ParticipantTile: (
)} )}
</> </>
)} )}
{!disableMetadata && ( {!disableMetadata && !disableTileControls && (
<ParticipantTileFocus <ParticipantTileFocus
trackRef={trackReference} trackRef={trackReference}
hasKeyboardFocus={hasKeyboardFocus} hasKeyboardFocus={hasKeyboardFocus}