Files
upstream-tldraw/templates/agent/client/App.tsx
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

100 lines
2.5 KiB
TypeScript

import { useCallback, useMemo, useState } from 'react'
import {
DefaultSizeStyle,
ErrorBoundary,
TLComponents,
Tldraw,
TldrawUiToastsProvider,
TLUiOverrides,
} from 'tldraw'
import { TldrawAgentApp } from './agent/TldrawAgentApp'
import {
TldrawAgentAppContextProvider,
TldrawAgentAppProvider,
} from './agent/TldrawAgentAppProvider'
import { ChatPanel } from './components/ChatPanel'
import { ChatPanelFallback } from './components/ChatPanelFallback'
import { CustomHelperButtons } from './components/CustomHelperButtons'
import { AgentHighlightOverlayUtil } from './overlays/AgentHighlightOverlayUtil'
import { TargetAreaTool } from './tools/TargetAreaTool'
import { TargetShapeTool } from './tools/TargetShapeTool'
// Customize tldraw's styles to play to the agent's strengths
DefaultSizeStyle.setDefaultValue('s')
// Custom tools for picking context items
const tools = [TargetShapeTool, TargetAreaTool]
const overlayUtils = [AgentHighlightOverlayUtil]
const overrides: TLUiOverrides = {
tools: (editor, tools) => {
return {
...tools,
'target-area': {
id: 'target-area',
label: 'Pick Area',
kbd: 'c',
icon: 'tool-frame',
onSelect() {
editor.setCurrentTool('target-area')
},
},
'target-shape': {
id: 'target-shape',
label: 'Pick Shape',
kbd: 's',
icon: 'tool-frame',
onSelect() {
editor.setCurrentTool('target-shape')
},
},
}
},
}
function App() {
const [app, setApp] = useState<TldrawAgentApp | null>(null)
const handleUnmount = useCallback(() => {
setApp(null)
}, [])
// Custom components that need the agent app's React context
const components: TLComponents = useMemo(() => {
return {
HelperButtons: () =>
app && (
<TldrawAgentAppContextProvider app={app}>
<CustomHelperButtons />
</TldrawAgentAppContextProvider>
),
}
}, [app])
return (
<TldrawUiToastsProvider>
<div className="tldraw-agent-container">
<div className="tldraw-canvas">
<Tldraw
persistenceKey="tldraw-agent-demo"
tools={tools}
overlayUtils={overlayUtils}
overrides={overrides}
components={components}
>
<TldrawAgentAppProvider onMount={setApp} onUnmount={handleUnmount} />
</Tldraw>
</div>
<ErrorBoundary fallback={ChatPanelFallback}>
{app && (
<TldrawAgentAppContextProvider app={app}>
<ChatPanel />
</TldrawAgentAppContextProvider>
)}
</ErrorBoundary>
</div>
</TldrawUiToastsProvider>
)
}
export default App