mirror of https://github.com/vector-im/riot-web
Potential solution to supporting transparent 'show more' buttons
In this demonstration, we remove the cutting line (as it collides with the tile in a weird spot) and instead replace the tile with a placeholder when the text is about to collide with the avatar in the tile. We use a `round()` for this because through some amazing coincidence the collision happens at 0.47, which is close enough to 0.5 for people not to notice.pull/21833/head
parent
3abf1586f9
commit
8972cf9378
|
@ -187,16 +187,16 @@ limitations under the License.
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
|
.mx_RoomSublist2_placeholder {
|
||||||
|
height: 44px; // Height of a room tile plus margins
|
||||||
|
}
|
||||||
|
|
||||||
.mx_RoomSublist2_showNButton {
|
.mx_RoomSublist2_showNButton {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: $font-13px;
|
font-size: $font-13px;
|
||||||
line-height: $font-18px;
|
line-height: $font-18px;
|
||||||
color: $roomtile2-preview-color;
|
color: $roomtile2-preview-color;
|
||||||
|
|
||||||
// This is the same color as the left panel background because it needs
|
|
||||||
// to occlude the lastmost tile in the list.
|
|
||||||
background-color: $roomlist2-bg-color;
|
|
||||||
|
|
||||||
// Update the render() function for RoomSublist2 if these change
|
// Update the render() function for RoomSublist2 if these change
|
||||||
// Update the ListLayout class for minVisibleTiles if these change.
|
// Update the ListLayout class for minVisibleTiles if these change.
|
||||||
//
|
//
|
||||||
|
@ -209,7 +209,7 @@ limitations under the License.
|
||||||
// We force this to the bottom so it will overlap rooms as needed.
|
// We force this to the bottom so it will overlap rooms as needed.
|
||||||
// We account for the space it takes up (24px) in the code through padding.
|
// We account for the space it takes up (24px) in the code through padding.
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0; // the height of the resize handle
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
|
||||||
|
@ -236,16 +236,6 @@ limitations under the License.
|
||||||
.mx_RoomSublist2_showLessButtonChevron {
|
.mx_RoomSublist2_showLessButtonChevron {
|
||||||
mask-image: url('$(res)/img/feather-customised/chevron-up.svg');
|
mask-image: url('$(res)/img/feather-customised/chevron-up.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
&.mx_RoomSublist2_isCutting::before {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 4px;
|
|
||||||
box-shadow: 0px -2px 3px rgba(46, 47, 50, 0.08);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Class name comes from the ResizableBox component
|
// Class name comes from the ResizableBox component
|
||||||
|
|
|
@ -560,10 +560,8 @@ export default class RoomSublist2 extends React.Component<IProps, IState> {
|
||||||
if (visibleTiles.length > 0) {
|
if (visibleTiles.length > 0) {
|
||||||
const layout = this.props.layout; // to shorten calls
|
const layout = this.props.layout; // to shorten calls
|
||||||
|
|
||||||
const maxTilesFactored = layout.tilesWithResizerBoxFactor(this.numTiles);
|
|
||||||
const showMoreBtnClasses = classNames({
|
const showMoreBtnClasses = classNames({
|
||||||
'mx_RoomSublist2_showNButton': true,
|
'mx_RoomSublist2_showNButton': true,
|
||||||
'mx_RoomSublist2_isCutting': this.state.isResizing && layout.visibleTiles < maxTilesFactored,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// If we're hiding rooms, show a 'show more' button to the user. This button
|
// If we're hiding rooms, show a 'show more' button to the user. This button
|
||||||
|
@ -642,6 +640,14 @@ export default class RoomSublist2 extends React.Component<IProps, IState> {
|
||||||
const tilesWithoutPadding = Math.min(relativeTiles, layout.visibleTiles);
|
const tilesWithoutPadding = Math.min(relativeTiles, layout.visibleTiles);
|
||||||
const tilesPx = layout.calculateTilesToPixelsMin(relativeTiles, tilesWithoutPadding, padding);
|
const tilesPx = layout.calculateTilesToPixelsMin(relativeTiles, tilesWithoutPadding, padding);
|
||||||
|
|
||||||
|
// Now that we know our padding constraints, let's find out if we need to chop off the
|
||||||
|
// last rendered visible tile so it doesn't collide with the 'show more' button
|
||||||
|
let visibleUnpaddedTiles = Math.round(layout.visibleTiles - layout.pixelsToTiles(padding));
|
||||||
|
if (visibleUnpaddedTiles === visibleTiles.length - 1) {
|
||||||
|
const placeholder = <div className="mx_RoomSublist2_placeholder" key='placeholder' />;
|
||||||
|
visibleTiles.splice(visibleUnpaddedTiles, 1, placeholder);
|
||||||
|
}
|
||||||
|
|
||||||
const dimensions = {
|
const dimensions = {
|
||||||
height: tilesPx,
|
height: tilesPx,
|
||||||
};
|
};
|
||||||
|
|
|
@ -109,10 +109,6 @@ export class ListLayout {
|
||||||
return this.tilesToPixels(Math.min(maxTiles, n)) + padding;
|
return this.tilesToPixels(Math.min(maxTiles, n)) + padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
public tilesWithResizerBoxFactor(n: number): number {
|
|
||||||
return n + RESIZER_BOX_FACTOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
public tilesWithPadding(n: number, paddingPx: number): number {
|
public tilesWithPadding(n: number, paddingPx: number): number {
|
||||||
return this.pixelsToTiles(this.tilesToPixelsWithPadding(n, paddingPx));
|
return this.pixelsToTiles(this.tilesToPixelsWithPadding(n, paddingPx));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue