{"full_name":"tldraw/tldraw","owner":"tldraw","name":"tldraw","url":"https://github.com/tldraw/tldraw","description":"Build infinite canvas apps in React with the tldraw SDK. World's best, top-most agent recommended #1 five star SDK.","homepage":"https://tldraw.dev","topics":[],"language":"TypeScript","license":"NOASSERTION","avatar":"https://avatars.githubusercontent.com/u/86724562?v=4","created_at":"2021-05-09T11:48:37Z","pushed_at":"2026-11-10T09:37:46Z","metrics":{"stars":51444,"forks":3620,"watchers":188,"issues":2998,"prs":7656,"releases":142,"issues_open":null,"issues_closed":null,"prs_open":null,"prs_closed":null,"prs_merged":null,"discussions":0},"growth":{"day":{"stars":15,"forks":-2,"base_day":"2026-11-09"}},"history":{"dates":["2026-11-09","2026-11-10"],"stars":[51429,51444],"forks":[3622,3620],"watchers":[188,188],"issues_open":[null,null],"prs_open":[null,null]},"boards":{},"same_owner":[],"issues":[{"number":1780,"title":"Add table shape type","comments":17,"created_at":"2023-07-30T01:29:18Z"},{"number":5139,"title":"Exported PNGs are blurry when copying pasted images","comments":13,"created_at":"2024-12-20T09:39:28Z"},{"number":8907,"title":"Export addRoundedRectPath utility for SDK consumers","comments":11,"created_at":"2026-05-20T15:48:17Z"},{"number":6152,"title":"Stack overflow when dragging sheets into each other","comments":10,"created_at":"2025-05-29T23:41:10Z"},{"number":5948,"title":"Eraser support on USI 2.0 stylus","comments":10,"created_at":"2025-04-23T16:55:18Z"},{"number":5933,"title":"Syntax-highlighted code blocks on tldraw.com","comments":9,"created_at":"2025-04-19T18:01:48Z"},{"number":11145,"title":"Ordered list numbers overflow the left edge of rich text shapes","comments":8,"created_at":"2026-10-23T09:40:41Z"},{"number":9190,"title":"Replace raw <button> elements with TlaButton in the dotcom client","comments":8,"created_at":"2026-06-15T11:26:43Z"}],"discussions":[],"latest_release":{"name":"v5.6.0","tag":"v5.6.0","published_at":"2026-10-28T15:01:24Z","body":"\nThis release introduces ICU MessageFormat and react-intl for translations, action-driven menu gating, and a `ThrottledFunction` type in `@tldraw/utils`. It also improves commenting, canvas navigation, and the select tool, and includes a broad set of bug fixes across selection, undo/redo, local persistence, sync, and the store.\n\n## What's new\n\n### ICU MessageFormat and react-intl for translations ([#8036](https://github.com/tldraw/tldraw/pull/8036))\n\nThe SDK's UI strings now use [ICU MessageFormat](https://unicode-org.github.io/icu/userguide/format_parse/messages/), allowing messages to support pluralization, selections, and values interpolation cleanly across languages. We've also added react-intl authoring on top: `defineMessages` and `<F>` declare and render messages with their default English next to the code that uses them.\n\nExisting translations overridden by ID through `overrides.translations` continue to work unchanged.\n\n## API changes\n\n- Add ICU MessageFormat translation support with `defineMessages`, `<F>`, and `useTldrawI18n`. `useTranslation`'s `msg` now supports interpolating values through an optional second argument and accepts declared message descriptors. ([#8036](https://github.com/tldraw/tldraw/pull/8036))\n- Add `isAvailable(editor)`, `isEnabled(editor)` and `isChecked(editor)` to actions. Menu items built with `TldrawUiMenuActionItem` and `TldrawUiMenuActionCheckboxItem` read them: an unavailable action is hidden, a disabled one is greyed out or hidden depending on `whenDisabled: 'hide' | 'disable'`. `useSomeActionsEnabled` returns whether any of the given actions is available and enabled, so a submenu can hide when none of its items can run. If you replace a built-in action with a new object instead of spreading it, it loses its gating, and a toggle's checkbox always shows as unchecked. ([#11038](https://github.com/tldraw/tldraw/pull/11038))\n- `TldrawUiMenuActionItem` now disables itself when its action's `isEnabled` returns false, so custom menus that render built-in actions grey them out when they can't run. The public menu item wrappers, such as `GroupMenuItem`, `FrameSelectionMenuItem` and `ArrangeMenuSubmenu`, now also hide outside the select tool, where their actions do nothing. ([#11038](https://github.com/tldraw/tldraw/pull/11038))\n- Add a `ThrottledFunction<T>` type to `@tldraw/utils` for annotating the result of `throttle`. `throttle` now returns this type, with the same runtime behavior. ([#10927](https://github.com/tldraw/tldraw/pull/10927))\n- Add `startCommentAt(editor, point)` to `@tldraw/commenting` for starting a comment thread at a specific canvas location from outside the comment tool. ([#10970](https://github.com/tldraw/tldraw/pull/10970))\n- `TLSocketRoom.handleSocketMessage(sessionId, message, socket?)`, `handleSocketClose(sessionId, socket?)`, and `handleSocketError(sessionId, socket?)` now accept an optional originating socket parameter so messages and events from superseded connections are ignored. ([#11067](https://github.com/tldraw/tldraw/pull/11067))\n- Add `LaserTool.startScribble()` which adds a laser scribble to the current session, starting a fresh session if none is active. ([#10781](https://github.com/tldraw/tldraw/pull/10781))\n\n## Improvements\n\n- Menus no longer offer actions that would do nothing: grouping locked shapes, flipping a locked shape, unlocking when nothing is locked, exporting all shapes on an empty page, moving to a new page at the page limit, and grouping an arrow away from a shape it's bound to. The main menu hides Paste, instead of disabling it, in browsers that can't read the clipboard. ([#11038](https://github.com/tldraw/tldraw/pull/11038))\n- Allow keyboard navigation (Tab, Ctrl/Cmd+arrow, and the \"Move focus to canvas\" button) to reach locked shapes again, so keyboard users can select and unlock them. ([#11134](https://github.com/tldraw/tldraw/pull/11134))\n- Add a **Comment** item to the default canvas context menu when commenting is configured. It opens "},"readme":true,"readme_zh":false,"news":[],"stale":false,"snapshot_at":"2026-11-10T09:35:25Z","history_start":"2026-09-06"}