Files
upstream-mirror a774ac673a
Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
snapshot of https://github.com/tldraw/tldraw.git (main, 2026-09-23; blobs > 131072B omitted)
2026-09-23 16:12:52 +05:00

132 lines
3.0 KiB
TypeScript

import {
AssetToolbarItem,
CheckBoxToolbarItem,
CloudToolbarItem,
createShapeId,
DefaultToolbar,
DiamondToolbarItem,
DrawToolbarItem,
Editor,
EllipseToolbarItem,
HandToolbarItem,
HeartToolbarItem,
HexagonToolbarItem,
HighlightToolbarItem,
LaserToolbarItem,
NoteToolbarItem,
onDragFromToolbarToCreateShape,
OvalToolbarItem,
RectangleToolbarItem,
RhombusToolbarItem,
SelectToolbarItem,
StarToolbarItem,
TextToolbarItem,
TldrawUiMenuGroup,
TLShapeId,
TLUiOverrides,
ToolbarItem,
TriangleToolbarItem,
Vec,
XBoxToolbarItem,
} from 'tldraw'
import { NodeShape } from '../nodes/NodeShapeUtil'
import { getNodeDefinitions, NodeType } from '../nodes/nodeTypes'
function createNodeShape(editor: Editor, shapeId: TLShapeId, center: Vec, node: NodeType) {
// Mark a history stopping point for undo/redo
editor.markHistoryStoppingPoint('create node')
editor.run(() => {
// Create the shape with the node definition
editor.createShape({
id: shapeId,
type: 'node',
props: { node },
})
// Get the created shape and its bounds
const shape = editor.getShape<NodeShape>(shapeId)!
const shapeBounds = editor.getShapePageBounds(shapeId)!
// Position the shape so its center aligns with the drop point
editor.updateShape({
...shape,
x: center.x - shapeBounds.width / 2,
y: center.y - shapeBounds.height / 2,
})
// Select the newly created shape
editor.select(shapeId)
})
}
export const overrides: TLUiOverrides = {
tools: (editor, tools, _) => {
for (const nodeDef of Object.values(getNodeDefinitions(editor))) {
tools[`node-${nodeDef.type}`] = {
id: `node-${nodeDef.type}`,
label: nodeDef.title,
icon: nodeDef.icon,
onSelect: () => {
createNodeShape(
editor,
createShapeId(),
editor.getViewportPageBounds().center,
nodeDef.getDefault()
)
},
onDragStart: (_, info) => {
onDragFromToolbarToCreateShape(editor, info, {
createShape: (id) => {
editor.createShape({
id,
type: 'node',
props: { node: nodeDef.getDefault() },
})
},
onDragEnd: () => {},
})
},
}
}
return tools
},
}
export function WorkflowToolbar() {
return (
<DefaultToolbar orientation="vertical" maxItems={7}>
<TldrawUiMenuGroup id="selection">
<SelectToolbarItem />
<HandToolbarItem />
<DrawToolbarItem />
</TldrawUiMenuGroup>
<TldrawUiMenuGroup id="nodes">
<ToolbarItem tool="node-message" />
</TldrawUiMenuGroup>
<TldrawUiMenuGroup id="shapes">
<RectangleToolbarItem />
<EllipseToolbarItem />
<TriangleToolbarItem />
<NoteToolbarItem />
<DiamondToolbarItem />
<HexagonToolbarItem />
<OvalToolbarItem />
<RhombusToolbarItem />
<StarToolbarItem />
<CloudToolbarItem />
<HeartToolbarItem />
<XBoxToolbarItem />
<CheckBoxToolbarItem />
<TextToolbarItem />
<AssetToolbarItem />
<HighlightToolbarItem />
<LaserToolbarItem />
</TldrawUiMenuGroup>
</DefaultToolbar>
)
}