Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 6b1cde0

Browse files
committed
New space panel expand mechanism
1 parent 8b82836 commit 6b1cde0

File tree

11 files changed

+112
-39
lines changed

11 files changed

+112
-39
lines changed

res/css/structures/_SpacePanel.scss

+35-11
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,9 @@ $activeBorderColor: $primary-content;
3636
flex-direction: column;
3737

3838
.mx_SpacePanel_toggleCollapse {
39-
margin: 0 auto;
4039
position: relative;
41-
min-width: 32px;
42-
min-height: 32px;
43-
line-height: 32px;
44-
color: $secondary-content;
40+
height: 32px;
41+
width: 32px;
4542

4643
&::before {
4744
content: "";
@@ -50,20 +47,47 @@ $activeBorderColor: $primary-content;
5047
height: 32px;
5148
left: 0;
5249
mask-position: center;
53-
mask-size: contain;
50+
mask-size: 24px;
5451
mask-repeat: no-repeat;
5552
background-color: $secondary-content;
56-
mask-image: url('$(res)/img/element-icons/expand-space-panel.svg');
53+
mask-image: url('$(res)/img/feather-customised/chevron-down.svg');
54+
transform: rotate(270deg);
55+
transition: transform 200ms linear;
56+
}
57+
58+
&:not(.expanded) {
59+
position: absolute;
60+
left: 68px;
61+
top: 12px;
62+
border-radius: 0 8px 8px 0;
63+
background-color: $primary-content;
64+
opacity: 0;
65+
66+
&::before {
67+
background-color: $background;
68+
}
5769
}
5870

5971
&.expanded {
60-
padding-left: 48px;
61-
padding-right: 8px;
62-
margin-left: $gutterSize;
72+
margin-left: auto;
73+
margin-right: -8px; // overflow into .mx_UserMenu's margin without butchering its bottom stroke
74+
border-radius: 8px;
6375

6476
&::before {
65-
transform: scaleX(-1);
77+
transform: rotate(90deg);
6678
}
79+
80+
&:hover {
81+
background-color: $panel-actions;
82+
}
83+
}
84+
}
85+
86+
&:hover .mx_SpacePanel_toggleCollapse {
87+
opacity: 100%;
88+
89+
&:not(.expanded) {
90+
transition: opacity 500ms linear;
6791
}
6892
}
6993

res/css/structures/_UserMenu.scss

+6-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ limitations under the License.
1919
display: flex;
2020
align-items: center;
2121

22+
.mx_AccessibleButton {
23+
display: flex;
24+
align-items: center;
25+
}
26+
2227
.mx_UserMenu_userAvatar {
2328
position: relative;
2429
}
@@ -30,7 +35,7 @@ limitations under the License.
3035
margin-left: 10px;
3136
}
3237

