@excalidraw/excalidraw 0.17.1-d2f67e6 → 0.17.1-e63dd02

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 (252) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/browser/dev/excalidraw-assets-dev/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  3. package/dist/browser/dev/excalidraw-assets-dev/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  4. package/dist/browser/dev/excalidraw-assets-dev/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  5. package/dist/browser/dev/excalidraw-assets-dev/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  6. package/dist/browser/dev/excalidraw-assets-dev/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  7. package/dist/browser/dev/excalidraw-assets-dev/{chunk-EM6LVGFW.js → chunk-IT7T3AIK.js} +23 -5
  8. package/dist/browser/dev/excalidraw-assets-dev/chunk-IT7T3AIK.js.map +7 -0
  9. package/dist/browser/dev/excalidraw-assets-dev/{chunk-B4UMSLQQ.js → chunk-RNHSD5AR.js} +7451 -2098
  10. package/dist/browser/dev/excalidraw-assets-dev/chunk-RNHSD5AR.js.map +7 -0
  11. package/dist/browser/dev/excalidraw-assets-dev/{dist-6QVAH5JA.js → dist-DNSPZDOZ.js} +31 -19
  12. package/dist/browser/dev/excalidraw-assets-dev/dist-DNSPZDOZ.js.map +7 -0
  13. package/dist/browser/dev/excalidraw-assets-dev/{en-AZFA5HJJ.js → en-XV7OZCPP.js} +6 -2
  14. package/dist/browser/dev/excalidraw-assets-dev/{image-V7E6IT6R.js → image-77HZYGLG.js} +2 -2
  15. package/dist/browser/dev/excalidraw-assets-dev/{image-O66MQ7WQ.css → image-WDHYGKKP.css} +1 -1
  16. package/dist/browser/dev/excalidraw-assets-dev/{image-O66MQ7WQ.css.map → image-WDHYGKKP.css.map} +2 -2
  17. package/dist/browser/dev/index.css +449 -114
  18. package/dist/browser/dev/index.css.map +3 -3
  19. package/dist/browser/dev/index.js +4143 -5956
  20. package/dist/browser/dev/index.js.map +4 -4
  21. package/dist/browser/prod/excalidraw-assets/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  22. package/dist/browser/prod/excalidraw-assets/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  23. package/dist/browser/prod/excalidraw-assets/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  24. package/dist/browser/prod/excalidraw-assets/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  25. package/dist/browser/prod/excalidraw-assets/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  26. package/dist/browser/prod/excalidraw-assets/chunk-OYEADJSR.js +63 -0
  27. package/dist/browser/prod/excalidraw-assets/{chunk-7DXALCB2.js → chunk-PDYFZJMS.js} +3 -3
  28. package/dist/browser/prod/excalidraw-assets/dist-NLUQPPQQ.js +7 -0
  29. package/dist/browser/prod/excalidraw-assets/en-YVAVVILW.js +1 -0
  30. package/dist/browser/prod/excalidraw-assets/image-X3GFZHNN.js +1 -0
  31. package/dist/browser/prod/index.css +1 -1
  32. package/dist/browser/prod/index.js +40 -50
  33. package/dist/dev/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  34. package/dist/dev/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  35. package/dist/dev/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  36. package/dist/dev/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  37. package/dist/dev/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  38. package/dist/dev/{en-EB2MBPAV.json → en-YNVBSAIL.json} +18 -4
  39. package/dist/dev/index.css +449 -114
  40. package/dist/dev/index.css.map +3 -3
  41. package/dist/dev/index.js +21626 -18122
  42. package/dist/dev/index.js.map +4 -4
  43. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +9 -3
  44. package/dist/excalidraw/actions/actionBoundText.d.ts +6 -2
  45. package/dist/excalidraw/actions/actionCanvas.d.ts +36 -12
  46. package/dist/excalidraw/actions/actionClipboard.d.ts +22 -7
  47. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +12 -5
  48. package/dist/excalidraw/actions/actionDeleteSelected.js +24 -5
  49. package/dist/excalidraw/actions/actionDuplicateSelection.js +1 -2
  50. package/dist/excalidraw/actions/actionElementLock.d.ts +6 -2
  51. package/dist/excalidraw/actions/actionExport.d.ts +27 -9
  52. package/dist/excalidraw/actions/actionFinalize.d.ts +6 -2
  53. package/dist/excalidraw/actions/actionFinalize.js +2 -2
  54. package/dist/excalidraw/actions/actionFlip.js +2 -2
  55. package/dist/excalidraw/actions/actionFrame.d.ts +12 -4
  56. package/dist/excalidraw/actions/actionGroup.d.ts +6 -2
  57. package/dist/excalidraw/actions/actionHistory.js +4 -4
  58. package/dist/excalidraw/actions/actionLinearEditor.d.ts +3 -1
  59. package/dist/excalidraw/actions/actionLinearEditor.js +3 -2
  60. package/dist/excalidraw/actions/actionLink.d.ts +3 -1
  61. package/dist/excalidraw/actions/actionMenu.d.ts +9 -3
  62. package/dist/excalidraw/actions/actionNavigate.d.ts +6 -2
  63. package/dist/excalidraw/actions/actionProperties.d.ts +411 -56
  64. package/dist/excalidraw/actions/actionProperties.js +383 -58
  65. package/dist/excalidraw/actions/actionSelectAll.d.ts +3 -1
  66. package/dist/excalidraw/actions/actionStyles.d.ts +3 -1
  67. package/dist/excalidraw/actions/actionStyles.js +3 -2
  68. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +3 -1
  69. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +3 -1
  70. package/dist/excalidraw/actions/actionToggleStats.d.ts +3 -1
  71. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +3 -1
  72. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +3 -1
  73. package/dist/excalidraw/actions/types.d.ts +1 -1
  74. package/dist/excalidraw/analytics.js +9 -7
  75. package/dist/excalidraw/appState.d.ts +1 -0
  76. package/dist/excalidraw/appState.js +9 -1
  77. package/dist/excalidraw/binaryheap.d.ts +12 -0
  78. package/dist/excalidraw/binaryheap.js +93 -0
  79. package/dist/excalidraw/change.d.ts +2 -1
  80. package/dist/excalidraw/change.js +6 -4
  81. package/dist/excalidraw/charts.js +0 -10
  82. package/dist/excalidraw/components/Actions.js +7 -5
  83. package/dist/excalidraw/components/App.d.ts +5 -9
  84. package/dist/excalidraw/components/App.js +218 -161
  85. package/dist/excalidraw/components/ButtonIcon.d.ts +15 -0
  86. package/dist/excalidraw/components/ButtonIcon.js +8 -0
  87. package/dist/excalidraw/components/ButtonIconSelect.js +2 -3
  88. package/dist/excalidraw/components/ButtonSeparator.d.ts +2 -0
  89. package/dist/excalidraw/components/ButtonSeparator.js +7 -0
  90. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +47 -79
  91. package/dist/excalidraw/components/ColorPicker/Picker.js +1 -1
  92. package/dist/excalidraw/components/FontPicker/FontPicker.d.ts +21 -0
  93. package/dist/excalidraw/components/FontPicker/FontPicker.js +49 -0
  94. package/dist/excalidraw/components/FontPicker/FontPickerList.d.ts +25 -0
  95. package/dist/excalidraw/components/FontPicker/FontPickerList.js +119 -0
  96. package/dist/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +7 -0
  97. package/dist/excalidraw/components/FontPicker/FontPickerTrigger.js +13 -0
  98. package/dist/excalidraw/components/FontPicker/keyboardNavHandlers.d.ts +14 -0
  99. package/dist/excalidraw/components/FontPicker/keyboardNavHandlers.js +38 -0
  100. package/dist/excalidraw/components/HelpDialog.js +1 -1
  101. package/dist/excalidraw/components/HintViewer.js +6 -3
  102. package/dist/excalidraw/components/PropertiesPopover.d.ts +15 -0
  103. package/dist/excalidraw/components/PropertiesPopover.js +31 -0
  104. package/dist/excalidraw/components/QuickSearch.d.ts +9 -0
  105. package/dist/excalidraw/components/QuickSearch.js +8 -0
  106. package/dist/excalidraw/components/ScrollableList.d.ts +9 -0
  107. package/dist/excalidraw/components/ScrollableList.js +8 -0
  108. package/dist/excalidraw/components/Stats/Angle.d.ts +7 -3
  109. package/dist/excalidraw/components/Stats/Angle.js +39 -31
  110. package/dist/excalidraw/components/Stats/Dimension.d.ts +6 -3
  111. package/dist/excalidraw/components/Stats/Dimension.js +51 -49
  112. package/dist/excalidraw/components/Stats/DragInput.d.ts +15 -6
  113. package/dist/excalidraw/components/Stats/DragInput.js +59 -26
  114. package/dist/excalidraw/components/Stats/FontSize.d.ts +8 -4
  115. package/dist/excalidraw/components/Stats/FontSize.js +39 -36
  116. package/dist/excalidraw/components/Stats/MultiAngle.d.ts +5 -3
  117. package/dist/excalidraw/components/Stats/MultiAngle.js +43 -34
  118. package/dist/excalidraw/components/Stats/MultiDimension.d.ts +5 -3
  119. package/dist/excalidraw/components/Stats/MultiDimension.js +101 -99
  120. package/dist/excalidraw/components/Stats/MultiFontSize.d.ts +6 -3
  121. package/dist/excalidraw/components/Stats/MultiFontSize.js +47 -32
  122. package/dist/excalidraw/components/Stats/MultiPosition.d.ts +3 -1
  123. package/dist/excalidraw/components/Stats/MultiPosition.js +52 -48
  124. package/dist/excalidraw/components/Stats/Position.d.ts +5 -1
  125. package/dist/excalidraw/components/Stats/Position.js +31 -29
  126. package/dist/excalidraw/components/Stats/index.js +5 -17
  127. package/dist/excalidraw/components/Stats/utils.d.ts +14 -3
  128. package/dist/excalidraw/components/Stats/utils.js +48 -9
  129. package/dist/excalidraw/components/TTDDialog/common.d.ts +2 -2
  130. package/dist/excalidraw/components/TTDDialog/common.js +3 -7
  131. package/dist/excalidraw/components/UserList.js +22 -22
  132. package/dist/excalidraw/components/canvases/StaticCanvas.js +1 -0
  133. package/dist/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +12 -3
  134. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.d.ts +24 -4
  135. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +55 -14
  136. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContent.d.ts +2 -1
  137. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContent.js +2 -2
  138. package/dist/excalidraw/components/dropdownMenu/common.d.ts +1 -1
  139. package/dist/excalidraw/components/dropdownMenu/common.js +3 -2
  140. package/dist/excalidraw/components/icons.d.ts +4 -0
  141. package/dist/excalidraw/components/icons.js +7 -0
  142. package/dist/excalidraw/components/main-menu/MainMenu.d.ts +12 -3
  143. package/dist/excalidraw/components/welcome-screen/WelcomeScreen.Center.js +2 -2
  144. package/dist/excalidraw/components/welcome-screen/WelcomeScreen.Hints.js +3 -3
  145. package/dist/excalidraw/constants.d.ts +17 -2
  146. package/dist/excalidraw/constants.js +21 -4
  147. package/dist/excalidraw/data/reconcile.js +18 -1
  148. package/dist/excalidraw/data/restore.js +55 -9
  149. package/dist/excalidraw/data/transform.js +8 -5
  150. package/dist/excalidraw/element/binding.d.ts +28 -9
  151. package/dist/excalidraw/element/binding.js +303 -71
  152. package/dist/excalidraw/element/collision.d.ts +1 -1
  153. package/dist/excalidraw/element/collision.js +4 -1
  154. package/dist/excalidraw/element/dragElements.d.ts +2 -2
  155. package/dist/excalidraw/element/dragElements.js +13 -3
  156. package/dist/excalidraw/element/embeddable.d.ts +3 -1
  157. package/dist/excalidraw/element/heading.d.ts +11 -0
  158. package/dist/excalidraw/element/heading.js +81 -0
  159. package/dist/excalidraw/element/index.d.ts +1 -1
  160. package/dist/excalidraw/element/index.js +1 -1
  161. package/dist/excalidraw/element/linearElementEditor.d.ts +21 -13
  162. package/dist/excalidraw/element/linearElementEditor.js +133 -56
  163. package/dist/excalidraw/element/newElement.d.ts +8 -3
  164. package/dist/excalidraw/element/newElement.js +15 -2
  165. package/dist/excalidraw/element/resizeElements.d.ts +4 -3
  166. package/dist/excalidraw/element/resizeElements.js +47 -23
  167. package/dist/excalidraw/element/routing.d.ts +13 -0
  168. package/dist/excalidraw/element/routing.js +641 -0
  169. package/dist/excalidraw/element/textElement.d.ts +3 -26
  170. package/dist/excalidraw/element/textElement.js +54 -110
  171. package/dist/excalidraw/element/textWysiwyg.js +39 -47
  172. package/dist/excalidraw/element/transformHandles.js +7 -2
  173. package/dist/excalidraw/element/typeChecks.d.ts +5 -2
  174. package/dist/excalidraw/element/typeChecks.js +17 -0
  175. package/dist/excalidraw/element/types.d.ts +12 -1
  176. package/dist/excalidraw/fonts/ExcalidrawFont.d.ts +21 -0
  177. package/dist/excalidraw/fonts/ExcalidrawFont.js +112 -0
  178. package/dist/excalidraw/fonts/index.d.ts +58 -0
  179. package/dist/excalidraw/fonts/index.js +240 -0
  180. package/dist/excalidraw/fonts/metadata.d.ts +36 -0
  181. package/dist/excalidraw/fonts/metadata.js +91 -0
  182. package/dist/excalidraw/fractionalIndex.d.ts +11 -4
  183. package/dist/excalidraw/fractionalIndex.js +38 -6
  184. package/dist/excalidraw/frame.d.ts +1 -1
  185. package/dist/excalidraw/frame.js +3 -3
  186. package/dist/excalidraw/history.d.ts +4 -3
  187. package/dist/excalidraw/history.js +8 -8
  188. package/dist/excalidraw/index.d.ts +1 -1
  189. package/dist/excalidraw/index.js +3 -3
  190. package/dist/excalidraw/locales/en.json +18 -4
  191. package/dist/excalidraw/math.d.ts +43 -0
  192. package/dist/excalidraw/math.js +110 -0
  193. package/dist/excalidraw/mermaid.js +4 -3
  194. package/dist/excalidraw/renderer/interactiveScene.js +33 -17
  195. package/dist/excalidraw/renderer/renderElement.d.ts +2 -0
  196. package/dist/excalidraw/renderer/renderElement.js +74 -54
  197. package/dist/excalidraw/renderer/staticSvgScene.js +2 -1
  198. package/dist/excalidraw/scene/Scene.js +9 -3
  199. package/dist/excalidraw/scene/Shape.js +56 -5
  200. package/dist/excalidraw/scene/comparisons.d.ts +1 -0
  201. package/dist/excalidraw/scene/comparisons.js +1 -1
  202. package/dist/excalidraw/scene/export.d.ts +2 -1
  203. package/dist/excalidraw/scene/export.js +33 -35
  204. package/dist/excalidraw/scene/types.d.ts +1 -4
  205. package/dist/excalidraw/shapes.d.ts +8 -0
  206. package/dist/excalidraw/shapes.js +57 -0
  207. package/dist/excalidraw/types.d.ts +8 -3
  208. package/dist/excalidraw/utils.d.ts +11 -1
  209. package/dist/excalidraw/utils.js +22 -0
  210. package/dist/prod/CascadiaCode-Regular-TMZI7IJ5.woff2 +0 -0
  211. package/dist/prod/ComicShanns-Regular-6TOETDFT.woff2 +0 -0
  212. package/dist/prod/Excalifont-Regular-CPKEUDVM.woff2 +0 -0
  213. package/dist/prod/LiberationSans-Regular-ZQD73GJM.woff2 +0 -0
  214. package/dist/prod/Virgil-Regular-YHAB2VGJ.woff2 +0 -0
  215. package/dist/prod/{en-EB2MBPAV.json → en-YNVBSAIL.json} +18 -4
  216. package/dist/prod/index.css +1 -1
  217. package/dist/prod/index.js +49 -53
  218. package/dist/utils/export.d.ts +2 -1
  219. package/dist/utils/export.js +2 -1
  220. package/dist/utils/geometry/geometry.d.ts +2 -1
  221. package/dist/utils/geometry/geometry.js +5 -1
  222. package/dist/utils/index.d.ts +1 -0
  223. package/dist/utils/index.js +1 -0
  224. package/history.ts +9 -2
  225. package/package.json +2 -2
  226. package/dist/browser/dev/Cascadia-CYPE3OJC.woff2 +0 -0
  227. package/dist/browser/dev/Virgil-UZN6MUT6.woff2 +0 -0
  228. package/dist/browser/dev/excalidraw-assets-dev/chunk-B4UMSLQQ.js.map +0 -7
  229. package/dist/browser/dev/excalidraw-assets-dev/chunk-EM6LVGFW.js.map +0 -7
  230. package/dist/browser/dev/excalidraw-assets-dev/dist-6QVAH5JA.js.map +0 -7
  231. package/dist/browser/prod/Cascadia-CYPE3OJC.woff2 +0 -0
  232. package/dist/browser/prod/Virgil-UZN6MUT6.woff2 +0 -0
  233. package/dist/browser/prod/excalidraw-assets/chunk-EGOLGOLD.js +0 -55
  234. package/dist/browser/prod/excalidraw-assets/dist-567JAXHK.js +0 -7
  235. package/dist/browser/prod/excalidraw-assets/en-6E7MYLWO.js +0 -1
  236. package/dist/browser/prod/excalidraw-assets/image-SI7BKULC.js +0 -1
  237. package/dist/dev/Cascadia-CYPE3OJC.woff2 +0 -0
  238. package/dist/dev/Virgil-UZN6MUT6.woff2 +0 -0
  239. package/dist/excalidraw/scene/Fonts.d.ts +0 -19
  240. package/dist/excalidraw/scene/Fonts.js +0 -66
  241. package/dist/prod/Cascadia-CYPE3OJC.woff2 +0 -0
  242. package/dist/prod/Virgil-UZN6MUT6.woff2 +0 -0
  243. /package/dist/browser/dev/{Assistant-Bold-ZDZZ6JHA.woff2 → excalidraw-assets-dev/Assistant-Bold-ZDZZ6JHA.woff2} +0 -0
  244. /package/dist/browser/dev/{Assistant-Medium-DZ25RZU3.woff2 → excalidraw-assets-dev/Assistant-Medium-DZ25RZU3.woff2} +0 -0
  245. /package/dist/browser/dev/{Assistant-Regular-PLF2XOGW.woff2 → excalidraw-assets-dev/Assistant-Regular-PLF2XOGW.woff2} +0 -0
  246. /package/dist/browser/dev/{Assistant-SemiBold-CZ5MX6FK.woff2 → excalidraw-assets-dev/Assistant-SemiBold-CZ5MX6FK.woff2} +0 -0
  247. /package/dist/browser/dev/excalidraw-assets-dev/{en-AZFA5HJJ.js.map → en-XV7OZCPP.js.map} +0 -0
  248. /package/dist/browser/dev/excalidraw-assets-dev/{image-V7E6IT6R.js.map → image-77HZYGLG.js.map} +0 -0
  249. /package/dist/browser/prod/{Assistant-Bold-ZDZZ6JHA.woff2 → excalidraw-assets/Assistant-Bold-ZDZZ6JHA.woff2} +0 -0
  250. /package/dist/browser/prod/{Assistant-Medium-DZ25RZU3.woff2 → excalidraw-assets/Assistant-Medium-DZ25RZU3.woff2} +0 -0
  251. /package/dist/browser/prod/{Assistant-Regular-PLF2XOGW.woff2 → excalidraw-assets/Assistant-Regular-PLF2XOGW.woff2} +0 -0
  252. /package/dist/browser/prod/{Assistant-SemiBold-CZ5MX6FK.woff2 → excalidraw-assets/Assistant-SemiBold-CZ5MX6FK.woff2} +0 -0
@@ -0,0 +1,21 @@
1
+ export interface Font {
2
+ urls: URL[];
3
+ fontFace: FontFace;
4
+ getContent(): Promise<string>;
5
+ }
6
+ export declare const UNPKG_PROD_URL: string;
7
+ export declare class ExcalidrawFont implements Font {
8
+ readonly urls: URL[];
9
+ readonly fontFace: FontFace;
10
+ constructor(family: string, uri: string, descriptors?: FontFaceDescriptors);
11
+ /**
12
+ * Tries to fetch woff2 content, based on the registered urls.
13
+ * Returns last defined url in case of errors.
14
+ *
15
+ * Note: uses browser APIs for base64 encoding - use dataurl outside the browser environment.
16
+ */
17
+ getContent(): Promise<string>;
18
+ private static createUrls;
19
+ private static getFormat;
20
+ private static normalizeBaseUrl;
21
+ }
@@ -0,0 +1,112 @@
1
+ import { stringToBase64, toByteString } from "../data/encode";
2
+ import { LOCAL_FONT_PROTOCOL } from "./metadata";
3
+ export const UNPKG_PROD_URL = `https://unpkg.com/${import.meta.env.VITE_PKG_NAME
4
+ ? `${import.meta.env.VITE_PKG_NAME}@${import.meta.env.PKG_VERSION}` // should be provided by vite during package build
5
+ : "@excalidraw/excalidraw" // fallback to latest package version (i.e. for app)
6
+ }/dist/prod/`;
7
+ export class ExcalidrawFont {
8
+ urls;
9
+ fontFace;
10
+ constructor(family, uri, descriptors) {
11
+ this.urls = ExcalidrawFont.createUrls(uri);
12
+ const sources = this.urls
13
+ .map((url) => `url(${url}) ${ExcalidrawFont.getFormat(url)}`)
14
+ .join(", ");
15
+ this.fontFace = new FontFace(family, sources, {
16
+ display: "swap",
17
+ style: "normal",
18
+ weight: "400",
19
+ ...descriptors,
20
+ });
21
+ }
22
+ /**
23
+ * Tries to fetch woff2 content, based on the registered urls.
24
+ * Returns last defined url in case of errors.
25
+ *
26
+ * Note: uses browser APIs for base64 encoding - use dataurl outside the browser environment.
27
+ */
28
+ async getContent() {
29
+ let i = 0;
30
+ const errorMessages = [];
31
+ while (i < this.urls.length) {
32
+ const url = this.urls[i];
33
+ if (url.protocol === "data:") {
34
+ // it's dataurl, the font is inlined as base64, no need to fetch
35
+ return url.toString();
36
+ }
37
+ try {
38
+ const response = await fetch(url, {
39
+ headers: {
40
+ Accept: "font/woff2",
41
+ },
42
+ });
43
+ if (response.ok) {
44
+ const mimeType = await response.headers.get("Content-Type");
45
+ const buffer = await response.arrayBuffer();
46
+ return `data:${mimeType};base64,${await stringToBase64(await toByteString(buffer), true)}`;
47
+ }
48
+ // response not ok, try to continue
49
+ errorMessages.push(`"${url.toString()}" returned status "${response.status}"`);
50
+ }
51
+ catch (e) {
52
+ errorMessages.push(`"${url.toString()}" returned error "${e}"`);
53
+ }
54
+ i++;
55
+ }
56
+ console.error(`Failed to fetch font "${this.fontFace.family}" from urls "${this.urls.toString()}`, JSON.stringify(errorMessages, undefined, 2));
57
+ // in case of issues, at least return the last url as a content
58
+ // defaults to unpkg for bundled fonts (so that we don't have to host them forever) and http url for others
59
+ return this.urls.length ? this.urls[this.urls.length - 1].toString() : "";
60
+ }
61
+ static createUrls(uri) {
62
+ if (uri.startsWith(LOCAL_FONT_PROTOCOL)) {
63
+ // no url for local fonts
64
+ return [];
65
+ }
66
+ if (uri.startsWith("http") || uri.startsWith("data")) {
67
+ // one url for http imports or data url
68
+ return [new URL(uri)];
69
+ }
70
+ // absolute assets paths, which are found in tests and excalidraw-app build, won't work with base url, so we are stripping initial slash away
71
+ const assetUrl = uri.replace(/^\/+/, "");
72
+ const urls = [];
73
+ if (typeof window.EXCALIDRAW_ASSET_PATH === "string") {
74
+ const normalizedBaseUrl = this.normalizeBaseUrl(window.EXCALIDRAW_ASSET_PATH);
75
+ urls.push(new URL(assetUrl, normalizedBaseUrl));
76
+ }
77
+ else if (Array.isArray(window.EXCALIDRAW_ASSET_PATH)) {
78
+ window.EXCALIDRAW_ASSET_PATH.forEach((path) => {
79
+ const normalizedBaseUrl = this.normalizeBaseUrl(path);
80
+ urls.push(new URL(assetUrl, normalizedBaseUrl));
81
+ });
82
+ }
83
+ // fallback url for bundled fonts
84
+ urls.push(new URL(assetUrl, UNPKG_PROD_URL));
85
+ return urls;
86
+ }
87
+ static getFormat(url) {
88
+ try {
89
+ const pathname = new URL(url).pathname;
90
+ const parts = pathname.split(".");
91
+ if (parts.length === 1) {
92
+ return "";
93
+ }
94
+ return `format('${parts.pop()}')`;
95
+ }
96
+ catch (error) {
97
+ return "";
98
+ }
99
+ }
100
+ static normalizeBaseUrl(baseUrl) {
101
+ let result = baseUrl;
102
+ // in case user passed a root-relative url (~absolute path),
103
+ // like "/" or "/some/path", or relative (starts with "./"),
104
+ // prepend it with `location.origin`
105
+ if (/^\.?\//.test(result)) {
106
+ result = new URL(result.replace(/^\.?\/+/, ""), window?.location?.origin).toString();
107
+ }
108
+ // ensure there is a trailing slash, otherwise url won't be correctly concatenated
109
+ result = `${result.replace(/\/+$/, "")}/`;
110
+ return result;
111
+ }
112
+ }
@@ -0,0 +1,58 @@
1
+ import type Scene from "../scene/Scene";
2
+ import type { ExcalidrawElement, ExcalidrawTextElement, FontFamilyValues } from "../element/types";
3
+ import { type FontMetadata } from "./metadata";
4
+ import { type Font } from "./ExcalidrawFont";
5
+ export declare class Fonts {
6
+ static readonly loadedFontsCache: Set<string>;
7
+ private static _registered;
8
+ private static _initialized;
9
+ static get registered(): Map<number, {
10
+ metadata: FontMetadata;
11
+ fonts: Font[];
12
+ }>;
13
+ get registered(): Map<number, {
14
+ metadata: FontMetadata;
15
+ fonts: Font[];
16
+ }>;
17
+ private readonly scene;
18
+ constructor({ scene }: {
19
+ scene: Scene;
20
+ });
21
+ /**
22
+ * if we load a (new) font, it's likely that text elements using it have
23
+ * already been rendered using a fallback font. Thus, we want invalidate
24
+ * their shapes and rerender. See #637.
25
+ *
26
+ * Invalidates text elements and rerenders scene, provided that at least one
27
+ * of the supplied fontFaces has not already been processed.
28
+ */
29
+ onLoaded: (fontFaces: readonly FontFace[]) => false | undefined;
30
+ /**
31
+ * Load font faces for a given scene and trigger scene update.
32
+ */
33
+ loadSceneFonts: () => Promise<FontFace[]>;
34
+ /**
35
+ * Gets all the font families for the given scene.
36
+ */
37
+ getSceneFontFamilies: () => number[];
38
+ /**
39
+ * Load font faces for passed elements - use when the scene is unavailable (i.e. export).
40
+ */
41
+ static loadFontsForElements: (elements: readonly ExcalidrawElement[]) => Promise<FontFace[]>;
42
+ private static loadFontFaces;
43
+ /**
44
+ * WARN: should be called just once on init, even across multiple instances.
45
+ */
46
+ private static init;
47
+ private static getFontFamilies;
48
+ }
49
+ /**
50
+ * Calculates vertical offset for a text with alphabetic baseline.
51
+ */
52
+ export declare const getVerticalOffset: (fontFamily: ExcalidrawTextElement["fontFamily"], fontSize: ExcalidrawTextElement["fontSize"], lineHeightPx: number) => number;
53
+ /**
54
+ * Gets line height forr a selected family.
55
+ */
56
+ export declare const getLineHeight: (fontFamily: FontFamilyValues) => number & {
57
+ _brand: "unitlessLineHeight";
58
+ };
@@ -0,0 +1,240 @@
1
+ import { ShapeCache } from "../scene/ShapeCache";
2
+ import { isTextElement } from "../element";
3
+ import { getFontString } from "../utils";
4
+ import { FONT_FAMILY } from "../constants";
5
+ import { LOCAL_FONT_PROTOCOL, FONT_METADATA, RANGES, } from "./metadata";
6
+ import { ExcalidrawFont } from "./ExcalidrawFont";
7
+ import { getContainerElement } from "../element/textElement";
8
+ import Virgil from "./assets/Virgil-Regular.woff2";
9
+ import Excalifont from "./assets/Excalifont-Regular.woff2";
10
+ import Cascadia from "./assets/CascadiaCode-Regular.woff2";
11
+ import ComicShanns from "./assets/ComicShanns-Regular.woff2";
12
+ import LiberationSans from "./assets/LiberationSans-Regular.woff2";
13
+ import LilitaLatin from "https://fonts.gstatic.com/s/lilitaone/v15/i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2";
14
+ import LilitaLatinExt from "https://fonts.gstatic.com/s/lilitaone/v15/i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2";
15
+ import NunitoLatin from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2";
16
+ import NunitoLatinExt from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2";
17
+ import NunitoCyrilic from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2";
18
+ import NunitoCyrilicExt from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2";
19
+ import NunitoVietnamese from "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2";
20
+ export class Fonts {
21
+ // it's ok to track fonts across multiple instances only once, so let's use
22
+ // a static member to reduce memory footprint
23
+ static loadedFontsCache = new Set();
24
+ static _registered;
25
+ static _initialized = false;
26
+ static get registered() {
27
+ // lazy load the font registration
28
+ if (!Fonts._registered) {
29
+ Fonts._registered = Fonts.init();
30
+ }
31
+ else if (!Fonts._initialized) {
32
+ // case when host app register fonts before they are lazy loaded
33
+ // don't override whatever has been previously registered
34
+ Fonts._registered = new Map([
35
+ ...Fonts.init().entries(),
36
+ ...Fonts._registered.entries(),
37
+ ]);
38
+ }
39
+ return Fonts._registered;
40
+ }
41
+ get registered() {
42
+ return Fonts.registered;
43
+ }
44
+ scene;
45
+ constructor({ scene }) {
46
+ this.scene = scene;
47
+ }
48
+ /**
49
+ * if we load a (new) font, it's likely that text elements using it have
50
+ * already been rendered using a fallback font. Thus, we want invalidate
51
+ * their shapes and rerender. See #637.
52
+ *
53
+ * Invalidates text elements and rerenders scene, provided that at least one
54
+ * of the supplied fontFaces has not already been processed.
55
+ */
56
+ onLoaded = (fontFaces) => {
57
+ if (
58
+ // bail if all fonts with have been processed. We're checking just a
59
+ // subset of the font properties (though it should be enough), so it
60
+ // can technically bail on a false positive.
61
+ fontFaces.every((fontFace) => {
62
+ const sig = `${fontFace.family}-${fontFace.style}-${fontFace.weight}-${fontFace.unicodeRange}`;
63
+ if (Fonts.loadedFontsCache.has(sig)) {
64
+ return true;
65
+ }
66
+ Fonts.loadedFontsCache.add(sig);
67
+ return false;
68
+ })) {
69
+ return false;
70
+ }
71
+ let didUpdate = false;
72
+ const elementsMap = this.scene.getNonDeletedElementsMap();
73
+ for (const element of this.scene.getNonDeletedElements()) {
74
+ if (isTextElement(element)) {
75
+ didUpdate = true;
76
+ ShapeCache.delete(element);
77
+ const container = getContainerElement(element, elementsMap);
78
+ if (container) {
79
+ ShapeCache.delete(container);
80
+ }
81
+ }
82
+ }
83
+ if (didUpdate) {
84
+ this.scene.triggerUpdate();
85
+ }
86
+ };
87
+ /**
88
+ * Load font faces for a given scene and trigger scene update.
89
+ */
90
+ loadSceneFonts = async () => {
91
+ const sceneFamilies = this.getSceneFontFamilies();
92
+ const loaded = await Fonts.loadFontFaces(sceneFamilies);
93
+ this.onLoaded(loaded);
94
+ return loaded;
95
+ };
96
+ /**
97
+ * Gets all the font families for the given scene.
98
+ */
99
+ getSceneFontFamilies = () => {
100
+ return Fonts.getFontFamilies(this.scene.getNonDeletedElements());
101
+ };
102
+ /**
103
+ * Load font faces for passed elements - use when the scene is unavailable (i.e. export).
104
+ */
105
+ static loadFontsForElements = async (elements) => {
106
+ const fontFamilies = Fonts.getFontFamilies(elements);
107
+ return await Fonts.loadFontFaces(fontFamilies);
108
+ };
109
+ static async loadFontFaces(fontFamilies) {
110
+ // add all registered font faces into the `document.fonts` (if not added already)
111
+ for (const { fonts, metadata } of Fonts.registered.values()) {
112
+ // skip registering font faces for local fonts (i.e. Helvetica)
113
+ if (metadata.local) {
114
+ continue;
115
+ }
116
+ for (const { fontFace } of fonts) {
117
+ if (!window.document.fonts.has(fontFace)) {
118
+ window.document.fonts.add(fontFace);
119
+ }
120
+ }
121
+ }
122
+ const loadedFontFaces = await Promise.all(fontFamilies.map(async (fontFamily) => {
123
+ const fontString = getFontString({
124
+ fontFamily,
125
+ fontSize: 16,
126
+ });
127
+ // WARN: without "text" param it does not have to mean that all font faces are loaded, instead it could be just one!
128
+ if (!window.document.fonts.check(fontString)) {
129
+ try {
130
+ // WARN: browser prioritizes loading only font faces with unicode ranges for characters which are present in the document (html & canvas), other font faces could stay unloaded
131
+ // we might want to retry here, i.e. in case CDN is down, but so far I didn't experience any issues - maybe it handles retry-like logic under the hood
132
+ return await window.document.fonts.load(fontString);
133
+ }
134
+ catch (e) {
135
+ // don't let it all fail if just one font fails to load
136
+ console.error(`Failed to load font "${fontString}" from urls "${Fonts.registered
137
+ .get(fontFamily)
138
+ ?.fonts.map((x) => x.urls)}"`, e);
139
+ }
140
+ }
141
+ return Promise.resolve();
142
+ }));
143
+ return loadedFontFaces.flat().filter(Boolean);
144
+ }
145
+ /**
146
+ * WARN: should be called just once on init, even across multiple instances.
147
+ */
148
+ static init() {
149
+ const fonts = {
150
+ registered: new Map(),
151
+ };
152
+ // TODO: let's tweak this once we know how `register` will be exposed as part of the custom fonts API
153
+ const _register = register.bind(fonts);
154
+ _register("Virgil", FONT_METADATA[FONT_FAMILY.Virgil], {
155
+ uri: Virgil,
156
+ });
157
+ _register("Excalifont", FONT_METADATA[FONT_FAMILY.Excalifont], {
158
+ uri: Excalifont,
159
+ });
160
+ // keeping for backwards compatibility reasons, uses system font (Helvetica on MacOS, Arial on Win)
161
+ _register("Helvetica", FONT_METADATA[FONT_FAMILY.Helvetica], {
162
+ uri: LOCAL_FONT_PROTOCOL,
163
+ });
164
+ // used for server-side pdf & png export instead of helvetica (technically does not need metrics, but kept in for consistency)
165
+ _register("Liberation Sans", FONT_METADATA[FONT_FAMILY["Liberation Sans"]], {
166
+ uri: LiberationSans,
167
+ });
168
+ _register("Cascadia", FONT_METADATA[FONT_FAMILY.Cascadia], {
169
+ uri: Cascadia,
170
+ });
171
+ _register("Comic Shanns", FONT_METADATA[FONT_FAMILY["Comic Shanns"]], {
172
+ uri: ComicShanns,
173
+ });
174
+ _register("Lilita One", FONT_METADATA[FONT_FAMILY["Lilita One"]], { uri: LilitaLatinExt, descriptors: { unicodeRange: RANGES.LATIN_EXT } }, { uri: LilitaLatin, descriptors: { unicodeRange: RANGES.LATIN } });
175
+ _register("Nunito", FONT_METADATA[FONT_FAMILY.Nunito], {
176
+ uri: NunitoCyrilicExt,
177
+ descriptors: { unicodeRange: RANGES.CYRILIC_EXT, weight: "500" },
178
+ }, {
179
+ uri: NunitoCyrilic,
180
+ descriptors: { unicodeRange: RANGES.CYRILIC, weight: "500" },
181
+ }, {
182
+ uri: NunitoVietnamese,
183
+ descriptors: { unicodeRange: RANGES.VIETNAMESE, weight: "500" },
184
+ }, {
185
+ uri: NunitoLatinExt,
186
+ descriptors: { unicodeRange: RANGES.LATIN_EXT, weight: "500" },
187
+ }, {
188
+ uri: NunitoLatin,
189
+ descriptors: { unicodeRange: RANGES.LATIN, weight: "500" },
190
+ });
191
+ Fonts._initialized = true;
192
+ return fonts.registered;
193
+ }
194
+ static getFontFamilies(elements) {
195
+ return Array.from(elements.reduce((families, element) => {
196
+ if (isTextElement(element)) {
197
+ families.add(element.fontFamily);
198
+ }
199
+ return families;
200
+ }, new Set()));
201
+ }
202
+ }
203
+ /**
204
+ * Register a new font.
205
+ *
206
+ * @param family font family
207
+ * @param metadata font metadata
208
+ * @param params array of the rest of the FontFace parameters [uri: string, descriptors: FontFaceDescriptors?] ,
209
+ */
210
+ function register(family, metadata, ...params) {
211
+ // TODO: likely we will need to abandon number "id" in order to support custom fonts
212
+ const familyId = FONT_FAMILY[family];
213
+ const registeredFamily = this.registered.get(familyId);
214
+ if (!registeredFamily) {
215
+ this.registered.set(familyId, {
216
+ metadata,
217
+ fonts: params.map(({ uri, descriptors }) => new ExcalidrawFont(family, uri, descriptors)),
218
+ });
219
+ }
220
+ return this.registered;
221
+ }
222
+ /**
223
+ * Calculates vertical offset for a text with alphabetic baseline.
224
+ */
225
+ export const getVerticalOffset = (fontFamily, fontSize, lineHeightPx) => {
226
+ const { unitsPerEm, ascender, descender } = Fonts.registered.get(fontFamily)?.metadata.metrics ||
227
+ FONT_METADATA[FONT_FAMILY.Virgil].metrics;
228
+ const fontSizeEm = fontSize / unitsPerEm;
229
+ const lineGap = (lineHeightPx - fontSizeEm * ascender + fontSizeEm * descender) / 2;
230
+ const verticalOffset = fontSizeEm * ascender + lineGap;
231
+ return verticalOffset;
232
+ };
233
+ /**
234
+ * Gets line height forr a selected family.
235
+ */
236
+ export const getLineHeight = (fontFamily) => {
237
+ const { lineHeight } = Fonts.registered.get(fontFamily)?.metadata.metrics ||
238
+ FONT_METADATA[FONT_FAMILY.Excalifont].metrics;
239
+ return lineHeight;
240
+ };
@@ -0,0 +1,36 @@
1
+ /// <reference types="react" />
2
+ /**
3
+ * Encapsulates font metrics with additional font metadata.
4
+ * */
5
+ export interface FontMetadata {
6
+ /** for head & hhea metrics read the woff2 with https://fontdrop.info/ */
7
+ metrics: {
8
+ /** head.unitsPerEm metric */
9
+ unitsPerEm: 1000 | 1024 | 2048;
10
+ /** hhea.ascender metric */
11
+ ascender: number;
12
+ /** hhea.descender metric */
13
+ descender: number;
14
+ /** harcoded unitless line-height, https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971 */
15
+ lineHeight: number;
16
+ };
17
+ /** element to be displayed as an icon */
18
+ icon: JSX.Element;
19
+ /** flag to indicate a deprecated font */
20
+ deprecated?: true;
21
+ /** flag to indicate a server-side only font */
22
+ serverSide?: true;
23
+ /** flag to indiccate a local-only font */
24
+ local?: true;
25
+ }
26
+ export declare const FONT_METADATA: Record<number, FontMetadata>;
27
+ /** Unicode ranges */
28
+ export declare const RANGES: {
29
+ LATIN: string;
30
+ LATIN_EXT: string;
31
+ CYRILIC_EXT: string;
32
+ CYRILIC: string;
33
+ VIETNAMESE: string;
34
+ };
35
+ /** local protocol to skip the local font from registering or inlining */
36
+ export declare const LOCAL_FONT_PROTOCOL = "local:";
@@ -0,0 +1,91 @@
1
+ import { FontFamilyCodeIcon, FontFamilyHeadingIcon, FontFamilyNormalIcon, FreedrawIcon, } from "../components/icons";
2
+ import { FONT_FAMILY } from "../constants";
3
+ export const FONT_METADATA = {
4
+ [FONT_FAMILY.Excalifont]: {
5
+ metrics: {
6
+ unitsPerEm: 1000,
7
+ ascender: 886,
8
+ descender: -374,
9
+ lineHeight: 1.25,
10
+ },
11
+ icon: FreedrawIcon,
12
+ },
13
+ [FONT_FAMILY.Nunito]: {
14
+ metrics: {
15
+ unitsPerEm: 1000,
16
+ ascender: 1011,
17
+ descender: -353,
18
+ lineHeight: 1.35,
19
+ },
20
+ icon: FontFamilyNormalIcon,
21
+ },
22
+ [FONT_FAMILY["Lilita One"]]: {
23
+ metrics: {
24
+ unitsPerEm: 1000,
25
+ ascender: 923,
26
+ descender: -220,
27
+ lineHeight: 1.15,
28
+ },
29
+ icon: FontFamilyHeadingIcon,
30
+ },
31
+ [FONT_FAMILY["Comic Shanns"]]: {
32
+ metrics: {
33
+ unitsPerEm: 1000,
34
+ ascender: 750,
35
+ descender: -250,
36
+ lineHeight: 1.25,
37
+ },
38
+ icon: FontFamilyCodeIcon,
39
+ },
40
+ [FONT_FAMILY.Virgil]: {
41
+ metrics: {
42
+ unitsPerEm: 1000,
43
+ ascender: 886,
44
+ descender: -374,
45
+ lineHeight: 1.25,
46
+ },
47
+ icon: FreedrawIcon,
48
+ deprecated: true,
49
+ },
50
+ [FONT_FAMILY.Helvetica]: {
51
+ metrics: {
52
+ unitsPerEm: 2048,
53
+ ascender: 1577,
54
+ descender: -471,
55
+ lineHeight: 1.15,
56
+ },
57
+ icon: FontFamilyNormalIcon,
58
+ deprecated: true,
59
+ local: true,
60
+ },
61
+ [FONT_FAMILY.Cascadia]: {
62
+ metrics: {
63
+ unitsPerEm: 2048,
64
+ ascender: 1900,
65
+ descender: -480,
66
+ lineHeight: 1.2,
67
+ },
68
+ icon: FontFamilyCodeIcon,
69
+ deprecated: true,
70
+ },
71
+ [FONT_FAMILY["Liberation Sans"]]: {
72
+ metrics: {
73
+ unitsPerEm: 2048,
74
+ ascender: 1854,
75
+ descender: -434,
76
+ lineHeight: 1.15,
77
+ },
78
+ icon: FontFamilyNormalIcon,
79
+ serverSide: true,
80
+ },
81
+ };
82
+ /** Unicode ranges */
83
+ export const RANGES = {
84
+ LATIN: "U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD",
85
+ LATIN_EXT: "U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF",
86
+ CYRILIC_EXT: "U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F",
87
+ CYRILIC: "U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116",
88
+ VIETNAMESE: "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB",
89
+ };
90
+ /** local protocol to skip the local font from registering or inlining */
91
+ export const LOCAL_FONT_PROTOCOL = "local:";
@@ -3,15 +3,15 @@ import type { ExcalidrawElement, OrderedExcalidrawElement } from "./element/type
3
3
  * Envisioned relation between array order and fractional indices:
4
4
  *
5
5
  * 1) Array (or array-like ordered data structure) should be used as a cache of elements order, hiding the internal fractional indices implementation.
6
- * - it's undesirable to to perform reorder for each related operation, thefeore it's necessary to cache the order defined by fractional indices into an ordered data structure
6
+ * - it's undesirable to perform reorder for each related operation, therefore it's necessary to cache the order defined by fractional indices into an ordered data structure
7
7
  * - it's easy enough to define the order of the elements from the outside (boundaries), without worrying about the underlying structure of fractional indices (especially for the host apps)
8
8
  * - it's necessary to always keep the array support for backwards compatibility (restore) - old scenes, old libraries, supporting multiple excalidraw versions etc.
9
9
  * - it's necessary to always keep the fractional indices in sync with the array order
10
10
  * - elements with invalid indices should be detected and synced, without altering the already valid indices
11
11
  *
12
12
  * 2) Fractional indices should be used to reorder the elements, whenever the cached order is expected to be invalidated.
13
- * - as the fractional indices are encoded as part of the elements, it opens up possibilties for incremental-like APIs
14
- * - re-order based on fractional indices should be part of (multiplayer) operations such as reconcillitation & undo/redo
13
+ * - as the fractional indices are encoded as part of the elements, it opens up possibilities for incremental-like APIs
14
+ * - re-order based on fractional indices should be part of (multiplayer) operations such as reconciliation & undo/redo
15
15
  * - technically all the z-index actions could perform also re-order based on fractional indices,but in current state it would not bring much benefits,
16
16
  * as it's faster & more efficient to perform re-order based on array manipulation and later synchronisation of moved indices with the array order
17
17
  */
@@ -20,7 +20,14 @@ import type { ExcalidrawElement, OrderedExcalidrawElement } from "./element/type
20
20
  *
21
21
  * @throws `InvalidFractionalIndexError` if invalid index is detected.
22
22
  */
23
- export declare const validateFractionalIndices: (indices: (ExcalidrawElement["index"] | undefined)[]) => void;
23
+ export declare const validateFractionalIndices: (elements: readonly ExcalidrawElement[], { shouldThrow, includeBoundTextValidation, reconciliationContext, }: {
24
+ shouldThrow: boolean;
25
+ includeBoundTextValidation: boolean;
26
+ reconciliationContext?: {
27
+ localElements: ReadonlyArray<ExcalidrawElement>;
28
+ remoteElements: ReadonlyArray<ExcalidrawElement>;
29
+ } | undefined;
30
+ }) => void;
24
31
  /**
25
32
  * Order the elements based on the fractional indices.
26
33
  * - when fractional indices are identical, break the tie based on the element id