Skip to content

[pull] main from tldraw:main#437

Merged
pull[bot] merged 7 commits intocode:mainfrom
tldraw:main
Mar 10, 2026
Merged

[pull] main from tldraw:main#437
pull[bot] merged 7 commits intocode:mainfrom
tldraw:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Mar 10, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

mimecuvalo and others added 7 commits March 10, 2026 11:10
Restores the performance e2e test suite that was removed in #7517. The
CI workflow has been updated to match current conventions.

Closes #7595

### Changes

- Restored all performance test fixtures (FPS tracker, baseline manager,
heavy board generator, analytics reporter)
- Restored `test-perf.spec.ts` with tests for rotation, dragging,
resizing, panning, and zooming
- Restored FPS baselines and performance README
- Added back `e2e-perf` and `e2e-perf-ui` scripts to
`apps/examples/package.json`
- Created updated `playwright-perf.yml` workflow matching current CI
conventions:
- `actions/checkout@v6`, `actions/cache@v5`,
`actions/upload-artifact@v6`
  - Path-filter check job to skip on irrelevant changes
  - Build step for vite preview
  - `NODE_OPTIONS='--no-strip-types'`
  - 20-minute timeout

### Change type

- [x] `other`

### Test plan

1. Verify perf tests run locally with `cd apps/examples && yarn
e2e-perf`
2. Verify CI workflow triggers and runs on the PR

- [ ] Unit tests
- [x] End to end tests

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Adds a new CI workflow that runs performance-oriented Playwright tests
and can upload reports/metrics to external services (S3/PostHog), which
may affect CI stability, runtime, and data egress if misconfigured.
> 
> **Overview**
> Restores an end-to-end *FPS performance* test suite for
`apps/examples`, including utilities to generate a heavy board, track
FPS during key interactions (rotate/drag/resize/pan/zoom), and compare
results against checked-in baselines with pass/warn/fail thresholds.
> 
> Adds optional analytics reporting of performance results and
regression alerts to PostHog (gated by `PERFORMANCE_ANALYTICS_ENABLED`),
plus new `yarn e2e-perf` / `yarn e2e-perf-ui` scripts and baseline
documentation.
> 
> Introduces a dedicated GitHub Actions workflow `playwright-perf.yml`
that runs these perf tests only when relevant paths change, caches
Playwright browsers, uploads the HTML report as an artifact, and
optionally publishes it to S3 with a link in the job summary.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e659fd6. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- centralize editable element detection in `dom.ts` via
`elementShouldCaptureKeys(el, includeButton)` and route
`activeElementShouldCaptureKeys` through it
- migrate canvas, safari double-tap, clipboard, editing-shape, style
panel, and toolbar call sites to use the shared helper while keeping
special-case logic at call sites
- update editor exports and API report for the new helper and the
renamed `activeElementShouldCaptureKeys` parameter semantics

## Test plan
- [x] ReadLints on touched files reports no diagnostics
- [ ] Run `yarn typecheck` locally (blocked in sandbox due
`refresh-assets` IPC/EPERM error)
- [ ] Manually verify focus/shortcut behavior for
input/textarea/select/contenteditable/slider-thumb and
includeButton=false paths

### Change type

- [ ] `bugfix`
- [x] `improvement`
- [ ] `feature`
- [ ] `api`
- [ ] `other`

### API changes

Internal changes only

Made with [Cursor](https://cursor.com)


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches key event/shortcut suppression and `preventDefault` gating
across canvas/UI by changing how “editable elements” are detected
(notably `select`/`button` handling), so regressions could show up as
broken typing, focus, or keyboard shortcuts.
> 
> **Overview**
> **Centralizes editable-element detection** by introducing internal
`elementShouldCaptureKeys(el, includeButton)` in `dom.ts`, and
refactoring `activeElementShouldCaptureKeys` to delegate to it (with
renamed parameter semantics).
> 
> Updates multiple call sites (canvas touch handling, Safari pencil
double-tap zoom fix, clipboard/toolbar shortcut disabling, editing-shape
focus checks, and style panel focus retention) to use the shared helper
instead of bespoke tag/contenteditable checks, and exports the new
helper via `@tldraw/editor` (API report updated accordingly).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6dcec18. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
)

