tldraw 3.16.0-canary.5dac57cf9465 → 3.16.0-canary.648a8d837266

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 (174) hide show
  1. package/dist-cjs/index.d.ts +75 -5
  2. package/dist-cjs/index.js +5 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  5. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  6. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  7. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  8. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  9. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  10. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  11. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  13. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  14. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +12 -12
  15. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  16. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  17. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  18. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  19. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  20. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  21. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  22. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  23. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  24. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +3 -3
  25. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +1 -1
  26. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  27. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  28. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  29. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  31. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  32. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  33. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  35. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  36. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  37. package/dist-cjs/lib/ui/TldrawUi.js +14 -0
  38. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  39. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +10 -2
  40. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  41. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  42. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  43. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  44. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  45. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +1 -1
  46. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  47. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -22
  48. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  49. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +188 -78
  50. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  51. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +1 -1
  52. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +2 -2
  53. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +15 -3
  54. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  55. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +136 -150
  56. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  57. package/dist-cjs/lib/ui/components/primitives/layout.js +30 -5
  58. package/dist-cjs/lib/ui/components/primitives/layout.js.map +2 -2
  59. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  60. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  61. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  62. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +153 -19
  63. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  64. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  65. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  66. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  67. package/dist-cjs/lib/ui/version.js +3 -3
  68. package/dist-cjs/lib/ui/version.js.map +1 -1
  69. package/dist-esm/index.d.mts +75 -5
  70. package/dist-esm/index.mjs +10 -2
  71. package/dist-esm/index.mjs.map +2 -2
  72. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  73. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  74. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  75. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  76. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  77. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  78. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  79. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  80. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  81. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  82. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +13 -12
  83. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  84. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  85. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  86. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  87. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  88. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  89. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  90. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  91. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  92. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +3 -3
  93. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
  94. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  95. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  96. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  97. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  98. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  99. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  100. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  101. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  102. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  103. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  104. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  105. package/dist-esm/lib/ui/TldrawUi.mjs +16 -2
  106. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  107. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +10 -2
  108. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  109. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  110. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  111. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  112. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  113. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +1 -1
  114. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  115. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -22
  116. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  117. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -80
  118. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  119. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +2 -1
  120. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  121. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +16 -4
  122. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  123. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +145 -152
  124. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  125. package/dist-esm/lib/ui/components/primitives/layout.mjs +31 -6
  126. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +2 -2
  127. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  128. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  129. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  130. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +161 -21
  131. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  132. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  133. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  134. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  135. package/dist-esm/lib/ui/version.mjs +3 -3
  136. package/dist-esm/lib/ui/version.mjs.map +1 -1
  137. package/package.json +3 -3
  138. package/src/index.ts +7 -0
  139. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  140. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  141. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  142. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  143. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  144. package/src/lib/shapes/frame/FrameShapeUtil.tsx +21 -14
  145. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  146. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  147. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  148. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  149. package/src/lib/shapes/image/ImageShapeUtil.tsx +3 -3
  150. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  151. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  152. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  153. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  154. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  155. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  156. package/src/lib/ui/TldrawUi.tsx +17 -2
  157. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +13 -2
  158. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  159. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  160. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +1 -1
  161. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -24
  162. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +208 -56
  163. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +3 -2
  164. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +22 -5
  165. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +156 -168
  166. package/src/lib/ui/components/primitives/layout.tsx +79 -5
  167. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  168. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  169. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +220 -18
  170. package/src/lib/ui/context/events.tsx +1 -0
  171. package/src/lib/ui/hooks/useTools.tsx +140 -10
  172. package/src/lib/ui/version.ts +3 -3
  173. package/src/lib/ui.css +346 -243
  174. package/tldraw.css +639 -533
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/shapes/arrow/ArrowShapeUtil.tsx"],
4
- "sourcesContent": ["import {\n\tArc2d,\n\tBox,\n\tEMPTY_ARRAY,\n\tEdge2d,\n\tEditor,\n\tGeometry2d,\n\tGroup2d,\n\tIndexKey,\n\tPI2,\n\tPolyline2d,\n\tRectangle2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLArrowBinding,\n\tTLArrowBindingProps,\n\tTLArrowShape,\n\tTLArrowShapeProps,\n\tTLHandle,\n\tTLHandleDragInfo,\n\tTLResizeInfo,\n\tTLShapePartial,\n\tTLShapeUtilCanBeLaidOutOpts,\n\tTLShapeUtilCanBindOpts,\n\tTLShapeUtilCanvasSvgDef,\n\tVec,\n\tWeakCache,\n\tarrowShapeMigrations,\n\tarrowShapeProps,\n\tclamp,\n\tdebugFlags,\n\texhaustiveSwitchError,\n\tgetDefaultColorTheme,\n\tgetFontsFromRichText,\n\tinvLerp,\n\tlerp,\n\tmapObjectMapValues,\n\tmaybeSnapToGrid,\n\tstructuredClone,\n\ttoDomPrecision,\n\ttoRichText,\n\ttrack,\n\tuseEditor,\n\tuseIsEditing,\n\tuseSharedSafeId,\n\tuseValue,\n} from '@tldraw/editor'\nimport React, { useMemo } from 'react'\nimport { updateArrowTerminal } from '../../bindings/arrow/ArrowBindingUtil'\nimport { isEmptyRichText, renderPlaintextFromRichText } from '../../utils/text/richText'\nimport { PathBuilder } from '../shared/PathBuilder'\nimport { RichTextLabel, RichTextSVG } from '../shared/RichTextLabel'\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { ARROW_LABEL_PADDING, STROKE_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getArrowBodyPath, getArrowHandlePath } from './ArrowPath'\nimport { ArrowShapeOptions } from './arrow-types'\nimport {\n\tgetArrowLabelDefaultPosition,\n\tgetArrowLabelFontSize,\n\tgetArrowLabelPosition,\n} from './arrowLabel'\nimport { updateArrowTargetState } from './arrowTargetState'\nimport { getArrowheadPathForType } from './arrowheads'\nimport { ElbowArrowDebug } from './elbow/ElbowArrowDebug'\nimport { ElbowArrowAxes } from './elbow/definitions'\nimport { getElbowArrowSnapLines, perpDistanceToLineAngle } from './elbow/elbowArrowSnapLines'\nimport {\n\tTLArrowBindings,\n\tcreateOrUpdateArrowBinding,\n\tgetArrowBindings,\n\tgetArrowInfo,\n\tgetArrowTerminalsInArrowSpace,\n\tremoveArrowBinding,\n} from './shared'\n\nenum ArrowHandles {\n\tStart = 'start',\n\tMiddle = 'middle',\n\tEnd = 'end',\n}\n\n/** @public */\nexport class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {\n\tstatic override type = 'arrow' as const\n\tstatic override props = arrowShapeProps\n\tstatic override migrations = arrowShapeMigrations\n\n\toverride options: ArrowShapeOptions = {\n\t\texpandElbowLegLength: {\n\t\t\ts: 28,\n\t\t\tm: 36,\n\t\t\tl: 44,\n\t\t\txl: 66,\n\t\t},\n\t\tminElbowLegLength: {\n\t\t\ts: STROKE_SIZES.s * 3,\n\t\t\tm: STROKE_SIZES.m * 3,\n\t\t\tl: STROKE_SIZES.l * 3,\n\t\t\txl: STROKE_SIZES.xl * 3,\n\t\t},\n\t\tminElbowHandleDistance: 16,\n\n\t\tarcArrowCenterSnapDistance: 16,\n\t\telbowArrowCenterSnapDistance: 24,\n\t\telbowArrowEdgeSnapDistance: 20,\n\t\telbowArrowPointSnapDistance: 24,\n\t\telbowArrowAxisSnapDistance: 16,\n\n\t\tlabelCenterSnapDistance: 10,\n\n\t\telbowMidpointSnapDistance: 10,\n\t\telbowMinSegmentLengthToShowMidpointHandle: 20,\n\n\t\thoverPreciseTimeout: 600,\n\t\tpointingPreciseTimeout: 320,\n\n\t\tshouldBeExact: (editor: Editor) => editor.inputs.altKey,\n\t\tshouldIgnoreTargets: (editor: Editor) => editor.inputs.ctrlKey,\n\t}\n\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canBind({ toShapeType }: TLShapeUtilCanBindOpts<TLArrowShape>): boolean {\n\t\t// bindings can go from arrows to shapes, but not from shapes to arrows\n\t\treturn toShapeType !== 'arrow'\n\t}\n\toverride canSnap() {\n\t\treturn false\n\t}\n\toverride hideResizeHandles() {\n\t\treturn true\n\t}\n\toverride hideRotateHandle() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsBg() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsFg() {\n\t\treturn true\n\t}\n\n\toverride canBeLaidOut(shape: TLArrowShape, info: TLShapeUtilCanBeLaidOutOpts) {\n\t\tif (info.type === 'flip') {\n\t\t\t// If we don't have this then the flip will be non-idempotent; that is, the flip will be multipotent, varipotent, or perhaps even omni-potent... and we can't have that\n\t\t\tconst bindings = getArrowBindings(this.editor, shape)\n\t\t\tconst { start, end } = bindings\n\t\t\tconst { shapes = [] } = info\n\t\t\tif (start && !shapes.find((s) => s.id === start.toId)) return false\n\t\t\tif (end && !shapes.find((s) => s.id === end.toId)) return false\n\t\t}\n\t\treturn true\n\t}\n\n\toverride getFontFaces(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) return EMPTY_ARRAY\n\n\t\treturn getFontsFromRichText(this.editor, shape.props.richText, {\n\t\t\tfamily: `tldraw_${shape.props.font}`,\n\t\t\tweight: 'normal',\n\t\t\tstyle: 'normal',\n\t\t})\n\t}\n\n\toverride getDefaultProps(): TLArrowShape['props'] {\n\t\treturn {\n\t\t\tkind: 'arc',\n\t\t\telbowMidPoint: 0.5,\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tfill: 'none',\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tbend: 0,\n\t\t\tstart: { x: 0, y: 0 },\n\t\t\tend: { x: 2, y: 0 },\n\t\t\tarrowheadStart: 'none',\n\t\t\tarrowheadEnd: 'arrow',\n\t\t\trichText: toRichText(''),\n\t\t\tlabelPosition: 0.5,\n\t\t\tfont: 'draw',\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLArrowShape) {\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst debugGeom: Geometry2d[] = []\n\n\t\tconst bodyGeom =\n\t\t\tinfo.type === 'straight'\n\t\t\t\t? new Edge2d({\n\t\t\t\t\t\tstart: Vec.From(info.start.point),\n\t\t\t\t\t\tend: Vec.From(info.end.point),\n\t\t\t\t\t})\n\t\t\t\t: info.type === 'arc'\n\t\t\t\t\t? new Arc2d({\n\t\t\t\t\t\t\tcenter: Vec.Cast(info.handleArc.center),\n\t\t\t\t\t\t\tstart: Vec.Cast(info.start.point),\n\t\t\t\t\t\t\tend: Vec.Cast(info.end.point),\n\t\t\t\t\t\t\tsweepFlag: info.bodyArc.sweepFlag,\n\t\t\t\t\t\t\tlargeArcFlag: info.bodyArc.largeArcFlag,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Polyline2d({ points: info.route.points })\n\n\t\tlet labelGeom\n\t\tif (isEditing || !isEmptyRichText(shape.props.richText)) {\n\t\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\t\tif (debugFlags.debugGeometry.get()) {\n\t\t\t\tdebugGeom.push(...labelPosition.debugGeom)\n\t\t\t}\n\t\t\tlabelGeom = new Rectangle2d({\n\t\t\t\tx: labelPosition.box.x,\n\t\t\t\ty: labelPosition.box.y,\n\t\t\t\twidth: labelPosition.box.w,\n\t\t\t\theight: labelPosition.box.h,\n\t\t\t\tisFilled: true,\n\t\t\t\tisLabel: true,\n\t\t\t})\n\t\t}\n\n\t\treturn new Group2d({\n\t\t\tchildren: [...(labelGeom ? [bodyGeom, labelGeom] : [bodyGeom]), ...debugGeom],\n\t\t})\n\t}\n\n\toverride getHandles(shape: TLArrowShape): TLHandle[] {\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst handles: TLHandle[] = [\n\t\t\t{\n\t\t\t\tid: ArrowHandles.Start,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a1' as IndexKey,\n\t\t\t\tx: info.start.handle.x,\n\t\t\t\ty: info.start.handle.y,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ArrowHandles.End,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a3' as IndexKey,\n\t\t\t\tx: info.end.handle.x,\n\t\t\t\ty: info.end.handle.y,\n\t\t\t},\n\t\t]\n\n\t\tif (shape.props.kind === 'arc' && (info.type === 'straight' || info.type === 'arc')) {\n\t\t\thandles.push({\n\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\ttype: 'virtual',\n\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\tx: info.middle.x,\n\t\t\t\ty: info.middle.y,\n\t\t\t})\n\t\t}\n\n\t\tif (shape.props.kind === 'elbow' && info.type === 'elbow' && info.route.midpointHandle) {\n\t\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t\tconst segmentStart = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentStart)\n\t\t\tconst segmentEnd = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentEnd)\n\t\t\tconst segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.getZoomLevel()\n\n\t\t\tif (segmentLength > this.options.elbowMinSegmentLengthToShowMidpointHandle) {\n\t\t\t\thandles.push({\n\t\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\t\ttype: 'vertex',\n\t\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\t\tx: info.route.midpointHandle.point.x,\n\t\t\t\t\ty: info.route.midpointHandle.point.y,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn handles\n\t}\n\n\toverride getText(shape: TLArrowShape) {\n\t\treturn renderPlaintextFromRichText(this.editor, shape.props.richText)\n\t}\n\n\toverride onHandleDrag(shape: TLArrowShape, info: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst handleId = info.handle.id as ArrowHandles\n\t\tswitch (handleId) {\n\t\t\tcase ArrowHandles.Middle:\n\t\t\t\tswitch (shape.props.kind) {\n\t\t\t\t\tcase 'arc':\n\t\t\t\t\t\treturn this.onArcMidpointHandleDrag(shape, info)\n\t\t\t\t\tcase 'elbow':\n\t\t\t\t\t\treturn this.onElbowMidpointHandleDrag(shape, info)\n\t\t\t\t\tdefault:\n\t\t\t\t\t\texhaustiveSwitchError(shape.props.kind)\n\t\t\t\t}\n\t\t\tcase ArrowHandles.Start:\n\t\t\tcase ArrowHandles.End:\n\t\t\t\treturn this.onTerminalHandleDrag(shape, info, handleId)\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(handleId)\n\t\t}\n\t}\n\n\tprivate onArcMidpointHandleDrag(shape: TLArrowShape, { handle }: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// Bending the arrow...\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst delta = Vec.Sub(end, start)\n\t\tconst v = Vec.Per(delta)\n\n\t\tconst med = Vec.Med(end, start)\n\t\tconst A = Vec.Sub(med, v)\n\t\tconst B = Vec.Add(med, v)\n\n\t\tconst point = Vec.NearestPointOnLineSegment(A, B, handle, false)\n\t\tlet bend = Vec.Dist(point, med)\n\t\tif (Vec.Clockwise(point, end, med)) bend *= -1\n\t\treturn { id: shape.id, type: shape.type, props: { bend } }\n\t}\n\n\tprivate onElbowMidpointHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle }: TLHandleDragInfo<TLArrowShape>\n\t) {\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (info?.type !== 'elbow') return\n\n\t\tconst shapeToPageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst handlePagePoint = shapeToPageTransform.applyToPoint(handle)\n\t\tconst axisName = info.route.midpointHandle?.axis\n\t\tif (!axisName) return\n\t\tconst axis = ElbowArrowAxes[axisName]\n\n\t\tconst midRange = info.elbow[axis.midRange]\n\t\tif (!midRange) return\n\n\t\t// We're snapping against a list of parallel lines. The way we do this is to calculate the\n\t\t// angle of the line we're snapping to...\n\t\tlet angle = Vec.Angle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 0)),\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 1))\n\t\t)\n\t\tif (angle < 0) angle += Math.PI\n\n\t\t// ...then calculate the perpendicular distance from the origin to the (infinite) line in\n\t\t// question. This returns a signed distance - lines \"behind\" the origin are negative.\n\t\tconst handlePoint = perpDistanceToLineAngle(handlePagePoint, angle)\n\n\t\t// As we're only ever moving along one dimension, we can use this perpendicular distance for\n\t\t// all of our snapping calculations.\n\t\tconst loPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.lo, 0)),\n\t\t\tangle\n\t\t)\n\t\tconst hiPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.hi, 0)),\n\t\t\tangle\n\t\t)\n\n\t\t// we want to snap to certain points. the maximum distance at which a snap will occur is\n\t\t// relative to the zoom level:\n\t\tconst maxSnapDistance = this.options.elbowMidpointSnapDistance / this.editor.getZoomLevel()\n\n\t\t// we snap to the midpoint of the range by default\n\t\tconst midPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(lerp(midRange.lo, midRange.hi, 0.5), 0)),\n\t\t\tangle\n\t\t)\n\n\t\tlet snapPoint = midPoint\n\t\tlet snapDistance = Math.abs(midPoint - handlePoint)\n\n\t\t// then we check all the other arrows that are on-screen.\n\t\tfor (const [snapAngle, snapLines] of getElbowArrowSnapLines(this.editor)) {\n\t\t\tconst { isParallel, isFlippedParallel } = anglesAreApproximatelyParallel(angle, snapAngle)\n\t\t\tif (isParallel || isFlippedParallel) {\n\t\t\t\tfor (const snapLine of snapLines) {\n\t\t\t\t\tconst doesShareStartIntersection =\n\t\t\t\t\t\tsnapLine.startBoundShapeId &&\n\t\t\t\t\t\t(snapLine.startBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.startBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tconst doesShareEndIntersection =\n\t\t\t\t\t\tsnapLine.endBoundShapeId &&\n\t\t\t\t\t\t(snapLine.endBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.endBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tif (!doesShareStartIntersection && !doesShareEndIntersection) continue\n\n\t\t\t\t\tconst point = isFlippedParallel ? -snapLine.perpDistance : snapLine.perpDistance\n\t\t\t\t\tconst distance = Math.abs(point - handlePoint)\n\t\t\t\t\tif (distance < snapDistance) {\n\t\t\t\t\t\tsnapPoint = point\n\t\t\t\t\t\tsnapDistance = distance\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (snapDistance > maxSnapDistance) {\n\t\t\tsnapPoint = handlePoint\n\t\t}\n\n\t\tconst newMid = clamp(invLerp(loPoint, hiPoint, snapPoint), 0, 1)\n\n\t\treturn {\n\t\t\tid: shape.id,\n\t\t\ttype: shape.type,\n\t\t\tprops: {\n\t\t\t\telbowMidPoint: newMid,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate onTerminalHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle, isPrecise }: TLHandleDragInfo<TLArrowShape>,\n\t\thandleId: ArrowHandles.Start | ArrowHandles.End\n\t) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\n\t\tconst currentBinding = bindings[handleId]\n\n\t\tconst oppositeHandleId = handleId === ArrowHandles.Start ? ArrowHandles.End : ArrowHandles.Start\n\t\tconst oppositeBinding = bindings[oppositeHandleId]\n\n\t\tconst targetInfo = updateArrowTargetState({\n\t\t\teditor: this.editor,\n\t\t\tpointInPageSpace: this.editor.getShapePageTransform(shape.id)!.applyToPoint(handle),\n\t\t\tarrow: shape,\n\t\t\tisPrecise: isPrecise,\n\t\t\tcurrentBinding,\n\t\t\toppositeBinding,\n\t\t})\n\n\t\tif (!targetInfo) {\n\t\t\t// todo: maybe double check that this isn't equal to the other handle too?\n\t\t\tremoveArrowBinding(this.editor, shape, handleId)\n\t\t\tconst newPoint = maybeSnapToGrid(new Vec(handle.x, handle.y), this.editor)\n\t\t\tupdate.props![handleId] = {\n\t\t\t\tx: newPoint.x,\n\t\t\t\ty: newPoint.y,\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\t// we've got a target! the handle is being dragged over a shape, bind to it\n\t\tconst bindingProps: TLArrowBindingProps = {\n\t\t\tterminal: handleId,\n\t\t\tnormalizedAnchor: targetInfo.normalizedAnchor,\n\t\t\tisPrecise: targetInfo.isPrecise,\n\t\t\tisExact: targetInfo.isExact,\n\t\t\tsnap: targetInfo.snap,\n\t\t}\n\n\t\tcreateOrUpdateArrowBinding(this.editor, shape, targetInfo.target.id, bindingProps)\n\n\t\tconst newBindings = getArrowBindings(this.editor, shape)\n\t\tif (newBindings.start && newBindings.end && newBindings.start.toId === newBindings.end.toId) {\n\t\t\tif (\n\t\t\t\tVec.Equals(newBindings.start.props.normalizedAnchor, newBindings.end.props.normalizedAnchor)\n\t\t\t) {\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newBindings.end.toId, {\n\t\t\t\t\t...newBindings.end.props,\n\t\t\t\t\tnormalizedAnchor: {\n\t\t\t\t\t\tx: newBindings.end.props.normalizedAnchor.x + 0.05,\n\t\t\t\t\t\ty: newBindings.end.props.normalizedAnchor.y,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn update\n\t}\n\n\toverride onTranslateStart(shape: TLArrowShape) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// ...if the user is dragging ONLY this arrow, for elbow shapes, we can't maintain the bindings well just yet so we remove them entirely\n\t\tif (shape.props.kind === 'elbow' && this.editor.getOnlySelectedShapeId() === shape.id) {\n\t\t\tconst info = getArrowInfo(this.editor, shape)\n\t\t\tif (!info) return\n\t\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\t\t\tif (bindings.start) {\n\t\t\t\tupdate.props!.start = { x: info.start.point.x, y: info.start.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'start')\n\t\t\t}\n\t\t\tif (bindings.end) {\n\t\t\t\tupdate.props!.end = { x: info.end.point.x, y: info.end.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'end')\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\tconst terminalsInArrowSpace = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t// If at least one bound shape is in the selection, do nothing;\n\t\t// If no bound shapes are in the selection, unbind any bound shapes\n\n\t\tconst selectedShapeIds = this.editor.getSelectedShapeIds()\n\n\t\tif (\n\t\t\t(bindings.start &&\n\t\t\t\t(selectedShapeIds.includes(bindings.start.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.start.toId))) ||\n\t\t\t(bindings.end &&\n\t\t\t\t(selectedShapeIds.includes(bindings.end.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.end.toId)))\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\t// When we start translating shapes, record where their bindings were in page space so we\n\t\t// can maintain them as we translate the arrow\n\t\tshapeAtTranslationStart.set(shape, {\n\t\t\tpagePosition: shapePageTransform.applyToPoint(shape),\n\t\t\tterminalBindings: mapObjectMapValues(terminalsInArrowSpace, (terminalName, point) => {\n\t\t\t\tconst binding = bindings[terminalName]\n\t\t\t\tif (!binding) return null\n\t\t\t\treturn {\n\t\t\t\t\tbinding,\n\t\t\t\t\tshapePosition: point,\n\t\t\t\t\tpagePosition: shapePageTransform.applyToPoint(point),\n\t\t\t\t}\n\t\t\t}),\n\t\t})\n\n\t\t// update arrow terminal bindings eagerly to make sure the arrows unbind nicely when translating\n\t\tif (bindings.start) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'start',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t\tshape = this.editor.getShape(shape.id) as TLArrowShape\n\t\t}\n\t\tif (bindings.end) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'end',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t}\n\n\t\tfor (const handleName of [ArrowHandles.Start, ArrowHandles.End] as const) {\n\t\t\tconst binding = bindings[handleName]\n\t\t\tif (!binding) continue\n\n\t\t\tthis.editor.updateBinding({\n\t\t\t\t...binding,\n\t\t\t\tprops: { ...binding.props, isPrecise: true },\n\t\t\t})\n\t\t}\n\n\t\treturn\n\t}\n\n\toverride onTranslate(initialShape: TLArrowShape, shape: TLArrowShape) {\n\t\tconst atTranslationStart = shapeAtTranslationStart.get(initialShape)\n\t\tif (!atTranslationStart) return\n\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst pageDelta = Vec.Sub(\n\t\t\tshapePageTransform.applyToPoint(shape),\n\t\t\tatTranslationStart.pagePosition\n\t\t)\n\n\t\tfor (const terminalBinding of Object.values(atTranslationStart.terminalBindings)) {\n\t\t\tif (!terminalBinding) continue\n\n\t\t\tconst newPagePoint = Vec.Add(terminalBinding.pagePosition, Vec.Mul(pageDelta, 0.5))\n\t\t\tconst newTarget = this.editor.getShapeAtPoint(newPagePoint, {\n\t\t\t\thitInside: true,\n\t\t\t\thitFrameInside: true,\n\t\t\t\tmargin: 0,\n\t\t\t\tfilter: (targetShape) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t!targetShape.isLocked &&\n\t\t\t\t\t\tthis.editor.canBindShapes({ fromShape: shape, toShape: targetShape, binding: 'arrow' })\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (newTarget?.id === terminalBinding.binding.toId) {\n\t\t\t\tconst targetBounds = Box.ZeroFix(this.editor.getShapeGeometry(newTarget).bounds)\n\t\t\t\tconst pointInTargetSpace = this.editor.getPointInShapeSpace(newTarget, newPagePoint)\n\t\t\t\tconst normalizedAnchor = {\n\t\t\t\t\tx: (pointInTargetSpace.x - targetBounds.minX) / targetBounds.width,\n\t\t\t\t\ty: (pointInTargetSpace.y - targetBounds.minY) / targetBounds.height,\n\t\t\t\t}\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newTarget.id, {\n\t\t\t\t\t...terminalBinding.binding.props,\n\t\t\t\t\tnormalizedAnchor,\n\t\t\t\t\tisPrecise: true,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tremoveArrowBinding(this.editor, shape, terminalBinding.binding.props.terminal)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readonly _resizeInitialBindings = new WeakCache<TLArrowShape, TLArrowBindings>()\n\n\toverride onResize(shape: TLArrowShape, info: TLResizeInfo<TLArrowShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst bindings = this._resizeInitialBindings.get(shape, () =>\n\t\t\tgetArrowBindings(this.editor, shape)\n\t\t)\n\t\tconst terminals = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst { start, end } = structuredClone<TLArrowShape['props']>(shape.props)\n\t\tlet { bend } = shape.props\n\n\t\t// Rescale start handle if it's not bound to a shape\n\t\tif (!bindings.start) {\n\t\t\tstart.x = terminals.start.x * scaleX\n\t\t\tstart.y = terminals.start.y * scaleY\n\t\t}\n\n\t\t// Rescale end handle if it's not bound to a shape\n\t\tif (!bindings.end) {\n\t\t\tend.x = terminals.end.x * scaleX\n\t\t\tend.y = terminals.end.y * scaleY\n\t\t}\n\n\t\t// todo: we should only change the normalized anchor positions\n\t\t// of the shape's handles if the bound shape is also being resized\n\n\t\tconst mx = Math.abs(scaleX)\n\t\tconst my = Math.abs(scaleY)\n\n\t\tconst startNormalizedAnchor = bindings?.start\n\t\t\t? Vec.From(bindings.start.props.normalizedAnchor)\n\t\t\t: null\n\t\tconst endNormalizedAnchor = bindings?.end ? Vec.From(bindings.end.props.normalizedAnchor) : null\n\n\t\tif (scaleX < 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\t\t} else if (scaleX < 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t}\n\n\t\tif (bindings.start && startNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.start.toId, {\n\t\t\t\t...bindings.start.props,\n\t\t\t\tnormalizedAnchor: startNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\t\tif (bindings.end && endNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.end.toId, {\n\t\t\t\t...bindings.end.props,\n\t\t\t\tnormalizedAnchor: endNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\n\t\tconst next = {\n\t\t\tprops: {\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tbend,\n\t\t\t},\n\t\t}\n\n\t\treturn next\n\t}\n\n\toverride onDoubleClickHandle(\n\t\tshape: TLArrowShape,\n\t\thandle: TLHandle\n\t): TLShapePartial<TLArrowShape> | void {\n\t\tswitch (handle.id) {\n\t\t\tcase ArrowHandles.Start: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadStart: shape.props.arrowheadStart === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ArrowHandles.End: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadEnd: shape.props.arrowheadEnd === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponent(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst onlySelectedShape = this.editor.getOnlySelectedShape()\n\t\tconst shouldDisplayHandles =\n\t\t\tthis.editor.isInAny(\n\t\t\t\t'select.idle',\n\t\t\t\t'select.pointing_handle',\n\t\t\t\t'select.dragging_handle',\n\t\t\t\t'select.translating',\n\t\t\t\t'arrow.dragging'\n\t\t\t) && !this.editor.getIsReadonly()\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info?.isValid) return null\n\n\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\tconst isSelected = shape.id === this.editor.getOnlySelectedShapeId()\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst showArrowLabel = isEditing || !isEmptyRichText(shape.props.richText)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer style={{ minWidth: 50, minHeight: 50 }}>\n\t\t\t\t\t<ArrowSvg\n\t\t\t\t\t\tshape={shape}\n\t\t\t\t\t\tshouldDisplayHandles={shouldDisplayHandles && onlySelectedShape?.id === shape.id}\n\t\t\t\t\t/>\n\t\t\t\t\t{shape.props.kind === 'elbow' && debugFlags.debugElbowArrows.get() && (\n\t\t\t\t\t\t<ElbowArrowDebug arrow={shape} />\n\t\t\t\t\t)}\n\t\t\t\t</SVGContainer>\n\t\t\t\t{showArrowLabel && (\n\t\t\t\t\t<RichTextLabel\n\t\t\t\t\t\tshapeId={shape.id}\n\t\t\t\t\t\ttype=\"arrow\"\n\t\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\t\tlineHeight={TEXT_PROPS.lineHeight}\n\t\t\t\t\t\talign=\"middle\"\n\t\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\t\tlabelColor={theme[shape.props.labelColor].solid}\n\t\t\t\t\t\ttextWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\tpadding={0}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: `translate(${labelPosition.box.center.x}px, ${labelPosition.box.center.y}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst isEditing = useIsEditing(shape.id)\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info) return null\n\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, info?.bindings)\n\t\tconst geometry = this.editor.getShapeGeometry<Group2d>(shape)\n\t\tconst bounds = geometry.bounds\n\t\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\t\tconst labelGeometry = isEditing || !isEmpty ? (geometry.children[1] as Rectangle2d) : null\n\n\t\tif (Vec.Equals(start, end)) return null\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\t\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\t\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\t\tconst includeClipPath =\n\t\t\t(as && info.start.arrowhead !== 'arrow') ||\n\t\t\t(ae && info.end.arrowhead !== 'arrow') ||\n\t\t\t!!labelGeometry\n\n\t\tconst labelBounds = labelGeometry ? labelGeometry.getBounds() : new Box(0, 0, 0, 0)\n\n\t\tif (isEditing && labelGeometry) {\n\t\t\treturn (\n\t\t\t\t<rect\n\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\trx={3.5 * shape.props.scale}\n\t\t\t\t\try={3.5 * shape.props.scale}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tconst clipStartArrowhead = !(\n\t\t\tinfo.start.arrowhead === 'none' || info.start.arrowhead === 'arrow'\n\t\t)\n\t\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\t\treturn (\n\t\t\t<g>\n\t\t\t\t{includeClipPath && (\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\t\thasText={!isEmpty}\n\t\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\t\tlabelBounds={labelBounds}\n\t\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</defs>\n\t\t\t\t)}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t\tWebkitClipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{/* This rect needs to be here if we're creating a mask due to an svg quirk on Chrome */}\n\t\t\t\t\t{includeClipPath && (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tx={bounds.minX - 100}\n\t\t\t\t\t\t\ty={bounds.minY - 100}\n\t\t\t\t\t\t\twidth={bounds.width + 200}\n\t\t\t\t\t\t\theight={bounds.height + 200}\n\t\t\t\t\t\t\topacity={0}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{getArrowBodyPath(\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\tinfo,\n\t\t\t\t\t\tshape.props.dash === 'draw'\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tstyle: 'draw',\n\t\t\t\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\t\t\tpasses: 1,\n\t\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\t\troundness: strokeWidth * 2,\n\t\t\t\t\t\t\t\t\tprops: { strokeWidth: undefined },\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: { style: 'solid', strokeWidth: 1, props: { strokeWidth: undefined } }\n\t\t\t\t\t)}\n\t\t\t\t</g>\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t\t{labelGeometry && (\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\t\trx={3.5}\n\t\t\t\t\t\try={3.5}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride onEditStart(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) {\n\t\t\t// editing text for the first time, so set the position to the default:\n\t\t\tconst labelPosition = getArrowLabelDefaultPosition(this.editor, shape)\n\t\t\tthis.editor.updateShape<TLArrowShape>({\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: { labelPosition },\n\t\t\t})\n\t\t}\n\t}\n\n\toverride toSvg(shape: TLArrowShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst theme = getDefaultColorTheme(ctx)\n\t\tconst scaleFactor = 1 / shape.props.scale\n\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<ArrowSvg shape={shape} shouldDisplayHandles={false} />\n\t\t\t\t<RichTextSVG\n\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\talign=\"middle\"\n\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\tlabelColor={theme[shape.props.labelColor].solid}\n\t\t\t\t\tbounds={getArrowLabelPosition(this.editor, shape)\n\t\t\t\t\t\t.box.clone()\n\t\t\t\t\t\t.expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}\n\t\t\t\t\tpadding={0}\n\t\t\t\t\tshowTextOutline={true}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [\n\t\t\tgetFillDefForCanvas(),\n\t\t\t{\n\t\t\t\tkey: `arrow:dot`,\n\t\t\t\tcomponent: ArrowheadDotDef,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: `arrow:cross`,\n\t\t\t\tcomponent: ArrowheadCrossDef,\n\t\t\t},\n\t\t]\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLArrowShape,\n\t\tendShape: TLArrowShape,\n\t\tprogress: number\n\t): TLArrowShapeProps {\n\t\treturn {\n\t\t\t...(progress > 0.5 ? endShape.props : startShape.props),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, progress),\n\t\t\tstart: {\n\t\t\t\tx: lerp(startShape.props.start.x, endShape.props.start.x, progress),\n\t\t\t\ty: lerp(startShape.props.start.y, endShape.props.start.y, progress),\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tx: lerp(startShape.props.end.x, endShape.props.end.x, progress),\n\t\t\t\ty: lerp(startShape.props.end.y, endShape.props.end.y, progress),\n\t\t\t},\n\t\t\tbend: lerp(startShape.props.bend, endShape.props.bend, progress),\n\t\t\tlabelPosition: lerp(startShape.props.labelPosition, endShape.props.labelPosition, progress),\n\t\t}\n\t}\n}\n\nexport function getArrowLength(editor: Editor, shape: TLArrowShape): number {\n\tconst info = getArrowInfo(editor, shape)!\n\n\treturn info.type === 'straight'\n\t\t? Vec.Dist(info.start.handle, info.end.handle)\n\t\t: info.type === 'arc'\n\t\t\t? Math.abs(info.handleArc.length)\n\t\t\t: info.route.distance\n}\n\nconst ArrowSvg = track(function ArrowSvg({\n\tshape,\n\tshouldDisplayHandles,\n}: {\n\tshape: TLArrowShape\n\tshouldDisplayHandles: boolean\n}) {\n\tconst editor = useEditor()\n\tconst theme = useDefaultColorTheme()\n\tconst info = getArrowInfo(editor, shape)\n\tconst isForceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\treturn editor.getZoomLevel() < 0.2\n\t\t},\n\t\t[editor]\n\t)\n\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\tconst arrowheadDotId = useSharedSafeId('arrowhead-dot')\n\tconst arrowheadCrossId = useSharedSafeId('arrowhead-cross')\n\tconst isEditing = useIsEditing(shape.id)\n\tconst geometry = editor.getShapeGeometry(shape)\n\tif (!geometry) return null\n\tconst bounds = Box.ZeroFix(geometry.bounds)\n\tconst bindings = getArrowBindings(editor, shape)\n\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\tif (!info?.isValid) return null\n\n\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\tlet handlePath: null | React.JSX.Element = null\n\n\tif (shouldDisplayHandles && (bindings.start || bindings.end)) {\n\t\thandlePath = getArrowHandlePath(info, {\n\t\t\tstyle: 'dashed',\n\t\t\tstart: 'skip',\n\t\t\tend: 'skip',\n\t\t\tlengthRatio: 2.5,\n\t\t\tstrokeWidth: 2 / editor.getZoomLevel(),\n\t\t\tprops: {\n\t\t\t\tclassName: 'tl-arrow-hint',\n\t\t\t\tmarkerStart: bindings.start\n\t\t\t\t\t? bindings.start.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.start.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\tmarkerEnd: bindings.end\n\t\t\t\t\t? bindings.end.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.end.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\topacity: 0.16,\n\t\t\t},\n\t\t})\n\t}\n\n\tconst labelPosition = getArrowLabelPosition(editor, shape)\n\n\tconst clipStartArrowhead = !(info.start.arrowhead === 'none' || info.start.arrowhead === 'arrow')\n\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\treturn (\n\t\t<>\n\t\t\t{/* Yep */}\n\t\t\t<defs>\n\t\t\t\t<clipPath id={clipPathId}>\n\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\thasText={isEditing || !isEmpty}\n\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\tlabelBounds={labelPosition.box}\n\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t/>\n\t\t\t\t</clipPath>\n\t\t\t</defs>\n\t\t\t<g\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={theme[shape.props.color].solid}\n\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tpointerEvents=\"none\"\n\t\t\t>\n\t\t\t\t{handlePath}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: `url(#${clipPathId})`,\n\t\t\t\t\t\tWebkitClipPath: `url(#${clipPathId})`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(bounds.minX - 100)}\n\t\t\t\t\t\ty={toDomPrecision(bounds.minY - 100)}\n\t\t\t\t\t\twidth={toDomPrecision(bounds.width + 200)}\n\t\t\t\t\t\theight={toDomPrecision(bounds.height + 200)}\n\t\t\t\t\t\topacity={0}\n\t\t\t\t\t/>\n\t\t\t\t\t{getArrowBodyPath(shape, info, {\n\t\t\t\t\t\tstyle: shape.props.dash,\n\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\tforceSolid: isForceSolid,\n\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t})}\n\t\t\t\t</g>\n\t\t\t\t{as && clipStartArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={as}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{ae && clipEndArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={ae}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t</g>\n\t\t</>\n\t)\n})\n\nfunction ArrowClipPath({\n\tradius,\n\thasText,\n\tbounds,\n\tlabelBounds,\n\tas,\n\tae,\n}: {\n\tradius: number\n\thasText: boolean\n\tbounds: Box\n\tlabelBounds: Box\n\tas: string\n\tae: string\n}) {\n\tconst path = useMemo(() => {\n\t\t// The direction in which we create the different path parts is important, as it determines what gets clipped.\n\t\t// See the description on the directions in the non-zero fill rule example:\n\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule#nonzero\n\t\tconst path = new PathBuilder()\n\n\t\t// We create this one in the clockwise direction\n\t\tpath\n\t\t\t.moveTo(bounds.left - 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.bottom + 100)\n\t\t\t.lineTo(bounds.left - 100, bounds.bottom + 100)\n\t\t\t.close()\n\n\t\tif (hasText) {\n\t\t\t// We create this one in the counter-clockwise direction, which cuts out the label box\n\t\t\tpath\n\t\t\t\t.moveTo(labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.lineTo(labelBounds.left, labelBounds.bottom - radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left + radius, labelBounds.bottom)\n\t\t\t\t.lineTo(labelBounds.right - radius, labelBounds.bottom)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right, labelBounds.bottom - radius)\n\t\t\t\t.lineTo(labelBounds.right, labelBounds.top + radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right - radius, labelBounds.top)\n\t\t\t\t.lineTo(labelBounds.left + radius, labelBounds.top)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.close()\n\t\t}\n\n\t\treturn path.toD()\n\t}, [\n\t\tradius,\n\t\thasText,\n\t\tbounds.bottom,\n\t\tbounds.left,\n\t\tbounds.right,\n\t\tbounds.top,\n\t\tlabelBounds.bottom,\n\t\tlabelBounds.left,\n\t\tlabelBounds.right,\n\t\tlabelBounds.top,\n\t])\n\n\t// We also append the arrowhead paths to the clip path, so that we also clip the arrowheads\n\treturn <path d={`${path}${as}${ae}`} />\n}\n\nconst shapeAtTranslationStart = new WeakMap<\n\tTLArrowShape,\n\t{\n\t\tpagePosition: Vec\n\t\tterminalBindings: Record<\n\t\t\t'start' | 'end',\n\t\t\t{\n\t\t\t\tpagePosition: Vec\n\t\t\t\tshapePosition: Vec\n\t\t\t\tbinding: TLArrowBinding\n\t\t\t} | null\n\t\t>\n\t}\n>()\n\nfunction ArrowheadDotDef() {\n\tconst id = useSharedSafeId('arrowhead-dot')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"0\">\n\t\t\t<circle cx=\"3\" cy=\"3\" r=\"2\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\nfunction ArrowheadCrossDef() {\n\tconst id = useSharedSafeId('arrowhead-cross')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"auto\">\n\t\t\t<line x1=\"1.5\" y1=\"1.5\" x2=\"4.5\" y2=\"4.5\" strokeDasharray=\"100%\" />\n\t\t\t<line x1=\"1.5\" y1=\"4.5\" x2=\"4.5\" y2=\"1.5\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\n/**\n * Take 2 angles and return true if they are approximately parallel. Angle that point in the same\n * (or opposite) directions are considered parallel. This also handles wrap around - e.g. 0, \u03C0, and\n * 2\u03C0 are all considered parallel.\n */\nfunction anglesAreApproximatelyParallel(a: number, b: number, tolerance = 0.0001) {\n\tconst diff = Math.abs(a - b)\n\n\tconst isParallel = diff < tolerance\n\tconst isFlippedParallel = Math.abs(diff - Math.PI) < tolerance\n\tconst is360Parallel = Math.abs(diff - PI2) < tolerance\n\n\treturn { isParallel: isParallel || is360Parallel, isFlippedParallel }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tArc2d,\n\tBox,\n\tEMPTY_ARRAY,\n\tEdge2d,\n\tEditor,\n\tGeometry2d,\n\tGroup2d,\n\tIndexKey,\n\tPI2,\n\tPolyline2d,\n\tRectangle2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLArrowBinding,\n\tTLArrowBindingProps,\n\tTLArrowShape,\n\tTLArrowShapeProps,\n\tTLHandle,\n\tTLHandleDragInfo,\n\tTLResizeInfo,\n\tTLShapePartial,\n\tTLShapeUtilCanBeLaidOutOpts,\n\tTLShapeUtilCanBindOpts,\n\tTLShapeUtilCanvasSvgDef,\n\tVec,\n\tWeakCache,\n\tarrowShapeMigrations,\n\tarrowShapeProps,\n\tclamp,\n\tdebugFlags,\n\texhaustiveSwitchError,\n\tgetColorValue,\n\tgetDefaultColorTheme,\n\tgetFontsFromRichText,\n\tinvLerp,\n\tlerp,\n\tmapObjectMapValues,\n\tmaybeSnapToGrid,\n\tstructuredClone,\n\ttoDomPrecision,\n\ttoRichText,\n\ttrack,\n\tuseEditor,\n\tuseIsEditing,\n\tuseSharedSafeId,\n\tuseValue,\n} from '@tldraw/editor'\nimport React, { useMemo } from 'react'\nimport { updateArrowTerminal } from '../../bindings/arrow/ArrowBindingUtil'\nimport { isEmptyRichText, renderPlaintextFromRichText } from '../../utils/text/richText'\nimport { PathBuilder } from '../shared/PathBuilder'\nimport { RichTextLabel, RichTextSVG } from '../shared/RichTextLabel'\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { ARROW_LABEL_PADDING, STROKE_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getArrowBodyPath, getArrowHandlePath } from './ArrowPath'\nimport { ArrowShapeOptions } from './arrow-types'\nimport {\n\tgetArrowLabelDefaultPosition,\n\tgetArrowLabelFontSize,\n\tgetArrowLabelPosition,\n} from './arrowLabel'\nimport { updateArrowTargetState } from './arrowTargetState'\nimport { getArrowheadPathForType } from './arrowheads'\nimport { ElbowArrowDebug } from './elbow/ElbowArrowDebug'\nimport { ElbowArrowAxes } from './elbow/definitions'\nimport { getElbowArrowSnapLines, perpDistanceToLineAngle } from './elbow/elbowArrowSnapLines'\nimport {\n\tTLArrowBindings,\n\tcreateOrUpdateArrowBinding,\n\tgetArrowBindings,\n\tgetArrowInfo,\n\tgetArrowTerminalsInArrowSpace,\n\tremoveArrowBinding,\n} from './shared'\n\nenum ArrowHandles {\n\tStart = 'start',\n\tMiddle = 'middle',\n\tEnd = 'end',\n}\n\n/** @public */\nexport class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {\n\tstatic override type = 'arrow' as const\n\tstatic override props = arrowShapeProps\n\tstatic override migrations = arrowShapeMigrations\n\n\toverride options: ArrowShapeOptions = {\n\t\texpandElbowLegLength: {\n\t\t\ts: 28,\n\t\t\tm: 36,\n\t\t\tl: 44,\n\t\t\txl: 66,\n\t\t},\n\t\tminElbowLegLength: {\n\t\t\ts: STROKE_SIZES.s * 3,\n\t\t\tm: STROKE_SIZES.m * 3,\n\t\t\tl: STROKE_SIZES.l * 3,\n\t\t\txl: STROKE_SIZES.xl * 3,\n\t\t},\n\t\tminElbowHandleDistance: 16,\n\n\t\tarcArrowCenterSnapDistance: 16,\n\t\telbowArrowCenterSnapDistance: 24,\n\t\telbowArrowEdgeSnapDistance: 20,\n\t\telbowArrowPointSnapDistance: 24,\n\t\telbowArrowAxisSnapDistance: 16,\n\n\t\tlabelCenterSnapDistance: 10,\n\n\t\telbowMidpointSnapDistance: 10,\n\t\telbowMinSegmentLengthToShowMidpointHandle: 20,\n\n\t\thoverPreciseTimeout: 600,\n\t\tpointingPreciseTimeout: 320,\n\n\t\tshouldBeExact: (editor: Editor) => editor.inputs.altKey,\n\t\tshouldIgnoreTargets: (editor: Editor) => editor.inputs.ctrlKey,\n\t}\n\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canBind({ toShapeType }: TLShapeUtilCanBindOpts<TLArrowShape>): boolean {\n\t\t// bindings can go from arrows to shapes, but not from shapes to arrows\n\t\treturn toShapeType !== 'arrow'\n\t}\n\toverride canSnap() {\n\t\treturn false\n\t}\n\toverride hideResizeHandles() {\n\t\treturn true\n\t}\n\toverride hideRotateHandle() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsBg() {\n\t\treturn true\n\t}\n\toverride hideSelectionBoundsFg() {\n\t\treturn true\n\t}\n\n\toverride canBeLaidOut(shape: TLArrowShape, info: TLShapeUtilCanBeLaidOutOpts) {\n\t\tif (info.type === 'flip') {\n\t\t\t// If we don't have this then the flip will be non-idempotent; that is, the flip will be multipotent, varipotent, or perhaps even omni-potent... and we can't have that\n\t\t\tconst bindings = getArrowBindings(this.editor, shape)\n\t\t\tconst { start, end } = bindings\n\t\t\tconst { shapes = [] } = info\n\t\t\tif (start && !shapes.find((s) => s.id === start.toId)) return false\n\t\t\tif (end && !shapes.find((s) => s.id === end.toId)) return false\n\t\t}\n\t\treturn true\n\t}\n\n\toverride getFontFaces(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) return EMPTY_ARRAY\n\n\t\treturn getFontsFromRichText(this.editor, shape.props.richText, {\n\t\t\tfamily: `tldraw_${shape.props.font}`,\n\t\t\tweight: 'normal',\n\t\t\tstyle: 'normal',\n\t\t})\n\t}\n\n\toverride getDefaultProps(): TLArrowShape['props'] {\n\t\treturn {\n\t\t\tkind: 'arc',\n\t\t\telbowMidPoint: 0.5,\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tfill: 'none',\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tbend: 0,\n\t\t\tstart: { x: 0, y: 0 },\n\t\t\tend: { x: 2, y: 0 },\n\t\t\tarrowheadStart: 'none',\n\t\t\tarrowheadEnd: 'arrow',\n\t\t\trichText: toRichText(''),\n\t\t\tlabelPosition: 0.5,\n\t\t\tfont: 'draw',\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLArrowShape) {\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst debugGeom: Geometry2d[] = []\n\n\t\tconst bodyGeom =\n\t\t\tinfo.type === 'straight'\n\t\t\t\t? new Edge2d({\n\t\t\t\t\t\tstart: Vec.From(info.start.point),\n\t\t\t\t\t\tend: Vec.From(info.end.point),\n\t\t\t\t\t})\n\t\t\t\t: info.type === 'arc'\n\t\t\t\t\t? new Arc2d({\n\t\t\t\t\t\t\tcenter: Vec.Cast(info.handleArc.center),\n\t\t\t\t\t\t\tstart: Vec.Cast(info.start.point),\n\t\t\t\t\t\t\tend: Vec.Cast(info.end.point),\n\t\t\t\t\t\t\tsweepFlag: info.bodyArc.sweepFlag,\n\t\t\t\t\t\t\tlargeArcFlag: info.bodyArc.largeArcFlag,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Polyline2d({ points: info.route.points })\n\n\t\tlet labelGeom\n\t\tif (isEditing || !isEmptyRichText(shape.props.richText)) {\n\t\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\t\tif (debugFlags.debugGeometry.get()) {\n\t\t\t\tdebugGeom.push(...labelPosition.debugGeom)\n\t\t\t}\n\t\t\tlabelGeom = new Rectangle2d({\n\t\t\t\tx: labelPosition.box.x,\n\t\t\t\ty: labelPosition.box.y,\n\t\t\t\twidth: labelPosition.box.w,\n\t\t\t\theight: labelPosition.box.h,\n\t\t\t\tisFilled: true,\n\t\t\t\tisLabel: true,\n\t\t\t})\n\t\t}\n\n\t\treturn new Group2d({\n\t\t\tchildren: [...(labelGeom ? [bodyGeom, labelGeom] : [bodyGeom]), ...debugGeom],\n\t\t})\n\t}\n\n\toverride getHandles(shape: TLArrowShape): TLHandle[] {\n\t\tconst info = getArrowInfo(this.editor, shape)!\n\n\t\tconst handles: TLHandle[] = [\n\t\t\t{\n\t\t\t\tid: ArrowHandles.Start,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a1' as IndexKey,\n\t\t\t\tx: info.start.handle.x,\n\t\t\t\ty: info.start.handle.y,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: ArrowHandles.End,\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a3' as IndexKey,\n\t\t\t\tx: info.end.handle.x,\n\t\t\t\ty: info.end.handle.y,\n\t\t\t},\n\t\t]\n\n\t\tif (shape.props.kind === 'arc' && (info.type === 'straight' || info.type === 'arc')) {\n\t\t\thandles.push({\n\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\ttype: 'virtual',\n\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\tx: info.middle.x,\n\t\t\t\ty: info.middle.y,\n\t\t\t})\n\t\t}\n\n\t\tif (shape.props.kind === 'elbow' && info.type === 'elbow' && info.route.midpointHandle) {\n\t\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t\tconst segmentStart = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentStart)\n\t\t\tconst segmentEnd = shapePageTransform.applyToPoint(info.route.midpointHandle.segmentEnd)\n\t\t\tconst segmentLength = Vec.Dist(segmentStart, segmentEnd) * this.editor.getZoomLevel()\n\n\t\t\tif (segmentLength > this.options.elbowMinSegmentLengthToShowMidpointHandle) {\n\t\t\t\thandles.push({\n\t\t\t\t\tid: ArrowHandles.Middle,\n\t\t\t\t\ttype: 'vertex',\n\t\t\t\t\tindex: 'a2' as IndexKey,\n\t\t\t\t\tx: info.route.midpointHandle.point.x,\n\t\t\t\t\ty: info.route.midpointHandle.point.y,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn handles\n\t}\n\n\toverride getText(shape: TLArrowShape) {\n\t\treturn renderPlaintextFromRichText(this.editor, shape.props.richText)\n\t}\n\n\toverride onHandleDrag(shape: TLArrowShape, info: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst handleId = info.handle.id as ArrowHandles\n\t\tswitch (handleId) {\n\t\t\tcase ArrowHandles.Middle:\n\t\t\t\tswitch (shape.props.kind) {\n\t\t\t\t\tcase 'arc':\n\t\t\t\t\t\treturn this.onArcMidpointHandleDrag(shape, info)\n\t\t\t\t\tcase 'elbow':\n\t\t\t\t\t\treturn this.onElbowMidpointHandleDrag(shape, info)\n\t\t\t\t\tdefault:\n\t\t\t\t\t\texhaustiveSwitchError(shape.props.kind)\n\t\t\t\t}\n\t\t\tcase ArrowHandles.Start:\n\t\t\tcase ArrowHandles.End:\n\t\t\t\treturn this.onTerminalHandleDrag(shape, info, handleId)\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(handleId)\n\t\t}\n\t}\n\n\tprivate onArcMidpointHandleDrag(shape: TLArrowShape, { handle }: TLHandleDragInfo<TLArrowShape>) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// Bending the arrow...\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst delta = Vec.Sub(end, start)\n\t\tconst v = Vec.Per(delta)\n\n\t\tconst med = Vec.Med(end, start)\n\t\tconst A = Vec.Sub(med, v)\n\t\tconst B = Vec.Add(med, v)\n\n\t\tconst point = Vec.NearestPointOnLineSegment(A, B, handle, false)\n\t\tlet bend = Vec.Dist(point, med)\n\t\tif (Vec.Clockwise(point, end, med)) bend *= -1\n\t\treturn { id: shape.id, type: shape.type, props: { bend } }\n\t}\n\n\tprivate onElbowMidpointHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle }: TLHandleDragInfo<TLArrowShape>\n\t) {\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (info?.type !== 'elbow') return\n\n\t\tconst shapeToPageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst handlePagePoint = shapeToPageTransform.applyToPoint(handle)\n\t\tconst axisName = info.route.midpointHandle?.axis\n\t\tif (!axisName) return\n\t\tconst axis = ElbowArrowAxes[axisName]\n\n\t\tconst midRange = info.elbow[axis.midRange]\n\t\tif (!midRange) return\n\n\t\t// We're snapping against a list of parallel lines. The way we do this is to calculate the\n\t\t// angle of the line we're snapping to...\n\t\tlet angle = Vec.Angle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 0)),\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(0, 1))\n\t\t)\n\t\tif (angle < 0) angle += Math.PI\n\n\t\t// ...then calculate the perpendicular distance from the origin to the (infinite) line in\n\t\t// question. This returns a signed distance - lines \"behind\" the origin are negative.\n\t\tconst handlePoint = perpDistanceToLineAngle(handlePagePoint, angle)\n\n\t\t// As we're only ever moving along one dimension, we can use this perpendicular distance for\n\t\t// all of our snapping calculations.\n\t\tconst loPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.lo, 0)),\n\t\t\tangle\n\t\t)\n\t\tconst hiPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(midRange.hi, 0)),\n\t\t\tangle\n\t\t)\n\n\t\t// we want to snap to certain points. the maximum distance at which a snap will occur is\n\t\t// relative to the zoom level:\n\t\tconst maxSnapDistance = this.options.elbowMidpointSnapDistance / this.editor.getZoomLevel()\n\n\t\t// we snap to the midpoint of the range by default\n\t\tconst midPoint = perpDistanceToLineAngle(\n\t\t\tshapeToPageTransform.applyToPoint(axis.v(lerp(midRange.lo, midRange.hi, 0.5), 0)),\n\t\t\tangle\n\t\t)\n\n\t\tlet snapPoint = midPoint\n\t\tlet snapDistance = Math.abs(midPoint - handlePoint)\n\n\t\t// then we check all the other arrows that are on-screen.\n\t\tfor (const [snapAngle, snapLines] of getElbowArrowSnapLines(this.editor)) {\n\t\t\tconst { isParallel, isFlippedParallel } = anglesAreApproximatelyParallel(angle, snapAngle)\n\t\t\tif (isParallel || isFlippedParallel) {\n\t\t\t\tfor (const snapLine of snapLines) {\n\t\t\t\t\tconst doesShareStartIntersection =\n\t\t\t\t\t\tsnapLine.startBoundShapeId &&\n\t\t\t\t\t\t(snapLine.startBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.startBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tconst doesShareEndIntersection =\n\t\t\t\t\t\tsnapLine.endBoundShapeId &&\n\t\t\t\t\t\t(snapLine.endBoundShapeId === info.bindings.start?.toId ||\n\t\t\t\t\t\t\tsnapLine.endBoundShapeId === info.bindings.end?.toId)\n\n\t\t\t\t\tif (!doesShareStartIntersection && !doesShareEndIntersection) continue\n\n\t\t\t\t\tconst point = isFlippedParallel ? -snapLine.perpDistance : snapLine.perpDistance\n\t\t\t\t\tconst distance = Math.abs(point - handlePoint)\n\t\t\t\t\tif (distance < snapDistance) {\n\t\t\t\t\t\tsnapPoint = point\n\t\t\t\t\t\tsnapDistance = distance\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (snapDistance > maxSnapDistance) {\n\t\t\tsnapPoint = handlePoint\n\t\t}\n\n\t\tconst newMid = clamp(invLerp(loPoint, hiPoint, snapPoint), 0, 1)\n\n\t\treturn {\n\t\t\tid: shape.id,\n\t\t\ttype: shape.type,\n\t\t\tprops: {\n\t\t\t\telbowMidPoint: newMid,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate onTerminalHandleDrag(\n\t\tshape: TLArrowShape,\n\t\t{ handle, isPrecise }: TLHandleDragInfo<TLArrowShape>,\n\t\thandleId: ArrowHandles.Start | ArrowHandles.End\n\t) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\n\t\tconst currentBinding = bindings[handleId]\n\n\t\tconst oppositeHandleId = handleId === ArrowHandles.Start ? ArrowHandles.End : ArrowHandles.Start\n\t\tconst oppositeBinding = bindings[oppositeHandleId]\n\n\t\tconst targetInfo = updateArrowTargetState({\n\t\t\teditor: this.editor,\n\t\t\tpointInPageSpace: this.editor.getShapePageTransform(shape.id)!.applyToPoint(handle),\n\t\t\tarrow: shape,\n\t\t\tisPrecise: isPrecise,\n\t\t\tcurrentBinding,\n\t\t\toppositeBinding,\n\t\t})\n\n\t\tif (!targetInfo) {\n\t\t\t// todo: maybe double check that this isn't equal to the other handle too?\n\t\t\tremoveArrowBinding(this.editor, shape, handleId)\n\t\t\tconst newPoint = maybeSnapToGrid(new Vec(handle.x, handle.y), this.editor)\n\t\t\tupdate.props![handleId] = {\n\t\t\t\tx: newPoint.x,\n\t\t\t\ty: newPoint.y,\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\t// we've got a target! the handle is being dragged over a shape, bind to it\n\t\tconst bindingProps: TLArrowBindingProps = {\n\t\t\tterminal: handleId,\n\t\t\tnormalizedAnchor: targetInfo.normalizedAnchor,\n\t\t\tisPrecise: targetInfo.isPrecise,\n\t\t\tisExact: targetInfo.isExact,\n\t\t\tsnap: targetInfo.snap,\n\t\t}\n\n\t\tcreateOrUpdateArrowBinding(this.editor, shape, targetInfo.target.id, bindingProps)\n\n\t\tconst newBindings = getArrowBindings(this.editor, shape)\n\t\tif (newBindings.start && newBindings.end && newBindings.start.toId === newBindings.end.toId) {\n\t\t\tif (\n\t\t\t\tVec.Equals(newBindings.start.props.normalizedAnchor, newBindings.end.props.normalizedAnchor)\n\t\t\t) {\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newBindings.end.toId, {\n\t\t\t\t\t...newBindings.end.props,\n\t\t\t\t\tnormalizedAnchor: {\n\t\t\t\t\t\tx: newBindings.end.props.normalizedAnchor.x + 0.05,\n\t\t\t\t\t\ty: newBindings.end.props.normalizedAnchor.y,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn update\n\t}\n\n\toverride onTranslateStart(shape: TLArrowShape) {\n\t\tconst bindings = getArrowBindings(this.editor, shape)\n\n\t\t// ...if the user is dragging ONLY this arrow, for elbow shapes, we can't maintain the bindings well just yet so we remove them entirely\n\t\tif (shape.props.kind === 'elbow' && this.editor.getOnlySelectedShapeId() === shape.id) {\n\t\t\tconst info = getArrowInfo(this.editor, shape)\n\t\t\tif (!info) return\n\t\t\tconst update: TLShapePartial<TLArrowShape> = { id: shape.id, type: 'arrow', props: {} }\n\t\t\tif (bindings.start) {\n\t\t\t\tupdate.props!.start = { x: info.start.point.x, y: info.start.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'start')\n\t\t\t}\n\t\t\tif (bindings.end) {\n\t\t\t\tupdate.props!.end = { x: info.end.point.x, y: info.end.point.y }\n\t\t\t\tremoveArrowBinding(this.editor, shape, 'end')\n\t\t\t}\n\t\t\treturn update\n\t\t}\n\n\t\tconst terminalsInArrowSpace = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\n\t\t// If at least one bound shape is in the selection, do nothing;\n\t\t// If no bound shapes are in the selection, unbind any bound shapes\n\n\t\tconst selectedShapeIds = this.editor.getSelectedShapeIds()\n\n\t\tif (\n\t\t\t(bindings.start &&\n\t\t\t\t(selectedShapeIds.includes(bindings.start.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.start.toId))) ||\n\t\t\t(bindings.end &&\n\t\t\t\t(selectedShapeIds.includes(bindings.end.toId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(bindings.end.toId)))\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\t// When we start translating shapes, record where their bindings were in page space so we\n\t\t// can maintain them as we translate the arrow\n\t\tshapeAtTranslationStart.set(shape, {\n\t\t\tpagePosition: shapePageTransform.applyToPoint(shape),\n\t\t\tterminalBindings: mapObjectMapValues(terminalsInArrowSpace, (terminalName, point) => {\n\t\t\t\tconst binding = bindings[terminalName]\n\t\t\t\tif (!binding) return null\n\t\t\t\treturn {\n\t\t\t\t\tbinding,\n\t\t\t\t\tshapePosition: point,\n\t\t\t\t\tpagePosition: shapePageTransform.applyToPoint(point),\n\t\t\t\t}\n\t\t\t}),\n\t\t})\n\n\t\t// update arrow terminal bindings eagerly to make sure the arrows unbind nicely when translating\n\t\tif (bindings.start) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'start',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t\tshape = this.editor.getShape(shape.id) as TLArrowShape\n\t\t}\n\t\tif (bindings.end) {\n\t\t\tupdateArrowTerminal({\n\t\t\t\teditor: this.editor,\n\t\t\t\tarrow: shape,\n\t\t\t\tterminal: 'end',\n\t\t\t\tuseHandle: true,\n\t\t\t})\n\t\t}\n\n\t\tfor (const handleName of [ArrowHandles.Start, ArrowHandles.End] as const) {\n\t\t\tconst binding = bindings[handleName]\n\t\t\tif (!binding) continue\n\n\t\t\tthis.editor.updateBinding({\n\t\t\t\t...binding,\n\t\t\t\tprops: { ...binding.props, isPrecise: true },\n\t\t\t})\n\t\t}\n\n\t\treturn\n\t}\n\n\toverride onTranslate(initialShape: TLArrowShape, shape: TLArrowShape) {\n\t\tconst atTranslationStart = shapeAtTranslationStart.get(initialShape)\n\t\tif (!atTranslationStart) return\n\n\t\tconst shapePageTransform = this.editor.getShapePageTransform(shape.id)!\n\t\tconst pageDelta = Vec.Sub(\n\t\t\tshapePageTransform.applyToPoint(shape),\n\t\t\tatTranslationStart.pagePosition\n\t\t)\n\n\t\tfor (const terminalBinding of Object.values(atTranslationStart.terminalBindings)) {\n\t\t\tif (!terminalBinding) continue\n\n\t\t\tconst newPagePoint = Vec.Add(terminalBinding.pagePosition, Vec.Mul(pageDelta, 0.5))\n\t\t\tconst newTarget = this.editor.getShapeAtPoint(newPagePoint, {\n\t\t\t\thitInside: true,\n\t\t\t\thitFrameInside: true,\n\t\t\t\tmargin: 0,\n\t\t\t\tfilter: (targetShape) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t!targetShape.isLocked &&\n\t\t\t\t\t\tthis.editor.canBindShapes({ fromShape: shape, toShape: targetShape, binding: 'arrow' })\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (newTarget?.id === terminalBinding.binding.toId) {\n\t\t\t\tconst targetBounds = Box.ZeroFix(this.editor.getShapeGeometry(newTarget).bounds)\n\t\t\t\tconst pointInTargetSpace = this.editor.getPointInShapeSpace(newTarget, newPagePoint)\n\t\t\t\tconst normalizedAnchor = {\n\t\t\t\t\tx: (pointInTargetSpace.x - targetBounds.minX) / targetBounds.width,\n\t\t\t\t\ty: (pointInTargetSpace.y - targetBounds.minY) / targetBounds.height,\n\t\t\t\t}\n\t\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, newTarget.id, {\n\t\t\t\t\t...terminalBinding.binding.props,\n\t\t\t\t\tnormalizedAnchor,\n\t\t\t\t\tisPrecise: true,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tremoveArrowBinding(this.editor, shape, terminalBinding.binding.props.terminal)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate readonly _resizeInitialBindings = new WeakCache<TLArrowShape, TLArrowBindings>()\n\n\toverride onResize(shape: TLArrowShape, info: TLResizeInfo<TLArrowShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst bindings = this._resizeInitialBindings.get(shape, () =>\n\t\t\tgetArrowBindings(this.editor, shape)\n\t\t)\n\t\tconst terminals = getArrowTerminalsInArrowSpace(this.editor, shape, bindings)\n\n\t\tconst { start, end } = structuredClone<TLArrowShape['props']>(shape.props)\n\t\tlet { bend } = shape.props\n\n\t\t// Rescale start handle if it's not bound to a shape\n\t\tif (!bindings.start) {\n\t\t\tstart.x = terminals.start.x * scaleX\n\t\t\tstart.y = terminals.start.y * scaleY\n\t\t}\n\n\t\t// Rescale end handle if it's not bound to a shape\n\t\tif (!bindings.end) {\n\t\t\tend.x = terminals.end.x * scaleX\n\t\t\tend.y = terminals.end.y * scaleY\n\t\t}\n\n\t\t// todo: we should only change the normalized anchor positions\n\t\t// of the shape's handles if the bound shape is also being resized\n\n\t\tconst mx = Math.abs(scaleX)\n\t\tconst my = Math.abs(scaleY)\n\n\t\tconst startNormalizedAnchor = bindings?.start\n\t\t\t? Vec.From(bindings.start.props.normalizedAnchor)\n\t\t\t: null\n\t\tconst endNormalizedAnchor = bindings?.end ? Vec.From(bindings.end.props.normalizedAnchor) : null\n\n\t\tif (scaleX < 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\t\t} else if (scaleX < 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (startNormalizedAnchor) {\n\t\t\t\tstartNormalizedAnchor.x = 1 - startNormalizedAnchor.x\n\t\t\t\tstartNormalizedAnchor.y = 1 - startNormalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (endNormalizedAnchor) {\n\t\t\t\tendNormalizedAnchor.x = 1 - endNormalizedAnchor.x\n\t\t\t\tendNormalizedAnchor.y = 1 - endNormalizedAnchor.y\n\t\t\t}\n\t\t}\n\n\t\tif (bindings.start && startNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.start.toId, {\n\t\t\t\t...bindings.start.props,\n\t\t\t\tnormalizedAnchor: startNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\t\tif (bindings.end && endNormalizedAnchor) {\n\t\t\tcreateOrUpdateArrowBinding(this.editor, shape, bindings.end.toId, {\n\t\t\t\t...bindings.end.props,\n\t\t\t\tnormalizedAnchor: endNormalizedAnchor.toJson(),\n\t\t\t})\n\t\t}\n\n\t\tconst next = {\n\t\t\tprops: {\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tbend,\n\t\t\t},\n\t\t}\n\n\t\treturn next\n\t}\n\n\toverride onDoubleClickHandle(\n\t\tshape: TLArrowShape,\n\t\thandle: TLHandle\n\t): TLShapePartial<TLArrowShape> | void {\n\t\tswitch (handle.id) {\n\t\t\tcase ArrowHandles.Start: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadStart: shape.props.arrowheadStart === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ArrowHandles.End: {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadEnd: shape.props.arrowheadEnd === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponent(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst onlySelectedShape = this.editor.getOnlySelectedShape()\n\t\tconst shouldDisplayHandles =\n\t\t\tthis.editor.isInAny(\n\t\t\t\t'select.idle',\n\t\t\t\t'select.pointing_handle',\n\t\t\t\t'select.dragging_handle',\n\t\t\t\t'select.translating',\n\t\t\t\t'arrow.dragging'\n\t\t\t) && !this.editor.getIsReadonly()\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info?.isValid) return null\n\n\t\tconst labelPosition = getArrowLabelPosition(this.editor, shape)\n\t\tconst isSelected = shape.id === this.editor.getOnlySelectedShapeId()\n\t\tconst isEditing = this.editor.getEditingShapeId() === shape.id\n\t\tconst showArrowLabel = isEditing || !isEmptyRichText(shape.props.richText)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer style={{ minWidth: 50, minHeight: 50 }}>\n\t\t\t\t\t<ArrowSvg\n\t\t\t\t\t\tshape={shape}\n\t\t\t\t\t\tshouldDisplayHandles={shouldDisplayHandles && onlySelectedShape?.id === shape.id}\n\t\t\t\t\t/>\n\t\t\t\t\t{shape.props.kind === 'elbow' && debugFlags.debugElbowArrows.get() && (\n\t\t\t\t\t\t<ElbowArrowDebug arrow={shape} />\n\t\t\t\t\t)}\n\t\t\t\t</SVGContainer>\n\t\t\t\t{showArrowLabel && (\n\t\t\t\t\t<RichTextLabel\n\t\t\t\t\t\tshapeId={shape.id}\n\t\t\t\t\t\ttype=\"arrow\"\n\t\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\t\tlineHeight={TEXT_PROPS.lineHeight}\n\t\t\t\t\t\talign=\"middle\"\n\t\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\t\tlabelColor={getColorValue(theme, shape.props.labelColor, 'solid')}\n\t\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\t\ttextWidth={labelPosition.box.w - ARROW_LABEL_PADDING * 2 * shape.props.scale}\n\t\t\t\t\t\tisSelected={isSelected}\n\t\t\t\t\t\tpadding={0}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttransform: `translate(${labelPosition.box.center.x}px, ${labelPosition.box.center.y}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLArrowShape) {\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst isEditing = useIsEditing(shape.id)\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\n\t\tconst info = getArrowInfo(this.editor, shape)\n\t\tif (!info) return null\n\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape, info?.bindings)\n\t\tconst geometry = this.editor.getShapeGeometry<Group2d>(shape)\n\t\tconst bounds = geometry.bounds\n\t\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\t\tconst labelGeometry = isEditing || !isEmpty ? (geometry.children[1] as Rectangle2d) : null\n\n\t\tif (Vec.Equals(start, end)) return null\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\t\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\t\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\t\tconst includeClipPath =\n\t\t\t(as && info.start.arrowhead !== 'arrow') ||\n\t\t\t(ae && info.end.arrowhead !== 'arrow') ||\n\t\t\t!!labelGeometry\n\n\t\tconst labelBounds = labelGeometry ? labelGeometry.getBounds() : new Box(0, 0, 0, 0)\n\n\t\tif (isEditing && labelGeometry) {\n\t\t\treturn (\n\t\t\t\t<rect\n\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\trx={3.5 * shape.props.scale}\n\t\t\t\t\try={3.5 * shape.props.scale}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tconst clipStartArrowhead = !(\n\t\t\tinfo.start.arrowhead === 'none' || info.start.arrowhead === 'arrow'\n\t\t)\n\t\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\t\treturn (\n\t\t\t<g>\n\t\t\t\t{includeClipPath && (\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\t\thasText={!isEmpty}\n\t\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\t\tlabelBounds={labelBounds}\n\t\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</defs>\n\t\t\t\t)}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t\tWebkitClipPath: includeClipPath ? `url(#${clipPathId})` : undefined,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{/* This rect needs to be here if we're creating a mask due to an svg quirk on Chrome */}\n\t\t\t\t\t{includeClipPath && (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tx={bounds.minX - 100}\n\t\t\t\t\t\t\ty={bounds.minY - 100}\n\t\t\t\t\t\t\twidth={bounds.width + 200}\n\t\t\t\t\t\t\theight={bounds.height + 200}\n\t\t\t\t\t\t\topacity={0}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{getArrowBodyPath(\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\tinfo,\n\t\t\t\t\t\tshape.props.dash === 'draw'\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tstyle: 'draw',\n\t\t\t\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t\t\t\tpasses: 1,\n\t\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\t\troundness: strokeWidth * 2,\n\t\t\t\t\t\t\t\t\tprops: { strokeWidth: undefined },\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: { style: 'solid', strokeWidth: 1, props: { strokeWidth: undefined } }\n\t\t\t\t\t)}\n\t\t\t\t</g>\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t\t{labelGeometry && (\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(labelBounds.x)}\n\t\t\t\t\t\ty={toDomPrecision(labelBounds.y)}\n\t\t\t\t\t\twidth={labelBounds.w}\n\t\t\t\t\t\theight={labelBounds.h}\n\t\t\t\t\t\trx={3.5}\n\t\t\t\t\t\try={3.5}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride onEditStart(shape: TLArrowShape) {\n\t\tif (isEmptyRichText(shape.props.richText)) {\n\t\t\t// editing text for the first time, so set the position to the default:\n\t\t\tconst labelPosition = getArrowLabelDefaultPosition(this.editor, shape)\n\t\t\tthis.editor.updateShape<TLArrowShape>({\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: { labelPosition },\n\t\t\t})\n\t\t}\n\t}\n\n\toverride toSvg(shape: TLArrowShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst theme = getDefaultColorTheme(ctx)\n\t\tconst scaleFactor = 1 / shape.props.scale\n\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<ArrowSvg shape={shape} shouldDisplayHandles={false} />\n\t\t\t\t<RichTextSVG\n\t\t\t\t\tfontSize={getArrowLabelFontSize(shape)}\n\t\t\t\t\tfont={shape.props.font}\n\t\t\t\t\talign=\"middle\"\n\t\t\t\t\tverticalAlign=\"middle\"\n\t\t\t\t\tlabelColor={getColorValue(theme, shape.props.labelColor, 'solid')}\n\t\t\t\t\trichText={shape.props.richText}\n\t\t\t\t\tbounds={getArrowLabelPosition(this.editor, shape)\n\t\t\t\t\t\t.box.clone()\n\t\t\t\t\t\t.expandBy(-ARROW_LABEL_PADDING * shape.props.scale)}\n\t\t\t\t\tpadding={0}\n\t\t\t\t\tshowTextOutline={true}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [\n\t\t\tgetFillDefForCanvas(),\n\t\t\t{\n\t\t\t\tkey: `arrow:dot`,\n\t\t\t\tcomponent: ArrowheadDotDef,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: `arrow:cross`,\n\t\t\t\tcomponent: ArrowheadCrossDef,\n\t\t\t},\n\t\t]\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLArrowShape,\n\t\tendShape: TLArrowShape,\n\t\tprogress: number\n\t): TLArrowShapeProps {\n\t\treturn {\n\t\t\t...(progress > 0.5 ? endShape.props : startShape.props),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, progress),\n\t\t\tstart: {\n\t\t\t\tx: lerp(startShape.props.start.x, endShape.props.start.x, progress),\n\t\t\t\ty: lerp(startShape.props.start.y, endShape.props.start.y, progress),\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tx: lerp(startShape.props.end.x, endShape.props.end.x, progress),\n\t\t\t\ty: lerp(startShape.props.end.y, endShape.props.end.y, progress),\n\t\t\t},\n\t\t\tbend: lerp(startShape.props.bend, endShape.props.bend, progress),\n\t\t\tlabelPosition: lerp(startShape.props.labelPosition, endShape.props.labelPosition, progress),\n\t\t}\n\t}\n}\n\nexport function getArrowLength(editor: Editor, shape: TLArrowShape): number {\n\tconst info = getArrowInfo(editor, shape)!\n\n\treturn info.type === 'straight'\n\t\t? Vec.Dist(info.start.handle, info.end.handle)\n\t\t: info.type === 'arc'\n\t\t\t? Math.abs(info.handleArc.length)\n\t\t\t: info.route.distance\n}\n\nconst ArrowSvg = track(function ArrowSvg({\n\tshape,\n\tshouldDisplayHandles,\n}: {\n\tshape: TLArrowShape\n\tshouldDisplayHandles: boolean\n}) {\n\tconst editor = useEditor()\n\tconst theme = useDefaultColorTheme()\n\tconst info = getArrowInfo(editor, shape)\n\tconst isForceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\treturn editor.getZoomLevel() < 0.2\n\t\t},\n\t\t[editor]\n\t)\n\tconst clipPathId = useSharedSafeId(shape.id + '_clip')\n\tconst arrowheadDotId = useSharedSafeId('arrowhead-dot')\n\tconst arrowheadCrossId = useSharedSafeId('arrowhead-cross')\n\tconst isEditing = useIsEditing(shape.id)\n\tconst geometry = editor.getShapeGeometry(shape)\n\tif (!geometry) return null\n\tconst bounds = Box.ZeroFix(geometry.bounds)\n\tconst bindings = getArrowBindings(editor, shape)\n\tconst isEmpty = isEmptyRichText(shape.props.richText)\n\n\tif (!info?.isValid) return null\n\n\tconst strokeWidth = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\tlet handlePath: null | React.JSX.Element = null\n\n\tif (shouldDisplayHandles && (bindings.start || bindings.end)) {\n\t\thandlePath = getArrowHandlePath(info, {\n\t\t\tstyle: 'dashed',\n\t\t\tstart: 'skip',\n\t\t\tend: 'skip',\n\t\t\tlengthRatio: 2.5,\n\t\t\tstrokeWidth: 2 / editor.getZoomLevel(),\n\t\t\tprops: {\n\t\t\t\tclassName: 'tl-arrow-hint',\n\t\t\t\tmarkerStart: bindings.start\n\t\t\t\t\t? bindings.start.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.start.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\tmarkerEnd: bindings.end\n\t\t\t\t\t? bindings.end.props.isExact\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: bindings.end.props.isPrecise\n\t\t\t\t\t\t\t? `url(#${arrowheadCrossId})`\n\t\t\t\t\t\t\t: `url(#${arrowheadDotId})`\n\t\t\t\t\t: '',\n\t\t\t\topacity: 0.16,\n\t\t\t},\n\t\t})\n\t}\n\n\tconst labelPosition = getArrowLabelPosition(editor, shape)\n\n\tconst clipStartArrowhead = !(info.start.arrowhead === 'none' || info.start.arrowhead === 'arrow')\n\tconst clipEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\treturn (\n\t\t<>\n\t\t\t{/* Yep */}\n\t\t\t<defs>\n\t\t\t\t<clipPath id={clipPathId}>\n\t\t\t\t\t<ArrowClipPath\n\t\t\t\t\t\tradius={3.5 * shape.props.scale}\n\t\t\t\t\t\thasText={isEditing || !isEmpty}\n\t\t\t\t\t\tbounds={bounds}\n\t\t\t\t\t\tlabelBounds={labelPosition.box}\n\t\t\t\t\t\tas={clipStartArrowhead && as ? as : ''}\n\t\t\t\t\t\tae={clipEndArrowhead && ae ? ae : ''}\n\t\t\t\t\t/>\n\t\t\t\t</clipPath>\n\t\t\t</defs>\n\t\t\t<g\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={getColorValue(theme, shape.props.color, 'solid')}\n\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tpointerEvents=\"none\"\n\t\t\t>\n\t\t\t\t{handlePath}\n\t\t\t\t<g\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tclipPath: `url(#${clipPathId})`,\n\t\t\t\t\t\tWebkitClipPath: `url(#${clipPathId})`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={toDomPrecision(bounds.minX - 100)}\n\t\t\t\t\t\ty={toDomPrecision(bounds.minY - 100)}\n\t\t\t\t\t\twidth={toDomPrecision(bounds.width + 200)}\n\t\t\t\t\t\theight={toDomPrecision(bounds.height + 200)}\n\t\t\t\t\t\topacity={0}\n\t\t\t\t\t/>\n\t\t\t\t\t{getArrowBodyPath(shape, info, {\n\t\t\t\t\t\tstyle: shape.props.dash,\n\t\t\t\t\t\tstrokeWidth,\n\t\t\t\t\t\tforceSolid: isForceSolid,\n\t\t\t\t\t\trandomSeed: shape.id,\n\t\t\t\t\t})}\n\t\t\t\t</g>\n\t\t\t\t{as && clipStartArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={as}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{ae && clipEndArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\td={ae}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.fill}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{as && <path d={as} />}\n\t\t\t\t{ae && <path d={ae} />}\n\t\t\t</g>\n\t\t</>\n\t)\n})\n\nfunction ArrowClipPath({\n\tradius,\n\thasText,\n\tbounds,\n\tlabelBounds,\n\tas,\n\tae,\n}: {\n\tradius: number\n\thasText: boolean\n\tbounds: Box\n\tlabelBounds: Box\n\tas: string\n\tae: string\n}) {\n\tconst path = useMemo(() => {\n\t\t// The direction in which we create the different path parts is important, as it determines what gets clipped.\n\t\t// See the description on the directions in the non-zero fill rule example:\n\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule#nonzero\n\t\tconst path = new PathBuilder()\n\n\t\t// We create this one in the clockwise direction\n\t\tpath\n\t\t\t.moveTo(bounds.left - 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.top - 100)\n\t\t\t.lineTo(bounds.right + 100, bounds.bottom + 100)\n\t\t\t.lineTo(bounds.left - 100, bounds.bottom + 100)\n\t\t\t.close()\n\n\t\tif (hasText) {\n\t\t\t// We create this one in the counter-clockwise direction, which cuts out the label box\n\t\t\tpath\n\t\t\t\t.moveTo(labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.lineTo(labelBounds.left, labelBounds.bottom - radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left + radius, labelBounds.bottom)\n\t\t\t\t.lineTo(labelBounds.right - radius, labelBounds.bottom)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right, labelBounds.bottom - radius)\n\t\t\t\t.lineTo(labelBounds.right, labelBounds.top + radius)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.right - radius, labelBounds.top)\n\t\t\t\t.lineTo(labelBounds.left + radius, labelBounds.top)\n\t\t\t\t.circularArcTo(radius, false, false, labelBounds.left, labelBounds.top + radius)\n\t\t\t\t.close()\n\t\t}\n\n\t\treturn path.toD()\n\t}, [\n\t\tradius,\n\t\thasText,\n\t\tbounds.bottom,\n\t\tbounds.left,\n\t\tbounds.right,\n\t\tbounds.top,\n\t\tlabelBounds.bottom,\n\t\tlabelBounds.left,\n\t\tlabelBounds.right,\n\t\tlabelBounds.top,\n\t])\n\n\t// We also append the arrowhead paths to the clip path, so that we also clip the arrowheads\n\treturn <path d={`${path}${as}${ae}`} />\n}\n\nconst shapeAtTranslationStart = new WeakMap<\n\tTLArrowShape,\n\t{\n\t\tpagePosition: Vec\n\t\tterminalBindings: Record<\n\t\t\t'start' | 'end',\n\t\t\t{\n\t\t\t\tpagePosition: Vec\n\t\t\t\tshapePosition: Vec\n\t\t\t\tbinding: TLArrowBinding\n\t\t\t} | null\n\t\t>\n\t}\n>()\n\nfunction ArrowheadDotDef() {\n\tconst id = useSharedSafeId('arrowhead-dot')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"0\">\n\t\t\t<circle cx=\"3\" cy=\"3\" r=\"2\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\nfunction ArrowheadCrossDef() {\n\tconst id = useSharedSafeId('arrowhead-cross')\n\treturn (\n\t\t<marker id={id} className=\"tl-arrow-hint\" refX=\"3.0\" refY=\"3.0\" orient=\"auto\">\n\t\t\t<line x1=\"1.5\" y1=\"1.5\" x2=\"4.5\" y2=\"4.5\" strokeDasharray=\"100%\" />\n\t\t\t<line x1=\"1.5\" y1=\"4.5\" x2=\"4.5\" y2=\"1.5\" strokeDasharray=\"100%\" />\n\t\t</marker>\n\t)\n}\n\n/**\n * Take 2 angles and return true if they are approximately parallel. Angle that point in the same\n * (or opposite) directions are considered parallel. This also handles wrap around - e.g. 0, \u03C0, and\n * 2\u03C0 are all considered parallel.\n */\nfunction anglesAreApproximatelyParallel(a: number, b: number, tolerance = 0.0001) {\n\tconst diff = Math.abs(a - b)\n\n\tconst isParallel = diff < tolerance\n\tconst isFlippedParallel = Math.abs(diff - Math.PI) < tolerance\n\tconst is360Parallel = Math.abs(diff - PI2) < tolerance\n\n\treturn { isParallel: isParallel || is360Parallel, isFlippedParallel }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ArrowHandles", "ArrowSvg", "path"]
7
7
  }
