Events
Every Excalidraw callback surfaced as a timestamped snapshot prop you can read from a Dash callback.
Overview
Every Excalidraw callback is surfaced as a setProps-written snapshot prop on the Python side. Interact with the canvas and watch the panels update.
Live demo
Source
# File: docs/events/events.py
"""Events: observe pointer/scroll/paste/library snapshots."""
import dash_mantine_components as dmc
from dash import Input, Output, callback
from dash_excalidraw import DashExcalidraw
from docs._shared import (
canvas_frame,
code_block,
json_panel,
sync_canvas_theme,
two_column,
)
sync_canvas_theme("events-canvas")
CODE = """
@callback(
Output('pointer-out', 'children'),
Input('canvas', 'lastPointerMove'),
)
def show_pointer(snapshot):
return json.dumps(snapshot) if snapshot else '(waiting)'
"""
component = dmc.Stack(
gap="md",
children=[
code_block(CODE),
two_column(
canvas_frame(
DashExcalidraw(
id="events-canvas",
height="560px",
pointerMoveThrottleMs=75,
scrollThrottleMs=150,
),
min_height=560,
),
dmc.Stack(
gap="sm",
children=[
dmc.Tabs(
value="pointer",
children=[
dmc.TabsList(
[
dmc.TabsTab("Pointer", value="pointer"),
dmc.TabsTab("Scroll", value="scroll"),
dmc.TabsTab("Paste", value="paste"),
dmc.TabsTab("Links", value="links"),
]
),
dmc.TabsPanel(
value="pointer",
pt="sm",
children=dmc.Stack(
gap="xs",
children=[
dmc.Text(
"lastPointerDown / Up / Move",
size="sm",
fw=600,
),
dmc.Paper(id="events-pointer", withBorder=True, p="xs"),
],
),
),
dmc.TabsPanel(
value="scroll",
pt="sm",
children=dmc.Paper(id="events-scroll", withBorder=True, p="xs"),
),
dmc.TabsPanel(
value="paste",
pt="sm",
children=dmc.Paper(id="events-paste", withBorder=True, p="xs"),
),
dmc.TabsPanel(
value="links",
pt="sm",
children=dmc.Paper(id="events-link", withBorder=True, p="xs"),
),
],
),
],
),
),
],
)
@callback(
Output("events-pointer", "children"),
Input("events-canvas", "lastPointerDown"),
Input("events-canvas", "lastPointerUp"),
Input("events-canvas", "lastPointerMove"),
)
def _render_pointer(down, up, move):
return dmc.Stack(
gap="xs",
children=[
json_panel("lastPointerDown", down, height=120),
json_panel("lastPointerUp", up, height=120),
json_panel("lastPointerMove", move, height=120),
],
)
@callback(
Output("events-scroll", "children"),
Input("events-canvas", "lastScrollChange"),
)
def _render_scroll(scroll):
return json_panel("lastScrollChange", scroll, height=220)
@callback(
Output("events-paste", "children"),
Input("events-canvas", "lastPaste"),
)
def _render_paste(paste):
return json_panel("lastPaste", paste, height=220)
@callback(
Output("events-link", "children"),
Input("events-canvas", "lastLinkOpen"),
)
def _render_link(link):
return json_panel("lastLinkOpen", link, height=220)
:defaultExpanded: false :withExpandedButton: true
Source: /events
Note for AI agents: This is the static, prerendered view of an interactive Dash application served because we detected a non-JS user agent. Full prose docs:
- /events/llms.txt — LLM-friendly documentation
- /sitemap.xml
- /robots.txt