followup to #8060

### Change type

- [x] `bugfix`
- [ ] `improvement`
- [ ] `feature`
- [ ] `api`
- [ ] `other`


### Release notes

- followup to #8060

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Small but behavior-affecting change to keyboard/event suppression
logic; could impact interactions when focus is on `select`/`button`
controls across touch/pen and shortcut handling.
> 
> **Overview**
> Updates the internal DOM key-capture helpers by renaming the
`includeButton` flag to `includeButtonsAndMenus` and aligning behavior
so `select` and `button` elements are included/excluded together.
> 
> This subtly changes event/shortcut suppression behavior for call sites
that pass `false` (e.g. touch/pencil handlers): `select` elements will
no longer be treated as editable key-capturing targets in that mode, and
the generated API report is updated accordingly.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
6f0443a. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
## Summary

We're migrating more to using `options`/`configure` on shapes.

- Adds `EmbedShapeOptions` interface to `EmbedShapeUtil`, following the
same options pattern used by `TextShapeUtil`, `DrawShapeUtil`,
`FrameShapeUtil`, and others
- Replaces the static mutable `embedDefinitions` field and
`setEmbedDefinitions()` with instance-level `options.embedDefinitions`
(defaulting to `DEFAULT_EMBED_DEFINITIONS`)
- Updates the `Tldraw` component's `embeds` prop to use `configure()`
internally instead of mutating static state

Users can now add, augment, or override the default embed definitions
via `configure`:

```tsx
// Add custom embeds alongside defaults
const shapeUtils = [
  EmbedShapeUtil.configure({
    embedDefinitions: [...DEFAULT_EMBED_DEFINITIONS, myCustomEmbed],
  }),
]

// Override all definitions
const shapeUtils = [
  EmbedShapeUtil.configure({ embedDefinitions: myCustomEmbeds }),
]

// Filter out specific defaults
const shapeUtils = [
  EmbedShapeUtil.configure({
    embedDefinitions: DEFAULT_EMBED_DEFINITIONS.filter(d => d.type !== 'tldraw'),
  }),
]
```

### Breaking changes

- `EmbedShapeUtil.setEmbedDefinitions()` is removed (use `configure()`
instead)

## Test plan

- [x] Typecheck passes
- [x] All 198 embed tests pass
- [x] API report updated automatically