@@ -119,7 +119,7 @@ function ElbowArrowDebug({ arrow }) {
119
119
  y: fullBox.minY - 3,
120
120
  fontSize: 10,
121
121
  fill: "black",
122
- stroke: "var(--color-background)",
122
+ stroke: "var(--tl-color-background)",
123
123
  strokeWidth: 2,
124
124
  paintOrder: "stroke",
125
125
  children: label
@@ -132,7 +132,7 @@ function ElbowArrowDebug({ arrow }) {
132
132
  y: info.A.expanded.y,
133
133
  fontSize: 10,
134
134
  fill: "black",
135
- stroke: "var(--color-background)",
135
+ stroke: "var(--tl-color-background)",
136
136
  strokeWidth: 2,
137
137
  paintOrder: "stroke",
138
138
  children: [
@@ -149,7 +149,7 @@ function ElbowArrowDebug({ arrow }) {
149
149
  y: info.B.expanded.y,
150
150
  fontSize: 10,
151
151
  fill: "black",
152
- stroke: "var(--color-background)",
152
+ stroke: "var(--tl-color-background)",
153
153
  strokeWidth: 2,
154
154
  paintOrder: "stroke",
155
155
  children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx"],
4
- "sourcesContent": ["import { Box, TLArrowShape, useEditor, useValue, VecLike } from '@tldraw/editor'\nimport { SVGProps } from 'react'\nimport { getArrowBindings } from '../shared'\nimport { ElbowArrowEdge } from './definitions'\nimport { getElbowArrowInfo } from './getElbowArrowInfo'\n\nexport function ElbowArrowDebug({ arrow }: { arrow: TLArrowShape }) {\n\tconst editor = useEditor()\n\tconst info = useValue(\n\t\t'elbow arrow grid',\n\t\t() => {\n\t\t\ttry {\n\t\t\t\tconst info = getElbowArrowInfo(\n\t\t\t\t\teditor,\n\t\t\t\t\teditor.getShape(arrow.id)!,\n\t\t\t\t\tgetArrowBindings(editor, arrow)\n\t\t\t\t)\n\t\t\t\treturn info\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t},\n\t\t[editor, arrow.id]\n\t)\n\n\tif (!info) return null\n\n\tconst fullBox = Box.Common([info.A.original, info.B.original]).expandBy(50)\n\n\tconst label = info.route?.name ?? ''\n\n\tconst midPoint = info.route?.midpointHandle\n\n\treturn (\n\t\t<>\n\t\t\t{info.midX !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midX, y: fullBox.minY }}\n\t\t\t\t\tb={{ x: info.midX, y: fullBox.maxY }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{info.midY !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: fullBox.minX, y: info.midY }}\n\t\t\t\t\tb={{ x: fullBox.maxX, y: info.midY }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'x' && info.midXRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midXRange.lo, y: midPoint.point.y }}\n\t\t\t\t\tb={{ x: info.midXRange.hi, y: midPoint.point.y }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'y' && info.midYRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: midPoint.point.x, y: info.midYRange.lo }}\n\t\t\t\t\tb={{ x: midPoint.point.x, y: info.midYRange.hi }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<DebugBox box={info.A.original} stroke=\"orange\" />\n\t\t\t<DebugBox box={info.A.expanded} stroke=\"orange\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.A.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"orange\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\t\t\t<DebugBox box={info.B.original} stroke=\"lightskyblue\" />\n\t\t\t<DebugBox box={info.B.expanded} stroke=\"lightskyblue\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.B.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"lightskyblue\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\n\t\t\t<DebugEdge edge={info.A.edges.top} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.top} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.right} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.right} axis=\"y\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.bottom} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.bottom} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.left} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.left} axis=\"y\" stroke=\"lightskyblue\" />\n\n\t\t\t{info.route && <DebugRoute route={info.route.points} strokeWidth={10} />}\n\n\t\t\t<text\n\t\t\t\tx={fullBox.minX + 5}\n\t\t\t\ty={fullBox.minY - 3}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.A.expanded.x}\n\t\t\t\ty={info.A.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tA{info.route && `, ${info.route.aEdgePicking}`}\n\t\t\t\t{info.A.isPoint && `, point`}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.B.expanded.x}\n\t\t\t\ty={info.B.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tB{info.route && `, ${info.route.bEdgePicking}`}\n\t\t\t\t{info.B.isPoint && `, point`}\n\t\t\t</text>\n\t\t</>\n\t)\n}\n\nfunction DebugLine({ a, b, ...props }: { a: VecLike; b: VecLike } & SVGProps<SVGLineElement>) {\n\treturn (\n\t\t<line\n\t\t\tfill=\"none\"\n\t\t\tstrokeWidth={1}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstroke=\"green\"\n\t\t\tx1={a.x}\n\t\t\ty1={a.y}\n\t\t\tx2={b.x}\n\t\t\ty2={b.y}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugRoute({ route, ...props }: { route: VecLike[] } & SVGProps<SVGPolylineElement>) {\n\treturn (\n\t\t<polyline\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"darkorchid\"\n\t\t\tstrokeWidth={3}\n\t\t\topacity={0.5}\n\t\t\tpoints={route.map((r) => `${r.x},${r.y}`).join(' ')}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugEdge({\n\tedge,\n\taxis,\n\t...props\n}: {\n\tedge: ElbowArrowEdge | null\n\taxis: 'x' | 'y'\n} & Omit<SVGProps<SVGLineElement>, 'scale'>) {\n\tif (!edge || edge.expanded === null) return null\n\tconst vec = (vec: VecLike) => (axis === 'x' ? { x: vec.y, y: vec.x } : vec)\n\n\treturn (\n\t\t<g>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.min })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.max })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</g>\n\t)\n}\n\nfunction DebugBox({ box, ...props }: { box: Box } & SVGProps<SVGRectElement>) {\n\treturn (\n\t\t<rect\n\t\t\tx={box.minX}\n\t\t\ty={box.minY}\n\t\t\twidth={box.width}\n\t\t\theight={box.height}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstrokeWidth={1}\n\t\t\tfill=\"none\"\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n"],
4
+ "sourcesContent": ["import { Box, TLArrowShape, useEditor, useValue, VecLike } from '@tldraw/editor'\nimport { SVGProps } from 'react'\nimport { getArrowBindings } from '../shared'\nimport { ElbowArrowEdge } from './definitions'\nimport { getElbowArrowInfo } from './getElbowArrowInfo'\n\nexport function ElbowArrowDebug({ arrow }: { arrow: TLArrowShape }) {\n\tconst editor = useEditor()\n\tconst info = useValue(\n\t\t'elbow arrow grid',\n\t\t() => {\n\t\t\ttry {\n\t\t\t\tconst info = getElbowArrowInfo(\n\t\t\t\t\teditor,\n\t\t\t\t\teditor.getShape(arrow.id)!,\n\t\t\t\t\tgetArrowBindings(editor, arrow)\n\t\t\t\t)\n\t\t\t\treturn info\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t},\n\t\t[editor, arrow.id]\n\t)\n\n\tif (!info) return null\n\n\tconst fullBox = Box.Common([info.A.original, info.B.original]).expandBy(50)\n\n\tconst label = info.route?.name ?? ''\n\n\tconst midPoint = info.route?.midpointHandle\n\n\treturn (\n\t\t<>\n\t\t\t{info.midX !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midX, y: fullBox.minY }}\n\t\t\t\t\tb={{ x: info.midX, y: fullBox.maxY }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{info.midY !== null && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: fullBox.minX, y: info.midY }}\n\t\t\t\t\tb={{ x: fullBox.maxX, y: info.midY }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'x' && info.midXRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: info.midXRange.lo, y: midPoint.point.y }}\n\t\t\t\t\tb={{ x: info.midXRange.hi, y: midPoint.point.y }}\n\t\t\t\t\tstroke=\"red\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{midPoint?.axis === 'y' && info.midYRange && (\n\t\t\t\t<DebugLine\n\t\t\t\t\ta={{ x: midPoint.point.x, y: info.midYRange.lo }}\n\t\t\t\t\tb={{ x: midPoint.point.x, y: info.midYRange.hi }}\n\t\t\t\t\tstroke=\"blue\"\n\t\t\t\t\tstrokeDasharray={'0 2'}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<DebugBox box={info.A.original} stroke=\"orange\" />\n\t\t\t<DebugBox box={info.A.expanded} stroke=\"orange\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.A.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"orange\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\t\t\t<DebugBox box={info.B.original} stroke=\"lightskyblue\" />\n\t\t\t<DebugBox box={info.B.expanded} stroke=\"lightskyblue\" strokeWidth={0.5} />\n\t\t\t<DebugBox\n\t\t\t\tbox={info.B.original.clone().expandBy(info.options.minElbowLegLength)}\n\t\t\t\tstroke=\"lightskyblue\"\n\t\t\t\tstrokeWidth={0.5}\n\t\t\t/>\n\n\t\t\t<DebugEdge edge={info.A.edges.top} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.top} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.right} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.right} axis=\"y\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.bottom} axis=\"x\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.bottom} axis=\"x\" stroke=\"lightskyblue\" />\n\t\t\t<DebugEdge edge={info.A.edges.left} axis=\"y\" stroke=\"orange\" />\n\t\t\t<DebugEdge edge={info.B.edges.left} axis=\"y\" stroke=\"lightskyblue\" />\n\n\t\t\t{info.route && <DebugRoute route={info.route.points} strokeWidth={10} />}\n\n\t\t\t<text\n\t\t\t\tx={fullBox.minX + 5}\n\t\t\t\ty={fullBox.minY - 3}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--tl-color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.A.expanded.x}\n\t\t\t\ty={info.A.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--tl-color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tA{info.route && `, ${info.route.aEdgePicking}`}\n\t\t\t\t{info.A.isPoint && `, point`}\n\t\t\t</text>\n\t\t\t<text\n\t\t\t\tx={info.B.expanded.x}\n\t\t\t\ty={info.B.expanded.y}\n\t\t\t\tfontSize={10}\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"var(--tl-color-background)\"\n\t\t\t\tstrokeWidth={2}\n\t\t\t\tpaintOrder=\"stroke\"\n\t\t\t>\n\t\t\t\tB{info.route && `, ${info.route.bEdgePicking}`}\n\t\t\t\t{info.B.isPoint && `, point`}\n\t\t\t</text>\n\t\t</>\n\t)\n}\n\nfunction DebugLine({ a, b, ...props }: { a: VecLike; b: VecLike } & SVGProps<SVGLineElement>) {\n\treturn (\n\t\t<line\n\t\t\tfill=\"none\"\n\t\t\tstrokeWidth={1}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstroke=\"green\"\n\t\t\tx1={a.x}\n\t\t\ty1={a.y}\n\t\t\tx2={b.x}\n\t\t\ty2={b.y}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugRoute({ route, ...props }: { route: VecLike[] } & SVGProps<SVGPolylineElement>) {\n\treturn (\n\t\t<polyline\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"darkorchid\"\n\t\t\tstrokeWidth={3}\n\t\t\topacity={0.5}\n\t\t\tpoints={route.map((r) => `${r.x},${r.y}`).join(' ')}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DebugEdge({\n\tedge,\n\taxis,\n\t...props\n}: {\n\tedge: ElbowArrowEdge | null\n\taxis: 'x' | 'y'\n} & Omit<SVGProps<SVGLineElement>, 'scale'>) {\n\tif (!edge || edge.expanded === null) return null\n\tconst vec = (vec: VecLike) => (axis === 'x' ? { x: vec.y, y: vec.x } : vec)\n\n\treturn (\n\t\t<g>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.min })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.min })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<DebugLine\n\t\t\t\ta={vec({ x: edge.expanded - 4, y: edge.cross.max })}\n\t\t\t\tb={vec({ x: edge.expanded + 4, y: edge.cross.max })}\n\t\t\t\tstrokeDasharray=\"0\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</g>\n\t)\n}\n\nfunction DebugBox({ box, ...props }: { box: Box } & SVGProps<SVGRectElement>) {\n\treturn (\n\t\t<rect\n\t\t\tx={box.minX}\n\t\t\ty={box.minY}\n\t\t\twidth={box.width}\n\t\t\theight={box.height}\n\t\t\tstrokeDasharray=\"4,4\"\n\t\t\tstrokeWidth={1}\n\t\t\tfill=\"none\"\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCE;AAnCF,oBAAgE;AAEhE,oBAAiC;AAEjC,+BAAkC;AAE3B,SAAS,gBAAgB,EAAE,MAAM,GAA4B;AACnE,QAAM,aAAS,yBAAU;AACzB,QAAM,WAAO;AAAA,IACZ;AAAA,IACA,MAAM;AACL,UAAI;AACH,cAAMA,YAAO;AAAA,UACZ;AAAA,UACA,OAAO,SAAS,MAAM,EAAE;AAAA,cACxB,gCAAiB,QAAQ,KAAK;AAAA,QAC/B;AACA,eAAOA;AAAA,MACR,SAAS,KAAK;AACb,gBAAQ,MAAM,GAAG;AACjB,eAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,MAAM,EAAE;AAAA,EAClB;AAEA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,UAAU,kBAAI,OAAO,CAAC,KAAK,EAAE,UAAU,KAAK,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE;AAE1E,QAAM,QAAQ,KAAK,OAAO,QAAQ;AAElC,QAAM,WAAW,KAAK,OAAO;AAE7B,SACC,4EACE;AAAA,SAAK,SAAS,QACd;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,QAAQ,KAAK;AAAA,QACnC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,QAAQ,KAAK;AAAA,QACnC,QAAO;AAAA;AAAA,IACR;AAAA,IAEA,KAAK,SAAS,QACd;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,EAAE,GAAG,QAAQ,MAAM,GAAG,KAAK,KAAK;AAAA,QACnC,GAAG,EAAE,GAAG,QAAQ,MAAM,GAAG,KAAK,KAAK;AAAA,QACnC,QAAO;AAAA;AAAA,IACR;AAAA,IAGA,UAAU,SAAS,OAAO,KAAK,aAC/B;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,EAAE,GAAG,KAAK,UAAU,IAAI,GAAG,SAAS,MAAM,EAAE;AAAA,QAC/C,GAAG,EAAE,GAAG,KAAK,UAAU,IAAI,GAAG,SAAS,MAAM,EAAE;AAAA,QAC/C,QAAO;AAAA,QACP,iBAAiB;AAAA;AAAA,IAClB;AAAA,IAGA,UAAU,SAAS,OAAO,KAAK,aAC/B;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,EAAE,GAAG,SAAS,MAAM,GAAG,GAAG,KAAK,UAAU,GAAG;AAAA,QAC/C,GAAG,EAAE,GAAG,SAAS,MAAM,GAAG,GAAG,KAAK,UAAU,GAAG;AAAA,QAC/C,QAAO;AAAA,QACP,iBAAiB;AAAA;AAAA,IAClB;AAAA,IAGD,4CAAC,YAAS,KAAK,KAAK,EAAE,UAAU,QAAO,UAAS;AAAA,IAChD,4CAAC,YAAS,KAAK,KAAK,EAAE,UAAU,QAAO,UAAS,aAAa,KAAK;AAAA,IAClE;AAAA,MAAC;AAAA;AAAA,QACA,KAAK,KAAK,EAAE,SAAS,MAAM,EAAE,SAAS,KAAK,QAAQ,iBAAiB;AAAA,QACpE,QAAO;AAAA,QACP,aAAa;AAAA;AAAA,IACd;AAAA,IACA,4CAAC,YAAS,KAAK,KAAK,EAAE,UAAU,QAAO,gBAAe;AAAA,IACtD,4CAAC,YAAS,KAAK,KAAK,EAAE,UAAU,QAAO,gBAAe,aAAa,KAAK;AAAA,IACxE;AAAA,MAAC;AAAA;AAAA,QACA,KAAK,KAAK,EAAE,SAAS,MAAM,EAAE,SAAS,KAAK,QAAQ,iBAAiB;AAAA,QACpE,QAAO;AAAA,QACP,aAAa;AAAA;AAAA,IACd;AAAA,IAEA,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,KAAK,MAAK,KAAI,QAAO,UAAS;AAAA,IAC5D,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,KAAK,MAAK,KAAI,QAAO,gBAAe;AAAA,IAClE,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,OAAO,MAAK,KAAI,QAAO,UAAS;AAAA,IAC9D,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,OAAO,MAAK,KAAI,QAAO,gBAAe;AAAA,IACpE,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAK,KAAI,QAAO,UAAS;AAAA,IAC/D,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAK,KAAI,QAAO,gBAAe;AAAA,IACrE,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,MAAM,MAAK,KAAI,QAAO,UAAS;AAAA,IAC7D,4CAAC,aAAU,MAAM,KAAK,EAAE,MAAM,MAAM,MAAK,KAAI,QAAO,gBAAe;AAAA,IAElE,KAAK,SAAS,4CAAC,cAAW,OAAO,KAAK,MAAM,QAAQ,aAAa,IAAI;AAAA,IAEtE;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,QAAQ,OAAO;AAAA,QAClB,GAAG,QAAQ,OAAO;AAAA,QAClB,UAAU;AAAA,QACV,MAAK;AAAA,QACL,QAAO;AAAA,QACP,aAAa;AAAA,QACb,YAAW;AAAA,QAEV;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,KAAK,EAAE,SAAS;AAAA,QACnB,GAAG,KAAK,EAAE,SAAS;AAAA,QACnB,UAAU;AAAA,QACV,MAAK;AAAA,QACL,QAAO;AAAA,QACP,aAAa;AAAA,QACb,YAAW;AAAA,QACX;AAAA;AAAA,UACE,KAAK,SAAS,KAAK,KAAK,MAAM,YAAY;AAAA,UAC3C,KAAK,EAAE,WAAW;AAAA;AAAA;AAAA,IACpB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,KAAK,EAAE,SAAS;AAAA,QACnB,GAAG,KAAK,EAAE,SAAS;AAAA,QACnB,UAAU;AAAA,QACV,MAAK;AAAA,QACL,QAAO;AAAA,QACP,aAAa;AAAA,QACb,YAAW;AAAA,QACX;AAAA;AAAA,UACE,KAAK,SAAS,KAAK,KAAK,MAAM,YAAY;AAAA,UAC3C,KAAK,EAAE,WAAW;AAAA;AAAA;AAAA,IACpB;AAAA,KACD;AAEF;AAEA,SAAS,UAAU,EAAE,GAAG,GAAG,GAAG,MAAM,GAA0D;AAC7F,SACC;AAAA,IAAC;AAAA;AAAA,MACA,MAAK;AAAA,MACL,aAAa;AAAA,MACb,iBAAgB;AAAA,MAChB,QAAO;AAAA,MACP,IAAI,EAAE;AAAA,MACN,IAAI,EAAE;AAAA,MACN,IAAI,EAAE;AAAA,MACN,IAAI,EAAE;AAAA,MACL,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,WAAW,EAAE,OAAO,GAAG,MAAM,GAAwD;AAC7F,SACC;AAAA,IAAC;AAAA;AAAA,MACA,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,MACT,QAAQ,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,MACjD,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,UAAU;AAAA,EAClB;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAG6C;AAC5C,MAAI,CAAC,QAAQ,KAAK,aAAa,KAAM,QAAO;AAC5C,QAAM,MAAM,CAACC,SAAkB,SAAS,MAAM,EAAE,GAAGA,KAAI,GAAG,GAAGA,KAAI,EAAE,IAAIA;AAEvE,SACC,6CAAC,OACA;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,IAAI,EAAE,GAAG,KAAK,UAAU,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,QAC9C,GAAG,IAAI,EAAE,GAAG,KAAK,UAAU,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,QAC9C,iBAAgB;AAAA,QAChB,aAAa;AAAA,QACZ,GAAG;AAAA;AAAA,IACL;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,IAAI,EAAE,GAAG,KAAK,WAAW,GAAG,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,QAClD,GAAG,IAAI,EAAE,GAAG,KAAK,WAAW,GAAG,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,QAClD,iBAAgB;AAAA,QAChB,aAAa;AAAA,QACZ,GAAG;AAAA;AAAA,IACL;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,GAAG,IAAI,EAAE,GAAG,KAAK,WAAW,GAAG,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,QAClD,GAAG,IAAI,EAAE,GAAG,KAAK,WAAW,GAAG,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,QAClD,iBAAgB;AAAA,QAChB,aAAa;AAAA,QACZ,GAAG;AAAA;AAAA,IACL;AAAA,KACD;AAEF;AAEA,SAAS,SAAS,EAAE,KAAK,GAAG,MAAM,GAA4C;AAC7E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,GAAG,IAAI;AAAA,MACP,GAAG,IAAI;AAAA,MACP,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,iBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAK;AAAA,MACJ,GAAG;AAAA;AAAA,EACL;AAEF;",
6
6
  "names": ["info", "vec"]
7
7
  }
@@ -214,7 +214,7 @@ function DrawShapeSvg({ shape, zoomOverride }) {
214
214
  {
215
215
  d: (0, import_svgInk.svgInk)(allPointsFromSegments, options),
216
216
  strokeLinecap: "round",
217
- fill: theme[shape.props.color].solid
217
+ fill: (0, import_editor.getColorValue)(theme, shape.props.color, "solid")
218
218
  }
219
219
  )
220
220
  ] });
