Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 : )