555078a993
Only show shadow when resizing, increase the hit area, and make the handle show up when the list itself is hovered.
429 lines
14 KiB
SCSS
429 lines
14 KiB
SCSS
/*
|
|
Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
// TODO: Rename to mx_RoomSublist during replacement of old component
|
|
|
|
.mx_RoomSublist2 {
|
|
// The sublist is a column of rows, essentially
|
|
display: flex;
|
|
flex-direction: column;
|
|
|
|
margin-left: 8px;
|
|
width: 100%;
|
|
|
|
&:first-child {
|
|
margin-top: 12px; // so we're not up against the search/filter
|
|
}
|
|
|
|
.mx_RoomSublist2_headerContainer {
|
|
// Create a flexbox to make alignment easy
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
// ***************************
|
|
// Sticky Headers Start
|
|
|
|
// Ideally we'd be able to use `position: sticky; top: 0; bottom: 0;` on the
|
|
// headerContainer, however due to our layout concerns we actually have to
|
|
// calculate it manually so we can sticky things in the right places. We also
|
|
// target the headerText instead of the container to reduce jumps when scrolling,
|
|
// and to help hide the badges/other buttons that could appear on hover. This
|
|
// all works by ensuring the header text has a fixed height when sticky so the
|
|
// fixed height of the container can maintain the scroll position.
|
|
|
|
// The combined height must be set in the LeftPanel2 component for sticky headers
|
|
// to work correctly.
|
|
padding-bottom: 8px;
|
|
height: 24px;
|
|
|
|
.mx_RoomSublist2_stickable {
|
|
flex: 1;
|
|
max-width: 100%;
|
|
z-index: 2; // Prioritize headers in the visible list over sticky ones
|
|
|
|
// Set the same background color as the room list for sticky headers
|
|
background-color: $roomlist2-bg-color;
|
|
|
|
// Create a flexbox to make ordering easy
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
// We use a generic sticky class for 2 reasons: to reduce style duplication and
|
|
// to identify when a header is sticky. If we didn't have a consistent sticky class,
|
|
// we'd have to do the "is sticky" checks again on click, as clicking the header
|
|
// when sticky scrolls instead of collapses the list.
|
|
&.mx_RoomSublist2_headerContainer_sticky {
|
|
position: fixed;
|
|
z-index: 1; // over top of other elements, but still under the ones in the visible list
|
|
height: 32px; // to match the header container
|
|
// width set by JS
|
|
}
|
|
|
|
&.mx_RoomSublist2_headerContainer_stickyBottom {
|
|
bottom: 0;
|
|
}
|
|
|
|
// We don't have a top style because the top is dependent on the room list header's
|
|
// height, and is therefore calculated in JS.
|
|
// The class, mx_RoomSublist2_headerContainer_stickyTop, is applied though.
|
|
}
|
|
|
|
// Sticky Headers End
|
|
// ***************************
|
|
|
|
.mx_RoomSublist2_badgeContainer {
|
|
opacity: 0.8;
|
|
width: 16px;
|
|
margin-right: 5px; // aligns with the room tile's badge
|
|
|
|
// Create another flexbox row because it's super easy to position the badge this way.
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
// Both of these buttons are hidden by default until the list is hovered
|
|
.mx_RoomSublist2_auxButton,
|
|
.mx_RoomSublist2_menuButton {
|
|
width: 0;
|
|
margin: 0;
|
|
visibility: hidden;
|
|
position: relative;
|
|
border-radius: 32px;
|
|
|
|
&::before {
|
|
content: '';
|
|
width: 16px;
|
|
height: 16px;
|
|
position: absolute;
|
|
top: 4px;
|
|
left: 4px;
|
|
mask-position: center;
|
|
mask-size: contain;
|
|
mask-repeat: no-repeat;
|
|
background: $muted-fg-color;
|
|
}
|
|
}
|
|
|
|
.mx_RoomSublist2_auxButton::before {
|
|
mask-image: url('$(res)/img/feather-customised/plus.svg');
|
|
}
|
|
|
|
.mx_RoomSublist2_menuButton::before {
|
|
mask-image: url('$(res)/img/feather-customised/more-horizontal.svg');
|
|
}
|
|
|
|
.mx_RoomSublist2_headerText {
|
|
flex: 1;
|
|
max-width: calc(100% - 16px); // 16px is the badge width
|
|
text-transform: uppercase;
|
|
line-height: $font-16px;
|
|
font-size: $font-12px;
|
|
font-weight: 600;
|
|
|
|
// Ellipsize any text overflow
|
|
text-overflow: ellipsis;
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
|
|
.mx_RoomSublist2_collapseBtn {
|
|
display: inline-block;
|
|
position: relative;
|
|
|
|
// Default hidden
|
|
visibility: hidden;
|
|
width: 0;
|
|
height: 0;
|
|
|
|
&::before {
|
|
content: '';
|
|
width: 12px;
|
|
height: 12px;
|
|
position: absolute;
|
|
top: 1px;
|
|
left: 1px;
|
|
mask-position: center;
|
|
mask-size: contain;
|
|
mask-repeat: no-repeat;
|
|
background: $primary-fg-color;
|
|
mask-image: url('$(res)/img/feather-customised/chevron-down.svg');
|
|
}
|
|
|
|
&.mx_RoomSublist2_collapseBtn_collapsed::before {
|
|
mask-image: url('$(res)/img/feather-customised/chevron-right.svg');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.mx_RoomSublist2_resizeBox {
|
|
margin-bottom: 4px; // for the resize handle
|
|
position: relative;
|
|
|
|
// Create another flexbox column for the tiles
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow: hidden;
|
|
|
|
.mx_RoomSublist2_showNButton {
|
|
cursor: pointer;
|
|
font-size: $font-13px;
|
|
line-height: $font-18px;
|
|
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 ListLayout class for minVisibleTiles if these change.
|
|
//
|
|
// At 24px high and 8px padding on the top this equates to 0.65 of
|
|
// a tile due to how the padding calculations work.
|
|
height: 24px;
|
|
padding-top: 8px;
|
|
|
|
// 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.
|
|
position: absolute;
|
|
bottom: 4px; // the height of the resize handle
|
|
left: 0;
|
|
right: 0;
|
|
|
|
// We create a flexbox to cheat at alignment
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
.mx_RoomSublist2_showNButtonChevron {
|
|
position: relative;
|
|
width: 16px;
|
|
height: 16px;
|
|
margin-left: 12px;
|
|
margin-right: 18px;
|
|
mask-position: center;
|
|
mask-size: contain;
|
|
mask-repeat: no-repeat;
|
|
background: $roomtile2-preview-color;
|
|
}
|
|
|
|
.mx_RoomSublist2_showMoreButtonChevron {
|
|
mask-image: url('$(res)/img/feather-customised/chevron-down.svg');
|
|
}
|
|
|
|
.mx_RoomSublist2_showLessButtonChevron {
|
|
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
|
|
// The hover state needs to use the whole sublist, not just the resizable box,
|
|
// so that selector is below and one level higher.
|
|
.react-resizable-handle {
|
|
cursor: ns-resize;
|
|
border-radius: 3px;
|
|
|
|
// Update RESIZE_HANDLE_HEIGHT if this changes
|
|
height: 4px;
|
|
|
|
// This is positioned directly below the 'show more' button.
|
|
position: absolute;
|
|
bottom: 0;
|
|
|
|
// Together, these make the bar 64px wide
|
|
left: calc(50% - 32px);
|
|
right: calc(50% - 32px);
|
|
}
|
|
|
|
&:hover, &.mx_RoomSublist2_hasMenuOpen {
|
|
.react-resizable-handle {
|
|
opacity: 0.8;
|
|
background-color: $primary-fg-color;
|
|
}
|
|
}
|
|
}
|
|
|
|
// The aforementioned selector for the hover state.
|
|
&:hover, &.mx_RoomSublist2_hasMenuOpen {
|
|
&:not(.mx_RoomSublist2_minimized) > .mx_RoomSublist2_headerContainer {
|
|
// If the header doesn't have an aux button we still need to hide the badge for
|
|
// the menu button.
|
|
.mx_RoomSublist2_badgeContainer {
|
|
// Completely hide the badge
|
|
width: 0;
|
|
margin: 0;
|
|
visibility: hidden;
|
|
}
|
|
|
|
&:not(.mx_RoomSublist2_headerContainer_withAux) {
|
|
// The menu button will be the rightmost button, so make it correctly aligned.
|
|
.mx_RoomSublist2_menuButton {
|
|
margin-right: 1px; // line it up with the badges on the room tiles
|
|
}
|
|
}
|
|
|
|
// Both of these buttons have circled backgrounds and are visible at this point,
|
|
// so make them so.
|
|
.mx_RoomSublist2_auxButton,
|
|
.mx_RoomSublist2_menuButton {
|
|
width: 24px;
|
|
height: 24px;
|
|
margin-left: 16px;
|
|
visibility: visible;
|
|
background-color: $roomlist2-button-bg-color;
|
|
}
|
|
}
|
|
|
|
.mx_RoomSublist2_headerContainer {
|
|
.mx_RoomSublist2_headerText {
|
|
.mx_RoomSublist2_collapseBtn {
|
|
visibility: visible;
|
|
width: 12px;
|
|
height: 12px;
|
|
margin-right: 4px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
&.mx_RoomSublist2_minimized {
|
|
.mx_RoomSublist2_headerContainer {
|
|
height: auto;
|
|
flex-direction: column;
|
|
position: relative;
|
|
|
|
.mx_RoomSublist2_badgeContainer {
|
|
order: 0;
|
|
align-self: flex-end;
|
|
margin-right: 0;
|
|
}
|
|
|
|
.mx_RoomSublist2_stickable {
|
|
order: 1;
|
|
max-width: 100%;
|
|
}
|
|
|
|
.mx_RoomSublist2_auxButton {
|
|
order: 2;
|
|
visibility: visible;
|
|
width: 32px !important; // !important to override hover styles
|
|
height: 32px !important; // !important to override hover styles
|
|
margin-left: 0 !important; // !important to override hover styles
|
|
background-color: $roomlist2-button-bg-color;
|
|
margin-top: 8px;
|
|
|
|
&::before {
|
|
top: 8px;
|
|
left: 8px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.mx_RoomSublist2_resizeBox {
|
|
align-items: center;
|
|
|
|
.mx_RoomSublist2_showNButton {
|
|
flex-direction: column;
|
|
|
|
.mx_RoomSublist2_showNButtonChevron {
|
|
margin-right: 12px; // to center
|
|
}
|
|
}
|
|
}
|
|
|
|
&:hover, &.mx_RoomSublist2_hasMenuOpen {
|
|
.mx_RoomSublist2_menuButton {
|
|
visibility: visible;
|
|
position: absolute;
|
|
bottom: 48px; // align to middle of name, 40px for aux button (with padding) and 8px for alignment
|
|
right: 0;
|
|
width: 16px;
|
|
height: 16px;
|
|
border-radius: 0;
|
|
z-index: 1; // occlude the list name
|
|
|
|
// This is the same color as the left panel background because it needs
|
|
// to occlude the sublist title
|
|
background-color: $roomlist2-bg-color;
|
|
|
|
&::before {
|
|
top: 0;
|
|
left: 0;
|
|
}
|
|
}
|
|
|
|
.mx_RoomSublist2_headerContainer:not(.mx_RoomSublist2_headerContainer_withAux) {
|
|
.mx_RoomSublist2_menuButton {
|
|
bottom: 8px; // align to the middle of name, 40px less than the `bottom` above.
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// We have a hover style on the room list with no specific list hovered, so account for that
|
|
.mx_RoomList2:hover .mx_RoomSublist2:not(.mx_RoomSublist2_minimized),
|
|
.mx_RoomSublist2_hasMenuOpen:not(.mx_RoomSublist2_minimized) {
|
|
.mx_RoomSublist2_headerContainer_withAux {
|
|
.mx_RoomSublist2_badgeContainer {
|
|
// Completely hide the badge
|
|
width: 0;
|
|
margin: 0;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.mx_RoomSublist2_auxButton {
|
|
// Show the aux button, but not the list button
|
|
width: 24px;
|
|
height: 24px;
|
|
margin-right: 1px; // line it up with the badges on the room tiles
|
|
visibility: visible;
|
|
}
|
|
}
|
|
}
|
|
|
|
.mx_RoomSublist2_contextMenu {
|
|
padding: 20px 16px;
|
|
width: 250px;
|
|
|
|
hr {
|
|
margin-top: 16px;
|
|
margin-bottom: 16px;
|
|
margin-right: 16px; // additional 16px
|
|
border: 1px solid $roomsublist2-divider-color;
|
|
opacity: 0.1;
|
|
}
|
|
|
|
.mx_RoomSublist2_contextMenu_title {
|
|
font-size: $font-15px;
|
|
line-height: $font-20px;
|
|
font-weight: 600;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.mx_RadioButton, .mx_Checkbox {
|
|
margin-top: 8px;
|
|
}
|
|
}
|