@@ -238,8 +238,8 @@ function DrawShapeSvg({ shape, zoomOverride }) {
238
238
  {
239
239
  d: solidStrokePath,
240
240
  strokeLinecap: "round",
241
- fill: isDot ? theme[shape.props.color].solid : "none",
242
- stroke: theme[shape.props.color].solid,
241
+ fill: isDot ? (0, import_editor.getColorValue)(theme, shape.props.color, "solid") : "none",
242
+ stroke: (0, import_editor.getColorValue)(theme, shape.props.color, "solid"),
243
243
  strokeWidth: sw,
244
244
  strokeDasharray: isDot ? "none" : (0, import_getPath.getDrawShapeStrokeDashArray)(shape, sw, dotAdjustment),
245
245
  strokeDashoffset: "0"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/shapes/draw/DrawShapeUtil.tsx"],
4
- "sourcesContent": ["import {\n\tBox,\n\tCircle2d,\n\tPolygon2d,\n\tPolyline2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLDrawShape,\n\tTLDrawShapeProps,\n\tTLDrawShapeSegment,\n\tTLResizeInfo,\n\tTLShapeUtilCanvasSvgDef,\n\tVecLike,\n\tdrawShapeMigrations,\n\tdrawShapeProps,\n\tlast,\n\tlerp,\n\trng,\n\ttoFixed,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { STROKE_SIZES } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { getStrokePoints } from '../shared/freehand/getStrokePoints'\nimport { getSvgPathFromStrokePoints } from '../shared/freehand/svg'\nimport { svgInk } from '../shared/freehand/svgInk'\nimport { interpolateSegments } from '../shared/interpolate-props'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getDrawShapeStrokeDashArray, getFreehandOptions, getPointsFromSegments } from './getPath'\n\n/** @public */\nexport interface DrawShapeOptions {\n\t/**\n\t * The maximum number of points in a line before the draw tool will begin a new shape.\n\t * A higher number will lead to poor performance while drawing very long lines.\n\t */\n\treadonly maxPointsPerShape: number\n}\n\n/** @public */\nexport class DrawShapeUtil extends ShapeUtil<TLDrawShape> {\n\tstatic override type = 'draw' as const\n\tstatic override props = drawShapeProps\n\tstatic override migrations = drawShapeMigrations\n\n\toverride options: DrawShapeOptions = {\n\t\tmaxPointsPerShape: 600,\n\t}\n\n\toverride hideResizeHandles(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideRotateHandle(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideSelectionBoundsFg(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\n\toverride getDefaultProps(): TLDrawShape['props'] {\n\t\treturn {\n\t\t\tsegments: [],\n\t\t\tcolor: 'black',\n\t\t\tfill: 'none',\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tisComplete: false,\n\t\t\tisClosed: false,\n\t\t\tisPen: false,\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLDrawShape) {\n\t\tconst points = getPointsFromSegments(shape.props.segments)\n\n\t\tconst sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// A dot\n\t\tif (shape.props.segments.length === 1) {\n\t\t\tconst box = Box.FromPoints(points)\n\t\t\tif (box.width < sw * 2 && box.height < sw * 2) {\n\t\t\t\treturn new Circle2d({\n\t\t\t\t\tx: -sw,\n\t\t\t\t\ty: -sw,\n\t\t\t\t\tradius: sw,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst strokePoints = getStrokePoints(\n\t\t\tpoints,\n\t\t\tgetFreehandOptions(shape.props, sw, shape.props.isPen, true)\n\t\t).map((p) => p.point)\n\n\t\t// A closed draw stroke\n\t\tif (shape.props.isClosed && strokePoints.length > 2) {\n\t\t\treturn new Polygon2d({\n\t\t\t\tpoints: strokePoints,\n\t\t\t\tisFilled: shape.props.fill !== 'none',\n\t\t\t})\n\t\t}\n\n\t\tif (strokePoints.length === 1) {\n\t\t\treturn new Circle2d({\n\t\t\t\tx: -sw,\n\t\t\t\ty: -sw,\n\t\t\t\tradius: sw,\n\t\t\t\tisFilled: true,\n\t\t\t})\n\t\t}\n\n\t\t// An open draw stroke\n\t\treturn new Polyline2d({\n\t\t\tpoints: strokePoints,\n\t\t})\n\t}\n\n\tcomponent(shape: TLDrawShape) {\n\t\treturn (\n\t\t\t<SVGContainer>\n\t\t\t\t<DrawShapeSvg shape={shape} />\n\t\t\t</SVGContainer>\n\t\t)\n\t}\n\n\tindicator(shape: TLDrawShape) {\n\t\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\t\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst forceSolid = useValue(\n\t\t\t'force solid',\n\t\t\t() => {\n\t\t\t\tconst zoomLevel = this.editor.getZoomLevel()\n\t\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t\t},\n\t\t\t[this.editor, sw]\n\t\t)\n\n\t\tif (\n\t\t\t!forceSolid &&\n\t\t\t!shape.props.isPen &&\n\t\t\tshape.props.dash === 'draw' &&\n\t\t\tallPointsFromSegments.length === 1\n\t\t) {\n\t\t\tsw += rng(shape.id)() * (sw / 6)\n\t\t}\n\n\t\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\t\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, true)\n\t\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\t\tconst solidStrokePath =\n\t\t\tstrokePoints.length > 1\n\t\t\t\t? getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\t\t\t\t: getDot(allPointsFromSegments[0], sw)\n\n\t\treturn <path d={solidStrokePath} />\n\t}\n\n\toverride toSvg(shape: TLDrawShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst scaleFactor = 1 / shape.props.scale\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<DrawShapeSvg shape={shape} zoomOverride={1} />\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize(shape: TLDrawShape, info: TLResizeInfo<TLDrawShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst newSegments: TLDrawShapeSegment[] = []\n\n\t\tfor (const segment of shape.props.segments) {\n\t\t\tnewSegments.push({\n\t\t\t\t...segment,\n\t\t\t\tpoints: segment.points.map(({ x, y, z }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: toFixed(scaleX * x),\n\t\t\t\t\t\ty: toFixed(scaleY * y),\n\t\t\t\t\t\tz,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\treturn {\n\t\t\tprops: {\n\t\t\t\tsegments: newSegments,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride expandSelectionOutlinePx(shape: TLDrawShape): number {\n\t\tconst multiplier = shape.props.dash === 'draw' ? 1.6 : 1\n\t\treturn ((STROKE_SIZES[shape.props.size] * multiplier) / 2) * shape.props.scale\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLDrawShape,\n\t\tendShape: TLDrawShape,\n\t\tt: number\n\t): TLDrawShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tsegments: interpolateSegments(startShape.props.segments, endShape.props.segments, t),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, t),\n\t\t}\n\t}\n}\n\nfunction getDot(point: VecLike, sw: number) {\n\tconst r = (sw + 1) * 0.5\n\treturn `M ${point.x} ${point.y} m -${r}, 0 a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 -${\n\t\tr * 2\n\t},0`\n}\n\nfunction getIsDot(shape: TLDrawShape) {\n\treturn shape.props.segments.length === 1 && shape.props.segments[0].points.length < 2\n}\n\nfunction DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverride?: number }) {\n\tconst theme = useDefaultColorTheme()\n\tconst editor = useEditor()\n\n\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\n\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\tconst forceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t},\n\t\t[editor, sw, zoomOverride]\n\t)\n\n\tconst dotAdjustment = useValue(\n\t\t'dot adjustment',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\t// If we're zoomed way out (10%), then we need to make the dotted line go to 9 instead 0.1\n\t\t\t// Chrome doesn't render anything otherwise.\n\t\t\treturn zoomLevel < 0.2 ? 0 : 0.1\n\t\t},\n\t\t[editor, zoomOverride]\n\t)\n\n\tif (\n\t\t!forceSolid &&\n\t\t!shape.props.isPen &&\n\t\tshape.props.dash === 'draw' &&\n\t\tallPointsFromSegments.length === 1\n\t) {\n\t\tsw += rng(shape.id)() * (sw / 6)\n\t}\n\n\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, forceSolid)\n\n\tif (!forceSolid && shape.props.dash === 'draw') {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{shape.props.isClosed && shape.props.fill && allPointsFromSegments.length > 1 ? (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\td={getSvgPathFromStrokePoints(\n\t\t\t\t\t\t\tgetStrokePoints(allPointsFromSegments, options),\n\t\t\t\t\t\t\tshape.props.isClosed\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<path\n\t\t\t\t\td={svgInk(allPointsFromSegments, options)}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tfill={theme[shape.props.color].solid}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\tconst isDot = strokePoints.length < 2\n\tconst solidStrokePath = isDot\n\t\t? getDot(allPointsFromSegments[0], 0)\n\t\t: getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\n\treturn (\n\t\t<>\n\t\t\t<ShapeFill\n\t\t\t\td={solidStrokePath}\n\t\t\t\ttheme={theme}\n\t\t\t\tcolor={shape.props.color}\n\t\t\t\tfill={isDot || shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\tscale={shape.props.scale}\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td={solidStrokePath}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tfill={isDot ? theme[shape.props.color].solid : 'none'}\n\t\t\t\tstroke={theme[shape.props.color].solid}\n\t\t\t\tstrokeWidth={sw}\n\t\t\t\tstrokeDasharray={isDot ? 'none' : getDrawShapeStrokeDashArray(shape, sw, dotAdjustment)}\n\t\t\t\tstrokeDashoffset=\"0\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tBox,\n\tCircle2d,\n\tPolygon2d,\n\tPolyline2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLDrawShape,\n\tTLDrawShapeProps,\n\tTLDrawShapeSegment,\n\tTLResizeInfo,\n\tTLShapeUtilCanvasSvgDef,\n\tVecLike,\n\tdrawShapeMigrations,\n\tdrawShapeProps,\n\tgetColorValue,\n\tlast,\n\tlerp,\n\trng,\n\ttoFixed,\n\tuseEditor,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport { ShapeFill } from '../shared/ShapeFill'\nimport { STROKE_SIZES } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { getStrokePoints } from '../shared/freehand/getStrokePoints'\nimport { getSvgPathFromStrokePoints } from '../shared/freehand/svg'\nimport { svgInk } from '../shared/freehand/svgInk'\nimport { interpolateSegments } from '../shared/interpolate-props'\nimport { useDefaultColorTheme } from '../shared/useDefaultColorTheme'\nimport { getDrawShapeStrokeDashArray, getFreehandOptions, getPointsFromSegments } from './getPath'\n\n/** @public */\nexport interface DrawShapeOptions {\n\t/**\n\t * The maximum number of points in a line before the draw tool will begin a new shape.\n\t * A higher number will lead to poor performance while drawing very long lines.\n\t */\n\treadonly maxPointsPerShape: number\n}\n\n/** @public */\nexport class DrawShapeUtil extends ShapeUtil<TLDrawShape> {\n\tstatic override type = 'draw' as const\n\tstatic override props = drawShapeProps\n\tstatic override migrations = drawShapeMigrations\n\n\toverride options: DrawShapeOptions = {\n\t\tmaxPointsPerShape: 600,\n\t}\n\n\toverride hideResizeHandles(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideRotateHandle(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\toverride hideSelectionBoundsFg(shape: TLDrawShape) {\n\t\treturn getIsDot(shape)\n\t}\n\n\toverride getDefaultProps(): TLDrawShape['props'] {\n\t\treturn {\n\t\t\tsegments: [],\n\t\t\tcolor: 'black',\n\t\t\tfill: 'none',\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tisComplete: false,\n\t\t\tisClosed: false,\n\t\t\tisPen: false,\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLDrawShape) {\n\t\tconst points = getPointsFromSegments(shape.props.segments)\n\n\t\tconst sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// A dot\n\t\tif (shape.props.segments.length === 1) {\n\t\t\tconst box = Box.FromPoints(points)\n\t\t\tif (box.width < sw * 2 && box.height < sw * 2) {\n\t\t\t\treturn new Circle2d({\n\t\t\t\t\tx: -sw,\n\t\t\t\t\ty: -sw,\n\t\t\t\t\tradius: sw,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst strokePoints = getStrokePoints(\n\t\t\tpoints,\n\t\t\tgetFreehandOptions(shape.props, sw, shape.props.isPen, true)\n\t\t).map((p) => p.point)\n\n\t\t// A closed draw stroke\n\t\tif (shape.props.isClosed && strokePoints.length > 2) {\n\t\t\treturn new Polygon2d({\n\t\t\t\tpoints: strokePoints,\n\t\t\t\tisFilled: shape.props.fill !== 'none',\n\t\t\t})\n\t\t}\n\n\t\tif (strokePoints.length === 1) {\n\t\t\treturn new Circle2d({\n\t\t\t\tx: -sw,\n\t\t\t\ty: -sw,\n\t\t\t\tradius: sw,\n\t\t\t\tisFilled: true,\n\t\t\t})\n\t\t}\n\n\t\t// An open draw stroke\n\t\treturn new Polyline2d({\n\t\t\tpoints: strokePoints,\n\t\t})\n\t}\n\n\tcomponent(shape: TLDrawShape) {\n\t\treturn (\n\t\t\t<SVGContainer>\n\t\t\t\t<DrawShapeSvg shape={shape} />\n\t\t\t</SVGContainer>\n\t\t)\n\t}\n\n\tindicator(shape: TLDrawShape) {\n\t\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\t\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst forceSolid = useValue(\n\t\t\t'force solid',\n\t\t\t() => {\n\t\t\t\tconst zoomLevel = this.editor.getZoomLevel()\n\t\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t\t},\n\t\t\t[this.editor, sw]\n\t\t)\n\n\t\tif (\n\t\t\t!forceSolid &&\n\t\t\t!shape.props.isPen &&\n\t\t\tshape.props.dash === 'draw' &&\n\t\t\tallPointsFromSegments.length === 1\n\t\t) {\n\t\t\tsw += rng(shape.id)() * (sw / 6)\n\t\t}\n\n\t\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\t\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, true)\n\t\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\t\tconst solidStrokePath =\n\t\t\tstrokePoints.length > 1\n\t\t\t\t? getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\t\t\t\t: getDot(allPointsFromSegments[0], sw)\n\n\t\treturn <path d={solidStrokePath} />\n\t}\n\n\toverride toSvg(shape: TLDrawShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill))\n\t\tconst scaleFactor = 1 / shape.props.scale\n\t\treturn (\n\t\t\t<g transform={`scale(${scaleFactor})`}>\n\t\t\t\t<DrawShapeSvg shape={shape} zoomOverride={1} />\n\t\t\t</g>\n\t\t)\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize(shape: TLDrawShape, info: TLResizeInfo<TLDrawShape>) {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst newSegments: TLDrawShapeSegment[] = []\n\n\t\tfor (const segment of shape.props.segments) {\n\t\t\tnewSegments.push({\n\t\t\t\t...segment,\n\t\t\t\tpoints: segment.points.map(({ x, y, z }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: toFixed(scaleX * x),\n\t\t\t\t\t\ty: toFixed(scaleY * y),\n\t\t\t\t\t\tz,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\treturn {\n\t\t\tprops: {\n\t\t\t\tsegments: newSegments,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride expandSelectionOutlinePx(shape: TLDrawShape): number {\n\t\tconst multiplier = shape.props.dash === 'draw' ? 1.6 : 1\n\t\treturn ((STROKE_SIZES[shape.props.size] * multiplier) / 2) * shape.props.scale\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLDrawShape,\n\t\tendShape: TLDrawShape,\n\t\tt: number\n\t): TLDrawShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tsegments: interpolateSegments(startShape.props.segments, endShape.props.segments, t),\n\t\t\tscale: lerp(startShape.props.scale, endShape.props.scale, t),\n\t\t}\n\t}\n}\n\nfunction getDot(point: VecLike, sw: number) {\n\tconst r = (sw + 1) * 0.5\n\treturn `M ${point.x} ${point.y} m -${r}, 0 a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 -${\n\t\tr * 2\n\t},0`\n}\n\nfunction getIsDot(shape: TLDrawShape) {\n\treturn shape.props.segments.length === 1 && shape.props.segments[0].points.length < 2\n}\n\nfunction DrawShapeSvg({ shape, zoomOverride }: { shape: TLDrawShape; zoomOverride?: number }) {\n\tconst theme = useDefaultColorTheme()\n\tconst editor = useEditor()\n\n\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\n\tlet sw = (STROKE_SIZES[shape.props.size] + 1) * shape.props.scale\n\tconst forceSolid = useValue(\n\t\t'force solid',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\treturn zoomLevel < 0.5 && zoomLevel < 1.5 / sw\n\t\t},\n\t\t[editor, sw, zoomOverride]\n\t)\n\n\tconst dotAdjustment = useValue(\n\t\t'dot adjustment',\n\t\t() => {\n\t\t\tconst zoomLevel = zoomOverride ?? editor.getZoomLevel()\n\t\t\t// If we're zoomed way out (10%), then we need to make the dotted line go to 9 instead 0.1\n\t\t\t// Chrome doesn't render anything otherwise.\n\t\t\treturn zoomLevel < 0.2 ? 0 : 0.1\n\t\t},\n\t\t[editor, zoomOverride]\n\t)\n\n\tif (\n\t\t!forceSolid &&\n\t\t!shape.props.isPen &&\n\t\tshape.props.dash === 'draw' &&\n\t\tallPointsFromSegments.length === 1\n\t) {\n\t\tsw += rng(shape.id)() * (sw / 6)\n\t}\n\n\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, forceSolid)\n\n\tif (!forceSolid && shape.props.dash === 'draw') {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{shape.props.isClosed && shape.props.fill && allPointsFromSegments.length > 1 ? (\n\t\t\t\t\t<ShapeFill\n\t\t\t\t\t\td={getSvgPathFromStrokePoints(\n\t\t\t\t\t\t\tgetStrokePoints(allPointsFromSegments, options),\n\t\t\t\t\t\t\tshape.props.isClosed\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tcolor={shape.props.color}\n\t\t\t\t\t\tfill={shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\t\t\tscale={shape.props.scale}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<path\n\t\t\t\t\td={svgInk(allPointsFromSegments, options)}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tfill={getColorValue(theme, shape.props.color, 'solid')}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\tconst isDot = strokePoints.length < 2\n\tconst solidStrokePath = isDot\n\t\t? getDot(allPointsFromSegments[0], 0)\n\t\t: getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\n\treturn (\n\t\t<>\n\t\t\t<ShapeFill\n\t\t\t\td={solidStrokePath}\n\t\t\t\ttheme={theme}\n\t\t\t\tcolor={shape.props.color}\n\t\t\t\tfill={isDot || shape.props.isClosed ? shape.props.fill : 'none'}\n\t\t\t\tscale={shape.props.scale}\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td={solidStrokePath}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tfill={isDot ? getColorValue(theme, shape.props.color, 'solid') : 'none'}\n\t\t\t\tstroke={getColorValue(theme, shape.props.color, 'solid')}\n\t\t\t\tstrokeWidth={sw}\n\t\t\t\tstrokeDasharray={isDot ? 'none' : getDrawShapeStrokeDashArray(shape, sw, dotAdjustment)}\n\t\t\t\tstrokeDashoffset=\"0\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -117,7 +117,7 @@ class EmbedShapeUtil extends import_editor.BaseBoxShapeUtil {
117
117
  border: 0,
118
118
  boxShadow: (0, import_rotated_box_shadow.getRotatedBoxShadow)(pageRotation),
119
119
  borderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,
120
- background: embedInfo?.definition.backgroundColor ?? "var(--color-background)",
120
+ background: embedInfo?.definition.backgroundColor ?? "var(--tl-color-background)",
121
121
  width: w,
122
122
  height: h
123
123
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/shapes/embed/EmbedShapeUtil.tsx"],
4
- "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\n\nimport {\n\tBaseBoxShapeUtil,\n\tHTMLContainer,\n\tTLEmbedShape,\n\tTLEmbedShapeProps,\n\tTLResizeInfo,\n\tembedShapeMigrations,\n\tembedShapeProps,\n\tlerp,\n\tresizeBox,\n\ttoDomPrecision,\n\tuseIsEditing,\n\tuseSvgExportContext,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport {\n\tDEFAULT_EMBED_DEFINITIONS,\n\tEmbedDefinition,\n\tTLEmbedDefinition,\n\tTLEmbedShapePermissions,\n\tembedShapePermissionDefaults,\n} from '../../defaultEmbedDefinitions'\nimport { TLEmbedResult, getEmbedInfo } from '../../utils/embeds/embeds'\nimport { getRotatedBoxShadow } from '../shared/rotated-box-shadow'\n\nconst getSandboxPermissions = (permissions: TLEmbedShapePermissions) => {\n\treturn Object.entries(permissions)\n\t\t.filter(([_perm, isEnabled]) => isEnabled)\n\t\t.map(([perm]) => perm)\n\t\t.join(' ')\n}\n\n/** @public */\nexport class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {\n\tstatic override type = 'embed' as const\n\tstatic override props = embedShapeProps\n\tstatic override migrations = embedShapeMigrations\n\tprivate static embedDefinitions: readonly EmbedDefinition[] = DEFAULT_EMBED_DEFINITIONS\n\n\tstatic setEmbedDefinitions(embedDefinitions: readonly TLEmbedDefinition[]) {\n\t\tEmbedShapeUtil.embedDefinitions = embedDefinitions\n\t}\n\n\tgetEmbedDefinitions(): readonly TLEmbedDefinition[] {\n\t\treturn EmbedShapeUtil.embedDefinitions\n\t}\n\n\tgetEmbedDefinition(url: string): TLEmbedResult {\n\t\treturn getEmbedInfo(EmbedShapeUtil.embedDefinitions, url)\n\t}\n\n\toverride getText(shape: TLEmbedShape) {\n\t\treturn shape.props.url\n\t}\n\n\toverride getAriaDescriptor(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.title\n\t}\n\n\toverride hideSelectionBoundsFg(shape: TLEmbedShape) {\n\t\treturn !this.canResize(shape)\n\t}\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canResize(shape: TLEmbedShape) {\n\t\treturn !!this.getEmbedDefinition(shape.props.url)?.definition?.doesResize\n\t}\n\toverride canEditInReadonly() {\n\t\treturn true\n\t}\n\n\toverride getDefaultProps(): TLEmbedShape['props'] {\n\t\treturn {\n\t\t\tw: 300,\n\t\t\th: 300,\n\t\t\turl: '',\n\t\t}\n\t}\n\n\toverride isAspectRatioLocked(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.isAspectRatioLocked ?? false\n\t}\n\n\toverride onResize(shape: TLEmbedShape, info: TLResizeInfo<TLEmbedShape>) {\n\t\tconst isAspectRatioLocked = this.isAspectRatioLocked(shape)\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\tlet minWidth = embedInfo?.definition.minWidth ?? 200\n\t\tlet minHeight = embedInfo?.definition.minHeight ?? 200\n\t\tif (isAspectRatioLocked) {\n\t\t\t// Enforce aspect ratio\n\t\t\t// Neither the width or height can be less than 200\n\t\t\tconst aspectRatio = shape.props.w / shape.props.h\n\t\t\tif (aspectRatio > 1) {\n\t\t\t\t// Landscape\n\t\t\t\tminWidth *= aspectRatio\n\t\t\t} else {\n\t\t\t\t// Portrait\n\t\t\t\tminHeight /= aspectRatio\n\t\t\t}\n\t\t}\n\n\t\treturn resizeBox(shape, info, { minWidth, minHeight })\n\t}\n\n\toverride component(shape: TLEmbedShape) {\n\t\tconst svgExport = useSvgExportContext()\n\t\tconst { w, h, url } = shape.props\n\t\tconst isEditing = useIsEditing(shape.id)\n\n\t\tconst embedInfo = this.getEmbedDefinition(url)\n\n\t\tconst isHoveringWhileEditingSameShape = useValue(\n\t\t\t'is hovering',\n\t\t\t() => {\n\t\t\t\tconst { editingShapeId, hoveredShapeId } = this.editor.getCurrentPageState()\n\n\t\t\t\tif (editingShapeId && hoveredShapeId !== editingShapeId) {\n\t\t\t\t\tconst editingShape = this.editor.getShape(editingShapeId)\n\t\t\t\t\tif (editingShape && this.editor.isShapeOfType<TLEmbedShape>(editingShape, 'embed')) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t\t[]\n\t\t)\n\n\t\tconst pageRotation = this.editor.getShapePageTransform(shape)!.rotation()\n\n\t\tif (svgExport) {\n\t\t\t// for SVG exports, we show a blank embed\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor ?? 'var(--color-background)',\n\t\t\t\t\t\t\twidth: w,\n\t\t\t\t\t\t\theight: h,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst isInteractive = isEditing || isHoveringWhileEditingSameShape\n\n\t\t// Prevent nested embedding of tldraw\n\t\tconst isIframe =\n\t\t\ttypeof window !== 'undefined' && (window !== window.top || window.self !== window.parent)\n\t\tif (isIframe && embedInfo?.definition.type === 'tldraw') return null\n\n\t\tif (embedInfo?.definition.type === 'github_gist') {\n\t\t\tconst idFromGistUrl = embedInfo.url.split('/').pop()\n\t\t\tif (!idFromGistUrl) throw Error('No gist id!')\n\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<Gist\n\t\t\t\t\t\tid={idFromGistUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)!}\n\t\t\t\t\t\theight={toDomPrecision(h)!}\n\t\t\t\t\t\tisInteractive={isInteractive}\n\t\t\t\t\t\tpageRotation={pageRotation}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst sandbox = getSandboxPermissions({\n\t\t\t...embedShapePermissionDefaults,\n\t\t\t...(embedInfo?.definition.overridePermissions ?? {}),\n\t\t})\n\n\t\treturn (\n\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t{embedInfo?.definition ? (\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tsandbox={sandbox}\n\t\t\t\t\t\tsrc={embedInfo.embedUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)}\n\t\t\t\t\t\theight={toDomPrecision(h)}\n\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\t\t\t\tframeBorder=\"0\"\n\t\t\t\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\t\t\t\ttabIndex={isEditing ? 0 : -1}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tpointerEvents: isInteractive ? 'auto' : 'none',\n\t\t\t\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</HTMLContainer>\n\t\t)\n\t}\n\n\toverride indicator(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn (\n\t\t\t<rect\n\t\t\t\twidth={toDomPrecision(shape.props.w)}\n\t\t\t\theight={toDomPrecision(shape.props.h)}\n\t\t\t\trx={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t\try={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t/>\n\t\t)\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLEmbedShape,\n\t\tendShape: TLEmbedShape,\n\t\tt: number\n\t): TLEmbedShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tw: lerp(startShape.props.w, endShape.props.w, t),\n\t\t\th: lerp(startShape.props.h, endShape.props.h, t),\n\t\t}\n\t}\n}\n\nfunction Gist({\n\tid,\n\tisInteractive,\n\twidth,\n\theight,\n\tstyle,\n\tpageRotation,\n}: {\n\tid: string\n\tisInteractive: boolean\n\twidth: number\n\theight: number\n\tpageRotation: number\n\tstyle?: React.CSSProperties\n}) {\n\t// Security warning:\n\t// Gists allow adding .json extensions to the URL which return JSONP.\n\t// Furthermore, the JSONP can include callbacks that execute arbitrary JavaScript.\n\t// It _is_ sandboxed by the iframe but we still want to disable it nonetheless.\n\t// We restrict the id to only allow hexdecimal characters to prevent this.\n\t// Read more:\n\t// https://github.com/bhaveshk90/Content-Security-Policy-CSP-Bypass-Techniques\n\t// https://github.com/renniepak/CSPBypass\n\tif (!id.match(/^[0-9a-f]+$/)) throw Error('No gist id!')\n\n\treturn (\n\t\t<iframe\n\t\t\tclassName=\"tl-embed\"\n\t\t\tdraggable={false}\n\t\t\twidth={toDomPrecision(width)}\n\t\t\theight={toDomPrecision(height)}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tframeBorder=\"0\"\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tscrolling=\"no\"\n\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\ttabIndex={isInteractive ? 0 : -1}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\tpointerEvents: isInteractive ? 'all' : 'none',\n\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t}}\n\t\t\tsrcDoc={`\n\t\t\t<html>\n\t\t\t\t<head>\n\t\t\t\t\t<base target=\"_blank\">\n\t\t\t\t</head>\n\t\t\t\t<body>\n\t\t\t\t\t<script src=${`https://gist.github.com/${id}.js`}></script>\n\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t* { margin: 0px; }\n\t\t\t\t\t\ttable { height: 100%; background-color: red; }\n\t\t\t\t\t\t.gist { background-color: none; height: 100%; }\n\t\t\t\t\t\t.gist .gist-file { height: calc(100vh - 2px); padding: 0px; display: grid; grid-template-rows: 1fr auto; }\n\t\t\t\t\t</style>\n\t\t\t\t</body>\n\t\t\t</html>`}\n\t\t/>\n\t)\n}\n"],
4
+ "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\n\nimport {\n\tBaseBoxShapeUtil,\n\tHTMLContainer,\n\tTLEmbedShape,\n\tTLEmbedShapeProps,\n\tTLResizeInfo,\n\tembedShapeMigrations,\n\tembedShapeProps,\n\tlerp,\n\tresizeBox,\n\ttoDomPrecision,\n\tuseIsEditing,\n\tuseSvgExportContext,\n\tuseValue,\n} from '@tldraw/editor'\n\nimport {\n\tDEFAULT_EMBED_DEFINITIONS,\n\tEmbedDefinition,\n\tTLEmbedDefinition,\n\tTLEmbedShapePermissions,\n\tembedShapePermissionDefaults,\n} from '../../defaultEmbedDefinitions'\nimport { TLEmbedResult, getEmbedInfo } from '../../utils/embeds/embeds'\nimport { getRotatedBoxShadow } from '../shared/rotated-box-shadow'\n\nconst getSandboxPermissions = (permissions: TLEmbedShapePermissions) => {\n\treturn Object.entries(permissions)\n\t\t.filter(([_perm, isEnabled]) => isEnabled)\n\t\t.map(([perm]) => perm)\n\t\t.join(' ')\n}\n\n/** @public */\nexport class EmbedShapeUtil extends BaseBoxShapeUtil<TLEmbedShape> {\n\tstatic override type = 'embed' as const\n\tstatic override props = embedShapeProps\n\tstatic override migrations = embedShapeMigrations\n\tprivate static embedDefinitions: readonly EmbedDefinition[] = DEFAULT_EMBED_DEFINITIONS\n\n\tstatic setEmbedDefinitions(embedDefinitions: readonly TLEmbedDefinition[]) {\n\t\tEmbedShapeUtil.embedDefinitions = embedDefinitions\n\t}\n\n\tgetEmbedDefinitions(): readonly TLEmbedDefinition[] {\n\t\treturn EmbedShapeUtil.embedDefinitions\n\t}\n\n\tgetEmbedDefinition(url: string): TLEmbedResult {\n\t\treturn getEmbedInfo(EmbedShapeUtil.embedDefinitions, url)\n\t}\n\n\toverride getText(shape: TLEmbedShape) {\n\t\treturn shape.props.url\n\t}\n\n\toverride getAriaDescriptor(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.title\n\t}\n\n\toverride hideSelectionBoundsFg(shape: TLEmbedShape) {\n\t\treturn !this.canResize(shape)\n\t}\n\toverride canEdit() {\n\t\treturn true\n\t}\n\toverride canResize(shape: TLEmbedShape) {\n\t\treturn !!this.getEmbedDefinition(shape.props.url)?.definition?.doesResize\n\t}\n\toverride canEditInReadonly() {\n\t\treturn true\n\t}\n\n\toverride getDefaultProps(): TLEmbedShape['props'] {\n\t\treturn {\n\t\t\tw: 300,\n\t\t\th: 300,\n\t\t\turl: '',\n\t\t}\n\t}\n\n\toverride isAspectRatioLocked(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn embedInfo?.definition.isAspectRatioLocked ?? false\n\t}\n\n\toverride onResize(shape: TLEmbedShape, info: TLResizeInfo<TLEmbedShape>) {\n\t\tconst isAspectRatioLocked = this.isAspectRatioLocked(shape)\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\tlet minWidth = embedInfo?.definition.minWidth ?? 200\n\t\tlet minHeight = embedInfo?.definition.minHeight ?? 200\n\t\tif (isAspectRatioLocked) {\n\t\t\t// Enforce aspect ratio\n\t\t\t// Neither the width or height can be less than 200\n\t\t\tconst aspectRatio = shape.props.w / shape.props.h\n\t\t\tif (aspectRatio > 1) {\n\t\t\t\t// Landscape\n\t\t\t\tminWidth *= aspectRatio\n\t\t\t} else {\n\t\t\t\t// Portrait\n\t\t\t\tminHeight /= aspectRatio\n\t\t\t}\n\t\t}\n\n\t\treturn resizeBox(shape, info, { minWidth, minHeight })\n\t}\n\n\toverride component(shape: TLEmbedShape) {\n\t\tconst svgExport = useSvgExportContext()\n\t\tconst { w, h, url } = shape.props\n\t\tconst isEditing = useIsEditing(shape.id)\n\n\t\tconst embedInfo = this.getEmbedDefinition(url)\n\n\t\tconst isHoveringWhileEditingSameShape = useValue(\n\t\t\t'is hovering',\n\t\t\t() => {\n\t\t\t\tconst { editingShapeId, hoveredShapeId } = this.editor.getCurrentPageState()\n\n\t\t\t\tif (editingShapeId && hoveredShapeId !== editingShapeId) {\n\t\t\t\t\tconst editingShape = this.editor.getShape(editingShapeId)\n\t\t\t\t\tif (editingShape && this.editor.isShapeOfType<TLEmbedShape>(editingShape, 'embed')) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t\t[]\n\t\t)\n\n\t\tconst pageRotation = this.editor.getShapePageTransform(shape)!.rotation()\n\n\t\tif (svgExport) {\n\t\t\t// for SVG exports, we show a blank embed\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor ?? 'var(--tl-color-background)',\n\t\t\t\t\t\t\twidth: w,\n\t\t\t\t\t\t\theight: h,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst isInteractive = isEditing || isHoveringWhileEditingSameShape\n\n\t\t// Prevent nested embedding of tldraw\n\t\tconst isIframe =\n\t\t\ttypeof window !== 'undefined' && (window !== window.top || window.self !== window.parent)\n\t\tif (isIframe && embedInfo?.definition.type === 'tldraw') return null\n\n\t\tif (embedInfo?.definition.type === 'github_gist') {\n\t\t\tconst idFromGistUrl = embedInfo.url.split('/').pop()\n\t\t\tif (!idFromGistUrl) throw Error('No gist id!')\n\n\t\t\treturn (\n\t\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t\t<Gist\n\t\t\t\t\t\tid={idFromGistUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)!}\n\t\t\t\t\t\theight={toDomPrecision(h)!}\n\t\t\t\t\t\tisInteractive={isInteractive}\n\t\t\t\t\t\tpageRotation={pageRotation}\n\t\t\t\t\t/>\n\t\t\t\t</HTMLContainer>\n\t\t\t)\n\t\t}\n\n\t\tconst sandbox = getSandboxPermissions({\n\t\t\t...embedShapePermissionDefaults,\n\t\t\t...(embedInfo?.definition.overridePermissions ?? {}),\n\t\t})\n\n\t\treturn (\n\t\t\t<HTMLContainer className=\"tl-embed-container\" id={shape.id}>\n\t\t\t\t{embedInfo?.definition ? (\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tclassName=\"tl-embed\"\n\t\t\t\t\t\tsandbox={sandbox}\n\t\t\t\t\t\tsrc={embedInfo.embedUrl}\n\t\t\t\t\t\twidth={toDomPrecision(w)}\n\t\t\t\t\t\theight={toDomPrecision(h)}\n\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\t\t\t\tframeBorder=\"0\"\n\t\t\t\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\t\t\t\ttabIndex={isEditing ? 0 : -1}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\tpointerEvents: isInteractive ? 'auto' : 'none',\n\t\t\t\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t\t\t\t\tborderRadius: embedInfo?.definition.overrideOutlineRadius ?? 8,\n\t\t\t\t\t\t\tbackground: embedInfo?.definition.backgroundColor,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</HTMLContainer>\n\t\t)\n\t}\n\n\toverride indicator(shape: TLEmbedShape) {\n\t\tconst embedInfo = this.getEmbedDefinition(shape.props.url)\n\t\treturn (\n\t\t\t<rect\n\t\t\t\twidth={toDomPrecision(shape.props.w)}\n\t\t\t\theight={toDomPrecision(shape.props.h)}\n\t\t\t\trx={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t\try={embedInfo?.definition.overrideOutlineRadius ?? 8}\n\t\t\t/>\n\t\t)\n\t}\n\toverride getInterpolatedProps(\n\t\tstartShape: TLEmbedShape,\n\t\tendShape: TLEmbedShape,\n\t\tt: number\n\t): TLEmbedShapeProps {\n\t\treturn {\n\t\t\t...(t > 0.5 ? endShape.props : startShape.props),\n\t\t\tw: lerp(startShape.props.w, endShape.props.w, t),\n\t\t\th: lerp(startShape.props.h, endShape.props.h, t),\n\t\t}\n\t}\n}\n\nfunction Gist({\n\tid,\n\tisInteractive,\n\twidth,\n\theight,\n\tstyle,\n\tpageRotation,\n}: {\n\tid: string\n\tisInteractive: boolean\n\twidth: number\n\theight: number\n\tpageRotation: number\n\tstyle?: React.CSSProperties\n}) {\n\t// Security warning:\n\t// Gists allow adding .json extensions to the URL which return JSONP.\n\t// Furthermore, the JSONP can include callbacks that execute arbitrary JavaScript.\n\t// It _is_ sandboxed by the iframe but we still want to disable it nonetheless.\n\t// We restrict the id to only allow hexdecimal characters to prevent this.\n\t// Read more:\n\t// https://github.com/bhaveshk90/Content-Security-Policy-CSP-Bypass-Techniques\n\t// https://github.com/renniepak/CSPBypass\n\tif (!id.match(/^[0-9a-f]+$/)) throw Error('No gist id!')\n\n\treturn (\n\t\t<iframe\n\t\t\tclassName=\"tl-embed\"\n\t\t\tdraggable={false}\n\t\t\twidth={toDomPrecision(width)}\n\t\t\theight={toDomPrecision(height)}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tframeBorder=\"0\"\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tscrolling=\"no\"\n\t\t\treferrerPolicy=\"no-referrer-when-downgrade\"\n\t\t\ttabIndex={isInteractive ? 0 : -1}\n\t\t\tstyle={{\n\t\t\t\t...style,\n\t\t\t\tpointerEvents: isInteractive ? 'all' : 'none',\n\t\t\t\t// Fix for safari <https://stackoverflow.com/a/49150908>\n\t\t\t\tzIndex: isInteractive ? '' : '-1',\n\t\t\t\tboxShadow: getRotatedBoxShadow(pageRotation),\n\t\t\t}}\n\t\t\tsrcDoc={`\n\t\t\t<html>\n\t\t\t\t<head>\n\t\t\t\t\t<base target=\"_blank\">\n\t\t\t\t</head>\n\t\t\t\t<body>\n\t\t\t\t\t<script src=${`https://gist.github.com/${id}.js`}></script>\n\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t* { margin: 0px; }\n\t\t\t\t\t\ttable { height: 100%; background-color: red; }\n\t\t\t\t\t\t.gist { background-color: none; height: 100%; }\n\t\t\t\t\t\t.gist .gist-file { height: calc(100vh - 2px); padding: 0px; display: grid; grid-template-rows: 1fr auto; }\n\t\t\t\t\t</style>\n\t\t\t\t</body>\n\t\t\t</html>`}\n\t\t/>\n\t)\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }