@tldraw/editor 3.16.0-canary.bf9fb05eb8ef → 3.16.0-canary.c0373a61812a

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.
Files changed (81) hide show
  1. package/dist-cjs/index.d.ts +41 -101
  2. package/dist-cjs/index.js +3 -5
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/TldrawEditor.js +1 -5
  5. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  6. package/dist-cjs/lib/editor/Editor.js +17 -111
  7. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  8. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +4 -0
  9. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +2 -2
  10. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +10 -0
  11. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/editor/types/misc-types.js.map +1 -1
  13. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js +4 -1
  14. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +2 -2
  15. package/dist-cjs/lib/license/LicenseManager.js +140 -53
  16. package/dist-cjs/lib/license/LicenseManager.js.map +2 -2
  17. package/dist-cjs/lib/license/LicenseProvider.js +39 -1
  18. package/dist-cjs/lib/license/LicenseProvider.js.map +2 -2
  19. package/dist-cjs/lib/license/Watermark.js +68 -6
  20. package/dist-cjs/lib/license/Watermark.js.map +3 -3
  21. package/dist-cjs/lib/license/useLicenseManagerState.js.map +2 -2
  22. package/dist-cjs/lib/primitives/Vec.js +0 -4
  23. package/dist-cjs/lib/primitives/Vec.js.map +2 -2
  24. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +50 -20
  25. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  26. package/dist-cjs/lib/primitives/geometry/Group2d.js +8 -1
  27. package/dist-cjs/lib/primitives/geometry/Group2d.js.map +2 -2
  28. package/dist-cjs/lib/utils/reparenting.js +2 -35
  29. package/dist-cjs/lib/utils/reparenting.js.map +3 -3
  30. package/dist-cjs/version.js +3 -3
  31. package/dist-cjs/version.js.map +1 -1
  32. package/dist-esm/index.d.mts +41 -101
  33. package/dist-esm/index.mjs +3 -5
  34. package/dist-esm/index.mjs.map +2 -2
  35. package/dist-esm/lib/TldrawEditor.mjs +1 -5
  36. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  37. package/dist-esm/lib/editor/Editor.mjs +17 -111
  38. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  39. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +4 -0
  40. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +2 -2
  41. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +10 -0
  42. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  43. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs +4 -1
  44. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +2 -2
  45. package/dist-esm/lib/license/LicenseManager.mjs +141 -54
  46. package/dist-esm/lib/license/LicenseManager.mjs.map +2 -2
  47. package/dist-esm/lib/license/LicenseProvider.mjs +39 -2
  48. package/dist-esm/lib/license/LicenseProvider.mjs.map +2 -2
  49. package/dist-esm/lib/license/Watermark.mjs +68 -6
  50. package/dist-esm/lib/license/Watermark.mjs.map +3 -3
  51. package/dist-esm/lib/license/useLicenseManagerState.mjs.map +2 -2
  52. package/dist-esm/lib/primitives/Vec.mjs +0 -4
  53. package/dist-esm/lib/primitives/Vec.mjs.map +2 -2
  54. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +53 -21
  55. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  56. package/dist-esm/lib/primitives/geometry/Group2d.mjs +8 -1
  57. package/dist-esm/lib/primitives/geometry/Group2d.mjs.map +2 -2
  58. package/dist-esm/lib/utils/reparenting.mjs +3 -40
  59. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  60. package/dist-esm/version.mjs +3 -3
  61. package/dist-esm/version.mjs.map +1 -1
  62. package/editor.css +8 -3
  63. package/package.json +7 -7
  64. package/src/index.ts +2 -9
  65. package/src/lib/TldrawEditor.tsx +1 -13
  66. package/src/lib/editor/Editor.ts +24 -148
  67. package/src/lib/editor/derivations/notVisibleShapes.ts +6 -0
  68. package/src/lib/editor/shapes/ShapeUtil.ts +32 -0
  69. package/src/lib/editor/types/misc-types.ts +0 -6
  70. package/src/lib/hooks/usePassThroughMouseOverEvents.ts +4 -1
  71. package/src/lib/license/LicenseManager.test.ts +721 -382
  72. package/src/lib/license/LicenseManager.ts +201 -58
  73. package/src/lib/license/LicenseProvider.tsx +74 -2
  74. package/src/lib/license/Watermark.tsx +73 -6
  75. package/src/lib/license/useLicenseManagerState.ts +2 -2
  76. package/src/lib/primitives/Vec.ts +0 -5
  77. package/src/lib/primitives/geometry/Geometry2d.test.ts +420 -0
  78. package/src/lib/primitives/geometry/Geometry2d.ts +78 -21
  79. package/src/lib/primitives/geometry/Group2d.ts +10 -1
  80. package/src/lib/utils/reparenting.ts +3 -69
  81. package/src/version.ts +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/license/LicenseManager.ts"],
4
- "sourcesContent": ["import { atom } from '@tldraw/state'\nimport { fetch } from '@tldraw/utils'\nimport { publishDates } from '../../version'\nimport { getDefaultCdnBaseUrl } from '../utils/assets'\nimport { importPublicKey, str2ab } from '../utils/licensing'\n\nconst GRACE_PERIOD_DAYS = 5\n\nexport const FLAGS = {\n\tANNUAL_LICENSE: 0x1,\n\tPERPETUAL_LICENSE: 0x2,\n\tINTERNAL_LICENSE: 0x4,\n\tWITH_WATERMARK: 0x8,\n}\nconst HIGHEST_FLAG = Math.max(...Object.values(FLAGS))\n\nexport const PROPERTIES = {\n\tID: 0,\n\tHOSTS: 1,\n\tFLAGS: 2,\n\tEXPIRY_DATE: 3,\n}\nconst NUMBER_OF_KNOWN_PROPERTIES = Object.keys(PROPERTIES).length\n\nconst LICENSE_EMAIL = 'sales@tldraw.com'\n\nconst WATERMARK_TRACK_SRC = `${getDefaultCdnBaseUrl()}/watermarks/watermark-track.svg`\n\n/** @internal */\nexport interface LicenseInfo {\n\tid: string\n\thosts: string[]\n\tflags: number\n\texpiryDate: string\n}\n/** @internal */\nexport type InvalidLicenseReason =\n\t| 'invalid-license-key'\n\t| 'no-key-provided'\n\t| 'has-key-development-mode'\n\n/** @internal */\nexport type LicenseFromKeyResult = InvalidLicenseKeyResult | ValidLicenseKeyResult\n\n/** @internal */\nexport interface InvalidLicenseKeyResult {\n\tisLicenseParseable: false\n\treason: InvalidLicenseReason\n}\n\n/** @internal */\nexport interface ValidLicenseKeyResult {\n\tisLicenseParseable: true\n\tlicense: LicenseInfo\n\tisDevelopment: boolean\n\tisDomainValid: boolean\n\texpiryDate: Date\n\tisAnnualLicense: boolean\n\tisAnnualLicenseExpired: boolean\n\tisPerpetualLicense: boolean\n\tisPerpetualLicenseExpired: boolean\n\tisInternalLicense: boolean\n\tisLicensedWithWatermark: boolean\n}\n\n/** @internal */\nexport type TestEnvironment = 'development' | 'production'\n\n/** @internal */\nexport class LicenseManager {\n\tprivate publicKey =\n\t\t'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHJh0uUfxHtCGyerXmmatE368Hd9rI6LH9oPDQihnaCryRFWEVeOvf9U/SPbyxX74LFyJs5tYeAHq5Nc0Ax25LQ'\n\tpublic isDevelopment: boolean\n\tpublic isTest: boolean\n\tpublic isCryptoAvailable: boolean\n\tstate = atom<'pending' | 'licensed' | 'licensed-with-watermark' | 'unlicensed'>(\n\t\t'license state',\n\t\t'pending'\n\t)\n\tpublic verbose = true\n\n\tconstructor(\n\t\tlicenseKey: string | undefined,\n\t\ttestPublicKey?: string,\n\t\ttestEnvironment?: TestEnvironment\n\t) {\n\t\tthis.isTest = process.env.NODE_ENV === 'test'\n\t\tthis.isDevelopment = this.getIsDevelopment(testEnvironment)\n\t\tthis.publicKey = testPublicKey || this.publicKey\n\t\tthis.isCryptoAvailable = !!crypto.subtle\n\n\t\tthis.getLicenseFromKey(licenseKey).then((result) => {\n\t\t\tconst isUnlicensed = isEditorUnlicensed(result)\n\n\t\t\tif (!this.isDevelopment && isUnlicensed) {\n\t\t\t\tfetch(WATERMARK_TRACK_SRC)\n\t\t\t}\n\n\t\t\tif (isUnlicensed) {\n\t\t\t\tthis.state.set('unlicensed')\n\t\t\t} else if ((result as ValidLicenseKeyResult).isLicensedWithWatermark) {\n\t\t\t\tthis.state.set('licensed-with-watermark')\n\t\t\t} else {\n\t\t\t\tthis.state.set('licensed')\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate getIsDevelopment(testEnvironment?: TestEnvironment) {\n\t\tif (testEnvironment === 'development') return true\n\t\tif (testEnvironment === 'production') return false\n\n\t\t// If we are using https on a non-localhost domain we assume it's a production env and a development one otherwise\n\t\treturn (\n\t\t\t!['https:', 'vscode-webview:'].includes(window.location.protocol) ||\n\t\t\twindow.location.hostname === 'localhost'\n\t\t)\n\t}\n\n\tprivate async extractLicenseKey(licenseKey: string): Promise<LicenseInfo> {\n\t\tconst [data, signature] = licenseKey.split('.')\n\t\tconst [prefix, encodedData] = data.split('/')\n\n\t\tif (!prefix.startsWith('tldraw-')) {\n\t\t\tthrow new Error(`Unsupported prefix '${prefix}'`)\n\t\t}\n\n\t\tconst publicCryptoKey = await importPublicKey(this.publicKey)\n\n\t\tlet isVerified\n\t\ttry {\n\t\t\tisVerified = await crypto.subtle.verify(\n\t\t\t\t{\n\t\t\t\t\tname: 'ECDSA',\n\t\t\t\t\thash: { name: 'SHA-256' },\n\t\t\t\t},\n\t\t\t\tpublicCryptoKey,\n\t\t\t\tnew Uint8Array(str2ab(atob(signature))),\n\t\t\t\tnew Uint8Array(str2ab(atob(encodedData)))\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\tthrow new Error('Could not perform signature validation')\n\t\t}\n\n\t\tif (!isVerified) {\n\t\t\tthrow new Error('Invalid signature')\n\t\t}\n\n\t\tlet decodedData: any\n\t\ttry {\n\t\t\tdecodedData = JSON.parse(atob(encodedData))\n\t\t} catch {\n\t\t\tthrow new Error('Could not parse object')\n\t\t}\n\t\tif (decodedData.length > NUMBER_OF_KNOWN_PROPERTIES) {\n\t\t\tthis.outputMessages([\n\t\t\t\t'License key contains some unknown properties.',\n\t\t\t\t'You may want to update tldraw packages to a newer version to get access to new functionality.',\n\t\t\t])\n\t\t}\n\n\t\treturn {\n\t\t\tid: decodedData[PROPERTIES.ID],\n\t\t\thosts: decodedData[PROPERTIES.HOSTS],\n\t\t\tflags: decodedData[PROPERTIES.FLAGS],\n\t\t\texpiryDate: decodedData[PROPERTIES.EXPIRY_DATE],\n\t\t}\n\t}\n\n\tasync getLicenseFromKey(licenseKey?: string): Promise<LicenseFromKeyResult> {\n\t\tif (!licenseKey) {\n\t\t\tif (!this.isDevelopment) {\n\t\t\t\tthis.outputNoLicenseKeyProvided()\n\t\t\t}\n\n\t\t\treturn { isLicenseParseable: false, reason: 'no-key-provided' }\n\t\t}\n\n\t\tif (this.isDevelopment && !this.isCryptoAvailable) {\n\t\t\tif (this.verbose) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(\n\t\t\t\t\t'tldraw: you seem to be in a development environment that does not support crypto. License not verified.'\n\t\t\t\t)\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log('You should check that this works in production separately.')\n\t\t\t}\n\t\t\t// We can't parse the license if we are in development mode since crypto\n\t\t\t// is not available on http\n\t\t\treturn { isLicenseParseable: false, reason: 'has-key-development-mode' }\n\t\t}\n\n\t\t// Borrowed idea from AG Grid:\n\t\t// Copying from various sources (like PDFs) can include zero-width characters.\n\t\t// This helps makes sure the key validation doesn't fail.\n\t\tlet cleanedLicenseKey = licenseKey.replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n\t\tcleanedLicenseKey = cleanedLicenseKey.replace(/\\r?\\n|\\r/g, '')\n\n\t\ttry {\n\t\t\tconst licenseInfo = await this.extractLicenseKey(cleanedLicenseKey)\n\t\t\tconst expiryDate = new Date(licenseInfo.expiryDate)\n\t\t\tconst isAnnualLicense = this.isFlagEnabled(licenseInfo.flags, FLAGS.ANNUAL_LICENSE)\n\t\t\tconst isPerpetualLicense = this.isFlagEnabled(licenseInfo.flags, FLAGS.PERPETUAL_LICENSE)\n\n\t\t\tconst result: ValidLicenseKeyResult = {\n\t\t\t\tlicense: licenseInfo,\n\t\t\t\tisLicenseParseable: true,\n\t\t\t\tisDevelopment: this.isDevelopment,\n\t\t\t\tisDomainValid: this.isDomainValid(licenseInfo),\n\t\t\t\texpiryDate,\n\t\t\t\tisAnnualLicense,\n\t\t\t\tisAnnualLicenseExpired: isAnnualLicense && this.isAnnualLicenseExpired(expiryDate),\n\t\t\t\tisPerpetualLicense,\n\t\t\t\tisPerpetualLicenseExpired: isPerpetualLicense && this.isPerpetualLicenseExpired(expiryDate),\n\t\t\t\tisInternalLicense: this.isFlagEnabled(licenseInfo.flags, FLAGS.INTERNAL_LICENSE),\n\t\t\t\tisLicensedWithWatermark: this.isFlagEnabled(licenseInfo.flags, FLAGS.WITH_WATERMARK),\n\t\t\t}\n\t\t\tthis.outputLicenseInfoIfNeeded(result)\n\n\t\t\treturn result\n\t\t} catch (e: any) {\n\t\t\tthis.outputInvalidLicenseKey(e.message)\n\t\t\t// If the license can't be parsed, it's invalid\n\t\t\treturn { isLicenseParseable: false, reason: 'invalid-license-key' }\n\t\t}\n\t}\n\n\tprivate isDomainValid(licenseInfo: LicenseInfo) {\n\t\tconst currentHostname = window.location.hostname.toLowerCase()\n\n\t\treturn licenseInfo.hosts.some((host) => {\n\t\t\tconst normalizedHost = host.toLowerCase().trim()\n\n\t\t\t// Allow the domain if listed and www variations, 'example.com' allows 'example.com' and 'www.example.com'\n\t\t\tif (\n\t\t\t\tnormalizedHost === currentHostname ||\n\t\t\t\t`www.${normalizedHost}` === currentHostname ||\n\t\t\t\tnormalizedHost === `www.${currentHostname}`\n\t\t\t) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// If host is '*', we allow all domains.\n\t\t\tif (host === '*') {\n\t\t\t\t// All domains allowed.\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// Glob testing, we only support '*.somedomain.com' right now.\n\t\t\tif (host.includes('*')) {\n\t\t\t\tconst globToRegex = new RegExp(host.replace(/\\*/g, '.*?'))\n\t\t\t\treturn globToRegex.test(currentHostname) || globToRegex.test(`www.${currentHostname}`)\n\t\t\t}\n\n\t\t\t// VSCode support\n\t\t\tif (window.location.protocol === 'vscode-webview:') {\n\t\t\t\tconst currentUrl = new URL(window.location.href)\n\t\t\t\tconst extensionId = currentUrl.searchParams.get('extensionId')\n\t\t\t\tif (normalizedHost === extensionId) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false\n\t\t})\n\t}\n\n\tprivate getExpirationDateWithoutGracePeriod(expiryDate: Date) {\n\t\treturn new Date(expiryDate.getFullYear(), expiryDate.getMonth(), expiryDate.getDate())\n\t}\n\n\tprivate getExpirationDateWithGracePeriod(expiryDate: Date) {\n\t\treturn new Date(\n\t\t\texpiryDate.getFullYear(),\n\t\t\texpiryDate.getMonth(),\n\t\t\texpiryDate.getDate() + GRACE_PERIOD_DAYS + 1 // Add 1 day to include the expiration day\n\t\t)\n\t}\n\n\tprivate isAnnualLicenseExpired(expiryDate: Date) {\n\t\tconst expiration = this.getExpirationDateWithGracePeriod(expiryDate)\n\t\tconst isExpired = new Date() >= expiration\n\t\t// If it is not expired yet (including the grace period), but after the expiry date we warn the users\n\t\tif (!isExpired && new Date() >= this.getExpirationDateWithoutGracePeriod(expiryDate)) {\n\t\t\tthis.outputMessages([\n\t\t\t\t'tldraw license is about to expire, you are in a grace period.',\n\t\t\t\t`Please reach out to ${LICENSE_EMAIL} if you would like to renew your license.`,\n\t\t\t])\n\t\t}\n\t\treturn isExpired\n\t}\n\n\tprivate isPerpetualLicenseExpired(expiryDate: Date) {\n\t\tconst expiration = this.getExpirationDateWithGracePeriod(expiryDate)\n\t\tconst dates = {\n\t\t\tmajor: new Date(publishDates.major),\n\t\t\tminor: new Date(publishDates.minor),\n\t\t}\n\t\t// We allow patch releases, but the major and minor releases should be within the expiration date\n\t\treturn dates.major >= expiration || dates.minor >= expiration\n\t}\n\n\tprivate isFlagEnabled(flags: number, flag: number) {\n\t\treturn (flags & flag) === flag\n\t}\n\n\tprivate outputNoLicenseKeyProvided() {\n\t\t// Noop, we don't need to show this message.\n\t\t// this.outputMessages([\n\t\t// \t'No tldraw license key provided!',\n\t\t// \t`Please reach out to ${LICENSE_EMAIL} if you would like to license tldraw or if you'd like a trial.`,\n\t\t// ])\n\t}\n\n\tprivate outputInvalidLicenseKey(msg: string) {\n\t\tthis.outputMessages(['Invalid tldraw license key', `Reason: ${msg}`])\n\t}\n\n\tprivate outputLicenseInfoIfNeeded(result: ValidLicenseKeyResult) {\n\t\tif (result.isAnnualLicenseExpired) {\n\t\t\tthis.outputMessages([\n\t\t\t\t'Your tldraw license has expired!',\n\t\t\t\t`Please reach out to ${LICENSE_EMAIL} to renew.`,\n\t\t\t])\n\t\t}\n\n\t\tif (!result.isDomainValid && !result.isDevelopment) {\n\t\t\tthis.outputMessages([\n\t\t\t\t'This tldraw license key is not valid for this domain!',\n\t\t\t\t`Please reach out to ${LICENSE_EMAIL} if you would like to use tldraw on other domains.`,\n\t\t\t])\n\t\t}\n\t\t// If we added a new flag it will be twice the value of the currently highest flag.\n\t\t// And if all the current flags are on we would get the `HIGHEST_FLAG * 2 - 1`, so anything higher than that means there are new flags.\n\t\tif (result.license.flags >= HIGHEST_FLAG * 2) {\n\t\t\tthis.outputMessages([\n\t\t\t\t'This tldraw license contains some unknown flags.',\n\t\t\t\t'You may want to update tldraw packages to a newer version to get access to new functionality.',\n\t\t\t])\n\t\t}\n\t}\n\n\tprivate outputMessages(messages: string[]) {\n\t\tif (this.isTest) return\n\t\tif (this.verbose) {\n\t\t\tthis.outputDelimiter()\n\t\t\tfor (const message of messages) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(\n\t\t\t\t\t`%c${message}`,\n\t\t\t\t\t`color: white; background: crimson; padding: 2px; border-radius: 3px;`\n\t\t\t\t)\n\t\t\t}\n\t\t\tthis.outputDelimiter()\n\t\t}\n\t}\n\n\tprivate outputDelimiter() {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.log(\n\t\t\t'%c-------------------------------------------------------------------',\n\t\t\t`color: white; background: crimson; padding: 2px; border-radius: 3px;`\n\t\t)\n\t}\n\n\tstatic className = 'tl-watermark_SEE-LICENSE'\n}\n\nexport function isEditorUnlicensed(result: LicenseFromKeyResult) {\n\tif (!result.isLicenseParseable) return true\n\tif (!result.isDomainValid && !result.isDevelopment) return true\n\tif (result.isPerpetualLicenseExpired || result.isAnnualLicenseExpired) {\n\t\tif (result.isInternalLicense) {\n\t\t\tthrow new Error('License: Internal license expired.')\n\t\t}\n\t\treturn true\n\t}\n\n\treturn false\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { atom } from '@tldraw/state'\nimport { publishDates, version } from '../../version'\nimport { getDefaultCdnBaseUrl } from '../utils/assets'\nimport { importPublicKey, str2ab } from '../utils/licensing'\n\nconst GRACE_PERIOD_DAYS = 30\n\nexport const FLAGS = {\n\t// -- MUTUALLY EXCLUSIVE FLAGS --\n\t// Annual means the license expires after a time period, usually 1 year.\n\tANNUAL_LICENSE: 1,\n\t// Perpetual means the license never expires up to the max supported version.\n\tPERPETUAL_LICENSE: 1 << 1,\n\n\t// -- ADDITIVE FLAGS --\n\t// Internal means the license is for internal use only.\n\tINTERNAL_LICENSE: 1 << 2,\n\t// Watermark means the product is watermarked.\n\tWITH_WATERMARK: 1 << 3,\n\t// Evaluation means the license is for evaluation purposes only.\n\tEVALUATION_LICENSE: 1 << 4,\n\t// Native means the license is for native apps which switches\n\t// on special-case logic.\n\tNATIVE_LICENSE: 1 << 5,\n}\nconst HIGHEST_FLAG = Math.max(...Object.values(FLAGS))\n\nexport const PROPERTIES = {\n\tID: 0,\n\tHOSTS: 1,\n\tFLAGS: 2,\n\tEXPIRY_DATE: 3,\n}\nconst NUMBER_OF_KNOWN_PROPERTIES = Object.keys(PROPERTIES).length\n\nconst LICENSE_EMAIL = 'sales@tldraw.com'\n\nconst WATERMARK_TRACK_SRC = `${getDefaultCdnBaseUrl()}/watermarks/watermark-track.svg`\n\n/** @internal */\nexport interface LicenseInfo {\n\tid: string\n\thosts: string[]\n\tflags: number\n\texpiryDate: string\n}\n\n/** @internal */\nexport type LicenseState =\n\t| 'pending' // License validation is in progress\n\t| 'licensed' // License is valid and active (no restrictions)\n\t| 'licensed-with-watermark' // License is valid but shows watermark (evaluation licenses, WITH_WATERMARK licenses)\n\t| 'unlicensed' // No valid license found or license is invalid (development)\n\t| 'unlicensed-production' // No valid license in production deployment (missing, invalid, or wrong domain)\n\t| 'expired' // License has been expired (30 days past expiration for regular licenses, immediately for evaluation licenses)\n/** @internal */\nexport type InvalidLicenseReason =\n\t| 'invalid-license-key'\n\t| 'no-key-provided'\n\t| 'has-key-development-mode'\n\n/** @internal */\nexport type LicenseFromKeyResult = InvalidLicenseKeyResult | ValidLicenseKeyResult\n\n/** @internal */\nexport interface InvalidLicenseKeyResult {\n\tisLicenseParseable: false\n\treason: InvalidLicenseReason\n}\n\n/** @internal */\nexport interface ValidLicenseKeyResult {\n\tisLicenseParseable: true\n\tlicense: LicenseInfo\n\tisDevelopment: boolean\n\tisDomainValid: boolean\n\texpiryDate: Date\n\tisAnnualLicense: boolean\n\tisAnnualLicenseExpired: boolean\n\tisPerpetualLicense: boolean\n\tisPerpetualLicenseExpired: boolean\n\tisInternalLicense: boolean\n\tisNativeLicense: boolean\n\tisLicensedWithWatermark: boolean\n\tisEvaluationLicense: boolean\n\tisEvaluationLicenseExpired: boolean\n\tdaysSinceExpiry: number\n}\n\n/** @internal */\nexport type TestEnvironment = 'development' | 'production'\n\n/** @internal */\nexport type TrackType = 'unlicensed' | 'with_watermark' | 'evaluation' | null\n\n/** @internal */\nexport class LicenseManager {\n\tprivate publicKey =\n\t\t'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHJh0uUfxHtCGyerXmmatE368Hd9rI6LH9oPDQihnaCryRFWEVeOvf9U/SPbyxX74LFyJs5tYeAHq5Nc0Ax25LQ'\n\tpublic isDevelopment: boolean\n\tpublic isTest: boolean\n\tpublic isCryptoAvailable: boolean\n\tstate = atom<LicenseState>('license state', 'pending')\n\tpublic verbose = true\n\n\tconstructor(\n\t\tlicenseKey: string | undefined,\n\t\ttestPublicKey?: string,\n\t\ttestEnvironment?: TestEnvironment\n\t) {\n\t\tthis.isTest = process.env.NODE_ENV === 'test'\n\t\tthis.isDevelopment = this.getIsDevelopment(testEnvironment)\n\t\tthis.publicKey = testPublicKey || this.publicKey\n\t\tthis.isCryptoAvailable = !!crypto.subtle\n\n\t\tthis.getLicenseFromKey(licenseKey)\n\t\t\t.then((result) => {\n\t\t\t\tconst licenseState = getLicenseState(\n\t\t\t\t\tresult,\n\t\t\t\t\t(messages: string[]) => this.outputMessages(messages),\n\t\t\t\t\tthis.isDevelopment\n\t\t\t\t)\n\n\t\t\t\tthis.maybeTrack(result, licenseState)\n\n\t\t\t\tthis.state.set(licenseState)\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('License validation failed:', error)\n\t\t\t\tthis.state.set('unlicensed')\n\t\t\t})\n\t}\n\n\tprivate getIsDevelopment(testEnvironment?: TestEnvironment) {\n\t\tif (testEnvironment === 'development') return true\n\t\tif (testEnvironment === 'production') return false\n\n\t\t// If we are using https on a non-localhost domain we assume it's a production env and a development one otherwise\n\t\treturn (\n\t\t\t!['https:', 'vscode-webview:'].includes(window.location.protocol) ||\n\t\t\twindow.location.hostname === 'localhost'\n\t\t)\n\t}\n\n\tprivate getTrackType(result: LicenseFromKeyResult, licenseState: LicenseState): TrackType {\n\t\t// Track watermark for unlicensed production deployments\n\t\tif (licenseState === 'unlicensed-production') {\n\t\t\treturn 'unlicensed'\n\t\t}\n\n\t\tif (this.isDevelopment) {\n\t\t\treturn null\n\t\t}\n\n\t\tif (!result.isLicenseParseable) {\n\t\t\treturn null\n\t\t}\n\n\t\t// Track evaluation licenses (for analytics, even though no watermark is shown)\n\t\tif (result.isEvaluationLicense) {\n\t\t\treturn 'evaluation'\n\t\t}\n\n\t\t// Track licenses that show watermarks\n\t\tif (licenseState === 'licensed-with-watermark') {\n\t\t\treturn 'with_watermark'\n\t\t}\n\n\t\treturn null\n\t}\n\n\tprivate maybeTrack(result: LicenseFromKeyResult, licenseState: LicenseState): void {\n\t\tconst trackType = this.getTrackType(result, licenseState)\n\t\tif (!trackType) {\n\t\t\treturn\n\t\t}\n\n\t\tconst url = new URL(WATERMARK_TRACK_SRC)\n\t\turl.searchParams.set('version', version)\n\t\turl.searchParams.set('license_type', trackType)\n\n\t\t// eslint-disable-next-line no-restricted-globals\n\t\tfetch(url.toString())\n\t}\n\n\tprivate async extractLicenseKey(licenseKey: string): Promise<LicenseInfo> {\n\t\tconst [data, signature] = licenseKey.split('.')\n\t\tconst [prefix, encodedData] = data.split('/')\n\n\t\tif (!prefix.startsWith('tldraw-')) {\n\t\t\tthrow new Error(`Unsupported prefix '${prefix}'`)\n\t\t}\n\n\t\tconst publicCryptoKey = await importPublicKey(this.publicKey)\n\n\t\tlet isVerified\n\t\ttry {\n\t\t\tisVerified = await crypto.subtle.verify(\n\t\t\t\t{\n\t\t\t\t\tname: 'ECDSA',\n\t\t\t\t\thash: { name: 'SHA-256' },\n\t\t\t\t},\n\t\t\t\tpublicCryptoKey,\n\t\t\t\tnew Uint8Array(str2ab(atob(signature))),\n\t\t\t\tnew Uint8Array(str2ab(atob(encodedData)))\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\tthrow new Error('Could not perform signature validation')\n\t\t}\n\n\t\tif (!isVerified) {\n\t\t\tthrow new Error('Invalid signature')\n\t\t}\n\n\t\tlet decodedData: any\n\t\ttry {\n\t\t\tdecodedData = JSON.parse(atob(encodedData))\n\t\t} catch {\n\t\t\tthrow new Error('Could not parse object')\n\t\t}\n\t\tif (decodedData.length > NUMBER_OF_KNOWN_PROPERTIES) {\n\t\t\tthis.outputMessages([\n\t\t\t\t'License key contains some unknown properties.',\n\t\t\t\t'You may want to update tldraw packages to a newer version to get access to new functionality.',\n\t\t\t])\n\t\t}\n\n\t\treturn {\n\t\t\tid: decodedData[PROPERTIES.ID],\n\t\t\thosts: decodedData[PROPERTIES.HOSTS],\n\t\t\tflags: decodedData[PROPERTIES.FLAGS],\n\t\t\texpiryDate: decodedData[PROPERTIES.EXPIRY_DATE],\n\t\t}\n\t}\n\n\tasync getLicenseFromKey(licenseKey?: string): Promise<LicenseFromKeyResult> {\n\t\tif (!licenseKey) {\n\t\t\tif (!this.isDevelopment) {\n\t\t\t\tthis.outputNoLicenseKeyProvided()\n\t\t\t}\n\n\t\t\treturn { isLicenseParseable: false, reason: 'no-key-provided' }\n\t\t}\n\n\t\tif (this.isDevelopment && !this.isCryptoAvailable) {\n\t\t\tif (this.verbose) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(\n\t\t\t\t\t'tldraw: you seem to be in a development environment that does not support crypto. License not verified.'\n\t\t\t\t)\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log('You should check that this works in production separately.')\n\t\t\t}\n\t\t\t// We can't parse the license if we are in development mode since crypto\n\t\t\t// is not available on http\n\t\t\treturn { isLicenseParseable: false, reason: 'has-key-development-mode' }\n\t\t}\n\n\t\t// Borrowed idea from AG Grid:\n\t\t// Copying from various sources (like PDFs) can include zero-width characters.\n\t\t// This helps makes sure the key validation doesn't fail.\n\t\tlet cleanedLicenseKey = licenseKey.replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n\t\tcleanedLicenseKey = cleanedLicenseKey.replace(/\\r?\\n|\\r/g, '')\n\n\t\ttry {\n\t\t\tconst licenseInfo = await this.extractLicenseKey(cleanedLicenseKey)\n\t\t\tconst expiryDate = new Date(licenseInfo.expiryDate)\n\t\t\tconst isAnnualLicense = this.isFlagEnabled(licenseInfo.flags, FLAGS.ANNUAL_LICENSE)\n\t\t\tconst isPerpetualLicense = this.isFlagEnabled(licenseInfo.flags, FLAGS.PERPETUAL_LICENSE)\n\n\t\t\tconst isEvaluationLicense = this.isFlagEnabled(licenseInfo.flags, FLAGS.EVALUATION_LICENSE)\n\t\t\tconst daysSinceExpiry = this.getDaysSinceExpiry(expiryDate)\n\n\t\t\tconst result: ValidLicenseKeyResult = {\n\t\t\t\tlicense: licenseInfo,\n\t\t\t\tisLicenseParseable: true,\n\t\t\t\tisDevelopment: this.isDevelopment,\n\t\t\t\tisDomainValid: this.isDomainValid(licenseInfo),\n\t\t\t\texpiryDate,\n\t\t\t\tisAnnualLicense,\n\t\t\t\tisAnnualLicenseExpired: isAnnualLicense && this.isAnnualLicenseExpired(expiryDate),\n\t\t\t\tisPerpetualLicense,\n\t\t\t\tisPerpetualLicenseExpired: isPerpetualLicense && this.isPerpetualLicenseExpired(expiryDate),\n\t\t\t\tisInternalLicense: this.isFlagEnabled(licenseInfo.flags, FLAGS.INTERNAL_LICENSE),\n\t\t\t\tisNativeLicense: this.isNativeLicense(licenseInfo),\n\t\t\t\tisLicensedWithWatermark: this.isFlagEnabled(licenseInfo.flags, FLAGS.WITH_WATERMARK),\n\t\t\t\tisEvaluationLicense,\n\t\t\t\tisEvaluationLicenseExpired:\n\t\t\t\t\tisEvaluationLicense && this.isEvaluationLicenseExpired(expiryDate),\n\t\t\t\tdaysSinceExpiry,\n\t\t\t}\n\t\t\tthis.outputLicenseInfoIfNeeded(result)\n\n\t\t\treturn result\n\t\t} catch (e: any) {\n\t\t\tthis.outputInvalidLicenseKey(e.message)\n\t\t\t// If the license can't be parsed, it's invalid\n\t\t\treturn { isLicenseParseable: false, reason: 'invalid-license-key' }\n\t\t}\n\t}\n\n\tprivate isDomainValid(licenseInfo: LicenseInfo) {\n\t\tconst currentHostname = window.location.hostname.toLowerCase()\n\n\t\treturn licenseInfo.hosts.some((host) => {\n\t\t\tconst normalizedHostOrUrlRegex = host.toLowerCase().trim()\n\n\t\t\t// Allow the domain if listed and www variations, 'example.com' allows 'example.com' and 'www.example.com'\n\t\t\tif (\n\t\t\t\tnormalizedHostOrUrlRegex === currentHostname ||\n\t\t\t\t`www.${normalizedHostOrUrlRegex}` === currentHostname ||\n\t\t\t\tnormalizedHostOrUrlRegex === `www.${currentHostname}`\n\t\t\t) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// If host is '*', we allow all domains.\n\t\t\tif (host === '*') {\n\t\t\t\t// All domains allowed.\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// Native license support\n\t\t\t// In this case, `normalizedHost` is actually a protocol, e.g. `app-bundle:`\n\t\t\tif (this.isNativeLicense(licenseInfo)) {\n\t\t\t\treturn new RegExp(normalizedHostOrUrlRegex).test(window.location.href)\n\t\t\t}\n\n\t\t\t// Glob testing, we only support '*.somedomain.com' right now.\n\t\t\tif (host.includes('*')) {\n\t\t\t\tconst globToRegex = new RegExp(host.replace(/\\*/g, '.*?'))\n\t\t\t\treturn globToRegex.test(currentHostname) || globToRegex.test(`www.${currentHostname}`)\n\t\t\t}\n\n\t\t\t// VSCode support\n\t\t\tif (window.location.protocol === 'vscode-webview:') {\n\t\t\t\tconst currentUrl = new URL(window.location.href)\n\t\t\t\tconst extensionId = currentUrl.searchParams.get('extensionId')\n\t\t\t\tif (normalizedHostOrUrlRegex === extensionId) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false\n\t\t})\n\t}\n\n\tprivate isNativeLicense(licenseInfo: LicenseInfo) {\n\t\treturn this.isFlagEnabled(licenseInfo.flags, FLAGS.NATIVE_LICENSE)\n\t}\n\n\tprivate getExpirationDateWithoutGracePeriod(expiryDate: Date) {\n\t\treturn new Date(expiryDate.getFullYear(), expiryDate.getMonth(), expiryDate.getDate())\n\t}\n\n\tprivate getExpirationDateWithGracePeriod(expiryDate: Date) {\n\t\treturn new Date(\n\t\t\texpiryDate.getFullYear(),\n\t\t\texpiryDate.getMonth(),\n\t\t\texpiryDate.getDate() + GRACE_PERIOD_DAYS + 1 // Add 1 day to include the expiration day\n\t\t)\n\t}\n\n\tprivate isAnnualLicenseExpired(expiryDate: Date) {\n\t\tconst expiration = this.getExpirationDateWithGracePeriod(expiryDate)\n\t\treturn new Date() >= expiration\n\t}\n\n\tprivate isPerpetualLicenseExpired(expiryDate: Date) {\n\t\tconst expiration = this.getExpirationDateWithGracePeriod(expiryDate)\n\t\tconst dates = {\n\t\t\tmajor: new Date(publishDates.major),\n\t\t\tminor: new Date(publishDates.minor),\n\t\t}\n\t\t// We allow patch releases, but the major and minor releases should be within the expiration date\n\t\treturn dates.major >= expiration || dates.minor >= expiration\n\t}\n\n\tprivate getDaysSinceExpiry(expiryDate: Date): number {\n\t\tconst now = new Date()\n\t\tconst expiration = this.getExpirationDateWithoutGracePeriod(expiryDate)\n\t\tconst diffTime = now.getTime() - expiration.getTime()\n\t\tconst diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24))\n\t\treturn Math.max(0, diffDays)\n\t}\n\n\tprivate isEvaluationLicenseExpired(expiryDate: Date): boolean {\n\t\t// Evaluation licenses have no grace period - they expire immediately\n\t\tconst now = new Date()\n\t\tconst expiration = this.getExpirationDateWithoutGracePeriod(expiryDate)\n\t\treturn now >= expiration\n\t}\n\n\tprivate isFlagEnabled(flags: number, flag: number) {\n\t\treturn (flags & flag) === flag\n\t}\n\n\tprivate outputNoLicenseKeyProvided() {\n\t\t// Noop, we don't need to show this message.\n\t\t// this.outputMessages([\n\t\t// \t'No tldraw license key provided!',\n\t\t// \t`Please reach out to ${LICENSE_EMAIL} if you would like to license tldraw or if you'd like a trial.`,\n\t\t// ])\n\t}\n\n\tprivate outputInvalidLicenseKey(msg: string) {\n\t\tthis.outputMessages(['Invalid tldraw license key', `Reason: ${msg}`])\n\t}\n\n\tprivate outputLicenseInfoIfNeeded(result: ValidLicenseKeyResult) {\n\t\t// If we added a new flag it will be twice the value of the currently highest flag.\n\t\t// And if all the current flags are on we would get the `HIGHEST_FLAG * 2 - 1`, so anything higher than that means there are new flags.\n\t\tif (result.license.flags >= HIGHEST_FLAG * 2) {\n\t\t\tthis.outputMessages([\n\t\t\t\t'This tldraw license contains some unknown flags.',\n\t\t\t\t'You may want to update tldraw packages to a newer version to get access to new functionality.',\n\t\t\t])\n\t\t}\n\t}\n\n\tprivate outputMessages(messages: string[]) {\n\t\tif (this.isTest) return\n\t\tif (this.verbose) {\n\t\t\tthis.outputDelimiter()\n\t\t\tfor (const message of messages) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(\n\t\t\t\t\t`%c${message}`,\n\t\t\t\t\t`color: white; background: crimson; padding: 2px; border-radius: 3px;`\n\t\t\t\t)\n\t\t\t}\n\t\t\tthis.outputDelimiter()\n\t\t}\n\t}\n\n\tprivate outputDelimiter() {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.log(\n\t\t\t'%c-------------------------------------------------------------------',\n\t\t\t`color: white; background: crimson; padding: 2px; border-radius: 3px;`\n\t\t)\n\t}\n\n\tstatic className = 'tl-watermark_SEE-LICENSE'\n}\n\nexport function getLicenseState(\n\tresult: LicenseFromKeyResult,\n\toutputMessages: (messages: string[]) => void,\n\tisDevelopment: boolean\n): LicenseState {\n\tif (!result.isLicenseParseable) {\n\t\tif (isDevelopment) {\n\t\t\treturn 'unlicensed'\n\t\t}\n\n\t\t// All unlicensed scenarios should not work in production\n\t\tif (result.reason === 'no-key-provided') {\n\t\t\toutputMessages([\n\t\t\t\t'No tldraw license key provided!',\n\t\t\t\t'A license is required for production deployments.',\n\t\t\t\t`Please reach out to ${LICENSE_EMAIL} to purchase a license.`,\n\t\t\t])\n\t\t} else {\n\t\t\toutputMessages([\n\t\t\t\t'Invalid license key. tldraw requires a valid license for production use.',\n\t\t\t\t`Please reach out to ${LICENSE_EMAIL} to purchase a license.`,\n\t\t\t])\n\t\t}\n\t\treturn 'unlicensed-production'\n\t}\n\n\tif (!result.isDomainValid && !result.isDevelopment) {\n\t\toutputMessages([\n\t\t\t'License key is not valid for this domain.',\n\t\t\t'A license is required for production deployments.',\n\t\t\t`Please reach out to ${LICENSE_EMAIL} to purchase a license.`,\n\t\t])\n\t\treturn 'unlicensed-production'\n\t}\n\n\t// Handle evaluation licenses - they expire immediately with no grace period\n\tif (result.isEvaluationLicense) {\n\t\tif (result.isEvaluationLicenseExpired) {\n\t\t\toutputMessages([\n\t\t\t\t'Your tldraw evaluation license has expired!',\n\t\t\t\t`Please reach out to ${LICENSE_EMAIL} to purchase a full license.`,\n\t\t\t])\n\t\t\treturn 'expired'\n\t\t} else {\n\t\t\t// Valid evaluation license - tracked but no watermark shown\n\t\t\treturn 'licensed'\n\t\t}\n\t}\n\n\t// Handle expired regular licenses (both annual and perpetual)\n\tif (result.isPerpetualLicenseExpired || result.isAnnualLicenseExpired) {\n\t\toutputMessages([\n\t\t\t'Your tldraw license has been expired for more than 30 days!',\n\t\t\t`Please reach out to ${LICENSE_EMAIL} to renew your license.`,\n\t\t])\n\t\treturn 'expired'\n\t}\n\n\t// Check if license is past expiry date but within grace period\n\tconst daysSinceExpiry = result.daysSinceExpiry\n\tif (daysSinceExpiry > 0 && !result.isEvaluationLicense) {\n\t\toutputMessages([\n\t\t\t'Your tldraw license has expired.',\n\t\t\t`License expired ${daysSinceExpiry} days ago.`,\n\t\t\t`Please reach out to ${LICENSE_EMAIL} to renew your license.`,\n\t\t])\n\t\t// Within 30-day grace period: still licensed (no watermark)\n\t\treturn 'licensed'\n\t}\n\n\t// License is valid, determine if it has watermark\n\tif (result.isLicensedWithWatermark) {\n\t\treturn 'licensed-with-watermark'\n\t}\n\n\treturn 'licensed'\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -18,21 +18,59 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var LicenseProvider_exports = {};
20
20
  __export(LicenseProvider_exports, {
21
+ LICENSE_TIMEOUT: () => LICENSE_TIMEOUT,
21
22
  LicenseContext: () => LicenseContext,
22
23
  LicenseProvider: () => LicenseProvider,
23
24
  useLicenseContext: () => useLicenseContext
24
25
  });
25
26
  module.exports = __toCommonJS(LicenseProvider_exports);
26
27
  var import_jsx_runtime = require("react/jsx-runtime");
28
+ var import_state_react = require("@tldraw/state-react");
27
29
  var import_react = require("react");
28
30
  var import_LicenseManager = require("./LicenseManager");
31
+ const import_meta = {};
29
32
  const LicenseContext = (0, import_react.createContext)({});
30
33
  const useLicenseContext = () => (0, import_react.useContext)(LicenseContext);
34
+ function shouldHideEditorAfterDelay(licenseState) {
35
+ return licenseState === "expired" || licenseState === "unlicensed-production";
36
+ }
37
+ const LICENSE_TIMEOUT = 5e3;
31
38
  function LicenseProvider({
32
- licenseKey,
39
+ licenseKey = getLicenseKeyFromEnv() ?? void 0,
33
40
  children
34
41
  }) {
35
42
  const [licenseManager] = (0, import_react.useState)(() => new import_LicenseManager.LicenseManager(licenseKey));
43
+ const licenseState = (0, import_state_react.useValue)(licenseManager.state);
44
+ const [showEditor, setShowEditor] = (0, import_react.useState)(true);
45
+ (0, import_react.useEffect)(() => {
46
+ if (shouldHideEditorAfterDelay(licenseState) && showEditor) {
47
+ const timer = setTimeout(() => {
48
+ setShowEditor(false);
49
+ }, LICENSE_TIMEOUT);
50
+ return () => clearTimeout(timer);
51
+ }
52
+ }, [licenseState, showEditor]);
53
+ if (shouldHideEditorAfterDelay(licenseState) && !showEditor) {
54
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LicenseGate, {});
55
+ }
36
56
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LicenseContext.Provider, { value: licenseManager, children });
37
57
  }
