@tldraw/editor 3.9.0 → 3.10.0-canary.12c0cb0549ca
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/dist-cjs/index.d.ts +243 -5
- package/dist-cjs/index.js +9 -1
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawEditor.js +32 -6
- package/dist-cjs/lib/TldrawEditor.js.map +2 -2
- package/dist-cjs/lib/components/LiveCollaborators.js +5 -0
- package/dist-cjs/lib/components/LiveCollaborators.js.map +2 -2
- package/dist-cjs/lib/components/Shape.js +7 -0
- package/dist-cjs/lib/components/Shape.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +69 -14
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/managers/FontManager.js +166 -0
- package/dist-cjs/lib/editor/managers/FontManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/TextManager.js +23 -17
- package/dist-cjs/lib/editor/managers/TextManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +11 -0
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/types/emit-types.js.map +1 -1
- package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
- package/dist-cjs/lib/exports/FontEmbedder.js +7 -2
- package/dist-cjs/lib/exports/FontEmbedder.js.map +2 -2
- package/dist-cjs/lib/exports/StyleEmbedder.js +1 -1
- package/dist-cjs/lib/exports/StyleEmbedder.js.map +2 -2
- package/dist-cjs/lib/exports/exportToSvg.js +3 -2
- package/dist-cjs/lib/exports/exportToSvg.js.map +2 -2
- package/dist-cjs/lib/exports/getSvgJsx.js +18 -1
- package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
- package/dist-cjs/lib/exports/parseCss.js +1 -0
- package/dist-cjs/lib/exports/parseCss.js.map +2 -2
- package/dist-cjs/lib/hooks/useCanvasEvents.js +2 -2
- package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js +1 -1
- package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js +48 -0
- package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +7 -0
- package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/usePeerIds.js.map +1 -1
- package/dist-cjs/lib/hooks/usePresence.js.map +1 -1
- package/dist-cjs/lib/hooks/useViewportHeight.js +56 -0
- package/dist-cjs/lib/hooks/useViewportHeight.js.map +7 -0
- package/dist-cjs/lib/options.js +2 -1
- package/dist-cjs/lib/options.js.map +2 -2
- package/dist-cjs/lib/utils/browserCanvasMaxSize.js +5 -0
- package/dist-cjs/lib/utils/browserCanvasMaxSize.js.map +2 -2
- package/dist-cjs/lib/utils/dom.js +1 -1
- package/dist-cjs/lib/utils/dom.js.map +2 -2
- package/dist-cjs/lib/utils/richText.js +46 -0
- package/dist-cjs/lib/utils/richText.js.map +7 -0
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +243 -5
- package/dist-esm/index.mjs +13 -1
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +33 -7
- package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
- package/dist-esm/lib/components/LiveCollaborators.mjs +5 -0
- package/dist-esm/lib/components/LiveCollaborators.mjs.map +2 -2
- package/dist-esm/lib/components/Shape.mjs +8 -1
- package/dist-esm/lib/components/Shape.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +72 -10
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/FontManager.mjs +152 -0
- package/dist-esm/lib/editor/managers/FontManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/TextManager.mjs +23 -17
- package/dist-esm/lib/editor/managers/TextManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +11 -0
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/exports/FontEmbedder.mjs +7 -2
- package/dist-esm/lib/exports/FontEmbedder.mjs.map +2 -2
- package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -1
- package/dist-esm/lib/exports/StyleEmbedder.mjs.map +2 -2
- package/dist-esm/lib/exports/exportToSvg.mjs +3 -2
- package/dist-esm/lib/exports/exportToSvg.mjs.map +2 -2
- package/dist-esm/lib/exports/getSvgJsx.mjs +19 -2
- package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
- package/dist-esm/lib/exports/parseCss.mjs +1 -0
- package/dist-esm/lib/exports/parseCss.mjs.map +2 -2
- package/dist-esm/lib/hooks/useCanvasEvents.mjs +2 -2
- package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs +1 -1
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs +28 -0
- package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +7 -0
- package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/usePeerIds.mjs.map +1 -1
- package/dist-esm/lib/hooks/usePresence.mjs.map +1 -1
- package/dist-esm/lib/hooks/useViewportHeight.mjs +36 -0
- package/dist-esm/lib/hooks/useViewportHeight.mjs.map +7 -0
- package/dist-esm/lib/options.mjs +2 -1
- package/dist-esm/lib/options.mjs.map +2 -2
- package/dist-esm/lib/utils/browserCanvasMaxSize.mjs +5 -0
- package/dist-esm/lib/utils/browserCanvasMaxSize.mjs.map +2 -2
- package/dist-esm/lib/utils/dom.mjs +1 -1
- package/dist-esm/lib/utils/dom.mjs.map +2 -2
- package/dist-esm/lib/utils/richText.mjs +26 -0
- package/dist-esm/lib/utils/richText.mjs.map +7 -0
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +127 -13
- package/package.json +10 -7
- package/src/index.ts +15 -0
- package/src/lib/TldrawEditor.tsx +52 -4
- package/src/lib/components/LiveCollaborators.tsx +5 -0
- package/src/lib/components/Shape.tsx +9 -1
- package/src/lib/components/default-components/DefaultBrush.tsx +1 -0
- package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +1 -0
- package/src/lib/components/default-components/DefaultCursor.tsx +1 -0
- package/src/lib/components/default-components/DefaultScribble.tsx +1 -0
- package/src/lib/components/default-components/DefaultShapeIndicator.tsx +1 -0
- package/src/lib/editor/Editor.ts +92 -8
- package/src/lib/editor/managers/FontManager.ts +251 -0
- package/src/lib/editor/managers/TextManager.ts +42 -17
- package/src/lib/editor/shapes/ShapeUtil.ts +13 -0
- package/src/lib/editor/types/emit-types.ts +1 -0
- package/src/lib/editor/types/external-content.ts +1 -0
- package/src/lib/exports/FontEmbedder.ts +13 -1
- package/src/lib/exports/StyleEmbedder.ts +1 -1
- package/src/lib/exports/exportToSvg.tsx +4 -3
- package/src/lib/exports/getSvgJsx.tsx +22 -2
- package/src/lib/exports/parseCss.ts +1 -0
- package/src/lib/hooks/useCanvasEvents.ts +2 -1
- package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +1 -0
- package/src/lib/hooks/usePassThroughMouseOverEvents.ts +29 -0
- package/src/lib/hooks/usePassThroughWheelEvents.ts +0 -1
- package/src/lib/hooks/usePeerIds.ts +1 -1
- package/src/lib/hooks/usePresence.ts +2 -2
- package/src/lib/hooks/useViewportHeight.ts +37 -0
- package/src/lib/options.ts +7 -0
- package/src/lib/utils/browserCanvasMaxSize.ts +5 -3
- package/src/lib/utils/dom.ts +1 -1
- package/src/lib/utils/richText.ts +72 -0
- package/src/version.ts +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/options.ts"],
|
|
4
|
-
"sourcesContent": ["import { ComponentType, Fragment } from 'react'\n\n/**\n * Options for configuring tldraw. For defaults, see {@link defaultTldrawOptions}.\n *\n * @example\n * ```tsx\n * const options: Partial<TldrawOptions> = {\n * maxPages: 3,\n * maxShapesPerPage: 1000,\n * }\n *\n * function MyTldrawComponent() {\n * return <Tldraw options={options} />\n * }\n * ```\n *\n * @public\n */\nexport interface TldrawOptions {\n\treadonly maxShapesPerPage: number\n\treadonly maxFilesAtOnce: number\n\treadonly maxPages: number\n\treadonly animationMediumMs: number\n\treadonly followChaseViewportSnap: number\n\treadonly doubleClickDurationMs: number\n\treadonly multiClickDurationMs: number\n\treadonly coarseDragDistanceSquared: number\n\treadonly dragDistanceSquared: number\n\treadonly defaultSvgPadding: number\n\treadonly cameraSlideFriction: number\n\treadonly gridSteps: readonly {\n\t\treadonly min: number\n\t\treadonly mid: number\n\t\treadonly step: number\n\t}[]\n\treadonly collaboratorInactiveTimeoutMs: number\n\treadonly collaboratorIdleTimeoutMs: number\n\treadonly collaboratorCheckIntervalMs: number\n\treadonly cameraMovingTimeoutMs: number\n\treadonly hitTestMargin: number\n\treadonly edgeScrollDelay: number\n\treadonly edgeScrollEaseDuration: number\n\treadonly edgeScrollSpeed: number\n\treadonly edgeScrollDistance: number\n\treadonly coarsePointerWidth: number\n\treadonly coarseHandleRadius: number\n\treadonly handleRadius: number\n\treadonly longPressDurationMs: number\n\treadonly textShadowLod: number\n\treadonly adjacentShapeMargin: number\n\treadonly flattenImageBoundsExpand: number\n\treadonly flattenImageBoundsPadding: number\n\treadonly laserDelayMs: number\n\treadonly maxExportDelayMs: number\n\t/**\n\t * How long should previews created by {@link Editor.createTemporaryAssetPreview} last before\n\t * they expire? Defaults to 3 minutes.\n\t */\n\treadonly temporaryAssetPreviewLifetimeMs: number\n\treadonly actionShortcutsLocation: 'menu' | 'toolbar' | 'swap'\n\treadonly createTextOnCanvasDoubleClick: boolean\n\t/**\n\t * The react provider to use when exporting an image. This is useful if your shapes depend on\n\t * external context providers. By default, this is `React.Fragment`.\n\t */\n\treadonly exportProvider: ComponentType<{ children: React.ReactNode }>\n\t/**\n\t * By default, the toolbar items are accessible via number shortcuts according to their order. To disable this, set this option to false.\n\t */\n\treadonly enableToolbarKeyboardShortcuts: boolean\n}\n\n/** @public */\nexport const defaultTldrawOptions = {\n\tmaxShapesPerPage: 4000,\n\tmaxFilesAtOnce: 100,\n\tmaxPages: 40,\n\tanimationMediumMs: 320,\n\tfollowChaseViewportSnap: 2,\n\tdoubleClickDurationMs: 450,\n\tmultiClickDurationMs: 200,\n\tcoarseDragDistanceSquared: 36, // 6 squared\n\tdragDistanceSquared: 16, // 4 squared\n\tdefaultSvgPadding: 32,\n\tcameraSlideFriction: 0.09,\n\tgridSteps: [\n\t\t{ min: -1, mid: 0.15, step: 64 },\n\t\t{ min: 0.05, mid: 0.375, step: 16 },\n\t\t{ min: 0.15, mid: 1, step: 4 },\n\t\t{ min: 0.7, mid: 2.5, step: 1 },\n\t],\n\tcollaboratorInactiveTimeoutMs: 60000,\n\tcollaboratorIdleTimeoutMs: 3000,\n\tcollaboratorCheckIntervalMs: 1200,\n\tcameraMovingTimeoutMs: 64,\n\thitTestMargin: 8,\n\tedgeScrollDelay: 200,\n\tedgeScrollEaseDuration: 200,\n\tedgeScrollSpeed: 25,\n\tedgeScrollDistance: 8,\n\tcoarsePointerWidth: 12,\n\tcoarseHandleRadius: 20,\n\thandleRadius: 12,\n\tlongPressDurationMs: 500,\n\ttextShadowLod: 0.35,\n\tadjacentShapeMargin: 10,\n\tflattenImageBoundsExpand: 64,\n\tflattenImageBoundsPadding: 16,\n\tlaserDelayMs: 1200,\n\tmaxExportDelayMs: 5000,\n\ttemporaryAssetPreviewLifetimeMs: 180000,\n\tactionShortcutsLocation: 'swap',\n\tcreateTextOnCanvasDoubleClick: true,\n\texportProvider: Fragment,\n\tenableToolbarKeyboardShortcuts: true,\n} as const satisfies TldrawOptions\n"],
|
|
5
|
-
"mappings": "AAAA,SAAwB,gBAAgB;
|
|
4
|
+
"sourcesContent": ["import { ComponentType, Fragment } from 'react'\n\n/**\n * Options for configuring tldraw. For defaults, see {@link defaultTldrawOptions}.\n *\n * @example\n * ```tsx\n * const options: Partial<TldrawOptions> = {\n * maxPages: 3,\n * maxShapesPerPage: 1000,\n * }\n *\n * function MyTldrawComponent() {\n * return <Tldraw options={options} />\n * }\n * ```\n *\n * @public\n */\nexport interface TldrawOptions {\n\treadonly maxShapesPerPage: number\n\treadonly maxFilesAtOnce: number\n\treadonly maxPages: number\n\treadonly animationMediumMs: number\n\treadonly followChaseViewportSnap: number\n\treadonly doubleClickDurationMs: number\n\treadonly multiClickDurationMs: number\n\treadonly coarseDragDistanceSquared: number\n\treadonly dragDistanceSquared: number\n\treadonly defaultSvgPadding: number\n\treadonly cameraSlideFriction: number\n\treadonly gridSteps: readonly {\n\t\treadonly min: number\n\t\treadonly mid: number\n\t\treadonly step: number\n\t}[]\n\treadonly collaboratorInactiveTimeoutMs: number\n\treadonly collaboratorIdleTimeoutMs: number\n\treadonly collaboratorCheckIntervalMs: number\n\treadonly cameraMovingTimeoutMs: number\n\treadonly hitTestMargin: number\n\treadonly edgeScrollDelay: number\n\treadonly edgeScrollEaseDuration: number\n\treadonly edgeScrollSpeed: number\n\treadonly edgeScrollDistance: number\n\treadonly coarsePointerWidth: number\n\treadonly coarseHandleRadius: number\n\treadonly handleRadius: number\n\treadonly longPressDurationMs: number\n\treadonly textShadowLod: number\n\treadonly adjacentShapeMargin: number\n\treadonly flattenImageBoundsExpand: number\n\treadonly flattenImageBoundsPadding: number\n\treadonly laserDelayMs: number\n\treadonly maxExportDelayMs: number\n\t/**\n\t * How long should previews created by {@link Editor.createTemporaryAssetPreview} last before\n\t * they expire? Defaults to 3 minutes.\n\t */\n\treadonly temporaryAssetPreviewLifetimeMs: number\n\treadonly actionShortcutsLocation: 'menu' | 'toolbar' | 'swap'\n\treadonly createTextOnCanvasDoubleClick: boolean\n\t/**\n\t * The react provider to use when exporting an image. This is useful if your shapes depend on\n\t * external context providers. By default, this is `React.Fragment`.\n\t */\n\treadonly exportProvider: ComponentType<{ children: React.ReactNode }>\n\t/**\n\t * By default, the toolbar items are accessible via number shortcuts according to their order. To disable this, set this option to false.\n\t */\n\treadonly enableToolbarKeyboardShortcuts: boolean\n\t/**\n\t * The maximum number of fonts that will be loaded while blocking the main rendering of the\n\t * canvas. If there are more than this number of fonts needed, we'll just show the canvas right\n\t * away and let the fonts load in in the background.\n\t */\n\treadonly maxFontsToLoadBeforeRender: number\n}\n\n/** @public */\nexport const defaultTldrawOptions = {\n\tmaxShapesPerPage: 4000,\n\tmaxFilesAtOnce: 100,\n\tmaxPages: 40,\n\tanimationMediumMs: 320,\n\tfollowChaseViewportSnap: 2,\n\tdoubleClickDurationMs: 450,\n\tmultiClickDurationMs: 200,\n\tcoarseDragDistanceSquared: 36, // 6 squared\n\tdragDistanceSquared: 16, // 4 squared\n\tdefaultSvgPadding: 32,\n\tcameraSlideFriction: 0.09,\n\tgridSteps: [\n\t\t{ min: -1, mid: 0.15, step: 64 },\n\t\t{ min: 0.05, mid: 0.375, step: 16 },\n\t\t{ min: 0.15, mid: 1, step: 4 },\n\t\t{ min: 0.7, mid: 2.5, step: 1 },\n\t],\n\tcollaboratorInactiveTimeoutMs: 60000,\n\tcollaboratorIdleTimeoutMs: 3000,\n\tcollaboratorCheckIntervalMs: 1200,\n\tcameraMovingTimeoutMs: 64,\n\thitTestMargin: 8,\n\tedgeScrollDelay: 200,\n\tedgeScrollEaseDuration: 200,\n\tedgeScrollSpeed: 25,\n\tedgeScrollDistance: 8,\n\tcoarsePointerWidth: 12,\n\tcoarseHandleRadius: 20,\n\thandleRadius: 12,\n\tlongPressDurationMs: 500,\n\ttextShadowLod: 0.35,\n\tadjacentShapeMargin: 10,\n\tflattenImageBoundsExpand: 64,\n\tflattenImageBoundsPadding: 16,\n\tlaserDelayMs: 1200,\n\tmaxExportDelayMs: 5000,\n\ttemporaryAssetPreviewLifetimeMs: 180000,\n\tactionShortcutsLocation: 'swap',\n\tcreateTextOnCanvasDoubleClick: true,\n\texportProvider: Fragment,\n\tenableToolbarKeyboardShortcuts: true,\n\tmaxFontsToLoadBeforeRender: Infinity,\n} as const satisfies TldrawOptions\n"],
|
|
5
|
+
"mappings": "AAAA,SAAwB,gBAAgB;AAgFjC,MAAM,uBAAuB;AAAA,EACnC,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,2BAA2B;AAAA;AAAA,EAC3B,qBAAqB;AAAA;AAAA,EACrB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,WAAW;AAAA,IACV,EAAE,KAAK,IAAI,KAAK,MAAM,MAAM,GAAG;AAAA,IAC/B,EAAE,KAAK,MAAM,KAAK,OAAO,MAAM,GAAG;AAAA,IAClC,EAAE,KAAK,MAAM,KAAK,GAAG,MAAM,EAAE;AAAA,IAC7B,EAAE,KAAK,KAAK,KAAK,KAAK,MAAM,EAAE;AAAA,EAC/B;AAAA,EACA,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iCAAiC;AAAA,EACjC,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,gBAAgB;AAAA,EAChB,gCAAgC;AAAA,EAChC,4BAA4B;AAC7B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -12,6 +12,11 @@ function getBrowserCanvasMaxSize() {
|
|
|
12
12
|
}
|
|
13
13
|
return maxCanvasSizes;
|
|
14
14
|
}
|
|
15
|
+
/*!
|
|
16
|
+
* Extracted from https://github.com/jhildenbiddle/canvas-size
|
|
17
|
+
* MIT License: https://github.com/jhildenbiddle/canvas-size/blob/master/LICENSE
|
|
18
|
+
* Copyright (c) John Hildenbiddle
|
|
19
|
+
*/
|
|
15
20
|
const MAX_SAFE_CANVAS_DIMENSION = 8192;
|
|
16
21
|
const MAX_SAFE_CANVAS_AREA = 4096 * 4096;
|
|
17
22
|
const TEST_SIZES = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/utils/browserCanvasMaxSize.ts"],
|
|
4
|
-
"sourcesContent": ["/** @internal */\nexport interface CanvasMaxSize {\n\tmaxWidth: number\n\tmaxHeight: number\n\tmaxArea: number\n}\n\n// Cache this, only want to do this once per browser session\nlet maxCanvasSizes: CanvasMaxSize | null = null\n\nfunction getBrowserCanvasMaxSize(): CanvasMaxSize {\n\tif (!maxCanvasSizes) {\n\t\tmaxCanvasSizes = {\n\t\t\tmaxWidth: getCanvasSize('width'), // test very wide but 1 pixel tall canvases\n\t\t\tmaxHeight: getCanvasSize('height'), // test very tall but 1 pixel wide canvases\n\t\t\tmaxArea: getCanvasSize('area'), // test square canvases\n\t\t}\n\t}\n\treturn maxCanvasSizes\n}\n\n
|
|
5
|
-
"mappings": "AAQA,IAAI,iBAAuC;AAE3C,SAAS,0BAAyC;AACjD,MAAI,CAAC,gBAAgB;AACpB,qBAAiB;AAAA,MAChB,UAAU,cAAc,OAAO;AAAA;AAAA,MAC/B,WAAW,cAAc,QAAQ;AAAA;AAAA,MACjC,SAAS,cAAc,MAAM;AAAA;AAAA,IAC9B;AAAA,EACD;AACA,SAAO;AACR;AAMA,MAAM,4BAA4B;AAClC,MAAM,uBAAuB,OAAO;AAEpC,MAAM,aAAa;AAAA,EAClB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA,IAGA;AAAA,EACD;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA,IAGP;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAAA;AAAA,IAGN;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACD;AACD;AAMO,SAAS,cAAc,WAAwC;AACrE,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,QAAQ;AAChB,UAAQ,SAAS;AACjB,QAAM,UAAU,QAAQ,WAAW,IAAI;AAEvC,aAAW,QAAQ,WAAW,SAAS,GAAG;AACzC,UAAM,IAAI,cAAc,WAAW,IAAI;AACvC,UAAM,IAAI,cAAc,UAAU,IAAI;AAEtC,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,YAAQ,QAAQ;AAChB,YAAQ,SAAS;AACjB,UAAM,UAAU,QAAQ,WAAW,IAAI;AAEvC,YAAQ,SAAS,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AACnC,YAAQ,UAAU,SAAS,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEzD,UAAM,eAAe,QAAQ,aAAa,GAAG,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM;AAElE,YAAQ,QAAQ;AAChB,YAAQ,SAAS;AAEjB,QAAI,cAAc;AAEjB,cAAQ,QAAQ;AAChB,cAAQ,SAAS;AAEjB,UAAI,cAAc,QAAQ;AACzB,eAAO,OAAO;AAAA,MACf,OAAO;AACN,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAGA,UAAQ,QAAQ;AAChB,UAAQ,SAAS;AAEjB,QAAM,MAAM,8CAA8C;AAC3D;AAGO,SAAS,4BAA4B,OAAe,QAAgB;AAC1E,MACC,SAAS,6BACT,UAAU,6BACV,QAAQ,UAAU,sBACjB;AACD,WAAO,CAAC,OAAO,MAAM;AAAA,EACtB;AAEA,QAAM,EAAE,UAAU,WAAW,QAAQ,IAAI,wBAAwB;AACjE,QAAM,cAAc,QAAQ;AAE5B,MAAI,QAAQ,UAAU;AACrB,YAAQ;AACR,aAAS,QAAQ;AAAA,EAClB;AAEA,MAAI,SAAS,WAAW;AACvB,aAAS;AACT,YAAQ,SAAS;AAAA,EAClB;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC7B,UAAM,QAAQ,KAAK,KAAK,WAAW,QAAQ,OAAO;AAClD,aAAS;AACT,cAAU;AAAA,EACX;AAEA,SAAO,CAAC,OAAO,MAAM;AACtB;",
|
|
4
|
+
"sourcesContent": ["/** @internal */\nexport interface CanvasMaxSize {\n\tmaxWidth: number\n\tmaxHeight: number\n\tmaxArea: number\n}\n\n// Cache this, only want to do this once per browser session\nlet maxCanvasSizes: CanvasMaxSize | null = null\n\nfunction getBrowserCanvasMaxSize(): CanvasMaxSize {\n\tif (!maxCanvasSizes) {\n\t\tmaxCanvasSizes = {\n\t\t\tmaxWidth: getCanvasSize('width'), // test very wide but 1 pixel tall canvases\n\t\t\tmaxHeight: getCanvasSize('height'), // test very tall but 1 pixel wide canvases\n\t\t\tmaxArea: getCanvasSize('area'), // test square canvases\n\t\t}\n\t}\n\treturn maxCanvasSizes\n}\n\n/*!\n * Extracted from https://github.com/jhildenbiddle/canvas-size\n * MIT License: https://github.com/jhildenbiddle/canvas-size/blob/master/LICENSE\n * Copyright (c) John Hildenbiddle\n */\n\nconst MAX_SAFE_CANVAS_DIMENSION = 8192\nconst MAX_SAFE_CANVAS_AREA = 4096 * 4096\n\nconst TEST_SIZES = {\n\tarea: [\n\t\t// Chrome 70 (Mac, Win)\n\t\t// Chrome 68 (Android 4.4)\n\t\t// Edge 17 (Win)\n\t\t// Safari 7-12 (Mac)\n\t\t16384,\n\t\t// Chrome 68 (Android 7.1-9)\n\t\t14188,\n\t\t// Chrome 68 (Android 5)\n\t\t11402,\n\t\t// Firefox 63 (Mac, Win)\n\t\t11180,\n\t\t// Chrome 68 (Android 6)\n\t\t10836,\n\t\t// IE 9-11 (Win)\n\t\t8192,\n\t\t// IE Mobile (Windows Phone 8.x)\n\t\t// Safari (iOS 9 - 12)\n\t\t4096,\n\t],\n\theight: [\n\t\t// Safari 7-12 (Mac)\n\t\t// Safari (iOS 9-12)\n\t\t8388607,\n\t\t// Chrome 83 (Mac, Win)\n\t\t65535,\n\t\t// Chrome 70 (Mac, Win)\n\t\t// Chrome 68 (Android 4.4-9)\n\t\t// Firefox 63 (Mac, Win)\n\t\t32767,\n\t\t// Edge 17 (Win)\n\t\t// IE11 (Win)\n\t\t16384,\n\t\t// IE 9-10 (Win)\n\t\t8192,\n\t\t// IE Mobile (Windows Phone 8.x)\n\t\t4096,\n\t],\n\twidth: [\n\t\t// Safari 7-12 (Mac)\n\t\t// Safari (iOS 9-12)\n\t\t4194303,\n\t\t// Chrome 83 (Mac, Win)\n\t\t65535,\n\t\t// Chrome 70 (Mac, Win)\n\t\t// Chrome 68 (Android 4.4-9)\n\t\t// Firefox 63 (Mac, Win)\n\t\t32767,\n\t\t// Edge 17 (Win)\n\t\t// IE11 (Win)\n\t\t16384,\n\t\t// IE 9-10 (Win)\n\t\t8192,\n\t\t// IE Mobile (Windows Phone 8.x)\n\t\t4096,\n\t],\n} as const\n\n/**\n * Tests ability to read pixel data from canvas elements of various dimensions\n * by decreasing canvas height and/or width until a test succeeds.\n */\nexport function getCanvasSize(dimension: 'width' | 'height' | 'area') {\n\tconst cropCvs = document.createElement('canvas')\n\tcropCvs.width = 1\n\tcropCvs.height = 1\n\tconst cropCtx = cropCvs.getContext('2d')!\n\n\tfor (const size of TEST_SIZES[dimension]) {\n\t\tconst w = dimension === 'height' ? 1 : size\n\t\tconst h = dimension === 'width' ? 1 : size\n\n\t\tconst testCvs = document.createElement('canvas')\n\t\ttestCvs.width = w\n\t\ttestCvs.height = h\n\t\tconst testCtx = testCvs.getContext('2d')!\n\n\t\ttestCtx.fillRect(w - 1, h - 1, 1, 1)\n\t\tcropCtx.drawImage(testCvs, w - 1, h - 1, 1, 1, 0, 0, 1, 1)\n\n\t\tconst isTestPassed = cropCtx.getImageData(0, 0, 1, 1).data[3] !== 0\n\t\t// release memory\n\t\ttestCvs.width = 0\n\t\ttestCvs.height = 0\n\n\t\tif (isTestPassed) {\n\t\t\t// release memory\n\t\t\tcropCvs.width = 0\n\t\t\tcropCvs.height = 0\n\n\t\t\tif (dimension === 'area') {\n\t\t\t\treturn size * size\n\t\t\t} else {\n\t\t\t\treturn size\n\t\t\t}\n\t\t}\n\t}\n\n\t// didn't find a good size, release memory and error\n\tcropCvs.width = 0\n\tcropCvs.height = 0\n\n\tthrow Error('Failed to determine maximum canvas dimension')\n}\n\n/** @internal */\nexport function clampToBrowserMaxCanvasSize(width: number, height: number) {\n\tif (\n\t\twidth <= MAX_SAFE_CANVAS_DIMENSION &&\n\t\theight <= MAX_SAFE_CANVAS_DIMENSION &&\n\t\twidth * height <= MAX_SAFE_CANVAS_AREA\n\t) {\n\t\treturn [width, height]\n\t}\n\n\tconst { maxWidth, maxHeight, maxArea } = getBrowserCanvasMaxSize()\n\tconst aspectRatio = width / height\n\n\tif (width > maxWidth) {\n\t\twidth = maxWidth\n\t\theight = width / aspectRatio\n\t}\n\n\tif (height > maxHeight) {\n\t\theight = maxHeight\n\t\twidth = height * aspectRatio\n\t}\n\n\tif (width * height > maxArea) {\n\t\tconst ratio = Math.sqrt(maxArea / (width * height))\n\t\twidth *= ratio\n\t\theight *= ratio\n\t}\n\n\treturn [width, height]\n}\n"],
|
|
5
|
+
"mappings": "AAQA,IAAI,iBAAuC;AAE3C,SAAS,0BAAyC;AACjD,MAAI,CAAC,gBAAgB;AACpB,qBAAiB;AAAA,MAChB,UAAU,cAAc,OAAO;AAAA;AAAA,MAC/B,WAAW,cAAc,QAAQ;AAAA;AAAA,MACjC,SAAS,cAAc,MAAM;AAAA;AAAA,IAC9B;AAAA,EACD;AACA,SAAO;AACR;AAEA;AAAA;AAAA;AAAA;AAAA;AAMA,MAAM,4BAA4B;AAClC,MAAM,uBAAuB,OAAO;AAEpC,MAAM,aAAa;AAAA,EAClB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA,IAGA;AAAA,EACD;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA,IAGP;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAAA;AAAA,IAGN;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACD;AACD;AAMO,SAAS,cAAc,WAAwC;AACrE,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,QAAQ;AAChB,UAAQ,SAAS;AACjB,QAAM,UAAU,QAAQ,WAAW,IAAI;AAEvC,aAAW,QAAQ,WAAW,SAAS,GAAG;AACzC,UAAM,IAAI,cAAc,WAAW,IAAI;AACvC,UAAM,IAAI,cAAc,UAAU,IAAI;AAEtC,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,YAAQ,QAAQ;AAChB,YAAQ,SAAS;AACjB,UAAM,UAAU,QAAQ,WAAW,IAAI;AAEvC,YAAQ,SAAS,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AACnC,YAAQ,UAAU,SAAS,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEzD,UAAM,eAAe,QAAQ,aAAa,GAAG,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM;AAElE,YAAQ,QAAQ;AAChB,YAAQ,SAAS;AAEjB,QAAI,cAAc;AAEjB,cAAQ,QAAQ;AAChB,cAAQ,SAAS;AAEjB,UAAI,cAAc,QAAQ;AACzB,eAAO,OAAO;AAAA,MACf,OAAO;AACN,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAGA,UAAQ,QAAQ;AAChB,UAAQ,SAAS;AAEjB,QAAM,MAAM,8CAA8C;AAC3D;AAGO,SAAS,4BAA4B,OAAe,QAAgB;AAC1E,MACC,SAAS,6BACT,UAAU,6BACV,QAAQ,UAAU,sBACjB;AACD,WAAO,CAAC,OAAO,MAAM;AAAA,EACtB;AAEA,QAAM,EAAE,UAAU,WAAW,QAAQ,IAAI,wBAAwB;AACjE,QAAM,cAAc,QAAQ;AAE5B,MAAI,QAAQ,UAAU;AACrB,YAAQ;AACR,aAAS,QAAQ;AAAA,EAClB;AAEA,MAAI,SAAS,WAAW;AACvB,aAAS;AACT,YAAQ,SAAS;AAAA,EAClB;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC7B,UAAM,QAAQ,KAAK,KAAK,WAAW,QAAQ,OAAO;AAClD,aAAS;AACT,cAAU;AAAA,EACX;AAEA,SAAO,CAAC,OAAO,MAAM;AACtB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -43,7 +43,7 @@ const setStyleProperty = (elm, property, value) => {
|
|
|
43
43
|
const INPUTS = ["input", "select", "button", "textarea"];
|
|
44
44
|
function activeElementShouldCaptureKeys() {
|
|
45
45
|
const { activeElement } = document;
|
|
46
|
-
return !!(activeElement && (activeElement.
|
|
46
|
+
return !!(activeElement && (activeElement.isContentEditable || INPUTS.indexOf(activeElement.tagName.toLowerCase()) > -1));
|
|
47
47
|
}
|
|
48
48
|
export {
|
|
49
49
|
activeElementShouldCaptureKeys,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/utils/dom.ts"],
|
|
4
|
-
"sourcesContent": ["/*\nThis is used to facilitate double clicking and pointer capture on elements.\n\nThe events in this file are possibly set on individual SVG elements, \nsuch as handles or corner handles, rather than on HTML elements or \nSVGSVGElements. Raw SVG elemnets do not support pointerCapture in \nmost cases, meaning that in order for pointer capture to work, we \nneed to crawl up the DOM tree to find the nearest HTML element. Then,\nin order for that element to also call the `onPointerUp` event from\nthis file, we need to manually set that event on that element and\nlater remove it when the pointerup occurs. This is a potential leak\nif the user clicks on a handle but the pointerup does not fire for\nwhatever reason.\n*/\n\nimport React from 'react'\nimport { debugFlags, pointerCaptureTrackingObject } from './debug-flags'\n\n/** @public */\nexport function loopToHtmlElement(elm: Element): HTMLElement {\n\tif (elm instanceof HTMLElement) return elm\n\tif (elm.parentElement) return loopToHtmlElement(elm.parentElement)\n\telse throw Error('Could not find a parent element of an HTML type!')\n}\n\n/**\n * This function calls `event.preventDefault()` for you. Why is that useful?\n *\n * Beacuase if you enable `window.preventDefaultLogging = true` it'll log out a message when it\n * happens. Because we use console.warn rather than (log) you'll get a stack trace in the inspector\n * telling you exactly where it happened. This is important because `e.preventDefault()` is the\n * source of many bugs, but unfortuantly it can't be avoided because it also stops a lot of default\n * behaviour which doesn't make sense in our UI\n *\n * @param event - To prevent default on\n * @public\n */\nexport function preventDefault(event: React.BaseSyntheticEvent | Event) {\n\tevent.preventDefault()\n\tif (debugFlags.logPreventDefaults.get()) {\n\t\tconsole.warn('preventDefault called on event:', event)\n\t}\n}\n\n/** @public */\nexport function setPointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\telement.setPointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\ttrackingObj.set(element, (trackingObj.get(element) ?? 0) + 1)\n\t\tconsole.warn('setPointerCapture called on element:', element, event)\n\t}\n}\n\n/** @public */\nexport function releasePointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\tif (!element.hasPointerCapture(event.pointerId)) {\n\t\treturn\n\t}\n\n\telement.releasePointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\tif (trackingObj.get(element) === 1) {\n\t\t\ttrackingObj.delete(element)\n\t\t} else if (trackingObj.has(element)) {\n\t\t\ttrackingObj.set(element, trackingObj.get(element)! - 1)\n\t\t} else {\n\t\t\tconsole.warn('Release without capture')\n\t\t}\n\t\tconsole.warn('releasePointerCapture called on element:', element, event)\n\t}\n}\n\n/** @public */\nexport const stopEventPropagation = (e: any) => e.stopPropagation()\n\n/** @internal */\nexport const setStyleProperty = (\n\telm: HTMLElement | null,\n\tproperty: string,\n\tvalue: string | number\n) => {\n\tif (!elm) return\n\telm.style.setProperty(property, value as string)\n}\n\nconst INPUTS = ['input', 'select', 'button', 'textarea']\n\n/** @internal */\nexport function activeElementShouldCaptureKeys() {\n\tconst { activeElement } = document\n\treturn !!(\n\t\tactiveElement &&\n\t\t(activeElement.
|
|
5
|
-
"mappings": "AAgBA,SAAS,YAAY,oCAAoC;AAGlD,SAAS,kBAAkB,KAA2B;AAC5D,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,IAAI,cAAe,QAAO,kBAAkB,IAAI,aAAa;AAAA,MAC5D,OAAM,MAAM,kDAAkD;AACpE;AAcO,SAAS,eAAe,OAAyC;AACvE,QAAM,eAAe;AACrB,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,YAAQ,KAAK,mCAAmC,KAAK;AAAA,EACtD;AACD;AAGO,SAAS,kBACf,SACA,OACC;AACD,UAAQ,kBAAkB,MAAM,SAAS;AACzC,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,gBAAY,IAAI,UAAU,YAAY,IAAI,OAAO,KAAK,KAAK,CAAC;AAC5D,YAAQ,KAAK,wCAAwC,SAAS,KAAK;AAAA,EACpE;AACD;AAGO,SAAS,sBACf,SACA,OACC;AACD,MAAI,CAAC,QAAQ,kBAAkB,MAAM,SAAS,GAAG;AAChD;AAAA,EACD;AAEA,UAAQ,sBAAsB,MAAM,SAAS;AAC7C,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,QAAI,YAAY,IAAI,OAAO,MAAM,GAAG;AACnC,kBAAY,OAAO,OAAO;AAAA,IAC3B,WAAW,YAAY,IAAI,OAAO,GAAG;AACpC,kBAAY,IAAI,SAAS,YAAY,IAAI,OAAO,IAAK,CAAC;AAAA,IACvD,OAAO;AACN,cAAQ,KAAK,yBAAyB;AAAA,IACvC;AACA,YAAQ,KAAK,4CAA4C,SAAS,KAAK;AAAA,EACxE;AACD;AAGO,MAAM,uBAAuB,CAAC,MAAW,EAAE,gBAAgB;AAG3D,MAAM,mBAAmB,CAC/B,KACA,UACA,UACI;AACJ,MAAI,CAAC,IAAK;AACV,MAAI,MAAM,YAAY,UAAU,KAAe;AAChD;AAEA,MAAM,SAAS,CAAC,SAAS,UAAU,UAAU,UAAU;AAGhD,SAAS,iCAAiC;AAChD,QAAM,EAAE,cAAc,IAAI;AAC1B,SAAO,CAAC,EACP,
|
|
4
|
+
"sourcesContent": ["/*\nThis is used to facilitate double clicking and pointer capture on elements.\n\nThe events in this file are possibly set on individual SVG elements, \nsuch as handles or corner handles, rather than on HTML elements or \nSVGSVGElements. Raw SVG elemnets do not support pointerCapture in \nmost cases, meaning that in order for pointer capture to work, we \nneed to crawl up the DOM tree to find the nearest HTML element. Then,\nin order for that element to also call the `onPointerUp` event from\nthis file, we need to manually set that event on that element and\nlater remove it when the pointerup occurs. This is a potential leak\nif the user clicks on a handle but the pointerup does not fire for\nwhatever reason.\n*/\n\nimport React from 'react'\nimport { debugFlags, pointerCaptureTrackingObject } from './debug-flags'\n\n/** @public */\nexport function loopToHtmlElement(elm: Element): HTMLElement {\n\tif (elm instanceof HTMLElement) return elm\n\tif (elm.parentElement) return loopToHtmlElement(elm.parentElement)\n\telse throw Error('Could not find a parent element of an HTML type!')\n}\n\n/**\n * This function calls `event.preventDefault()` for you. Why is that useful?\n *\n * Beacuase if you enable `window.preventDefaultLogging = true` it'll log out a message when it\n * happens. Because we use console.warn rather than (log) you'll get a stack trace in the inspector\n * telling you exactly where it happened. This is important because `e.preventDefault()` is the\n * source of many bugs, but unfortuantly it can't be avoided because it also stops a lot of default\n * behaviour which doesn't make sense in our UI\n *\n * @param event - To prevent default on\n * @public\n */\nexport function preventDefault(event: React.BaseSyntheticEvent | Event) {\n\tevent.preventDefault()\n\tif (debugFlags.logPreventDefaults.get()) {\n\t\tconsole.warn('preventDefault called on event:', event)\n\t}\n}\n\n/** @public */\nexport function setPointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\telement.setPointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\ttrackingObj.set(element, (trackingObj.get(element) ?? 0) + 1)\n\t\tconsole.warn('setPointerCapture called on element:', element, event)\n\t}\n}\n\n/** @public */\nexport function releasePointerCapture(\n\telement: Element,\n\tevent: React.PointerEvent<Element> | PointerEvent\n) {\n\tif (!element.hasPointerCapture(event.pointerId)) {\n\t\treturn\n\t}\n\n\telement.releasePointerCapture(event.pointerId)\n\tif (debugFlags.logPointerCaptures.get()) {\n\t\tconst trackingObj = pointerCaptureTrackingObject.get()\n\t\tif (trackingObj.get(element) === 1) {\n\t\t\ttrackingObj.delete(element)\n\t\t} else if (trackingObj.has(element)) {\n\t\t\ttrackingObj.set(element, trackingObj.get(element)! - 1)\n\t\t} else {\n\t\t\tconsole.warn('Release without capture')\n\t\t}\n\t\tconsole.warn('releasePointerCapture called on element:', element, event)\n\t}\n}\n\n/** @public */\nexport const stopEventPropagation = (e: any) => e.stopPropagation()\n\n/** @internal */\nexport const setStyleProperty = (\n\telm: HTMLElement | null,\n\tproperty: string,\n\tvalue: string | number\n) => {\n\tif (!elm) return\n\telm.style.setProperty(property, value as string)\n}\n\nconst INPUTS = ['input', 'select', 'button', 'textarea']\n\n/** @internal */\nexport function activeElementShouldCaptureKeys() {\n\tconst { activeElement } = document\n\treturn !!(\n\t\tactiveElement &&\n\t\t((activeElement as HTMLElement).isContentEditable ||\n\t\t\tINPUTS.indexOf(activeElement.tagName.toLowerCase()) > -1)\n\t)\n}\n"],
|
|
5
|
+
"mappings": "AAgBA,SAAS,YAAY,oCAAoC;AAGlD,SAAS,kBAAkB,KAA2B;AAC5D,MAAI,eAAe,YAAa,QAAO;AACvC,MAAI,IAAI,cAAe,QAAO,kBAAkB,IAAI,aAAa;AAAA,MAC5D,OAAM,MAAM,kDAAkD;AACpE;AAcO,SAAS,eAAe,OAAyC;AACvE,QAAM,eAAe;AACrB,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,YAAQ,KAAK,mCAAmC,KAAK;AAAA,EACtD;AACD;AAGO,SAAS,kBACf,SACA,OACC;AACD,UAAQ,kBAAkB,MAAM,SAAS;AACzC,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,gBAAY,IAAI,UAAU,YAAY,IAAI,OAAO,KAAK,KAAK,CAAC;AAC5D,YAAQ,KAAK,wCAAwC,SAAS,KAAK;AAAA,EACpE;AACD;AAGO,SAAS,sBACf,SACA,OACC;AACD,MAAI,CAAC,QAAQ,kBAAkB,MAAM,SAAS,GAAG;AAChD;AAAA,EACD;AAEA,UAAQ,sBAAsB,MAAM,SAAS;AAC7C,MAAI,WAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,6BAA6B,IAAI;AACrD,QAAI,YAAY,IAAI,OAAO,MAAM,GAAG;AACnC,kBAAY,OAAO,OAAO;AAAA,IAC3B,WAAW,YAAY,IAAI,OAAO,GAAG;AACpC,kBAAY,IAAI,SAAS,YAAY,IAAI,OAAO,IAAK,CAAC;AAAA,IACvD,OAAO;AACN,cAAQ,KAAK,yBAAyB;AAAA,IACvC;AACA,YAAQ,KAAK,4CAA4C,SAAS,KAAK;AAAA,EACxE;AACD;AAGO,MAAM,uBAAuB,CAAC,MAAW,EAAE,gBAAgB;AAG3D,MAAM,mBAAmB,CAC/B,KACA,UACA,UACI;AACJ,MAAI,CAAC,IAAK;AACV,MAAI,MAAM,YAAY,UAAU,KAAe;AAChD;AAEA,MAAM,SAAS,CAAC,SAAS,UAAU,UAAU,UAAU;AAGhD,SAAS,iCAAiC;AAChD,QAAM,EAAE,cAAc,IAAI;AAC1B,SAAO,CAAC,EACP,kBACE,cAA8B,qBAC/B,OAAO,QAAQ,cAAc,QAAQ,YAAY,CAAC,IAAI;AAEzD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getSchema } from "@tiptap/core";
|
|
2
|
+
import { Node } from "@tiptap/pm/model";
|
|
3
|
+
import { assert } from "@tldraw/utils";
|
|
4
|
+
function getFontsFromRichText(editor, richText, initialState) {
|
|
5
|
+
const { tipTapConfig, addFontsFromNode } = editor.getTextOptions();
|
|
6
|
+
assert(tipTapConfig, "textOptions.tipTapConfig must be set to use rich text");
|
|
7
|
+
assert(addFontsFromNode, "textOptions.addFontsFromNode must be set to use rich text");
|
|
8
|
+
const schema = getSchema(tipTapConfig.extensions ?? []);
|
|
9
|
+
const rootNode = Node.fromJSON(schema, richText);
|
|
10
|
+
const fonts = /* @__PURE__ */ new Set();
|
|
11
|
+
function addFont(font) {
|
|
12
|
+
fonts.add(font);
|
|
13
|
+
}
|
|
14
|
+
function visit(node, state) {
|
|
15
|
+
state = addFontsFromNode(node, state, addFont);
|
|
16
|
+
for (const child of node.children) {
|
|
17
|
+
visit(child, state);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
visit(rootNode, initialState);
|
|
21
|
+
return Array.from(fonts);
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
getFontsFromRichText
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=richText.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/lib/utils/richText.ts"],
|
|
4
|
+
"sourcesContent": ["import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'\nimport { Node } from '@tiptap/pm/model'\nimport { EditorProviderProps } from '@tiptap/react'\nimport { TLRichText } from '@tldraw/tlschema'\nimport { assert } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { TLFontFace } from '../editor/managers/FontManager'\n\n/**\n * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.\n *\n * @public\n */\nexport type TiptapEditor = TTEditor\n\n/**\n * A TipTap node. See {@link https://tiptap.dev/docs}.\n * @public\n */\nexport type TiptapNode = Node\n\n/** @public */\nexport interface TLTextOptions {\n\ttipTapConfig?: EditorProviderProps\n\taddFontsFromNode?: RichTextFontVisitor\n}\n\n/** @public */\nexport interface RichTextFontVisitorState {\n\treadonly family: string\n\treadonly weight: string\n\treadonly style: string\n}\n\n/** @public */\nexport type RichTextFontVisitor = (\n\tnode: TiptapNode,\n\tstate: RichTextFontVisitorState,\n\taddFont: (font: TLFontFace) => void\n) => RichTextFontVisitorState\n\n/** @public */\nexport function getFontsFromRichText(\n\teditor: Editor,\n\trichText: TLRichText,\n\tinitialState: RichTextFontVisitorState\n) {\n\tconst { tipTapConfig, addFontsFromNode } = editor.getTextOptions()\n\tassert(tipTapConfig, 'textOptions.tipTapConfig must be set to use rich text')\n\tassert(addFontsFromNode, 'textOptions.addFontsFromNode must be set to use rich text')\n\n\tconst schema = getSchema(tipTapConfig.extensions ?? [])\n\tconst rootNode = Node.fromJSON(schema, richText as JSONContent)\n\n\tconst fonts = new Set<TLFontFace>()\n\n\tfunction addFont(font: TLFontFace) {\n\t\tfonts.add(font)\n\t}\n\n\tfunction visit(node: TiptapNode, state: RichTextFontVisitorState) {\n\t\tstate = addFontsFromNode!(node, state, addFont)\n\n\t\tfor (const child of node.children) {\n\t\t\tvisit(child, state)\n\t\t}\n\t}\n\n\tvisit(rootNode, initialState)\n\n\treturn Array.from(fonts)\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAkD;AAC3D,SAAS,YAAY;AAGrB,SAAS,cAAc;AAsChB,SAAS,qBACf,QACA,UACA,cACC;AACD,QAAM,EAAE,cAAc,iBAAiB,IAAI,OAAO,eAAe;AACjE,SAAO,cAAc,uDAAuD;AAC5E,SAAO,kBAAkB,2DAA2D;AAEpF,QAAM,SAAS,UAAU,aAAa,cAAc,CAAC,CAAC;AACtD,QAAM,WAAW,KAAK,SAAS,QAAQ,QAAuB;AAE9D,QAAM,QAAQ,oBAAI,IAAgB;AAElC,WAAS,QAAQ,MAAkB;AAClC,UAAM,IAAI,IAAI;AAAA,EACf;AAEA,WAAS,MAAM,MAAkB,OAAiC;AACjE,YAAQ,iBAAkB,MAAM,OAAO,OAAO;AAE9C,eAAW,SAAS,KAAK,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACnB;AAAA,EACD;AAEA,QAAM,UAAU,YAAY;AAE5B,SAAO,MAAM,KAAK,KAAK;AACxB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist-esm/version.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const version = "3.
|
|
1
|
+
const version = "3.10.0-canary.12c0cb0549ca";
|
|
2
2
|
const publishDates = {
|
|
3
3
|
major: "2024-09-13T14:36:29.063Z",
|
|
4
|
-
minor: "2025-03-
|
|
5
|
-
patch: "2025-03-
|
|
4
|
+
minor: "2025-03-06T09:01:02.970Z",
|
|
5
|
+
patch: "2025-03-06T09:01:02.970Z"
|
|
6
6
|
};
|
|
7
7
|
export {
|
|
8
8
|
publishDates,
|
package/dist-esm/version.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\nexport const version = '3.
|
|
4
|
+
"sourcesContent": ["// This file is automatically generated by internal/scripts/refresh-assets.ts.\n// Do not edit manually. Or do, I'm a comment, not a cop.\n\nexport const version = '3.10.0-canary.12c0cb0549ca'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-03-06T09:01:02.970Z',\n\tpatch: '2025-03-06T09:01:02.970Z',\n}\n"],
|
|
5
5
|
"mappings": "AAGO,MAAM,UAAU;AAChB,MAAM,eAAe;AAAA,EAC3B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACR;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/editor.css
CHANGED
|
@@ -156,6 +156,8 @@
|
|
|
156
156
|
--color-text-1: hsl(0, 0%, 18%);
|
|
157
157
|
--color-text-3: hsl(220, 2%, 65%);
|
|
158
158
|
--color-text-shadow: hsl(0, 0%, 100%);
|
|
159
|
+
--color-text-highlight: hsl(52, 100%, 50%);
|
|
160
|
+
--color-text-highlight-p3: color(display-p3 0.972 0.8205 0.05);
|
|
159
161
|
--color-primary: hsl(214, 84%, 56%);
|
|
160
162
|
--color-success: hsl(123, 46%, 34%);
|
|
161
163
|
--color-info: hsl(201, 98%, 41%);
|
|
@@ -202,6 +204,8 @@
|
|
|
202
204
|
--color-text-1: hsl(0, 0%, 85%);
|
|
203
205
|
--color-text-3: hsl(210, 6%, 45%);
|
|
204
206
|
--color-text-shadow: hsl(210, 13%, 18%);
|
|
207
|
+
--color-text-highlight: hsl(52, 100%, 41%);
|
|
208
|
+
--color-text-highlight-p3: color(display-p3 0.8078 0.6225 0.0312);
|
|
205
209
|
--color-primary: hsl(214, 84%, 56%);
|
|
206
210
|
--color-success: hsl(123, 38%, 57%);
|
|
207
211
|
--color-info: hsl(199, 92%, 56%);
|
|
@@ -248,7 +252,7 @@
|
|
|
248
252
|
input,
|
|
249
253
|
*[contenteditable],
|
|
250
254
|
*[contenteditable] * {
|
|
251
|
-
|
|
255
|
+
user-select: text;
|
|
252
256
|
}
|
|
253
257
|
|
|
254
258
|
/* -------------------------------------------------- */
|
|
@@ -722,17 +726,14 @@ input,
|
|
|
722
726
|
opacity: 0.7;
|
|
723
727
|
}
|
|
724
728
|
|
|
725
|
-
/*
|
|
726
|
-
/* Spinner */
|
|
727
|
-
/* -------------------------------------------------- */
|
|
728
|
-
|
|
729
|
+
/* --------------------- Spinner -------------------- */
|
|
729
730
|
@keyframes spinner {
|
|
730
731
|
to {
|
|
731
732
|
transform: rotate(360deg);
|
|
732
733
|
}
|
|
733
734
|
}
|
|
734
735
|
|
|
735
|
-
/*
|
|
736
|
+
/* ---------------------- Text ---------------------- */
|
|
736
737
|
|
|
737
738
|
.tl-text-shape-label {
|
|
738
739
|
position: relative;
|
|
@@ -782,10 +783,14 @@ input,
|
|
|
782
783
|
text-align: right;
|
|
783
784
|
}
|
|
784
785
|
|
|
785
|
-
.tl-text-wrapper[data-isediting='true'] .tl-text-content {
|
|
786
|
+
.tl-plain-text-wrapper[data-isediting='true'] .tl-text-content {
|
|
786
787
|
opacity: 0;
|
|
787
788
|
}
|
|
788
789
|
|
|
790
|
+
.tl-rich-text-wrapper[data-isediting='true'] .tl-text-content {
|
|
791
|
+
display: none;
|
|
792
|
+
}
|
|
793
|
+
|
|
789
794
|
.tl-text {
|
|
790
795
|
/* remove overflow from textarea on windows */
|
|
791
796
|
margin: 0px;
|
|
@@ -852,7 +857,6 @@ input,
|
|
|
852
857
|
width: 100%;
|
|
853
858
|
min-width: 1px;
|
|
854
859
|
min-height: 1px;
|
|
855
|
-
overflow: visible;
|
|
856
860
|
outline: none;
|
|
857
861
|
}
|
|
858
862
|
|
|
@@ -868,6 +872,7 @@ input,
|
|
|
868
872
|
}
|
|
869
873
|
|
|
870
874
|
.tl-text-content {
|
|
875
|
+
overflow: visible;
|
|
871
876
|
pointer-events: none;
|
|
872
877
|
}
|
|
873
878
|
|
|
@@ -875,10 +880,17 @@ input,
|
|
|
875
880
|
resize: none;
|
|
876
881
|
user-select: all;
|
|
877
882
|
-webkit-user-select: text;
|
|
878
|
-
overflow: hidden;
|
|
879
883
|
cursor: var(--tl-cursor-text);
|
|
880
884
|
}
|
|
881
885
|
|
|
886
|
+
.tl-text-input:not(.tl-rich-text) {
|
|
887
|
+
/*
|
|
888
|
+
* Note: this `overflow: hidden` is key for scrollbars to not show up
|
|
889
|
+
* plaintext/<textarea> editors.
|
|
890
|
+
*/
|
|
891
|
+
overflow: hidden;
|
|
892
|
+
}
|
|
893
|
+
|
|
882
894
|
.tl-text-wrapper[data-isediting='false'] .tl-text-input,
|
|
883
895
|
.tl-arrow-label[data-isediting='false'] .tl-text-input {
|
|
884
896
|
opacity: 0;
|
|
@@ -891,6 +903,109 @@ input,
|
|
|
891
903
|
text-shadow: none;
|
|
892
904
|
}
|
|
893
905
|
|
|
906
|
+
.tl-rich-text[data-iseditinganything='true'] {
|
|
907
|
+
cursor: var(--tl-cursor-text);
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
.tl-rich-text .ProseMirror {
|
|
911
|
+
word-wrap: break-word;
|
|
912
|
+
overflow-wrap: break-word;
|
|
913
|
+
white-space: pre-wrap;
|
|
914
|
+
|
|
915
|
+
/**
|
|
916
|
+
* Note: ProseMirror disables this in https://github.com/ProseMirror/prosemirror-view/commit/6b3b2205e2f3029cb8e8e86c55a190a22491df31
|
|
917
|
+
* However, that was from 8 years ago and the browser caret issue
|
|
918
|
+
* it mentions seems to be fixed. So, we're re-enabling it.
|
|
919
|
+
* We'll tell ProseMirror maybe to get rid of this on their end.
|
|
920
|
+
*/
|
|
921
|
+
-webkit-font-variant-ligatures: inherit;
|
|
922
|
+
font-variant-ligatures: inherit;
|
|
923
|
+
font-feature-settings: inherit;
|
|
924
|
+
|
|
925
|
+
/**
|
|
926
|
+
* N.B. This following CSS Rule comes standard with the tiptap editor.
|
|
927
|
+
* Combined with the above rule that it supersedes, it allows for
|
|
928
|
+
* the auto-linking to work in text. Say, when typing example.com
|
|
929
|
+
* this helps it automatically turn that bit of text into a link.
|
|
930
|
+
*
|
|
931
|
+
* However, specifically, the break-spaces features seems to cause
|
|
932
|
+
* rendering differences when going in-and-out of edit mode. For example,
|
|
933
|
+
* the statically rendered text 'the rain in spain falls mainly on the plain'
|
|
934
|
+
* in a note shape will render differently when going in-and-out of edit mode.
|
|
935
|
+
*
|
|
936
|
+
* So, this is commented out to help make both the autolinking work (which now
|
|
937
|
+
* relies on the white-space: pre-wrap to work and to make the static/edit-mode
|
|
938
|
+
* rendering consistent.
|
|
939
|
+
* In the future, we might consider just making the static rendering just use
|
|
940
|
+
* white-space: break-spaces to make it consistent with the edit mode if need be.
|
|
941
|
+
*
|
|
942
|
+
* Also, the amount of ink I've spilt in my career writing comments explaining
|
|
943
|
+
* white-space in contenteditable is incredible.
|
|
944
|
+
*
|
|
945
|
+
/* white-space: break-spaces; */
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
.tl-rich-text p {
|
|
949
|
+
margin: 0;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
.tl-rich-text ul,
|
|
953
|
+
.tl-rich-text ol {
|
|
954
|
+
text-align: left;
|
|
955
|
+
margin: 0;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
.tl-rich-text h1,
|
|
959
|
+
.tl-rich-text h2,
|
|
960
|
+
.tl-rich-text h3,
|
|
961
|
+
.tl-rich-text h4,
|
|
962
|
+
.tl-rich-text h5,
|
|
963
|
+
.tl-rich-text h6 {
|
|
964
|
+
margin-top: 5px;
|
|
965
|
+
margin-bottom: 10px;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
.tl-rich-text a {
|
|
969
|
+
color: var(--color-primary);
|
|
970
|
+
text-decoration: underline;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
.tl-rich-text code {
|
|
974
|
+
font-family: var(--tl-font-mono);
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
.tl-rich-text mark {
|
|
978
|
+
background-color: #fddd00;
|
|
979
|
+
color: currentColor;
|
|
980
|
+
border-radius: 2px;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
.tl-theme__light .tl-rich-text mark {
|
|
984
|
+
text-shadow: none;
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
.tl-theme__dark .tl-rich-text mark {
|
|
988
|
+
background-color: var(--color-text-highlight);
|
|
989
|
+
color: currentColor;
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
@supports (color: color(display-p3 1 1 1)) {
|
|
993
|
+
@media (color-gamut: p3) {
|
|
994
|
+
.tl-container:not(.tl-theme__force-sRGB) .tl-rich-text mark {
|
|
995
|
+
background-color: var(--color-text-highlight-p3);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
.tl-text-label__inner > .tl-text-input.tl-rich-text {
|
|
1001
|
+
display: none;
|
|
1002
|
+
position: static;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
.tl-text-wrapper[data-isediting='true'] .tl-rich-text {
|
|
1006
|
+
display: block;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
894
1009
|
/* ------------------- Snap Lines ------------------- */
|
|
895
1010
|
|
|
896
1011
|
.tl-snap-indicator {
|
|
@@ -1175,10 +1290,6 @@ input,
|
|
|
1175
1290
|
min-height: auto;
|
|
1176
1291
|
}
|
|
1177
1292
|
|
|
1178
|
-
.tl-text-label[data-isediting='true'] p {
|
|
1179
|
-
opacity: 0;
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
1293
|
.tl-arrow-hint {
|
|
1183
1294
|
stroke: var(--color-text-1);
|
|
1184
1295
|
fill: none;
|
|
@@ -1270,6 +1381,9 @@ input,
|
|
|
1270
1381
|
opacity: 0;
|
|
1271
1382
|
animation: fade-in 0.2s ease-in-out forwards;
|
|
1272
1383
|
animation-delay: 0.2s;
|
|
1384
|
+
position: absolute;
|
|
1385
|
+
inset: 0px;
|
|
1386
|
+
z-index: var(--layer-canvas-blocker);
|
|
1273
1387
|
}
|
|
1274
1388
|
|
|
1275
1389
|
@keyframes fade-in {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tldraw/editor",
|
|
3
3
|
"description": "A tiny little drawing app (editor).",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.10.0-canary.12c0cb0549ca",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "tldraw Inc.",
|
|
7
7
|
"email": "hello@tldraw.com"
|
|
@@ -45,12 +45,15 @@
|
|
|
45
45
|
"lint": "yarn run -T tsx ../../internal/scripts/lint.ts"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@
|
|
49
|
-
"@
|
|
50
|
-
"@
|
|
51
|
-
"@tldraw/
|
|
52
|
-
"@tldraw/
|
|
53
|
-
"@tldraw/
|
|
48
|
+
"@tiptap/core": "^2.9.1",
|
|
49
|
+
"@tiptap/pm": "^2.9.1",
|
|
50
|
+
"@tiptap/react": "^2.9.1",
|
|
51
|
+
"@tldraw/state": "3.10.0-canary.12c0cb0549ca",
|
|
52
|
+
"@tldraw/state-react": "3.10.0-canary.12c0cb0549ca",
|
|
53
|
+
"@tldraw/store": "3.10.0-canary.12c0cb0549ca",
|
|
54
|
+
"@tldraw/tlschema": "3.10.0-canary.12c0cb0549ca",
|
|
55
|
+
"@tldraw/utils": "3.10.0-canary.12c0cb0549ca",
|
|
56
|
+
"@tldraw/validate": "3.10.0-canary.12c0cb0549ca",
|
|
54
57
|
"@types/core-js": "^2.5.8",
|
|
55
58
|
"@use-gesture/react": "^10.3.1",
|
|
56
59
|
"classnames": "^2.5.1",
|
package/src/index.ts
CHANGED
|
@@ -26,6 +26,14 @@ export {
|
|
|
26
26
|
useValue,
|
|
27
27
|
} from '@tldraw/state-react'
|
|
28
28
|
export { resizeScaled } from './lib/editor/shapes/shared/resizeScaled'
|
|
29
|
+
export {
|
|
30
|
+
getFontsFromRichText,
|
|
31
|
+
type RichTextFontVisitor,
|
|
32
|
+
type RichTextFontVisitorState,
|
|
33
|
+
type TLTextOptions,
|
|
34
|
+
type TiptapEditor,
|
|
35
|
+
type TiptapNode,
|
|
36
|
+
} from './lib/utils/richText'
|
|
29
37
|
export { LocalIndexedDb, Table, type StoreName } from './lib/utils/sync/LocalIndexedDb'
|
|
30
38
|
// eslint-disable-next-line local/no-export-star
|
|
31
39
|
export * from '@tldraw/store'
|
|
@@ -163,6 +171,11 @@ export {
|
|
|
163
171
|
} from './lib/editor/bindings/BindingUtil'
|
|
164
172
|
export { ClickManager, type TLClickState } from './lib/editor/managers/ClickManager'
|
|
165
173
|
export { EdgeScrollManager } from './lib/editor/managers/EdgeScrollManager'
|
|
174
|
+
export {
|
|
175
|
+
FontManager,
|
|
176
|
+
type TLFontFace,
|
|
177
|
+
type TLFontFaceSource,
|
|
178
|
+
} from './lib/editor/managers/FontManager'
|
|
166
179
|
export { HistoryManager } from './lib/editor/managers/HistoryManager'
|
|
167
180
|
export { ScribbleManager, type ScribbleItem } from './lib/editor/managers/ScribbleManager'
|
|
168
181
|
export {
|
|
@@ -299,6 +312,7 @@ export { useIsCropping } from './lib/hooks/useIsCropping'
|
|
|
299
312
|
export { useIsDarkMode } from './lib/hooks/useIsDarkMode'
|
|
300
313
|
export { useIsEditing } from './lib/hooks/useIsEditing'
|
|
301
314
|
export { useLocalStore } from './lib/hooks/useLocalStore'
|
|
315
|
+
export { usePassThroughMouseOverEvents } from './lib/hooks/usePassThroughMouseOverEvents'
|
|
302
316
|
export { usePassThroughWheelEvents } from './lib/hooks/usePassThroughWheelEvents'
|
|
303
317
|
export { usePeerIds } from './lib/hooks/usePeerIds'
|
|
304
318
|
export { usePresence } from './lib/hooks/usePresence'
|
|
@@ -313,6 +327,7 @@ export {
|
|
|
313
327
|
export { useSelectionEvents } from './lib/hooks/useSelectionEvents'
|
|
314
328
|
export { useTLSchemaFromUtils, useTLStore } from './lib/hooks/useTLStore'
|
|
315
329
|
export { useTransform } from './lib/hooks/useTransform'
|
|
330
|
+
export { useViewportHeight } from './lib/hooks/useViewportHeight'
|
|
316
331
|
export {
|
|
317
332
|
LicenseManager,
|
|
318
333
|
type InvalidLicenseKeyResult,
|
package/src/lib/TldrawEditor.tsx
CHANGED
|
@@ -14,7 +14,6 @@ import React, {
|
|
|
14
14
|
} from 'react'
|
|
15
15
|
|
|
16
16
|
import classNames from 'classnames'
|
|
17
|
-
import { TLDeepLinkOptions } from '..'
|
|
18
17
|
import { version } from '../version'
|
|
19
18
|
import { OptionalErrorBoundary } from './components/ErrorBoundary'
|
|
20
19
|
import { DefaultErrorFallback } from './components/default-components/DefaultErrorFallback'
|
|
@@ -44,7 +43,9 @@ import { useZoomCss } from './hooks/useZoomCss'
|
|
|
44
43
|
import { LicenseProvider } from './license/LicenseProvider'
|
|
45
44
|
import { Watermark } from './license/Watermark'
|
|
46
45
|
import { TldrawOptions } from './options'
|
|
46
|
+
import { TLDeepLinkOptions } from './utils/deepLinks'
|
|
47
47
|
import { stopEventPropagation } from './utils/dom'
|
|
48
|
+
import { TLTextOptions } from './utils/richText'
|
|
48
49
|
import { TLStoreWithStatus } from './utils/sync/StoreWithStatus'
|
|
49
50
|
|
|
50
51
|
/**
|
|
@@ -167,6 +168,11 @@ export interface TldrawEditorBaseProps {
|
|
|
167
168
|
*/
|
|
168
169
|
cameraOptions?: Partial<TLCameraOptions>
|
|
169
170
|
|
|
171
|
+
/**
|
|
172
|
+
* Text options for the editor.
|
|
173
|
+
*/
|
|
174
|
+
textOptions?: TLTextOptions
|
|
175
|
+
|
|
170
176
|
/**
|
|
171
177
|
* Options for the editor.
|
|
172
178
|
*/
|
|
@@ -190,6 +196,11 @@ export interface TldrawEditorBaseProps {
|
|
|
190
196
|
* remain in the store and participate in all other operations.
|
|
191
197
|
*/
|
|
192
198
|
isShapeHidden?(shape: TLShape, editor: Editor): boolean
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* The URLs for the fonts to use in the editor.
|
|
202
|
+
*/
|
|
203
|
+
assetUrls?: { fonts?: { [key: string]: string | undefined } }
|
|
193
204
|
}
|
|
194
205
|
|
|
195
206
|
/**
|
|
@@ -372,10 +383,12 @@ function TldrawEditorWithReadyStore({
|
|
|
372
383
|
autoFocus = true,
|
|
373
384
|
inferDarkMode,
|
|
374
385
|
cameraOptions,
|
|
386
|
+
textOptions,
|
|
375
387
|
options,
|
|
376
388
|
licenseKey,
|
|
377
389
|
deepLinks: _deepLinks,
|
|
378
390
|
isShapeHidden,
|
|
391
|
+
assetUrls,
|
|
379
392
|
}: Required<
|
|
380
393
|
TldrawEditorProps & {
|
|
381
394
|
store: TLStore
|
|
@@ -430,9 +443,11 @@ function TldrawEditorWithReadyStore({
|
|
|
430
443
|
autoFocus,
|
|
431
444
|
inferDarkMode,
|
|
432
445
|
cameraOptions,
|
|
446
|
+
textOptions,
|
|
433
447
|
options,
|
|
434
448
|
licenseKey,
|
|
435
449
|
isShapeHidden,
|
|
450
|
+
fontAssetUrls: assetUrls?.fonts,
|
|
436
451
|
})
|
|
437
452
|
|
|
438
453
|
editor.updateViewportScreenBounds(canvasRef.current ?? container)
|
|
@@ -467,6 +482,8 @@ function TldrawEditorWithReadyStore({
|
|
|
467
482
|
setEditor,
|
|
468
483
|
licenseKey,
|
|
469
484
|
isShapeHidden,
|
|
485
|
+
textOptions,
|
|
486
|
+
assetUrls,
|
|
470
487
|
]
|
|
471
488
|
)
|
|
472
489
|
|
|
@@ -532,10 +549,41 @@ function TldrawEditorWithReadyStore({
|
|
|
532
549
|
[editor, autoFocus]
|
|
533
550
|
)
|
|
534
551
|
|
|
535
|
-
const
|
|
552
|
+
const [_fontLoadingState, setFontLoadingState] = useState<{
|
|
553
|
+
editor: Editor
|
|
554
|
+
isLoaded: boolean
|
|
555
|
+
} | null>(null)
|
|
556
|
+
let fontLoadingState = _fontLoadingState
|
|
557
|
+
if (editor !== fontLoadingState?.editor) {
|
|
558
|
+
fontLoadingState = null
|
|
559
|
+
}
|
|
560
|
+
useEffect(() => {
|
|
561
|
+
if (!editor) return
|
|
562
|
+
let isCancelled = false
|
|
563
|
+
|
|
564
|
+
setFontLoadingState({ editor, isLoaded: false })
|
|
565
|
+
|
|
566
|
+
editor.fonts
|
|
567
|
+
.loadRequiredFontsForCurrentPage(editor.options.maxFontsToLoadBeforeRender)
|
|
568
|
+
.finally(() => {
|
|
569
|
+
if (isCancelled) return
|
|
570
|
+
setFontLoadingState({ editor, isLoaded: true })
|
|
571
|
+
})
|
|
572
|
+
|
|
573
|
+
return () => {
|
|
574
|
+
isCancelled = true
|
|
575
|
+
}
|
|
576
|
+
}, [editor])
|
|
536
577
|
|
|
537
|
-
|
|
538
|
-
|
|
578
|
+
const { Canvas, LoadingScreen } = useEditorComponents()
|
|
579
|
+
|
|
580
|
+
if (!editor || !fontLoadingState?.isLoaded) {
|
|
581
|
+
return (
|
|
582
|
+
<>
|
|
583
|
+
{LoadingScreen && <LoadingScreen />}
|
|
584
|
+
<div className="tl-canvas" ref={canvasRef} />
|
|
585
|
+
</>
|
|
586
|
+
)
|
|
539
587
|
}
|
|
540
588
|
|
|
541
589
|
return (
|
|
@@ -92,6 +92,7 @@ const Collaborator = track(function Collaborator({
|
|
|
92
92
|
<CollaboratorBrush
|
|
93
93
|
className="tl-collaborator__brush"
|
|
94
94
|
key={userId + '_brush'}
|
|
95
|
+
userId={userId}
|
|
95
96
|
brush={brush}
|
|
96
97
|
color={color}
|
|
97
98
|
opacity={0.1}
|
|
@@ -101,6 +102,7 @@ const Collaborator = track(function Collaborator({
|
|
|
101
102
|
<CollaboratorCursor
|
|
102
103
|
className="tl-collaborator__cursor"
|
|
103
104
|
key={userId + '_cursor'}
|
|
105
|
+
userId={userId}
|
|
104
106
|
point={cursor}
|
|
105
107
|
color={color}
|
|
106
108
|
zoom={zoomLevel}
|
|
@@ -111,6 +113,7 @@ const Collaborator = track(function Collaborator({
|
|
|
111
113
|
<CollaboratorHint
|
|
112
114
|
className="tl-collaborator__cursor-hint"
|
|
113
115
|
key={userId + '_cursor_hint'}
|
|
116
|
+
userId={userId}
|
|
114
117
|
point={cursor}
|
|
115
118
|
color={color}
|
|
116
119
|
zoom={zoomLevel}
|
|
@@ -123,6 +126,7 @@ const Collaborator = track(function Collaborator({
|
|
|
123
126
|
<CollaboratorScribble
|
|
124
127
|
key={userId + '_scribble_' + scribble.id}
|
|
125
128
|
className="tl-collaborator__scribble"
|
|
129
|
+
userId={userId}
|
|
126
130
|
scribble={scribble}
|
|
127
131
|
color={color}
|
|
128
132
|
zoom={zoomLevel}
|
|
@@ -138,6 +142,7 @@ const Collaborator = track(function Collaborator({
|
|
|
138
142
|
<CollaboratorShapeIndicator
|
|
139
143
|
className="tl-collaborator__shape-indicator"
|
|
140
144
|
key={userId + '_' + shapeId}
|
|
145
|
+
userId={userId}
|
|
141
146
|
shapeId={shapeId}
|
|
142
147
|
color={color}
|
|
143
148
|
opacity={0.5}
|