add keyboard shortcuts example (#2474)
This PR adds an example for overriding and adding keyboard shortcuts. ### Change Type - [ ] `patch` — Bug fix - [ ] `minor` — New feature - [ ] `major` — Breaking change - [ ] `dependencies` — Changes to package dependencies[^1] - [x] `documentation` — Changes to the documentation only[^2] - [ ] `tests` — Changes to any test code only[^2] - [ ] `internal` — Any other changes that don't affect the published package[^2] - [ ] I don't know [^1]: publishes a `patch` release, for devDependencies use `internal` [^2]: will not publish a new version ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add keyboard shortcuts example
This commit is contained in:
parent
5f0994192c
commit
eee6c4fe7b
3 changed files with 257 additions and 0 deletions
|
@ -0,0 +1,91 @@
|
||||||
|
import {
|
||||||
|
TLUiActionsContextType,
|
||||||
|
TLUiMenuGroup,
|
||||||
|
TLUiOverrides,
|
||||||
|
TLUiToolsContextType,
|
||||||
|
Tldraw,
|
||||||
|
menuItem,
|
||||||
|
} from '@tldraw/tldraw'
|
||||||
|
import '@tldraw/tldraw/tldraw.css'
|
||||||
|
import jsonSnapshot from './snapshot.json'
|
||||||
|
|
||||||
|
// There's a guide at the bottom of this file!
|
||||||
|
|
||||||
|
// [1]
|
||||||
|
const overrides: TLUiOverrides = {
|
||||||
|
//[a]
|
||||||
|
actions(_editor, actions): TLUiActionsContextType {
|
||||||
|
actions['copy-as-png'].kbd = '$1'
|
||||||
|
actions['toggle-grid'].kbd = 'x'
|
||||||
|
return actions
|
||||||
|
},
|
||||||
|
//[b]
|
||||||
|
tools(_editor, tools): TLUiToolsContextType {
|
||||||
|
tools['draw'].kbd = 'p'
|
||||||
|
return tools
|
||||||
|
},
|
||||||
|
//[c]
|
||||||
|
keyboardShortcutsMenu(_editor, shortcutsMenu, { actions }) {
|
||||||
|
const editGroup = shortcutsMenu.find(
|
||||||
|
(group) => group.id === 'shortcuts-dialog.edit'
|
||||||
|
) as TLUiMenuGroup
|
||||||
|
|
||||||
|
editGroup.children.push(menuItem(actions['copy-as-png']))
|
||||||
|
return shortcutsMenu
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// [2]
|
||||||
|
export default function KeyboardShortcuts() {
|
||||||
|
return (
|
||||||
|
<div className="tldraw__editor">
|
||||||
|
<Tldraw persistenceKey="tldraw_kbd_shortcuts" overrides={overrides} snapshot={jsonSnapshot} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This example shows how you can replace tldraw's default keyboard shortcuts with your own,
|
||||||
|
or add a shortcut for an action that doesn't have one. An example of how to add shortcuts
|
||||||
|
for custom tools can be found in the custom-config example.
|
||||||
|
|
||||||
|
In this case we are overriding the toggle grid and draw tool shortcuts, and creating a
|
||||||
|
shortcut for copy-as-png. An override of an existing shortcut will automatically update
|
||||||
|
the keyboard shortcuts dialog. However, adding a new shortcut won't, we'll need to add it
|
||||||
|
ourselves.
|
||||||
|
|
||||||
|
You can describe modifier keys with the following syntax:
|
||||||
|
|
||||||
|
shift: !
|
||||||
|
ctrl/cmd: $
|
||||||
|
alt: ?
|
||||||
|
|
||||||
|
[1]
|
||||||
|
We start by defining our overrides, this is an object with functions that we can use to
|
||||||
|
change the ui. Keyboard shortcuts are associated with either tools (draw, eraser, etc) or
|
||||||
|
actions (group, undo/redo etc). We're going to override two actions [a], one tool [b], and
|
||||||
|
add a new shortcut to the keyboard shortcuts dialog [c].
|
||||||
|
|
||||||
|
[a] actions
|
||||||
|
There are two actions we're modifying here, copy-as-png and toggle-grid. copy-as-png
|
||||||
|
doesn't have an existing shortcut, but we can still add the property and later add it
|
||||||
|
to the keyboard shortcuts dialog [c].
|
||||||
|
|
||||||
|
[b] tools
|
||||||
|
We're overriding the draw tool's shortcut to 'p', maybe we want to rename it to the pen
|
||||||
|
tool or something.
|
||||||
|
|
||||||
|
[c] keyboardShortcutsMenu
|
||||||
|
This function takes 3 arguments, the editor instance (which we don't need), the menu
|
||||||
|
schema, and the ui context. The shortcutsMenu is an array, so we'll need to use the
|
||||||
|
find method to return the edit group and add our new menu item to it. Check out the
|
||||||
|
useKeyboardShortcutsSchema.tsx file in the tldraw repo to see the full list of groups
|
||||||
|
and the menu items they contain. menuItem() is a helper function that creates a new menu
|
||||||
|
item for us, we just need to pass it an action or tool. We'll use the copy-as-png action
|
||||||
|
that we modified in [a], we can grab it from the ui context's actions object.
|
||||||
|
|
||||||
|
[2]
|
||||||
|
Finally, we pass our overrides object into the Tldraw component's overrides prop. Now when
|
||||||
|
the component mounts, our overrides will be applied. If you open the keyboard shortcuts
|
||||||
|
dialog, you'll see the changes we made.
|
||||||
|
*/
|
10
apps/examples/src/examples/keyboard-shortcuts/README.md
Normal file
10
apps/examples/src/examples/keyboard-shortcuts/README.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
title: Keyboard Shortcuts
|
||||||
|
component: ./KeyboardShortcuts.tsx
|
||||||
|
---
|
||||||
|
|
||||||
|
Override default keyboard shortcuts.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
How to replace tldraw's default keyboard shortcuts with your own.
|
156
apps/examples/src/examples/keyboard-shortcuts/snapshot.json
Normal file
156
apps/examples/src/examples/keyboard-shortcuts/snapshot.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue