@tldraw/editor 3.16.0-canary.7facbd2d2b7f → 3.16.0-canary.806d674b7d7a
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 +28 -27
- package/dist-cjs/index.js +4 -2
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/TldrawEditor.js +2 -0
- package/dist-cjs/lib/TldrawEditor.js.map +2 -2
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js +4 -4
- package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +0 -29
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/hooks/useCanvasEvents.js +17 -17
- package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useDocumentEvents.js +4 -4
- package/dist-cjs/lib/hooks/useDocumentEvents.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/useHandleEvents.js +6 -6
- package/dist-cjs/lib/hooks/useHandleEvents.js.map +2 -2
- package/dist-cjs/lib/hooks/useSelectionEvents.js +8 -8
- package/dist-cjs/lib/hooks/useSelectionEvents.js.map +2 -2
- package/dist-cjs/lib/license/Watermark.js +90 -97
- package/dist-cjs/lib/license/Watermark.js.map +2 -2
- package/dist-cjs/lib/utils/dom.js +12 -1
- package/dist-cjs/lib/utils/dom.js.map +2 -2
- package/dist-cjs/lib/utils/getPointerInfo.js +3 -2
- package/dist-cjs/lib/utils/getPointerInfo.js.map +2 -2
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +28 -27
- package/dist-esm/index.mjs +7 -3
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +2 -0
- package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +5 -5
- package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +0 -29
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/hooks/useCanvasEvents.mjs +24 -18
- package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useDocumentEvents.mjs +10 -5
- package/dist-esm/lib/hooks/useDocumentEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs +2 -2
- package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useHandleEvents.mjs +12 -7
- package/dist-esm/lib/hooks/useHandleEvents.mjs.map +2 -2
- package/dist-esm/lib/hooks/useSelectionEvents.mjs +15 -9
- package/dist-esm/lib/hooks/useSelectionEvents.mjs.map +2 -2
- package/dist-esm/lib/license/Watermark.mjs +91 -98
- package/dist-esm/lib/license/Watermark.mjs.map +2 -2
- package/dist-esm/lib/utils/dom.mjs +12 -1
- package/dist-esm/lib/utils/dom.mjs.map +2 -2
- package/dist-esm/lib/utils/getPointerInfo.mjs +3 -2
- package/dist-esm/lib/utils/getPointerInfo.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +2 -0
- package/src/lib/TldrawEditor.tsx +2 -0
- package/src/lib/components/default-components/DefaultCanvas.tsx +5 -5
- package/src/lib/editor/Editor.ts +0 -33
- package/src/lib/hooks/useCanvasEvents.ts +24 -18
- package/src/lib/hooks/useDocumentEvents.ts +10 -5
- package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +2 -2
- package/src/lib/hooks/useHandleEvents.ts +12 -7
- package/src/lib/hooks/useSelectionEvents.ts +15 -9
- package/src/lib/license/Watermark.tsx +92 -100
- package/src/lib/utils/dom.test.ts +24 -33
- package/src/lib/utils/dom.ts +31 -1
- package/src/lib/utils/getPointerInfo.ts +3 -3
- package/src/version.ts +3 -3
|
@@ -58,11 +58,10 @@ const UnlicensedWatermark = (0, import_react.memo)(function UnlicensedWatermark2
|
|
|
58
58
|
isDebugMode,
|
|
59
59
|
isMobile
|
|
60
60
|
}) {
|
|
61
|
-
const editor = (0, import_useEditor.useEditor)();
|
|
62
61
|
const events = (0, import_useCanvasEvents.useCanvasEvents)();
|
|
63
62
|
const ref = (0, import_react.useRef)(null);
|
|
64
63
|
(0, import_usePassThroughWheelEvents.usePassThroughWheelEvents)(ref);
|
|
65
|
-
const url = "https://tldraw.dev
|
|
64
|
+
const url = "https://tldraw.dev/?utm_source=dotcom&utm_medium=organic&utm_campaign=watermark";
|
|
66
65
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
67
66
|
"div",
|
|
68
67
|
{
|
|
@@ -80,12 +79,25 @@ const UnlicensedWatermark = (0, import_react.memo)(function UnlicensedWatermark2
|
|
|
80
79
|
draggable: false,
|
|
81
80
|
role: "button",
|
|
82
81
|
onPointerDown: (e) => {
|
|
83
|
-
|
|
82
|
+
(0, import_dom.markEventAsHandled)(e);
|
|
84
83
|
(0, import_dom.preventDefault)(e);
|
|
85
84
|
},
|
|
86
|
-
title: "
|
|
85
|
+
title: "Unlicensed - click to get a license",
|
|
87
86
|
onClick: () => import_runtime.runtime.openWindow(url, "_blank"),
|
|
88
|
-
|
|
87
|
+
style: {
|
|
88
|
+
position: "absolute",
|
|
89
|
+
pointerEvents: "all",
|
|
90
|
+
cursor: "pointer",
|
|
91
|
+
color: "var(--tl-color-text)",
|
|
92
|
+
opacity: 0.8,
|
|
93
|
+
border: 0,
|
|
94
|
+
padding: 0,
|
|
95
|
+
backgroundColor: "transparent",
|
|
96
|
+
fontSize: "11px",
|
|
97
|
+
fontWeight: "600",
|
|
98
|
+
textAlign: "center"
|
|
99
|
+
},
|
|
100
|
+
children: "Unlicensed"
|
|
89
101
|
}
|
|
90
102
|
)
|
|
91
103
|
}
|
|
@@ -124,10 +136,10 @@ const WatermarkInner = (0, import_react.memo)(function WatermarkInner2({
|
|
|
124
136
|
draggable: false,
|
|
125
137
|
role: "button",
|
|
126
138
|
onPointerDown: (e) => {
|
|
127
|
-
|
|
139
|
+
(0, import_dom.markEventAsHandled)(e);
|
|
128
140
|
(0, import_dom.preventDefault)(e);
|
|
129
141
|
},
|
|
130
|
-
title: "
|
|
142
|
+
title: "made with tldraw",
|
|
131
143
|
onClick: () => import_runtime.runtime.openWindow(url, "_blank"),
|
|
132
144
|
style: { mask: maskCss, WebkitMask: maskCss }
|
|
133
145
|
}
|
|
@@ -138,8 +150,7 @@ const WatermarkInner = (0, import_react.memo)(function WatermarkInner2({
|
|
|
138
150
|
const LicenseStyles = (0, import_react.memo)(function LicenseStyles2() {
|
|
139
151
|
const editor = (0, import_useEditor.useEditor)();
|
|
140
152
|
const className = import_LicenseManager.LicenseManager.className;
|
|
141
|
-
const CSS =
|
|
142
|
-
/* ------------------- SEE LICENSE -------------------
|
|
153
|
+
const CSS = `/* ------------------- SEE LICENSE -------------------
|
|
143
154
|
The tldraw watermark is part of tldraw's license. It is shown for unlicensed
|
|
144
155
|
or "licensed-with-watermark" users. By using this library, you agree to
|
|
145
156
|
preserve the watermark's behavior, keeping it visible, unobscured, and
|
|
@@ -148,105 +159,87 @@ available to user-interaction.
|
|
|
148
159
|
To remove the watermark, please purchase a license at tldraw.dev.
|
|
149
160
|
*/
|
|
150
161
|
|
|
151
|
-
.${className} {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.${className} > button {
|
|
170
|
-
position: absolute;
|
|
171
|
-
width: 96px;
|
|
172
|
-
height: 32px;
|
|
173
|
-
pointer-events: all;
|
|
174
|
-
cursor: inherit;
|
|
175
|
-
color: var(--tl-color-text);
|
|
176
|
-
opacity: .38;
|
|
177
|
-
border: 0;
|
|
178
|
-
padding: 0;
|
|
179
|
-
background-color: currentColor;
|
|
180
|
-
}
|
|
162
|
+
.${className} {
|
|
163
|
+
position: absolute;
|
|
164
|
+
bottom: max(var(--tl-space-2), env(safe-area-inset-bottom));
|
|
165
|
+
right: max(var(--tl-space-2), env(safe-area-inset-right));
|
|
166
|
+
width: 96px;
|
|
167
|
+
height: 32px;
|
|
168
|
+
display: flex;
|
|
169
|
+
align-items: center;
|
|
170
|
+
justify-content: center;
|
|
171
|
+
z-index: var(--tl-layer-watermark) !important;
|
|
172
|
+
background-color: color-mix(in srgb, var(--tl-color-background) 62%, transparent);
|
|
173
|
+
opacity: 1;
|
|
174
|
+
border-radius: 5px;
|
|
175
|
+
pointer-events: all;
|
|
176
|
+
padding: 2px;
|
|
177
|
+
box-sizing: content-box;
|
|
178
|
+
}
|
|
181
179
|
|
|
182
|
-
.${className}
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
.${className} > button {
|
|
181
|
+
position: absolute;
|
|
182
|
+
width: 96px;
|
|
183
|
+
height: 32px;
|
|
184
|
+
pointer-events: all;
|
|
185
|
+
cursor: inherit;
|
|
186
|
+
color: var(--tl-color-text);
|
|
187
|
+
opacity: .38;
|
|
188
|
+
border: 0;
|
|
189
|
+
padding: 0;
|
|
190
|
+
background-color: currentColor;
|
|
191
|
+
}
|
|
185
192
|
|
|
186
|
-
.${className}[data-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
width: 8px;
|
|
190
|
-
height: 48px;
|
|
191
|
-
}
|
|
193
|
+
.${className}[data-debug='true'] {
|
|
194
|
+
bottom: max(46px, env(safe-area-inset-bottom));
|
|
195
|
+
}
|
|
192
196
|
|
|
193
|
-
.${className}[data-mobile='true']
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
+
.${className}[data-mobile='true'] {
|
|
198
|
+
border-radius: 4px 0px 0px 4px;
|
|
199
|
+
right: max(-2px, calc(env(safe-area-inset-right) - 2px));
|
|
200
|
+
width: 8px;
|
|
201
|
+
height: 48px;
|
|
202
|
+
}
|
|
197
203
|
|
|
198
|
-
.${className}[data-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
cursor: pointer;
|
|
203
|
-
color: var(--tl-color-text);
|
|
204
|
-
opacity: 0.8;
|
|
205
|
-
border: 0;
|
|
206
|
-
padding: 0;
|
|
207
|
-
background-color: transparent;
|
|
208
|
-
font-size: 11px;
|
|
209
|
-
font-weight: 600;
|
|
210
|
-
text-align: center;
|
|
211
|
-
}
|
|
204
|
+
.${className}[data-mobile='true'] > button {
|
|
205
|
+
width: 8px;
|
|
206
|
+
height: 32px;
|
|
207
|
+
}
|
|
212
208
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
209
|
+
@media (hover: hover) {
|
|
210
|
+
.${className} > button {
|
|
211
|
+
pointer-events: none;
|
|
212
|
+
}
|
|
216
213
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
214
|
+
.${className}:hover {
|
|
215
|
+
background-color: var(--tl-color-background);
|
|
216
|
+
transition: background-color 0.2s ease-in-out;
|
|
217
|
+
transition-delay: 0.32s;
|
|
218
|
+
}
|
|
221
219
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}
|
|
220
|
+
.${className}:hover > button {
|
|
221
|
+
animation: ${className}_delayed_link 0.2s forwards ease-in-out;
|
|
222
|
+
animation-delay: 0.32s;
|
|
223
|
+
}
|
|
227
224
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
225
|
+
.${className} > button:focus-visible {
|
|
226
|
+
opacity: 1;
|
|
227
|
+
}
|
|
231
228
|
}
|
|
232
229
|
|
|
233
|
-
.${className}[data-licensed='false'] > button:focus-visible {
|
|
234
|
-
opacity: 1;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
230
|
|
|
238
|
-
@keyframes ${className}_delayed_link {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}`;
|
|
231
|
+
@keyframes ${className}_delayed_link {
|
|
232
|
+
0% {
|
|
233
|
+
cursor: inherit;
|
|
234
|
+
opacity: .38;
|
|
235
|
+
pointer-events: none;
|
|
236
|
+
}
|
|
237
|
+
100% {
|
|
238
|
+
cursor: pointer;
|
|
239
|
+
opacity: 1;
|
|
240
|
+
pointer-events: all;
|
|
241
|
+
}
|
|
242
|
+
}`;
|
|
250
243
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", { nonce: editor.options.nonce, children: CSS });
|
|
251
244
|
});
|
|
252
245
|
//# sourceMappingURL=Watermark.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/license/Watermark.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { memo, useRef } from 'react'\nimport { useCanvasEvents } from '../hooks/useCanvasEvents'\nimport { useEditor } from '../hooks/useEditor'\nimport { usePassThroughWheelEvents } from '../hooks/usePassThroughWheelEvents'\nimport { preventDefault } from '../utils/dom'\nimport { runtime } from '../utils/runtime'\nimport { watermarkDesktopSvg, watermarkMobileSvg } from '../watermarks'\nimport { LicenseManager } from './LicenseManager'\nimport { useLicenseContext } from './LicenseProvider'\nimport { useLicenseManagerState } from './useLicenseManagerState'\n\nconst WATERMARK_DESKTOP_LOCAL_SRC = `data:image/svg+xml;utf8,${encodeURIComponent(watermarkDesktopSvg)}`\nconst WATERMARK_MOBILE_LOCAL_SRC = `data:image/svg+xml;utf8,${encodeURIComponent(watermarkMobileSvg)}`\n\n/** @internal */\nexport const Watermark = memo(function Watermark() {\n\tconst licenseManager = useLicenseContext()\n\tconst editor = useEditor()\n\tconst isMobile = useValue('is mobile', () => editor.getViewportScreenBounds().width < 700, [\n\t\teditor,\n\t])\n\n\tconst licenseManagerState = useLicenseManagerState(licenseManager)\n\n\tif (!['licensed-with-watermark', 'unlicensed'].includes(licenseManagerState)) return null\n\n\treturn (\n\t\t<>\n\t\t\t<LicenseStyles />\n\t\t\t<WatermarkInner\n\t\t\t\tsrc={isMobile ? WATERMARK_MOBILE_LOCAL_SRC : WATERMARK_DESKTOP_LOCAL_SRC}\n\t\t\t\tisUnlicensed={licenseManagerState === 'unlicensed'}\n\t\t\t/>\n\t\t</>\n\t)\n})\n\nconst UnlicensedWatermark = memo(function UnlicensedWatermark({\n\tisDebugMode,\n\tisMobile,\n}: {\n\tisDebugMode: boolean\n\tisMobile: boolean\n}) {\n\tconst
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BE;AA5BF,yBAAyB;AACzB,mBAA6B;AAC7B,6BAAgC;AAChC,uBAA0B;AAC1B,uCAA0C;AAC1C,
|
|
4
|
+
"sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { memo, useRef } from 'react'\nimport { useCanvasEvents } from '../hooks/useCanvasEvents'\nimport { useEditor } from '../hooks/useEditor'\nimport { usePassThroughWheelEvents } from '../hooks/usePassThroughWheelEvents'\nimport { markEventAsHandled, preventDefault } from '../utils/dom'\nimport { runtime } from '../utils/runtime'\nimport { watermarkDesktopSvg, watermarkMobileSvg } from '../watermarks'\nimport { LicenseManager } from './LicenseManager'\nimport { useLicenseContext } from './LicenseProvider'\nimport { useLicenseManagerState } from './useLicenseManagerState'\n\nconst WATERMARK_DESKTOP_LOCAL_SRC = `data:image/svg+xml;utf8,${encodeURIComponent(watermarkDesktopSvg)}`\nconst WATERMARK_MOBILE_LOCAL_SRC = `data:image/svg+xml;utf8,${encodeURIComponent(watermarkMobileSvg)}`\n\n/** @internal */\nexport const Watermark = memo(function Watermark() {\n\tconst licenseManager = useLicenseContext()\n\tconst editor = useEditor()\n\tconst isMobile = useValue('is mobile', () => editor.getViewportScreenBounds().width < 700, [\n\t\teditor,\n\t])\n\n\tconst licenseManagerState = useLicenseManagerState(licenseManager)\n\n\tif (!['licensed-with-watermark', 'unlicensed'].includes(licenseManagerState)) return null\n\n\treturn (\n\t\t<>\n\t\t\t<LicenseStyles />\n\t\t\t<WatermarkInner\n\t\t\t\tsrc={isMobile ? WATERMARK_MOBILE_LOCAL_SRC : WATERMARK_DESKTOP_LOCAL_SRC}\n\t\t\t\tisUnlicensed={licenseManagerState === 'unlicensed'}\n\t\t\t/>\n\t\t</>\n\t)\n})\n\nconst UnlicensedWatermark = memo(function UnlicensedWatermark({\n\tisDebugMode,\n\tisMobile,\n}: {\n\tisDebugMode: boolean\n\tisMobile: boolean\n}) {\n\tconst events = useCanvasEvents()\n\tconst ref = useRef<HTMLDivElement>(null)\n\tusePassThroughWheelEvents(ref)\n\n\tconst url = 'https://tldraw.dev/?utm_source=dotcom&utm_medium=organic&utm_campaign=watermark'\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={LicenseManager.className}\n\t\t\tdata-debug={isDebugMode}\n\t\t\tdata-mobile={isMobile}\n\t\t\tdata-unlicensed={true}\n\t\t\tdata-testid=\"tl-watermark-unlicensed\"\n\t\t\tdraggable={false}\n\t\t\t{...events}\n\t\t>\n\t\t\t<button\n\t\t\t\tdraggable={false}\n\t\t\t\trole=\"button\"\n\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\tmarkEventAsHandled(e)\n\t\t\t\t\tpreventDefault(e)\n\t\t\t\t}}\n\t\t\t\ttitle=\"Unlicensed - click to get a license\"\n\t\t\t\tonClick={() => runtime.openWindow(url, '_blank')}\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tpointerEvents: 'all',\n\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\tcolor: 'var(--tl-color-text)',\n\t\t\t\t\topacity: 0.8,\n\t\t\t\t\tborder: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tbackgroundColor: 'transparent',\n\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\tfontWeight: '600',\n\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\tUnlicensed\n\t\t\t</button>\n\t\t</div>\n\t)\n})\n\nconst WatermarkInner = memo(function WatermarkInner({\n\tsrc,\n\tisUnlicensed,\n}: {\n\tsrc: string\n\tisUnlicensed: boolean\n}) {\n\tconst editor = useEditor()\n\tconst isDebugMode = useValue('debug mode', () => editor.getInstanceState().isDebugMode, [editor])\n\tconst isMobile = useValue('is mobile', () => editor.getViewportScreenBounds().width < 700, [\n\t\teditor,\n\t])\n\tconst events = useCanvasEvents()\n\n\tconst ref = useRef<HTMLDivElement>(null)\n\tusePassThroughWheelEvents(ref)\n\n\tconst maskCss = `url('${src}') center 100% / 100% no-repeat`\n\tconst url = 'https://tldraw.dev/?utm_source=dotcom&utm_medium=organic&utm_campaign=watermark'\n\n\tif (isUnlicensed) {\n\t\treturn <UnlicensedWatermark isDebugMode={isDebugMode} isMobile={isMobile} />\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={LicenseManager.className}\n\t\t\tdata-debug={isDebugMode}\n\t\t\tdata-mobile={isMobile}\n\t\t\tdata-testid=\"tl-watermark-licensed\"\n\t\t\tdraggable={false}\n\t\t\t{...events}\n\t\t>\n\t\t\t<button\n\t\t\t\tdraggable={false}\n\t\t\t\trole=\"button\"\n\t\t\t\tonPointerDown={(e) => {\n\t\t\t\t\tmarkEventAsHandled(e)\n\t\t\t\t\tpreventDefault(e)\n\t\t\t\t}}\n\t\t\t\ttitle=\"made with tldraw\"\n\t\t\t\tonClick={() => runtime.openWindow(url, '_blank')}\n\t\t\t\tstyle={{ mask: maskCss, WebkitMask: maskCss }}\n\t\t\t/>\n\t\t</div>\n\t)\n})\n\nconst LicenseStyles = memo(function LicenseStyles() {\n\tconst editor = useEditor()\n\tconst className = LicenseManager.className\n\n\tconst CSS = `/* ------------------- SEE LICENSE -------------------\nThe tldraw watermark is part of tldraw's license. It is shown for unlicensed\nor \"licensed-with-watermark\" users. By using this library, you agree to\npreserve the watermark's behavior, keeping it visible, unobscured, and\navailable to user-interaction.\n\nTo remove the watermark, please purchase a license at tldraw.dev.\n*/\n\n\t.${className} {\n\t\tposition: absolute;\n\t\tbottom: max(var(--tl-space-2), env(safe-area-inset-bottom));\n\t\tright: max(var(--tl-space-2), env(safe-area-inset-right));\n\t\twidth: 96px;\n\t\theight: 32px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tz-index: var(--tl-layer-watermark) !important;\n\t\tbackground-color: color-mix(in srgb, var(--tl-color-background) 62%, transparent);\n\t\topacity: 1;\n\t\tborder-radius: 5px;\n\t\tpointer-events: all;\n\t\tpadding: 2px;\n\t\tbox-sizing: content-box;\n\t}\n\n\t.${className} > button {\n\t\tposition: absolute;\n\t\twidth: 96px;\n\t\theight: 32px;\n\t\tpointer-events: all;\n\t\tcursor: inherit;\n\t\tcolor: var(--tl-color-text);\n\t\topacity: .38;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tbackground-color: currentColor;\n\t}\n\n\t.${className}[data-debug='true'] {\n\t\tbottom: max(46px, env(safe-area-inset-bottom));\n\t}\n\n\t.${className}[data-mobile='true'] {\n\t\tborder-radius: 4px 0px 0px 4px;\n\t\tright: max(-2px, calc(env(safe-area-inset-right) - 2px));\n\t\twidth: 8px;\n\t\theight: 48px;\n\t}\n\n\t.${className}[data-mobile='true'] > button {\n\t\twidth: 8px;\n\t\theight: 32px;\n\t}\n\n\t@media (hover: hover) {\n\t\t.${className} > button {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.${className}:hover {\n\t\t\tbackground-color: var(--tl-color-background);\n\t\t\ttransition: background-color 0.2s ease-in-out;\n\t\t\ttransition-delay: 0.32s;\n\t\t}\n\n\t\t.${className}:hover > button {\n\t\t\tanimation: ${className}_delayed_link 0.2s forwards ease-in-out;\n\t\t\tanimation-delay: 0.32s;\n\t\t}\n\n\t\t.${className} > button:focus-visible {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\n\t@keyframes ${className}_delayed_link {\n\t\t0% {\n\t\t\tcursor: inherit;\n\t\t\topacity: .38;\n\t\t\tpointer-events: none;\n\t\t}\n\t\t100% {\n\t\t\tcursor: pointer;\n\t\t\topacity: 1;\n\t\t\tpointer-events: all;\n\t\t}\n\t}`\n\n\treturn <style nonce={editor.options.nonce}>{CSS}</style>\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Watermark", "UnlicensedWatermark", "WatermarkInner", "LicenseStyles"]
|
|
7
7
|
}
|
|
@@ -20,11 +20,13 @@ var dom_exports = {};
|
|
|
20
20
|
__export(dom_exports, {
|
|
21
21
|
activeElementShouldCaptureKeys: () => activeElementShouldCaptureKeys,
|
|
22
22
|
loopToHtmlElement: () => loopToHtmlElement,
|
|
23
|
+
markEventAsHandled: () => markEventAsHandled,
|
|
23
24
|
preventDefault: () => preventDefault,
|
|
24
25
|
releasePointerCapture: () => releasePointerCapture,
|
|
25
26
|
setPointerCapture: () => setPointerCapture,
|
|
26
27
|
setStyleProperty: () => setStyleProperty,
|
|
27
|
-
stopEventPropagation: () => stopEventPropagation
|
|
28
|
+
stopEventPropagation: () => stopEventPropagation,
|
|
29
|
+
wasEventAlreadyHandled: () => wasEventAlreadyHandled
|
|
28
30
|
});
|
|
29
31
|
module.exports = __toCommonJS(dom_exports);
|
|
30
32
|
var import_debug_flags = require("./debug-flags");
|
|
@@ -65,6 +67,15 @@ function releasePointerCapture(element, event) {
|
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
const stopEventPropagation = (e) => e.stopPropagation();
|
|
70
|
+
const handledEvents = /* @__PURE__ */ new WeakSet();
|
|
71
|
+
function markEventAsHandled(e) {
|
|
72
|
+
const nativeEvent = "nativeEvent" in e ? e.nativeEvent : e;
|
|
73
|
+
handledEvents.add(nativeEvent);
|
|
74
|
+
}
|
|
75
|
+
function wasEventAlreadyHandled(e) {
|
|
76
|
+
const nativeEvent = "nativeEvent" in e ? e.nativeEvent : e;
|
|
77
|
+
return handledEvents.has(nativeEvent);
|
|
78
|
+
}
|
|
68
79
|
const setStyleProperty = (elm, property, value) => {
|
|
69
80
|
if (!elm) return;
|
|
70
81
|
elm.style.setProperty(property, value);
|
|
@@ -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.nodeType === Node.ELEMENT_NODE) return elm as HTMLElement\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/**\n * Calls `event.stopPropagation()`.\n *\n * @deprecated Use {@link
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,yBAAyD;AAGlD,SAAS,kBAAkB,KAA2B;AAC5D,MAAI,IAAI,aAAa,KAAK,aAAc,QAAO;AAC/C,MAAI,IAAI,cAAe,QAAO,kBAAkB,IAAI,aAAa;AAAA,MAC5D,OAAM,MAAM,kDAAkD;AACpE;AAcO,SAAS,eAAe,OAAyC;AACvE,QAAM,eAAe;AACrB,MAAI,8BAAW,mBAAmB,IAAI,GAAG;AACxC,YAAQ,KAAK,mCAAmC,KAAK;AAAA,EACtD;AACD;AAGO,SAAS,kBACf,SACA,OACC;AACD,UAAQ,kBAAkB,MAAM,SAAS;AACzC,MAAI,8BAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,gDAA6B,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,8BAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,gDAA6B,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;AAUO,MAAM,uBAAuB,CAAC,MAAW,EAAE,gBAAgB;
|
|
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.nodeType === Node.ELEMENT_NODE) return elm as HTMLElement\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/**\n * Calls `event.stopPropagation()`.\n *\n * @deprecated Use {@link markEventAsHandled} instead, or manually call `event.stopPropagation()` if\n * that's what you really want.\n *\n * @public\n */\nexport const stopEventPropagation = (e: any) => e.stopPropagation()\n\nconst handledEvents = new WeakSet<Event>()\n\n/**\n * In tldraw, events are sometimes handled by multiple components. For example, the shapes might\n * have events, but the canvas handles events too. The way that the canvas handles events can\n * interfere with the with the shapes event handlers - for example, it calls `.preventDefault()` on\n * `pointerDown`, which also prevents `click` events from firing on the shapes.\n *\n * You can use `.stopPropagation()` to prevent the event from propagating to the rest of the DOM,\n * but that can impact non-tldraw event handlers set up elsewhere. By using `markEventAsHandled`,\n * you'll stop other parts of tldraw from handling the event without impacting other, non-tldraw\n * event handlers. See also {@link wasEventAlreadyHandled}.\n *\n * @public\n */\nexport function markEventAsHandled(e: Event | { nativeEvent: Event }) {\n\tconst nativeEvent = 'nativeEvent' in e ? e.nativeEvent : e\n\thandledEvents.add(nativeEvent)\n}\n\n/**\n * Checks if an event has already been handled. See {@link markEventAsHandled}.\n *\n * @public\n */\nexport function wasEventAlreadyHandled(e: Event | { nativeEvent: Event }) {\n\tconst nativeEvent = 'nativeEvent' in e ? e.nativeEvent : e\n\treturn handledEvents.has(nativeEvent)\n}\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\n/** @internal */\nexport function activeElementShouldCaptureKeys(allowButtons = false) {\n\tconst { activeElement } = document\n\tconst elements = allowButtons ? ['input', 'textarea'] : ['input', 'select', 'button', 'textarea']\n\treturn !!(\n\t\tactiveElement &&\n\t\t((activeElement as HTMLElement).isContentEditable ||\n\t\t\telements.indexOf(activeElement.tagName.toLowerCase()) > -1 ||\n\t\t\tactiveElement.classList.contains('tlui-slider__thumb'))\n\t)\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,yBAAyD;AAGlD,SAAS,kBAAkB,KAA2B;AAC5D,MAAI,IAAI,aAAa,KAAK,aAAc,QAAO;AAC/C,MAAI,IAAI,cAAe,QAAO,kBAAkB,IAAI,aAAa;AAAA,MAC5D,OAAM,MAAM,kDAAkD;AACpE;AAcO,SAAS,eAAe,OAAyC;AACvE,QAAM,eAAe;AACrB,MAAI,8BAAW,mBAAmB,IAAI,GAAG;AACxC,YAAQ,KAAK,mCAAmC,KAAK;AAAA,EACtD;AACD;AAGO,SAAS,kBACf,SACA,OACC;AACD,UAAQ,kBAAkB,MAAM,SAAS;AACzC,MAAI,8BAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,gDAA6B,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,8BAAW,mBAAmB,IAAI,GAAG;AACxC,UAAM,cAAc,gDAA6B,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;AAUO,MAAM,uBAAuB,CAAC,MAAW,EAAE,gBAAgB;AAElE,MAAM,gBAAgB,oBAAI,QAAe;AAelC,SAAS,mBAAmB,GAAmC;AACrE,QAAM,cAAc,iBAAiB,IAAI,EAAE,cAAc;AACzD,gBAAc,IAAI,WAAW;AAC9B;AAOO,SAAS,uBAAuB,GAAmC;AACzE,QAAM,cAAc,iBAAiB,IAAI,EAAE,cAAc;AACzD,SAAO,cAAc,IAAI,WAAW;AACrC;AAGO,MAAM,mBAAmB,CAC/B,KACA,UACA,UACI;AACJ,MAAI,CAAC,IAAK;AACV,MAAI,MAAM,YAAY,UAAU,KAAe;AAChD;AAGO,SAAS,+BAA+B,eAAe,OAAO;AACpE,QAAM,EAAE,cAAc,IAAI;AAC1B,QAAM,WAAW,eAAe,CAAC,SAAS,UAAU,IAAI,CAAC,SAAS,UAAU,UAAU,UAAU;AAChG,SAAO,CAAC,EACP,kBACE,cAA8B,qBAC/B,SAAS,QAAQ,cAAc,QAAQ,YAAY,CAAC,IAAI,MACxD,cAAc,UAAU,SAAS,oBAAoB;AAExD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -21,9 +21,10 @@ __export(getPointerInfo_exports, {
|
|
|
21
21
|
getPointerInfo: () => getPointerInfo
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(getPointerInfo_exports);
|
|
24
|
+
var import_dom = require("./dom");
|
|
24
25
|
var import_keyboard = require("./keyboard");
|
|
25
|
-
function getPointerInfo(
|
|
26
|
-
|
|
26
|
+
function getPointerInfo(e) {
|
|
27
|
+
(0, import_dom.markEventAsHandled)(e);
|
|
27
28
|
return {
|
|
28
29
|
point: {
|
|
29
30
|
x: e.clientX,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/utils/getPointerInfo.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import { markEventAsHandled } from './dom'\nimport { isAccelKey } from './keyboard'\n\n/** @public */\nexport function getPointerInfo(e: React.PointerEvent | PointerEvent) {\n\tmarkEventAsHandled(e)\n\n\treturn {\n\t\tpoint: {\n\t\t\tx: e.clientX,\n\t\t\ty: e.clientY,\n\t\t\tz: e.pressure,\n\t\t},\n\t\tshiftKey: e.shiftKey,\n\t\taltKey: e.altKey,\n\t\tctrlKey: e.metaKey || e.ctrlKey,\n\t\tmetaKey: e.metaKey,\n\t\taccelKey: isAccelKey(e),\n\t\tpointerId: e.pointerId,\n\t\tbutton: e.button,\n\t\tisPen: e.pointerType === 'pen',\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAmC;AACnC,sBAA2B;AAGpB,SAAS,eAAe,GAAsC;AACpE,qCAAmB,CAAC;AAEpB,SAAO;AAAA,IACN,OAAO;AAAA,MACN,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,IACN;AAAA,IACA,UAAU,EAAE;AAAA,IACZ,QAAQ,EAAE;AAAA,IACV,SAAS,EAAE,WAAW,EAAE;AAAA,IACxB,SAAS,EAAE;AAAA,IACX,cAAU,4BAAW,CAAC;AAAA,IACtB,WAAW,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,OAAO,EAAE,gBAAgB;AAAA,EAC1B;AACD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-cjs/version.js
CHANGED
|
@@ -22,10 +22,10 @@ __export(version_exports, {
|
|
|
22
22
|
version: () => version
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(version_exports);
|
|
25
|
-
const version = "3.16.0-canary.
|
|
25
|
+
const version = "3.16.0-canary.806d674b7d7a";
|
|
26
26
|
const publishDates = {
|
|
27
27
|
major: "2024-09-13T14:36:29.063Z",
|
|
28
|
-
minor: "2025-09-
|
|
29
|
-
patch: "2025-09-
|
|
28
|
+
minor: "2025-09-17T14:09:40.471Z",
|
|
29
|
+
patch: "2025-09-17T14:09:40.471Z"
|
|
30
30
|
};
|
|
31
31
|
//# sourceMappingURL=version.js.map
|
package/dist-cjs/version.js.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.16.0-canary.
|
|
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.16.0-canary.806d674b7d7a'\nexport const publishDates = {\n\tmajor: '2024-09-13T14:36:29.063Z',\n\tminor: '2025-09-17T14:09:40.471Z',\n\tpatch: '2025-09-17T14:09:40.471Z',\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,UAAU;AAChB,MAAM,eAAe;AAAA,EAC3B,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACR;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-esm/index.d.mts
CHANGED
|
@@ -3959,31 +3959,6 @@ export declare class Editor extends EventEmitter<TLEventMap> {
|
|
|
3959
3959
|
/* Excluded from this release type: capturedPointerId */
|
|
3960
3960
|
/* Excluded from this release type: performanceTracker */
|
|
3961
3961
|
/* Excluded from this release type: performanceTrackerTimeout */
|
|
3962
|
-
/* Excluded from this release type: handledEvents */
|
|
3963
|
-
/**
|
|
3964
|
-
* In tldraw, events are sometimes handled by multiple components. For example, the shapes might
|
|
3965
|
-
* have events, but the canvas handles events too. The way that the canvas handles events can
|
|
3966
|
-
* interfere with the with the shapes event handlers - for example, it calls `.preventDefault()`
|
|
3967
|
-
* on `pointerDown`, which also prevents `click` events from firing on the shapes.
|
|
3968
|
-
*
|
|
3969
|
-
* You can use `.stopPropagation()` to prevent the event from propagating to the rest of the
|
|
3970
|
-
* DOM, but that can impact non-tldraw event handlers set up elsewhere. By using
|
|
3971
|
-
* `markEventAsHandled`, you'll stop other parts of tldraw from handling the event without
|
|
3972
|
-
* impacting other, non-tldraw event handlers. See also {@link Editor.wasEventAlreadyHandled}.
|
|
3973
|
-
*
|
|
3974
|
-
* @public
|
|
3975
|
-
*/
|
|
3976
|
-
markEventAsHandled(e: {
|
|
3977
|
-
nativeEvent: Event;
|
|
3978
|
-
} | Event): void;
|
|
3979
|
-
/**
|
|
3980
|
-
* Checks if an event has already been handled. See {@link Editor.markEventAsHandled}.
|
|
3981
|
-
*
|
|
3982
|
-
* @public
|
|
3983
|
-
*/
|
|
3984
|
-
wasEventAlreadyHandled(e: {
|
|
3985
|
-
nativeEvent: Event;
|
|
3986
|
-
} | Event): boolean;
|
|
3987
3962
|
/**
|
|
3988
3963
|
* Dispatch an event to the editor.
|
|
3989
3964
|
*
|
|
@@ -4259,7 +4234,7 @@ export declare function getPerfectDashProps(totalLength: number, strokeWidth: nu
|
|
|
4259
4234
|
};
|
|
4260
4235
|
|
|
4261
4236
|
/** @public */
|
|
4262
|
-
export declare function getPointerInfo(
|
|
4237
|
+
export declare function getPointerInfo(e: PointerEvent | React.PointerEvent): {
|
|
4263
4238
|
accelKey: boolean;
|
|
4264
4239
|
altKey: boolean;
|
|
4265
4240
|
button: number;
|
|
@@ -4641,6 +4616,23 @@ export declare function loadSnapshot(store: TLStore, _snapshot: Partial<TLEditor
|
|
|
4641
4616
|
/** @public */
|
|
4642
4617
|
export declare function loopToHtmlElement(elm: Element): HTMLElement;
|
|
4643
4618
|
|
|
4619
|
+
/**
|
|
4620
|
+
* In tldraw, events are sometimes handled by multiple components. For example, the shapes might
|
|
4621
|
+
* have events, but the canvas handles events too. The way that the canvas handles events can
|
|
4622
|
+
* interfere with the with the shapes event handlers - for example, it calls `.preventDefault()` on
|
|
4623
|
+
* `pointerDown`, which also prevents `click` events from firing on the shapes.
|
|
4624
|
+
*
|
|
4625
|
+
* You can use `.stopPropagation()` to prevent the event from propagating to the rest of the DOM,
|
|
4626
|
+
* but that can impact non-tldraw event handlers set up elsewhere. By using `markEventAsHandled`,
|
|
4627
|
+
* you'll stop other parts of tldraw from handling the event without impacting other, non-tldraw
|
|
4628
|
+
* event handlers. See also {@link wasEventAlreadyHandled}.
|
|
4629
|
+
*
|
|
4630
|
+
* @public
|
|
4631
|
+
*/
|
|
4632
|
+
export declare function markEventAsHandled(e: {
|
|
4633
|
+
nativeEvent: Event;
|
|
4634
|
+
} | Event): void;
|
|
4635
|
+
|
|
4644
4636
|
/** @public */
|
|
4645
4637
|
export declare class Mat {
|
|
4646
4638
|
constructor(a: number, b: number, c: number, d: number, e: number, f: number);
|
|
@@ -5841,7 +5833,7 @@ export declare abstract class StateNode implements Partial<TLEventHandlers> {
|
|
|
5841
5833
|
/**
|
|
5842
5834
|
* Calls `event.stopPropagation()`.
|
|
5843
5835
|
*
|
|
5844
|
-
* @deprecated Use {@link
|
|
5836
|
+
* @deprecated Use {@link markEventAsHandled} instead, or manually call `event.stopPropagation()` if
|
|
5845
5837
|
* that's what you really want.
|
|
5846
5838
|
*
|
|
5847
5839
|
* @public
|
|
@@ -8117,6 +8109,15 @@ export declare class Vec {
|
|
|
8117
8109
|
/** @public */
|
|
8118
8110
|
export declare type VecLike = Vec | VecModel;
|
|
8119
8111
|
|
|
8112
|
+
/**
|
|
8113
|
+
* Checks if an event has already been handled. See {@link markEventAsHandled}.
|
|
8114
|
+
*
|
|
8115
|
+
* @public
|
|
8116
|
+
*/
|
|
8117
|
+
export declare function wasEventAlreadyHandled(e: {
|
|
8118
|
+
nativeEvent: Event;
|
|
8119
|
+
} | Event): boolean;
|
|
8120
|
+
|
|
8120
8121
|
|
|
8121
8122
|
export * from "@tldraw/state";
|
|
8122
8123
|
export * from "@tldraw/state-react";
|
package/dist-esm/index.mjs
CHANGED
|
@@ -269,10 +269,12 @@ import {
|
|
|
269
269
|
import {
|
|
270
270
|
activeElementShouldCaptureKeys,
|
|
271
271
|
loopToHtmlElement,
|
|
272
|
+
markEventAsHandled,
|
|
272
273
|
preventDefault,
|
|
273
274
|
releasePointerCapture,
|
|
274
275
|
setPointerCapture,
|
|
275
|
-
stopEventPropagation
|
|
276
|
+
stopEventPropagation,
|
|
277
|
+
wasEventAlreadyHandled
|
|
276
278
|
} from "./lib/utils/dom.mjs";
|
|
277
279
|
import { EditorAtom } from "./lib/utils/EditorAtom.mjs";
|
|
278
280
|
import { getIncrementedName } from "./lib/utils/getIncrementedName.mjs";
|
|
@@ -301,7 +303,7 @@ import { uniq } from "./lib/utils/uniq.mjs";
|
|
|
301
303
|
import { openWindow } from "./lib/utils/window-open.mjs";
|
|
302
304
|
registerTldrawLibraryVersion(
|
|
303
305
|
"@tldraw/editor",
|
|
304
|
-
"3.16.0-canary.
|
|
306
|
+
"3.16.0-canary.806d674b7d7a",
|
|
305
307
|
"esm"
|
|
306
308
|
);
|
|
307
309
|
export {
|
|
@@ -452,6 +454,7 @@ export {
|
|
|
452
454
|
loadSessionStateSnapshotIntoStore,
|
|
453
455
|
loadSnapshot,
|
|
454
456
|
loopToHtmlElement,
|
|
457
|
+
markEventAsHandled,
|
|
455
458
|
maybeSnapToGrid,
|
|
456
459
|
normalizeWheel,
|
|
457
460
|
openWindow,
|
|
@@ -515,6 +518,7 @@ export {
|
|
|
515
518
|
useTransform,
|
|
516
519
|
useUniqueSafeId,
|
|
517
520
|
useViewportHeight,
|
|
518
|
-
userTypeValidator
|
|
521
|
+
userTypeValidator,
|
|
522
|
+
wasEventAlreadyHandled
|
|
519
523
|
};
|
|
520
524
|
//# sourceMappingURL=index.mjs.map
|