tldraw 5.6.0 → 5.7.0-canary.017ae8f4fa1b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DOCS.md +65 -29
- package/RELEASE_NOTES.md +66 -3
- package/dist-cjs/index.d.ts +18 -6
- package/dist-cjs/index.js +1 -1
- package/dist-cjs/lib/defaultExternalContentHandlers.js +46 -8
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +8 -7
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
- package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
- package/dist-cjs/lib/shapes/frame/frameHelpers.js +2 -0
- package/dist-cjs/lib/shapes/frame/frameHelpers.js.map +2 -2
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js +3 -0
- package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +2 -9
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js +6 -13
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js +5 -12
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +1 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js +2 -3
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCanvas.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js +4 -16
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js +5 -14
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingResizeHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js +5 -12
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingRotateHandle.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +2 -3
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +1 -3
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +2 -2
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js +48 -0
- package/dist-cjs/lib/tools/SelectTool/selectHelpers.js.map +2 -2
- package/dist-cjs/lib/ui/TldrawUi.js +0 -32
- package/dist-cjs/lib/ui/TldrawUi.js.map +2 -2
- package/dist-cjs/lib/ui/components/A11y.js +3 -1
- package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
- package/dist-cjs/lib/ui/components/ColorSchemeMenu.js +2 -2
- package/dist-cjs/lib/ui/components/ColorSchemeMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js +10 -0
- package/dist-cjs/lib/ui/components/ContextMenu/DefaultContextMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/InputModeMenu.js +2 -2
- package/dist-cjs/lib/ui/components/InputModeMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +3 -2
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +2 -2
- package/dist-cjs/lib/ui/components/LanguageMenu.js +2 -2
- package/dist-cjs/lib/ui/components/LanguageMenu.js.map +2 -2
- package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuItem.js +1 -1
- package/dist-cjs/lib/ui/components/SharePanel/DefaultPeopleMenuItem.js.map +2 -2
- package/dist-cjs/lib/ui/components/menu-items.js +2 -2
- package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js +2 -1
- package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
- package/dist-cjs/lib/ui/consumerMessages.js +0 -3
- package/dist-cjs/lib/ui/consumerMessages.js.map +2 -2
- package/dist-cjs/lib/ui/context/action-predicates.js +14 -5
- package/dist-cjs/lib/ui/context/action-predicates.js.map +2 -2
- package/dist-cjs/lib/ui/context/action-state.js +81 -0
- package/dist-cjs/lib/ui/context/action-state.js.map +7 -0
- package/dist-cjs/lib/ui/context/actions.js +105 -161
- package/dist-cjs/lib/ui/context/actions.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useActionState.js +3 -44
- package/dist-cjs/lib/ui/hooks/useActionState.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +12 -2
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +2 -2
- package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
- package/dist-cjs/lib/ui/kbd-utils.js +7 -4
- package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
- package/dist-cjs/lib/ui/overrides.js.map +2 -2
- package/dist-cjs/lib/ui/version.js +3 -3
- package/dist-cjs/lib/ui/version.js.map +1 -1
- package/dist-cjs/lib/utils/frames/frames.js +1 -1
- package/dist-cjs/lib/utils/frames/frames.js.map +2 -2
- package/dist-cjs/lib/utils/text/richText.js +1 -1
- package/dist-cjs/lib/utils/text/richText.js.map +2 -2
- package/dist-cjs/lib/utils/tldr/file.js +10 -3
- package/dist-cjs/lib/utils/tldr/file.js.map +2 -2
- package/dist-esm/index.d.mts +18 -6
- package/dist-esm/index.mjs +1 -1
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +46 -8
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +9 -7
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +6 -2
- package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
- package/dist-esm/lib/shapes/frame/frameHelpers.mjs +2 -0
- package/dist-esm/lib/shapes/frame/frameHelpers.mjs.map +2 -2
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +3 -0
- package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +2 -9
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs +6 -13
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs +5 -12
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs +2 -3
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCanvas.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs +5 -17
- package/dist-esm/lib/tools/SelectTool/childStates/PointingHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs +5 -14
- package/dist-esm/lib/tools/SelectTool/childStates/PointingResizeHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs +5 -12
- package/dist-esm/lib/tools/SelectTool/childStates/PointingRotateHandle.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +2 -3
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +2 -4
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +2 -2
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs +48 -0
- package/dist-esm/lib/tools/SelectTool/selectHelpers.mjs.map +2 -2
- package/dist-esm/lib/ui/TldrawUi.mjs +2 -41
- package/dist-esm/lib/ui/TldrawUi.mjs.map +2 -2
- package/dist-esm/lib/ui/components/A11y.mjs +5 -1
- package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ColorSchemeMenu.mjs +2 -2
- package/dist-esm/lib/ui/components/ColorSchemeMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs +10 -0
- package/dist-esm/lib/ui/components/ContextMenu/DefaultContextMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/InputModeMenu.mjs +2 -2
- package/dist-esm/lib/ui/components/InputModeMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +3 -2
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +2 -2
- package/dist-esm/lib/ui/components/LanguageMenu.mjs +2 -2
- package/dist-esm/lib/ui/components/LanguageMenu.mjs.map +2 -2
- package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuItem.mjs +1 -1
- package/dist-esm/lib/ui/components/SharePanel/DefaultPeopleMenuItem.mjs.map +2 -2
- package/dist-esm/lib/ui/components/menu-items.mjs +2 -2
- package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs +3 -2
- package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
- package/dist-esm/lib/ui/consumerMessages.mjs +0 -3
- package/dist-esm/lib/ui/consumerMessages.mjs.map +2 -2
- package/dist-esm/lib/ui/context/action-predicates.mjs +14 -5
- package/dist-esm/lib/ui/context/action-predicates.mjs.map +2 -2
- package/dist-esm/lib/ui/context/action-state.mjs +61 -0
- package/dist-esm/lib/ui/context/action-state.mjs.map +7 -0
- package/dist-esm/lib/ui/context/actions.mjs +107 -162
- package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useActionState.mjs +1 -42
- package/dist-esm/lib/ui/hooks/useActionState.mjs.map +2 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +12 -2
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +2 -2
- package/dist-esm/lib/ui/kbd-utils.mjs +7 -4
- package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
- package/dist-esm/lib/ui/overrides.mjs.map +2 -2
- package/dist-esm/lib/ui/version.mjs +3 -3
- package/dist-esm/lib/ui/version.mjs.map +1 -1
- package/dist-esm/lib/utils/frames/frames.mjs +1 -1
- package/dist-esm/lib/utils/frames/frames.mjs.map +2 -2
- package/dist-esm/lib/utils/text/richText.mjs +1 -1
- package/dist-esm/lib/utils/text/richText.mjs.map +2 -2
- package/dist-esm/lib/utils/tldr/file.mjs +10 -3
- package/dist-esm/lib/utils/tldr/file.mjs.map +2 -2
- package/package.json +6 -6
- package/src/lib/defaultExternalContentHandlers.ts +55 -11
- package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -0
- package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -0
- package/src/lib/shapes/frame/FrameShapeUtil.tsx +12 -8
- package/src/lib/shapes/frame/components/FrameHeading.tsx +6 -2
- package/src/lib/shapes/frame/frameHelpers.ts +2 -0
- package/src/lib/shapes/geo/GeoShapeUtil.tsx +4 -0
- package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +4 -0
- package/src/lib/shapes/image/ImageShapeUtil.tsx +4 -0
- package/src/lib/shapes/line/LineShapeUtil.tsx +4 -0
- package/src/lib/shapes/note/noteCloning.test.ts +28 -0
- package/src/lib/tools/SelectTool/childStates/Crop/children/Idle.ts +5 -10
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCrop.ts +6 -19
- package/src/lib/tools/SelectTool/childStates/Crop/children/PointingCropHandle.ts +5 -18
- package/src/lib/tools/SelectTool/childStates/Idle.ts +2 -4
- package/src/lib/tools/SelectTool/childStates/PointingCanvas.ts +2 -8
- package/src/lib/tools/SelectTool/childStates/PointingHandle.ts +5 -23
- package/src/lib/tools/SelectTool/childStates/PointingResizeHandle.ts +5 -20
- package/src/lib/tools/SelectTool/childStates/PointingRotateHandle.ts +5 -18
- package/src/lib/tools/SelectTool/childStates/PointingSelection.ts +2 -8
- package/src/lib/tools/SelectTool/childStates/PointingShape.ts +2 -9
- package/src/lib/tools/SelectTool/selectHelpers.ts +75 -0
- package/src/lib/ui/TldrawUi.tsx +2 -49
- package/src/lib/ui/components/A11y.tsx +10 -3
- package/src/lib/ui/components/ColorSchemeMenu.tsx +2 -2
- package/src/lib/ui/components/ContextMenu/DefaultContextMenu.tsx +14 -0
- package/src/lib/ui/components/InputModeMenu.tsx +2 -2
- package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +3 -2
- package/src/lib/ui/components/LanguageMenu.tsx +2 -2
- package/src/lib/ui/components/SharePanel/DefaultPeopleMenuItem.tsx +1 -1
- package/src/lib/ui/components/menu-items.tsx +2 -2
- package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +4 -2
- package/src/lib/ui/consumerMessages.ts +0 -3
- package/src/lib/ui/context/action-predicates.ts +26 -7
- package/src/lib/ui/context/action-state.ts +93 -0
- package/src/lib/ui/context/actions.tsx +142 -235
- package/src/lib/ui/hooks/useActionState.ts +2 -64
- package/src/lib/ui/hooks/useKeyboardShortcuts.ts +21 -4
- package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +1 -3
- package/src/lib/ui/kbd-utils.test.ts +19 -0
- package/src/lib/ui/kbd-utils.ts +11 -8
- package/src/lib/ui/overrides.ts +4 -0
- package/src/lib/ui/version.ts +3 -3
- package/src/lib/utils/frames/frames.ts +1 -1
- package/src/lib/utils/text/richText.test.ts +15 -0
- package/src/lib/utils/text/richText.ts +5 -4
- package/src/lib/utils/tldr/file.test.ts +72 -0
- package/src/lib/utils/tldr/file.ts +13 -4
- package/src/test/A11y.test.tsx +69 -6
- package/src/test/SelectTool.test.ts +0 -60
- package/src/test/commands/lockShapes.test.ts +60 -0
- package/src/test/cropping.test.ts +41 -66
- package/src/test/defaultHandleExternalFileContent.test.ts +186 -1
- package/src/test/deferredDoubleClick.test.ts +231 -0
- package/src/test/dragFromToolbar-dom.test.tsx +5 -2
- package/src/test/frames.test.ts +60 -0
- package/src/test/ui/ContextMenu.test.tsx +40 -0
- package/src/test/ui/FrameSelectionMenuItem.test.tsx +11 -2
- package/src/test/ui/actionGate.test.tsx +197 -0
- package/src/test/ui/actionGating.test.tsx +102 -1
- package/src/test/ui/actionPredicates.test.ts +24 -0
- package/src/test/ui/keyboardShortcuts.test.tsx +399 -26
- package/src/test/ui/menuActionItem.test.tsx +37 -0
package/DOCS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# tldraw Documentation
|
|
2
2
|
|
|
3
|
-
Version: `5.
|
|
3
|
+
Version: `5.7.0-canary.017ae8f4fa1b`
|
|
4
4
|
|
|
5
5
|
This file is generated during package publishing from the tldraw docs content for this exact package version.
|
|
6
6
|
|
|
@@ -383,6 +383,7 @@ We ship an experimental `tldraw-migrate` agent skill that helps a coding agent u
|
|
|
383
383
|
|
|
384
384
|
#### v5.x
|
|
385
385
|
|
|
386
|
+
- [v5.6](https://tldraw.dev/releases/v5.6.0) - ICU MessageFormat and react-intl for translations, action-driven menu gating, a ThrottledFunction type in @tldraw/utils, commenting improvements, and fixes across selection, undo/redo, local persistence, sync, and the store
|
|
386
387
|
- [v5.5](https://tldraw.dev/releases/v5.5.0) - Smart typography and matched-pair wrapping in rich text, pasting links onto shapes, a replaceable note attribution badge, TipTap's extension API re-exported from tldraw, and a reliability pass across the SDK
|
|
387
388
|
- [v5.4](https://tldraw.dev/releases/v5.4.0) - A center align operation, a tleditors registry of mounted editors, faster signals and store layers, and a broad reliability pass across the SDK
|
|
388
389
|
- [v5.3](https://tldraw.dev/releases/v5.3.0) - Commenting with anchored threads on the canvas, new collaboration packages, geo shape flipping, crop snapping, and faster viewport culling
|
|
@@ -2951,6 +2952,8 @@ OPENAI_API_KEY=<your key>
|
|
|
2951
2952
|
|
|
2952
2953
|
We recommend Anthropic for best results. Get an API key from the [Anthropic dashboard](https://console.anthropic.com/settings/keys).
|
|
2953
2954
|
|
|
2955
|
+
To use one [OpenRouter](https://openrouter.ai) key for every model instead, set `OPENROUTER_API_KEY`. The provider keys are then not used.
|
|
2956
|
+
|
|
2954
2957
|
---
|
|
2955
2958
|
|
|
2956
2959
|
#### Use cases
|
|
@@ -3026,6 +3029,8 @@ Aside from using the chat panel UI, you can also prompt the agent programmatical
|
|
|
3026
3029
|
|
|
3027
3030
|
Call the `prompt()` method to start an agentic loop. The agent will continue until it has finished the task you've given it.
|
|
3028
3031
|
|
|
3032
|
+
Each action is a tool call. The browser carries out the tool calls as they stream in, then sends their results back to the model in a follow-up request, with a new view of the canvas. The loop ends when the model replies without tool calls. A turn has at most 20 follow-up requests, and near that limit the model is told how many steps it has left.
|
|
3033
|
+
|
|
3029
3034
|
```tsx
|
|
3030
3035
|
// Inside a component wrapped by TldrawAgentAppProvider
|
|
3031
3036
|
const agent = useAgent()
|
|
@@ -3330,6 +3335,24 @@ override async applyAction(action: Streaming<CountryInfoAction>) {
|
|
|
3330
3335
|
}
|
|
3331
3336
|
```
|
|
3332
3337
|
|
|
3338
|
+
##### Report what an action did
|
|
3339
|
+
|
|
3340
|
+
The model reads what each action did as the result of its tool call. By default, the result lists the shapes that the action created, updated or deleted. To report something else, override `getResult` in the action util.
|
|
3341
|
+
|
|
3342
|
+
```ts
|
|
3343
|
+
override getResult() {
|
|
3344
|
+
return `Number of shapes on the canvas: ${this.editor.getCurrentPageShapes().length}`
|
|
3345
|
+
}
|
|
3346
|
+
```
|
|
3347
|
+
|
|
3348
|
+
When the model asks for something that cannot be done, throw an `ActionFailedError` from `applyAction`. Its message becomes the result, so the model can correct its mistake.
|
|
3349
|
+
|
|
3350
|
+
```ts
|
|
3351
|
+
if (!existingShape) {
|
|
3352
|
+
throw new ActionFailedError(`Shape ${action.update.shapeId} not found in canvas.`)
|
|
3353
|
+
}
|
|
3354
|
+
```
|
|
3355
|
+
|
|
3333
3356
|
##### Sanitize data received from the model
|
|
3334
3357
|
|
|
3335
3358
|
The model can make mistakes. Sometimes this is due to hallucinations, and sometimes this is due to the canvas changing since the last time the model saw it. Either way, an incoming action might contain invalid data by the time you receive it.
|
|
@@ -3446,6 +3469,10 @@ override getPart(request: AgentRequest, helpers: AgentHelpers): RandomShapePart
|
|
|
3446
3469
|
}
|
|
3447
3470
|
```
|
|
3448
3471
|
|
|
3472
|
+
##### Limit usage before you deploy
|
|
3473
|
+
|
|
3474
|
+
The starter kit has no usage limits. A public deployment pays for every request with your API keys, so add a limit per user, such as a budget of requests or spend, enforced on your server, before you deploy it publicly.
|
|
3475
|
+
|
|
3449
3476
|
##### Change the system prompt
|
|
3450
3477
|
|
|
3451
3478
|
To change the default system prompt, edit the sections in `worker/prompt/sections/`. These sections are assembled by `worker/prompt/buildSystemPrompt.ts`.
|
|
@@ -3485,14 +3512,16 @@ To add support for a different model, add the model's definition to `AGENT_MODEL
|
|
|
3485
3512
|
'claude-sonnet-5': {
|
|
3486
3513
|
name: 'claude-sonnet-5',
|
|
3487
3514
|
id: 'claude-sonnet-5',
|
|
3515
|
+
openRouterId: 'anthropic/claude-sonnet-5',
|
|
3488
3516
|
provider: 'anthropic',
|
|
3489
|
-
supportsPrefill: false,
|
|
3490
3517
|
supportsTemperature: false,
|
|
3491
3518
|
thinking: 'adaptive',
|
|
3492
3519
|
effort: 'low',
|
|
3493
3520
|
}
|
|
3494
3521
|
```
|
|
3495
3522
|
|
|
3523
|
+
`openRouterId` is the model's id on [OpenRouter](https://openrouter.ai/models), which the kit uses when `OPENROUTER_API_KEY` is set.
|
|
3524
|
+
|
|
3496
3525
|
If you need to add any extra setup or configuration for your provider, you can add it to the `worker/do/AgentService.ts` file.
|
|
3497
3526
|
|
|
3498
3527
|
##### Support custom shapes
|
|
@@ -3812,9 +3841,11 @@ npm create tldraw@latest -- --template branching-chat
|
|
|
3812
3841
|
Then create a `.env` file in the project root with an API key from [Google AI Studio](https://aistudio.google.com/apikey):
|
|
3813
3842
|
|
|
3814
3843
|
```
|
|
3815
|
-
|
|
3844
|
+
GOOGLE_API_KEY=<your key>
|
|
3816
3845
|
```
|
|
3817
3846
|
|
|
3847
|
+
To send requests through [OpenRouter](https://openrouter.ai) instead, set `OPENROUTER_API_KEY`.
|
|
3848
|
+
|
|
3818
3849
|
---
|
|
3819
3850
|
|
|
3820
3851
|
#### Use cases
|
|
@@ -4383,7 +4414,7 @@ editor.user.updateUserPreferences({
|
|
|
4383
4414
|
})
|
|
4384
4415
|
```
|
|
4385
4416
|
|
|
4386
|
-
When disabled,
|
|
4417
|
+
When disabled, tool keys and action shortcuts like `R` or `Ctrl/Cmd+D` stop firing, so they don't interfere with assistive technology shortcuts. The keys that operate a selection still work: Tab and the arrow keys for navigation, Enter to edit, Escape to cancel, and Delete or Backspace to delete. So do the accessibility shortcuts that move focus to the style panel (Ctrl/Cmd+Enter), open the context menu (Ctrl/Cmd+Shift+Enter), and repeat the selection's description (Alt+R).
|
|
4387
4418
|
|
|
4388
4419
|
#### Accessibility menu
|
|
4389
4420
|
|
|
@@ -4482,19 +4513,19 @@ Keyboard shortcuts are bound automatically. The `useKeyboardShortcuts` hook pars
|
|
|
4482
4513
|
|
|
4483
4514
|
The `TLUiActionItem` interface defines what an action contains:
|
|
4484
4515
|
|
|
4485
|
-
| Property | Description
|
|
4486
|
-
| ---------------------- |
|
|
4487
|
-
| `id` | Unique identifier for the action (e.g., `'duplicate'`, `'zoom-in'`)
|
|
4488
|
-
| `label` | Translation key for display text. Can be a string or an object mapping contexts to different keys (see [Context-sensitive labels](#context-sensitive-labels))
|
|
4489
|
-
| `icon` | Icon name from tldraw's icon set, or a custom React element
|
|
4490
|
-
| `kbd` | Keyboard shortcut string. Use commas to bind several combinations, e.g. `'cmd+g,ctrl+g'` (see [Keyboard shortcuts](#keyboard-shortcuts))
|
|
4491
|
-
| `readonlyOk` | When `true`, the action
|
|
4492
|
-
| `checkbox` | When `true`, renders as a toggle with a checkmark indicator in menus
|
|
4493
|
-
| `isRequiredA11yAction` | When `true`, the keyboard shortcut works even when shortcuts are normally disabled (e.g., while editing a shape). Used for accessibility actions
|
|
4494
|
-
| `isAvailable` | Optional `(editor) => boolean`. When it returns `false`, menus hide the action (see [Enabling and checking actions](#enabling-and-checking-actions))
|
|
4495
|
-
| `isEnabled` | Optional `(editor) => boolean`. When it returns `false`, menus disable or hide the action
|
|
4496
|
-
| `isChecked` | Optional `(editor) => boolean`. For checkbox actions, whether the item shows as checked
|
|
4497
|
-
| `onSelect` | Handler called when the action is triggered. Receives a `TLUiEventSource` indicating the trigger origin (`'kbd'`, `'menu'`, `'toolbar'`, etc.)
|
|
4516
|
+
| Property | Description |
|
|
4517
|
+
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
4518
|
+
| `id` | Unique identifier for the action (e.g., `'duplicate'`, `'zoom-in'`) |
|
|
4519
|
+
| `label` | Translation key for display text. Can be a string or an object mapping contexts to different keys (see [Context-sensitive labels](#context-sensitive-labels)) |
|
|
4520
|
+
| `icon` | Icon name from tldraw's icon set, or a custom React element |
|
|
4521
|
+
| `kbd` | Keyboard shortcut string. Use commas to bind several combinations, e.g. `'cmd+g,ctrl+g'` (see [Keyboard shortcuts](#keyboard-shortcuts)) |
|
|
4522
|
+
| `readonlyOk` | When `true`, the action runs in readonly mode; otherwise it doesn't run, however it's triggered. Defaults to `false` |
|
|
4523
|
+
| `checkbox` | When `true`, renders as a toggle with a checkmark indicator in menus |
|
|
4524
|
+
| `isRequiredA11yAction` | When `true`, the keyboard shortcut works even when shortcuts are normally disabled (e.g., while editing a shape). Used for accessibility actions |
|
|
4525
|
+
| `isAvailable` | Optional `(editor) => boolean`. When it returns `false`, menus hide the action, and the action doesn't run (see [Enabling and checking actions](#enabling-and-checking-actions)) |
|
|
4526
|
+
| `isEnabled` | Optional `(editor) => boolean`. When it returns `false`, menus disable or hide the action, and the action doesn't run |
|
|
4527
|
+
| `isChecked` | Optional `(editor) => boolean`. For checkbox actions, whether the item shows as checked |
|
|
4528
|
+
| `onSelect` | Handler called when the action is triggered. Receives a `TLUiEventSource` indicating the trigger origin (`'kbd'`, `'menu'`, `'toolbar'`, etc.) |
|
|
4498
4529
|
|
|
4499
4530
|
#### Accessing actions
|
|
4500
4531
|
|
|
@@ -4523,13 +4554,14 @@ The default actions cover most editing operations you'd expect in a canvas appli
|
|
|
4523
4554
|
| Category | Action ids |
|
|
4524
4555
|
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
4525
4556
|
| Editing | `undo`, `redo`, `duplicate`, `delete`, `copy`, `cut`, `paste` |
|
|
4526
|
-
| Grouping | `group`, `ungroup`
|
|
4557
|
+
| Grouping | `group`, `ungroup`, `toggle-group` |
|
|
4558
|
+
| Frames | `frame-selection`, `remove-frame`, `toggle-frame`, `fit-frame-to-content` |
|
|
4527
4559
|
| Arrangement | `bring-to-front`, `bring-forward`, `send-backward`, `send-to-back`, `align-left`, `align-center-horizontal`, `align-right`, `distribute-horizontal`, `distribute-vertical` |
|
|
4528
4560
|
| Export | `export-as-svg`, `export-as-png`, `copy-as-svg`, `copy-as-png` |
|
|
4529
4561
|
| Zoom | `zoom-in`, `zoom-out`, `zoom-to-100`, `zoom-to-fit`, `zoom-to-selection`, `select-zoom-tool` |
|
|
4530
4562
|
| Preferences | `toggle-dark-mode`, `toggle-snap-mode`, `toggle-grid`, `toggle-focus-mode` |
|
|
4531
4563
|
|
|
4532
|
-
The full list is in the [default actions source](https://github.com/tldraw/tldraw/blob/main/packages/tldraw/src/lib/ui/context/actions.tsx).
|
|
4564
|
+
The full list is in the [default actions source](https://github.com/tldraw/tldraw/blob/main/packages/tldraw/src/lib/ui/context/actions.tsx). An action doesn't run when its `isAvailable` or `isEnabled` returns false, or when the editor is readonly and it isn't `readonlyOk`, including when you call `onSelect` on an action from `useActions()`. For example, `group` does nothing unless two or more unlocked shapes are selected in the select tool.
|
|
4533
4565
|
|
|
4534
4566
|
#### Overriding actions
|
|
4535
4567
|
|
|
@@ -4555,7 +4587,9 @@ function App() {
|
|
|
4555
4587
|
}
|
|
4556
4588
|
```
|
|
4557
4589
|
|
|
4558
|
-
The `copy`, `cut`, and `paste` shortcuts are handled by native clipboard events rather than the `kbd` system, so changing their `kbd` has no effect.
|
|
4590
|
+
The `copy`, `cut`, and `paste` shortcuts are handled by native clipboard events rather than the `kbd` system, so changing their `kbd` or `isEnabled` has no effect on them.
|
|
4591
|
+
|
|
4592
|
+
Cmd+G and Cmd+Alt+G belong to `toggle-group` and `toggle-frame`, which run `group` or `ungroup`, and `frame-selection` or `remove-frame`, depending on the selection. To change or remove those shortcuts, override the toggle actions, not `group` or `frame-selection`.
|
|
4559
4593
|
|
|
4560
4594
|
##### Modifying behavior
|
|
4561
4595
|
|
|
@@ -4581,7 +4615,7 @@ You can call the original handler before or after your custom logic, or replace
|
|
|
4581
4615
|
|
|
4582
4616
|
##### Adding custom actions
|
|
4583
4617
|
|
|
4584
|
-
Add new actions by inserting them into the actions record
|
|
4618
|
+
Add new actions by inserting them into the actions record. The `actions` map passed to `overrides` isn't gated yet, so calling a built-in's `onSelect` on it from inside a custom action skips the readonly check, `isAvailable` and `isEnabled`. Before you call it, check `editor.getIsReadonly()` (unless it's `readonlyOk`) and whichever of `isAvailable` and `isEnabled` it defines. Actions you get from `useActions()` in component code are gated.
|
|
4585
4619
|
|
|
4586
4620
|
```typescript
|
|
4587
4621
|
const overrides: TLUiOverrides = {
|
|
@@ -4720,7 +4754,7 @@ actions['make-red'] = {
|
|
|
4720
4754
|
}
|
|
4721
4755
|
```
|
|
4722
4756
|
|
|
4723
|
-
|
|
4757
|
+
Menus, keyboard shortcuts and `onSelect` calls on actions from `useActions()` all respect `isEnabled`, so `onSelect` doesn't need to check it again. The gate comes from the action as `overrides` returned it, so changing `isEnabled` on a copy of an action from `useActions()` doesn't change when it runs; override it instead. The exception is the copy, cut and paste shortcuts: they come from native clipboard events, which don't check the action's `isEnabled`.
|
|
4724
4758
|
|
|
4725
4759
|
When you change a built-in action, spread the original so it keeps its `isAvailable`, `isEnabled` and `isChecked`:
|
|
4726
4760
|
|
|
@@ -4728,7 +4762,7 @@ When you change a built-in action, spread the original so it keeps its `isAvaila
|
|
|
4728
4762
|
actions['group'] = { ...actions['group'], onSelect: myGroup }
|
|
4729
4763
|
```
|
|
4730
4764
|
|
|
4731
|
-
Replacing an action with a new object drops them
|
|
4765
|
+
Replacing an action with a new object drops them, along with `readonlyOk`: menus show it as always enabled, a checkbox item for it always shows as unchecked, shortcuts and `onSelect` calls run it whatever the selection, and if the built-in was `readonlyOk`, it stops running while the editor is readonly.
|
|
4732
4766
|
|
|
4733
4767
|
Use `isAvailable` instead when the action doesn't exist in the current context at all, rather than being blocked right now. Every menu item hides an unavailable action, whatever `whenDisabled` says; only the keyboard shortcuts dialog still lists it. The built-in paste (without clipboard read access), copy as PNG (without clipboard write access), copy as JSON (outside debug mode), cursor chat (on touch), exit pen mode, stop following, and back to content work this way.
|
|
4734
4768
|
|
|
@@ -10947,7 +10981,7 @@ editor.createShape({
|
|
|
10947
10981
|
|
|
10948
10982
|
#### Creating frames
|
|
10949
10983
|
|
|
10950
|
-
You can create a frame programmatically with `Editor#createShape`, or interactively with the frame tool. The frame tool ships in the default toolbar; users can also press `F` to switch to it. The **Frame selection** action
|
|
10984
|
+
You can create a frame programmatically with `Editor#createShape`, or interactively with the frame tool. The frame tool ships in the default toolbar; users can also press `F` to switch to it. The **Frame selection** action wraps the current selection in a new frame. `Cmd/Ctrl+Alt+G` runs the `toggle-frame` action: it frames the selection, or removes the frame if only frames are selected. Override `toggle-frame` to rebind it.
|
|
10951
10985
|
|
|
10952
10986
|
When the user drags a frame around existing shapes, the frame tool reparents any sibling shapes that fall fully inside the frame's bounds. Locked shapes are skipped. This is what makes "draw a frame around the things I want to group" work as a single gesture.
|
|
10953
10987
|
|
|
@@ -11030,7 +11064,7 @@ import { removeFrame } from 'tldraw'
|
|
|
11030
11064
|
removeFrame(editor, [frameId])
|
|
11031
11065
|
```
|
|
11032
11066
|
|
|
11033
|
-
The **Remove frame** and **Fit frame to content** actions in the main menu and the context menu's Edit submenu call these helpers when a frame is selected. **
|
|
11067
|
+
The **Remove frame** and **Fit frame to content** actions in the main menu and the context menu's Edit submenu call these helpers when a frame is selected. **Remove frame** (`remove-frame`) has its own shortcut, `Cmd/Ctrl+Alt+Shift+G`.
|
|
11034
11068
|
|
|
11035
11069
|
#### Exporting frames
|
|
11036
11070
|
|
|
@@ -11934,7 +11968,7 @@ editor.groupShapes([shapeId1, shapeId2], {
|
|
|
11934
11968
|
})
|
|
11935
11969
|
```
|
|
11936
11970
|
|
|
11937
|
-
Grouping requires at least two shapes. The method does nothing if you pass fewer, and it skips [locked shapes](https://tldraw.dev/sdk-features/locked-shapes). Users can also group shapes with Ctrl+G (Cmd+G on Mac)
|
|
11971
|
+
Grouping requires at least two shapes. The method does nothing if you pass fewer, and it skips [locked shapes](https://tldraw.dev/sdk-features/locked-shapes). Users can also group shapes with Ctrl+G (Cmd+G on Mac). Pressing the shortcut again with the resulting group selected ungroups it. The shortcut belongs to the `toggle-group` action, so override that action to rebind it.
|
|
11938
11972
|
|
|
11939
11973
|
The new group is positioned at the top-left of the combined bounds of all grouped shapes. It takes the z-index of the topmost grouped shape, so it sits where that shape was in its parent's layer stack.
|
|
11940
11974
|
|
|
@@ -13811,12 +13845,12 @@ Data collection differs by license type:
|
|
|
13811
13845
|
|
|
13812
13846
|
| License type | Data sent |
|
|
13813
13847
|
| ------------ | --------------------------------------------------- |
|
|
13814
|
-
| Commercial | None
|
|
13848
|
+
| Commercial | None by default |
|
|
13815
13849
|
| Hobby | License ID, license type, SDK version, and page URL |
|
|
13816
13850
|
| Trial | License ID, license type, SDK version, and page URL |
|
|
13817
13851
|
| Unlicensed | SDK version and page URL (production only) |
|
|
13818
13852
|
|
|
13819
|
-
Trial and hobby licenses ping tldraw's servers with the license ID, license type, SDK version, build environment, and deployment URL for analytics. No user data, canvas content, or personally identifiable information is collected. Nothing is sent from development environments.
|
|
13853
|
+
Commercial licenses send nothing unless the key is issued as tracked, for example a key without a fixed domain. Tracked keys send the same ping as trial keys. Trial and hobby licenses ping tldraw's servers with the license ID, license type, SDK version, build environment, and deployment URL for analytics. No user data, canvas content, or personally identifiable information is collected. Nothing is sent from development environments.
|
|
13820
13854
|
|
|
13821
13855
|
#### Troubleshooting
|
|
13822
13856
|
|
|
@@ -16976,6 +17010,8 @@ editor.flipShapes([box1, box2], 'vertical')
|
|
|
16976
17010
|
|
|
16977
17011
|
When flipping groups, the editor includes all children of the group so the whole hierarchy flips together. Shapes can opt out of flipping by returning `false` from `ShapeUtil#canBeLaidOut`; arrows do this when the shape they're bound to isn't part of the flip.
|
|
16978
17012
|
|
|
17013
|
+
The default UI only offers flip for a single selected shape when `ShapeUtil#canFlip` returns `true`, meaning flipping changes the shape itself by mirroring it or toggling its stored flip. `Editor#flipShapes` doesn't check it. It defaults to `false`; the built-in group, image, arrow, line, draw, highlight and geo shapes return `true`. Override it in your shape util if your shape changes when flipped. Shapes that return `false` still move with the rest of a multi-shape flip.
|
|
17014
|
+
|
|
16979
17015
|
##### Rotation
|
|
16980
17016
|
|
|
16981
17017
|
`Editor#rotateShapesBy` rotates shapes by a delta in radians around a common center point. The editor calculates the center of all the shapes' rotated bounds, then rotates each shape around that point and around its own origin: shapes orbit the selection center while also rotating individually. Pass `{ center }` to rotate around a different point.
|
|
@@ -21135,7 +21171,7 @@ License keys are validated **on the client**. You can use them offline. They can
|
|
|
21135
21171
|
|
|
21136
21172
|
#### Data collection
|
|
21137
21173
|
|
|
21138
|
-
When using the tldraw SDK under a commercial or hobby license, no information is sent to tldraw.
|
|
21174
|
+
When using the tldraw SDK under a commercial or hobby license, no information is sent to tldraw by default. Some commercial keys, such as those issued without a fixed domain, are tracked and send the same ping as a trial license.
|
|
21139
21175
|
|
|
21140
21176
|
When using the tldraw SDK in production under a trial license, the tldraw SDK will ping tldraw's servers with a hash of the license key. This information is primarily for analytics purposes. No user data, canvas contents, or personally-identifiable information (PII) is sent or saved.
|
|
21141
21177
|
|
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,39 +1,79 @@
|
|
|
1
1
|
# Releases
|
|
2
2
|
|
|
3
|
-
Version: `5.
|
|
3
|
+
Version: `5.7.0-canary.017ae8f4fa1b`
|
|
4
4
|
|
|
5
5
|
This file is generated during package publishing from the tldraw release notes content for this exact package version.
|
|
6
6
|
|
|
7
7
|
## v5.6.0
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
[View on GitHub](https://github.com/tldraw/tldraw/releases/tag/v5.6.0)
|
|
10
|
+
|
|
11
|
+
This 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.
|
|
12
|
+
|
|
13
|
+
### What's new
|
|
14
|
+
|
|
15
|
+
#### ICU MessageFormat and react-intl for translations ([#8036](https://github.com/tldraw/tldraw/pull/8036))
|
|
16
|
+
|
|
17
|
+
The 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.
|
|
18
|
+
|
|
19
|
+
Existing translations overridden by ID through `overrides.translations` continue to work unchanged.
|
|
10
20
|
|
|
11
21
|
### API changes
|
|
12
22
|
|
|
13
|
-
- Add
|
|
23
|
+
- 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))
|
|
14
24
|
- 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))
|
|
15
25
|
- `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))
|
|
26
|
+
- 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))
|
|
27
|
+
- 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))
|
|
28
|
+
- `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))
|
|
29
|
+
- 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))
|
|
16
30
|
|
|
17
31
|
### Improvements
|
|
18
32
|
|
|
19
33
|
- 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))
|
|
34
|
+
- 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))
|
|
35
|
+
- Add a **Comment** item to the default canvas context menu when commenting is configured. It opens the comment composer where you right-clicked. ([#11095](https://github.com/tldraw/tldraw/pull/11095))
|
|
36
|
+
- Move the comments filter menu to the right of the hide comments toggle in the comments panel header. ([#11135](https://github.com/tldraw/tldraw/pull/11135))
|
|
37
|
+
- Cancel comment draft placement and return to the select tool when clicking the canvas, instead of moving the draft comment. ([#10969](https://github.com/tldraw/tldraw/pull/10969))
|
|
20
38
|
- Draw the hinted outline around shapes, such as a frame you're dragging a shape into, at 2px instead of 2.5px. ([#10952](https://github.com/tldraw/tldraw/pull/10952))
|
|
21
39
|
- Speed up `store.query.index()` and `store.query.ids()` updates by no longer allocating for each change. ([#10228](https://github.com/tldraw/tldraw/pull/10228))
|
|
22
40
|
|
|
23
41
|
### Bug fixes
|
|
24
42
|
|
|
25
43
|
- Fix the edge scrolling preference showing as off when edge scrolling is on at a speed other than 1, such as 0.5 or 2. ([#11038](https://github.com/tldraw/tldraw/pull/11038))
|
|
44
|
+
- Fix edge scrolling jumping to partial speed after its start delay. ([#11126](https://github.com/tldraw/tldraw/pull/11126))
|
|
26
45
|
- Fix three resize issues: flipping a rotated selection gave its children the wrong rotation, shapes not aligned with the selection received `onResizeStart` and `onResizeEnd` more than once, and `resizeBox` slid the fixed edge when a shape hit its `maxWidth` or `maxHeight`. ([#10351](https://github.com/tldraw/tldraw/pull/10351))
|
|
27
46
|
- Fix duplicating a page moving its shapes when they were off screen, and starting the new page with the current page's camera instead of the duplicated page's. ([#10465](https://github.com/tldraw/tldraw/pull/10465))
|
|
47
|
+
- Fix the page menu closing and getting stuck mid-drag when Escape is pressed while reordering pages. ([#11115](https://github.com/tldraw/tldraw/pull/11115))
|
|
48
|
+
- Fix an empty line under a heading in a text shape that could not be deleted. ([#11114](https://github.com/tldraw/tldraw/pull/11114))
|
|
49
|
+
- Fix the "rhombus-2" (rhombus left) geo tool showing a raw translation key as its label. ([#11062](https://github.com/tldraw/tldraw/pull/11062))
|
|
50
|
+
- Fix the keyboard shortcuts dialog opening via keyboard shortcut when `KeyboardShortcutsDialog` is overridden with `null`. ([#11019](https://github.com/tldraw/tldraw/pull/11019))
|
|
51
|
+
- Fix the rich text toolbar reporting the wrong operation in `onUiEvent` for italic, code, and highlight. ([#11018](https://github.com/tldraw/tldraw/pull/11018))
|
|
52
|
+
- Fix undo after double-clicking a frame's corner or edge to fit it to content creating an inconsistent history step. ([#11075](https://github.com/tldraw/tldraw/pull/11075))
|
|
53
|
+
- Fix undo reverting an earlier edit after brushing to select, right-clicking an empty canvas to deselect, pressing Enter on a group, or navigating the selection with the keyboard. ([#10476](https://github.com/tldraw/tldraw/pull/10476))
|
|
54
|
+
- Fix clicking a child of a locked group selecting the locked group. ([#10180](https://github.com/tldraw/tldraw/pull/10180))
|
|
55
|
+
- Fix bookmarks, notes, and other non-resizing shapes being mispositioned when their containing group is resized or flipped. ([#10619](https://github.com/tldraw/tldraw/pull/10619))
|
|
56
|
+
- Fix bounds snapping not engaging while resizing or cropping shapes inside slightly rotated frames or groups. ([#10181](https://github.com/tldraw/tldraw/pull/10181))
|
|
28
57
|
- Fix the arrow tool's precise mode carrying over when you move to a different target shape. ([#10244](https://github.com/tldraw/tldraw/pull/10244))
|
|
29
58
|
- Fix holding Cmd/Ctrl+Shift+Arrow switching from selecting a parent or child to selecting the adjacent shape once the key starts repeating. ([#10184](https://github.com/tldraw/tldraw/pull/10184))
|
|
59
|
+
- Fix arrow-key nudging moving diagonally after using a Cmd+Arrow shortcut on macOS. ([#10892](https://github.com/tldraw/tldraw/pull/10892))
|
|
60
|
+
- Fix the eraser sometimes dropping a highlighted shape when dragging near a group. ([#10182](https://github.com/tldraw/tldraw/pull/10182))
|
|
30
61
|
- Fix `editor.setCursor` throwing for the rotate and resize cursor types, and hex cursor colors breaking SVG cursors. ([#10350](https://github.com/tldraw/tldraw/pull/10350))
|
|
62
|
+
- Fix `editor.animateShapes` throwing a `TypeError` when interpolating draw or highlight shapes to or from empty segments. ([#10771](https://github.com/tldraw/tldraw/pull/10771))
|
|
63
|
+
- Fix the laser tool crashing when its scribble session times out mid-stroke. ([#10781](https://github.com/tldraw/tldraw/pull/10781))
|
|
64
|
+
- Fix scribbles added without points disappearing after one idle frame before points could be added on pointer move. ([#10336](https://github.com/tldraw/tldraw/pull/10336))
|
|
65
|
+
- Fix hit testing and viewport culling using stale bounds when text fonts finish loading after measurement, and fix container descendants retaining stale current-page membership when reparented to another page. ([#10341](https://github.com/tldraw/tldraw/pull/10341))
|
|
31
66
|
- Fix edits being lost when an editor remounts with the same `persistenceKey` while the previous one is still saving. ([#10752](https://github.com/tldraw/tldraw/pull/10752))
|
|
67
|
+
- Fix the comment composer requiring a second tap before focusing and raising the software keyboard on iOS. ([#9957](https://github.com/tldraw/tldraw/pull/9957))
|
|
32
68
|
- Fix store changes made in the last frame before a listener is removed never reaching that listener. ([#10802](https://github.com/tldraw/tldraw/pull/10802))
|
|
33
69
|
- Fix a reaction that writes to the store re-running on every unrelated store change. ([#10236](https://github.com/tldraw/tldraw/pull/10236))
|
|
34
70
|
- Fix undo restoring an in-between state after a single `put` updated the same record twice. ([#10203](https://github.com/tldraw/tldraw/pull/10203))
|
|
71
|
+
- Fix store listeners and `extractingChanges` receiving changes from transactions that rolled back. ([#10205](https://github.com/tldraw/tldraw/pull/10205))
|
|
72
|
+
- Fix computed caches in `store.query` not re-running their derive functions when a previously removed record is recreated with the same ID. ([#10225](https://github.com/tldraw/tldraw/pull/10225))
|
|
35
73
|
- Fix `migrateStoreSnapshot` throwing on a malformed persisted schema instead of returning a migration error. ([#10220](https://github.com/tldraw/tldraw/pull/10220))
|
|
36
74
|
- Fix migrations rerunning on records when a persisted schema's sequence version isn't a number. ([#10917](https://github.com/tldraw/tldraw/pull/10917))
|
|
75
|
+
- Fix a record deleted while offline occasionally reappearing after reconnecting. ([#10997](https://github.com/tldraw/tldraw/pull/10997))
|
|
76
|
+
- Fix large chunked sync messages being dropped and active sessions being cancelled by a previous socket's late close or error when reconnecting with the same session ID. ([#11067](https://github.com/tldraw/tldraw/pull/11067))
|
|
37
77
|
- Fix a resumed sync session on a hibernating host skipping the version checks made on first connect, so after a server redeploy a client could be sent changes its schema couldn't handle. It's now rejected with `SERVER_TOO_OLD` or `CLIENT_TOO_OLD`, as on connect. ([#10122](https://github.com/tldraw/tldraw/pull/10122))
|
|
38
78
|
- Fix a record field set to `undefined` getting the sync session kicked with `INVALID_RECORD`, and ignore `__proto__` keys in incoming changes. ([#10118](https://github.com/tldraw/tldraw/pull/10118))
|
|
39
79
|
- Fix older sync clients (protocol version 7) silently falling out of sync when the server sent them text-append changes they don't support. ([#10095](https://github.com/tldraw/tldraw/pull/10095))
|
|
@@ -219,6 +259,29 @@ import { Mark, mergeAttributes } from 'tldraw'
|
|
|
219
259
|
|
|
220
260
|
- Fix `create-tldraw --no-telemetry` being ignored. ([#10789](https://github.com/tldraw/tldraw/pull/10789))
|
|
221
261
|
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
### Patch releases
|
|
265
|
+
|
|
266
|
+
#### v5.5.1
|
|
267
|
+
|
|
268
|
+
- Fix shape hover and selection feeling offset below shapes, caused by the default cursor's hotspot sitting above its visible tip. ([#11033](https://github.com/tldraw/tldraw/pull/11033))
|
|
269
|
+
|
|
270
|
+
[View release on GitHub](https://github.com/tldraw/tldraw/releases/tag/v5.5.1)
|
|
271
|
+
|
|
272
|
+
#### v5.5.2
|
|
273
|
+
|
|
274
|
+
- Fix license domain validation for pages loaded from `blob:` URLs. ([#11040](https://github.com/tldraw/tldraw/pull/11040))
|
|
275
|
+
|
|
276
|
+
[View release on GitHub](https://github.com/tldraw/tldraw/releases/tag/v5.5.2)
|
|
277
|
+
|
|
278
|
+
#### v5.5.4
|
|
279
|
+
|
|
280
|
+
- Increase the default hit test margin from 3 to 4.5, making shape edges easier to hover and select. ([#11108](https://github.com/tldraw/tldraw/pull/11108))
|
|
281
|
+
- Add a tracked license flag that always sends the tracking ping. ([#11178](https://github.com/tldraw/tldraw/pull/11178))
|
|
282
|
+
|
|
283
|
+
[View release on GitHub](https://github.com/tldraw/tldraw/releases/tag/v5.5.4)
|
|
284
|
+
|
|
222
285
|
## v5.4.0
|
|
223
286
|
|
|
224
287
|
[View on GitHub](https://github.com/tldraw/tldraw/releases/tag/v5.4.0)
|
package/dist-cjs/index.d.ts
CHANGED
|
@@ -432,6 +432,7 @@ export declare class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
|
|
|
432
432
|
} & Partial<Omit<TLArrowShape, "id" | "meta" | "props" | "type">>) | undefined;
|
|
433
433
|
onTranslate(initialShape: TLArrowShape, shape: TLArrowShape): void;
|
|
434
434
|
private readonly _resizeInitialBindings;
|
|
435
|
+
canFlip(): boolean;
|
|
435
436
|
onResize(shape: TLArrowShape, info: TLResizeInfo<TLArrowShape>): {
|
|
436
437
|
props: {
|
|
437
438
|
bend: number;
|
|
@@ -1685,6 +1686,7 @@ export declare class DrawShapeUtil extends ShapeUtil<TLDrawShape> {
|
|
|
1685
1686
|
getIndicatorPath(shape: TLDrawShape): Path2D;
|
|
1686
1687
|
toSvg(shape: TLDrawShape, ctx: SvgExportContext): JSX.Element;
|
|
1687
1688
|
getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[];
|
|
1689
|
+
canFlip(): boolean;
|
|
1688
1690
|
onResize(shape: TLDrawShape, info: TLResizeInfo<TLDrawShape>): {
|
|
1689
1691
|
props: {
|
|
1690
1692
|
scaleX: number;
|
|
@@ -2304,6 +2306,7 @@ export declare class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
|
|
|
2304
2306
|
getIndicatorPath(shape: TLGeoShape): Path2D | undefined;
|
|
2305
2307
|
toSvg(shape: TLGeoShape, ctx: SvgExportContext): JSX.Element;
|
|
2306
2308
|
getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[];
|
|
2309
|
+
canFlip(): boolean;
|
|
2307
2310
|
onResize(shape: TLGeoShape, { handle, newPoint, scaleX, scaleY, initialShape }: TLResizeInfo<TLGeoShape>): {
|
|
2308
2311
|
props: {
|
|
2309
2312
|
flipX: boolean;
|
|
@@ -2779,6 +2782,7 @@ export declare class HighlightShapeUtil extends ShapeUtil<TLHighlightShape> {
|
|
|
2779
2782
|
getIndicatorPath(shape: TLHighlightShape): Path2D;
|
|
2780
2783
|
toSvg(shape: TLHighlightShape, ctx: SvgExportContext): JSX.Element;
|
|
2781
2784
|
toBackgroundSvg(shape: TLHighlightShape, ctx: SvgExportContext): JSX.Element;
|
|
2785
|
+
canFlip(): boolean;
|
|
2782
2786
|
onResize(shape: TLHighlightShape, info: TLResizeInfo<TLHighlightShape>): {
|
|
2783
2787
|
props: {
|
|
2784
2788
|
scaleX: number;
|
|
@@ -2844,6 +2848,7 @@ export declare class ImageShapeUtil extends BaseBoxShapeUtil<TLImageShape> {
|
|
|
2844
2848
|
createShapeForAsset(asset: TLAsset, position: VecModel): null | TLShapePartial;
|
|
2845
2849
|
getGeometry(shape: TLImageShape): Geometry2d;
|
|
2846
2850
|
getAriaDescriptor(shape: TLImageShape): string;
|
|
2851
|
+
canFlip(): boolean;
|
|
2847
2852
|
onResize(shape: TLImageShape, info: TLResizeInfo<TLImageShape>): TLImageShape;
|
|
2848
2853
|
component(shape: TLImageShape): JSX.Element;
|
|
2849
2854
|
getIndicatorPath(shape: TLImageShape): Path2D | undefined;
|
|
@@ -2923,6 +2928,7 @@ export declare class LineShapeUtil extends ShapeUtil<TLLineShape> {
|
|
|
2923
2928
|
getDefaultProps(): TLLineShape['props'];
|
|
2924
2929
|
getGeometry(shape: TLLineShape): PathBuilderGeometry2d;
|
|
2925
2930
|
getHandles(shape: TLLineShape): TLHandle[];
|
|
2931
|
+
canFlip(): boolean;
|
|
2926
2932
|
onResize(shape: TLLineShape, info: TLResizeInfo<TLLineShape>): {
|
|
2927
2933
|
props: {
|
|
2928
2934
|
points: {
|
|
@@ -4932,19 +4938,21 @@ export declare interface TLUiActionItem<TransationKey extends string = string, I
|
|
|
4932
4938
|
label?: {
|
|
4933
4939
|
[key: string]: TransationKey;
|
|
4934
4940
|
} | TransationKey;
|
|
4941
|
+
/** When `true`, the action runs while the editor is readonly. Defaults to `false`. */
|
|
4935
4942
|
readonlyOk?: boolean;
|
|
4936
4943
|
checkbox?: boolean;
|
|
4937
4944
|
isRequiredA11yAction?: boolean;
|
|
4938
4945
|
/**
|
|
4939
4946
|
* Whether the action exists in the current context at all, e.g. clipboard support or debug
|
|
4940
|
-
* mode.
|
|
4941
|
-
*
|
|
4947
|
+
* mode. When false, menus hide the item (the keyboard shortcuts dialog still lists it) and the
|
|
4948
|
+
* action doesn't run from a menu, a shortcut or `useActions()`. Must be pure and read only
|
|
4949
|
+
* editor state.
|
|
4942
4950
|
*/
|
|
4943
4951
|
isAvailable?(editor: Editor): boolean;
|
|
4944
4952
|
/**
|
|
4945
|
-
* Whether the action can run now.
|
|
4946
|
-
*
|
|
4947
|
-
* that state changes, so anything else it reads goes stale.
|
|
4953
|
+
* Whether the action can run now. When false, menus disable or hide the item and the action
|
|
4954
|
+
* doesn't run from a menu, a shortcut or `useActions()`. Must be pure and read only editor
|
|
4955
|
+
* state: menus re-run it when that state changes, so anything else it reads goes stale.
|
|
4948
4956
|
*/
|
|
4949
4957
|
isEnabled?(editor: Editor): boolean;
|
|
4950
4958
|
/** For checkbox actions: whether the item shows as checked. Must be pure and read only editor state. */
|
|
@@ -5635,6 +5643,10 @@ export declare type TLUiOverrideHelpers = ReturnType<typeof useDefaultHelpers>;
|
|
|
5635
5643
|
|
|
5636
5644
|
/** @public */
|
|
5637
5645
|
export declare interface TLUiOverrides {
|
|
5646
|
+
/**
|
|
5647
|
+
* The `actions` passed in aren't gated yet: calling one's `onSelect` here skips the readonly
|
|
5648
|
+
* check, `isAvailable` and `isEnabled`.
|
|
5649
|
+
*/
|
|
5638
5650
|
actions?(editor: Editor, actions: TLUiActionsContextType, helpers: TLUiOverrideHelpers): TLUiActionsContextType;
|
|
5639
5651
|
tools?(editor: Editor, tools: TLUiToolsContextType, helpers: TLUiOverrideHelpers): TLUiToolsContextType;
|
|
5640
5652
|
translations?: TLUiTranslationProviderProps['overrides'];
|
|
@@ -5880,7 +5892,7 @@ export declare interface TLUiTranslation {
|
|
|
5880
5892
|
export declare type TLUiTranslationContextType = TLUiTranslation;
|
|
5881
5893
|
|
|
5882
5894
|
/** @public */
|
|
5883
|
-
export declare type TLUiTranslationKey = 'a11y.adjust-shape-styles' | 'a11y.enlarge-shape' | 'a11y.enter-leave-container' | 'a11y.move-shape-faster' | 'a11y.move-shape' | 'a11y.multiple-shapes' | 'a11y.open-context-menu' | 'a11y.open-keyboard-shortcuts' | 'a11y.pan-camera' | 'a11y.repeat-shape' | 'a11y.rotate-shape-ccw-fine' | 'a11y.rotate-shape-ccw' | 'a11y.rotate-shape-cw-fine' | 'a11y.rotate-shape-cw' | 'a11y.select-shape-direction' | 'a11y.select-shape' | 'a11y.shape-image' | 'a11y.shape-index' | 'a11y.shape-video' | 'a11y.shrink-shape' | 'a11y.skip-to-main-content' | 'a11y.status' | 'action.align-bottom' | 'action.align-center-horizontal.short' | 'action.align-center-horizontal' | 'action.align-center-vertical.short' | 'action.align-center-vertical' | 'action.align-left' | 'action.align-right' | 'action.align-top' | 'action.back-to-content' | 'action.bring-forward' | 'action.bring-to-front' | 'action.convert-to-bookmark' | 'action.convert-to-embed' | 'action.copy-as-json.short' | 'action.copy-as-json' | 'action.copy-as-png.short' | 'action.copy-as-png' | 'action.copy-as-svg.short' | 'action.copy-as-svg' | 'action.copy-hovered-styles' | 'action.copy' | 'action.cut' | 'action.delete' | 'action.distribute-horizontal.short' | 'action.distribute-horizontal' | 'action.distribute-vertical.short' | 'action.distribute-vertical' | 'action.download-original' | 'action.duplicate' | 'action.edit-link' | 'action.enhanced-a11y-mode.menu' | 'action.enhanced-a11y-mode' | 'action.exit-pen-mode' | 'action.export-all-as-png.short' | 'action.export-all-as-png' | 'action.export-all-as-svg.short' | 'action.export-all-as-svg' | 'action.export-as-png.short' | 'action.export-as-png' | 'action.export-as-svg.short' | 'action.export-as-svg' | 'action.fit-frame-to-content' | 'action.flatten-to-image' | 'action.flip-horizontal.short' | 'action.flip-horizontal' | 'action.flip-vertical.short' | 'action.flip-vertical' | 'action.frame-selection' | 'action.group' | 'action.insert-embed' | 'action.insert-media' | 'action.open-cursor-chat' | 'action.open-embed-link' | 'action.open-kbd-shortcuts' | 'action.pack' | 'action.paste-error-description' | 'action.paste-error-title' | 'action.paste' | 'action.print' | 'action.redo' | 'action.remove-frame' | 'action.rename' | 'action.rotate-ccw' | 'action.rotate-cw' | 'action.save-copy' | 'action.select-all' | 'action.select-none' | 'action.select-zoom-tool' | 'action.send-backward' | 'action.send-to-back' | 'action.stack-horizontal.short' | 'action.stack-horizontal' | 'action.stack-vertical.short' | 'action.stack-vertical' | 'action.stop-following' | 'action.stretch-horizontal.short' | 'action.stretch-horizontal' | 'action.stretch-vertical.short' | 'action.stretch-vertical' | 'action.toggle-auto-none' | 'action.toggle-auto-pan' | 'action.toggle-auto-size' | 'action.toggle-auto-zoom' | 'action.toggle-dark-mode.menu' | 'action.toggle-dark-mode' | 'action.toggle-debug-mode.menu' | 'action.toggle-debug-mode' | 'action.toggle-dynamic-size-mode.menu' | 'action.toggle-dynamic-size-mode' | 'action.toggle-edge-scrolling.menu' | 'action.toggle-edge-scrolling' | 'action.toggle-focus-mode.menu' | 'action.toggle-focus-mode' | 'action.toggle-grid.menu' | 'action.toggle-grid' | 'action.toggle-invert-zoom.menu' | 'action.toggle-invert-zoom' | 'action.toggle-keyboard-shortcuts.menu' | 'action.toggle-keyboard-shortcuts' | 'action.toggle-lock' | 'action.toggle-mouse' | 'action.toggle-paste-at-cursor.menu' | 'action.toggle-paste-at-cursor' | 'action.toggle-reduce-motion.menu' | 'action.toggle-reduce-motion' | 'action.toggle-snap-mode.menu' | 'action.toggle-snap-mode' | 'action.toggle-tool-lock.menu' | 'action.toggle-tool-lock' | 'action.toggle-trackpad' | 'action.toggle-transparent.context-menu' | 'action.toggle-transparent.menu' | 'action.toggle-transparent' | 'action.toggle-wrap-mode.menu' | 'action.toggle-wrap-mode' | 'action.undo' | 'action.ungroup' | 'action.unlock-all' | 'action.zoom-in' | 'action.zoom-out' | 'action.zoom-quick' | 'action.zoom-to-100' | 'action.zoom-to-fit' | 'action.zoom-to-selection' | 'actions-menu.title' | 'align-style.end' | 'align-style.justify' | 'align-style.middle' | 'align-style.start' | 'app.loading' | 'arrow-kind-style.arc' | 'arrow-kind-style.elbow' | 'arrowheadEnd-style.arrow' | 'arrowheadEnd-style.bar' | 'arrowheadEnd-style.diamond' | 'arrowheadEnd-style.dot' | 'arrowheadEnd-style.inverted' | 'arrowheadEnd-style.none' | 'arrowheadEnd-style.pipe' | 'arrowheadEnd-style.square' | 'arrowheadEnd-style.triangle' | 'arrowheadStart-style.arrow' | 'arrowheadStart-style.bar' | 'arrowheadStart-style.diamond' | 'arrowheadStart-style.dot' | 'arrowheadStart-style.inverted' | 'arrowheadStart-style.none' | 'arrowheadStart-style.pipe' | 'arrowheadStart-style.square' | 'arrowheadStart-style.triangle' | 'assets.files.amount-too-many' | 'assets.files.maximum-size' | 'assets.files.size-too-big' | 'assets.files.type-not-allowed' | 'assets.files.upload-failed' | 'assets.url.failed' | 'color-style.black' | 'color-style.blue' | 'color-style.green' | 'color-style.grey' | 'color-style.light-blue' | 'color-style.light-green' | 'color-style.light-red' | 'color-style.light-violet' | 'color-style.orange' | 'color-style.red' | 'color-style.violet' | 'color-style.white' | 'color-style.yellow' | 'comments.add-placeholder' | 'comments.add-reaction' | 'comments.cluster-label' | 'comments.copy-link' | 'comments.delete' | 'comments.dismiss' | 'comments.edit-placeholder' | 'comments.edit' | 'comments.empty-filtered' | 'comments.empty' | 'comments.filter' | 'comments.hide' | 'comments.link-copied' | 'comments.mention-no-matches' | 'comments.mention-you' | 'comments.more-options' | 'comments.only-my-comments' | 'comments.only-unread' | 'comments.pin-label-resolved' | 'comments.pin-label' | 'comments.preview-more' | 'comments.reacted' | 'comments.reopen' | 'comments.replies' | 'comments.reply-placeholder' | 'comments.resolve' | 'comments.resolved-by' | 'comments.resolved' | 'comments.save' | 'comments.send' | 'comments.show-all-pages' | 'comments.show-resolved' | 'comments.show' | 'comments.stack-label' | 'comments.thread-title' | 'comments.title' | 'comments.unknown-author' | 'context-menu.arrange' | 'context-menu.copy-as' | 'context-menu.edit' | 'context-menu.export-all-as' | 'context-menu.export-as' | 'context-menu.move-to-page' | 'context-menu.reorder' | 'context-menu.title' | 'context.pages.new-page' | 'cursor-chat.type-to-chat' | 'dash-style.dashed' | 'dash-style.dotted' | 'dash-style.draw' | 'dash-style.solid' | 'document.default-name' | 'edit-link-dialog.cancel' | 'edit-link-dialog.clear' | 'edit-link-dialog.detail' | 'edit-link-dialog.invalid-url' | 'edit-link-dialog.save' | 'edit-link-dialog.title' | 'edit-link-dialog.url' | 'embed-dialog.back' | 'embed-dialog.cancel' | 'embed-dialog.create' | 'embed-dialog.instruction' | 'embed-dialog.invalid-url' | 'embed-dialog.learn-more' | 'embed-dialog.title' | 'embed-dialog.url' | 'error.cancel' | 'error.confirm-reset.description' | 'error.confirm-reset.title' | 'error.copied' | 'error.copy' | 'error.hide-details' | 'error.message-label' | 'error.note-label' | 'error.refresh-hint' | 'error.refresh-page' | 'error.reset-data' | 'error.reset-hint' | 'error.reset-note' | 'error.show-details' | 'error.stack-trace-label' | 'error.title' | 'file-system.confirm-open.cancel' | 'file-system.confirm-open.description' | 'file-system.confirm-open.open' | 'file-system.confirm-open.title' | 'file-system.file-open-error.file-format-version-too-new' | 'file-system.file-open-error.generic-corrupted-file' | 'file-system.file-open-error.not-a-tldraw-file' | 'file-system.file-open-error.title' | 'file-system.shared-document-file-open-error.description' | 'file-system.shared-document-file-open-error.title' | 'fill-style.fill' | 'fill-style.lined-fill' | 'fill-style.none' | 'fill-style.pattern' | 'fill-style.semi' | 'fill-style.solid' | 'focus-mode.toggle-focus-mode' | 'font-style.draw' | 'font-style.mono' | 'font-style.sans' | 'font-style.serif' | 'geo-style.arrow-down' | 'geo-style.arrow-left' | 'geo-style.arrow-right' | 'geo-style.arrow-up' | 'geo-style.check-box' | 'geo-style.cloud' | 'geo-style.diamond' | 'geo-style.ellipse' | 'geo-style.heart' | 'geo-style.hexagon' | 'geo-style.octagon' | 'geo-style.oval' | 'geo-style.pentagon' | 'geo-style.rectangle' | 'geo-style.rhombus-2' | 'geo-style.rhombus' | 'geo-style.star' | 'geo-style.trapezoid' | 'geo-style.triangle' | 'geo-style.x-box' | 'help-menu.about' | 'help-menu.discord' | 'help-menu.github' | 'help-menu.keyboard-shortcuts' | 'help-menu.privacy' | 'help-menu.terms' | 'help-menu.title' | 'help-menu.twitter' | 'menu.accessibility' | 'menu.edit' | 'menu.input-device' | 'menu.language' | 'menu.preferences' | 'menu.theme' | 'menu.title' | 'menu.view' | 'navigation-zone.minimap' | 'navigation-zone.title' | 'navigation-zone.toggle-minimap' | 'navigation-zone.zoom' | 'opacity-style.0.1' | 'opacity-style.0.25' | 'opacity-style.0.5' | 'opacity-style.0.75' | 'opacity-style.1' | 'page-menu.create-new-page' | 'page-menu.go-to-page' | 'page-menu.max-pages-reached' | 'page-menu.new-page-initial-name' | 'page-menu.resize' | 'page-menu.submenu.delete' | 'page-menu.submenu.duplicate-page' | 'page-menu.submenu.move-down' | 'page-menu.submenu.move-up' | 'page-menu.submenu.rename' | 'page-menu.submenu.title' | 'people-menu.anonymous-user' | 'people-menu.avatar-color' | 'people-menu.change-color' | 'people-menu.change-name' | 'people-menu.follow' | 'people-menu.following' | 'people-menu.leading' | 'people-menu.title' | 'people-menu.user' | 'shortcuts-dialog.a11y' | 'shortcuts-dialog.collaboration' | 'shortcuts-dialog.disabled-notice' | 'shortcuts-dialog.edit' | 'shortcuts-dialog.preferences' | 'shortcuts-dialog.text-formatting' | 'shortcuts-dialog.title' | 'shortcuts-dialog.tools' | 'shortcuts-dialog.transform' | 'shortcuts-dialog.view' | 'size-style.l' | 'size-style.m' | 'size-style.s' | 'size-style.xl' | 'spline-style.cubic' | 'spline-style.line' | 'status.offline' | 'style-panel.align' | 'style-panel.arrow-kind' | 'style-panel.arrowhead-end' | 'style-panel.arrowhead-start' | 'style-panel.arrowheads' | 'style-panel.color' | 'style-panel.dash' | 'style-panel.fill' | 'style-panel.font' | 'style-panel.geo' | 'style-panel.label-align' | 'style-panel.mixed' | 'style-panel.opacity' | 'style-panel.position' | 'style-panel.selected' | 'style-panel.size' | 'style-panel.spline' | 'style-panel.title' | 'style-panel.vertical-align' | 'theme.dark' | 'theme.light' | 'theme.system' | 'toast.close' | 'toast.error.copy-fail.desc' | 'toast.error.copy-fail.title' | 'toast.error.export-fail.desc' | 'toast.error.export-fail.title' | 'toast.error' | 'toast.info' | 'toast.moved-to-page.action' | 'toast.moved-to-page.desc' | 'toast.moved-to-page.title' | 'toast.success' | 'toast.warning' | 'tool-panel.more' | 'tool-panel.title' | 'tool.arrow-down' | 'tool.arrow-left' | 'tool.arrow-right' | 'tool.arrow-up' | 'tool.arrow' | 'tool.aspect-ratio.circle' | 'tool.aspect-ratio.landscape' | 'tool.aspect-ratio.original' | 'tool.aspect-ratio.portrait' | 'tool.aspect-ratio.square' | 'tool.aspect-ratio.wide' | 'tool.aspect-ratio' | 'tool.bookmark' | 'tool.check-box' | 'tool.cloud' | 'tool.comment' | 'tool.diamond' | 'tool.draw' | 'tool.ellipse' | 'tool.embed' | 'tool.eraser' | 'tool.frame' | 'tool.hand' | 'tool.heart' | 'tool.hexagon' | 'tool.highlight' | 'tool.image-crop-confirm' | 'tool.image-crop' | 'tool.image-toolbar-title' | 'tool.image-zoom' | 'tool.laser' | 'tool.line' | 'tool.media-alt-text-confirm' | 'tool.media-alt-text-desc' | 'tool.media-alt-text' | 'tool.media' | 'tool.note' | 'tool.octagon' | 'tool.oval' | 'tool.pentagon' | 'tool.pointer-down' | 'tool.rectangle' | 'tool.replace-media' | 'tool.rhombus-2' | 'tool.rhombus' | 'tool.rich-text-bold' | 'tool.rich-text-bulletList' | 'tool.rich-text-code' | 'tool.rich-text-header' | 'tool.rich-text-highlight' | 'tool.rich-text-italic' | 'tool.rich-text-link-remove' | 'tool.rich-text-link-visit' | 'tool.rich-text-link' | 'tool.rich-text-orderedList' | 'tool.rich-text-strikethrough' | 'tool.rich-text-toolbar-title' | 'tool.select' | 'tool.star' | 'tool.text' | 'tool.trapezoid' | 'tool.triangle' | 'tool.video-toolbar-title' | 'tool.x-box' | 'ui.checked' | 'ui.close' | 'ui.unchecked' | 'verticalAlign-style.end' | 'verticalAlign-style.middle' | 'verticalAlign-style.start' | 'vscode.file-open.backup-failed' | 'vscode.file-open.backup-saved' | 'vscode.file-open.backup' | 'vscode.file-open.desc' | 'vscode.file-open.dont-show-again' | 'vscode.file-open.open';
|
|
5895
|
+
export declare type TLUiTranslationKey = 'a11y.adjust-shape-styles' | 'a11y.enlarge-shape' | 'a11y.enter-leave-container' | 'a11y.move-shape-faster' | 'a11y.move-shape' | 'a11y.multiple-shapes' | 'a11y.open-context-menu' | 'a11y.open-keyboard-shortcuts' | 'a11y.pan-camera' | 'a11y.repeat-shape' | 'a11y.rotate-shape-ccw-fine' | 'a11y.rotate-shape-ccw' | 'a11y.rotate-shape-cw-fine' | 'a11y.rotate-shape-cw' | 'a11y.select-shape-direction' | 'a11y.select-shape' | 'a11y.shape-group' | 'a11y.shape-image' | 'a11y.shape-index' | 'a11y.shape-video' | 'a11y.shrink-shape' | 'a11y.skip-to-main-content' | 'a11y.status' | 'action.align-bottom' | 'action.align-center-horizontal.short' | 'action.align-center-horizontal' | 'action.align-center-vertical.short' | 'action.align-center-vertical' | 'action.align-left' | 'action.align-right' | 'action.align-top' | 'action.back-to-content' | 'action.bring-forward' | 'action.bring-to-front' | 'action.convert-to-bookmark' | 'action.convert-to-embed' | 'action.copy-as-json.short' | 'action.copy-as-json' | 'action.copy-as-png.short' | 'action.copy-as-png' | 'action.copy-as-svg.short' | 'action.copy-as-svg' | 'action.copy-hovered-styles' | 'action.copy' | 'action.cut' | 'action.delete' | 'action.distribute-horizontal.short' | 'action.distribute-horizontal' | 'action.distribute-vertical.short' | 'action.distribute-vertical' | 'action.download-original' | 'action.duplicate' | 'action.edit-link' | 'action.enhanced-a11y-mode.menu' | 'action.enhanced-a11y-mode' | 'action.exit-pen-mode' | 'action.export-all-as-png.short' | 'action.export-all-as-png' | 'action.export-all-as-svg.short' | 'action.export-all-as-svg' | 'action.export-as-png.short' | 'action.export-as-png' | 'action.export-as-svg.short' | 'action.export-as-svg' | 'action.fit-frame-to-content' | 'action.flatten-to-image' | 'action.flip-horizontal.short' | 'action.flip-horizontal' | 'action.flip-vertical.short' | 'action.flip-vertical' | 'action.frame-selection' | 'action.group' | 'action.insert-embed' | 'action.insert-media' | 'action.open-cursor-chat' | 'action.open-embed-link' | 'action.open-kbd-shortcuts' | 'action.pack' | 'action.paste-error-description' | 'action.paste-error-title' | 'action.paste' | 'action.print' | 'action.redo' | 'action.remove-frame' | 'action.rename' | 'action.rotate-ccw' | 'action.rotate-cw' | 'action.save-copy' | 'action.select-all' | 'action.select-none' | 'action.select-zoom-tool' | 'action.send-backward' | 'action.send-to-back' | 'action.stack-horizontal.short' | 'action.stack-horizontal' | 'action.stack-vertical.short' | 'action.stack-vertical' | 'action.stop-following' | 'action.stretch-horizontal.short' | 'action.stretch-horizontal' | 'action.stretch-vertical.short' | 'action.stretch-vertical' | 'action.toggle-auto-none' | 'action.toggle-auto-pan' | 'action.toggle-auto-size' | 'action.toggle-auto-zoom' | 'action.toggle-dark-mode.menu' | 'action.toggle-dark-mode' | 'action.toggle-debug-mode.menu' | 'action.toggle-debug-mode' | 'action.toggle-dynamic-size-mode.menu' | 'action.toggle-dynamic-size-mode' | 'action.toggle-edge-scrolling.menu' | 'action.toggle-edge-scrolling' | 'action.toggle-focus-mode.menu' | 'action.toggle-focus-mode' | 'action.toggle-grid.menu' | 'action.toggle-grid' | 'action.toggle-invert-zoom.menu' | 'action.toggle-invert-zoom' | 'action.toggle-keyboard-shortcuts.menu' | 'action.toggle-keyboard-shortcuts' | 'action.toggle-lock' | 'action.toggle-mouse' | 'action.toggle-paste-at-cursor.menu' | 'action.toggle-paste-at-cursor' | 'action.toggle-reduce-motion.menu' | 'action.toggle-reduce-motion' | 'action.toggle-snap-mode.menu' | 'action.toggle-snap-mode' | 'action.toggle-tool-lock.menu' | 'action.toggle-tool-lock' | 'action.toggle-trackpad' | 'action.toggle-transparent.context-menu' | 'action.toggle-transparent.menu' | 'action.toggle-transparent' | 'action.toggle-wrap-mode.menu' | 'action.toggle-wrap-mode' | 'action.undo' | 'action.ungroup' | 'action.unlock-all' | 'action.zoom-in' | 'action.zoom-out' | 'action.zoom-quick' | 'action.zoom-to-100' | 'action.zoom-to-fit' | 'action.zoom-to-selection' | 'actions-menu.title' | 'align-style.end' | 'align-style.justify' | 'align-style.middle' | 'align-style.start' | 'app.loading' | 'arrow-kind-style.arc' | 'arrow-kind-style.elbow' | 'arrowheadEnd-style.arrow' | 'arrowheadEnd-style.bar' | 'arrowheadEnd-style.diamond' | 'arrowheadEnd-style.dot' | 'arrowheadEnd-style.inverted' | 'arrowheadEnd-style.none' | 'arrowheadEnd-style.pipe' | 'arrowheadEnd-style.square' | 'arrowheadEnd-style.triangle' | 'arrowheadStart-style.arrow' | 'arrowheadStart-style.bar' | 'arrowheadStart-style.diamond' | 'arrowheadStart-style.dot' | 'arrowheadStart-style.inverted' | 'arrowheadStart-style.none' | 'arrowheadStart-style.pipe' | 'arrowheadStart-style.square' | 'arrowheadStart-style.triangle' | 'assets.files.amount-too-many' | 'assets.files.maximum-size' | 'assets.files.size-too-big' | 'assets.files.type-not-allowed' | 'assets.files.upload-failed' | 'assets.url.failed' | 'color-style.black' | 'color-style.blue' | 'color-style.green' | 'color-style.grey' | 'color-style.light-blue' | 'color-style.light-green' | 'color-style.light-red' | 'color-style.light-violet' | 'color-style.orange' | 'color-style.red' | 'color-style.violet' | 'color-style.white' | 'color-style.yellow' | 'comments.add-placeholder' | 'comments.add-reaction' | 'comments.cluster-label' | 'comments.copy-link' | 'comments.delete' | 'comments.dismiss' | 'comments.edit-placeholder' | 'comments.edit' | 'comments.empty-filtered' | 'comments.empty' | 'comments.filter' | 'comments.hide' | 'comments.link-copied' | 'comments.mention-no-matches' | 'comments.mention-you' | 'comments.more-options' | 'comments.only-my-comments' | 'comments.only-unread' | 'comments.pin-label-resolved' | 'comments.pin-label' | 'comments.preview-more' | 'comments.reacted' | 'comments.reopen' | 'comments.replies' | 'comments.reply-placeholder' | 'comments.resolve' | 'comments.resolved-by' | 'comments.resolved' | 'comments.save' | 'comments.send' | 'comments.show-all-pages' | 'comments.show-resolved' | 'comments.show' | 'comments.stack-label' | 'comments.thread-title' | 'comments.title' | 'comments.unknown-author' | 'context-menu.arrange' | 'context-menu.copy-as' | 'context-menu.edit' | 'context-menu.export-all-as' | 'context-menu.export-as' | 'context-menu.move-to-page' | 'context-menu.reorder' | 'context-menu.title' | 'context.pages.new-page' | 'cursor-chat.type-to-chat' | 'dash-style.dashed' | 'dash-style.dotted' | 'dash-style.draw' | 'dash-style.solid' | 'document.default-name' | 'edit-link-dialog.cancel' | 'edit-link-dialog.clear' | 'edit-link-dialog.detail' | 'edit-link-dialog.invalid-url' | 'edit-link-dialog.save' | 'edit-link-dialog.title' | 'edit-link-dialog.url' | 'embed-dialog.back' | 'embed-dialog.cancel' | 'embed-dialog.create' | 'embed-dialog.instruction' | 'embed-dialog.invalid-url' | 'embed-dialog.learn-more' | 'embed-dialog.title' | 'embed-dialog.url' | 'error.cancel' | 'error.confirm-reset.description' | 'error.confirm-reset.title' | 'error.copied' | 'error.copy' | 'error.hide-details' | 'error.message-label' | 'error.note-label' | 'error.refresh-hint' | 'error.refresh-page' | 'error.reset-data' | 'error.reset-hint' | 'error.reset-note' | 'error.show-details' | 'error.stack-trace-label' | 'error.title' | 'file-system.confirm-open.cancel' | 'file-system.confirm-open.description' | 'file-system.confirm-open.open' | 'file-system.confirm-open.title' | 'file-system.file-open-error.file-format-version-too-new' | 'file-system.file-open-error.generic-corrupted-file' | 'file-system.file-open-error.not-a-tldraw-file' | 'file-system.file-open-error.title' | 'file-system.shared-document-file-open-error.description' | 'file-system.shared-document-file-open-error.title' | 'fill-style.fill' | 'fill-style.lined-fill' | 'fill-style.none' | 'fill-style.pattern' | 'fill-style.semi' | 'fill-style.solid' | 'focus-mode.toggle-focus-mode' | 'font-style.draw' | 'font-style.mono' | 'font-style.sans' | 'font-style.serif' | 'geo-style.arrow-down' | 'geo-style.arrow-left' | 'geo-style.arrow-right' | 'geo-style.arrow-up' | 'geo-style.check-box' | 'geo-style.cloud' | 'geo-style.diamond' | 'geo-style.ellipse' | 'geo-style.heart' | 'geo-style.hexagon' | 'geo-style.octagon' | 'geo-style.oval' | 'geo-style.pentagon' | 'geo-style.rectangle' | 'geo-style.rhombus-2' | 'geo-style.rhombus' | 'geo-style.star' | 'geo-style.trapezoid' | 'geo-style.triangle' | 'geo-style.x-box' | 'help-menu.about' | 'help-menu.keyboard-shortcuts' | 'help-menu.privacy' | 'help-menu.terms' | 'help-menu.title' | 'menu.accessibility' | 'menu.edit' | 'menu.input-device' | 'menu.language' | 'menu.preferences' | 'menu.theme' | 'menu.title' | 'menu.view' | 'navigation-zone.minimap' | 'navigation-zone.title' | 'navigation-zone.toggle-minimap' | 'navigation-zone.zoom' | 'opacity-style.0.1' | 'opacity-style.0.25' | 'opacity-style.0.5' | 'opacity-style.0.75' | 'opacity-style.1' | 'page-menu.create-new-page' | 'page-menu.go-to-page' | 'page-menu.max-pages-reached' | 'page-menu.new-page-initial-name' | 'page-menu.resize' | 'page-menu.submenu.delete' | 'page-menu.submenu.duplicate-page' | 'page-menu.submenu.move-down' | 'page-menu.submenu.move-up' | 'page-menu.submenu.rename' | 'page-menu.submenu.title' | 'people-menu.anonymous-user' | 'people-menu.avatar-color' | 'people-menu.change-color' | 'people-menu.change-name' | 'people-menu.follow' | 'people-menu.following' | 'people-menu.leading' | 'people-menu.title' | 'people-menu.user' | 'shortcuts-dialog.a11y' | 'shortcuts-dialog.collaboration' | 'shortcuts-dialog.disabled-notice' | 'shortcuts-dialog.edit' | 'shortcuts-dialog.preferences' | 'shortcuts-dialog.text-formatting' | 'shortcuts-dialog.title' | 'shortcuts-dialog.tools' | 'shortcuts-dialog.transform' | 'shortcuts-dialog.view' | 'size-style.l' | 'size-style.m' | 'size-style.s' | 'size-style.xl' | 'spline-style.cubic' | 'spline-style.line' | 'status.offline' | 'style-panel.align' | 'style-panel.arrow-kind' | 'style-panel.arrowhead-end' | 'style-panel.arrowhead-start' | 'style-panel.arrowheads' | 'style-panel.color' | 'style-panel.dash' | 'style-panel.fill' | 'style-panel.font' | 'style-panel.geo' | 'style-panel.label-align' | 'style-panel.mixed' | 'style-panel.opacity' | 'style-panel.position' | 'style-panel.selected' | 'style-panel.size' | 'style-panel.spline' | 'style-panel.title' | 'style-panel.vertical-align' | 'theme.dark' | 'theme.light' | 'theme.system' | 'toast.close' | 'toast.error.copy-fail.desc' | 'toast.error.copy-fail.title' | 'toast.error.export-fail.desc' | 'toast.error.export-fail.title' | 'toast.error' | 'toast.info' | 'toast.moved-to-page.action' | 'toast.moved-to-page.desc' | 'toast.moved-to-page.title' | 'toast.success' | 'toast.warning' | 'tool-panel.more' | 'tool-panel.title' | 'tool.arrow-down' | 'tool.arrow-left' | 'tool.arrow-right' | 'tool.arrow-up' | 'tool.arrow' | 'tool.aspect-ratio.circle' | 'tool.aspect-ratio.landscape' | 'tool.aspect-ratio.original' | 'tool.aspect-ratio.portrait' | 'tool.aspect-ratio.square' | 'tool.aspect-ratio.wide' | 'tool.aspect-ratio' | 'tool.bookmark' | 'tool.check-box' | 'tool.cloud' | 'tool.comment' | 'tool.diamond' | 'tool.draw' | 'tool.ellipse' | 'tool.embed' | 'tool.eraser' | 'tool.frame' | 'tool.hand' | 'tool.heart' | 'tool.hexagon' | 'tool.highlight' | 'tool.image-crop-confirm' | 'tool.image-crop' | 'tool.image-toolbar-title' | 'tool.image-zoom' | 'tool.laser' | 'tool.line' | 'tool.media-alt-text-confirm' | 'tool.media-alt-text-desc' | 'tool.media-alt-text' | 'tool.media' | 'tool.note' | 'tool.octagon' | 'tool.oval' | 'tool.pentagon' | 'tool.pointer-down' | 'tool.rectangle' | 'tool.replace-media' | 'tool.rhombus-2' | 'tool.rhombus' | 'tool.rich-text-bold' | 'tool.rich-text-bulletList' | 'tool.rich-text-code' | 'tool.rich-text-header' | 'tool.rich-text-highlight' | 'tool.rich-text-italic' | 'tool.rich-text-link-remove' | 'tool.rich-text-link-visit' | 'tool.rich-text-link' | 'tool.rich-text-orderedList' | 'tool.rich-text-strikethrough' | 'tool.rich-text-toolbar-title' | 'tool.select' | 'tool.star' | 'tool.text' | 'tool.trapezoid' | 'tool.triangle' | 'tool.video-toolbar-title' | 'tool.x-box' | 'ui.checked' | 'ui.close' | 'ui.unchecked' | 'verticalAlign-style.end' | 'verticalAlign-style.middle' | 'verticalAlign-style.start' | 'vscode.file-open.backup-failed' | 'vscode.file-open.backup-saved' | 'vscode.file-open.backup' | 'vscode.file-open.desc' | 'vscode.file-open.dont-show-again' | 'vscode.file-open.open';
|
|
5884
5896
|
|
|
5885
5897
|
/** @public */
|
|
5886
5898
|
export declare interface TLUiTranslationProviderProps {
|
package/dist-cjs/index.js
CHANGED
|
@@ -671,7 +671,7 @@ var import_buildFromV1Document = require("./lib/utils/tldr/buildFromV1Document")
|
|
|
671
671
|
var import_file = require("./lib/utils/tldr/file");
|
|
672
672
|
(0, import_editor.registerTldrawLibraryVersion)(
|
|
673
673
|
"tldraw",
|
|
674
|
-
"5.
|
|
674
|
+
"5.7.0-canary.017ae8f4fa1b",
|
|
675
675
|
"cjs"
|
|
676
676
|
);
|
|
677
677
|
//# sourceMappingURL=index.js.map
|