33-
&.mx_UserMenu_cutout .mx_BaseAvatar {
38+
.mx_UserMenu_cutout .mx_BaseAvatar {
3439
mask-image: url('$(res)/img/element-icons/roomlist/dnd-avatar-mask.svg');
3540
mask-position: center;
3641
mask-size: contain;

res/img/element-icons/expand-space-panel.svg

-4
This file was deleted.

src/KeyBindingsDefaults.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import { AutocompleteAction, IKeyBindingsProvider, KeyBinding, MessageComposerAction, NavigationAction, RoomAction,
18-
RoomListAction } from "./KeyBindingsManager";
17+
import {
18+
AutocompleteAction,
19+
IKeyBindingsProvider,
20+
KeyBinding,
21+
MessageComposerAction,
22+
NavigationAction,
23+
RoomAction,
24+
RoomListAction,
25+
} from "./KeyBindingsManager";
1926
import { isMac, Key } from "./Keyboard";
2027
import SettingsStore from "./settings/SettingsStore";
2128

@@ -321,6 +328,14 @@ const navigationBindings = (): KeyBinding<NavigationAction>[] => {
321328
ctrlOrCmd: true,
322329
},
323330
},
331+
{
332+
action: NavigationAction.ToggleSpacePanel,
333+
keyCombo: {
334+
key: Key.D,
335+
ctrlOrCmd: true,
336+
shiftKey: true,
337+
},
338+
},
324339
{
325340
action: NavigationAction.ToggleRoomSidePanel,
326341
keyCombo: {

src/KeyBindingsManager.ts

+2
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ export enum RoomAction {
105105
export enum NavigationAction {
106106
/** Jump to room search (search for a room) */
107107
FocusRoomSearch = 'FocusRoomSearch',
108+
/** Toggle the space panel */
109+
ToggleSpacePanel = 'ToggleSpacePanel',
108110
/** Toggle the room side panel */
109111
ToggleRoomSidePanel = 'ToggleRoomSidePanel',
110112
/** Toggle the user menu */

src/accessibility/KeyboardShortcuts.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,12 @@ const shortcuts: Record<Categories, IShortcut[]> = {
253253
key: Key.SPACE,
254254
}],
255255
description: _td("Activate selected button"),
256+
}, {
257+
keybinds: [{
258+
modifiers: [CMD_OR_CTRL, Modifiers.SHIFT],
259+
key: Key.D,
260+
}],
261+
description: _td("Toggle space panel"),
256262
}, {
257263
keybinds: [{
258264
modifiers: [CMD_OR_CTRL],
@@ -348,7 +354,7 @@ const Shortcut: React.FC<{
348354
}
349355

350356
return <div key={s.key}>
351-
{ s.modifiers && s.modifiers.map(m => {
357+
{ s.modifiers?.map(m => {
352358
return <React.Fragment key={m}>
353359
<kbd>{ modifierIcon[m] || _t(m) }</kbd>+
354360
</React.Fragment>;

src/components/structures/LoggedInView.tsx

+6-5
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,14 @@ import { IMatrixClientCreds } from '../../MatrixClientPeg';
2727
import SettingsStore from "../../settings/SettingsStore";
2828

2929
import ResizeHandle from '../views/elements/ResizeHandle';
30-
import { Resizer, CollapseDistributor } from '../../resizer';
30+
import { CollapseDistributor, Resizer } from '../../resizer';
3131
import MatrixClientContext from "../../contexts/MatrixClientContext";
3232
import * as KeyboardShortcuts from "../../accessibility/KeyboardShortcuts";
3333
import HomePage from "./HomePage";
3434
import ResizeNotifier from "../../utils/ResizeNotifier";
3535
import PlatformPeg from "../../PlatformPeg";
3636
import { DefaultTagID } from "../../stores/room-list/models";
37-
import {
38-
showToast as showServerLimitToast,
39-
hideToast as hideServerLimitToast,
40-
} from "../../toasts/ServerLimitToast";
37+
import { hideToast as hideServerLimitToast, showToast as showServerLimitToast } from "../../toasts/ServerLimitToast";
4138
import { Action } from "../../dispatcher/actions";
4239
import LeftPanel from "./LeftPanel";
4340
import CallContainer from '../views/voip/CallContainer';
@@ -505,6 +502,10 @@ class LoggedInView extends React.Component<IProps, IState> {
505502
Modal.closeCurrentModal("homeKeyboardShortcut");
506503
handled = true;
507504
break;
505+
case NavigationAction.ToggleSpacePanel:
506+
dis.fire(Action.ToggleSpacePanel);
507+
handled = true;
508+
break;
508509
case NavigationAction.ToggleRoomSidePanel:
509510
if (this.props.page_type === "room_view" || this.props.page_type === "group_view") {
510511
dis.dispatch<ToggleRightPanelPayload>({

src/components/structures/UserMenu.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -523,14 +523,14 @@ export default class UserMenu extends React.Component<IProps, IState> {
523523
</div>;
524524
}
525525

526-
return (
526+
return <div className="mx_UserMenu">
527527
<ContextMenuButton
528528
onClick={this.onOpenMenuClick}
529529
inputRef={this.buttonRef}
530530
label={_t("User menu")}
531531
isExpanded={!!this.state.contextMenuPosition}
532532
onContextMenu={this.onContextMenu}
533-
className={classNames("mx_UserMenu", {
533+
className={classNames({
534534
mx_UserMenu_cutout: badge,
535535
})}
536536
>
@@ -550,6 +550,8 @@ export default class UserMenu extends React.Component<IProps, IState> {
550550

551551
{ this.renderContextMenu() }
552552
</ContextMenuButton>
553-
);
553+
554+
{ this.props.children }
555+
</div>;
554556
}
555557
}

src/components/views/spaces/SpacePanel.tsx

+27-9
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ import QuickSettingsButton from "./QuickSettingsButton";
5858
import { useSettingValue } from "../../../hooks/useSettings";
5959
import UserMenu from "../../structures/UserMenu";
6060
import IndicatorScrollbar from "../../structures/IndicatorScrollbar";
61+
import { isMac } from "../../../Keyboard";
62+
import { useDispatcher } from "../../../hooks/useDispatcher";
63+
import defaultDispatcher from "../../../dispatcher/dispatcher";
64+
import { ActionPayload } from "../../../dispatcher/payloads";
65+
import { Action } from "../../../dispatcher/actions";
6166

6267
const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => {
6368
const invites = useEventEmitterState<Room[]>(SpaceStore.instance, UPDATE_INVITED_SPACES, () => {
@@ -293,6 +298,12 @@ const SpacePanel = () => {
293298
return () => UIStore.instance.stopTrackingElementDimensions("SpacePanel");
294299
}, []);
295300

301+
useDispatcher(defaultDispatcher, (payload: ActionPayload) => {
302+
if (payload.action === Action.ToggleSpacePanel) {
303+
setPanelCollapsed(!isPanelCollapsed);
304+
}
305+
});
306+
296307
return (
297308
<DragDropContext onDragEnd={result => {
298309
if (!result.destination) return; // dropped outside the list
@@ -307,7 +318,21 @@ const SpacePanel = () => {
307318
aria-label={_t("Spaces")}
308319
ref={ref}
309320
>
310-
<UserMenu isPanelCollapsed={isPanelCollapsed} />
321+
<UserMenu isPanelCollapsed={isPanelCollapsed}>
322+
<AccessibleTooltipButton
323+
className={classNames("mx_SpacePanel_toggleCollapse", { expanded: !isPanelCollapsed })}
324+
onClick={() => setPanelCollapsed(!isPanelCollapsed)}
325+
title={isPanelCollapsed ? _t("Expand") : _t("Collapse")}
326+
tooltip={<div>
327+
<div className="mx_Tooltip_title">
328+
{ isPanelCollapsed ? _t("Expand") : _t("Collapse") }
329+
</div>
330+
<div className="mx_Tooltip_sub">
331+
{ isMac ? "⌘ + ⇧ + D" : "Ctrl + Shift + D" }
332+
</div>
333+
</div>}
334+
/>
335+
</UserMenu>
311336
<Droppable droppableId="top-level-spaces">
312337
{ (provided, snapshot) => (
313338
<IndicatorScrollbar
@@ -327,14 +352,7 @@ const SpacePanel = () => {
327352
</IndicatorScrollbar>
328353
) }
329354
</Droppable>
330-
<AccessibleTooltipButton
331-
className={classNames("mx_SpacePanel_toggleCollapse", { expanded: !isPanelCollapsed })}
332-
onClick={() => setPanelCollapsed(!isPanelCollapsed)}
333-
title={isPanelCollapsed ? _t("Expand space panel") : _t("Collapse space panel")}
334-
forceHide={!isPanelCollapsed}
335-
>
336-
{ !isPanelCollapsed ? _t("Collapse") : null }
337-
</AccessibleTooltipButton>
355+
338356
{ metaSpacesEnabled && <QuickSettingsButton isPanelCollapsed={isPanelCollapsed} /> }
339357
</ul>
340358
) }

src/dispatcher/actions.ts

+5
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ export enum Action {
7777
*/
7878
ToggleUserMenu = "toggle_user_menu",
7979

80+
/**
81+
* Toggles the Space panel. No additional payload information required.
82+
*/
83+
ToggleSpacePanel = "toggle_space_panel",
84+
8085
/**
8186
* Sets the apps root font size. Should be used with UpdateFontSizePayload
8287
*/

src/i18n/strings/en_EN.json

+2-3
Original file line numberDiff line numberDiff line change
@@ -1100,8 +1100,7 @@
11001100
"Create": "Create",
11011101
"Show all rooms": "Show all rooms",
11021102
"Options": "Options",
1103-
"Expand space panel": "Expand space panel",
1104-
"Collapse space panel": "Collapse space panel",
1103+
"Expand": "Expand",
11051104
"Collapse": "Collapse",
11061105
"Click to copy": "Click to copy",
11071106
"Copied!": "Copied!",
@@ -1130,7 +1129,6 @@
11301129
"Recommended for public spaces.": "Recommended for public spaces.",
11311130
"Jump to first unread room.": "Jump to first unread room.",
11321131
"Jump to first invite.": "Jump to first invite.",
1133-
"Expand": "Expand",
11341132
"Space options": "Space options",
11351133
"Remove": "Remove",
11361134
"This bridge was provisioned by <user />.": "This bridge was provisioned by <user />.",
@@ -3321,6 +3319,7 @@
33213319
"Toggle the top left menu": "Toggle the top left menu",
33223320
"Close dialog or context menu": "Close dialog or context menu",
33233321
"Activate selected button": "Activate selected button",
3322+
"Toggle space panel": "Toggle space panel",
33243323
"Toggle right panel": "Toggle right panel",
33253324
"Toggle this dialog": "Toggle this dialog",
33263325
"Go to Home View": "Go to Home View",

0 commit comments

Comments
 (0)