Update Space Panel scrollable region (#7245)
parent
4a6d46b76a
commit
82c125c170
|
@ -35,11 +35,6 @@ $activeBorderColor: $primary-content;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
.mx_SpacePanel_spaceTreeWrapper {
|
|
||||||
flex: 1;
|
|
||||||
padding: 12px 8px 16px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mx_SpacePanel_toggleCollapse {
|
.mx_SpacePanel_toggleCollapse {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
@ -336,6 +331,9 @@ $activeBorderColor: $primary-content;
|
||||||
|
|
||||||
/* root space buttons are bigger and not indented */
|
/* root space buttons are bigger and not indented */
|
||||||
& > .mx_AutoHideScrollbar {
|
& > .mx_AutoHideScrollbar {
|
||||||
|
flex: 1;
|
||||||
|
padding: 0 8px 16px 0;
|
||||||
|
|
||||||
& > .mx_SpaceButton {
|
& > .mx_SpaceButton {
|
||||||
height: $topLevelHeight;
|
height: $topLevelHeight;
|
||||||
|
|
||||||
|
@ -347,6 +345,18 @@ $activeBorderColor: $primary-content;
|
||||||
& > ul {
|
& > ul {
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.mx_IndicatorScrollbar_topOverflow {
|
||||||
|
mask-image: linear-gradient(180deg, transparent, black 5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.mx_IndicatorScrollbar_bottomOverflow {
|
||||||
|
mask-image: linear-gradient(180deg, black, black 95%, transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.mx_IndicatorScrollbar_topOverflow.mx_IndicatorScrollbar_bottomOverflow {
|
||||||
|
mask-image: linear-gradient(180deg, transparent, black 5%, black 95%, transparent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,11 @@ limitations under the License.
|
||||||
border-bottom: 1px solid $quinary-content;
|
border-bottom: 1px solid $quinary-content;
|
||||||
margin-left: 18px;
|
margin-left: 18px;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
|
margin-top: 12px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
width: max-content;
|
width: calc(100% - 20px);
|
||||||
|
|
||||||
.mx_UserMenu_userAvatar {
|
.mx_UserMenu_userAvatar {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
|
@ -14,11 +14,11 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { createRef } from "react";
|
import React, { ComponentProps, createRef } from "react";
|
||||||
import AutoHideScrollbar from "./AutoHideScrollbar";
|
import AutoHideScrollbar from "./AutoHideScrollbar";
|
||||||
import { replaceableComponent } from "../../utils/replaceableComponent";
|
import { replaceableComponent } from "../../utils/replaceableComponent";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps extends Omit<ComponentProps<typeof AutoHideScrollbar>, "onWheel"> {
|
||||||
// If true, the scrollbar will append mx_IndicatorScrollbar_leftOverflowIndicator
|
// If true, the scrollbar will append mx_IndicatorScrollbar_leftOverflowIndicator
|
||||||
// and mx_IndicatorScrollbar_rightOverflowIndicator elements to the list for positioning
|
// and mx_IndicatorScrollbar_rightOverflowIndicator elements to the list for positioning
|
||||||
// by the parent element.
|
// by the parent element.
|
||||||
|
@ -55,6 +55,7 @@ export default class IndicatorScrollbar extends React.Component<IProps, IState>
|
||||||
}
|
}
|
||||||
|
|
||||||
private collectScroller = (scroller: HTMLDivElement): void => {
|
private collectScroller = (scroller: HTMLDivElement): void => {
|
||||||
|
this.props.wrappedRef?.(scroller);
|
||||||
if (scroller && !this.scrollElement) {
|
if (scroller && !this.scrollElement) {
|
||||||
this.scrollElement = scroller;
|
this.scrollElement = scroller;
|
||||||
// Using the passive option to not block the main thread
|
// Using the passive option to not block the main thread
|
||||||
|
@ -185,10 +186,10 @@ export default class IndicatorScrollbar extends React.Component<IProps, IState>
|
||||||
? <div className="mx_IndicatorScrollbar_rightOverflowIndicator" style={rightIndicatorStyle} /> : null;
|
? <div className="mx_IndicatorScrollbar_rightOverflowIndicator" style={rightIndicatorStyle} /> : null;
|
||||||
|
|
||||||
return (<AutoHideScrollbar
|
return (<AutoHideScrollbar
|
||||||
|
{...otherProps}
|
||||||
ref={this.autoHideScrollbar}
|
ref={this.autoHideScrollbar}
|
||||||
wrappedRef={this.collectScroller}
|
wrappedRef={this.collectScroller}
|
||||||
onWheel={this.onMouseWheel}
|
onWheel={this.onMouseWheel}
|
||||||
{...otherProps}
|
|
||||||
>
|
>
|
||||||
{ leftOverflowIndicator }
|
{ leftOverflowIndicator }
|
||||||
{ children }
|
{ children }
|
||||||
|
|
|
@ -44,7 +44,6 @@ import {
|
||||||
UPDATE_SELECTED_SPACE,
|
UPDATE_SELECTED_SPACE,
|
||||||
UPDATE_TOP_LEVEL_SPACES,
|
UPDATE_TOP_LEVEL_SPACES,
|
||||||
} from "../../../stores/spaces";
|
} from "../../../stores/spaces";
|
||||||
import AutoHideScrollbar from "../../structures/AutoHideScrollbar";
|
|
||||||
import { RovingTabIndexProvider } from "../../../accessibility/RovingTabIndex";
|
import { RovingTabIndexProvider } from "../../../accessibility/RovingTabIndex";
|
||||||
import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore";
|
import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore";
|
||||||
import SpaceContextMenu from "../context_menus/SpaceContextMenu";
|
import SpaceContextMenu from "../context_menus/SpaceContextMenu";
|
||||||
|
@ -58,6 +57,7 @@ import UIStore from "../../../stores/UIStore";
|
||||||
import QuickSettingsButton from "./QuickSettingsButton";
|
import QuickSettingsButton from "./QuickSettingsButton";
|
||||||
import { useSettingValue } from "../../../hooks/useSettings";
|
import { useSettingValue } from "../../../hooks/useSettings";
|
||||||
import UserMenu from "../../structures/UserMenu";
|
import UserMenu from "../../structures/UserMenu";
|
||||||
|
import IndicatorScrollbar from "../../structures/IndicatorScrollbar";
|
||||||
|
|
||||||
const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => {
|
const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => {
|
||||||
const invites = useEventEmitterState<Room[]>(SpaceStore.instance, UPDATE_INVITED_SPACES, () => {
|
const invites = useEventEmitterState<Room[]>(SpaceStore.instance, UPDATE_INVITED_SPACES, () => {
|
||||||
|
@ -252,7 +252,6 @@ const InnerSpacePanel = React.memo<IInnerSpacePanelProps>(({ children, isPanelCo
|
||||||
});
|
});
|
||||||
|
|
||||||
return <div className="mx_SpaceTreeLevel">
|
return <div className="mx_SpaceTreeLevel">
|
||||||
<UserMenu isPanelCollapsed={isPanelCollapsed} />
|
|
||||||
{ metaSpacesSection }
|
{ metaSpacesSection }
|
||||||
{ invites.map(s => (
|
{ invites.map(s => (
|
||||||
<SpaceItem
|
<SpaceItem
|
||||||
|
@ -308,9 +307,10 @@ const SpacePanel = () => {
|
||||||
aria-label={_t("Spaces")}
|
aria-label={_t("Spaces")}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
>
|
>
|
||||||
|
<UserMenu isPanelCollapsed={isPanelCollapsed} />
|
||||||
<Droppable droppableId="top-level-spaces">
|
<Droppable droppableId="top-level-spaces">
|
||||||
{ (provided, snapshot) => (
|
{ (provided, snapshot) => (
|
||||||
<AutoHideScrollbar
|
<IndicatorScrollbar
|
||||||
{...provided.droppableProps}
|
{...provided.droppableProps}
|
||||||
wrappedRef={provided.innerRef}
|
wrappedRef={provided.innerRef}
|
||||||
className="mx_SpacePanel_spaceTreeWrapper"
|
className="mx_SpacePanel_spaceTreeWrapper"
|
||||||
|
@ -324,7 +324,7 @@ const SpacePanel = () => {
|
||||||
>
|
>
|
||||||
{ provided.placeholder }
|
{ provided.placeholder }
|
||||||
</InnerSpacePanel>
|
</InnerSpacePanel>
|
||||||
</AutoHideScrollbar>
|
</IndicatorScrollbar>
|
||||||
) }
|
) }
|
||||||
</Droppable>
|
</Droppable>
|
||||||
<AccessibleTooltipButton
|
<AccessibleTooltipButton
|
||||||
|
|
Loading…
Reference in New Issue