@tldraw/editor 3.9.0-internal.7f0e15f4f7d9 → 3.10.0-canary.d4dfa96478a4

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 (138) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +1 -1
  3. package/dist-cjs/index.d.ts +41 -229
  4. package/dist-cjs/index.js +1 -9
  5. package/dist-cjs/index.js.map +2 -2
  6. package/dist-cjs/lib/TldrawEditor.js +6 -33
  7. package/dist-cjs/lib/TldrawEditor.js.map +2 -2
  8. package/dist-cjs/lib/components/LiveCollaborators.js +5 -0
  9. package/dist-cjs/lib/components/LiveCollaborators.js.map +2 -2
  10. package/dist-cjs/lib/components/Shape.js +0 -7
  11. package/dist-cjs/lib/components/Shape.js.map +2 -2
  12. package/dist-cjs/lib/components/default-components/DefaultBrush.js.map +2 -2
  13. package/dist-cjs/lib/components/default-components/DefaultCollaboratorHint.js.map +2 -2
  14. package/dist-cjs/lib/components/default-components/DefaultCursor.js.map +2 -2
  15. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js +1 -1
  16. package/dist-cjs/lib/components/default-components/DefaultErrorFallback.js.map +2 -2
  17. package/dist-cjs/lib/components/default-components/DefaultScribble.js.map +2 -2
  18. package/dist-cjs/lib/components/default-components/DefaultShapeIndicator.js.map +2 -2
  19. package/dist-cjs/lib/editor/Editor.js +435 -308
  20. package/dist-cjs/lib/editor/Editor.js.map +3 -3
  21. package/dist-cjs/lib/editor/managers/TextManager.js +17 -23
  22. package/dist-cjs/lib/editor/managers/TextManager.js.map +2 -2
  23. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +7 -13
  24. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  25. package/dist-cjs/lib/editor/types/emit-types.js.map +1 -1
  26. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  27. package/dist-cjs/lib/exports/FontEmbedder.js +2 -7
  28. package/dist-cjs/lib/exports/FontEmbedder.js.map +2 -2
  29. package/dist-cjs/lib/exports/StyleEmbedder.js +1 -1
  30. package/dist-cjs/lib/exports/StyleEmbedder.js.map +2 -2
  31. package/dist-cjs/lib/exports/exportToSvg.js +2 -3
  32. package/dist-cjs/lib/exports/exportToSvg.js.map +2 -2
  33. package/dist-cjs/lib/exports/getSvgJsx.js +1 -18
  34. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  35. package/dist-cjs/lib/exports/parseCss.js +0 -1
  36. package/dist-cjs/lib/exports/parseCss.js.map +2 -2
  37. package/dist-cjs/lib/hooks/useCanvasEvents.js +2 -2
  38. package/dist-cjs/lib/hooks/useCanvasEvents.js.map +2 -2
  39. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js +1 -1
  40. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
  41. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
  42. package/dist-cjs/lib/options.js +1 -2
  43. package/dist-cjs/lib/options.js.map +2 -2
  44. package/dist-cjs/lib/utils/dom.js +1 -1
  45. package/dist-cjs/lib/utils/dom.js.map +2 -2
  46. package/dist-cjs/version.js +3 -3
  47. package/dist-cjs/version.js.map +1 -1
  48. package/dist-esm/index.d.mts +41 -229
  49. package/dist-esm/index.mjs +1 -13
  50. package/dist-esm/index.mjs.map +2 -2
  51. package/dist-esm/lib/TldrawEditor.mjs +7 -34
  52. package/dist-esm/lib/TldrawEditor.mjs.map +2 -2
  53. package/dist-esm/lib/components/LiveCollaborators.mjs +5 -0
  54. package/dist-esm/lib/components/LiveCollaborators.mjs.map +2 -2
  55. package/dist-esm/lib/components/Shape.mjs +1 -8
  56. package/dist-esm/lib/components/Shape.mjs.map +2 -2
  57. package/dist-esm/lib/components/default-components/DefaultBrush.mjs.map +2 -2
  58. package/dist-esm/lib/components/default-components/DefaultCollaboratorHint.mjs.map +2 -2
  59. package/dist-esm/lib/components/default-components/DefaultCursor.mjs.map +2 -2
  60. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs +1 -1
  61. package/dist-esm/lib/components/default-components/DefaultErrorFallback.mjs.map +2 -2
  62. package/dist-esm/lib/components/default-components/DefaultScribble.mjs.map +2 -2
  63. package/dist-esm/lib/components/default-components/DefaultShapeIndicator.mjs.map +2 -2
  64. package/dist-esm/lib/editor/Editor.mjs +432 -312
  65. package/dist-esm/lib/editor/Editor.mjs.map +3 -3
  66. package/dist-esm/lib/editor/managers/TextManager.mjs +17 -23
  67. package/dist-esm/lib/editor/managers/TextManager.mjs.map +2 -2
  68. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +7 -13
  69. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  70. package/dist-esm/lib/exports/FontEmbedder.mjs +2 -7
  71. package/dist-esm/lib/exports/FontEmbedder.mjs.map +2 -2
  72. package/dist-esm/lib/exports/StyleEmbedder.mjs +1 -1
  73. package/dist-esm/lib/exports/StyleEmbedder.mjs.map +2 -2
  74. package/dist-esm/lib/exports/exportToSvg.mjs +2 -3
  75. package/dist-esm/lib/exports/exportToSvg.mjs.map +2 -2
  76. package/dist-esm/lib/exports/getSvgJsx.mjs +2 -19
  77. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  78. package/dist-esm/lib/exports/parseCss.mjs +0 -1
  79. package/dist-esm/lib/exports/parseCss.mjs.map +2 -2
  80. package/dist-esm/lib/hooks/useCanvasEvents.mjs +2 -2
  81. package/dist-esm/lib/hooks/useCanvasEvents.mjs.map +2 -2
  82. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs +1 -1
  83. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
  84. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
  85. package/dist-esm/lib/options.mjs +1 -2
  86. package/dist-esm/lib/options.mjs.map +2 -2
  87. package/dist-esm/lib/utils/dom.mjs +1 -1
  88. package/dist-esm/lib/utils/dom.mjs.map +2 -2
  89. package/dist-esm/version.mjs +3 -3
  90. package/dist-esm/version.mjs.map +1 -1
  91. package/editor.css +13 -127
  92. package/package.json +7 -10
  93. package/src/index.ts +2 -15
  94. package/src/lib/TldrawEditor.tsx +4 -52
  95. package/src/lib/components/LiveCollaborators.tsx +5 -0
  96. package/src/lib/components/Shape.tsx +1 -9
  97. package/src/lib/components/default-components/DefaultBrush.tsx +1 -0
  98. package/src/lib/components/default-components/DefaultCollaboratorHint.tsx +1 -0
  99. package/src/lib/components/default-components/DefaultCursor.tsx +1 -0
  100. package/src/lib/components/default-components/DefaultErrorFallback.tsx +5 -3
  101. package/src/lib/components/default-components/DefaultScribble.tsx +1 -0
  102. package/src/lib/components/default-components/DefaultShapeIndicator.tsx +1 -0
  103. package/src/lib/editor/Editor.ts +561 -362
  104. package/src/lib/editor/managers/TextManager.ts +17 -42
  105. package/src/lib/editor/shapes/ShapeUtil.ts +32 -18
  106. package/src/lib/editor/types/emit-types.ts +0 -1
  107. package/src/lib/editor/types/external-content.ts +0 -1
  108. package/src/lib/exports/FontEmbedder.ts +1 -13
  109. package/src/lib/exports/StyleEmbedder.ts +1 -1
  110. package/src/lib/exports/exportToSvg.tsx +3 -4
  111. package/src/lib/exports/getSvgJsx.tsx +3 -22
  112. package/src/lib/exports/parseCss.ts +0 -1
  113. package/src/lib/hooks/useCanvasEvents.ts +1 -2
  114. package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +0 -1
  115. package/src/lib/hooks/usePassThroughWheelEvents.ts +1 -0
  116. package/src/lib/options.ts +0 -7
  117. package/src/lib/utils/dom.ts +1 -1
  118. package/src/version.ts +3 -3
  119. package/dist-cjs/lib/editor/managers/FontManager.js +0 -167
  120. package/dist-cjs/lib/editor/managers/FontManager.js.map +0 -7
  121. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js +0 -48
  122. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +0 -7
  123. package/dist-cjs/lib/hooks/useViewportHeight.js +0 -56
  124. package/dist-cjs/lib/hooks/useViewportHeight.js.map +0 -7
  125. package/dist-cjs/lib/utils/richText.js +0 -46
  126. package/dist-cjs/lib/utils/richText.js.map +0 -7
  127. package/dist-esm/lib/editor/managers/FontManager.mjs +0 -153
  128. package/dist-esm/lib/editor/managers/FontManager.mjs.map +0 -7
  129. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs +0 -28
  130. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +0 -7
  131. package/dist-esm/lib/hooks/useViewportHeight.mjs +0 -36
  132. package/dist-esm/lib/hooks/useViewportHeight.mjs.map +0 -7
  133. package/dist-esm/lib/utils/richText.mjs +0 -26
  134. package/dist-esm/lib/utils/richText.mjs.map +0 -7
  135. package/src/lib/editor/managers/FontManager.ts +0 -252
  136. package/src/lib/hooks/usePassThroughMouseOverEvents.ts +0 -29
  137. package/src/lib/hooks/useViewportHeight.ts +0 -37
  138. package/src/lib/utils/richText.ts +0 -72
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/hooks/usePassThroughMouseOverEvents.ts"],
4
- "sourcesContent": ["import { RefObject, useEffect } from 'react'\nimport { preventDefault } from '../utils/dom'\nimport { useContainer } from './useContainer'\n\n/** @public */\nexport function usePassThroughMouseOverEvents(ref: RefObject<HTMLElement>) {\n\tif (!ref) throw Error('usePassThroughWheelEvents must be passed a ref')\n\tconst container = useContainer()\n\n\tuseEffect(() => {\n\t\tfunction onMouseOver(e: MouseEvent) {\n\t\t\tif ((e as any).isSpecialRedispatchedEvent) return\n\t\t\tpreventDefault(e)\n\t\t\tconst cvs = container.querySelector('.tl-canvas')\n\t\t\tif (!cvs) return\n\t\t\tconst newEvent = new PointerEvent(e.type, e as any)\n\t\t\t;(newEvent as any).isSpecialRedispatchedEvent = true\n\t\t\tcvs.dispatchEvent(newEvent)\n\t\t}\n\n\t\tconst elm = ref.current\n\t\tif (!elm) return\n\n\t\telm.addEventListener('mouseover', onMouseOver, { passive: false })\n\t\treturn () => {\n\t\t\telm.removeEventListener('mouseover', onMouseOver)\n\t\t}\n\t}, [container, ref])\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAqC;AACrC,iBAA+B;AAC/B,0BAA6B;AAGtB,SAAS,8BAA8B,KAA6B;AAC1E,MAAI,CAAC,IAAK,OAAM,MAAM,gDAAgD;AACtE,QAAM,gBAAY,kCAAa;AAE/B,8BAAU,MAAM;AACf,aAAS,YAAY,GAAe;AACnC,UAAK,EAAU,2BAA4B;AAC3C,qCAAe,CAAC;AAChB,YAAM,MAAM,UAAU,cAAc,YAAY;AAChD,UAAI,CAAC,IAAK;AACV,YAAM,WAAW,IAAI,aAAa,EAAE,MAAM,CAAQ;AACjD,MAAC,SAAiB,6BAA6B;AAChD,UAAI,cAAc,QAAQ;AAAA,IAC3B;AAEA,UAAM,MAAM,IAAI;AAChB,QAAI,CAAC,IAAK;AAEV,QAAI,iBAAiB,aAAa,aAAa,EAAE,SAAS,MAAM,CAAC;AACjE,WAAO,MAAM;AACZ,UAAI,oBAAoB,aAAa,WAAW;AAAA,IACjD;AAAA,EACD,GAAG,CAAC,WAAW,GAAG,CAAC;AACpB;",
6
- "names": []
7
- }
@@ -1,56 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var useViewportHeight_exports = {};
20
- __export(useViewportHeight_exports, {
21
- useViewportHeight: () => useViewportHeight
22
- });
23
- module.exports = __toCommonJS(useViewportHeight_exports);
24
- var import_react = require("react");
25
- /*!
26
- * BSD License: https://github.com/outline/rich-markdown-editor/blob/main/LICENSE
27
- * Copyright (c) 2020 General Outline, Inc (https://www.getoutline.com/) and individual contributors.
28
- *
29
- * Returns the height of the viewport.
30
- * This is mainly to account for virtual keyboards on mobile devices.
31
- *
32
- * N.B. On iOS, you have to take into account the offsetTop as well so that you get an accurate position
33
- * while using the virtual keyboard.
34
- */
35
- function useViewportHeight() {
36
- const visualViewport = window.visualViewport;
37
- const [height, setHeight] = (0, import_react.useState)(
38
- () => visualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight
39
- );
40
- (0, import_react.useLayoutEffect)(() => {
41
- const handleResize = () => {
42
- const visualViewport2 = window.visualViewport;
43
- setHeight(
44
- () => visualViewport2 ? visualViewport2.height + visualViewport2.offsetTop : window.innerHeight
45
- );
46
- };
47
- window.visualViewport?.addEventListener("resize", handleResize);
48
- window.visualViewport?.addEventListener("scroll", handleResize);
49
- return () => {
50
- window.visualViewport?.removeEventListener("resize", handleResize);
51
- window.visualViewport?.removeEventListener("scroll", handleResize);
52
- };
53
- }, []);
54
- return height;
55
- }
56
- //# sourceMappingURL=useViewportHeight.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/hooks/useViewportHeight.ts"],
4
- "sourcesContent": ["import { useLayoutEffect, useState } from 'react'\n\n/*!\n * BSD License: https://github.com/outline/rich-markdown-editor/blob/main/LICENSE\n * Copyright (c) 2020 General Outline, Inc (https://www.getoutline.com/) and individual contributors.\n *\n * Returns the height of the viewport.\n * This is mainly to account for virtual keyboards on mobile devices.\n *\n * N.B. On iOS, you have to take into account the offsetTop as well so that you get an accurate position\n * while using the virtual keyboard.\n */\n/** @public */\nexport function useViewportHeight(): number {\n\tconst visualViewport = window.visualViewport\n\tconst [height, setHeight] = useState<number>(() =>\n\t\tvisualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight\n\t)\n\n\tuseLayoutEffect(() => {\n\t\tconst handleResize = () => {\n\t\t\tconst visualViewport = window.visualViewport\n\t\t\tsetHeight(() =>\n\t\t\t\tvisualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight\n\t\t\t)\n\t\t}\n\n\t\twindow.visualViewport?.addEventListener('resize', handleResize)\n\t\twindow.visualViewport?.addEventListener('scroll', handleResize)\n\n\t\treturn () => {\n\t\t\twindow.visualViewport?.removeEventListener('resize', handleResize)\n\t\t\twindow.visualViewport?.removeEventListener('scroll', handleResize)\n\t\t}\n\t}, [])\n\treturn height\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;AAE1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWO,SAAS,oBAA4B;AAC3C,QAAM,iBAAiB,OAAO;AAC9B,QAAM,CAAC,QAAQ,SAAS,QAAI;AAAA,IAAiB,MAC5C,iBAAiB,eAAe,SAAS,eAAe,YAAY,OAAO;AAAA,EAC5E;AAEA,oCAAgB,MAAM;AACrB,UAAM,eAAe,MAAM;AAC1B,YAAMA,kBAAiB,OAAO;AAC9B;AAAA,QAAU,MACTA,kBAAiBA,gBAAe,SAASA,gBAAe,YAAY,OAAO;AAAA,MAC5E;AAAA,IACD;AAEA,WAAO,gBAAgB,iBAAiB,UAAU,YAAY;AAC9D,WAAO,gBAAgB,iBAAiB,UAAU,YAAY;AAE9D,WAAO,MAAM;AACZ,aAAO,gBAAgB,oBAAoB,UAAU,YAAY;AACjE,aAAO,gBAAgB,oBAAoB,UAAU,YAAY;AAAA,IAClE;AAAA,EACD,GAAG,CAAC,CAAC;AACL,SAAO;AACR;",
6
- "names": ["visualViewport"]
7
- }
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var richText_exports = {};
20
- __export(richText_exports, {
21
- getFontsFromRichText: () => getFontsFromRichText
22
- });
23
- module.exports = __toCommonJS(richText_exports);
24
- var import_core = require("@tiptap/core");
25
- var import_model = require("@tiptap/pm/model");
26
- var import_utils = require("@tldraw/utils");
27
- function getFontsFromRichText(editor, richText, initialState) {
28
- const { tipTapConfig, addFontsFromNode } = editor.getTextOptions();
29
- (0, import_utils.assert)(tipTapConfig, "textOptions.tipTapConfig must be set to use rich text");
30
- (0, import_utils.assert)(addFontsFromNode, "textOptions.addFontsFromNode must be set to use rich text");
31
- const schema = (0, import_core.getSchema)(tipTapConfig.extensions ?? []);
32
- const rootNode = import_model.Node.fromJSON(schema, richText);
33
- const fonts = /* @__PURE__ */ new Set();
34
- function addFont(font) {
35
- fonts.add(font);
36
- }
37
- function visit(node, state) {
38
- state = addFontsFromNode(node, state, addFont);
39
- for (const child of node.children) {
40
- visit(child, state);
41
- }
42
- }
43
- visit(rootNode, initialState);
44
- return Array.from(fonts);
45
- }
46
- //# sourceMappingURL=richText.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/utils/richText.ts"],
4
- "sourcesContent": ["import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'\nimport { Node } from '@tiptap/pm/model'\nimport { EditorProviderProps } from '@tiptap/react'\nimport { TLRichText } from '@tldraw/tlschema'\nimport { assert } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { TLFontFace } from '../editor/managers/FontManager'\n\n/**\n * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.\n *\n * @public\n */\nexport type TiptapEditor = TTEditor\n\n/**\n * A TipTap node. See {@link https://tiptap.dev/docs}.\n * @public\n */\nexport type TiptapNode = Node\n\n/** @public */\nexport interface TLTextOptions {\n\ttipTapConfig?: EditorProviderProps\n\taddFontsFromNode?: RichTextFontVisitor\n}\n\n/** @public */\nexport interface RichTextFontVisitorState {\n\treadonly family: string\n\treadonly weight: string\n\treadonly style: string\n}\n\n/** @public */\nexport type RichTextFontVisitor = (\n\tnode: TiptapNode,\n\tstate: RichTextFontVisitorState,\n\taddFont: (font: TLFontFace) => void\n) => RichTextFontVisitorState\n\n/** @public */\nexport function getFontsFromRichText(\n\teditor: Editor,\n\trichText: TLRichText,\n\tinitialState: RichTextFontVisitorState\n) {\n\tconst { tipTapConfig, addFontsFromNode } = editor.getTextOptions()\n\tassert(tipTapConfig, 'textOptions.tipTapConfig must be set to use rich text')\n\tassert(addFontsFromNode, 'textOptions.addFontsFromNode must be set to use rich text')\n\n\tconst schema = getSchema(tipTapConfig.extensions ?? [])\n\tconst rootNode = Node.fromJSON(schema, richText as JSONContent)\n\n\tconst fonts = new Set<TLFontFace>()\n\n\tfunction addFont(font: TLFontFace) {\n\t\tfonts.add(font)\n\t}\n\n\tfunction visit(node: TiptapNode, state: RichTextFontVisitorState) {\n\t\tstate = addFontsFromNode!(node, state, addFont)\n\n\t\tfor (const child of node.children) {\n\t\t\tvisit(child, state)\n\t\t}\n\t}\n\n\tvisit(rootNode, initialState)\n\n\treturn Array.from(fonts)\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2D;AAC3D,mBAAqB;AAGrB,mBAAuB;AAsChB,SAAS,qBACf,QACA,UACA,cACC;AACD,QAAM,EAAE,cAAc,iBAAiB,IAAI,OAAO,eAAe;AACjE,2BAAO,cAAc,uDAAuD;AAC5E,2BAAO,kBAAkB,2DAA2D;AAEpF,QAAM,aAAS,uBAAU,aAAa,cAAc,CAAC,CAAC;AACtD,QAAM,WAAW,kBAAK,SAAS,QAAQ,QAAuB;AAE9D,QAAM,QAAQ,oBAAI,IAAgB;AAElC,WAAS,QAAQ,MAAkB;AAClC,UAAM,IAAI,IAAI;AAAA,EACf;AAEA,WAAS,MAAM,MAAkB,OAAiC;AACjE,YAAQ,iBAAkB,MAAM,OAAO,OAAO;AAE9C,eAAW,SAAS,KAAK,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACnB;AAAA,EACD;AAEA,QAAM,UAAU,YAAY;AAE5B,SAAO,MAAM,KAAK,KAAK;AACxB;",
6
- "names": []
7
- }
@@ -1,153 +0,0 @@
1
- import { atom, EMPTY_ARRAY, transact } from "@tldraw/state";
2
- import {
3
- areArraysShallowEqual,
4
- compact,
5
- FileHelpers,
6
- mapObjectMapValues,
7
- objectMapEntries
8
- } from "@tldraw/utils";
9
- class FontManager {
10
- constructor(editor, assetUrls) {
11
- this.editor = editor;
12
- this.assetUrls = assetUrls;
13
- this.shapeFontFacesCache = editor.store.createComputedCache(
14
- "shape font faces",
15
- (shape) => {
16
- const shapeUtil = this.editor.getShapeUtil(shape);
17
- return shapeUtil.getFontFaces(shape);
18
- },
19
- { areResultsEqual: areArraysShallowEqual }
20
- );
21
- this.shapeFontLoadStateCache = editor.store.createComputedCache(
22
- "shape font load state",
23
- (shape) => {
24
- const states = this.getShapeFontFaces(shape).map((face) => this.getFontState(face));
25
- return states;
26
- },
27
- { areResultsEqual: areArraysShallowEqual }
28
- );
29
- }
30
- shapeFontFacesCache;
31
- shapeFontLoadStateCache;
32
- getShapeFontFaces(shape) {
33
- const shapeId = typeof shape === "string" ? shape : shape.id;
34
- return this.shapeFontFacesCache.get(shapeId) ?? EMPTY_ARRAY;
35
- }
36
- trackFontsForShape(shape) {
37
- const shapeId = typeof shape === "string" ? shape : shape.id;
38
- this.shapeFontLoadStateCache.get(shapeId);
39
- }
40
- async loadRequiredFontsForCurrentPage(limit = Infinity) {
41
- const neededFonts = /* @__PURE__ */ new Set();
42
- for (const shapeId of this.editor.getCurrentPageShapeIds()) {
43
- for (const font of this.getShapeFontFaces(this.editor.getShape(shapeId))) {
44
- neededFonts.add(font);
45
- }
46
- }
47
- if (neededFonts.size > limit) {
48
- return;
49
- }
50
- const promises = Array.from(neededFonts, (font) => this.ensureFontIsLoaded(font));
51
- await Promise.all(promises);
52
- }
53
- fontStates = atom(
54
- "font states",
55
- /* @__PURE__ */ new Map()
56
- );
57
- getFontState(font) {
58
- return this.fontStates.get().get(font)?.get() ?? null;
59
- }
60
- ensureFontIsLoaded(font) {
61
- const state = this.getFontState(font);
62
- if (state) return state.loadingPromise;
63
- const instance = this.findOrCreateFontFace(font);
64
- const stateAtom = atom("font state", {
65
- state: "loading",
66
- instance,
67
- loadingPromise: instance.load().then(() => {
68
- document.fonts.add(instance);
69
- stateAtom.update((s) => ({ ...s, state: "ready" }));
70
- }).catch((err) => {
71
- console.error(err);
72
- stateAtom.update((s) => ({ ...s, state: "error" }));
73
- })
74
- });
75
- this.fontStates.update((map) => {
76
- const newMap = new Map(map);
77
- newMap.set(font, stateAtom);
78
- return newMap;
79
- });
80
- return stateAtom.get().loadingPromise;
81
- }
82
- fontsToLoad = /* @__PURE__ */ new Set();
83
- requestFonts(fonts) {
84
- if (!this.fontsToLoad.size) {
85
- queueMicrotask(() => {
86
- if (this.editor.isDisposed) return;
87
- const toLoad = this.fontsToLoad;
88
- this.fontsToLoad = /* @__PURE__ */ new Set();
89
- transact(() => {
90
- for (const font of toLoad) {
91
- this.ensureFontIsLoaded(font);
92
- }
93
- });
94
- });
95
- }
96
- for (const font of fonts) {
97
- this.fontsToLoad.add(font);
98
- }
99
- }
100
- findOrCreateFontFace(font) {
101
- for (const existing of document.fonts) {
102
- if (existing.family === font.family && objectMapEntries(defaultFontFaceDescriptors).every(
103
- ([key, defaultValue]) => existing[key] === (font[key] ?? defaultValue)
104
- )) {
105
- return existing;
106
- }
107
- }
108
- const url = this.assetUrls?.[font.src.url] ?? font.src.url;
109
- const instance = new FontFace(font.family, `url(${JSON.stringify(url)})`, {
110
- ...mapObjectMapValues(defaultFontFaceDescriptors, (key) => font[key]),
111
- display: "swap"
112
- });
113
- document.fonts.add(instance);
114
- return instance;
115
- }
116
- async toEmbeddedCssDeclaration(font) {
117
- const url = this.assetUrls?.[font.src.url] ?? font.src.url;
118
- const dataUrl = await FileHelpers.urlToDataUrl(url);
119
- const src = compact([
120
- `url("${dataUrl}")`,
121
- font.src.format ? `format(${font.src.format})` : null,
122
- font.src.tech ? `tech(${font.src.tech})` : null
123
- ]).join(" ");
124
- return compact([
125
- `@font-face {`,
126
- ` font-family: ${font.family};`,
127
- ` src: ${src};`,
128
- font.ascentOverride ? ` ascent-override: ${font.ascentOverride};` : null,
129
- font.descentOverride ? ` descent-override: ${font.descentOverride};` : null,
130
- font.stretch ? ` font-stretch: ${font.stretch};` : null,
131
- font.style ? ` font-style: ${font.style};` : null,
132
- font.weight ? ` font-weight: ${font.weight};` : null,
133
- font.featureSettings ? ` font-feature-settings: ${font.featureSettings};` : null,
134
- font.lineGapOverride ? ` line-gap-override: ${font.lineGapOverride};` : null,
135
- font.unicodeRange ? ` unicode-range: ${font.unicodeRange};` : null,
136
- `}`
137
- ]).join("\n");
138
- }
139
- }
140
- const defaultFontFaceDescriptors = {
141
- style: "normal",
142
- weight: "normal",
143
- stretch: "normal",
144
- unicodeRange: "U+0-10FFFF",
145
- featureSettings: "normal",
146
- ascentOverride: "normal",
147
- descentOverride: "normal",
148
- lineGapOverride: "normal"
149
- };
150
- export {
151
- FontManager
152
- };
153
- //# sourceMappingURL=FontManager.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/lib/editor/managers/FontManager.ts"],
4
- "sourcesContent": ["import { atom, Atom, EMPTY_ARRAY, transact } from '@tldraw/state'\nimport { TLShape, TLShapeId } from '@tldraw/tlschema'\nimport {\n\tareArraysShallowEqual,\n\tcompact,\n\tFileHelpers,\n\tmapObjectMapValues,\n\tobjectMapEntries,\n} from '@tldraw/utils'\nimport { Editor } from '../Editor'\n\n/**\n * Represents the `src` property of a {@link TLFontFace}.\n * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src | `src`} for details of the properties here.\n * @public\n */\nexport interface TLFontFaceSource {\n\t/**\n\t * A URL from which to load the font. If the value here is a key in\n\t * {@link tldraw#TLEditorAssetUrls.fonts}, the value from there will be used instead.\n\t */\n\turl: string\n\tformat?: string\n\ttech?: string\n}\n\n/**\n * A font face that can be used in the editor. The properties of this are largely the same as the\n * ones in the\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face | css `@font-face` rule}.\n * @public\n */\nexport interface TLFontFace {\n\t/**\n\t * How this font can be referred to in CSS.\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-family | `font-family`}.\n\t */\n\treadonly family: string\n\t/**\n\t * The source of the font. This\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src | `src`}.\n\t */\n\treadonly src: TLFontFaceSource\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/ascent-override | `ascent-override`}.\n\t */\n\treadonly ascentOverride?: string\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/descent-override | `descent-override`}.\n\t */\n\treadonly descentOverride?: string\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-stretch | `font-stretch`}.\n\t */\n\treadonly stretch?: string\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-style | `font-style`}.\n\t */\n\treadonly style?: string\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-weight | `font-weight`}.\n\t */\n\treadonly weight?: string\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-feature-settings | `font-feature-settings`}.\n\t */\n\treadonly featureSettings?: string\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/line-gap-override | `line-gap-override`}.\n\t */\n\treadonly lineGapOverride?: string\n\t/**\n\t * See {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/unicode-range | `unicode-range`}.\n\t */\n\treadonly unicodeRange?: string\n}\n\ninterface FontState {\n\treadonly state: 'loading' | 'ready' | 'error'\n\treadonly instance: FontFace\n\treadonly loadingPromise: Promise<void>\n}\n\n/** @public */\nexport class FontManager {\n\tconstructor(\n\t\tprivate readonly editor: Editor,\n\t\tprivate readonly assetUrls?: { [key: string]: string | undefined }\n\t) {\n\t\tthis.shapeFontFacesCache = editor.store.createComputedCache(\n\t\t\t'shape font faces',\n\t\t\t(shape: TLShape) => {\n\t\t\t\tconst shapeUtil = this.editor.getShapeUtil(shape)\n\t\t\t\treturn shapeUtil.getFontFaces(shape)\n\t\t\t},\n\t\t\t{ areResultsEqual: areArraysShallowEqual }\n\t\t)\n\n\t\tthis.shapeFontLoadStateCache = editor.store.createComputedCache(\n\t\t\t'shape font load state',\n\t\t\t(shape: TLShape) => {\n\t\t\t\tconst states = this.getShapeFontFaces(shape).map((face) => this.getFontState(face))\n\t\t\t\treturn states\n\t\t\t},\n\t\t\t{ areResultsEqual: areArraysShallowEqual }\n\t\t)\n\t}\n\n\tprivate readonly shapeFontFacesCache\n\tprivate readonly shapeFontLoadStateCache\n\n\tgetShapeFontFaces(shape: TLShape | TLShapeId): TLFontFace[] {\n\t\tconst shapeId = typeof shape === 'string' ? shape : shape.id\n\t\treturn this.shapeFontFacesCache.get(shapeId) ?? EMPTY_ARRAY\n\t}\n\n\ttrackFontsForShape(shape: TLShape | TLShapeId) {\n\t\tconst shapeId = typeof shape === 'string' ? shape : shape.id\n\t\tthis.shapeFontLoadStateCache.get(shapeId)\n\t}\n\n\tasync loadRequiredFontsForCurrentPage(limit = Infinity) {\n\t\tconst neededFonts = new Set<TLFontFace>()\n\t\tfor (const shapeId of this.editor.getCurrentPageShapeIds()) {\n\t\t\tfor (const font of this.getShapeFontFaces(this.editor.getShape(shapeId)!)) {\n\t\t\t\tneededFonts.add(font)\n\t\t\t}\n\t\t}\n\n\t\tif (neededFonts.size > limit) {\n\t\t\treturn\n\t\t}\n\n\t\tconst promises = Array.from(neededFonts, (font) => this.ensureFontIsLoaded(font))\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate readonly fontStates = atom<ReadonlyMap<TLFontFace, Atom<FontState>>>(\n\t\t'font states',\n\t\tnew Map()\n\t)\n\tprivate getFontState(font: TLFontFace): FontState | null {\n\t\treturn this.fontStates.get().get(font)?.get() ?? null\n\t}\n\n\tensureFontIsLoaded(font: TLFontFace): Promise<void> {\n\t\tconst state = this.getFontState(font)\n\t\tif (state) return state.loadingPromise\n\n\t\tconst instance = this.findOrCreateFontFace(font)\n\t\tconst stateAtom = atom<FontState>('font state', {\n\t\t\tstate: 'loading',\n\t\t\tinstance,\n\t\t\tloadingPromise: instance\n\t\t\t\t.load()\n\t\t\t\t.then(() => {\n\t\t\t\t\tdocument.fonts.add(instance)\n\t\t\t\t\tstateAtom.update((s) => ({ ...s, state: 'ready' }))\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tconsole.error(err)\n\t\t\t\t\tstateAtom.update((s) => ({ ...s, state: 'error' }))\n\t\t\t\t}),\n\t\t})\n\t\tthis.fontStates.update((map) => {\n\t\t\tconst newMap = new Map(map)\n\t\t\tnewMap.set(font, stateAtom)\n\t\t\treturn newMap\n\t\t})\n\n\t\treturn stateAtom.get().loadingPromise\n\t}\n\n\tprivate fontsToLoad = new Set<TLFontFace>()\n\trequestFonts(fonts: TLFontFace[]) {\n\t\tif (!this.fontsToLoad.size) {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tif (this.editor.isDisposed) return\n\t\t\t\tconst toLoad = this.fontsToLoad\n\t\t\t\tthis.fontsToLoad = new Set()\n\t\t\t\ttransact(() => {\n\t\t\t\t\tfor (const font of toLoad) {\n\t\t\t\t\t\tthis.ensureFontIsLoaded(font)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t\tfor (const font of fonts) {\n\t\t\tthis.fontsToLoad.add(font)\n\t\t}\n\t}\n\n\tprivate findOrCreateFontFace(font: TLFontFace) {\n\t\tfor (const existing of document.fonts) {\n\t\t\tif (\n\t\t\t\texisting.family === font.family &&\n\t\t\t\tobjectMapEntries(defaultFontFaceDescriptors).every(\n\t\t\t\t\t([key, defaultValue]) => existing[key] === (font[key] ?? defaultValue)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn existing\n\t\t\t}\n\t\t}\n\n\t\tconst url = this.assetUrls?.[font.src.url] ?? font.src.url\n\t\tconst instance = new FontFace(font.family, `url(${JSON.stringify(url)})`, {\n\t\t\t...mapObjectMapValues(defaultFontFaceDescriptors, (key) => font[key]),\n\t\t\tdisplay: 'swap',\n\t\t})\n\n\t\tdocument.fonts.add(instance)\n\n\t\treturn instance\n\t}\n\n\tasync toEmbeddedCssDeclaration(font: TLFontFace) {\n\t\tconst url = this.assetUrls?.[font.src.url] ?? font.src.url\n\t\tconst dataUrl = await FileHelpers.urlToDataUrl(url)\n\n\t\tconst src = compact([\n\t\t\t`url(\"${dataUrl}\")`,\n\t\t\tfont.src.format ? `format(${font.src.format})` : null,\n\t\t\tfont.src.tech ? `tech(${font.src.tech})` : null,\n\t\t]).join(' ')\n\t\treturn compact([\n\t\t\t`@font-face {`,\n\t\t\t` font-family: ${font.family};`,\n\t\t\t` src: ${src};`,\n\t\t\tfont.ascentOverride ? ` ascent-override: ${font.ascentOverride};` : null,\n\t\t\tfont.descentOverride ? ` descent-override: ${font.descentOverride};` : null,\n\t\t\tfont.stretch ? ` font-stretch: ${font.stretch};` : null,\n\t\t\tfont.style ? ` font-style: ${font.style};` : null,\n\t\t\tfont.weight ? ` font-weight: ${font.weight};` : null,\n\t\t\tfont.featureSettings ? ` font-feature-settings: ${font.featureSettings};` : null,\n\t\t\tfont.lineGapOverride ? ` line-gap-override: ${font.lineGapOverride};` : null,\n\t\t\tfont.unicodeRange ? ` unicode-range: ${font.unicodeRange};` : null,\n\t\t\t`}`,\n\t\t]).join('\\n')\n\t}\n}\n\n// From https://drafts.csswg.org/css-font-loading/#fontface-interface\nconst defaultFontFaceDescriptors = {\n\tstyle: 'normal',\n\tweight: 'normal',\n\tstretch: 'normal',\n\tunicodeRange: 'U+0-10FFFF',\n\tfeatureSettings: 'normal',\n\tascentOverride: 'normal',\n\tdescentOverride: 'normal',\n\tlineGapOverride: 'normal',\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,28 +0,0 @@
1
- import { useEffect } from "react";
2
- import { preventDefault } from "../utils/dom.mjs";
3
- import { useContainer } from "./useContainer.mjs";
4
- function usePassThroughMouseOverEvents(ref) {
5
- if (!ref) throw Error("usePassThroughWheelEvents must be passed a ref");
6
- const container = useContainer();
7
- useEffect(() => {
8
- function onMouseOver(e) {
9
- if (e.isSpecialRedispatchedEvent) return;
10
- preventDefault(e);
11
- const cvs = container.querySelector(".tl-canvas");
12
- if (!cvs) return;
13
- const newEvent = new PointerEvent(e.type, e);
14
- newEvent.isSpecialRedispatchedEvent = true;
15
- cvs.dispatchEvent(newEvent);
16
- }
17
- const elm = ref.current;
18
- if (!elm) return;
19
- elm.addEventListener("mouseover", onMouseOver, { passive: false });
20
- return () => {
21
- elm.removeEventListener("mouseover", onMouseOver);
22
- };
23
- }, [container, ref]);
24
- }
25
- export {
26
- usePassThroughMouseOverEvents
27
- };
28
- //# sourceMappingURL=usePassThroughMouseOverEvents.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/hooks/usePassThroughMouseOverEvents.ts"],
4
- "sourcesContent": ["import { RefObject, useEffect } from 'react'\nimport { preventDefault } from '../utils/dom'\nimport { useContainer } from './useContainer'\n\n/** @public */\nexport function usePassThroughMouseOverEvents(ref: RefObject<HTMLElement>) {\n\tif (!ref) throw Error('usePassThroughWheelEvents must be passed a ref')\n\tconst container = useContainer()\n\n\tuseEffect(() => {\n\t\tfunction onMouseOver(e: MouseEvent) {\n\t\t\tif ((e as any).isSpecialRedispatchedEvent) return\n\t\t\tpreventDefault(e)\n\t\t\tconst cvs = container.querySelector('.tl-canvas')\n\t\t\tif (!cvs) return\n\t\t\tconst newEvent = new PointerEvent(e.type, e as any)\n\t\t\t;(newEvent as any).isSpecialRedispatchedEvent = true\n\t\t\tcvs.dispatchEvent(newEvent)\n\t\t}\n\n\t\tconst elm = ref.current\n\t\tif (!elm) return\n\n\t\telm.addEventListener('mouseover', onMouseOver, { passive: false })\n\t\treturn () => {\n\t\t\telm.removeEventListener('mouseover', onMouseOver)\n\t\t}\n\t}, [container, ref])\n}\n"],
5
- "mappings": "AAAA,SAAoB,iBAAiB;AACrC,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAGtB,SAAS,8BAA8B,KAA6B;AAC1E,MAAI,CAAC,IAAK,OAAM,MAAM,gDAAgD;AACtE,QAAM,YAAY,aAAa;AAE/B,YAAU,MAAM;AACf,aAAS,YAAY,GAAe;AACnC,UAAK,EAAU,2BAA4B;AAC3C,qBAAe,CAAC;AAChB,YAAM,MAAM,UAAU,cAAc,YAAY;AAChD,UAAI,CAAC,IAAK;AACV,YAAM,WAAW,IAAI,aAAa,EAAE,MAAM,CAAQ;AACjD,MAAC,SAAiB,6BAA6B;AAChD,UAAI,cAAc,QAAQ;AAAA,IAC3B;AAEA,UAAM,MAAM,IAAI;AAChB,QAAI,CAAC,IAAK;AAEV,QAAI,iBAAiB,aAAa,aAAa,EAAE,SAAS,MAAM,CAAC;AACjE,WAAO,MAAM;AACZ,UAAI,oBAAoB,aAAa,WAAW;AAAA,IACjD;AAAA,EACD,GAAG,CAAC,WAAW,GAAG,CAAC;AACpB;",
6
- "names": []
7
- }
@@ -1,36 +0,0 @@
1
- import { useLayoutEffect, useState } from "react";
2
- /*!
3
- * BSD License: https://github.com/outline/rich-markdown-editor/blob/main/LICENSE
4
- * Copyright (c) 2020 General Outline, Inc (https://www.getoutline.com/) and individual contributors.
5
- *
6
- * Returns the height of the viewport.
7
- * This is mainly to account for virtual keyboards on mobile devices.
8
- *
9
- * N.B. On iOS, you have to take into account the offsetTop as well so that you get an accurate position
10
- * while using the virtual keyboard.
11
- */
12
- function useViewportHeight() {
13
- const visualViewport = window.visualViewport;
14
- const [height, setHeight] = useState(
15
- () => visualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight
16
- );
17
- useLayoutEffect(() => {
18
- const handleResize = () => {
19
- const visualViewport2 = window.visualViewport;
20
- setHeight(
21
- () => visualViewport2 ? visualViewport2.height + visualViewport2.offsetTop : window.innerHeight
22
- );
23
- };
24
- window.visualViewport?.addEventListener("resize", handleResize);
25
- window.visualViewport?.addEventListener("scroll", handleResize);
26
- return () => {
27
- window.visualViewport?.removeEventListener("resize", handleResize);
28
- window.visualViewport?.removeEventListener("scroll", handleResize);
29
- };
30
- }, []);
31
- return height;
32
- }
33
- export {
34
- useViewportHeight
35
- };
36
- //# sourceMappingURL=useViewportHeight.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/hooks/useViewportHeight.ts"],
4
- "sourcesContent": ["import { useLayoutEffect, useState } from 'react'\n\n/*!\n * BSD License: https://github.com/outline/rich-markdown-editor/blob/main/LICENSE\n * Copyright (c) 2020 General Outline, Inc (https://www.getoutline.com/) and individual contributors.\n *\n * Returns the height of the viewport.\n * This is mainly to account for virtual keyboards on mobile devices.\n *\n * N.B. On iOS, you have to take into account the offsetTop as well so that you get an accurate position\n * while using the virtual keyboard.\n */\n/** @public */\nexport function useViewportHeight(): number {\n\tconst visualViewport = window.visualViewport\n\tconst [height, setHeight] = useState<number>(() =>\n\t\tvisualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight\n\t)\n\n\tuseLayoutEffect(() => {\n\t\tconst handleResize = () => {\n\t\t\tconst visualViewport = window.visualViewport\n\t\t\tsetHeight(() =>\n\t\t\t\tvisualViewport ? visualViewport.height + visualViewport.offsetTop : window.innerHeight\n\t\t\t)\n\t\t}\n\n\t\twindow.visualViewport?.addEventListener('resize', handleResize)\n\t\twindow.visualViewport?.addEventListener('scroll', handleResize)\n\n\t\treturn () => {\n\t\t\twindow.visualViewport?.removeEventListener('resize', handleResize)\n\t\t\twindow.visualViewport?.removeEventListener('scroll', handleResize)\n\t\t}\n\t}, [])\n\treturn height\n}\n"],
5
- "mappings": "AAAA,SAAS,iBAAiB,gBAAgB;AAE1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWO,SAAS,oBAA4B;AAC3C,QAAM,iBAAiB,OAAO;AAC9B,QAAM,CAAC,QAAQ,SAAS,IAAI;AAAA,IAAiB,MAC5C,iBAAiB,eAAe,SAAS,eAAe,YAAY,OAAO;AAAA,EAC5E;AAEA,kBAAgB,MAAM;AACrB,UAAM,eAAe,MAAM;AAC1B,YAAMA,kBAAiB,OAAO;AAC9B;AAAA,QAAU,MACTA,kBAAiBA,gBAAe,SAASA,gBAAe,YAAY,OAAO;AAAA,MAC5E;AAAA,IACD;AAEA,WAAO,gBAAgB,iBAAiB,UAAU,YAAY;AAC9D,WAAO,gBAAgB,iBAAiB,UAAU,YAAY;AAE9D,WAAO,MAAM;AACZ,aAAO,gBAAgB,oBAAoB,UAAU,YAAY;AACjE,aAAO,gBAAgB,oBAAoB,UAAU,YAAY;AAAA,IAClE;AAAA,EACD,GAAG,CAAC,CAAC;AACL,SAAO;AACR;",
6
- "names": ["visualViewport"]
7
- }
@@ -1,26 +0,0 @@
1
- import { getSchema } from "@tiptap/core";
2
- import { Node } from "@tiptap/pm/model";
3
- import { assert } from "@tldraw/utils";
4
- function getFontsFromRichText(editor, richText, initialState) {
5
- const { tipTapConfig, addFontsFromNode } = editor.getTextOptions();
6
- assert(tipTapConfig, "textOptions.tipTapConfig must be set to use rich text");
7
- assert(addFontsFromNode, "textOptions.addFontsFromNode must be set to use rich text");
8
- const schema = getSchema(tipTapConfig.extensions ?? []);
9
- const rootNode = Node.fromJSON(schema, richText);
10
- const fonts = /* @__PURE__ */ new Set();
11
- function addFont(font) {
12
- fonts.add(font);
13
- }
14
- function visit(node, state) {
15
- state = addFontsFromNode(node, state, addFont);
16
- for (const child of node.children) {
17
- visit(child, state);
18
- }
19
- }
20
- visit(rootNode, initialState);
21
- return Array.from(fonts);
22
- }
23
- export {
24
- getFontsFromRichText
25
- };
26
- //# sourceMappingURL=richText.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/utils/richText.ts"],
4
- "sourcesContent": ["import { getSchema, JSONContent, Editor as TTEditor } from '@tiptap/core'\nimport { Node } from '@tiptap/pm/model'\nimport { EditorProviderProps } from '@tiptap/react'\nimport { TLRichText } from '@tldraw/tlschema'\nimport { assert } from '@tldraw/utils'\nimport { Editor } from '../editor/Editor'\nimport { TLFontFace } from '../editor/managers/FontManager'\n\n/**\n * This is the TipTap editor! Docs are {@link https://tiptap.dev/docs}.\n *\n * @public\n */\nexport type TiptapEditor = TTEditor\n\n/**\n * A TipTap node. See {@link https://tiptap.dev/docs}.\n * @public\n */\nexport type TiptapNode = Node\n\n/** @public */\nexport interface TLTextOptions {\n\ttipTapConfig?: EditorProviderProps\n\taddFontsFromNode?: RichTextFontVisitor\n}\n\n/** @public */\nexport interface RichTextFontVisitorState {\n\treadonly family: string\n\treadonly weight: string\n\treadonly style: string\n}\n\n/** @public */\nexport type RichTextFontVisitor = (\n\tnode: TiptapNode,\n\tstate: RichTextFontVisitorState,\n\taddFont: (font: TLFontFace) => void\n) => RichTextFontVisitorState\n\n/** @public */\nexport function getFontsFromRichText(\n\teditor: Editor,\n\trichText: TLRichText,\n\tinitialState: RichTextFontVisitorState\n) {\n\tconst { tipTapConfig, addFontsFromNode } = editor.getTextOptions()\n\tassert(tipTapConfig, 'textOptions.tipTapConfig must be set to use rich text')\n\tassert(addFontsFromNode, 'textOptions.addFontsFromNode must be set to use rich text')\n\n\tconst schema = getSchema(tipTapConfig.extensions ?? [])\n\tconst rootNode = Node.fromJSON(schema, richText as JSONContent)\n\n\tconst fonts = new Set<TLFontFace>()\n\n\tfunction addFont(font: TLFontFace) {\n\t\tfonts.add(font)\n\t}\n\n\tfunction visit(node: TiptapNode, state: RichTextFontVisitorState) {\n\t\tstate = addFontsFromNode!(node, state, addFont)\n\n\t\tfor (const child of node.children) {\n\t\t\tvisit(child, state)\n\t\t}\n\t}\n\n\tvisit(rootNode, initialState)\n\n\treturn Array.from(fonts)\n}\n"],
5
- "mappings": "AAAA,SAAS,iBAAkD;AAC3D,SAAS,YAAY;AAGrB,SAAS,cAAc;AAsChB,SAAS,qBACf,QACA,UACA,cACC;AACD,QAAM,EAAE,cAAc,iBAAiB,IAAI,OAAO,eAAe;AACjE,SAAO,cAAc,uDAAuD;AAC5E,SAAO,kBAAkB,2DAA2D;AAEpF,QAAM,SAAS,UAAU,aAAa,cAAc,CAAC,CAAC;AACtD,QAAM,WAAW,KAAK,SAAS,QAAQ,QAAuB;AAE9D,QAAM,QAAQ,oBAAI,IAAgB;AAElC,WAAS,QAAQ,MAAkB;AAClC,UAAM,IAAI,IAAI;AAAA,EACf;AAEA,WAAS,MAAM,MAAkB,OAAiC;AACjE,YAAQ,iBAAkB,MAAM,OAAO,OAAO;AAE9C,eAAW,SAAS,KAAK,UAAU;AAClC,YAAM,OAAO,KAAK;AAAA,IACnB;AAAA,EACD;AAEA,QAAM,UAAU,YAAY;AAE5B,SAAO,MAAM,KAAK,KAAK;AACxB;",
6
- "names": []
7
- }