🤖 Generated with [Claude Code](https://claude.com/claude-code)


### Change type

- [x] `improvement`


### API changes

- add `options.embedDefinitions` to `EmbedShapeUtil`
- deprecate `static setEmbedDefinitions`


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches how embed definitions are sourced and configured, which could
change behavior when multiple editors/util instances or legacy `embeds`
usage rely on the previous global static state.
> 
> **Overview**
> Moves embed definition configuration from global static state on
`EmbedShapeUtil` to instance-level `options.embedDefinitions`
(defaulting to `DEFAULT_EMBED_DEFINITIONS`), aligning embeds with the
existing `configure()`/options pattern used by other shape utils.
> 
> Adds a public `EmbedShapeOptions` type export, keeps
`EmbedShapeUtil.setEmbedDefinitions(...)` as *deprecated* legacy
plumbing, and marks the `Tldraw` `embeds` prop as deprecated in favor of
configuring `EmbedShapeUtil` via `configure()`; API report and package
exports are updated accordingly.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f564ec3. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
bunch of missing tooltips on dotcom (we were using `title` instead)

example:
<img width="554" height="161" alt="Screenshot 2026-03-05 at 11 20 21"
src="https://github.com/user-attachments/assets/fe550311-c407-492d-be70-174eb6285ae5"
/>


### Change type

- [ ] `bugfix`
- [ ] `improvement`
- [ ] `feature`
- [x] `api`
- [x] `other`


### Release notes

- dotcom: add missing tooltips; adds `tooltip` to `TldrawUiButton`

### API changes

- adds `tooltip` to `TldrawUiButton`

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches a shared UI primitive (`TldrawUiButton`) and adds a new
prop/behavior that can affect tooltip/label/title semantics across the
app; functional logic is otherwise unchanged.
> 
> **Overview**
> Adds a new `tooltip` prop to `TldrawUiButton` that renders
`TldrawUiTooltip`, auto-derives `aria-label`, and avoids relying on the
native `title` attribute.
> 
> Updates dotcom UI controls (top panels, sidebar menus/toggles,
group/file actions, dotdev link dismiss, etc.) to use `TldrawUiButton`
with explicit tooltips and new i18n strings (e.g. *More options*,
*Dismiss*, *Create group*), plus minor sidebar CSS tweaks to accommodate
the new button styling.
> 
> Adjusts Playwright sidebar fixtures to locate buttons via `aria-label`
instead of `title` for *More options* and *Create file*.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3c89d95. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
followup to #8034
not sure how this passed merge queue

### Change type

- [ ] `bugfix`
- [ ] `improvement`
- [ ] `feature`
- [ ] `api`
- [x] `other`

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Updates an examples-only integration to the new embed configuration
API; no core logic changes, but the sample could break if the util is
misconfigured.
> 
> **Overview**
> Updates the `CustomEmbedExample` to use the latest embed configuration
approach by configuring `EmbedShapeUtil` with the custom
`embedDefinitions` and passing it to `Tldraw` via `shapeUtils`.
> 
> Removes usage of the `embeds` prop on `Tldraw` and adjusts the
example’s imports/docs accordingly.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
31d6fa5. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
In order to reduce staging deploy duration, this PR runs independent
deploy-dotcom phases in parallel while keeping multiplayer and
Zero-dependent work ordered. Relates to #7629.

### Change type

- [x] `other`

### Test plan

1. Trigger a staging deploy and compare the deploy timing breakdown
before/after this change.
2. Verify the deploy still completes successfully with multiplayer,
non-multiplayer workers, and Vercel deployment all succeeding.
3. Confirm the timing logs show parallelized phases (`cloudflare deploy
dry run` tasks and post-multiplayer parallel deploys).

- [ ] Unit tests
- [ ] End to end tests

Made with [Cursor](https://cursor.com)


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches CI/deploy orchestration and introduces parallelism plus a new
dependency scheduler; failures or mis-specified dependencies could break
staging/production deploy ordering even though runtime behavior of
services is unchanged.
> 
> **Overview**
> Speeds up `deploy-dotcom.ts` by parallelizing independent
staging/preflight work while preserving ordering for Cloudflare workers
that depend on `multiplayer`.
> 
> The script now models worker deploys as a dependency graph
(`workerDeployments`) and runs them via
`deployWorkersInDependencyOrder`, enabling parallel dry-run deploys for
ready workers and replacing the previous hard-coded per-worker sequence.
It also runs `uploadSourceMaps` and asset cache
`coalesceWithPreviousAssets` in parallel after the dotcom build, and
enforces “workers first, then Vercel deploy” in the real deploy phase.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
1eaaa28. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@pull pull Bot locked and limited conversation to collaborators Mar 10, 2026
@pull pull Bot added the ⤵️ pull label Mar 10, 2026
@pull pull Bot merged commit e139e9a into code:main Mar 10, 2026
3 of 6 checks passed
@pull pull Bot requested a deployment to npm deploy March 10, 2026 15:13 In progress
@pull pull Bot had a problem deploying to deploy-production March 10, 2026 15:13 Failure
@pull pull Bot had a problem deploying to vsce publish March 10, 2026 15:13 Failure
@pull pull Bot had a problem deploying to deploy-staging March 10, 2026 15:13 Failure
@pull pull Bot had a problem deploying to deploy-staging March 10, 2026 15:13 Error
@pull pull Bot requested a deployment to e2e-dotcom March 11, 2026 06:22 In progress
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant