@tldraw/tlschema 4.1.0-next.1b89b40eff1c → 4.1.0-next.2c81540f049b

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 (212) hide show
  1. package/dist-cjs/TLStore.js +3 -10
  2. package/dist-cjs/TLStore.js.map +2 -2
  3. package/dist-cjs/assets/TLBaseAsset.js.map +2 -2
  4. package/dist-cjs/assets/TLBookmarkAsset.js.map +2 -2
  5. package/dist-cjs/assets/TLImageAsset.js.map +2 -2
  6. package/dist-cjs/assets/TLVideoAsset.js.map +2 -2
  7. package/dist-cjs/bindings/TLArrowBinding.js.map +2 -2
  8. package/dist-cjs/bindings/TLBaseBinding.js.map +2 -2
  9. package/dist-cjs/createPresenceStateDerivation.js.map +2 -2
  10. package/dist-cjs/createTLSchema.js.map +2 -2
  11. package/dist-cjs/index.d.ts +4416 -223
  12. package/dist-cjs/index.js +1 -1
  13. package/dist-cjs/index.js.map +2 -2
  14. package/dist-cjs/misc/TLColor.js.map +2 -2
  15. package/dist-cjs/misc/TLCursor.js.map +2 -2
  16. package/dist-cjs/misc/TLHandle.js.map +2 -2
  17. package/dist-cjs/misc/TLOpacity.js.map +2 -2
  18. package/dist-cjs/misc/TLRichText.js.map +2 -2
  19. package/dist-cjs/misc/TLScribble.js.map +2 -2
  20. package/dist-cjs/misc/geometry-types.js.map +2 -2
  21. package/dist-cjs/misc/id-validator.js.map +2 -2
  22. package/dist-cjs/records/TLAsset.js.map +2 -2
  23. package/dist-cjs/records/TLBinding.js.map +2 -2
  24. package/dist-cjs/records/TLCamera.js.map +2 -2
  25. package/dist-cjs/records/TLDocument.js.map +2 -2
  26. package/dist-cjs/records/TLInstance.js.map +2 -2
  27. package/dist-cjs/records/TLPage.js.map +2 -2
  28. package/dist-cjs/records/TLPageState.js.map +2 -2
  29. package/dist-cjs/records/TLPointer.js.map +2 -2
  30. package/dist-cjs/records/TLPresence.js.map +2 -2
  31. package/dist-cjs/records/TLRecord.js.map +1 -1
  32. package/dist-cjs/records/TLShape.js.map +2 -2
  33. package/dist-cjs/recordsWithProps.js.map +2 -2
  34. package/dist-cjs/shapes/ShapeWithCrop.js.map +1 -1
  35. package/dist-cjs/shapes/TLArrowShape.js.map +2 -2
  36. package/dist-cjs/shapes/TLBaseShape.js.map +2 -2
  37. package/dist-cjs/shapes/TLBookmarkShape.js.map +2 -2
  38. package/dist-cjs/shapes/TLDrawShape.js.map +2 -2
  39. package/dist-cjs/shapes/TLEmbedShape.js.map +2 -2
  40. package/dist-cjs/shapes/TLFrameShape.js.map +2 -2
  41. package/dist-cjs/shapes/TLGeoShape.js.map +2 -2
  42. package/dist-cjs/shapes/TLGroupShape.js.map +2 -2
  43. package/dist-cjs/shapes/TLHighlightShape.js.map +2 -2
  44. package/dist-cjs/shapes/TLImageShape.js.map +2 -2
  45. package/dist-cjs/shapes/TLLineShape.js.map +2 -2
  46. package/dist-cjs/shapes/TLNoteShape.js.map +2 -2
  47. package/dist-cjs/shapes/TLTextShape.js.map +2 -2
  48. package/dist-cjs/shapes/TLVideoShape.js.map +2 -2
  49. package/dist-cjs/store-migrations.js.map +2 -2
  50. package/dist-cjs/styles/TLColorStyle.js.map +2 -2
  51. package/dist-cjs/styles/TLDashStyle.js.map +2 -2
  52. package/dist-cjs/styles/TLFillStyle.js.map +2 -2
  53. package/dist-cjs/styles/TLFontStyle.js.map +2 -2
  54. package/dist-cjs/styles/TLHorizontalAlignStyle.js.map +2 -2
  55. package/dist-cjs/styles/TLSizeStyle.js.map +2 -2
  56. package/dist-cjs/styles/TLTextAlignStyle.js.map +2 -2
  57. package/dist-cjs/styles/TLVerticalAlignStyle.js.map +2 -2
  58. package/dist-cjs/translations/translations.js +1 -1
  59. package/dist-cjs/translations/translations.js.map +2 -2
  60. package/dist-cjs/util-types.js.map +1 -1
  61. package/dist-esm/TLStore.mjs +3 -10
  62. package/dist-esm/TLStore.mjs.map +2 -2
  63. package/dist-esm/assets/TLBaseAsset.mjs.map +2 -2
  64. package/dist-esm/assets/TLBookmarkAsset.mjs.map +2 -2
  65. package/dist-esm/assets/TLImageAsset.mjs.map +2 -2
  66. package/dist-esm/assets/TLVideoAsset.mjs.map +2 -2
  67. package/dist-esm/bindings/TLArrowBinding.mjs.map +2 -2
  68. package/dist-esm/bindings/TLBaseBinding.mjs.map +2 -2
  69. package/dist-esm/createPresenceStateDerivation.mjs.map +2 -2
  70. package/dist-esm/createTLSchema.mjs.map +2 -2
  71. package/dist-esm/index.d.mts +4416 -223
  72. package/dist-esm/index.mjs +1 -1
  73. package/dist-esm/index.mjs.map +2 -2
  74. package/dist-esm/misc/TLColor.mjs.map +2 -2
  75. package/dist-esm/misc/TLCursor.mjs.map +2 -2
  76. package/dist-esm/misc/TLHandle.mjs.map +2 -2
  77. package/dist-esm/misc/TLOpacity.mjs.map +2 -2
  78. package/dist-esm/misc/TLRichText.mjs.map +2 -2
  79. package/dist-esm/misc/TLScribble.mjs.map +2 -2
  80. package/dist-esm/misc/geometry-types.mjs.map +2 -2
  81. package/dist-esm/misc/id-validator.mjs.map +2 -2
  82. package/dist-esm/records/TLAsset.mjs.map +2 -2
  83. package/dist-esm/records/TLBinding.mjs.map +2 -2
  84. package/dist-esm/records/TLCamera.mjs.map +2 -2
  85. package/dist-esm/records/TLDocument.mjs.map +2 -2
  86. package/dist-esm/records/TLInstance.mjs.map +2 -2
  87. package/dist-esm/records/TLPage.mjs.map +2 -2
  88. package/dist-esm/records/TLPageState.mjs.map +2 -2
  89. package/dist-esm/records/TLPointer.mjs.map +2 -2
  90. package/dist-esm/records/TLPresence.mjs.map +2 -2
  91. package/dist-esm/records/TLShape.mjs.map +2 -2
  92. package/dist-esm/recordsWithProps.mjs.map +2 -2
  93. package/dist-esm/shapes/TLArrowShape.mjs.map +2 -2
  94. package/dist-esm/shapes/TLBaseShape.mjs.map +2 -2
  95. package/dist-esm/shapes/TLBookmarkShape.mjs.map +2 -2
  96. package/dist-esm/shapes/TLDrawShape.mjs.map +2 -2
  97. package/dist-esm/shapes/TLEmbedShape.mjs.map +2 -2
  98. package/dist-esm/shapes/TLFrameShape.mjs.map +2 -2
  99. package/dist-esm/shapes/TLGeoShape.mjs.map +2 -2
  100. package/dist-esm/shapes/TLGroupShape.mjs.map +2 -2
  101. package/dist-esm/shapes/TLHighlightShape.mjs.map +2 -2
  102. package/dist-esm/shapes/TLImageShape.mjs.map +2 -2
  103. package/dist-esm/shapes/TLLineShape.mjs.map +2 -2
  104. package/dist-esm/shapes/TLNoteShape.mjs.map +2 -2
  105. package/dist-esm/shapes/TLTextShape.mjs.map +2 -2
  106. package/dist-esm/shapes/TLVideoShape.mjs.map +2 -2
  107. package/dist-esm/store-migrations.mjs.map +2 -2
  108. package/dist-esm/styles/TLColorStyle.mjs.map +2 -2
  109. package/dist-esm/styles/TLDashStyle.mjs.map +2 -2
  110. package/dist-esm/styles/TLFillStyle.mjs.map +2 -2
  111. package/dist-esm/styles/TLFontStyle.mjs.map +2 -2
  112. package/dist-esm/styles/TLHorizontalAlignStyle.mjs.map +2 -2
  113. package/dist-esm/styles/TLSizeStyle.mjs.map +2 -2
  114. package/dist-esm/styles/TLTextAlignStyle.mjs.map +2 -2
  115. package/dist-esm/styles/TLVerticalAlignStyle.mjs.map +2 -2
  116. package/dist-esm/translations/translations.mjs +1 -1
  117. package/dist-esm/translations/translations.mjs.map +2 -2
  118. package/package.json +5 -5
  119. package/src/TLStore.test.ts +644 -0
  120. package/src/TLStore.ts +205 -20
  121. package/src/assets/TLBaseAsset.ts +90 -7
  122. package/src/assets/TLBookmarkAsset.test.ts +96 -0
  123. package/src/assets/TLBookmarkAsset.ts +52 -2
  124. package/src/assets/TLImageAsset.test.ts +213 -0
  125. package/src/assets/TLImageAsset.ts +60 -2
  126. package/src/assets/TLVideoAsset.test.ts +105 -0
  127. package/src/assets/TLVideoAsset.ts +93 -4
  128. package/src/bindings/TLArrowBinding.test.ts +55 -0
  129. package/src/bindings/TLArrowBinding.ts +132 -10
  130. package/src/bindings/TLBaseBinding.ts +140 -3
  131. package/src/createPresenceStateDerivation.test.ts +158 -0
  132. package/src/createPresenceStateDerivation.ts +71 -2
  133. package/src/createTLSchema.test.ts +181 -0
  134. package/src/createTLSchema.ts +164 -7
  135. package/src/index.ts +32 -0
  136. package/src/misc/TLColor.ts +50 -6
  137. package/src/misc/TLCursor.ts +110 -8
  138. package/src/misc/TLHandle.ts +86 -6
  139. package/src/misc/TLOpacity.ts +51 -2
  140. package/src/misc/TLRichText.ts +56 -3
  141. package/src/misc/TLScribble.ts +105 -5
  142. package/src/misc/geometry-types.ts +30 -2
  143. package/src/misc/id-validator.test.ts +50 -0
  144. package/src/misc/id-validator.ts +20 -1
  145. package/src/records/TLAsset.test.ts +234 -0
  146. package/src/records/TLAsset.ts +165 -8
  147. package/src/records/TLBinding.test.ts +22 -0
  148. package/src/records/TLBinding.ts +277 -11
  149. package/src/records/TLCamera.test.ts +19 -0
  150. package/src/records/TLCamera.ts +118 -7
  151. package/src/records/TLDocument.test.ts +35 -0
  152. package/src/records/TLDocument.ts +148 -8
  153. package/src/records/TLInstance.test.ts +201 -0
  154. package/src/records/TLInstance.ts +117 -9
  155. package/src/records/TLPage.test.ts +110 -0
  156. package/src/records/TLPage.ts +106 -8
  157. package/src/records/TLPageState.test.ts +228 -0
  158. package/src/records/TLPageState.ts +88 -7
  159. package/src/records/TLPointer.test.ts +63 -0
  160. package/src/records/TLPointer.ts +105 -7
  161. package/src/records/TLPresence.test.ts +190 -0
  162. package/src/records/TLPresence.ts +99 -5
  163. package/src/records/TLRecord.test.ts +70 -0
  164. package/src/records/TLRecord.ts +43 -1
  165. package/src/records/TLShape.test.ts +232 -0
  166. package/src/records/TLShape.ts +289 -12
  167. package/src/recordsWithProps.test.ts +188 -0
  168. package/src/recordsWithProps.ts +131 -2
  169. package/src/shapes/ShapeWithCrop.test.ts +18 -0
  170. package/src/shapes/ShapeWithCrop.ts +64 -2
  171. package/src/shapes/TLArrowShape.test.ts +505 -0
  172. package/src/shapes/TLArrowShape.ts +188 -10
  173. package/src/shapes/TLBaseShape.test.ts +142 -0
  174. package/src/shapes/TLBaseShape.ts +103 -4
  175. package/src/shapes/TLBookmarkShape.test.ts +122 -0
  176. package/src/shapes/TLBookmarkShape.ts +58 -4
  177. package/src/shapes/TLDrawShape.test.ts +177 -0
  178. package/src/shapes/TLDrawShape.ts +97 -6
  179. package/src/shapes/TLEmbedShape.test.ts +286 -0
  180. package/src/shapes/TLEmbedShape.ts +57 -4
  181. package/src/shapes/TLFrameShape.test.ts +71 -0
  182. package/src/shapes/TLFrameShape.ts +59 -4
  183. package/src/shapes/TLGeoShape.test.ts +247 -0
  184. package/src/shapes/TLGeoShape.ts +103 -7
  185. package/src/shapes/TLGroupShape.test.ts +59 -0
  186. package/src/shapes/TLGroupShape.ts +52 -4
  187. package/src/shapes/TLHighlightShape.test.ts +325 -0
  188. package/src/shapes/TLHighlightShape.ts +79 -4
  189. package/src/shapes/TLImageShape.test.ts +534 -0
  190. package/src/shapes/TLImageShape.ts +105 -5
  191. package/src/shapes/TLLineShape.test.ts +269 -0
  192. package/src/shapes/TLLineShape.ts +128 -8
  193. package/src/shapes/TLNoteShape.test.ts +1568 -0
  194. package/src/shapes/TLNoteShape.ts +97 -4
  195. package/src/shapes/TLTextShape.test.ts +407 -0
  196. package/src/shapes/TLTextShape.ts +94 -4
  197. package/src/shapes/TLVideoShape.test.ts +112 -0
  198. package/src/shapes/TLVideoShape.ts +99 -4
  199. package/src/store-migrations.test.ts +88 -0
  200. package/src/store-migrations.ts +47 -1
  201. package/src/styles/TLColorStyle.test.ts +439 -0
  202. package/src/styles/TLColorStyle.ts +228 -10
  203. package/src/styles/TLDashStyle.ts +54 -2
  204. package/src/styles/TLFillStyle.ts +54 -2
  205. package/src/styles/TLFontStyle.ts +72 -3
  206. package/src/styles/TLHorizontalAlignStyle.ts +55 -2
  207. package/src/styles/TLSizeStyle.ts +54 -2
  208. package/src/styles/TLTextAlignStyle.ts +52 -2
  209. package/src/styles/TLVerticalAlignStyle.ts +52 -2
  210. package/src/translations/translations.test.ts +378 -35
  211. package/src/translations/translations.ts +157 -10
  212. package/src/util-types.ts +51 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/styles/TLTextAlignStyle.ts"],
4
- "sourcesContent": ["import { T } from '@tldraw/validate'\nimport { StyleProp } from './StyleProp'\n\n/** @public */\nexport const DefaultTextAlignStyle = StyleProp.defineEnum('tldraw:textAlign', {\n\tdefaultValue: 'start',\n\tvalues: ['start', 'middle', 'end'],\n})\n\n/** @public */\nexport type TLDefaultTextAlignStyle = T.TypeOf<typeof DefaultTextAlignStyle>\n"],
5
- "mappings": "AACA,SAAS,iBAAiB;AAGnB,MAAM,wBAAwB,UAAU,WAAW,oBAAoB;AAAA,EAC7E,cAAc;AAAA,EACd,QAAQ,CAAC,SAAS,UAAU,KAAK;AAClC,CAAC;",
4
+ "sourcesContent": ["import { T } from '@tldraw/validate'\nimport { StyleProp } from './StyleProp'\n\n/**\n * Default text alignment style property used by tldraw text shapes.\n * Controls how text content is aligned within text-based shapes like text boxes and notes.\n *\n * Available values:\n * - `start` - Align text to the start (left in LTR, right in RTL)\n * - `middle` - Center text horizontally\n * - `end` - Align text to the end (right in LTR, left in RTL)\n *\n * @example\n * ```ts\n * import { DefaultTextAlignStyle } from '@tldraw/tlschema'\n *\n * // Use in text shape props definition\n * interface MyTextShapeProps {\n * textAlign: typeof DefaultTextAlignStyle\n * // other props...\n * }\n *\n * // Create a text shape with center alignment\n * const textShape = {\n * // ... other properties\n * props: {\n * textAlign: 'middle' as const,\n * // ... other props\n * }\n * }\n * ```\n *\n * @public\n */\nexport const DefaultTextAlignStyle = StyleProp.defineEnum('tldraw:textAlign', {\n\tdefaultValue: 'start',\n\tvalues: ['start', 'middle', 'end'],\n})\n\n/**\n * Type representing a default text alignment style value.\n * This is a union type of all available text alignment options.\n *\n * @example\n * ```ts\n * import { TLDefaultTextAlignStyle } from '@tldraw/tlschema'\n *\n * // Valid text alignment values\n * const leftAlign: TLDefaultTextAlignStyle = 'start'\n * const centerAlign: TLDefaultTextAlignStyle = 'middle'\n * const rightAlign: TLDefaultTextAlignStyle = 'end'\n *\n * // Use in a function parameter\n * function setTextAlignment(align: TLDefaultTextAlignStyle) {\n * // Apply text alignment to text shape\n * }\n * ```\n *\n * @public\n */\nexport type TLDefaultTextAlignStyle = T.TypeOf<typeof DefaultTextAlignStyle>\n"],
5
+ "mappings": "AACA,SAAS,iBAAiB;AAiCnB,MAAM,wBAAwB,UAAU,WAAW,oBAAoB;AAAA,EAC7E,cAAc;AAAA,EACd,QAAQ,CAAC,SAAS,UAAU,KAAK;AAClC,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/styles/TLVerticalAlignStyle.ts"],
4
- "sourcesContent": ["import { T } from '@tldraw/validate'\nimport { StyleProp } from './StyleProp'\n\n/** @public */\nexport const DefaultVerticalAlignStyle = StyleProp.defineEnum('tldraw:verticalAlign', {\n\tdefaultValue: 'middle',\n\tvalues: ['start', 'middle', 'end'],\n})\n\n/** @public */\nexport type TLDefaultVerticalAlignStyle = T.TypeOf<typeof DefaultVerticalAlignStyle>\n"],
5
- "mappings": "AACA,SAAS,iBAAiB;AAGnB,MAAM,4BAA4B,UAAU,WAAW,wBAAwB;AAAA,EACrF,cAAc;AAAA,EACd,QAAQ,CAAC,SAAS,UAAU,KAAK;AAClC,CAAC;",
4
+ "sourcesContent": ["import { T } from '@tldraw/validate'\nimport { StyleProp } from './StyleProp'\n\n/**\n * Default vertical alignment style property used by tldraw shapes for text positioning.\n * Controls how text content is vertically aligned within shape boundaries.\n *\n * Available values:\n * - `start` - Align text to the top\n * - `middle` - Center text vertically (default)\n * - `end` - Align text to the bottom\n *\n * @example\n * ```ts\n * import { DefaultVerticalAlignStyle } from '@tldraw/tlschema'\n *\n * // Use in shape props definition\n * interface MyShapeProps {\n * verticalAlign: typeof DefaultVerticalAlignStyle\n * // other props...\n * }\n *\n * // Create a shape with top-aligned text\n * const shape = {\n * // ... other properties\n * props: {\n * verticalAlign: 'start' as const,\n * // ... other props\n * }\n * }\n * ```\n *\n * @public\n */\nexport const DefaultVerticalAlignStyle = StyleProp.defineEnum('tldraw:verticalAlign', {\n\tdefaultValue: 'middle',\n\tvalues: ['start', 'middle', 'end'],\n})\n\n/**\n * Type representing a default vertical alignment style value.\n * This is a union type of all available vertical alignment options.\n *\n * @example\n * ```ts\n * import { TLDefaultVerticalAlignStyle } from '@tldraw/tlschema'\n *\n * // Valid vertical alignment values\n * const topAlign: TLDefaultVerticalAlignStyle = 'start'\n * const centerAlign: TLDefaultVerticalAlignStyle = 'middle'\n * const bottomAlign: TLDefaultVerticalAlignStyle = 'end'\n *\n * // Use in a function parameter\n * function setVerticalAlignment(align: TLDefaultVerticalAlignStyle) {\n * // Apply vertical alignment to text\n * }\n * ```\n *\n * @public\n */\nexport type TLDefaultVerticalAlignStyle = T.TypeOf<typeof DefaultVerticalAlignStyle>\n"],
5
+ "mappings": "AACA,SAAS,iBAAiB;AAiCnB,MAAM,4BAA4B,UAAU,WAAW,wBAAwB;AAAA,EACrF,cAAc;AAAA,EACd,QAAQ,CAAC,SAAS,UAAU,KAAK;AAClC,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import { LANGUAGES } from "./languages.mjs";
2
2
  function getDefaultTranslationLocale() {
3
- const locales = typeof window !== "undefined" ? window.navigator.languages ?? ["en"] : ["en"];
3
+ const locales = typeof window !== "undefined" && window.navigator ? window.navigator.languages ?? ["en"] : ["en"];
4
4
  return _getDefaultTranslationLocale(locales);
5
5
  }
6
6
  function _getDefaultTranslationLocale(locales) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/translations/translations.ts"],
4
- "sourcesContent": ["import { LANGUAGES } from './languages'\n\n/** @public */\nexport { LANGUAGES }\n\n/** @public */\nexport type TLLanguage = (typeof LANGUAGES)[number]\n// {\n// \treadonly locale: string\n// \treadonly label: string\n// }\n\n/** @public */\nexport function getDefaultTranslationLocale(): TLLanguage['locale'] {\n\tconst locales = typeof window !== 'undefined' ? (window.navigator.languages ?? ['en']) : ['en']\n\treturn _getDefaultTranslationLocale(locales)\n}\n\n/** @internal */\nexport function _getDefaultTranslationLocale(locales: readonly string[]): TLLanguage['locale'] {\n\tfor (const locale of locales) {\n\t\tconst supportedLocale = getSupportedLocale(locale)\n\t\tif (supportedLocale) {\n\t\t\treturn supportedLocale\n\t\t}\n\t}\n\treturn 'en'\n}\n\n/** @public */\nconst DEFAULT_LOCALE_REGIONS: { [locale: string]: TLLanguage['locale'] } = {\n\tzh: 'zh-cn',\n\tpt: 'pt-br',\n\tko: 'ko-kr',\n\thi: 'hi-in',\n}\n\n/** @public */\nfunction getSupportedLocale(locale: string): TLLanguage['locale'] | null {\n\t// If we have an exact match, return it!\n\t// (e.g. if the user has 'fr' and we have 'fr')\n\t// (or if the user has 'pt-BR' and we have 'pt-br')\n\tconst exactMatch = LANGUAGES.find((t) => t.locale === locale.toLowerCase())\n\tif (exactMatch) {\n\t\treturn exactMatch.locale\n\t}\n\n\t// Otherwise, we need to be more flexible...\n\tconst [language, region] = locale.split(/[-_]/).map((s) => s.toLowerCase())\n\n\t// If the user's language has a region...\n\t// let's try to find non-region-specific locale for them\n\t// (e.g. if they have 'fr-CA' but we only have 'fr')\n\tif (region) {\n\t\tconst languageMatch = LANGUAGES.find((t) => t.locale === language)\n\t\tif (languageMatch) {\n\t\t\treturn languageMatch.locale\n\t\t}\n\t}\n\n\t// If the user's language doesn't have a region...\n\t// let's try to find a region-specific locale for them\n\t// (e.g. if they have 'pt' but we only have 'pt-pt' or 'pt-br')\n\t//\n\t// In this case, we choose the hard-coded default region for that language\n\tif (language in DEFAULT_LOCALE_REGIONS) {\n\t\treturn DEFAULT_LOCALE_REGIONS[language]\n\t}\n\n\t// Oh no! We don't have a translation for this language!\n\t// Let's give up...\n\treturn null\n}\n"],
5
- "mappings": "AAAA,SAAS,iBAAiB;AAanB,SAAS,8BAAoD;AACnE,QAAM,UAAU,OAAO,WAAW,cAAe,OAAO,UAAU,aAAa,CAAC,IAAI,IAAK,CAAC,IAAI;AAC9F,SAAO,6BAA6B,OAAO;AAC5C;AAGO,SAAS,6BAA6B,SAAkD;AAC9F,aAAW,UAAU,SAAS;AAC7B,UAAM,kBAAkB,mBAAmB,MAAM;AACjD,QAAI,iBAAiB;AACpB,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;AAGA,MAAM,yBAAqE;AAAA,EAC1E,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACL;AAGA,SAAS,mBAAmB,QAA6C;AAIxE,QAAM,aAAa,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,YAAY,CAAC;AAC1E,MAAI,YAAY;AACf,WAAO,WAAW;AAAA,EACnB;AAGA,QAAM,CAAC,UAAU,MAAM,IAAI,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAK1E,MAAI,QAAQ;AACX,UAAM,gBAAgB,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ;AACjE,QAAI,eAAe;AAClB,aAAO,cAAc;AAAA,IACtB;AAAA,EACD;AAOA,MAAI,YAAY,wBAAwB;AACvC,WAAO,uBAAuB,QAAQ;AAAA,EACvC;AAIA,SAAO;AACR;",
4
+ "sourcesContent": ["import { LANGUAGES } from './languages'\n\n/** @public */\nexport { LANGUAGES }\n\n/**\n * A language definition object representing a supported localization in tldraw.\n *\n * Derived from the LANGUAGES array, this type represents a single language entry\n * containing a locale identifier and human-readable label. The locale follows\n * BCP 47 standards (e.g., 'en', 'fr', 'zh-CN') and the label is in the native language.\n *\n * @example\n * ```ts\n * import { TLLanguage } from '@tldraw/tlschema'\n *\n * // Using TLLanguage type\n * const currentLanguage: TLLanguage = { locale: 'fr', label: 'Fran\u00E7ais' }\n *\n * // Access locale and label\n * console.log(currentLanguage.locale) // \"fr\"\n * console.log(currentLanguage.label) // \"Fran\u00E7ais\"\n * ```\n *\n * @public\n */\nexport type TLLanguage = (typeof LANGUAGES)[number]\n\n/**\n * Gets the default translation locale based on the user's browser language preferences.\n *\n * This function determines the best matching locale from the user's browser language\n * settings, falling back to English if no suitable match is found. It works in both\n * browser and server-side environments, defaulting to English on the server.\n *\n * The function prioritizes exact matches first, then falls back to language-only\n * matches, and finally uses predefined regional defaults for languages like Chinese,\n * Portuguese, Korean, and Hindi.\n *\n * @returns The locale identifier (e.g., 'en', 'fr', 'zh-cn') that best matches the user's preferences\n *\n * @example\n * ```ts\n * import { getDefaultTranslationLocale } from '@tldraw/tlschema'\n *\n * // Get the user's preferred locale\n * const locale = getDefaultTranslationLocale()\n * console.log(locale) // e.g., \"fr\" or \"en\" or \"zh-cn\"\n *\n * // Use in localization setup\n * const i18n = new I18n({\n * locale,\n * // ... other config\n * })\n * ```\n *\n * @example\n * ```ts\n * // Browser with languages: ['fr-CA', 'en-US']\n * const locale = getDefaultTranslationLocale()\n * console.log(locale) // \"fr\" (if French is supported)\n *\n * // Browser with languages: ['zh']\n * const locale = getDefaultTranslationLocale()\n * console.log(locale) // \"zh-cn\" (default region for Chinese)\n * ```\n *\n * @public\n */\nexport function getDefaultTranslationLocale(): TLLanguage['locale'] {\n\tconst locales =\n\t\ttypeof window !== 'undefined' && window.navigator\n\t\t\t? (window.navigator.languages ?? ['en'])\n\t\t\t: ['en']\n\treturn _getDefaultTranslationLocale(locales)\n}\n\n/**\n * Internal function that determines the default translation locale from a list of locale preferences.\n *\n * This function is the core logic for locale resolution, separated from browser-specific code\n * for easier testing and reuse. It iterates through the provided locales in priority order\n * and returns the first supported locale found, or 'en' as the ultimate fallback.\n *\n * @param locales - Array of locale identifiers in preference order (e.g., from navigator.languages)\n * @returns The best matching supported locale identifier\n *\n * @example\n * ```ts\n *\n * // Test locale resolution\n * const locale = _getDefaultTranslationLocale(['fr-CA', 'en-US', 'es'])\n * console.log(locale) // \"fr\" (if French is supported)\n *\n * // No supported locales\n * const fallback = _getDefaultTranslationLocale(['xx-YY', 'zz-AA'])\n * console.log(fallback) // \"en\"\n * ```\n *\n * @internal\n */\nexport function _getDefaultTranslationLocale(locales: readonly string[]): TLLanguage['locale'] {\n\tfor (const locale of locales) {\n\t\tconst supportedLocale = getSupportedLocale(locale)\n\t\tif (supportedLocale) {\n\t\t\treturn supportedLocale\n\t\t}\n\t}\n\treturn 'en'\n}\n\n/**\n * Default regional variants for languages that have multiple regional versions.\n *\n * When a user's locale contains only a language code (e.g., 'zh', 'pt') but tldraw\n * only supports region-specific variants, this mapping determines which regional\n * variant to use as the default. This ensures users get the most appropriate\n * localization even when their preference doesn't specify a region.\n *\n *\n * @example\n * ```ts\n * // User has locale preference \"zh\" but we only support \"zh-cn\" and \"zh-tw\"\n * const defaultRegion = DEFAULT_LOCALE_REGIONS['zh']\n * console.log(defaultRegion) // \"zh-cn\"\n *\n * // User has locale preference \"pt\" but we support \"pt-br\" and \"pt-pt\"\n * const defaultRegion = DEFAULT_LOCALE_REGIONS['pt']\n * console.log(defaultRegion) // \"pt-br\"\n * ```\n *\n * @public\n */\nconst DEFAULT_LOCALE_REGIONS: { [locale: string]: TLLanguage['locale'] } = {\n\tzh: 'zh-cn',\n\tpt: 'pt-br',\n\tko: 'ko-kr',\n\thi: 'hi-in',\n}\n\n/**\n * Finds a supported locale that matches the given locale identifier.\n *\n * This function implements a flexible locale matching algorithm that tries multiple\n * strategies to find the best available translation:\n *\n * 1. **Exact match**: Looks for an exact locale match (case-insensitive)\n * 2. **Language-only match**: If the input has a region, tries matching just the language\n * 3. **Default region**: If the input lacks a region, uses the default region for that language\n * 4. **No match**: Returns null if no suitable locale is found\n *\n * @param locale - The locale identifier to match (e.g., 'fr-CA', 'pt', 'zh-TW')\n * @returns The matching supported locale identifier, or null if no match is found\n *\n * @example\n * ```ts\n * // Exact matches\n * getSupportedLocale('fr') // \"fr\" (if supported)\n * getSupportedLocale('PT-BR') // \"pt-br\" (case insensitive)\n *\n * // Language-only fallback\n * getSupportedLocale('fr-CA') // \"fr\" (if we only support generic French)\n *\n * // Default region assignment\n * getSupportedLocale('zh') // \"zh-cn\" (default Chinese region)\n *\n * // No match\n * getSupportedLocale('xyz') // null\n * ```\n *\n * @example\n * ```ts\n * // Usage in locale resolution\n * const userLocales = ['es-MX', 'en-US']\n * for (const userLocale of userLocales) {\n * const supported = getSupportedLocale(userLocale)\n * if (supported) {\n * console.log(`Using locale: ${supported}`)\n * break\n * }\n * }\n * ```\n *\n * @public\n */\nfunction getSupportedLocale(locale: string): TLLanguage['locale'] | null {\n\t// If we have an exact match, return it!\n\t// (e.g. if the user has 'fr' and we have 'fr')\n\t// (or if the user has 'pt-BR' and we have 'pt-br')\n\tconst exactMatch = LANGUAGES.find((t) => t.locale === locale.toLowerCase())\n\tif (exactMatch) {\n\t\treturn exactMatch.locale\n\t}\n\n\t// Otherwise, we need to be more flexible...\n\tconst [language, region] = locale.split(/[-_]/).map((s) => s.toLowerCase())\n\n\t// If the user's language has a region...\n\t// let's try to find non-region-specific locale for them\n\t// (e.g. if they have 'fr-CA' but we only have 'fr')\n\tif (region) {\n\t\tconst languageMatch = LANGUAGES.find((t) => t.locale === language)\n\t\tif (languageMatch) {\n\t\t\treturn languageMatch.locale\n\t\t}\n\t}\n\n\t// If the user's language doesn't have a region...\n\t// let's try to find a region-specific locale for them\n\t// (e.g. if they have 'pt' but we only have 'pt-pt' or 'pt-br')\n\t//\n\t// In this case, we choose the hard-coded default region for that language\n\tif (language in DEFAULT_LOCALE_REGIONS) {\n\t\treturn DEFAULT_LOCALE_REGIONS[language]\n\t}\n\n\t// Oh no! We don't have a translation for this language!\n\t// Let's give up...\n\treturn null\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAqEnB,SAAS,8BAAoD;AACnE,QAAM,UACL,OAAO,WAAW,eAAe,OAAO,YACpC,OAAO,UAAU,aAAa,CAAC,IAAI,IACpC,CAAC,IAAI;AACT,SAAO,6BAA6B,OAAO;AAC5C;AA0BO,SAAS,6BAA6B,SAAkD;AAC9F,aAAW,UAAU,SAAS;AAC7B,UAAM,kBAAkB,mBAAmB,MAAM;AACjD,QAAI,iBAAiB;AACpB,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;AAwBA,MAAM,yBAAqE;AAAA,EAC1E,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACL;AA+CA,SAAS,mBAAmB,QAA6C;AAIxE,QAAM,aAAa,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,YAAY,CAAC;AAC1E,MAAI,YAAY;AACf,WAAO,WAAW;AAAA,EACnB;AAGA,QAAM,CAAC,UAAU,MAAM,IAAI,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAK1E,MAAI,QAAQ;AACX,UAAM,gBAAgB,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ;AACjE,QAAI,eAAe;AAClB,aAAO,cAAc;AAAA,IACtB;AAAA,EACD;AAOA,MAAI,YAAY,wBAAwB;AACvC,WAAO,uBAAuB,QAAQ;AAAA,EACvC;AAIA,SAAO;AACR;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tldraw/tlschema",
3
3
  "description": "tldraw infinite canvas SDK (schema).",
4
- "version": "4.1.0-next.1b89b40eff1c",
4
+ "version": "4.1.0-next.2c81540f049b",
5
5
  "author": {
6
6
  "name": "tldraw Inc.",
7
7
  "email": "hello@tldraw.com"
@@ -51,10 +51,10 @@
51
51
  "vitest": "^3.2.4"
52
52
  },
53
53
  "dependencies": {
54
- "@tldraw/state": "4.1.0-next.1b89b40eff1c",
55
- "@tldraw/store": "4.1.0-next.1b89b40eff1c",
56
- "@tldraw/utils": "4.1.0-next.1b89b40eff1c",
57
- "@tldraw/validate": "4.1.0-next.1b89b40eff1c"
54
+ "@tldraw/state": "4.1.0-next.2c81540f049b",
55
+ "@tldraw/store": "4.1.0-next.2c81540f049b",
56
+ "@tldraw/utils": "4.1.0-next.2c81540f049b",
57
+ "@tldraw/validate": "4.1.0-next.2c81540f049b"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "react": "^18.2.0 || ^19.0.0",