f47ddb988f
* 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 <luzar.david@gmail.com>
183 lines
4.4 KiB
TypeScript
183 lines
4.4 KiB
TypeScript
import cssVariables from "./css/variables.module.scss";
|
|
import { AppProps } from "./types";
|
|
import { FontFamilyValues } from "./element/types";
|
|
|
|
export const APP_NAME = "Excalidraw";
|
|
|
|
export const DRAGGING_THRESHOLD = 10; // px
|
|
export const LINE_CONFIRM_THRESHOLD = 8; // px
|
|
export const ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;
|
|
export const ELEMENT_TRANSLATE_AMOUNT = 1;
|
|
export const TEXT_TO_CENTER_SNAP_THRESHOLD = 30;
|
|
export const SHIFT_LOCKING_ANGLE = Math.PI / 12;
|
|
export const CURSOR_TYPE = {
|
|
TEXT: "text",
|
|
CROSSHAIR: "crosshair",
|
|
GRABBING: "grabbing",
|
|
GRAB: "grab",
|
|
POINTER: "pointer",
|
|
MOVE: "move",
|
|
AUTO: "",
|
|
};
|
|
export const POINTER_BUTTON = {
|
|
MAIN: 0,
|
|
WHEEL: 1,
|
|
SECONDARY: 2,
|
|
TOUCH: -1,
|
|
};
|
|
|
|
export enum EVENT {
|
|
COPY = "copy",
|
|
PASTE = "paste",
|
|
CUT = "cut",
|
|
KEYDOWN = "keydown",
|
|
KEYUP = "keyup",
|
|
MOUSE_MOVE = "mousemove",
|
|
RESIZE = "resize",
|
|
UNLOAD = "unload",
|
|
FOCUS = "focus",
|
|
BLUR = "blur",
|
|
DRAG_OVER = "dragover",
|
|
DROP = "drop",
|
|
GESTURE_END = "gestureend",
|
|
BEFORE_UNLOAD = "beforeunload",
|
|
GESTURE_START = "gesturestart",
|
|
GESTURE_CHANGE = "gesturechange",
|
|
POINTER_MOVE = "pointermove",
|
|
POINTER_UP = "pointerup",
|
|
STATE_CHANGE = "statechange",
|
|
WHEEL = "wheel",
|
|
TOUCH_START = "touchstart",
|
|
TOUCH_END = "touchend",
|
|
HASHCHANGE = "hashchange",
|
|
VISIBILITY_CHANGE = "visibilitychange",
|
|
SCROLL = "scroll",
|
|
}
|
|
|
|
export const ENV = {
|
|
TEST: "test",
|
|
DEVELOPMENT: "development",
|
|
};
|
|
|
|
export const CLASSES = {
|
|
SHAPE_ACTIONS_MENU: "App-menu__left",
|
|
};
|
|
|
|
// 1-based in case we ever do `if(element.fontFamily)`
|
|
export const FONT_FAMILY = {
|
|
Virgil: 1,
|
|
Helvetica: 2,
|
|
Cascadia: 3,
|
|
};
|
|
|
|
export const THEME = {
|
|
LIGHT: "light",
|
|
DARK: "dark",
|
|
};
|
|
|
|
export const WINDOWS_EMOJI_FALLBACK_FONT = "Segoe UI Emoji";
|
|
|
|
export const DEFAULT_FONT_SIZE = 20;
|
|
export const DEFAULT_FONT_FAMILY: FontFamilyValues = FONT_FAMILY.Virgil;
|
|
export const DEFAULT_TEXT_ALIGN = "left";
|
|
export const DEFAULT_VERTICAL_ALIGN = "top";
|
|
export const DEFAULT_VERSION = "{version}";
|
|
|
|
export const CANVAS_ONLY_ACTIONS = ["selectAll"];
|
|
|
|
export const GRID_SIZE = 20; // TODO make it configurable?
|
|
|
|
export const MIME_TYPES = {
|
|
excalidraw: "application/vnd.excalidraw+json",
|
|
excalidrawlib: "application/vnd.excalidrawlib+json",
|
|
json: "application/json",
|
|
svg: "image/svg+xml",
|
|
png: "image/png",
|
|
jpg: "image/jpeg",
|
|
gif: "image/gif",
|
|
binary: "application/octet-stream",
|
|
} as const;
|
|
|
|
export const EXPORT_DATA_TYPES = {
|
|
excalidraw: "excalidraw",
|
|
excalidrawClipboard: "excalidraw/clipboard",
|
|
excalidrawLibrary: "excalidrawlib",
|
|
} as const;
|
|
|
|
export const EXPORT_SOURCE = window.location.origin;
|
|
|
|
// time in milliseconds
|
|
export const IMAGE_RENDER_TIMEOUT = 500;
|
|
export const TAP_TWICE_TIMEOUT = 300;
|
|
export const TOUCH_CTX_MENU_TIMEOUT = 500;
|
|
export const TITLE_TIMEOUT = 10000;
|
|
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;
|
|
// Report a user active each ACTIVE_THRESHOLD milliseconds
|
|
export const ACTIVE_THRESHOLD = 3_000;
|
|
|
|
export const MODES = {
|
|
VIEW: "viewMode",
|
|
ZEN: "zenMode",
|
|
GRID: "gridMode",
|
|
};
|
|
|
|
export const THEME_FILTER = cssVariables.themeFilter;
|
|
|
|
export const URL_QUERY_KEYS = {
|
|
addLibrary: "addLibrary",
|
|
} as const;
|
|
|
|
export const URL_HASH_KEYS = {
|
|
addLibrary: "addLibrary",
|
|
} as const;
|
|
|
|
export const DEFAULT_UI_OPTIONS: AppProps["UIOptions"] = {
|
|
canvasActions: {
|
|
changeViewBackgroundColor: true,
|
|
clearCanvas: true,
|
|
export: { saveFileToDisk: true },
|
|
loadScene: true,
|
|
saveToActiveFile: true,
|
|
theme: true,
|
|
saveAsImage: true,
|
|
},
|
|
};
|
|
|
|
export const MQ_MAX_WIDTH_PORTRAIT = 730;
|
|
export const MQ_MAX_WIDTH_LANDSCAPE = 1000;
|
|
export const MQ_MAX_HEIGHT_LANDSCAPE = 500;
|
|
|
|
export const MAX_DECIMALS_FOR_SVG_EXPORT = 2;
|
|
|
|
export const EXPORT_SCALES = [1, 2, 3];
|
|
export const DEFAULT_EXPORT_PADDING = 10; // px
|
|
|
|
export const DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT = 1440;
|
|
|
|
export const ALLOWED_IMAGE_MIME_TYPES = [
|
|
MIME_TYPES.png,
|
|
MIME_TYPES.jpg,
|
|
MIME_TYPES.svg,
|
|
MIME_TYPES.gif,
|
|
] as const;
|
|
|
|
export const MAX_ALLOWED_FILE_BYTES = 2 * 1024 * 1024;
|
|
|
|
export const SVG_NS = "http://www.w3.org/2000/svg";
|
|
|
|
export const ENCRYPTION_KEY_BITS = 128;
|
|
|
|
export const VERSIONS = {
|
|
excalidraw: 2,
|
|
excalidrawLibrary: 2,
|
|
} as const;
|
|
|
|
export const BOUND_TEXT_PADDING = 5;
|