improve keybinding docs. platform switcher, styling, fonts, etc (#1227)

This commit is contained in:
Mike Sawka 2024-11-07 14:18:17 -08:00 committed by GitHub
parent f50ce9565c
commit 276e078b3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 252 additions and 42 deletions

View File

@ -12,9 +12,13 @@ import { Card, CardGroup } from "@site/src/components/card.tsx";
Wave is an [open-source](https://github.com/wavetermdev/waveterm) terminal that adds the ability to launch graphical widgets, controlled and integrated directly with the CLI. We support MacOS, Linux, and Windows ([Downloads](https://waveterm.dev/download)). Wave is an [open-source](https://github.com/wavetermdev/waveterm) terminal that adds the ability to launch graphical widgets, controlled and integrated directly with the CLI. We support MacOS, Linux, and Windows ([Downloads](https://waveterm.dev/download)).
:::info
**These docs are incomplete**, but we're working on them. If you have a question, please feel free to ask us in [Discord](https://discord.gg/XfvZ334gwU). If you'd like to file a bug/enchancement, please **These docs are incomplete**, but we're working on them. If you have a question, please feel free to ask us in [Discord](https://discord.gg/XfvZ334gwU). If you'd like to file a bug/enchancement, please
use [Github Issues](https://github.com/wavetermdev/waveterm/issues). These docs are also open-source and we do accept PRs for docs [here](https://github.com/wavetermdev/waveterm/blob/main/docs). You can click the "Edit this page" link at the bottom of the page to get taken directly to the editor page for that document in GitHub. use [Github Issues](https://github.com/wavetermdev/waveterm/issues). These docs are also open-source and we do accept PRs for docs [here](https://github.com/wavetermdev/waveterm/blob/main/docs). You can click the "Edit this page" link at the bottom of the page to get taken directly to the editor page for that document in GitHub.
:::
References: References:
- [Widgets](./widgets) - [Widgets](./widgets)
@ -40,10 +44,10 @@ References:
## Links ## Links
- Homepage -- https://waveterm.dev - **Homepage** https://waveterm.dev
- Download -- https://waveterm.dev/download - **Download** https://waveterm.dev/download
- Discord -- https://discord.gg/XfvZ334gwU - **Discord** https://discord.gg/XfvZ334gwU
- GitHub -- https://github.com/wavetermdev/waveterm/ - **GitHub** https://github.com/wavetermdev/waveterm/
## Looking for WaveLegacy documentation? ## Looking for WaveLegacy documentation?

View File

@ -4,52 +4,62 @@ id: "keybindings"
title: "Key Bindings" title: "Key Bindings"
--- ---
Here's the set of default keybindings available in Wave. It is split into sections. import { Kbd } from "@site/src/components/kbd.tsx";
Some keybindings are always active. Others are only active for certain types of blocks. import { PlatformProvider, PlatformToggleButton } from "@site/src/components/platformcontext.tsx";
Note that these are the MacOS keybindings (they use "Cmd"). For Windows and Linux <PlatformProvider>
Here's the set of default keybindings available in Wave. It is split into sections.
Some keybindings are always active. Others are only active for certain types of blocks.
Note that these are the MacOS keybindings (they use "Cmd"). For Windows and Linux,
replace "Cmd" with "Alt" (note that "Ctrl" is "Ctrl" on both Mac, Windows, and Linux). replace "Cmd" with "Alt" (note that "Ctrl" is "Ctrl" on both Mac, Windows, and Linux).
## Global Keybindings ## Global Keybindings
| Key | Function | <PlatformToggleButton />
|-----|----------| <div style={{ marginBottom: 20 }}></div>
| Cmd:t | Open a new tab |
| Cmd:n | Open a new terminal block (defaults to the same connection and working directory) | | Key | Function |
| Cmd:w | Close the current block | | ---------------------------- | --------------------------------------------------------------------------------- |
| Cmd:m | Magnify / Un-Magnify the current block | | <Kbd k="Cmd:t"/> | Open a new tab |
| Cmd:g | Open the "connection" switcher | | <Kbd k="Cmd:n"/> | Open a new terminal block (defaults to the same connection and working directory) |
| Cmd:i | Refocus the current block (useful if the block has lost input focus) | | <Kbd k="Cmd:w"/> | Close the current block |
| Ctrl:Shift | Show block numbers | | <Kbd k="Cmd:m"/> | Magnify / Un-Magnify the current block |
| Ctrl:Shift:[number] | Switch to block number | | <Kbd k="Cmd:g"/> | Open the "connection" switcher |
| Ctrl:Shift:Arrows | Move left, right, up, down between blocks | | <Kbd k="Cmd:i"/> | Refocus the current block (useful if the block has lost input focus) |
| Cmd:[number] | Switch to tab number | | <Kbd k="Ctrl:Shift"/> | Show block numbers |
| Cmd:[ | Switch tab left | | <Kbd k="Ctrl:Shift:1-9"/> | Switch to block number |
| Cmd:] | Siwtch tab right | | <Kbd k="Ctrl:Shift:Arrows"/> | Move left, right, up, down between blocks |
| Cmd:Shift:r | Refresh the UI | | <Kbd k="Cmd:1-9"/> | Switch to tab number |
| <Kbd k="Cmd:["/> | Switch tab left |
| <Kbd k="Cmd:]"/> | Switch tab right |
| <Kbd k="Cmd:Shift:r"/> | Refresh the UI |
## File Preview Keybindings ## File Preview Keybindings
| Key | Function | | Key | Function |
|-----|----------| | ----------------------------------------- | -------------------------------------------------------------------------------------------------- |
| [any character] | any regular character (e.g. "a", "b") will filter the file list | | <Kbd k="[text]"/> | Any regular character (e.g. "a", "b") will filter the file list |
| Escape | will clear the filter | | <Kbd k="Escape"/> | Clears the filter |
| Up/Down Arrow | change file selection up/down | | <Kbd k="ArrowUp"/> / <Kbd k="ArrowDown"/> | Change file selection up/down |
| Enter | Open the currently selected file/directory | | <Kbd k="Enter"/> | Open the currently selected file/directory |
| Cmd:ArrowUp | move "up" a directory (parent directory) | | <Kbd k="Cmd:ArrowUp"/> | Move "up" a directory (parent directory) |
| Cmd:ArrowLeft | back, move to the previously selected file/directory | | <Kbd k="Cmd:ArrowLeft"/> | Back, move to the previously selected file/directory |
| Cmd:ArrowRight | forward (opposite of back) | | <Kbd k="Cmd:ArrowRight"/> | Forward (opposite of back) |
| Cmd:o | Open a new file (accepts relative paths to the current directory) | | <Kbd k="Cmd:o"/> | Open a new file (accepts relative paths to the current directory) |
| Cmd:s | When file editor is open, save file | | <Kbd k="Cmd:s"/> | When file editor is open, save file |
| Cmd:e | For files that can be previewed or edited (markdown, CSVs), switches between preview and edit mode | | <Kbd k="Cmd:e"/> | For files that can be previewed or edited (markdown, CSVs), switches between preview and edit mode |
| Cmd:r | When file editor is open, revert changes | | <Kbd k="Cmd:r"/> | When file editor is open, revert changes |
## Web Keybindings ## Web Keybindings
| Key | Function | | Key | Function |
|-----|----------| | ------------------------- | ------------------------------------------------------------- |
| Cmd:l | focus the URL input bar | | <Kbd k="Cmd:l"/> | Focus the URL input bar |
| Escape | when the URL input bar is focused, will focus the web content | | <Kbd k="Escape"/> | When the URL input bar is focused, will focus the web content |
| Cmd:r | reload webpage | | <Kbd k="Cmd:r"/> | Reload webpage |
| Cmd:ArrowLeft | back | | <Kbd k="Cmd:ArrowLeft"/> | Back |
| Cmd:ArrowRight | forward | | <Kbd k="Cmd:ArrowRight"/> | Forward |
</PlatformProvider>

View File

@ -0,0 +1,46 @@
@font-face {
font-family: "JetBrains Mono";
src: url("/static/fonts/JetBrainsMono-Regular.woff2") format("woff2");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "JetBrains Mono";
src: url("/static/fonts/JetBrainsMono-Bold.woff2") format("woff2");
font-weight: bold;
font-style: normal;
}
.kbd-group {
display: inline-flex;
gap: 4px;
align-items: center;
}
kbd {
background-color: #f4f4f4;
border-radius: 4px;
border: 1px solid #ccc;
padding: 2px 6px;
font-size: 0.8em; /* Base font size */
font-family: "JetBrains Mono", monospace;
display: inline-flex;
justify-content: center;
align-items: center;
height: 24px; /* Consistent height */
line-height: 24px; /* Consistent line height */
.bold {
font-weight: bold;
}
.spaced {
letter-spacing: 0.1em;
}
}
.kbd-group kbd.symbol {
font-size: 0.8em; /* Slightly larger font size for symbols */
line-height: 24px; /* Same line height as base to keep alignment */
}

View File

@ -0,0 +1,59 @@
import { useContext } from "react";
import "./kbd.css";
import type { Platform } from "./platformcontext";
import { PlatformContext } from "./platformcontext";
function convertKey(platform: Platform, key: string): [any, string, boolean] {
if (key == "Arrows") {
return [<span className="spaced"></span>, "Arrow Keys", true];
}
if (key == "ArrowUp") {
return ["↑", "Arrow Up", true];
}
if (key == "ArrowRight") {
return ["→", "Arrow Right", true];
}
if (key == "ArrowDown") {
return ["↓", "Arrow Down", true];
}
if (key == "ArrowLeft") {
return ["←", "Arrow Left", true];
}
if (key == "Cmd") {
if (platform === "mac") {
return ["⌘", "Command", true];
} else {
return ["Alt", "Alt", false];
}
}
if (key == "Ctrl") {
return ["⌃", "Control", true];
}
if (key == "Shift") {
return ["⇧", "Shift", true];
}
if (key == "Escape") {
return ["Esc", null, false];
}
return [key, null, false];
}
// Custom KBD component
export const Kbd = ({ k }) => {
const { platform } = useContext(PlatformContext);
const keys = k.split(":");
const keyElems = keys.map((key, i) => {
const [displayKey, title, symbol] = convertKey(platform, key);
return (
<kbd key={i} title={title} className={symbol ? "symbol" : null}>
{displayKey}
</kbd>
);
});
return <div className="kbd-group">{keyElems}</div>;
// const { platform } = useContext(PlatformContext);
// const keyLabel = platform === "mac" && k === "Cmd" ? "Cmd" : k === "Cmd" ? "Alt" : k;
// return <kbd>{k}</kbd>;
};

View File

@ -0,0 +1,30 @@
.pill-toggle {
display: inline-flex;
border: 1px solid #ddd;
border-radius: 20px;
overflow: hidden;
background-color: #f1f1f5;
}
.pill-option {
padding: 8px 16px;
font-size: 0.9em;
font-weight: 500;
color: #555;
background-color: transparent;
border: none;
cursor: pointer;
transition:
background-color 0.2s ease,
color 0.2s ease;
outline: none;
}
.pill-option.active {
background-color: #0073e6; /* Highlight color for active option */
color: #fff; /* White text on active side */
}
.pill-option:not(.active):hover {
background-color: #e0e0e0; /* Slight hover effect on inactive side */
}

View File

@ -0,0 +1,61 @@
import { createContext, ReactNode, useContext, useState } from "react";
import "./platformcontext.css";
export type Platform = "mac" | "linux";
interface PlatformContextProps {
platform: Platform;
togglePlatform: () => void;
}
export const PlatformContext = createContext<PlatformContextProps | undefined>(undefined);
const detectPlatform = (): Platform => {
const savedPlatform = localStorage.getItem("platform") as Platform | null;
if (savedPlatform && (savedPlatform === "mac" || savedPlatform === "linux")) {
return savedPlatform;
}
return /Mac|iPhone|iPad|iPod/.test(navigator.userAgent) ? "mac" : "linux";
};
export const PlatformProvider = ({ children }: { children: ReactNode }) => {
const [platform, setPlatform] = useState<Platform>(detectPlatform());
const togglePlatform = () => {
const newPlatform = platform === "mac" ? "linux" : "mac";
setPlatform(newPlatform);
localStorage.setItem("platform", newPlatform); // Store in localStorage
};
return <PlatformContext.Provider value={{ platform, togglePlatform }}>{children}</PlatformContext.Provider>;
};
export const usePlatform = (): PlatformContextProps => {
const context = useContext(PlatformContext);
if (!context) {
throw new Error("usePlatform must be used within a PlatformProvider");
}
return context;
};
export const PlatformToggleButton: React.FC = () => {
const { platform, togglePlatform } = usePlatform();
return (
<div className="pill-toggle">
<button
className={`pill-option ${platform === "mac" ? "active" : ""}`}
onClick={() => platform !== "mac" && togglePlatform()}
>
MacOS
</button>
<button
className={`pill-option ${platform === "linux" ? "active" : ""}`}
onClick={() => platform !== "linux" && togglePlatform()}
>
Linux/Windows
</button>
</div>
);
};

Binary file not shown.

Binary file not shown.