58
+ function LicenseGate() {
59
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { "data-testid": "tl-license-expired", style: { display: "none" } });
60
+ }
61
+ let envLicenseKey = void 0;
62
+ function getLicenseKeyFromEnv() {
63
+ if (envLicenseKey !== void 0) {
64
+ return envLicenseKey;
65
+ }
66
+ envLicenseKey = getEnv(() => process.env.TLDRAW_LICENSE_KEY) || getEnv(() => process.env.NEXT_PUBLIC_TLDRAW_LICENSE_KEY) || getEnv(() => process.env.REACT_APP_TLDRAW_LICENSE_KEY) || getEnv(() => process.env.GATSBY_TLDRAW_LICENSE_KEY) || getEnv(() => process.env.VITE_TLDRAW_LICENSE_KEY) || getEnv(() => process.env.PUBLIC_TLDRAW_LICENSE_KEY) || getEnv(() => import_meta.env.TLDRAW_LICENSE_KEY) || getEnv(() => import_meta.env.NEXT_PUBLIC_TLDRAW_LICENSE_KEY) || getEnv(() => import_meta.env.REACT_APP_TLDRAW_LICENSE_KEY) || getEnv(() => import_meta.env.GATSBY_TLDRAW_LICENSE_KEY) || getEnv(() => import_meta.env.VITE_TLDRAW_LICENSE_KEY) || getEnv(() => import_meta.env.PUBLIC_TLDRAW_LICENSE_KEY) || null;
67
+ return envLicenseKey;
68
+ }
69
+ function getEnv(cb) {
70
+ try {
71
+ return cb();
72
+ } catch {
73
+ return void 0;
74
+ }
75
+ }
38
76
  //# sourceMappingURL=LicenseProvider.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/license/LicenseProvider.tsx"],
4
- "sourcesContent": ["import { createContext, ReactNode, useContext, useState } from 'react'\nimport { LicenseManager } from './LicenseManager'\n\n/** @internal */\nexport const LicenseContext = createContext({} as LicenseManager)\n\n/** @internal */\nexport const useLicenseContext = () => useContext(LicenseContext)\n\n/** @internal */\nexport function LicenseProvider({\n\tlicenseKey,\n\tchildren,\n}: {\n\tlicenseKey?: string\n\tchildren: ReactNode\n}) {\n\tconst [licenseManager] = useState(() => new LicenseManager(licenseKey))\n\treturn <LicenseContext.Provider value={licenseManager}>{children}</LicenseContext.Provider>\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBQ;AAlBR,mBAA+D;AAC/D,4BAA+B;AAGxB,MAAM,qBAAiB,4BAAc,CAAC,CAAmB;AAGzD,MAAM,oBAAoB,UAAM,yBAAW,cAAc;AAGzD,SAAS,gBAAgB;AAAA,EAC/B;AAAA,EACA;AACD,GAGG;AACF,QAAM,CAAC,cAAc,QAAI,uBAAS,MAAM,IAAI,qCAAe,UAAU,CAAC;AACtE,SAAO,4CAAC,eAAe,UAAf,EAAwB,OAAO,gBAAiB,UAAS;AAClE;",
4
+ "sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { createContext, ReactNode, useContext, useEffect, useState } from 'react'\nimport { LicenseManager } from './LicenseManager'\n\n/** @internal */\nexport const LicenseContext = createContext({} as LicenseManager)\n\n/** @internal */\nexport const useLicenseContext = () => useContext(LicenseContext)\n\nfunction shouldHideEditorAfterDelay(licenseState: string): boolean {\n\treturn licenseState === 'expired' || licenseState === 'unlicensed-production'\n}\n\n/** @internal */\nexport const LICENSE_TIMEOUT = 5000\n\n/** @internal */\nexport function LicenseProvider({\n\tlicenseKey = getLicenseKeyFromEnv() ?? undefined,\n\tchildren,\n}: {\n\tlicenseKey?: string\n\tchildren: ReactNode\n}) {\n\tconst [licenseManager] = useState(() => new LicenseManager(licenseKey))\n\tconst licenseState = useValue(licenseManager.state)\n\tconst [showEditor, setShowEditor] = useState(true)\n\n\t// When license expires or no license in production, show for 5 seconds then hide\n\tuseEffect(() => {\n\t\tif (shouldHideEditorAfterDelay(licenseState) && showEditor) {\n\t\t\t// eslint-disable-next-line no-restricted-globals\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tsetShowEditor(false)\n\t\t\t}, LICENSE_TIMEOUT)\n\n\t\t\treturn () => clearTimeout(timer)\n\t\t}\n\t}, [licenseState, showEditor])\n\n\t// If license is expired or no license in production and 5 seconds have passed, don't render anything (blank screen)\n\tif (shouldHideEditorAfterDelay(licenseState) && !showEditor) {\n\t\treturn <LicenseGate />\n\t}\n\n\treturn <LicenseContext.Provider value={licenseManager}>{children}</LicenseContext.Provider>\n}\n\n// Renders as a hidden div that can be detected by tests\nfunction LicenseGate() {\n\treturn <div data-testid=\"tl-license-expired\" style={{ display: 'none' }} />\n}\n\nlet envLicenseKey: string | undefined | null = undefined\nfunction getLicenseKeyFromEnv() {\n\tif (envLicenseKey !== undefined) {\n\t\treturn envLicenseKey\n\t}\n\t// it's important here that we write out the full process.env.WHATEVER expression instead of\n\t// doing something like process.env[someVariable]. This is because most bundlers do something\n\t// like a find-replace inject environment variables, and so won't pick up on dynamic ones. It\n\t// also means we can't do checks like `process.env && process.env.WHATEVER`, which is why we use\n\t// the `getEnv` try/catch approach.\n\n\t// framework-specific prefixes borrowed from the ones vercel uses, but trimmed down to just the\n\t// react-y ones: https://vercel.com/docs/environment-variables/framework-environment-variables\n\tenvLicenseKey =\n\t\tgetEnv(() => process.env.TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => process.env.NEXT_PUBLIC_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => process.env.REACT_APP_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => process.env.GATSBY_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => process.env.VITE_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => process.env.PUBLIC_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => (import.meta as any).env.TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => (import.meta as any).env.NEXT_PUBLIC_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => (import.meta as any).env.REACT_APP_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => (import.meta as any).env.GATSBY_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => (import.meta as any).env.VITE_TLDRAW_LICENSE_KEY) ||\n\t\tgetEnv(() => (import.meta as any).env.PUBLIC_TLDRAW_LICENSE_KEY) ||\n\t\tnull\n\n\treturn envLicenseKey\n}\n\nfunction getEnv(cb: () => string | undefined) {\n\ttry {\n\t\treturn cb()\n\t} catch {\n\t\treturn undefined\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CS;AA3CT,yBAAyB;AACzB,mBAA0E;AAC1E,4BAA+B;AAF/B;AAKO,MAAM,qBAAiB,4BAAc,CAAC,CAAmB;AAGzD,MAAM,oBAAoB,UAAM,yBAAW,cAAc;AAEhE,SAAS,2BAA2B,cAA+B;AAClE,SAAO,iBAAiB,aAAa,iBAAiB;AACvD;AAGO,MAAM,kBAAkB;AAGxB,SAAS,gBAAgB;AAAA,EAC/B,aAAa,qBAAqB,KAAK;AAAA,EACvC;AACD,GAGG;AACF,QAAM,CAAC,cAAc,QAAI,uBAAS,MAAM,IAAI,qCAAe,UAAU,CAAC;AACtE,QAAM,mBAAe,6BAAS,eAAe,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,IAAI;AAGjD,8BAAU,MAAM;AACf,QAAI,2BAA2B,YAAY,KAAK,YAAY;AAE3D,YAAM,QAAQ,WAAW,MAAM;AAC9B,sBAAc,KAAK;AAAA,MACpB,GAAG,eAAe;AAElB,aAAO,MAAM,aAAa,KAAK;AAAA,IAChC;AAAA,EACD,GAAG,CAAC,cAAc,UAAU,CAAC;AAG7B,MAAI,2BAA2B,YAAY,KAAK,CAAC,YAAY;AAC5D,WAAO,4CAAC,eAAY;AAAA,EACrB;AAEA,SAAO,4CAAC,eAAe,UAAf,EAAwB,OAAO,gBAAiB,UAAS;AAClE;AAGA,SAAS,cAAc;AACtB,SAAO,4CAAC,SAAI,eAAY,sBAAqB,OAAO,EAAE,SAAS,OAAO,GAAG;AAC1E;AAEA,IAAI,gBAA2C;AAC/C,SAAS,uBAAuB;AAC/B,MAAI,kBAAkB,QAAW;AAChC,WAAO;AAAA,EACR;AASA,kBACC,OAAO,MAAM,QAAQ,IAAI,kBAAkB,KAC3C,OAAO,MAAM,QAAQ,IAAI,8BAA8B,KACvD,OAAO,MAAM,QAAQ,IAAI,4BAA4B,KACrD,OAAO,MAAM,QAAQ,IAAI,yBAAyB,KAClD,OAAO,MAAM,QAAQ,IAAI,uBAAuB,KAChD,OAAO,MAAM,QAAQ,IAAI,yBAAyB,KAClD,OAAO,MAAO,YAAoB,IAAI,kBAAkB,KACxD,OAAO,MAAO,YAAoB,IAAI,8BAA8B,KACpE,OAAO,MAAO,YAAoB,IAAI,4BAA4B,KAClE,OAAO,MAAO,YAAoB,IAAI,yBAAyB,KAC/D,OAAO,MAAO,YAAoB,IAAI,uBAAuB,KAC7D,OAAO,MAAO,YAAoB,IAAI,yBAAyB,KAC/D;AAED,SAAO;AACR;AAEA,SAAS,OAAO,IAA8B;AAC7C,MAAI;AACH,WAAO,GAAG;AAAA,EACX,QAAQ;AACP,WAAO;AAAA,EACR;AACD;",
6
6
  "names": []
7
7
  }
@@ -45,10 +45,68 @@ const Watermark = (0, import_react.memo)(function Watermark2() {
45
45
  if (!["licensed-with-watermark", "unlicensed"].includes(licenseManagerState)) return null;
46
46
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
47
47
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LicenseStyles, {}),
48
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WatermarkInner, { src: isMobile ? WATERMARK_MOBILE_LOCAL_SRC : WATERMARK_DESKTOP_LOCAL_SRC })
48
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49
+ WatermarkInner,
50
+ {
51
+ src: isMobile ? WATERMARK_MOBILE_LOCAL_SRC : WATERMARK_DESKTOP_LOCAL_SRC,
52
+ isUnlicensed: licenseManagerState === "unlicensed"
53
+ }
54
+ )
49
55
  ] });
50
56
  });
51
- const WatermarkInner = (0, import_react.memo)(function WatermarkInner2({ src }) {
57
+ const UnlicensedWatermark = (0, import_react.memo)(function UnlicensedWatermark2({
58
+ isDebugMode,
59
+ isMobile
60
+ }) {
61
+ const events = (0, import_useCanvasEvents.useCanvasEvents)();
62
+ const ref = (0, import_react.useRef)(null);
63
+ (0, import_usePassThroughWheelEvents.usePassThroughWheelEvents)(ref);
64
+ const url = "https://tldraw.dev/?utm_source=dotcom&utm_medium=organic&utm_campaign=watermark";
65
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
66
+ "div",
67
+ {
68
+ ref,
69
+ className: import_LicenseManager.LicenseManager.className,
70
+ "data-debug": isDebugMode,
71
+ "data-mobile": isMobile,
72
+ "data-unlicensed": true,
73
+ "data-testid": "tl-watermark-unlicensed",
74
+ draggable: false,
75
+ ...events,
76
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
77
+ "button",
78
+ {
79
+ draggable: false,
80
+ role: "button",
81
+ onPointerDown: (e) => {
82
+ (0, import_dom.stopEventPropagation)(e);
83
+ (0, import_dom.preventDefault)(e);
84
+ },
85
+ title: "Unlicensed - click to get a license",
86
+ onClick: () => import_runtime.runtime.openWindow(url, "_blank"),
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"
101
+ }
102
+ )
103
+ }
104
+ );
105
+ });
106
+ const WatermarkInner = (0, import_react.memo)(function WatermarkInner2({
107
+ src,
108
+ isUnlicensed
109
+ }) {
52
110
  const editor = (0, import_useEditor.useEditor)();
53
111
  const isDebugMode = (0, import_state_react.useValue)("debug mode", () => editor.getInstanceState().isDebugMode, [editor]);
54
112
  const isMobile = (0, import_state_react.useValue)("is mobile", () => editor.getViewportScreenBounds().width < 700, [
@@ -59,6 +117,9 @@ const WatermarkInner = (0, import_react.memo)(function WatermarkInner2({ src })
59
117
  (0, import_usePassThroughWheelEvents.usePassThroughWheelEvents)(ref);
60
118
  const maskCss = `url('${src}') center 100% / 100% no-repeat`;
61
119
  const url = "https://tldraw.dev/?utm_source=dotcom&utm_medium=organic&utm_campaign=watermark";
120
+ if (isUnlicensed) {
121
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(UnlicensedWatermark, { isDebugMode, isMobile });
122
+ }
62
123
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
124
  "div",
64
125
  {
@@ -66,6 +127,7 @@ const WatermarkInner = (0, import_react.memo)(function WatermarkInner2({ src })
66
127
  className: import_LicenseManager.LicenseManager.className,
67
128
  "data-debug": isDebugMode,
68
129
  "data-mobile": isMobile,
130
+ "data-testid": "tl-watermark-licensed",
69
131
  draggable: false,
70
132
  ...events,
71
133
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -99,8 +161,8 @@ To remove the watermark, please purchase a license at tldraw.dev.
99
161
 
100
162
  .${className} {
101
163
  position: absolute;
102
- bottom: var(--tl-space-2);
103
- right: var(--tl-space-2);
164
+ bottom: max(var(--tl-space-2), env(safe-area-inset-bottom));
165
+ right: max(var(--tl-space-2), env(safe-area-inset-right));
104
166
  width: 96px;
105
167
  height: 32px;
106
168
  display: flex;
@@ -129,12 +191,12 @@ To remove the watermark, please purchase a license at tldraw.dev.
129
191
  }
130
192
 
131
193
  .${className}[data-debug='true'] {
132
- bottom: 46px;
194
+ bottom: max(46px, env(safe-area-inset-bottom));
133
195
  }
134
196
 
135
197
  .${className}[data-mobile='true'] {
136
198
  border-radius: 4px 0px 0px 4px;
137
- right: -2px;
199
+ right: max(-2px, calc(env(safe-area-inset-right) - 2px));
138
200
  width: 8px;
139
201
  height: 48px;
140
202
  }
@@ -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, stopEventPropagation } 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 src={isMobile ? WATERMARK_MOBILE_LOCAL_SRC : WATERMARK_DESKTOP_LOCAL_SRC} />\n\t\t</>\n\t)\n})\n\nconst WatermarkInner = memo(function WatermarkInner({ src }: { src: string }) {\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\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\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\tstopEventPropagation(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: var(--tl-space-2);\n\t\tright: var(--tl-space-2);\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: 46px;\n\t}\n\n\t.${className}[data-mobile='true'] {\n\t\tborder-radius: 4px 0px 0px 4px;\n\t\tright: -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
- "names": ["Watermark", "WatermarkInner", "LicenseStyles"]
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, stopEventPropagation } 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\tstopEventPropagation(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\tstopEventPropagation(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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BE;AA5BF,yBAAyB;AACzB,mBAA6B;AAC7B,6BAAgC;AAChC,uBAA0B;AAC1B,uCAA0C;AAC1C,iBAAqD;AACrD,qBAAwB;AACxB,wBAAwD;AACxD,4BAA+B;AAC/B,6BAAkC;AAClC,oCAAuC;AAEvC,MAAM,8BAA8B,2BAA2B,mBAAmB,qCAAmB,CAAC;AACtG,MAAM,6BAA6B,2BAA2B,mBAAmB,oCAAkB,CAAC;AAG7F,MAAM,gBAAY,mBAAK,SAASA,aAAY;AAClD,QAAM,qBAAiB,0CAAkB;AACzC,QAAM,aAAS,4BAAU;AACzB,QAAM,eAAW,6BAAS,aAAa,MAAM,OAAO,wBAAwB,EAAE,QAAQ,KAAK;AAAA,IAC1F;AAAA,EACD,CAAC;AAED,QAAM,0BAAsB,sDAAuB,cAAc;AAEjE,MAAI,CAAC,CAAC,2BAA2B,YAAY,EAAE,SAAS,mBAAmB,EAAG,QAAO;AAErF,SACC,4EACC;AAAA,gDAAC,iBAAc;AAAA,IACf;AAAA,MAAC;AAAA;AAAA,QACA,KAAK,WAAW,6BAA6B;AAAA,QAC7C,cAAc,wBAAwB;AAAA;AAAA,IACvC;AAAA,KACD;AAEF,CAAC;AAED,MAAM,0BAAsB,mBAAK,SAASC,qBAAoB;AAAA,EAC7D;AAAA,EACA;AACD,GAGG;AACF,QAAM,aAAS,wCAAgB;AAC/B,QAAM,UAAM,qBAAuB,IAAI;AACvC,kEAA0B,GAAG;AAE7B,QAAM,MAAM;AAEZ,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,WAAW,qCAAe;AAAA,MAC1B,cAAY;AAAA,MACZ,eAAa;AAAA,MACb,mBAAiB;AAAA,MACjB,eAAY;AAAA,MACZ,WAAW;AAAA,MACV,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACA,WAAW;AAAA,UACX,MAAK;AAAA,UACL,eAAe,CAAC,MAAM;AACrB,iDAAqB,CAAC;AACtB,2CAAe,CAAC;AAAA,UACjB;AAAA,UACA,OAAM;AAAA,UACN,SAAS,MAAM,uBAAQ,WAAW,KAAK,QAAQ;AAAA,UAC/C,OAAO;AAAA,YACN,UAAU;AAAA,YACV,eAAe;AAAA,YACf,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,WAAW;AAAA,UACZ;AAAA,UACA;AAAA;AAAA,MAED;AAAA;AAAA,EACD;AAEF,CAAC;AAED,MAAM,qBAAiB,mBAAK,SAASC,gBAAe;AAAA,EACnD;AAAA,EACA;AACD,GAGG;AACF,QAAM,aAAS,4BAAU;AACzB,QAAM,kBAAc,6BAAS,cAAc,MAAM,OAAO,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC;AAChG,QAAM,eAAW,6BAAS,aAAa,MAAM,OAAO,wBAAwB,EAAE,QAAQ,KAAK;AAAA,IAC1F;AAAA,EACD,CAAC;AACD,QAAM,aAAS,wCAAgB;AAE/B,QAAM,UAAM,qBAAuB,IAAI;AACvC,kEAA0B,GAAG;AAE7B,QAAM,UAAU,QAAQ,GAAG;AAC3B,QAAM,MAAM;AAEZ,MAAI,cAAc;AACjB,WAAO,4CAAC,uBAAoB,aAA0B,UAAoB;AAAA,EAC3E;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,WAAW,qCAAe;AAAA,MAC1B,cAAY;AAAA,MACZ,eAAa;AAAA,MACb,eAAY;AAAA,MACZ,WAAW;AAAA,MACV,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACA,WAAW;AAAA,UACX,MAAK;AAAA,UACL,eAAe,CAAC,MAAM;AACrB,iDAAqB,CAAC;AACtB,2CAAe,CAAC;AAAA,UACjB;AAAA,UACA,OAAM;AAAA,UACN,SAAS,MAAM,uBAAQ,WAAW,KAAK,QAAQ;AAAA,UAC/C,OAAO,EAAE,MAAM,SAAS,YAAY,QAAQ;AAAA;AAAA,MAC7C;AAAA;AAAA,EACD;AAEF,CAAC;AAED,MAAM,oBAAgB,mBAAK,SAASC,iBAAgB;AACnD,QAAM,aAAS,4BAAU;AACzB,QAAM,YAAY,qCAAe;AAEjC,QAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAST,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaT,SAAS;AAAA;AAAA;AAAA;AAAA,IAIT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMR,SAAS;AAAA;AAAA;AAAA;AAAA,KAIT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMT,SAAS;AAAA,gBACE,SAAS;AAAA;AAAA;AAAA;AAAA,KAIpB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAatB,SAAO,4CAAC,WAAM,OAAO,OAAO,QAAQ,OAAQ,eAAI;AACjD,CAAC;",
6
+ "names": ["Watermark", "UnlicensedWatermark", "WatermarkInner", "LicenseStyles"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/license/useLicenseManagerState.ts"],
4
- "sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { LicenseManager } from './LicenseManager'\n\n/** @internal */\nexport function useLicenseManagerState(licenseManager: LicenseManager) {\n\treturn useValue('watermarkState', () => licenseManager.state.get(), [licenseManager])\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAyB;AAIlB,SAAS,uBAAuB,gBAAgC;AACtE,aAAO,6BAAS,kBAAkB,MAAM,eAAe,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC;AACrF;",
4
+ "sourcesContent": ["import { useValue } from '@tldraw/state-react'\nimport { LicenseManager, LicenseState } from './LicenseManager'\n\n/** @internal */\nexport function useLicenseManagerState(licenseManager: LicenseManager): LicenseState {\n\treturn useValue('watermarkState', () => licenseManager.state.get(), [licenseManager])\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAyB;AAIlB,SAAS,uBAAuB,gBAA8C;AACpF,aAAO,6BAAS,kBAAkB,MAAM,eAAe,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC;AACrF;",
6
6
  "names": []
7
7
  }
@@ -208,10 +208,6 @@ class Vec {
208
208
  equalsXY(x, y) {
209
209
  return Vec.EqualsXY(this, x, y);
210
210
  }
211
- /** @deprecated use `uni` instead */
212
- norm() {
213
- return this.uni();
214
- }
215
211
  toFixed() {
216
212
  this.x = (0, import_utils.toFixed)(this.x);
217
213
  this.y = (0, import_utils.toFixed)(this.y);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/primitives/Vec.ts"],
4
- "sourcesContent": ["import { VecModel } from '@tldraw/tlschema'\nimport { EASINGS } from './easings'\nimport { clamp, toFixed } from './utils'\n\n/** @public */\nexport type VecLike = Vec | VecModel\n\n/** @public */\nexport class Vec {\n\tconstructor(\n\t\tpublic x = 0,\n\t\tpublic y = 0,\n\t\tpublic z = 1\n\t) {}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tget pressure() {\n\t\treturn this.z\n\t}\n\n\tset(x = this.x, y = this.y, z = this.z) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\tsetTo({ x = 0, y = 0, z = 1 }: VecLike) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\trot(r: number) {\n\t\tif (r === 0) return this\n\t\tconst { x, y } = this\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = x * c - y * s\n\t\tthis.y = x * s + y * c\n\t\treturn this\n\t}\n\n\trotWith(C: VecLike, r: number) {\n\t\tif (r === 0) return this\n\t\tconst x = this.x - C.x\n\t\tconst y = this.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = C.x + (x * c - y * s)\n\t\tthis.y = C.y + (x * s + y * c)\n\t\treturn this\n\t}\n\n\tclone(): Vec {\n\t\tconst { x, y, z } = this\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tsub(V: VecLike) {\n\t\tthis.x -= V.x\n\t\tthis.y -= V.y\n\t\treturn this\n\t}\n\n\tsubXY(x: number, y: number) {\n\t\tthis.x -= x\n\t\tthis.y -= y\n\t\treturn this\n\t}\n\n\tsubScalar(n: number) {\n\t\tthis.x -= n\n\t\tthis.y -= n\n\t\t// this.z -= n\n\n\t\treturn this\n\t}\n\n\tadd(V: VecLike) {\n\t\tthis.x += V.x\n\t\tthis.y += V.y\n\t\treturn this\n\t}\n\n\taddXY(x: number, y: number) {\n\t\tthis.x += x\n\t\tthis.y += y\n\t\treturn this\n\t}\n\n\taddScalar(n: number) {\n\t\tthis.x += n\n\t\tthis.y += n\n\t\t// this.z += n\n\n\t\treturn this\n\t}\n\n\tclamp(min: number, max?: number) {\n\t\tthis.x = Math.max(this.x, min)\n\t\tthis.y = Math.max(this.y, min)\n\t\tif (max !== undefined) {\n\t\t\tthis.x = Math.min(this.x, max)\n\t\t\tthis.y = Math.min(this.y, max)\n\t\t}\n\t\treturn this\n\t}\n\n\tdiv(t: number) {\n\t\tthis.x /= t\n\t\tthis.y /= t\n\t\t// this.z /= t\n\t\treturn this\n\t}\n\n\tdivV(V: VecLike) {\n\t\tthis.x /= V.x\n\t\tthis.y /= V.y\n\t\t// this.z /= V.z\n\t\treturn this\n\t}\n\n\tmul(t: number) {\n\t\tthis.x *= t\n\t\tthis.y *= t\n\t\t// this.z *= t\n\t\treturn this\n\t}\n\n\tmulV(V: VecLike) {\n\t\tthis.x *= V.x\n\t\tthis.y *= V.y\n\t\t// this.z *= V.z\n\t\treturn this\n\t}\n\n\tabs() {\n\t\tthis.x = Math.abs(this.x)\n\t\tthis.y = Math.abs(this.y)\n\t\treturn this\n\t}\n\n\tnudge(B: VecLike, distance: number) {\n\t\tconst tan = Vec.Tan(B, this)\n\t\treturn this.add(tan.mul(distance))\n\t}\n\n\tneg() {\n\t\tthis.x *= -1\n\t\tthis.y *= -1\n\t\t// this.z *= -1\n\t\treturn this\n\t}\n\n\tcross(V: VecLike) {\n\t\tthis.x = this.y * V.z! - this.z * V.y\n\t\tthis.y = this.z * V.x - this.x * V.z!\n\t\t// this.z = this.x * V.y - this.y * V.x\n\t\treturn this\n\t}\n\n\tdpr(V: VecLike): number {\n\t\treturn Vec.Dpr(this, V)\n\t}\n\n\tcpr(V: VecLike) {\n\t\treturn Vec.Cpr(this, V)\n\t}\n\n\tlen2(): number {\n\t\treturn Vec.Len2(this)\n\t}\n\n\tlen(): number {\n\t\treturn Vec.Len(this)\n\t}\n\n\tpry(V: VecLike): number {\n\t\treturn Vec.Pry(this, V)\n\t}\n\n\tper() {\n\t\tconst { x, y } = this\n\t\tthis.x = y\n\t\tthis.y = -x\n\t\treturn this\n\t}\n\n\tuni() {\n\t\tconst l = this.len()\n\t\tif (l === 0) return this\n\t\tthis.x /= l\n\t\tthis.y /= l\n\t\treturn this\n\t}\n\n\ttan(V: VecLike): Vec {\n\t\treturn this.sub(V).uni()\n\t}\n\n\tdist(V: VecLike): number {\n\t\treturn Vec.Dist(this, V)\n\t}\n\n\tdistanceToLineSegment(A: VecLike, B: VecLike): number {\n\t\treturn Vec.DistanceToLineSegment(A, B, this)\n\t}\n\n\tslope(B: VecLike): number {\n\t\treturn Vec.Slope(this, B)\n\t}\n\n\tsnapToGrid(gridSize: number) {\n\t\tthis.x = Math.round(this.x / gridSize) * gridSize\n\t\tthis.y = Math.round(this.y / gridSize) * gridSize\n\t\treturn this\n\t}\n\n\tangle(B: VecLike): number {\n\t\treturn Vec.Angle(this, B)\n\t}\n\n\ttoAngle() {\n\t\treturn Vec.ToAngle(this)\n\t}\n\n\tlrp(B: VecLike, t: number): Vec {\n\t\tthis.x = this.x + (B.x - this.x) * t\n\t\tthis.y = this.y + (B.y - this.y) * t\n\t\treturn this\n\t}\n\n\tequals(B: VecLike) {\n\t\treturn Vec.Equals(this, B)\n\t}\n\n\tequalsXY(x: number, y: number) {\n\t\treturn Vec.EqualsXY(this, x, y)\n\t}\n\n\t/** @deprecated use `uni` instead */\n\tnorm() {\n\t\treturn this.uni()\n\t}\n\n\ttoFixed() {\n\t\tthis.x = toFixed(this.x)\n\t\tthis.y = toFixed(this.y)\n\t\treturn this\n\t}\n\n\ttoString() {\n\t\treturn Vec.ToString(Vec.ToFixed(this))\n\t}\n\n\ttoJson(): VecModel {\n\t\treturn Vec.ToJson(this)\n\t}\n\n\ttoArray(): number[] {\n\t\treturn Vec.ToArray(this)\n\t}\n\n\tstatic Add(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x + B.x, A.y + B.y)\n\t}\n\n\tstatic AddXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x + x, A.y + y)\n\t}\n\n\tstatic Sub(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x - B.x, A.y - B.y)\n\t}\n\n\tstatic SubXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x - x, A.y - y)\n\t}\n\n\tstatic AddScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x + n, A.y + n)\n\t}\n\n\tstatic SubScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x - n, A.y - n)\n\t}\n\n\tstatic Div(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x / t, A.y / t)\n\t}\n\n\tstatic Mul(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x * t, A.y * t)\n\t}\n\n\tstatic DivV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x / B.x, A.y / B.y)\n\t}\n\n\tstatic MulV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x * B.x, A.y * B.y)\n\t}\n\n\tstatic Neg(A: VecLike): Vec {\n\t\treturn new Vec(-A.x, -A.y)\n\t}\n\n\t/**\n\t * Get the perpendicular vector to A.\n\t */\n\tstatic Per(A: VecLike): Vec {\n\t\treturn new Vec(A.y, -A.x)\n\t}\n\n\tstatic Abs(A: VecLike): Vec {\n\t\treturn new Vec(Math.abs(A.x), Math.abs(A.y))\n\t}\n\n\t// Get the distance between two points.\n\tstatic Dist(A: VecLike, B: VecLike): number {\n\t\treturn ((A.y - B.y) ** 2 + (A.x - B.x) ** 2) ** 0.5\n\t}\n\n\t// Get the Manhattan distance between two points.\n\tstatic ManhattanDist(A: VecLike, B: VecLike): number {\n\t\treturn Math.abs(A.x - B.x) + Math.abs(A.y - B.y)\n\t}\n\n\t// Get whether a distance between two points is less than a number. This is faster to calulate than using `Vec.Dist(a, b) < n`.\n\tstatic DistMin(A: VecLike, B: VecLike, n: number): boolean {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) < n ** 2\n\t}\n\n\t// Get the squared distance between two points. This is faster to calculate (no square root) so useful for \"minimum distance\" checks where the actual measurement does not matter.\n\tstatic Dist2(A: VecLike, B: VecLike): number {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)\n\t}\n\n\t/**\n\t * Dot product of two vectors which is used to calculate the angle between them.\n\t */\n\tstatic Dpr(A: VecLike, B: VecLike): number {\n\t\treturn A.x * B.x + A.y * B.y\n\t}\n\n\tstatic Cross(A: VecLike, V: VecLike) {\n\t\treturn new Vec(\n\t\t\tA.y * V.z! - A.z! * V.y,\n\t\t\tA.z! * V.x - A.x * V.z!\n\t\t\t// A.z = A.x * V.y - A.y * V.x\n\t\t)\n\t}\n\n\t/**\n\t * Cross product of two vectors which is used to calculate the area of a parallelogram.\n\t */\n\tstatic Cpr(A: VecLike, B: VecLike) {\n\t\treturn A.x * B.y - B.x * A.y\n\t}\n\n\tstatic Len2(A: VecLike): number {\n\t\treturn A.x * A.x + A.y * A.y\n\t}\n\n\tstatic Len(A: VecLike): number {\n\t\treturn (A.x * A.x + A.y * A.y) ** 0.5\n\t}\n\n\t/**\n\t * Get the projection of A onto B.\n\t */\n\tstatic Pry(A: VecLike, B: VecLike): number {\n\t\treturn Vec.Dpr(A, B) / Vec.Len(B)\n\t}\n\n\t/**\n\t * Get the unit vector of A.\n\t */\n\tstatic Uni(A: VecLike) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec(l === 0 ? 0 : A.x / l, l === 0 ? 0 : A.y / l)\n\t}\n\n\tstatic Tan(A: VecLike, B: VecLike): Vec {\n\t\treturn Vec.Uni(Vec.Sub(A, B))\n\t}\n\n\tstatic Min(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.min(A.x, B.x), Math.min(A.y, B.y))\n\t}\n\n\tstatic Max(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.max(A.x, B.x), Math.max(A.y, B.y))\n\t}\n\n\tstatic From({ x, y, z = 1 }: VecModel) {\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tstatic FromArray(v: number[]): Vec {\n\t\treturn new Vec(v[0], v[1])\n\t}\n\n\tstatic Rot(A: VecLike, r = 0): Vec {\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(A.x * c - A.y * s, A.x * s + A.y * c)\n\t}\n\n\tstatic RotWith(A: VecLike, C: VecLike, r: number): Vec {\n\t\tconst x = A.x - C.x\n\t\tconst y = A.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(C.x + (x * c - y * s), C.y + (x * s + y * c))\n\t}\n\n\t/**\n\t * Get the nearest point on a line with a known unit vector that passes through point A\n\t *\n\t * ```ts\n\t * Vec.nearestPointOnLineThroughPoint(A, u, Point)\n\t * ```\n\t *\n\t * @param A - Any point on the line\n\t * @param u - The unit vector for the line.\n\t * @param P - A point not on the line to test.\n\t */\n\tstatic NearestPointOnLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): Vec {\n\t\treturn Vec.Mul(u, Vec.Sub(P, A).pry(u)).add(A)\n\t}\n\n\tstatic NearestPointOnLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): Vec {\n\t\tif (Vec.Equals(A, P)) return Vec.From(P)\n\t\tif (Vec.Equals(B, P)) return Vec.From(P)\n\n\t\tconst u = Vec.Tan(B, A)\n\t\tconst C = Vec.Add(A, Vec.Mul(u, Vec.Sub(P, A).pry(u)))\n\n\t\tif (clamp) {\n\t\t\tif (C.x < Math.min(A.x, B.x)) return Vec.Cast(A.x < B.x ? A : B)\n\t\t\tif (C.x > Math.max(A.x, B.x)) return Vec.Cast(A.x > B.x ? A : B)\n\t\t\tif (C.y < Math.min(A.y, B.y)) return Vec.Cast(A.y < B.y ? A : B)\n\t\t\tif (C.y > Math.max(A.y, B.y)) return Vec.Cast(A.y > B.y ? A : B)\n\t\t}\n\n\t\treturn C\n\t}\n\n\tstatic DistanceToLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): number {\n\t\treturn Vec.Dist(P, Vec.NearestPointOnLineThroughPoint(A, u, P))\n\t}\n\n\tstatic DistanceToLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): number {\n\t\treturn Vec.Dist(P, Vec.NearestPointOnLineSegment(A, B, P, clamp))\n\t}\n\n\tstatic Snap(A: VecLike, step = 1) {\n\t\treturn new Vec(Math.round(A.x / step) * step, Math.round(A.y / step) * step)\n\t}\n\n\tstatic Cast(A: VecLike): Vec {\n\t\tif (A instanceof Vec) return A\n\t\treturn Vec.From(A)\n\t}\n\n\tstatic Slope(A: VecLike, B: VecLike): number {\n\t\tif (A.x === B.y) return NaN\n\t\treturn (A.y - B.y) / (A.x - B.x)\n\t}\n\n\tstatic IsNaN(A: VecLike): boolean {\n\t\treturn isNaN(A.x) || isNaN(A.y)\n\t}\n\n\t/**\n\t * Get the angle from position A to position B.\n\t */\n\tstatic Angle(A: VecLike, B: VecLike): number {\n\t\treturn Math.atan2(B.y - A.y, B.x - A.x)\n\t}\n\n\t/**\n\t * Get the angle between vector A and vector B. This will return the smallest angle between the\n\t * two vectors, between -\u03C0 and \u03C0. The sign indicates direction of angle.\n\t */\n\tstatic AngleBetween(A: VecLike, B: VecLike): number {\n\t\tconst p = A.x * B.x + A.y * B.y\n\t\tconst n = Math.sqrt(\n\t\t\t(Math.pow(A.x, 2) + Math.pow(A.y, 2)) * (Math.pow(B.x, 2) + Math.pow(B.y, 2))\n\t\t)\n\t\tconst sign = A.x * B.y - A.y * B.x < 0 ? -1 : 1\n\t\tconst angle = sign * Math.acos(clamp(p / n, -1, 1))\n\n\t\treturn angle\n\t}\n\n\t/**\n\t * Linearly interpolate between two points.\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param t - The interpolation value between 0 and 1.\n\t * @returns The interpolated point.\n\t */\n\tstatic Lrp(A: VecLike, B: VecLike, t: number): Vec {\n\t\treturn Vec.Sub(B, A).mul(t).add(A)\n\t}\n\n\tstatic Med(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec((A.x + B.x) / 2, (A.y + B.y) / 2)\n\t}\n\n\tstatic Equals(A: VecLike, B: VecLike): boolean {\n\t\treturn Math.abs(A.x - B.x) < 0.0001 && Math.abs(A.y - B.y) < 0.0001\n\t}\n\n\tstatic EqualsXY(A: VecLike, x: number, y: number): boolean {\n\t\treturn A.x === x && A.y === y\n\t}\n\n\tstatic Clockwise(A: VecLike, B: VecLike, C: VecLike): boolean {\n\t\treturn (C.x - A.x) * (B.y - A.y) - (B.x - A.x) * (C.y - A.y) < 0\n\t}\n\n\tstatic Rescale(A: VecLike, n: number) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec((n * A.x) / l, (n * A.y) / l)\n\t}\n\n\tstatic ScaleWithOrigin(A: VecLike, scale: number, origin: VecLike) {\n\t\treturn Vec.Sub(A, origin).mul(scale).add(origin)\n\t}\n\n\tstatic ToFixed(A: VecLike) {\n\t\treturn new Vec(toFixed(A.x), toFixed(A.y))\n\t}\n\n\tstatic ToInt(A: VecLike) {\n\t\treturn new Vec(\n\t\t\tparseInt(A.x.toFixed(0)),\n\t\t\tparseInt(A.y.toFixed(0)),\n\t\t\tparseInt((A.z ?? 0).toFixed(0))\n\t\t)\n\t}\n\n\tstatic ToCss(A: VecLike) {\n\t\treturn `${A.x},${A.y}`\n\t}\n\n\tstatic Nudge(A: VecLike, B: VecLike, distance: number) {\n\t\treturn Vec.Add(A, Vec.Tan(B, A).mul(distance))\n\t}\n\n\tstatic ToString(A: VecLike) {\n\t\treturn `${A.x}, ${A.y}`\n\t}\n\n\tstatic ToAngle(A: VecLike) {\n\t\tlet r = Math.atan2(A.y, A.x)\n\t\tif (r < 0) r += Math.PI * 2\n\n\t\treturn r\n\t}\n\n\tstatic FromAngle(r: number, length = 1) {\n\t\treturn new Vec(Math.cos(r) * length, Math.sin(r) * length)\n\t}\n\n\tstatic ToArray(A: VecLike) {\n\t\treturn [A.x, A.y, A.z!]\n\t}\n\n\tstatic ToJson(A: VecLike) {\n\t\tconst { x, y, z } = A\n\t\treturn { x, y, z }\n\t}\n\n\tstatic Average(arr: VecLike[]) {\n\t\tconst len = arr.length\n\t\tconst avg = new Vec(0, 0)\n\t\tif (len === 0) {\n\t\t\treturn avg\n\t\t}\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tavg.add(arr[i])\n\t\t}\n\t\treturn avg.div(len)\n\t}\n\n\tstatic Clamp(A: Vec, min: number, max?: number) {\n\t\tif (max === undefined) {\n\t\t\treturn new Vec(Math.min(Math.max(A.x, min)), Math.min(Math.max(A.y, min)))\n\t\t}\n\n\t\treturn new Vec(Math.min(Math.max(A.x, min), max), Math.min(Math.max(A.y, min), max))\n\t}\n\n\t/**\n\t * Get an array of points (with simulated pressure) between two points.\n\t *\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param steps - The number of points to return.\n\t */\n\tstatic PointsBetween(A: VecModel, B: VecModel, steps = 6): Vec[] {\n\t\tconst results: Vec[] = []\n\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst t = EASINGS.easeInQuad(i / (steps - 1))\n\t\t\tconst point = Vec.Lrp(A, B, t)\n\t\t\tpoint.z = Math.min(1, 0.5 + Math.abs(0.5 - ease(t)) * 0.65)\n\t\t\tresults.push(point)\n\t\t}\n\n\t\treturn results\n\t}\n\n\tstatic SnapToGrid(A: VecLike, gridSize = 8) {\n\t\treturn new Vec(Math.round(A.x / gridSize) * gridSize, Math.round(A.y / gridSize) * gridSize)\n\t}\n}\n\nconst ease = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { VecModel } from '@tldraw/tlschema'\nimport { EASINGS } from './easings'\nimport { clamp, toFixed } from './utils'\n\n/** @public */\nexport type VecLike = Vec | VecModel\n\n/** @public */\nexport class Vec {\n\tconstructor(\n\t\tpublic x = 0,\n\t\tpublic y = 0,\n\t\tpublic z = 1\n\t) {}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tget pressure() {\n\t\treturn this.z\n\t}\n\n\tset(x = this.x, y = this.y, z = this.z) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\tsetTo({ x = 0, y = 0, z = 1 }: VecLike) {\n\t\tthis.x = x\n\t\tthis.y = y\n\t\tthis.z = z\n\t\treturn this\n\t}\n\n\trot(r: number) {\n\t\tif (r === 0) return this\n\t\tconst { x, y } = this\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = x * c - y * s\n\t\tthis.y = x * s + y * c\n\t\treturn this\n\t}\n\n\trotWith(C: VecLike, r: number) {\n\t\tif (r === 0) return this\n\t\tconst x = this.x - C.x\n\t\tconst y = this.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\tthis.x = C.x + (x * c - y * s)\n\t\tthis.y = C.y + (x * s + y * c)\n\t\treturn this\n\t}\n\n\tclone(): Vec {\n\t\tconst { x, y, z } = this\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tsub(V: VecLike) {\n\t\tthis.x -= V.x\n\t\tthis.y -= V.y\n\t\treturn this\n\t}\n\n\tsubXY(x: number, y: number) {\n\t\tthis.x -= x\n\t\tthis.y -= y\n\t\treturn this\n\t}\n\n\tsubScalar(n: number) {\n\t\tthis.x -= n\n\t\tthis.y -= n\n\t\t// this.z -= n\n\n\t\treturn this\n\t}\n\n\tadd(V: VecLike) {\n\t\tthis.x += V.x\n\t\tthis.y += V.y\n\t\treturn this\n\t}\n\n\taddXY(x: number, y: number) {\n\t\tthis.x += x\n\t\tthis.y += y\n\t\treturn this\n\t}\n\n\taddScalar(n: number) {\n\t\tthis.x += n\n\t\tthis.y += n\n\t\t// this.z += n\n\n\t\treturn this\n\t}\n\n\tclamp(min: number, max?: number) {\n\t\tthis.x = Math.max(this.x, min)\n\t\tthis.y = Math.max(this.y, min)\n\t\tif (max !== undefined) {\n\t\t\tthis.x = Math.min(this.x, max)\n\t\t\tthis.y = Math.min(this.y, max)\n\t\t}\n\t\treturn this\n\t}\n\n\tdiv(t: number) {\n\t\tthis.x /= t\n\t\tthis.y /= t\n\t\t// this.z /= t\n\t\treturn this\n\t}\n\n\tdivV(V: VecLike) {\n\t\tthis.x /= V.x\n\t\tthis.y /= V.y\n\t\t// this.z /= V.z\n\t\treturn this\n\t}\n\n\tmul(t: number) {\n\t\tthis.x *= t\n\t\tthis.y *= t\n\t\t// this.z *= t\n\t\treturn this\n\t}\n\n\tmulV(V: VecLike) {\n\t\tthis.x *= V.x\n\t\tthis.y *= V.y\n\t\t// this.z *= V.z\n\t\treturn this\n\t}\n\n\tabs() {\n\t\tthis.x = Math.abs(this.x)\n\t\tthis.y = Math.abs(this.y)\n\t\treturn this\n\t}\n\n\tnudge(B: VecLike, distance: number) {\n\t\tconst tan = Vec.Tan(B, this)\n\t\treturn this.add(tan.mul(distance))\n\t}\n\n\tneg() {\n\t\tthis.x *= -1\n\t\tthis.y *= -1\n\t\t// this.z *= -1\n\t\treturn this\n\t}\n\n\tcross(V: VecLike) {\n\t\tthis.x = this.y * V.z! - this.z * V.y\n\t\tthis.y = this.z * V.x - this.x * V.z!\n\t\t// this.z = this.x * V.y - this.y * V.x\n\t\treturn this\n\t}\n\n\tdpr(V: VecLike): number {\n\t\treturn Vec.Dpr(this, V)\n\t}\n\n\tcpr(V: VecLike) {\n\t\treturn Vec.Cpr(this, V)\n\t}\n\n\tlen2(): number {\n\t\treturn Vec.Len2(this)\n\t}\n\n\tlen(): number {\n\t\treturn Vec.Len(this)\n\t}\n\n\tpry(V: VecLike): number {\n\t\treturn Vec.Pry(this, V)\n\t}\n\n\tper() {\n\t\tconst { x, y } = this\n\t\tthis.x = y\n\t\tthis.y = -x\n\t\treturn this\n\t}\n\n\tuni() {\n\t\tconst l = this.len()\n\t\tif (l === 0) return this\n\t\tthis.x /= l\n\t\tthis.y /= l\n\t\treturn this\n\t}\n\n\ttan(V: VecLike): Vec {\n\t\treturn this.sub(V).uni()\n\t}\n\n\tdist(V: VecLike): number {\n\t\treturn Vec.Dist(this, V)\n\t}\n\n\tdistanceToLineSegment(A: VecLike, B: VecLike): number {\n\t\treturn Vec.DistanceToLineSegment(A, B, this)\n\t}\n\n\tslope(B: VecLike): number {\n\t\treturn Vec.Slope(this, B)\n\t}\n\n\tsnapToGrid(gridSize: number) {\n\t\tthis.x = Math.round(this.x / gridSize) * gridSize\n\t\tthis.y = Math.round(this.y / gridSize) * gridSize\n\t\treturn this\n\t}\n\n\tangle(B: VecLike): number {\n\t\treturn Vec.Angle(this, B)\n\t}\n\n\ttoAngle() {\n\t\treturn Vec.ToAngle(this)\n\t}\n\n\tlrp(B: VecLike, t: number): Vec {\n\t\tthis.x = this.x + (B.x - this.x) * t\n\t\tthis.y = this.y + (B.y - this.y) * t\n\t\treturn this\n\t}\n\n\tequals(B: VecLike) {\n\t\treturn Vec.Equals(this, B)\n\t}\n\n\tequalsXY(x: number, y: number) {\n\t\treturn Vec.EqualsXY(this, x, y)\n\t}\n\n\ttoFixed() {\n\t\tthis.x = toFixed(this.x)\n\t\tthis.y = toFixed(this.y)\n\t\treturn this\n\t}\n\n\ttoString() {\n\t\treturn Vec.ToString(Vec.ToFixed(this))\n\t}\n\n\ttoJson(): VecModel {\n\t\treturn Vec.ToJson(this)\n\t}\n\n\ttoArray(): number[] {\n\t\treturn Vec.ToArray(this)\n\t}\n\n\tstatic Add(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x + B.x, A.y + B.y)\n\t}\n\n\tstatic AddXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x + x, A.y + y)\n\t}\n\n\tstatic Sub(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x - B.x, A.y - B.y)\n\t}\n\n\tstatic SubXY(A: VecLike, x: number, y: number): Vec {\n\t\treturn new Vec(A.x - x, A.y - y)\n\t}\n\n\tstatic AddScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x + n, A.y + n)\n\t}\n\n\tstatic SubScalar(A: VecLike, n: number): Vec {\n\t\treturn new Vec(A.x - n, A.y - n)\n\t}\n\n\tstatic Div(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x / t, A.y / t)\n\t}\n\n\tstatic Mul(A: VecLike, t: number): Vec {\n\t\treturn new Vec(A.x * t, A.y * t)\n\t}\n\n\tstatic DivV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x / B.x, A.y / B.y)\n\t}\n\n\tstatic MulV(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(A.x * B.x, A.y * B.y)\n\t}\n\n\tstatic Neg(A: VecLike): Vec {\n\t\treturn new Vec(-A.x, -A.y)\n\t}\n\n\t/**\n\t * Get the perpendicular vector to A.\n\t */\n\tstatic Per(A: VecLike): Vec {\n\t\treturn new Vec(A.y, -A.x)\n\t}\n\n\tstatic Abs(A: VecLike): Vec {\n\t\treturn new Vec(Math.abs(A.x), Math.abs(A.y))\n\t}\n\n\t// Get the distance between two points.\n\tstatic Dist(A: VecLike, B: VecLike): number {\n\t\treturn ((A.y - B.y) ** 2 + (A.x - B.x) ** 2) ** 0.5\n\t}\n\n\t// Get the Manhattan distance between two points.\n\tstatic ManhattanDist(A: VecLike, B: VecLike): number {\n\t\treturn Math.abs(A.x - B.x) + Math.abs(A.y - B.y)\n\t}\n\n\t// Get whether a distance between two points is less than a number. This is faster to calulate than using `Vec.Dist(a, b) < n`.\n\tstatic DistMin(A: VecLike, B: VecLike, n: number): boolean {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) < n ** 2\n\t}\n\n\t// Get the squared distance between two points. This is faster to calculate (no square root) so useful for \"minimum distance\" checks where the actual measurement does not matter.\n\tstatic Dist2(A: VecLike, B: VecLike): number {\n\t\treturn (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)\n\t}\n\n\t/**\n\t * Dot product of two vectors which is used to calculate the angle between them.\n\t */\n\tstatic Dpr(A: VecLike, B: VecLike): number {\n\t\treturn A.x * B.x + A.y * B.y\n\t}\n\n\tstatic Cross(A: VecLike, V: VecLike) {\n\t\treturn new Vec(\n\t\t\tA.y * V.z! - A.z! * V.y,\n\t\t\tA.z! * V.x - A.x * V.z!\n\t\t\t// A.z = A.x * V.y - A.y * V.x\n\t\t)\n\t}\n\n\t/**\n\t * Cross product of two vectors which is used to calculate the area of a parallelogram.\n\t */\n\tstatic Cpr(A: VecLike, B: VecLike) {\n\t\treturn A.x * B.y - B.x * A.y\n\t}\n\n\tstatic Len2(A: VecLike): number {\n\t\treturn A.x * A.x + A.y * A.y\n\t}\n\n\tstatic Len(A: VecLike): number {\n\t\treturn (A.x * A.x + A.y * A.y) ** 0.5\n\t}\n\n\t/**\n\t * Get the projection of A onto B.\n\t */\n\tstatic Pry(A: VecLike, B: VecLike): number {\n\t\treturn Vec.Dpr(A, B) / Vec.Len(B)\n\t}\n\n\t/**\n\t * Get the unit vector of A.\n\t */\n\tstatic Uni(A: VecLike) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec(l === 0 ? 0 : A.x / l, l === 0 ? 0 : A.y / l)\n\t}\n\n\tstatic Tan(A: VecLike, B: VecLike): Vec {\n\t\treturn Vec.Uni(Vec.Sub(A, B))\n\t}\n\n\tstatic Min(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.min(A.x, B.x), Math.min(A.y, B.y))\n\t}\n\n\tstatic Max(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec(Math.max(A.x, B.x), Math.max(A.y, B.y))\n\t}\n\n\tstatic From({ x, y, z = 1 }: VecModel) {\n\t\treturn new Vec(x, y, z)\n\t}\n\n\tstatic FromArray(v: number[]): Vec {\n\t\treturn new Vec(v[0], v[1])\n\t}\n\n\tstatic Rot(A: VecLike, r = 0): Vec {\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(A.x * c - A.y * s, A.x * s + A.y * c)\n\t}\n\n\tstatic RotWith(A: VecLike, C: VecLike, r: number): Vec {\n\t\tconst x = A.x - C.x\n\t\tconst y = A.y - C.y\n\t\tconst s = Math.sin(r)\n\t\tconst c = Math.cos(r)\n\t\treturn new Vec(C.x + (x * c - y * s), C.y + (x * s + y * c))\n\t}\n\n\t/**\n\t * Get the nearest point on a line with a known unit vector that passes through point A\n\t *\n\t * ```ts\n\t * Vec.nearestPointOnLineThroughPoint(A, u, Point)\n\t * ```\n\t *\n\t * @param A - Any point on the line\n\t * @param u - The unit vector for the line.\n\t * @param P - A point not on the line to test.\n\t */\n\tstatic NearestPointOnLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): Vec {\n\t\treturn Vec.Mul(u, Vec.Sub(P, A).pry(u)).add(A)\n\t}\n\n\tstatic NearestPointOnLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): Vec {\n\t\tif (Vec.Equals(A, P)) return Vec.From(P)\n\t\tif (Vec.Equals(B, P)) return Vec.From(P)\n\n\t\tconst u = Vec.Tan(B, A)\n\t\tconst C = Vec.Add(A, Vec.Mul(u, Vec.Sub(P, A).pry(u)))\n\n\t\tif (clamp) {\n\t\t\tif (C.x < Math.min(A.x, B.x)) return Vec.Cast(A.x < B.x ? A : B)\n\t\t\tif (C.x > Math.max(A.x, B.x)) return Vec.Cast(A.x > B.x ? A : B)\n\t\t\tif (C.y < Math.min(A.y, B.y)) return Vec.Cast(A.y < B.y ? A : B)\n\t\t\tif (C.y > Math.max(A.y, B.y)) return Vec.Cast(A.y > B.y ? A : B)\n\t\t}\n\n\t\treturn C\n\t}\n\n\tstatic DistanceToLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): number {\n\t\treturn Vec.Dist(P, Vec.NearestPointOnLineThroughPoint(A, u, P))\n\t}\n\n\tstatic DistanceToLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): number {\n\t\treturn Vec.Dist(P, Vec.NearestPointOnLineSegment(A, B, P, clamp))\n\t}\n\n\tstatic Snap(A: VecLike, step = 1) {\n\t\treturn new Vec(Math.round(A.x / step) * step, Math.round(A.y / step) * step)\n\t}\n\n\tstatic Cast(A: VecLike): Vec {\n\t\tif (A instanceof Vec) return A\n\t\treturn Vec.From(A)\n\t}\n\n\tstatic Slope(A: VecLike, B: VecLike): number {\n\t\tif (A.x === B.y) return NaN\n\t\treturn (A.y - B.y) / (A.x - B.x)\n\t}\n\n\tstatic IsNaN(A: VecLike): boolean {\n\t\treturn isNaN(A.x) || isNaN(A.y)\n\t}\n\n\t/**\n\t * Get the angle from position A to position B.\n\t */\n\tstatic Angle(A: VecLike, B: VecLike): number {\n\t\treturn Math.atan2(B.y - A.y, B.x - A.x)\n\t}\n\n\t/**\n\t * Get the angle between vector A and vector B. This will return the smallest angle between the\n\t * two vectors, between -\u03C0 and \u03C0. The sign indicates direction of angle.\n\t */\n\tstatic AngleBetween(A: VecLike, B: VecLike): number {\n\t\tconst p = A.x * B.x + A.y * B.y\n\t\tconst n = Math.sqrt(\n\t\t\t(Math.pow(A.x, 2) + Math.pow(A.y, 2)) * (Math.pow(B.x, 2) + Math.pow(B.y, 2))\n\t\t)\n\t\tconst sign = A.x * B.y - A.y * B.x < 0 ? -1 : 1\n\t\tconst angle = sign * Math.acos(clamp(p / n, -1, 1))\n\n\t\treturn angle\n\t}\n\n\t/**\n\t * Linearly interpolate between two points.\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param t - The interpolation value between 0 and 1.\n\t * @returns The interpolated point.\n\t */\n\tstatic Lrp(A: VecLike, B: VecLike, t: number): Vec {\n\t\treturn Vec.Sub(B, A).mul(t).add(A)\n\t}\n\n\tstatic Med(A: VecLike, B: VecLike): Vec {\n\t\treturn new Vec((A.x + B.x) / 2, (A.y + B.y) / 2)\n\t}\n\n\tstatic Equals(A: VecLike, B: VecLike): boolean {\n\t\treturn Math.abs(A.x - B.x) < 0.0001 && Math.abs(A.y - B.y) < 0.0001\n\t}\n\n\tstatic EqualsXY(A: VecLike, x: number, y: number): boolean {\n\t\treturn A.x === x && A.y === y\n\t}\n\n\tstatic Clockwise(A: VecLike, B: VecLike, C: VecLike): boolean {\n\t\treturn (C.x - A.x) * (B.y - A.y) - (B.x - A.x) * (C.y - A.y) < 0\n\t}\n\n\tstatic Rescale(A: VecLike, n: number) {\n\t\tconst l = Vec.Len(A)\n\t\treturn new Vec((n * A.x) / l, (n * A.y) / l)\n\t}\n\n\tstatic ScaleWithOrigin(A: VecLike, scale: number, origin: VecLike) {\n\t\treturn Vec.Sub(A, origin).mul(scale).add(origin)\n\t}\n\n\tstatic ToFixed(A: VecLike) {\n\t\treturn new Vec(toFixed(A.x), toFixed(A.y))\n\t}\n\n\tstatic ToInt(A: VecLike) {\n\t\treturn new Vec(\n\t\t\tparseInt(A.x.toFixed(0)),\n\t\t\tparseInt(A.y.toFixed(0)),\n\t\t\tparseInt((A.z ?? 0).toFixed(0))\n\t\t)\n\t}\n\n\tstatic ToCss(A: VecLike) {\n\t\treturn `${A.x},${A.y}`\n\t}\n\n\tstatic Nudge(A: VecLike, B: VecLike, distance: number) {\n\t\treturn Vec.Add(A, Vec.Tan(B, A).mul(distance))\n\t}\n\n\tstatic ToString(A: VecLike) {\n\t\treturn `${A.x}, ${A.y}`\n\t}\n\n\tstatic ToAngle(A: VecLike) {\n\t\tlet r = Math.atan2(A.y, A.x)\n\t\tif (r < 0) r += Math.PI * 2\n\n\t\treturn r\n\t}\n\n\tstatic FromAngle(r: number, length = 1) {\n\t\treturn new Vec(Math.cos(r) * length, Math.sin(r) * length)\n\t}\n\n\tstatic ToArray(A: VecLike) {\n\t\treturn [A.x, A.y, A.z!]\n\t}\n\n\tstatic ToJson(A: VecLike) {\n\t\tconst { x, y, z } = A\n\t\treturn { x, y, z }\n\t}\n\n\tstatic Average(arr: VecLike[]) {\n\t\tconst len = arr.length\n\t\tconst avg = new Vec(0, 0)\n\t\tif (len === 0) {\n\t\t\treturn avg\n\t\t}\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tavg.add(arr[i])\n\t\t}\n\t\treturn avg.div(len)\n\t}\n\n\tstatic Clamp(A: Vec, min: number, max?: number) {\n\t\tif (max === undefined) {\n\t\t\treturn new Vec(Math.min(Math.max(A.x, min)), Math.min(Math.max(A.y, min)))\n\t\t}\n\n\t\treturn new Vec(Math.min(Math.max(A.x, min), max), Math.min(Math.max(A.y, min), max))\n\t}\n\n\t/**\n\t * Get an array of points (with simulated pressure) between two points.\n\t *\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param steps - The number of points to return.\n\t */\n\tstatic PointsBetween(A: VecModel, B: VecModel, steps = 6): Vec[] {\n\t\tconst results: Vec[] = []\n\n\t\tfor (let i = 0; i < steps; i++) {\n\t\t\tconst t = EASINGS.easeInQuad(i / (steps - 1))\n\t\t\tconst point = Vec.Lrp(A, B, t)\n\t\t\tpoint.z = Math.min(1, 0.5 + Math.abs(0.5 - ease(t)) * 0.65)\n\t\t\tresults.push(point)\n\t\t}\n\n\t\treturn results\n\t}\n\n\tstatic SnapToGrid(A: VecLike, gridSize = 8) {\n\t\treturn new Vec(Math.round(A.x / gridSize) * gridSize, Math.round(A.y / gridSize) * gridSize)\n\t}\n}\n\nconst ease = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t)\n"],
5
+ "mappings": "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",
6
6
  "names": ["clamp"]
7
7
  }