From f47ddb988f0da43e22b99201664b837d150f5254 Mon Sep 17 00:00:00 2001 From: Aakansha Doshi Date: Thu, 3 Feb 2022 20:34:59 +0530 Subject: [PATCH] =?UTF-8?q?feat:=20Support=20hyperlinks=20=F0=9F=94=A5=20?= =?UTF-8?q?=20(#4620)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Support hypelinks * dont show edit when link not present * auto submit on blur * Add link button in sidebar and do it react way * add key to hyperlink to remount when element selection changes * autofocus input * remove click handler and use pointerup/down to show /hide popup * add keydown and support enter/escape to submit * show extrrnal link icon when element has link * use icons and open link in new tab * dnt submit unless link updated * renamed ffiles * remove unnecessary changes * update snap * hide link popup once user starts interacting with element and show again only if clicked outside and clicked on element again * render link icon outside the element * fix hit testing * rewrite implementation to render hyperlinks outside elements and hide when element selected * remove * remove * tweak icon position and size * rotate link icon when element rotated, handle zooming and render exactly where ne resize handle is rendered * no need to create a new reference anymore for element when link added/updated * rotate the link image as well when rotating element * calculate hitbox of link icon and show pointer when hovering over link icon * open link when clicked on link icon * show tooltip when hovering over link icon * show link action only when single element selected * support other protocols * add shortcut cmd/ctrl+k to edit/update link * don't hide popup after submit * renderes decreased woo * Add context mneu label to add/edit link * fix tests * remove tick and show trash when in edit mode * show edit view when element contains link * fix snap * horizontally center the hyperlink container with respect to elemnt * fix padding * remove checkcircle * show popup on hover of selected element and dismiss when outside hitbox * check if element has link before setting popup state * move logic of auto hide to hyperlink and dnt hide when editing * hide popover when drag/resize/rotate * unmount during autohide * autohide after 500ms * fix regression * prevent cmd/ctrl+k when inside link editor * submit when input not updated * allow custom urls * fix centering of popup when zoomed * fix hitbox during zoom * fix * tweak link normalization * touch hyperlink tooltip DOM only if needed * consider 0 if no offsetY * reduce hitbox of link icon and make sure link icon doesn't show on top of higher z-index elements * show link tooltip only if element has higher z-index * dnt show hyperlink popup when selection changes from element with link to element with no link and also hide popover when element type changes from selection to something else * lint: EOL * fix link icon tooltip positioning * open the link only when last pointer down and last pointer up hit the link hitbox * render tooltip after 300ms delay * ensure link popup and editor input have same height * wip: cache the link icon canvas * fix the image quality after caching using device pixel ratio yay * some cleanup * remove unused selectedElementIds from renderConfig * Update src/renderer/renderElement.ts * fix `opener` vulnerability * tweak styling * decrease padding * open local links in the same tab * fix caching * code style refactor * remove unnecessary save & restore * show link shortcut in help dialog * submit on cmd/ctrl+k * merge state props * Add title for link * update editview if prop changes * tweak link action logic * make `Hyperlink` compo editor state fully controlled * dont show popup when context menu open * show in contextMenu only for single selection & change pos * set button `selected` state * set contextMenuOpen on pointerdown * set contextMenyOpen to false when action triggered * don't render link icons on export * fix tests * fix buttons wrap * move focus states to input top-level rule * fix elements sharing `Hyperlink` state * fix hitbox for link icon in case of rect * Early return if hitting link icon Co-authored-by: dwelle --- src/actions/index.ts | 1 + src/actions/shortcuts.ts | 4 +- src/actions/types.ts | 3 +- src/appState.ts | 2 + src/components/Actions.tsx | 1 + src/components/App.tsx | 217 +++++++-- src/components/HelpDialog.tsx | 4 + src/components/Tooltip.tsx | 78 ++-- src/components/icons.tsx | 8 + src/constants.ts | 1 + src/data/restore.ts | 1 + src/element/Hyperlink.scss | 74 +++ src/element/Hyperlink.tsx | 429 ++++++++++++++++++ src/element/collision.ts | 3 +- src/element/newElement.ts | 3 + src/element/types.ts | 1 + src/keys.ts | 1 + src/locales/en.json | 10 +- src/renderer/renderElement.ts | 16 +- src/renderer/renderScene.ts | 62 +++ .../__snapshots__/contextmenu.test.tsx.snap | 109 +++++ .../__snapshots__/dragCreate.test.tsx.snap | 5 + src/tests/__snapshots__/move.test.tsx.snap | 6 + .../multiPointCreate.test.tsx.snap | 2 + .../regressionTests.test.tsx.snap | 414 +++++++++++++++++ .../__snapshots__/selection.test.tsx.snap | 5 + src/tests/contextmenu.test.tsx | 1 + .../data/__snapshots__/restore.test.ts.snap | 9 + src/tests/fixtures/elementFixture.ts | 1 + .../packages/__snapshots__/utils.test.ts.snap | 1 + .../scene/__snapshots__/export.test.ts.snap | 2 +- src/types.ts | 1 + 32 files changed, 1396 insertions(+), 79 deletions(-) create mode 100644 src/element/Hyperlink.scss create mode 100644 src/element/Hyperlink.tsx diff --git a/src/actions/index.ts b/src/actions/index.ts index 887ea2e2..d5ba8a56 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -81,3 +81,4 @@ export { actionToggleZenMode } from "./actionToggleZenMode"; export { actionToggleStats } from "./actionToggleStats"; export { actionUnbindText } from "./actionUnbindText"; +export { actionLink } from "../element/Hyperlink"; diff --git a/src/actions/shortcuts.ts b/src/actions/shortcuts.ts index 0f0880f7..d018b731 100644 --- a/src/actions/shortcuts.ts +++ b/src/actions/shortcuts.ts @@ -25,7 +25,8 @@ export type ShortcutName = | "addToLibrary" | "viewMode" | "flipHorizontal" - | "flipVertical"; + | "flipVertical" + | "link"; const shortcutMap: Record = { cut: [getShortcutKey("CtrlOrCmd+X")], @@ -62,6 +63,7 @@ const shortcutMap: Record = { flipHorizontal: [getShortcutKey("Shift+H")], flipVertical: [getShortcutKey("Shift+V")], viewMode: [getShortcutKey("Alt+R")], + link: [getShortcutKey("CtrlOrCmd+K")], }; export const getShortcutFromShortcutName = (name: ShortcutName) => { diff --git a/src/actions/types.ts b/src/actions/types.ts index e9569379..19c0700a 100644 --- a/src/actions/types.ts +++ b/src/actions/types.ts @@ -104,7 +104,8 @@ export type ActionName = | "toggleTheme" | "increaseFontSize" | "decreaseFontSize" - | "unbindText"; + | "unbindText" + | "link"; export type PanelComponentProps = { elements: readonly ExcalidrawElement[]; diff --git a/src/appState.ts b/src/appState.ts index 3049febf..96851a68 100644 --- a/src/appState.ts +++ b/src/appState.ts @@ -84,6 +84,7 @@ export const getDefaultAppState = (): Omit< }, viewModeEnabled: false, pendingImageElement: null, + showHyperlinkPopup: false, }; }; @@ -174,6 +175,7 @@ const APP_STATE_STORAGE_CONF = (< zoom: { browser: true, export: false, server: false }, viewModeEnabled: { browser: false, export: false, server: false }, pendingImageElement: { browser: false, export: false, server: false }, + showHyperlinkPopup: { browser: false, export: false, server: false }, }); const _clearAppStateForStorage = < diff --git a/src/components/Actions.tsx b/src/components/Actions.tsx index cc291eac..8d423571 100644 --- a/src/components/Actions.tsx +++ b/src/components/Actions.tsx @@ -158,6 +158,7 @@ export const SelectedShapeActions = ({ {renderAction("deleteSelectedElements")} {renderAction("group")} {renderAction("ungroup")} + {targetElements.length === 1 && renderAction("link")} )} diff --git a/src/components/App.tsx b/src/components/App.tsx index 6c055c10..979ad74c 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -28,6 +28,7 @@ import { actionToggleZenMode, actionUnbindText, actionUngroup, + actionLink, } from "../actions"; import { createRedoAction, createUndoAction } from "../actions/actionHistory"; import { ActionManager } from "../actions/manager"; @@ -141,6 +142,7 @@ import { InitializedExcalidrawImageElement, ExcalidrawImageElement, FileId, + NonDeletedExcalidrawElement, } from "../element/types"; import { getCenter, getDistance } from "../gesture"; import { @@ -239,6 +241,14 @@ import { getBoundTextElementId, } from "../element/textElement"; import { isHittingElementNotConsideringBoundingBox } from "../element/collision"; +import { + normalizeLink, + showHyperlinkTooltip, + hideHyperlinkToolip, + Hyperlink, + isPointHittingLinkIcon, + isLocalLink, +} from "../element/Hyperlink"; const IsMobileContext = React.createContext(false); export const useIsMobile = () => useContext(IsMobileContext); @@ -298,6 +308,11 @@ class App extends React.Component { public files: BinaryFiles = {}; public imageCache: AppClassProperties["imageCache"] = new Map(); + hitLinkElement?: NonDeletedExcalidrawElement; + lastPointerDown: React.PointerEvent | null = null; + lastPointerUp: React.PointerEvent | PointerEvent | null = null; + contextMenuOpen: boolean = false; + constructor(props: AppProps) { super(props); const defaultAppState = getDefaultAppState(); @@ -320,6 +335,7 @@ class App extends React.Component { name, width: window.innerWidth, height: window.innerHeight, + showHyperlinkPopup: false, }; this.id = nanoid(); @@ -433,7 +449,10 @@ class App extends React.Component { public render() { const { zenModeEnabled, viewModeEnabled } = this.state; - + const selectedElement = getSelectedElements( + this.scene.getElements(), + this.state, + ); const { onCollabButtonClick, renderTopRightUI, @@ -499,6 +518,14 @@ class App extends React.Component { />
+ {selectedElement.length === 1 && this.state.showHyperlinkPopup && ( + + )} {this.state.showStats && ( { private syncActionResult = withBatchedUpdates( (actionResult: ActionResult) => { + // Since context menu closes when action triggered so setting to false + this.contextMenuOpen = false; if (this.unmounted || actionResult === false) { return; } @@ -1012,6 +1041,14 @@ class App extends React.Component { } componentDidUpdate(prevProps: AppProps, prevState: AppState) { + // Hide hyperlink popup if shown when element type is not selection + if ( + prevState.elementType === "selection" && + this.state.elementType !== "selection" && + this.state.showHyperlinkPopup + ) { + this.setState({ showHyperlinkPopup: false }); + } if (prevProps.langCode !== this.props.langCode) { this.updateLanguage(); } @@ -1157,6 +1194,7 @@ class App extends React.Component { renderScrollbars: !this.isMobile, }, ); + if (scrollBars) { currentScrollBars = scrollBars; } @@ -1481,6 +1519,7 @@ class App extends React.Component { }; removePointer = (event: React.PointerEvent | PointerEvent) => { + this.lastPointerUp = event; // remove touch handler for context menu on touch devices if (event.pointerType === "touch" && touchTimeout) { clearTimeout(touchTimeout); @@ -2083,6 +2122,7 @@ class App extends React.Component { .filter( (element) => !(isTextElement(element) && element.containerId), ); + return getElementsAtPosition(elements, (element) => hitTest(element, this.state, x, y), ); @@ -2308,6 +2348,69 @@ class App extends React.Component { } }; + private getElementLinkAtPosition = ( + scenePointer: Readonly<{ x: number; y: number }>, + hitElement: NonDeletedExcalidrawElement | null, + ): ExcalidrawElement | undefined => { + // Reversing so we traverse the elements in decreasing order + // of z-index + const elements = this.scene.getElements().slice().reverse(); + let hitElementIndex = Infinity; + + return elements.find((element, index) => { + if (hitElement && element.id === hitElement.id) { + hitElementIndex = index; + } + return ( + element.link && + isPointHittingLinkIcon(element, this.state, [ + scenePointer.x, + scenePointer.y, + ]) && + index <= hitElementIndex + ); + }); + }; + + private redirectToLink = () => { + const lastPointerDownCoords = viewportCoordsToSceneCoords( + this.lastPointerDown!, + this.state, + ); + const lastPointerDownHittingLinkIcon = isPointHittingLinkIcon( + this.hitLinkElement!, + this.state, + [lastPointerDownCoords.x, lastPointerDownCoords.y], + ); + const lastPointerUpCoords = viewportCoordsToSceneCoords( + this.lastPointerUp!, + this.state, + ); + const LastPointerUpHittingLinkIcon = isPointHittingLinkIcon( + this.hitLinkElement!, + this.state, + [lastPointerUpCoords.x, lastPointerUpCoords.y], + ); + if (lastPointerDownHittingLinkIcon && LastPointerUpHittingLinkIcon) { + const url = this.hitLinkElement?.link; + if (url) { + const target = isLocalLink(url) ? "_self" : "_blank"; + const newWindow = window.open(undefined, target); + // https://mathiasbynens.github.io/rel-noopener/ + if (newWindow) { + newWindow.opener = null; + newWindow.location = normalizeLink(url); + } + } + } + }; + private attachLinkListener = () => { + this.canvas?.addEventListener("click", this.redirectToLink); + }; + private detachLinkListener = () => { + this.canvas?.removeEventListener("click", this.redirectToLink); + }; + private handleCanvasPointerMove = ( event: React.PointerEvent, ) => { @@ -2540,42 +2643,68 @@ class App extends React.Component { scenePointer.x, scenePointer.y, ); - if (this.state.elementType === "text") { - setCursor( - this.canvas, - isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR, - ); - } else if (this.state.viewModeEnabled) { - setCursor(this.canvas, CURSOR_TYPE.GRAB); - } else if (isOverScrollBar) { - setCursor(this.canvas, CURSOR_TYPE.AUTO); - } else if (this.state.editingLinearElement) { - const element = LinearElementEditor.getElement( - this.state.editingLinearElement.elementId, - ); + this.hitLinkElement = this.getElementLinkAtPosition( + scenePointer, + hitElement, + ); + + if ( + this.hitLinkElement && + !this.state.selectedElementIds[this.hitLinkElement.id] + ) { + setCursor(this.canvas, CURSOR_TYPE.POINTER); + showHyperlinkTooltip(this.hitLinkElement, this.state); + this.attachLinkListener(); + } else { + hideHyperlinkToolip(); + this.detachLinkListener(); if ( - element && - isHittingElementNotConsideringBoundingBox(element, this.state, [ - scenePointer.x, - scenePointer.y, - ]) + hitElement && + hitElement.link && + this.state.selectedElementIds[hitElement.id] && + !this.contextMenuOpen && + !this.state.showHyperlinkPopup + ) { + this.setState({ showHyperlinkPopup: "info" }); + } + if (this.state.elementType === "text") { + setCursor( + this.canvas, + isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR, + ); + } else if (this.state.viewModeEnabled) { + setCursor(this.canvas, CURSOR_TYPE.GRAB); + } else if (isOverScrollBar) { + setCursor(this.canvas, CURSOR_TYPE.AUTO); + } else if (this.state.editingLinearElement) { + const element = LinearElementEditor.getElement( + this.state.editingLinearElement.elementId, + ); + + if ( + element && + isHittingElementNotConsideringBoundingBox(element, this.state, [ + scenePointer.x, + scenePointer.y, + ]) + ) { + setCursor(this.canvas, CURSOR_TYPE.MOVE); + } else { + setCursor(this.canvas, CURSOR_TYPE.AUTO); + } + } else if ( + // if using cmd/ctrl, we're not dragging + !event[KEYS.CTRL_OR_CMD] && + (hitElement || + this.isHittingCommonBoundingBoxOfSelectedElements( + scenePointer, + selectedElements, + )) ) { setCursor(this.canvas, CURSOR_TYPE.MOVE); } else { setCursor(this.canvas, CURSOR_TYPE.AUTO); } - } else if ( - // if using cmd/ctrl, we're not dragging - !event[KEYS.CTRL_OR_CMD] && - (hitElement || - this.isHittingCommonBoundingBoxOfSelectedElements( - scenePointer, - selectedElements, - )) - ) { - setCursor(this.canvas, CURSOR_TYPE.MOVE); - } else { - setCursor(this.canvas, CURSOR_TYPE.AUTO); } }; @@ -2594,7 +2723,6 @@ class App extends React.Component { if (selection?.anchorNode) { selection.removeAllRanges(); } - this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event); this.maybeCleanupAfterMissingPointerUp(event); @@ -2612,7 +2740,7 @@ class App extends React.Component { if (isPanning) { return; } - + this.lastPointerDown = event; this.setState({ lastPointerDownWith: event.pointerType, cursorButton: "down", @@ -2646,6 +2774,8 @@ class App extends React.Component { return; } + // Since context menu closes on pointer down so setting to false + this.contextMenuOpen = false; this.clearSelectionIfNotUsingSelection(); this.updateBindingEnabledOnPointerMove(event); @@ -3072,7 +3202,6 @@ class App extends React.Component { return true; } } - // hitElement may already be set above, so check first pointerDownState.hit.element = pointerDownState.hit.element ?? @@ -3082,6 +3211,15 @@ class App extends React.Component { ); if (pointerDownState.hit.element) { + // Early return if pointer is hitting link icon + if ( + isPointHittingLinkIcon(pointerDownState.hit.element, this.state, [ + pointerDownState.origin.x, + pointerDownState.origin.y, + ]) + ) { + return false; + } pointerDownState.hit.hasHitElementInside = isHittingElementNotConsideringBoundingBox( pointerDownState.hit.element, @@ -3163,6 +3301,7 @@ class App extends React.Component { ...prevState.selectedElementIds, [hitElement.id]: true, }, + showHyperlinkPopup: hitElement.link ? "info" : false, }, this.scene.getElements(), ); @@ -3819,6 +3958,11 @@ class App extends React.Component { } : null), }, + showHyperlinkPopup: + elementsWithinSelection.length === 1 && + elementsWithinSelection[0].link + ? "info" + : false, }, this.scene.getElements(), ), @@ -4970,6 +5114,10 @@ class App extends React.Component { }, type: "canvas" | "element", ) => { + if (this.state.showHyperlinkPopup) { + this.setState({ showHyperlinkPopup: false }); + } + this.contextMenuOpen = true; const maybeGroupAction = actionGroup.contextItemPredicate!( this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState(), @@ -5116,6 +5264,7 @@ class App extends React.Component { maybeFlipHorizontal && actionFlipHorizontal, maybeFlipVertical && actionFlipVertical, (maybeFlipHorizontal || maybeFlipVertical) && separator, + actionLink.contextItemPredicate(elements, this.state) && actionLink, actionDuplicateSelection, actionDeleteSelected, ], diff --git a/src/components/HelpDialog.tsx b/src/components/HelpDialog.tsx index d4e209f6..a03c4799 100644 --- a/src/components/HelpDialog.tsx +++ b/src/components/HelpDialog.tsx @@ -205,6 +205,10 @@ export const HelpDialog = ({ onClose }: { onClose?: () => void }) => { label={t("helpDialog.preventBinding")} shortcuts={[getShortcutKey("CtrlOrCmd")]} /> + { +export const getTooltipDiv = () => { const existingDiv = document.querySelector( ".excalidraw-tooltip", ); @@ -15,6 +15,50 @@ const getTooltipDiv = () => { return div; }; +export const updateTooltipPosition = ( + tooltip: HTMLDivElement, + item: { + left: number; + top: number; + width: number; + height: number; + }, + position: "bottom" | "top" = "bottom", +) => { + const tooltipRect = tooltip.getBoundingClientRect(); + + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; + + const margin = 5; + + let left = item.left + item.width / 2 - tooltipRect.width / 2; + if (left < 0) { + left = margin; + } else if (left + tooltipRect.width >= viewportWidth) { + left = viewportWidth - tooltipRect.width - margin; + } + + let top: number; + + if (position === "bottom") { + top = item.top + item.height + margin; + if (top + tooltipRect.height >= viewportHeight) { + top = item.top - tooltipRect.height - margin; + } + } else { + top = item.top - tooltipRect.height - margin; + if (top < 0) { + top = item.top + item.height + margin; + } + } + + Object.assign(tooltip.style, { + top: `${top}px`, + left: `${left}px`, + }); +}; + const updateTooltip = ( item: HTMLDivElement, tooltip: HTMLDivElement, @@ -27,35 +71,8 @@ const updateTooltip = ( tooltip.textContent = label; - const { - x: itemX, - bottom: itemBottom, - top: itemTop, - width: itemWidth, - } = item.getBoundingClientRect(); - - const { width: labelWidth, height: labelHeight } = - tooltip.getBoundingClientRect(); - - const viewportWidth = window.innerWidth; - const viewportHeight = window.innerHeight; - - const margin = 5; - - const left = itemX + itemWidth / 2 - labelWidth / 2; - const offsetLeft = - left + labelWidth >= viewportWidth ? left + labelWidth - viewportWidth : 0; - - const top = itemBottom + margin; - const offsetTop = - top + labelHeight >= viewportHeight - ? itemBottom - itemTop + labelHeight + margin * 2 - : 0; - - Object.assign(tooltip.style, { - top: `${top - offsetTop}px`, - left: `${left - offsetLeft}px`, - }); + const itemRect = item.getBoundingClientRect(); + updateTooltipPosition(tooltip, itemRect); }; type TooltipProps = { @@ -75,7 +92,6 @@ export const Tooltip = ({ return () => getTooltipDiv().classList.remove("excalidraw-tooltip--visible"); }, []); - return (
, { width: 640, height: 512 }, ); + +export const editIcon = createIcon( + , + { width: 640, height: 512 }, +); diff --git a/src/constants.ts b/src/constants.ts index 26baf34b..e27044f9 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -115,6 +115,7 @@ export const TOAST_TIMEOUT = 5000; export const VERSION_TIMEOUT = 30000; export const SCROLL_TIMEOUT = 100; export const ZOOM_STEP = 0.1; +export const HYPERLINK_TOOLTIP_DELAY = 300; // Report a user inactive after IDLE_THRESHOLD milliseconds export const IDLE_THRESHOLD = 60_000; diff --git a/src/data/restore.ts b/src/data/restore.ts index f9e03b6a..b55bd952 100644 --- a/src/data/restore.ts +++ b/src/data/restore.ts @@ -105,6 +105,7 @@ const restoreElementWithProperties = < ? element.boundElementIds.map((id) => ({ type: "arrow", id })) : element.boundElements ?? [], updated: element.updated ?? getUpdatedTimestamp(), + link: element.link ?? null, }; return { diff --git a/src/element/Hyperlink.scss b/src/element/Hyperlink.scss new file mode 100644 index 00000000..964a6b47 --- /dev/null +++ b/src/element/Hyperlink.scss @@ -0,0 +1,74 @@ +@import "../css/variables.module"; + +.excalidraw-hyperlinkContainer { + display: flex; + align-items: center; + justify-content: space-between; + position: absolute; + box-shadow: 0px 2px 4px 0 rgb(0 0 0 / 30%); + z-index: 100; + background: var(--island-bg-color); + border-radius: var(--border-radius-md); + box-sizing: border-box; + // to account for LS due to rendering icons after new link created + min-height: 42px; + + &-input, + button { + z-index: 100; + } + + &-input, + &-link { + height: 24px; + padding: 0 8px; + line-height: 24px; + font-size: 0.9rem; + font-weight: 500; + font-family: var(--ui-font); + } + + &-input { + width: 18rem; + border: none; + background-color: transparent; + color: var(--text-primary-color); + + outline: none; + border: none; + box-shadow: none !important; + } + + &-link { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 15rem; + } + + button { + color: $oc-blue-6; + background-color: transparent !important; + font-weight: 500; + &.excalidraw-hyperlinkContainer--remove { + color: $oc-red-9; + } + } + + .d-none { + display: none; + } + + &--remove .ToolIcon__icon svg { + color: $oc-red-6; + } + + .ToolIcon__icon { + width: 2rem; + height: 2rem; + } + + &__buttons { + flex: 0 0 auto; + } +} diff --git a/src/element/Hyperlink.tsx b/src/element/Hyperlink.tsx new file mode 100644 index 00000000..261b58a5 --- /dev/null +++ b/src/element/Hyperlink.tsx @@ -0,0 +1,429 @@ +import { AppState, Point } from "../types"; +import { + getShortcutKey, + sceneCoordsToViewportCoords, + viewportCoordsToSceneCoords, +} from "../utils"; +import { mutateElement } from "./mutateElement"; +import { NonDeletedExcalidrawElement } from "./types"; + +import { register } from "../actions/register"; +import { ToolButton } from "../components/ToolButton"; +import { editIcon, link, trash } from "../components/icons"; +import { t } from "../i18n"; +import { + useCallback, + useEffect, + useLayoutEffect, + useRef, + useState, +} from "react"; +import clsx from "clsx"; +import { KEYS } from "../keys"; +import { DEFAULT_LINK_SIZE } from "../renderer/renderElement"; +import { rotate } from "../math"; +import { EVENT, HYPERLINK_TOOLTIP_DELAY, MIME_TYPES } from "../constants"; +import { Bounds } from "./bounds"; +import { getTooltipDiv, updateTooltipPosition } from "../components/Tooltip"; +import { getSelectedElements } from "../scene"; +import { isPointHittingElementBoundingBox } from "./collision"; +import { getElementAbsoluteCoords } from "./"; + +import "./Hyperlink.scss"; + +const CONTAINER_WIDTH = 320; +const SPACE_BOTTOM = 85; +const CONTAINER_PADDING = 5; +const CONTAINER_HEIGHT = 42; +const AUTO_HIDE_TIMEOUT = 500; + +export const EXTERNAL_LINK_IMG = document.createElement("img"); +EXTERNAL_LINK_IMG.src = `data:${MIME_TYPES.svg}, ${encodeURIComponent( + ``, +)}`; + +let IS_HYPERLINK_TOOLTIP_VISIBLE = false; + +export const Hyperlink = ({ + element, + appState, + setAppState, +}: { + element: NonDeletedExcalidrawElement; + appState: AppState; + setAppState: React.Component["setState"]; +}) => { + const linkVal = element.link || ""; + + const [inputVal, setInputVal] = useState(linkVal); + const inputRef = useRef(null); + const isEditing = appState.showHyperlinkPopup === "editor" || !linkVal; + + const handleSubmit = useCallback(() => { + if (!inputRef.current) { + return; + } + + const link = normalizeLink(inputRef.current.value); + + mutateElement(element, { link }); + setAppState({ showHyperlinkPopup: "info" }); + }, [element, setAppState]); + + useLayoutEffect(() => { + return () => { + handleSubmit(); + }; + }, [handleSubmit]); + + useEffect(() => { + let timeoutId: number | null = null; + const handlePointerMove = (event: PointerEvent) => { + if (isEditing) { + return; + } + if (timeoutId) { + clearTimeout(timeoutId); + } + const shouldHide = shouldHideLinkPopup(element, appState, [ + event.clientX, + event.clientY, + ]) as boolean; + if (shouldHide) { + timeoutId = window.setTimeout(() => { + setAppState({ showHyperlinkPopup: false }); + }, AUTO_HIDE_TIMEOUT); + } + }; + window.addEventListener(EVENT.POINTER_MOVE, handlePointerMove, false); + return () => { + window.removeEventListener(EVENT.POINTER_MOVE, handlePointerMove, false); + if (timeoutId) { + clearTimeout(timeoutId); + } + }; + }, [appState, element, isEditing, setAppState]); + + const handleRemove = useCallback(() => { + mutateElement(element, { link: null }); + if (isEditing) { + inputRef.current!.value = ""; + } + setAppState({ showHyperlinkPopup: false }); + }, [setAppState, element, isEditing]); + + const onEdit = () => { + setAppState({ showHyperlinkPopup: "editor" }); + }; + const { x, y } = getCoordsForPopover(element, appState); + if ( + appState.draggingElement || + appState.resizingElement || + appState.isRotating + ) { + return null; + } + return ( +
+ {isEditing ? ( + setInputVal(event.target.value)} + autoFocus + onKeyDown={(event) => { + event.stopPropagation(); + // prevent cmd/ctrl+k shortcut when editing link + if (event[KEYS.CTRL_OR_CMD] && event.key === KEYS.K) { + event.preventDefault(); + } + if (event.key === KEYS.ENTER || event.key === KEYS.ESCAPE) { + handleSubmit(); + } + }} + /> + ) : ( + + {element.link} + + )} +
+ {!isEditing && ( + + )} + + {linkVal && ( + + )} +
+
+ ); +}; + +const getCoordsForPopover = ( + element: NonDeletedExcalidrawElement, + appState: AppState, +) => { + const { x: viewPortX, y: viewPortY } = sceneCoordsToViewportCoords( + { sceneX: element.x + element.width / 2, sceneY: element.y }, + appState, + ); + const x = viewPortX - CONTAINER_WIDTH / 2; + const y = viewPortY - SPACE_BOTTOM; + return { x, y }; +}; + +export const normalizeLink = (link: string) => { + link = link.trim(); + if (link) { + // prefix with protocol if not fully-qualified + if (!link.includes("://") && !/^[[\\/]/.test(link)) { + link = `https://${link}`; + } + } + return link; +}; + +export const isLocalLink = (link: string | null) => { + return !!(link?.includes(location.origin) || link?.startsWith("/")); +}; + +export const actionLink = register({ + name: "link", + perform: (elements, appState) => { + if (appState.showHyperlinkPopup === "editor") { + return false; + } + return { + elements, + appState: { + ...appState, + showHyperlinkPopup: "editor", + }, + commitToHistory: true, + }; + }, + keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.K, + contextItemLabel: (elements, appState) => + getContextMenuLabel(elements, appState), + contextItemPredicate: (elements, appState) => { + const selectedElements = getSelectedElements(elements, appState); + return selectedElements.length === 1; + }, + PanelComponent: ({ elements, appState, updateData }) => { + const selectedElements = getSelectedElements(elements, appState); + + return ( + updateData(null)} + selected={selectedElements.length === 1 && !!selectedElements[0].link} + /> + ); + }, +}); + +export const getContextMenuLabel = ( + elements: readonly NonDeletedExcalidrawElement[], + appState: AppState, +) => { + const selectedElements = getSelectedElements(elements, appState); + const label = selectedElements[0]!.link + ? "labels.link.edit" + : "labels.link.create"; + return label; +}; +export const getLinkHandleFromCoords = ( + [x1, y1, x2, y2]: Bounds, + angle: number, + appState: AppState, +): [x: number, y: number, width: number, height: number] => { + const size = DEFAULT_LINK_SIZE; + const linkWidth = size / appState.zoom.value; + const linkHeight = size / appState.zoom.value; + const linkMarginY = size / appState.zoom.value; + const centerX = (x1 + x2) / 2; + const centerY = (y1 + y2) / 2; + const centeringOffset = (size - 8) / (2 * appState.zoom.value); + const dashedLineMargin = 4 / appState.zoom.value; + + // Same as `ne` resize handle + const x = x2 + dashedLineMargin - centeringOffset; + const y = y1 - dashedLineMargin - linkMarginY + centeringOffset; + + const [rotatedX, rotatedY] = rotate( + x + linkWidth / 2, + y + linkHeight / 2, + centerX, + centerY, + angle, + ); + return [ + rotatedX - linkWidth / 2, + rotatedY - linkHeight / 2, + linkWidth, + linkHeight, + ]; +}; + +export const isPointHittingLinkIcon = ( + element: NonDeletedExcalidrawElement, + appState: AppState, + [x, y]: Point, +) => { + const threshold = 4 / appState.zoom.value; + + const [x1, y1, x2, y2] = getElementAbsoluteCoords(element); + + const [linkX, linkY, linkWidth, linkHeight] = getLinkHandleFromCoords( + [x1, y1, x2, y2], + element.angle, + appState, + ); + const hitLink = + x > linkX - threshold && + x < linkX + threshold + linkWidth && + y > linkY - threshold && + y < linkY + linkHeight + threshold; + + return hitLink; +}; + +let HYPERLINK_TOOLTIP_TIMEOUT_ID: number | null = null; +export const showHyperlinkTooltip = ( + element: NonDeletedExcalidrawElement, + appState: AppState, +) => { + if (HYPERLINK_TOOLTIP_TIMEOUT_ID) { + clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID); + } + HYPERLINK_TOOLTIP_TIMEOUT_ID = window.setTimeout( + () => renderTooltip(element, appState), + HYPERLINK_TOOLTIP_DELAY, + ); +}; + +const renderTooltip = ( + element: NonDeletedExcalidrawElement, + appState: AppState, +) => { + if (!element.link) { + return; + } + + const tooltipDiv = getTooltipDiv(); + + tooltipDiv.classList.add("excalidraw-tooltip--visible"); + tooltipDiv.style.maxWidth = "20rem"; + tooltipDiv.textContent = element.link; + + const [x1, y1, x2, y2] = getElementAbsoluteCoords(element); + + const [linkX, linkY, linkWidth, linkHeight] = getLinkHandleFromCoords( + [x1, y1, x2, y2], + element.angle, + appState, + ); + + const linkViewportCoords = sceneCoordsToViewportCoords( + { sceneX: linkX, sceneY: linkY }, + appState, + ); + + updateTooltipPosition( + tooltipDiv, + { + left: linkViewportCoords.x, + top: linkViewportCoords.y, + width: linkWidth, + height: linkHeight, + }, + "top", + ); + + IS_HYPERLINK_TOOLTIP_VISIBLE = true; +}; +export const hideHyperlinkToolip = () => { + if (HYPERLINK_TOOLTIP_TIMEOUT_ID) { + clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID); + } + if (IS_HYPERLINK_TOOLTIP_VISIBLE) { + IS_HYPERLINK_TOOLTIP_VISIBLE = false; + getTooltipDiv().classList.remove("excalidraw-tooltip--visible"); + } +}; + +export const shouldHideLinkPopup = ( + element: NonDeletedExcalidrawElement, + appState: AppState, + [clientX, clientY]: Point, +): Boolean => { + const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords( + { clientX, clientY }, + appState, + ); + + const threshold = 15 / appState.zoom.value; + // hitbox to prevent hiding when hovered in element bounding box + if (isPointHittingElementBoundingBox(element, [sceneX, sceneY], threshold)) { + return false; + } + + // hit box to prevent hiding when hovered in the vertical area between element and popover + if ( + sceneX >= element.x && + sceneX <= element.x + element.width && + sceneY <= element.y && + sceneY >= element.y - SPACE_BOTTOM + ) { + return false; + } + // hit box to prevent hiding when hovered around popover within threshold + const { x: popoverX, y: popoverY } = getCoordsForPopover(element, appState); + + if ( + clientX >= popoverX - threshold && + clientX <= popoverX + CONTAINER_WIDTH + CONTAINER_PADDING * 2 + threshold && + clientY >= popoverY - threshold && + clientY <= popoverY + threshold + CONTAINER_PADDING * 2 + CONTAINER_HEIGHT + ) { + return false; + } + return true; +}; diff --git a/src/element/collision.ts b/src/element/collision.ts index 8f267ea5..4eb6405e 100644 --- a/src/element/collision.ts +++ b/src/element/collision.ts @@ -96,7 +96,6 @@ export const isHittingElementNotConsideringBoundingBox = ( : isElementDraggableFromInside(element) ? isInsideCheck : isNearCheck; - return hitTestPointAgainstElement({ element, point, threshold, check }); }; @@ -105,7 +104,7 @@ const isElementSelected = ( element: NonDeleted, ) => appState.selectedElementIds[element.id]; -const isPointHittingElementBoundingBox = ( +export const isPointHittingElementBoundingBox = ( element: NonDeleted, [x, y]: Point, threshold: number, diff --git a/src/element/newElement.ts b/src/element/newElement.ts index 4ca051bb..95312c41 100644 --- a/src/element/newElement.ts +++ b/src/element/newElement.ts @@ -35,6 +35,7 @@ type ElementConstructorOpts = MarkOptional< | "seed" | "version" | "versionNonce" + | "link" >; const _newElementBase = ( @@ -55,6 +56,7 @@ const _newElementBase = ( groupIds = [], strokeSharpness, boundElements = null, + link = null, ...rest }: ElementConstructorOpts & Omit, "type">, ) => { @@ -81,6 +83,7 @@ const _newElementBase = ( isDeleted: false as false, boundElements, updated: getUpdatedTimestamp(), + link, }; return element; }; diff --git a/src/element/types.ts b/src/element/types.ts index 48259771..92aba772 100644 --- a/src/element/types.ts +++ b/src/element/types.ts @@ -52,6 +52,7 @@ type _ExcalidrawElementBase = Readonly<{ | null; /** epoch (ms) timestamp of last element update */ updated: number; + link: string | null; }>; export type ExcalidrawSelectionElement = _ExcalidrawElementBase & { diff --git a/src/keys.ts b/src/keys.ts index 6219197f..bd20bbb0 100644 --- a/src/keys.ts +++ b/src/keys.ts @@ -61,6 +61,7 @@ export const KEYS = { X: "x", Y: "y", Z: "z", + K: "k", } as const; export type Key = keyof typeof KEYS; diff --git a/src/locales/en.json b/src/locales/en.json index 5eeab4ef..fb01e1ba 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -105,7 +105,12 @@ "excalidrawLib": "Excalidraw Library", "decreaseFontSize": "Decrease font size", "increaseFontSize": "Increase font size", - "unbindText": "Unbind text" + "unbindText": "Unbind text", + "link": { + "edit": "Edit link", + "create": "Create link", + "label": "Link" + } }, "buttons": { "clearReset": "Reset the canvas", @@ -188,7 +193,8 @@ "text": "Text", "library": "Library", "lock": "Keep selected tool active after drawing", - "penMode": "Prevent pinch-zoom and accept freedraw input only from pen" + "penMode": "Prevent pinch-zoom and accept freedraw input only from pen", + "link": "Add/ Update link for a selected shape" }, "headings": { "canvasActions": "Canvas actions", diff --git a/src/renderer/renderElement.ts b/src/renderer/renderElement.ts index 63f164ed..ae7eb9ea 100644 --- a/src/renderer/renderElement.ts +++ b/src/renderer/renderElement.ts @@ -145,6 +145,8 @@ const generateElementCanvas = ( }; }; +export const DEFAULT_LINK_SIZE = 14; + const IMAGE_PLACEHOLDER_IMG = document.createElement("img"); IMAGE_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent( ``, @@ -410,23 +412,23 @@ const generateElementShape = ( topY + (rightY - topY) * 0.25 } L ${rightX - (rightX - topX) * 0.25} ${ rightY - (rightY - topY) * 0.25 - } + } C ${rightX} ${rightY}, ${rightX} ${rightY}, ${ rightX - (rightX - bottomX) * 0.25 - } ${rightY + (bottomY - rightY) * 0.25} + } ${rightY + (bottomY - rightY) * 0.25} L ${bottomX + (rightX - bottomX) * 0.25} ${ bottomY - (bottomY - rightY) * 0.25 - } + } C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${ bottomX - (bottomX - leftX) * 0.25 - } ${bottomY - (bottomY - leftY) * 0.25} + } ${bottomY - (bottomY - leftY) * 0.25} L ${leftX + (bottomX - leftX) * 0.25} ${ leftY + (bottomY - leftY) * 0.25 - } + } C ${leftX} ${leftY}, ${leftX} ${leftY}, ${ leftX + (topX - leftX) * 0.25 - } ${leftY - (leftY - topY) * 0.25} - L ${topX - (topX - leftX) * 0.25} ${topY + (leftY - topY) * 0.25} + } ${leftY - (leftY - topY) * 0.25} + L ${topX - (topX - leftX) * 0.25} ${topY + (leftY - topY) * 0.25} C ${topX} ${topY}, ${topX} ${topY}, ${ topX + (rightX - topX) * 0.25 } ${topY + (rightY - topY) * 0.25}`, diff --git a/src/renderer/renderScene.ts b/src/renderer/renderScene.ts index dbf735e1..00557aeb 100644 --- a/src/renderer/renderScene.ts +++ b/src/renderer/renderScene.ts @@ -50,6 +50,10 @@ import { import { viewportCoordsToSceneCoords, supportsEmoji } from "../utils"; import { UserIdleState } from "../types"; import { THEME_FILTER } from "../constants"; +import { + EXTERNAL_LINK_IMG, + getLinkHandleFromCoords, +} from "../element/Hyperlink"; const hasEmojiSupport = supportsEmoji(); @@ -260,6 +264,9 @@ export const renderScene = ( visibleElements.forEach((element) => { try { renderElement(element, rc, context, renderConfig); + if (!isExporting) { + renderLinkIcon(element, context, appState); + } } catch (error: any) { console.error(error); } @@ -740,6 +747,61 @@ const renderBindingHighlightForSuggestedPointBinding = ( }); }; +let linkCanvasCache: any; +const renderLinkIcon = ( + element: NonDeletedExcalidrawElement, + context: CanvasRenderingContext2D, + appState: AppState, +) => { + if (element.link && !appState.selectedElementIds[element.id]) { + const [x1, y1, x2, y2] = getElementAbsoluteCoords(element); + const [x, y, width, height] = getLinkHandleFromCoords( + [x1, y1, x2, y2], + element.angle, + appState, + ); + const centerX = x + width / 2; + const centerY = y + height / 2; + context.save(); + context.translate(appState.scrollX + centerX, appState.scrollY + centerY); + context.rotate(element.angle); + + if (!linkCanvasCache || linkCanvasCache.zoom !== appState.zoom.value) { + linkCanvasCache = document.createElement("canvas"); + linkCanvasCache.zoom = appState.zoom.value; + linkCanvasCache.width = + width * window.devicePixelRatio * appState.zoom.value; + linkCanvasCache.height = + height * window.devicePixelRatio * appState.zoom.value; + const linkCanvasCacheContext = linkCanvasCache.getContext("2d")!; + linkCanvasCacheContext.scale( + window.devicePixelRatio * appState.zoom.value, + window.devicePixelRatio * appState.zoom.value, + ); + linkCanvasCacheContext.fillStyle = "#fff"; + linkCanvasCacheContext.fillRect(0, 0, width, height); + linkCanvasCacheContext.drawImage(EXTERNAL_LINK_IMG, 0, 0, width, height); + linkCanvasCacheContext.restore(); + context.drawImage( + linkCanvasCache, + x - centerX, + y - centerY, + width, + height, + ); + } else { + context.drawImage( + linkCanvasCache, + x - centerX, + y - centerY, + width, + height, + ); + } + context.restore(); + } +}; + const isVisibleElement = ( element: ExcalidrawElement, canvasWidth: number, diff --git a/src/tests/__snapshots__/contextmenu.test.tsx.snap b/src/tests/__snapshots__/contextmenu.test.tsx.snap index e8a0c22f..89efe544 100644 --- a/src/tests/__snapshots__/contextmenu.test.tsx.snap +++ b/src/tests/__snapshots__/contextmenu.test.tsx.snap @@ -64,6 +64,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -89,6 +90,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -143,6 +145,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -232,6 +235,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -257,6 +261,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -284,6 +289,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -338,6 +344,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -376,6 +383,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -400,6 +408,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -438,6 +447,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -462,6 +472,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -551,6 +562,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -576,6 +588,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -603,6 +616,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -657,6 +671,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -695,6 +710,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -719,6 +735,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -757,6 +774,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -781,6 +799,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -870,6 +889,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -895,6 +915,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -949,6 +970,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1036,6 +1058,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -1061,6 +1084,7 @@ Object { "height": 20, "id": "id0", "isDeleted": true, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1115,6 +1139,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1151,6 +1176,7 @@ Object { "height": 20, "id": "id0", "isDeleted": true, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1240,6 +1266,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -1265,6 +1292,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1292,6 +1320,7 @@ Object { "height": 20, "id": "id0_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -1346,6 +1375,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1384,6 +1414,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1408,6 +1439,7 @@ Object { "height": 20, "id": "id0_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -1503,6 +1535,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -1530,6 +1563,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1559,6 +1593,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -1613,6 +1648,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1651,6 +1687,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1675,6 +1712,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -1719,6 +1757,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1745,6 +1784,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -1834,6 +1874,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -1859,6 +1900,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 60, "roughness": 2, "seed": 1278240551, @@ -1886,6 +1928,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 60, "roughness": 2, "seed": 400692809, @@ -1940,6 +1983,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -1978,6 +2022,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2002,6 +2047,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2040,6 +2086,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2064,6 +2111,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2102,6 +2150,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2126,6 +2175,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2164,6 +2214,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2188,6 +2239,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2226,6 +2278,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2250,6 +2303,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2288,6 +2342,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2312,6 +2367,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2350,6 +2406,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2374,6 +2431,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 2, "seed": 400692809, @@ -2412,6 +2470,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2436,6 +2495,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 60, "roughness": 2, "seed": 400692809, @@ -2474,6 +2534,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 60, "roughness": 2, "seed": 1278240551, @@ -2498,6 +2559,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 60, "roughness": 2, "seed": 400692809, @@ -2587,6 +2649,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -2612,6 +2675,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2639,6 +2703,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2693,6 +2758,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2731,6 +2797,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2755,6 +2822,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2793,6 +2861,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2817,6 +2886,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -2906,6 +2976,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -2931,6 +3002,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -2958,6 +3030,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3012,6 +3085,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3050,6 +3124,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3074,6 +3149,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3112,6 +3188,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3136,6 +3213,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3229,6 +3307,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -3254,6 +3333,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -3281,6 +3361,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -3335,6 +3416,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -3373,6 +3455,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -3397,6 +3480,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -3441,6 +3525,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -3467,6 +3552,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -3507,6 +3593,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -3531,6 +3618,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -3626,6 +3714,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -3651,6 +3740,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3678,6 +3768,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3732,6 +3823,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3770,6 +3862,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3794,6 +3887,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3891,6 +3985,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -3918,6 +4013,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -3947,6 +4043,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -4001,6 +4098,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4039,6 +4137,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4063,6 +4162,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -4108,6 +4208,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4134,6 +4235,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -4221,6 +4323,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -4324,6 +4427,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -4403,6 +4507,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -4428,6 +4533,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -4455,6 +4561,7 @@ Object { "height": 200, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4482,6 +4589,7 @@ Object { "height": 200, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -4536,6 +4644,7 @@ Object { "height": 20, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, diff --git a/src/tests/__snapshots__/dragCreate.test.tsx.snap b/src/tests/__snapshots__/dragCreate.test.tsx.snap index 73b993c6..92848d4d 100644 --- a/src/tests/__snapshots__/dragCreate.test.tsx.snap +++ b/src/tests/__snapshots__/dragCreate.test.tsx.snap @@ -15,6 +15,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -56,6 +57,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -85,6 +87,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -115,6 +118,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -156,6 +160,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, diff --git a/src/tests/__snapshots__/move.test.tsx.snap b/src/tests/__snapshots__/move.test.tsx.snap index 4de904b2..7971a53c 100644 --- a/src/tests/__snapshots__/move.test.tsx.snap +++ b/src/tests/__snapshots__/move.test.tsx.snap @@ -10,6 +10,7 @@ Object { "height": 50, "id": "id0_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -37,6 +38,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -64,6 +66,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -96,6 +99,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -128,6 +132,7 @@ Object { "height": 300, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -162,6 +167,7 @@ Object { "id": "id2", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ diff --git a/src/tests/__snapshots__/multiPointCreate.test.tsx.snap b/src/tests/__snapshots__/multiPointCreate.test.tsx.snap index 316dab12..8fa46f1f 100644 --- a/src/tests/__snapshots__/multiPointCreate.test.tsx.snap +++ b/src/tests/__snapshots__/multiPointCreate.test.tsx.snap @@ -16,6 +16,7 @@ Object { 70, 110, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -65,6 +66,7 @@ Object { 70, 110, ], + "link": null, "opacity": 100, "points": Array [ Array [ diff --git a/src/tests/__snapshots__/regressionTests.test.tsx.snap b/src/tests/__snapshots__/regressionTests.test.tsx.snap index ef6ffb1a..837a518e 100644 --- a/src/tests/__snapshots__/regressionTests.test.tsx.snap +++ b/src/tests/__snapshots__/regressionTests.test.tsx.snap @@ -75,6 +75,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -100,6 +101,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -129,6 +131,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -158,6 +161,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -212,6 +216,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -250,6 +255,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -274,6 +280,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -312,6 +319,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -336,6 +344,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -360,6 +369,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -403,6 +413,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -429,6 +440,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -455,6 +467,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -562,6 +575,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -587,6 +601,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -616,6 +631,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -645,6 +661,7 @@ Object { "height": 100, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -699,6 +716,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -737,6 +755,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -761,6 +780,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -799,6 +819,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -823,6 +844,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -847,6 +869,7 @@ Object { "height": 100, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -889,6 +912,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -915,6 +939,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -941,6 +966,7 @@ Object { "height": 100, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -1031,6 +1057,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -1059,6 +1086,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1089,6 +1117,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1118,6 +1147,7 @@ Object { "height": 10, "id": "id7", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -1172,6 +1202,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1210,6 +1241,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1234,6 +1266,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1279,6 +1312,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1305,6 +1339,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1346,6 +1381,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1372,6 +1408,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1412,6 +1449,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1438,6 +1476,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1462,6 +1501,7 @@ Object { "height": 10, "id": "id7", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -1509,6 +1549,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1536,6 +1577,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1562,6 +1604,7 @@ Object { "height": 10, "id": "id7", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -1604,6 +1647,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1631,6 +1675,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1657,6 +1702,7 @@ Object { "height": 10, "id": "id7", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -1699,6 +1745,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1726,6 +1773,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -1752,6 +1800,7 @@ Object { "height": 10, "id": "id7", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -1844,6 +1893,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -1869,6 +1919,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1923,6 +1974,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -1962,6 +2014,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2059,6 +2112,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -2084,6 +2138,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -2113,6 +2168,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2142,6 +2198,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -2196,6 +2253,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2234,6 +2292,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2258,6 +2317,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -2296,6 +2356,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2320,6 +2381,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -2344,6 +2406,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -2387,6 +2450,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -2413,6 +2477,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2439,6 +2504,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -2531,6 +2597,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -2556,6 +2623,7 @@ Object { "height": 10, "id": "id0_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -2583,6 +2651,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2637,6 +2706,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2676,6 +2746,7 @@ Object { "height": 10, "id": "id0_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -2700,6 +2771,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2789,6 +2861,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -2814,6 +2887,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2868,6 +2942,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -2960,6 +3035,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -2985,6 +3061,7 @@ Object { "height": 200, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3012,6 +3089,7 @@ Object { "height": 200, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3039,6 +3117,7 @@ Object { "height": 350, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 2019559783, @@ -3093,6 +3172,7 @@ Object { "height": 200, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3131,6 +3211,7 @@ Object { "height": 200, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3155,6 +3236,7 @@ Object { "height": 200, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3193,6 +3275,7 @@ Object { "height": 200, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3217,6 +3300,7 @@ Object { "height": 200, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3241,6 +3325,7 @@ Object { "height": 350, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 2019559783, @@ -3280,6 +3365,7 @@ Object { "height": 200, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -3304,6 +3390,7 @@ Object { "height": 200, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 453191, @@ -3328,6 +3415,7 @@ Object { "height": 350, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 2019559783, @@ -3417,6 +3505,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -3442,6 +3531,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3496,6 +3586,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3534,6 +3625,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3572,6 +3664,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3664,6 +3757,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -3689,6 +3783,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3743,6 +3838,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3782,6 +3878,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3876,6 +3973,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -3901,6 +3999,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3955,6 +4054,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -3994,6 +4094,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4034,6 +4135,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4126,6 +4228,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -4151,6 +4254,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4178,6 +4282,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4232,6 +4337,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4270,6 +4376,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4294,6 +4401,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4387,6 +4495,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -4412,6 +4521,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4439,6 +4549,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4466,6 +4577,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -4520,6 +4632,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4558,6 +4671,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4582,6 +4696,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4620,6 +4735,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4644,6 +4760,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4668,6 +4785,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -4721,6 +4839,7 @@ Object { "height": 0, "id": "id3", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 2019559783, @@ -4788,6 +4907,7 @@ Object { "height": 0, "id": "id3", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 2019559783, @@ -4805,6 +4925,7 @@ Object { }, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -4830,6 +4951,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4857,6 +4979,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -4911,6 +5034,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4949,6 +5073,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -4973,6 +5098,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5026,6 +5152,7 @@ Object { "height": 0, "id": "id3", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 2019559783, @@ -5087,6 +5214,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -5112,6 +5240,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5139,6 +5268,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5193,6 +5323,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5231,6 +5362,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5255,6 +5387,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5308,6 +5441,7 @@ Object { "height": 0, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5373,6 +5507,7 @@ Object { "height": 0, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5390,6 +5525,7 @@ Object { }, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -5415,6 +5551,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5469,6 +5606,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5522,6 +5660,7 @@ Object { "height": 0, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5581,6 +5720,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -5606,6 +5746,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5660,6 +5801,7 @@ Object { "height": 100, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5749,6 +5891,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -5776,6 +5919,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5805,6 +5949,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5834,6 +5979,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -5888,6 +6034,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5926,6 +6073,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -5950,6 +6098,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -5988,6 +6137,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6012,6 +6162,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -6036,6 +6187,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -6080,6 +6232,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6106,6 +6259,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -6132,6 +6286,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -6228,6 +6383,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -6253,6 +6409,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6280,6 +6437,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -6334,6 +6492,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6372,6 +6531,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6396,6 +6556,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -6437,6 +6598,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6461,6 +6623,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -6550,6 +6713,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -6575,6 +6739,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6602,6 +6767,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -6629,6 +6795,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -6659,6 +6826,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -6701,6 +6869,7 @@ Object { "id": "id4", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -6746,6 +6915,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -6795,6 +6965,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -6842,6 +7013,7 @@ Object { 50, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -6916,6 +7088,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6954,6 +7127,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -6978,6 +7152,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -7016,6 +7191,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -7040,6 +7216,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -7064,6 +7241,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -7102,6 +7280,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -7126,6 +7305,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -7150,6 +7330,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -7177,6 +7358,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7227,6 +7409,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -7251,6 +7434,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -7275,6 +7459,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -7302,6 +7487,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7341,6 +7527,7 @@ Object { "id": "id4", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7391,6 +7578,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -7415,6 +7603,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -7439,6 +7628,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -7466,6 +7656,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7505,6 +7696,7 @@ Object { "id": "id4", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7547,6 +7739,7 @@ Object { 50, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7597,6 +7790,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -7621,6 +7815,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -7645,6 +7840,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -7672,6 +7868,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7711,6 +7908,7 @@ Object { "id": "id4", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7753,6 +7951,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7807,6 +8006,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -7831,6 +8031,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -7855,6 +8056,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -7882,6 +8084,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7921,6 +8124,7 @@ Object { "id": "id4", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -7963,6 +8167,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8009,6 +8214,7 @@ Object { 50, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8059,6 +8265,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -8083,6 +8290,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -8107,6 +8315,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -8134,6 +8343,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8173,6 +8383,7 @@ Object { "id": "id4", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8215,6 +8426,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8261,6 +8473,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8315,6 +8528,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -8339,6 +8553,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -8363,6 +8578,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -8390,6 +8606,7 @@ Object { "id": "id3", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8429,6 +8646,7 @@ Object { "id": "id4", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8471,6 +8689,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8517,6 +8736,7 @@ Object { 80, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8561,6 +8781,7 @@ Object { 50, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -8675,6 +8896,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -8700,6 +8922,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -8727,6 +8950,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -8754,6 +8978,7 @@ Object { "height": 100, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -8808,6 +9033,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -8846,6 +9072,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -8870,6 +9097,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -8908,6 +9136,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -8932,6 +9161,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -8956,6 +9186,7 @@ Object { "height": 100, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -9051,6 +9282,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -9076,6 +9308,7 @@ Object { "height": 0, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9103,6 +9336,7 @@ Object { "height": 1000, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -9155,6 +9389,7 @@ Object { "height": 0, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9193,6 +9428,7 @@ Object { "height": 0, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9217,6 +9453,7 @@ Object { "height": 1000, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -9310,6 +9547,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -9335,6 +9573,7 @@ Object { "height": 1000, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9362,6 +9601,7 @@ Object { "height": 500, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -9417,6 +9657,7 @@ Object { "height": 1000, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9441,6 +9682,7 @@ Object { "height": 500, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -9535,6 +9777,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -9560,6 +9803,7 @@ Object { "height": 1000, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9587,6 +9831,7 @@ Object { "height": 500, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -9642,6 +9887,7 @@ Object { "height": 1000, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9666,6 +9912,7 @@ Object { "height": 500, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -9706,6 +9953,7 @@ Object { "height": 1000, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9730,6 +9978,7 @@ Object { "height": 500, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1278240551, @@ -9819,6 +10068,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -9844,6 +10094,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9898,6 +10149,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -9987,6 +10239,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -10012,6 +10265,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -10066,6 +10320,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -10155,6 +10410,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -10180,6 +10436,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -10234,6 +10491,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -10323,6 +10581,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -10351,6 +10610,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -10420,6 +10680,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -10521,6 +10782,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -10549,6 +10811,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -10618,6 +10881,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -10719,6 +10983,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -10748,6 +11013,7 @@ Object { 10, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -10826,6 +11092,7 @@ Object { 10, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -10935,6 +11202,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -10963,6 +11231,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -11032,6 +11301,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -11133,6 +11403,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -11158,6 +11429,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -11212,6 +11484,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -11301,6 +11574,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -11326,6 +11600,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -11380,6 +11655,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -11469,6 +11745,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -11497,6 +11774,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -11566,6 +11844,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -11667,6 +11946,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -11692,6 +11972,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -11746,6 +12027,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -11835,6 +12117,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -11864,6 +12147,7 @@ Object { 10, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -11942,6 +12226,7 @@ Object { 10, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -12062,6 +12347,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -12089,6 +12375,7 @@ Object { "height": 10, "id": "id0_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 915032327, @@ -12118,6 +12405,7 @@ Object { "height": 10, "id": "id1_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 747212839, @@ -12147,6 +12435,7 @@ Object { "height": 10, "id": "id2_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 760410951, @@ -12176,6 +12465,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12205,6 +12495,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -12234,6 +12525,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -12288,6 +12580,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12326,6 +12619,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12350,6 +12644,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -12388,6 +12683,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12412,6 +12708,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -12436,6 +12733,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -12481,6 +12779,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12507,6 +12806,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -12533,6 +12833,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -12579,6 +12880,7 @@ Object { "height": 10, "id": "id0_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 915032327, @@ -12605,6 +12907,7 @@ Object { "height": 10, "id": "id1_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 747212839, @@ -12631,6 +12934,7 @@ Object { "height": 10, "id": "id2_copy", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 760410951, @@ -12657,6 +12961,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12683,6 +12988,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -12709,6 +13015,7 @@ Object { "height": 10, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -12802,6 +13109,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -12827,6 +13135,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12854,6 +13163,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -12908,6 +13218,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12946,6 +13257,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -12970,6 +13282,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -13059,6 +13372,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": true, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -13160,6 +13474,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -13266,6 +13581,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -13291,6 +13607,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13345,6 +13662,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13443,6 +13761,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -13468,6 +13787,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13495,6 +13815,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -13549,6 +13870,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13587,6 +13909,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13611,6 +13934,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -13653,6 +13977,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13677,6 +14002,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -13766,6 +14092,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -13791,6 +14118,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13845,6 +14173,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13883,6 +14212,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -13983,6 +14313,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -14011,6 +14342,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14041,6 +14373,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14071,6 +14404,7 @@ Object { "height": 10, "id": "id5", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1014066025, @@ -14101,6 +14435,7 @@ Object { "height": 10, "id": "id6", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -14155,6 +14490,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14193,6 +14529,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14217,6 +14554,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14262,6 +14600,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14288,6 +14627,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14328,6 +14668,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14354,6 +14695,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14378,6 +14720,7 @@ Object { "height": 10, "id": "id5", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1014066025, @@ -14418,6 +14761,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14444,6 +14788,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14468,6 +14813,7 @@ Object { "height": 10, "id": "id5", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1014066025, @@ -14492,6 +14838,7 @@ Object { "height": 10, "id": "id6", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -14537,6 +14884,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14563,6 +14911,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14589,6 +14938,7 @@ Object { "height": 10, "id": "id5", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1014066025, @@ -14615,6 +14965,7 @@ Object { "height": 10, "id": "id6", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -14661,6 +15012,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -14688,6 +15040,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14715,6 +15068,7 @@ Object { "height": 10, "id": "id5", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1014066025, @@ -14742,6 +15096,7 @@ Object { "height": 10, "id": "id6", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 400692809, @@ -14829,6 +15184,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -14934,6 +15290,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -14961,6 +15318,7 @@ Object { "height": 50, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -14991,6 +15349,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15021,6 +15380,7 @@ Object { "height": 50, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -15075,6 +15435,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15113,6 +15474,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15137,6 +15499,7 @@ Object { "height": 50, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15175,6 +15538,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15199,6 +15563,7 @@ Object { "height": 50, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15223,6 +15588,7 @@ Object { "height": 50, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -15267,6 +15633,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15293,6 +15660,7 @@ Object { "height": 50, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15319,6 +15687,7 @@ Object { "height": 50, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -15361,6 +15730,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15387,6 +15757,7 @@ Object { "height": 50, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15413,6 +15784,7 @@ Object { "height": 50, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -15457,6 +15829,7 @@ Object { "height": 50, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15484,6 +15857,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15511,6 +15885,7 @@ Object { "height": 50, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -15556,6 +15931,7 @@ Object { "height": 50, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15583,6 +15959,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15610,6 +15987,7 @@ Object { "height": 50, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -15663,6 +16041,7 @@ Object { "height": 0, "id": "id4", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1116226695, @@ -15732,6 +16111,7 @@ Object { "height": 0, "id": "id4", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 1116226695, @@ -15749,6 +16129,7 @@ Object { }, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -15774,6 +16155,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15801,6 +16183,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15828,6 +16211,7 @@ Object { "height": 100, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -15882,6 +16266,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15920,6 +16305,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -15944,6 +16330,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -15982,6 +16369,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16006,6 +16394,7 @@ Object { "height": 100, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -16030,6 +16419,7 @@ Object { "height": 100, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -16083,6 +16473,7 @@ Object { "height": 0, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -16150,6 +16541,7 @@ Object { "height": 0, "id": "id2", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 401146281, @@ -16167,6 +16559,7 @@ Object { }, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -16192,6 +16585,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16219,6 +16613,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -16273,6 +16668,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16311,6 +16707,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16335,6 +16732,7 @@ Object { "height": 10, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -16424,6 +16822,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": true, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -16527,6 +16926,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -16552,6 +16952,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16579,6 +16980,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -16612,6 +17014,7 @@ Object { 60, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -16666,6 +17069,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16690,6 +17094,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -16720,6 +17125,7 @@ Object { 100, 20, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -16774,6 +17180,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16798,6 +17205,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -16828,6 +17236,7 @@ Object { 60, 10, ], + "link": null, "opacity": 100, "points": Array [ Array [ @@ -16891,6 +17300,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16929,6 +17339,7 @@ Object { "height": 10, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -16953,6 +17364,7 @@ Object { "height": 20, "id": "id1", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 449462985, @@ -17040,6 +17452,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], @@ -17141,6 +17554,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], diff --git a/src/tests/__snapshots__/selection.test.tsx.snap b/src/tests/__snapshots__/selection.test.tsx.snap index 14bc658b..e89f709d 100644 --- a/src/tests/__snapshots__/selection.test.tsx.snap +++ b/src/tests/__snapshots__/selection.test.tsx.snap @@ -13,6 +13,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -55,6 +56,7 @@ Object { "id": "id0", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -94,6 +96,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -121,6 +124,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, @@ -148,6 +152,7 @@ Object { "height": 50, "id": "id0", "isDeleted": false, + "link": null, "opacity": 100, "roughness": 1, "seed": 337897, diff --git a/src/tests/contextmenu.test.tsx b/src/tests/contextmenu.test.tsx index e847de4c..663282ed 100644 --- a/src/tests/contextmenu.test.tsx +++ b/src/tests/contextmenu.test.tsx @@ -136,6 +136,7 @@ describe("contextMenu element", () => { "sendToBack", "bringToFront", "duplicateSelection", + "link", ]; expect(contextMenu).not.toBeNull(); diff --git a/src/tests/data/__snapshots__/restore.test.ts.snap b/src/tests/data/__snapshots__/restore.test.ts.snap index b9b89f8b..a63c16ee 100644 --- a/src/tests/data/__snapshots__/restore.test.ts.snap +++ b/src/tests/data/__snapshots__/restore.test.ts.snap @@ -13,6 +13,7 @@ Object { "id": "id-arrow01", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -56,6 +57,7 @@ Object { "height": 200, "id": "1", "isDeleted": false, + "link": null, "opacity": 10, "roughness": 2, "seed": Any, @@ -87,6 +89,7 @@ Object { "height": 200, "id": "2", "isDeleted": false, + "link": null, "opacity": 10, "roughness": 2, "seed": Any, @@ -118,6 +121,7 @@ Object { "height": 200, "id": "3", "isDeleted": false, + "link": null, "opacity": 10, "roughness": 2, "seed": Any, @@ -146,6 +150,7 @@ Object { "id": "id-freedraw01", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [], "pressures": Array [], @@ -179,6 +184,7 @@ Object { "id": "id-line01", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -221,6 +227,7 @@ Object { "id": "id-draw01", "isDeleted": false, "lastCommittedPoint": null, + "link": null, "opacity": 100, "points": Array [ Array [ @@ -264,6 +271,7 @@ Object { "height": 100, "id": "id-text01", "isDeleted": false, + "link": null, "opacity": 100, "originalText": "text", "roughness": 1, @@ -299,6 +307,7 @@ Object { "height": 100, "id": "id-text01", "isDeleted": false, + "link": null, "opacity": 100, "originalText": "test", "roughness": 1, diff --git a/src/tests/fixtures/elementFixture.ts b/src/tests/fixtures/elementFixture.ts index 24391f84..0b84d0af 100644 --- a/src/tests/fixtures/elementFixture.ts +++ b/src/tests/fixtures/elementFixture.ts @@ -22,6 +22,7 @@ const elementBase: Omit = { isDeleted: false, boundElements: null, updated: 1, + link: null, }; export const rectangleFixture: ExcalidrawElement = { diff --git a/src/tests/packages/__snapshots__/utils.test.ts.snap b/src/tests/packages/__snapshots__/utils.test.ts.snap index bb53c159..6ebff174 100644 --- a/src/tests/packages/__snapshots__/utils.test.ts.snap +++ b/src/tests/packages/__snapshots__/utils.test.ts.snap @@ -60,6 +60,7 @@ Object { "selectionElement": null, "shouldCacheIgnoreZoom": false, "showHelpDialog": false, + "showHyperlinkPopup": false, "showStats": false, "startBoundElement": null, "suggestedBindings": Array [], diff --git a/src/tests/scene/__snapshots__/export.test.ts.snap b/src/tests/scene/__snapshots__/export.test.ts.snap index 06fe8eb7..c75f2b2f 100644 --- a/src/tests/scene/__snapshots__/export.test.ts.snap +++ b/src/tests/scene/__snapshots__/export.test.ts.snap @@ -74,7 +74,7 @@ exports[`exportToSvg with default arguments 1`] = ` exports[`exportToSvg with exportEmbedScene 1`] = ` " - eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1STU9cdTAwMDMhXHUwMDEwvfdXbPDapLtrv+ytWmNMjFx1MDAxZXpoovFAl9mFlFx1MDAwMlx1MDAwNbZcdTAwMWZp+t9cdTAwMDXaLrrx4l1cdTAwMGUk83hvZph5x06SIHtQgCZcdIJ9gTkjXHUwMDFh71DX41vQhknhnvJcdTAwMTBcdTAwMWJZ61wiMKm1atLrcelcdTAwMDRUXHUwMDFhe+ZcdTAwMDOHNVxia1x1MDAxY+PDxUlyXGa3e2HEq7ZcdTAwMGK9eZuWKyZIvinWo5fZ9Ok9SFx1MDAwM2nvOP2s38RcdTAwMDdf+HbUxDtGLHVYlqZcckaBVdS2QCwq7tuMiLFaruBBcql9IzdpOLH0XHUwMDEyXHUwMDE3q0rLWpDIyVx1MDAwNlx1MDAxOC/LyClcdTAwMTnnc3vg51x1MDAwMeCC1lx1MDAxYVCrwuLaYlx1MDAwYm90RrpcdTAwMDFHlStZUVx1MDAwMcb80EiFXHUwMDBiZlx1MDAwZq1f+f7UM1x00/1s56dYq0tcdTAwMWVkfPCtM1x1MDAwMFx1MDAxMlL1s+FgdJeOm5e43yxP2+irXHUwMDE0YddZNlx1MDAxZadpP1x1MDAxZlxyXHUwMDFiXHUwMDA2MzO3alx1MDAxYtKWmFx1MDAxYohz9CN8jDZcdTAwMTA1581jrVxiPoviV6/WI1xmr6UgKOCn7r97/t3zXHUwMDA391x1MDAwMOdMXHUwMDE5uLjH3eGHXGIrNbdO5ChnL6Etg939L9sqw/H64D2/LfBcdTAwMWRcdTAwMWNPndNcdTAwMTfZZ1DTIn0= + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1STU9cdTAwMDMhXHUwMDEwvfdXbPDapLtrv+ytWmNMjFx1MDAxZXpoovFAl9mFlFx1MDAwMlx1MDAwNbZcdTAwMWZp+t9cdTAwMDXaLrrx5lVcdTAwMGUk83hvZph5x06SIHtQgCZcdIJ9gTkjXHUwMDFh71DX41vQhknhnvJcdTAwMTBcdTAwMWJZ61wiMKm1atLrcelcdTAwMDRUXHUwMDFhe+ZcdTAwMDOHNVxia1x1MDAxY+PDxUlyXGa3e2HEq7ZcdTAwMGK9eZuWKyZIvinWo5fZ9Ok9SFx1MDAwM2nvOP2s38RcdTAwMDdf+HbUxDtGLHVYlqZcckaBVdS2QCwq7tuMiLFaruBBcql9IzdpOLH0XHUwMDEyXHUwMDE3q0rLWpDIyVx1MDAwNlx1MDAxOC/LyClcdTAwMTnnc3vg51x1MDAwMeCC1lx1MDAxYVCrwuLaYlx1MDAwYm90RrpcdTAwMDFHlStZUVx1MDAwMcb80EiFXHUwMDBiZlx1MDAwZq1f+f7UM1x00/1s56dYq0tcdTAwMWVkfPCtM1x1MDAwMFx1MDAxMlL1s+FgdJeOm5e43yxP2+irXHUwMDE0YddZNlx1MDAxZadpP1x1MDAxZlxyXHUwMDFiXHUwMDA2MzO3alx1MDAxYtKWmFx1MDAxYohz9CN8jDZcdTAwMTA1581jrVxiPoviVzlcdTAwMTOrNu9qR8LwWlxuglx1MDAwMn7q/jvq31F/dFx1MDAxNHDOlIGLo9xcdTAwMWR+jbBSc+tcdTAwMTI5ytlfaMtgd//LXHUwMDA2y3C8PvjRb1x1MDAxMHxXx1Pn9Fx1MDAwNbeWWs0ifQ==