From a5fdf6efbbbaa4a19116f7196d5fa619f2457050 Mon Sep 17 00:00:00 2001 From: zsviczian Date: Sat, 22 Jul 2023 14:42:25 +0200 Subject: [PATCH] deleted ExcalidrawAutomateInterface declaration --- src/ExcalidrawAutomate.ts | 48 +++--- src/constants.ts | 15 +- src/index.ts | 3 +- src/types.d.ts | 343 ++------------------------------------ 4 files changed, 41 insertions(+), 368 deletions(-) diff --git a/src/ExcalidrawAutomate.ts b/src/ExcalidrawAutomate.ts index 25c2f72..27d011f 100644 --- a/src/ExcalidrawAutomate.ts +++ b/src/ExcalidrawAutomate.ts @@ -1,4 +1,4 @@ -import ExcalidrawPlugin from "./main"; +import ExcalidrawPlugin from "src/main"; import { FillStyle, StrokeStyle, @@ -13,8 +13,8 @@ import { } from "@zsviczian/excalidraw/types/element/types"; import { normalizePath, Notice, TFile, WorkspaceLeaf } from "obsidian"; import * as obsidian_module from "obsidian"; -import ExcalidrawView, { ExportSettings, TextMode } from "./ExcalidrawView"; -import { ExcalidrawData, getMarkdownDrawingSection } from "./ExcalidrawData"; +import ExcalidrawView, { ExportSettings, TextMode } from "src/ExcalidrawView"; +import { ExcalidrawData, getMarkdownDrawingSection } from "src/ExcalidrawData"; import { FRONTMATTER, nanoid, @@ -29,8 +29,9 @@ import { getMaximumGroups, intersectElementWithLine, measureText, -} from "./Constants"; -import { getDrawingFilename, getNewUniqueFilepath, } from "./utils/FileUtils"; + DEVICE, +} from "src/Constants"; +import { getDrawingFilename, getNewUniqueFilepath, } from "src/utils/FileUtils"; import { //debug, embedFontsInSVG, @@ -43,15 +44,15 @@ import { log, scaleLoadedImage, wrapTextAtCharLength, -} from "./utils/Utils"; -import { getAttachmentsFolderAndFilePath, getNewOrAdjacentLeaf, isObsidianThemeDark } from "./utils/ObsidianUtils"; -import { AppState, BinaryFileData, DataURL, ExcalidrawImperativeAPI, Point } from "@zsviczian/excalidraw/types/types"; -import { EmbeddedFile, EmbeddedFilesLoader, FileData } from "./EmbeddedFileLoader"; -import { tex2dataURL } from "./LaTeX"; -import { NewFileActions, Prompt } from "./dialogs/Prompt"; -import { t } from "./lang/helpers"; -import { ScriptEngine } from "./Scripts"; -import { ConnectionPoint, ExcalidrawAutomateInterface } from "./types"; +} from "src/utils/Utils"; +import { getAttachmentsFolderAndFilePath, getNewOrAdjacentLeaf, isObsidianThemeDark } from "src/utils/ObsidianUtils"; +import { AppState, BinaryFileData, ExcalidrawImperativeAPI, Point } from "@zsviczian/excalidraw/types/types"; +import { EmbeddedFile, EmbeddedFilesLoader, FileData } from "src/EmbeddedFileLoader"; +import { tex2dataURL } from "src/LaTeX"; +import { NewFileActions, Prompt } from "src/dialogs/Prompt"; +import { t } from "src/lang/helpers"; +import { ScriptEngine } from "src/Scripts"; +import { ConnectionPoint, DeviceType } from "src/types"; import CM, { ColorMaster, extendPlugins } from "colormaster"; import HarmonyPlugin from "colormaster/plugins/harmony"; import MixPlugin from "colormaster/plugins/mix" @@ -67,10 +68,10 @@ import HSVPlugin from "colormaster/plugins/hsv"; import RYBPlugin from "colormaster/plugins/ryb"; import CMYKPlugin from "colormaster/plugins/cmyk"; import { TInput } from "colormaster/types"; -import {ConversionResult, svgToExcalidraw} from "./svgToExcalidraw/parser" -import { ROUNDNESS } from "./Constants"; +import {ConversionResult, svgToExcalidraw} from "src/svgToExcalidraw/parser" +import { ROUNDNESS } from "src/Constants"; import { ClipboardData } from "@zsviczian/excalidraw/types/clipboard"; -import { emulateKeysForLinkClick, KeyEvent, PaneTarget } from "./utils/ModifierkeyHelper"; +import { emulateKeysForLinkClick, KeyEvent, PaneTarget } from "src/utils/ModifierkeyHelper"; extendPlugins([ HarmonyPlugin, @@ -92,13 +93,7 @@ declare const PLUGIN_VERSION:string; const GAP = 4; -declare global { - interface Window { - ExcalidrawAutomate: ExcalidrawAutomateInterface; - } -} - -export class ExcalidrawAutomate implements ExcalidrawAutomateInterface { +export class ExcalidrawAutomate { /** * Utility function that returns the Obsidian Module object. */ @@ -106,6 +101,10 @@ export class ExcalidrawAutomate implements ExcalidrawAutomateInterface { return obsidian_module; }; + get DEVICE():DeviceType { + return DEVICE; + } + public async getAttachmentFilepath(filename: string): Promise { if (!this.targetView || !this.targetView?.file) { errorMessage("targetView not set", "getAttachmentFolderAndFilePath()"); @@ -2230,6 +2229,7 @@ export async function initExcalidrawAutomate( ): Promise { await initFonts(); const ea = new ExcalidrawAutomate(plugin); + //@ts-ignore window.ExcalidrawAutomate = ea; return ea; } diff --git a/src/constants.ts b/src/constants.ts index 081a6b9..207da8f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,6 @@ import { customAlphabet } from "nanoid"; +import { DeviceType } from "./types"; +import { Platform } from "obsidian"; //This is only for backward compatibility because an early version of obsidian included an encoding to avoid fantom links from littering Obsidian graph view declare const PLUGIN_VERSION:string; @@ -26,17 +28,8 @@ export function JSON_parse(x: string): any { return JSON.parse(x.replaceAll("[", "[")); } export const isDarwin = /Mac|iPod|iPhone|iPad/.test(window.navigator.platform); -export const DEVICE: { - isDesktop: boolean, - isPhone: boolean, - isTablet: boolean, - isMobile: boolean, - isLinux: boolean, - isMacOS: boolean, - isWindows: boolean, - isIOS: boolean, - isAndroid: boolean -} = { + +export const DEVICE: DeviceType = { isDesktop: !document.body.hasClass("is-tablet") && !document.body.hasClass("is-mobile"), isPhone: document.body.hasClass("is-phone"), isTablet: document.body.hasClass("is-tablet"), diff --git a/src/index.ts b/src/index.ts index a0108dc..e541e09 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import "obsidian"; //import { ExcalidrawAutomate } from "./ExcalidrawAutomate"; -export {ExcalidrawAutomateInterface} from "./types"; +//export ExcalidrawAutomate from "./ExcalidrawAutomate"; +//export {ExcalidrawAutomate} from "./ExcaildrawAutomate"; export type { ExcalidrawBindableElement, ExcalidrawElement, FileId, FillStyle, StrokeRoundness, StrokeStyle } from "@zsviczian/excalidraw/types/element/types"; export type { Point } from "@zsviczian/excalidraw/types/types"; export const getEA = (view?:any): any => { diff --git a/src/types.d.ts b/src/types.d.ts index 5547887..3770c47 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -23,335 +23,14 @@ export type ValueOf = T[keyof T]; export type DynamicStyle = "none" | "gray" | "colorful"; -export interface ExcalidrawAutomateInterface { - get obsidian(): any; //returns the Obsidian Module - getAttachmentFilepath(filename: string): Promise; - newFilePrompt( - // Prompts the user with a dialog to select new file action. - // - create markdown file - // - create excalidraw file - // - cancel action - // The new file will be relative to this.targetView.file.path, unless parentFile is provided. - // If shouldOpenNewFile is true, the new file will be opened in a workspace leaf. - // targetPane control which leaf will be used for the new file. - // Returns the TFile for the new file or null if the user cancelled the action. - newFileNameOrPath: string, - shouldOpenNewFile: boolean, - targetPane?: PaneTarget, //type PaneTarget = "active-pane"|"new-pane"|"popout-window"|"new-tab"|"md-properties"; - parentFile?: TFile, - ): Promise; - plugin: ExcalidrawPlugin; - elementsDict: {[key:string]:any}; //contains the ExcalidrawElements currently edited in Automate indexed by el.id - imagesDict: {[key: FileId]: any}; //the images files including DataURL, indexed by fileId - mostRecentMarkdownSVG: SVGSVGElement; //Markdown renderer will drop a copy of the most recent SVG here for debugging purposes - style: { - strokeColor: string; //https://www.w3schools.com/colors/default.asp - backgroundColor: string; - angle: number; //radian - fillStyle: FillStyle; //type FillStyle = "hachure" | "cross-hatch" | "solid" - strokeWidth: number; - strokeStyle: StrokeStyle; //type StrokeStyle = "solid" | "dashed" | "dotted" - roughness: number; - opacity: number; - strokeSharpness?: StrokeRoundness; //defaults to undefined, use strokeRoundess and roundess instead. Only kept for legacy script compatibility type StrokeRoundness = "round" | "sharp" - roundness: null | { type: RoundnessType; value?: number }; - fontFamily: number; //1: Virgil, 2:Helvetica, 3:Cascadia, 4:LocalFont - fontSize: number; - textAlign: string; //"left"|"right"|"center" - verticalAlign: string; //"top"|"bottom"|"middle" :for future use, has no effect currently - startArrowHead: string; //"triangle"|"dot"|"arrow"|"bar"|null - endArrowHead: string; - }; - canvas: { - theme: string; //"dark"|"light" - viewBackgroundColor: string; - gridSize: number; - }; - colorPalette: {}; //contains the custom color palette - - getViewLastPointerPosition(): {x:number, y:number}; //the last recorded pointer position on the Excalidraw canvas - getAPI(view?:ExcalidrawView):ExcalidrawAutomate; - setFillStyle(val: number): void; //0:"hachure", 1:"cross-hatch" 2:"solid" - setStrokeStyle(val: number): void; //0:"solid", 1:"dashed", 2:"dotted" - setStrokeSharpness(val: number): void; //0:"round", 1:"sharp" - setFontFamily(val: number): void; //1: Virgil, 2:Helvetica, 3:Cascadia - setTheme(val: number): void; //0:"light", 1:"dark" - addToGroup(objectIds: []): string; - toClipboard(templatePath?: string): void; - getSceneFromFile(file: TFile): Promise<{elements: ExcalidrawElement[]; appState: AppState;}>; - getElements(): ExcalidrawElement[]; //get all elements from ExcalidrawAutomate elementsDict - getElement(id: string): ExcalidrawElement; //get single element from ExcalidrawAutomate elementsDict - create(params?: { - //create a drawing and save it to filename - filename?: string; //if null: default filename as defined in Excalidraw settings - foldername?: string; //if null: default folder as defined in Excalidraw settings - templatePath?: string; - onNewPane?: boolean; - frontmatterKeys?: { - "excalidraw-plugin"?: "raw" | "parsed"; - "excalidraw-link-prefix"?: string; - "excalidraw-link-brackets"?: boolean; - "excalidraw-url-prefix"?: string; - "excalidraw-export-transparent"?: boolean; - "excalidraw-export-dark"?: boolean; - "excalidraw-export-padding"?: number; - "excalidraw-export-pngscale"?: number; - "excalidraw-default-mode"?: "view" | "zen"; - "excalidraw-onload-script"?: string; - "excalidraw-linkbutton-opacity"?: number; - "excalidraw-autoexport"?: boolean; - }; - plaintext?: string; //text to insert above the `# Text Elements` section - }): Promise; - createSVG( - templatePath?: string, - embedFont?: boolean, - exportSettings?: ExportSettings, //use ExcalidrawAutomate.getExportSettings(boolean,boolean) - loader?: EmbeddedFilesLoader, //use ExcalidrawAutomate.getEmbeddedFilesLoader(boolean?) - theme?: string, - padding?: number - ): Promise; - createPNG( - templatePath?: string, - scale?: number, - exportSettings?: ExportSettings, //use ExcalidrawAutomate.getExportSettings(boolean,boolean) - loader?: EmbeddedFilesLoader, //use ExcalidrawAutomate.getEmbeddedFilesLoader(boolean?) - theme?: string, - padding?: number, - ): Promise; - wrapText(text: string, lineLen: number): string; - addEmbeddable(topX: number, topY: number, width: number, height: number, url?: string, file?: TFile): string; - addRect(topX: number, topY: number, width: number, height: number): string; - addDiamond(topX: number, topY: number, width: number, height: number): string; - addEllipse(topX: number, topY: number, width: number, height: number): string; - addBlob(topX: number, topY: number, width: number, height: number): string; - refreshTextElementSize(id: string): void; //Refreshes the size of a text element to fit its contents, takes the id of the text element as argument - addText( - topX: number, - topY: number, - text: string, - formatting?: { - wrapAt?: number; - width?: number; - height?: number; - textAlign?: "left" | "center" | "right"; - box?: boolean | "box" | "blob" | "ellipse" | "diamond"; - boxPadding?: number; - boxStrokeColor?: string; - textVerticalAlign?: "top" | "middle" | "bottom"; - }, - id?: string, - ): string; - addLine(points: [[x: number, y: number]]): string; - addArrow( - points: [[x: number, y: number]], - formatting?: { - startArrowHead?: string; - endArrowHead?: string; - startObjectId?: string; - endObjectId?: string; - }, - ): string; - addImage( - topX: number, - topY: number, - imageFile: TFile | string, - scale?: boolean, // default is true which will scale the image to MAX_IMAGE_SIZE, false will insert image at 100% of its size - anchor?: boolean, //default is true, and only has effect if scale is false. If anchor is true the image path will include |100%, if false the image will be inserted at 100%, but if resized by the user it won't pop back to 100% the next time Excalidraw is openned. - ): Promise; - addLaTex(topX: number, topY: number, tex: string): Promise; - connectObjects( - objectA: string, - connectionA: ConnectionPoint, //type ConnectionPoint = "top" | "bottom" | "left" | "right" | null - objectB: string, - connectionB: ConnectionPoint, //when passed null, Excalidraw will automatically decide - formatting?: { - numberOfPoints?: number; //points on the line. Default is 0 ie. line will only have a start and end point - startArrowHead?: string; //"triangle"|"dot"|"arrow"|"bar"|null - endArrowHead?: string; //"triangle"|"dot"|"arrow"|"bar"|null - padding?: number; - }, - ): string; - addLabelToLine(lineId: string, label:string): string; - clear(): void; //clear elementsDict and imagesDict only - reset(): void; //clear() + reset all style values to default - isExcalidrawFile(f: TFile): boolean; //returns true if MD file is an Excalidraw file - //view manipulation - targetView: ExcalidrawView; //the view currently edited - setView(view?: ExcalidrawView | "first" | "active"): ExcalidrawView; //if argument is undefined will try to find view automatically - getExcalidrawAPI(): ExcalidrawImperativeAPI; //https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw#ref - getViewElements(): ExcalidrawElement[]; //get elements in View - deleteViewElements(el: ExcalidrawElement[]): boolean; - getViewSelectedElement(): ExcalidrawElement; //get the selected element in the view, if more are selected, get the first - getViewSelectedElements(): ExcalidrawElement[]; - getViewFileForImageElement(el: ExcalidrawElement): TFile | null; //Returns the TFile file handle for the image element - copyViewElementsToEAforEditing(elements: ExcalidrawElement[]): void; //copies elements from view to elementsDict for editing - viewToggleFullScreen(forceViewMode?: boolean): void; - setViewModeEnabled(enabled: boolean): void; - viewUpdateScene ( //This function gives you a more hands on access to Excalidraw. - scene: { //The scene you want to load to Excalidraw - elements?: ExcalidrawElement[], - appState?: AppState, - files?: BinaryFileData, - commitToHistory?: boolean, - }, - restore: boolean, //Use this if the scene includes legacy excalidraw file elements that need to be converted to the latest excalidraw data format (not a typical usecase) - ):void; - connectObjectWithViewSelectedElement( //connect an object to the selected element in the view - objectA: string, //see connectObjects - connectionA: ConnectionPoint, - connectionB: ConnectionPoint, - formatting?: { - numberOfPoints?: number; - startArrowHead?: string; - endArrowHead?: string; - padding?: number; - }, - ): boolean; - viewZoomToElements( //zoom tarteView to fit elements provided as input - selectElements: boolean, //selectElements toggles whether the elements should be in a selected state at the end of the operation - elements: ExcalidrawElement[] //elements === [] will zoom to fit the entire scene - ):void - addElementsToView( //Adds elements from elementsDict to the current view - repositionToCursor?: boolean, //default is false - save?: boolean, //default is true - //newElementsOnTop controls whether elements created with ExcalidrawAutomate - //are added at the bottom of the stack or the top of the stack of elements already in the view - //Note that elements copied to the view with copyViewElementsToEAforEditing retain their - //position in the stack of elements in the view even if modified using EA - newElementsOnTop?: boolean, //default is false, i.e. the new elements get to the bottom of the stack - shouldRestoreElements?: boolean, //restore elements - auto corrects broken, incomplete or old elements included in the update - ): Promise; - //Register instance of EA to use for hooks with TargetView - //By default ExcalidrawViews will check window.ExcalidrawAutomate for event hooks. - //Using this event you can set a different instance of Excalidraw Automate for hook - registerThisAsViewEA():boolean; //returns true if successful - deregisterThisAsViewEA():boolean; //Sets the targetView EA to window.ExcalidrawAutomate, returns true if successful - onViewUnloadHook(view: ExcalidrawView): void; //If set, this callback is triggered when the user closes an Excalidraw view. - onViewModeChangeHook(isViewModeEnabled:boolean, view: ExcalidrawView, ea: ExcalidrawAutomate): void; //If set, this callback is triggered, when the user changes the view mode. - onLinkHoverHook( - //If set, this callback is triggered, when the user hovers a link in the scene. - // You can use this callback in case you want to do something additional when the onLinkHover event occurs. - //This callback must return a boolean value. - //In case you want to prevent the excalidraw onLinkHover action you must return false, it will stop the native excalidraw onLinkHover management flow. - element: NonDeletedExcalidrawElement, - linkText: string, - view: ExcalidrawView, - ea: ExcalidrawAutomate - ):boolean; - onLinkClickHook( - //If set, this callback is triggered, when the user clicks a link in the scene. - //You can use this callback in case you want to do something additional when the onLinkClick event occurs. - //This callback must return a boolean value. - //In case you want to prevent the excalidraw onLinkClick action you must return false, it will stop the native excalidraw onLinkClick management flow. - element: ExcalidrawElement, - linkText: string, - event: MouseEvent, - view: ExcalidrawView, - ea: ExcalidrawAutomate - ): boolean; - onDropHook(data: { - //if set Excalidraw will call this function onDrop events - //You can use this callback in case you want to do something additional when the onDrop event occurs. - //This callback must return a boolean value. - //In case you want to prevent the excalidraw onDrop action you must return false, it will stop the native excalidraw onDrop management flow. - ea: ExcalidrawAutomate; - event: React.DragEvent; - draggable: any; //Obsidian draggable object - type: "file" | "text" | "unknown"; - payload: { - files: TFile[]; //TFile[] array of dropped files - text: string; //string - }; - excalidrawFile: TFile; //the file receiving the drop event - view: ExcalidrawView; //the excalidraw view receiving the drop - pointerPosition: { x: number; y: number }; //the pointer position on canvas at the time of drop - }): boolean; //a return of true will stop the default onDrop processing in Excalidraw - /** - * If set, this callback is triggered, when Excalidraw receives an onPaste event. - * You can use this callback in case you want to do something additional when the - * onPaste event occurs. - * This callback must return a boolean value. - * In case you want to prevent the excalidraw onPaste action you must return false, - * it will stop the native excalidraw onPaste management flow. - */ - onPasteHook (data: { - ea: ExcalidrawAutomate; - payload: ClipboardData; - event: ClipboardEvent; - excalidrawFile: TFile; //the file receiving the paste event - view: ExcalidrawView; //the excalidraw view receiving the paste - pointerPosition: { x: number; y: number }; //the pointer position on canvas - }): boolean; - onFileOpenHook: (data: { - //if set, this callback is triggered, when an Excalidraw file is opened - //You can use this callback in case you want to do something additional when the file is opened. - //This will run before the file level script defined in the `excalidraw-onload-script` frontmatter. - ea: ExcalidrawAutomate; - excalidrawFile: TFile; //the file being loaded - view: ExcalidrawView; - }) => Promise; - onFileCreateHook: (data: { - //if set, this callback is triggered, when an Excalidraw file is created - //see also: https://github.com/zsviczian/obsidian-excalidraw-plugin/issues/1124 - ea: ExcalidrawAutomate; - excalidrawFile: TFile; //the file being created - view: ExcalidrawView; - }) => Promise; - onCanvasColorChangeHook: ( - //If set, this callback is triggered whenever the active canvas color changes - ea: ExcalidrawAutomate, - view: ExcalidrawView, //the excalidraw view - color: string, - ) => void; - getEmbeddedFilesLoader(isDark?: boolean): EmbeddedFilesLoader; //utility function to generate EmbeddedFilesLoader object - getExportSettings( //utility function to generate ExportSettings object - withBackground: boolean, - withTheme: boolean, - ): ExportSettings; - getBoundingBox(elements: ExcalidrawElement[]): { - //get bounding box of elements - topX: number; //bounding box is the box encapsulating all of the elements completely - topY: number; - width: number; - height: number; - }; - //elements grouped by the highest level groups - getMaximumGroups(elements: ExcalidrawElement[]): ExcalidrawElement[][]; - //gets the largest element from a group. useful when a text element is grouped with a box, and you want to connect an arrow to the box - getLargestElement(elements: ExcalidrawElement[]): ExcalidrawElement; - // Returns 2 or 0 intersection points between line going through `a` and `b` - // and the `element`, in ascending order of distance from `a`. - intersectElementWithLine( - element: ExcalidrawBindableElement, - a: readonly [number, number], - b: readonly [number, number], - gap?: number, //if given, element is inflated by this value - ): Point[]; - getCommonGroupForElements(elements: ExcalidrawElement[]): string; //Gets the groupId for the group that contains all the elements, or null if such a group does not exist - getElementsInTheSameGroupWithElement(element: ExcalidrawElement, elements: ExcalidrawElement[]): ExcalidrawElement[]; //Gets all the elements from elements[] that share one or more groupIds with element. - getElementsInFrame(frameElement: ExcalidrawElement, elements: ExcalidrawElement[]): ExcalidrawElement[]; //Gets all the elements from elements[] that are contained in the frame. - //See OCR plugin for example on how to use scriptSettings - activeScript: string; //Set automatically by the ScriptEngine - getScriptSettings(): {}; //Returns script settings. Saves settings in plugin settings, under the activeScript key - setScriptSettings(settings: any): Promise; //sets script settings. - openFileInNewOrAdjacentLeaf(file: TFile): WorkspaceLeaf; //Open a file in a new workspaceleaf or reuse an existing adjacent leaf depending on Excalidraw Plugin Settings - measureText(text: string): { width: number; height: number }; //measure text size based on current style settings - //verifyMinimumPluginVersion returns true if plugin version is >= than required - //recommended use: - //if(!ea.verifyMinimumPluginVersion || !ea.verifyMinimumPluginVersion("1.5.20")) {new Notice("message");return;} - getOriginalImageSize(imageElement: ExcalidrawImageElement): Promise<{width: number; height: number}>; - verifyMinimumPluginVersion(requiredVersion: string): boolean; - isExcalidrawView(view: any): boolean; - selectElementsInView(elements: ExcalidrawElement[]): void; //sets selection in view - generateElementId(): string; //returns an 8 character long random id - cloneElement(element: ExcalidrawElement): ExcalidrawElement; //Returns a clone of the element with a new id - moveViewElementToZIndex(elementId: number, newZIndex: number): void; //Moves the element to a specific position in the z-index - hexStringToRgb(color: string): number[]; //Depricated. Use getCM / ColorMaster instead - rgbToHexString(color: number[]): string; //Depricated. Use getCM / ColorMaster instead - hslToRgb(color: number[]): number[]; //Depricated. Use getCM / ColorMaster instead - rgbToHsl(color: number[]): number[]; //Depricated. Use getCM / ColorMaster instead - colorNameToHex(color: string): string; - getCM(color:TInput): ColorMaster; //https://github.com/lbragile/ColorMaster - importSVG(svgString:string):boolean; //converts and SVG string to Excalidraw elements -} \ No newline at end of file +export type DeviceType = { + isDesktop: boolean, + isPhone: boolean, + isTablet: boolean, + isMobile: boolean, + isLinux: boolean, + isMacOS: boolean, + isWindows: boolean, + isIOS: boolean, + isAndroid: boolean +}; \ No newline at end of file