Annotate shape meta data example (#2453)
Annotate shape meta data example ### 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 - Annotate shape meta data example --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
This commit is contained in:
parent
78b8b4a7cc
commit
8029bf1d29
1 changed files with 32 additions and 2 deletions
|
@ -1,6 +1,9 @@
|
||||||
import { TLShape, Tldraw, track, useEditor } from '@tldraw/tldraw'
|
import { TLShape, Tldraw, track, useEditor } from '@tldraw/tldraw'
|
||||||
import '@tldraw/tldraw/tldraw.css'
|
import '@tldraw/tldraw/tldraw.css'
|
||||||
|
|
||||||
|
// There's a guide at the bottom of this file!
|
||||||
|
|
||||||
|
// [1]
|
||||||
export default function ShapeMetaExample() {
|
export default function ShapeMetaExample() {
|
||||||
return (
|
return (
|
||||||
<div className="tldraw__editor">
|
<div className="tldraw__editor">
|
||||||
|
@ -18,10 +21,10 @@ export default function ShapeMetaExample() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// By default, the TLShape type's meta property is { [key: string]: any }, but we can type it
|
// [2]
|
||||||
// by unioning the type with a new type that has a meta property of our choosing.
|
|
||||||
type ShapeWithMyMeta = TLShape & { meta: { label: string } }
|
type ShapeWithMyMeta = TLShape & { meta: { label: string } }
|
||||||
|
|
||||||
|
// [3]
|
||||||
export const ShapeLabelUiWithHelper = track(function ShapeLabelUiWithHelper() {
|
export const ShapeLabelUiWithHelper = track(function ShapeLabelUiWithHelper() {
|
||||||
const editor = useEditor()
|
const editor = useEditor()
|
||||||
const onlySelectedShape = editor.getOnlySelectedShape() as ShapeWithMyMeta | null
|
const onlySelectedShape = editor.getOnlySelectedShape() as ShapeWithMyMeta | null
|
||||||
|
@ -47,3 +50,30 @@ export const ShapeLabelUiWithHelper = track(function ShapeLabelUiWithHelper() {
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
This example shows how to use the `getInitialMetaForShape` function to set initial
|
||||||
|
meta data for a shape and update it.
|
||||||
|
|
||||||
|
[1]
|
||||||
|
In the Tldraw component's `onMount` callback, we override the default
|
||||||
|
`Editor.getInitialMetaForShape` function. This function is called when
|
||||||
|
a new shape is created and provides the `meta` property value for the
|
||||||
|
new shape.
|
||||||
|
|
||||||
|
[2]
|
||||||
|
By default, the TLShape type's meta property is { [key: string]: any }, but we can type
|
||||||
|
it using a union like this.
|
||||||
|
|
||||||
|
[3]
|
||||||
|
This is our minimal ui for editing the meta data of our shapes. We use the `track`
|
||||||
|
function to make sure this component is reactive, it will re-render when the signals
|
||||||
|
it is tracking change. Check out the signia docs for more:
|
||||||
|
https://signia.tldraw.dev/docs/API/signia_react/functions/track
|
||||||
|
|
||||||
|
Because our component is a child of the Tldraw component, it has access to the `useEditor`
|
||||||
|
hook via React context. We use this to get the only selected shape. If there is a single
|
||||||
|
shape selected, we render the input and update the shape's meta data when the input changes
|
||||||
|
via the `onChange` function.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
Loading…
Reference in a new issue