{ "version": 3, "sources": ["../webapp/modules/avalonia/canvas.ts", "../webapp/modules/avalonia/caretHelper.ts", "../webapp/modules/avalonia/input.ts", "../webapp/modules/avalonia/dom.ts", "../webapp/modules/avalonia/caniuse.ts", "../webapp/modules/avalonia/stream.ts", "../webapp/modules/avalonia/nativeControlHost.ts", "../webapp/modules/avalonia/navigationHelper.ts", "../webapp/modules/avalonia/generalHelpers.ts", "../webapp/modules/avalonia.ts"], "sourcesContent": ["interface SKGLViewInfo {\r\n context: WebGLRenderingContext | WebGL2RenderingContext | undefined;\r\n fboId: number;\r\n stencil: number;\r\n sample: number;\r\n depth: number;\r\n}\r\n\r\ntype CanvasElement = {\r\n Canvas: Canvas | undefined;\r\n} & HTMLCanvasElement;\r\n\r\nexport class Canvas {\r\n static elements: Map;\r\n\r\n htmlCanvas: HTMLCanvasElement;\r\n glInfo?: SKGLViewInfo;\r\n renderFrameCallback: () => void;\r\n renderLoopEnabled: boolean = false;\r\n renderLoopRequest: number = 0;\r\n newWidth?: number;\r\n newHeight?: number;\r\n\r\n public static initGL(element: HTMLCanvasElement, elementId: string, renderFrameCallback: () => void): SKGLViewInfo | null {\r\n const view = Canvas.init(true, element, elementId, renderFrameCallback);\r\n if (!view || !view.glInfo) {\r\n return null;\r\n }\r\n\r\n return view.glInfo;\r\n }\r\n\r\n static init(useGL: boolean, element: HTMLCanvasElement, elementId: string, renderFrameCallback: () => void): Canvas | null {\r\n const htmlCanvas = element as CanvasElement;\r\n if (!htmlCanvas) {\r\n console.error(\"No canvas element was provided.\");\r\n return null;\r\n }\r\n\r\n if (!Canvas.elements) {\r\n Canvas.elements = new Map();\r\n }\r\n Canvas.elements.set(elementId, element);\r\n\r\n const view = new Canvas(useGL, element, renderFrameCallback);\r\n\r\n htmlCanvas.Canvas = view;\r\n\r\n return view;\r\n }\r\n\r\n public constructor(useGL: boolean, element: HTMLCanvasElement, renderFrameCallback: () => void) {\r\n this.htmlCanvas = element;\r\n this.renderFrameCallback = renderFrameCallback;\r\n\r\n if (useGL) {\r\n const ctx = Canvas.createWebGLContext(element);\r\n if (!ctx) {\r\n console.error(\"Failed to create WebGL context\");\r\n return;\r\n }\r\n\r\n const GL = (globalThis as any).AvaloniaGL;\r\n\r\n // make current\r\n GL.makeContextCurrent(ctx);\r\n\r\n const GLctx = GL.currentContext.GLctx as WebGLRenderingContext;\r\n\r\n // read values\r\n const fbo = GLctx.getParameter(GLctx.FRAMEBUFFER_BINDING);\r\n\r\n this.glInfo = {\r\n context: ctx,\r\n fboId: fbo ? fbo.id : 0,\r\n stencil: GLctx.getParameter(GLctx.STENCIL_BITS),\r\n sample: 0, // TODO: GLctx.getParameter(GLctx.SAMPLES)\r\n depth: GLctx.getParameter(GLctx.DEPTH_BITS)\r\n };\r\n }\r\n }\r\n\r\n public setEnableRenderLoop(enable: boolean): void {\r\n this.renderLoopEnabled = enable;\r\n\r\n // either start the new frame or cancel the existing one\r\n if (enable) {\r\n // console.info(`Enabling render loop with callback ${this.renderFrameCallback._id}...`);\r\n this.requestAnimationFrame();\r\n } else if (this.renderLoopRequest !== 0) {\r\n window.cancelAnimationFrame(this.renderLoopRequest);\r\n this.renderLoopRequest = 0;\r\n }\r\n }\r\n\r\n public requestAnimationFrame(renderLoop?: boolean): void {\r\n // optionally update the render loop\r\n if (renderLoop !== undefined && this.renderLoopEnabled !== renderLoop) {\r\n this.setEnableRenderLoop(renderLoop);\r\n }\r\n\r\n // skip because we have a render loop\r\n if (this.renderLoopRequest !== 0) {\r\n return;\r\n }\r\n\r\n // add the draw to the next frame\r\n this.renderLoopRequest = window.requestAnimationFrame(() => {\r\n if (this.htmlCanvas.width !== this.newWidth) {\r\n this.htmlCanvas.width = this.newWidth ?? 0;\r\n }\r\n\r\n if (this.htmlCanvas.height !== this.newHeight) {\r\n this.htmlCanvas.height = this.newHeight ?? 0;\r\n }\r\n\r\n this.renderFrameCallback();\r\n this.renderLoopRequest = 0;\r\n\r\n // we may want to draw the next frame\r\n if (this.renderLoopEnabled) {\r\n this.requestAnimationFrame();\r\n }\r\n });\r\n }\r\n\r\n public setCanvasSize(width: number, height: number): void {\r\n if (this.renderLoopRequest !== 0) {\r\n window.cancelAnimationFrame(this.renderLoopRequest);\r\n this.renderLoopRequest = 0;\r\n }\r\n\r\n this.newWidth = width;\r\n this.newHeight = height;\r\n\r\n if (this.htmlCanvas.width !== this.newWidth) {\r\n this.htmlCanvas.width = this.newWidth;\r\n }\r\n\r\n if (this.htmlCanvas.height !== this.newHeight) {\r\n this.htmlCanvas.height = this.newHeight;\r\n }\r\n\r\n this.requestAnimationFrame();\r\n }\r\n\r\n public static setCanvasSize(element: HTMLCanvasElement, width: number, height: number): void {\r\n const htmlCanvas = element as CanvasElement;\r\n if (!htmlCanvas || !htmlCanvas.Canvas) {\r\n return;\r\n }\r\n\r\n htmlCanvas.Canvas.setCanvasSize(width, height);\r\n }\r\n\r\n public static requestAnimationFrame(element: HTMLCanvasElement, renderLoop?: boolean): void {\r\n const htmlCanvas = element as CanvasElement;\r\n if (!htmlCanvas || !htmlCanvas.Canvas) {\r\n return;\r\n }\r\n\r\n htmlCanvas.Canvas.requestAnimationFrame(renderLoop);\r\n }\r\n\r\n static createWebGLContext(htmlCanvas: HTMLCanvasElement): WebGLRenderingContext | WebGL2RenderingContext {\r\n const contextAttributes = {\r\n alpha: 1,\r\n depth: 1,\r\n stencil: 8,\r\n antialias: 0,\r\n premultipliedAlpha: 1,\r\n preserveDrawingBuffer: 0,\r\n preferLowPowerToHighPerformance: 0,\r\n failIfMajorPerformanceCaveat: 0,\r\n majorVersion: 2,\r\n minorVersion: 0,\r\n enableExtensionsByDefault: 1,\r\n explicitSwapControl: 0,\r\n renderViaOffscreenBackBuffer: 1\r\n };\r\n\r\n const GL = (globalThis as any).AvaloniaGL;\r\n\r\n let ctx: WebGLRenderingContext = GL.createContext(htmlCanvas, contextAttributes);\r\n\r\n if (!ctx && contextAttributes.majorVersion > 1) {\r\n console.warn(\"Falling back to WebGL 1.0\");\r\n contextAttributes.majorVersion = 1;\r\n contextAttributes.minorVersion = 0;\r\n ctx = GL.createContext(htmlCanvas, contextAttributes);\r\n }\r\n\r\n return ctx;\r\n }\r\n}\r\n\r\ntype SizeWatcherElement = {\r\n SizeWatcher: SizeWatcherInstance;\r\n} & HTMLElement;\r\n\r\ninterface SizeWatcherInstance {\r\n callback: (width: number, height: number) => void;\r\n}\r\n\r\nexport class SizeWatcher {\r\n static observer: ResizeObserver;\r\n static elements: Map;\r\n private static lastMove: number;\r\n\r\n public static observe(element: HTMLElement, elementId: string | undefined, callback: (width: number, height: number) => void): void {\r\n if (!element || !callback) {\r\n return;\r\n }\r\n\r\n SizeWatcher.lastMove = Date.now();\r\n\r\n callback(element.clientWidth, element.clientHeight);\r\n\r\n const handleResize = (args: UIEvent) => {\r\n if (Date.now() - SizeWatcher.lastMove > 33) {\r\n callback(element.clientWidth, element.clientHeight);\r\n SizeWatcher.lastMove = Date.now();\r\n }\r\n };\r\n\r\n window.addEventListener(\"resize\", handleResize);\r\n }\r\n\r\n public static unobserve(elementId: string): void {\r\n if (!elementId || !SizeWatcher.observer) {\r\n return;\r\n }\r\n\r\n const element = SizeWatcher.elements.get(elementId);\r\n if (element) {\r\n SizeWatcher.elements.delete(elementId);\r\n SizeWatcher.observer.unobserve(element);\r\n }\r\n }\r\n\r\n static init(): void {\r\n if (SizeWatcher.observer) {\r\n return;\r\n }\r\n\r\n SizeWatcher.elements = new Map();\r\n SizeWatcher.observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n SizeWatcher.invoke(entry.target);\r\n }\r\n });\r\n }\r\n\r\n static invoke(element: Element): void {\r\n const watcherElement = element as SizeWatcherElement;\r\n const instance = watcherElement.SizeWatcher;\r\n\r\n if (!instance || !instance.callback) {\r\n return;\r\n }\r\n\r\n return instance.callback(element.clientWidth, element.clientHeight);\r\n }\r\n}\r\n\r\nexport class DpiWatcher {\r\n static lastDpi: number;\r\n static timerId: number;\r\n static callback: (old: number, newdpi: number) => void;\r\n\r\n public static getDpi(): number {\r\n return window.devicePixelRatio;\r\n }\r\n\r\n public static start(callback: (old: number, newdpi: number) => void): number {\r\n DpiWatcher.lastDpi = window.devicePixelRatio;\r\n DpiWatcher.timerId = window.setInterval(DpiWatcher.update, 1000);\r\n DpiWatcher.callback = callback;\r\n\r\n return DpiWatcher.lastDpi;\r\n }\r\n\r\n public static stop(): void {\r\n window.clearInterval(DpiWatcher.timerId);\r\n }\r\n\r\n static update(): void {\r\n if (!DpiWatcher.callback) {\r\n return;\r\n }\r\n\r\n const currentDpi = window.devicePixelRatio;\r\n const lastDpi = DpiWatcher.lastDpi;\r\n DpiWatcher.lastDpi = currentDpi;\r\n\r\n if (Math.abs(lastDpi - currentDpi) > 0.001) {\r\n DpiWatcher.callback(lastDpi, currentDpi);\r\n }\r\n }\r\n}\r\n", "// Based on https://github.com/component/textarea-caret-position/blob/master/index.js\r\nexport class CaretHelper {\r\n public static getCaretCoordinates(\r\n element: HTMLInputElement | HTMLTextAreaElement,\r\n position: number,\r\n options?: { debug: boolean }\r\n ) {\r\n if (!isBrowser) {\r\n throw new Error(\r\n \"textarea-caret-position#getCaretCoordinates should only be called in a browser\"\r\n );\r\n }\r\n\r\n const debug = options?.debug ?? false;\r\n if (debug) {\r\n const el = document.querySelector(\r\n \"#input-textarea-caret-position-mirror-div\"\r\n );\r\n if (el) el.parentNode?.removeChild(el);\r\n }\r\n\r\n // The mirror div will replicate the textarea's style\r\n const div = document.createElement(\"div\");\r\n div.id = \"input-textarea-caret-position-mirror-div\";\r\n document.body.appendChild(div);\r\n\r\n const style = div.style;\r\n const computed = window.getComputedStyle\r\n ? window.getComputedStyle(element)\r\n : ((element as any).currentStyle as CSSStyleDeclaration); // currentStyle for IE < 9\r\n const isInput = element.nodeName === \"INPUT\";\r\n\r\n // Default textarea styles\r\n style.whiteSpace = \"pre-wrap\";\r\n if (!isInput) style.wordWrap = \"break-word\"; // only for textarea-s\r\n\r\n // Position off-screen\r\n style.position = \"absolute\"; // required to return coordinates properly\r\n if (!debug) style.visibility = \"hidden\"; // not 'display: none' because we want rendering\r\n\r\n // Transfer the element's properties to the div\r\n properties.forEach((prop: string) => {\r\n if (isInput && prop === \"lineHeight\") {\r\n // Special case for s because text is rendered centered and line height may be != height\r\n if (computed.boxSizing === \"border-box\") {\r\n const height = parseInt(computed.height);\r\n const outerHeight =\r\n parseInt(computed.paddingTop) +\r\n parseInt(computed.paddingBottom) +\r\n parseInt(computed.borderTopWidth) +\r\n parseInt(computed.borderBottomWidth);\r\n const targetHeight = outerHeight + parseInt(computed.lineHeight);\r\n if (height > targetHeight) {\r\n style.lineHeight = `${height - outerHeight}px`;\r\n } else if (height === targetHeight) {\r\n style.lineHeight = computed.lineHeight;\r\n } else {\r\n style.lineHeight = \"0\";\r\n }\r\n } else {\r\n style.lineHeight = computed.height;\r\n }\r\n } else {\r\n (style as any)[prop] = (computed as any)[prop];\r\n }\r\n });\r\n\r\n if (isFirefox) {\r\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\r\n if (element.scrollHeight > parseInt(computed.height)) {\r\n style.overflowY = \"scroll\";\r\n }\r\n } else {\r\n style.overflow = \"hidden\"; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\r\n }\r\n\r\n div.textContent = element.value.substring(0, position);\r\n // The second special handling for input type=\"text\" vs textarea:\r\n // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\r\n if (isInput) div.textContent = div.textContent.replace(/\\s/g, \"\\u00a0\");\r\n\r\n const span = document.createElement(\"span\");\r\n // Wrapping must be replicated *exactly*, including when a long word gets\r\n // onto the next line, with whitespace at the end of the line before (#7).\r\n // The *only* reliable way to do that is to copy the *entire* rest of the\r\n // textarea's content into the created at the caret position.\r\n // For inputs, just '.' would be enough, but no need to bother.\r\n span.textContent = element.value.substring(position) || \".\"; // || because a completely empty faux span doesn't render at all\r\n div.appendChild(span);\r\n\r\n const coordinates = {\r\n top: span.offsetTop + parseInt(computed.borderTopWidth),\r\n left: span.offsetLeft + parseInt(computed.borderLeftWidth),\r\n height: parseInt(computed.lineHeight)\r\n };\r\n\r\n if (debug) {\r\n span.style.backgroundColor = \"#aaa\";\r\n } else {\r\n document.body.removeChild(div);\r\n }\r\n\r\n return coordinates;\r\n }\r\n}\r\n\r\nconst properties = [\r\n \"direction\", // RTL support\r\n \"boxSizing\",\r\n \"width\", // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\r\n \"height\",\r\n \"overflowX\",\r\n \"overflowY\", // copy the scrollbar for IE\r\n\r\n \"borderTopWidth\",\r\n \"borderRightWidth\",\r\n \"borderBottomWidth\",\r\n \"borderLeftWidth\",\r\n \"borderStyle\",\r\n\r\n \"paddingTop\",\r\n \"paddingRight\",\r\n \"paddingBottom\",\r\n \"paddingLeft\",\r\n\r\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\r\n \"fontStyle\",\r\n \"fontVariant\",\r\n \"fontWeight\",\r\n \"fontStretch\",\r\n \"fontSize\",\r\n \"fontSizeAdjust\",\r\n \"lineHeight\",\r\n \"fontFamily\",\r\n\r\n \"textAlign\",\r\n \"textTransform\",\r\n \"textIndent\",\r\n \"textDecoration\", // might not make a difference, but better be safe\r\n\r\n \"letterSpacing\",\r\n \"wordSpacing\",\r\n\r\n \"tabSize\",\r\n \"MozTabSize\"\r\n];\r\n\r\nconst isBrowser = typeof window !== \"undefined\";\r\nconst isFirefox = isBrowser && (window as any).mozInnerScreenX != null;\r\n", "import { CaretHelper } from \"./caretHelper\";\r\n\r\nenum RawInputModifiers {\r\n None = 0,\r\n Alt = 1,\r\n Control = 2,\r\n Shift = 4,\r\n Meta = 8,\r\n\r\n LeftMouseButton = 16,\r\n RightMouseButton = 32,\r\n MiddleMouseButton = 64,\r\n XButton1MouseButton = 128,\r\n XButton2MouseButton = 256,\r\n KeyboardMask = Alt | Control | Shift | Meta,\r\n\r\n PenInverted = 512,\r\n PenEraser = 1024,\r\n PenBarrelButton = 2048\r\n}\r\n\r\n/*\r\n* This is a hack to handle Mozilla clipboard events in a more convinient way for framework users.\r\n* In the browser, events go in order KeyDown -> Paste -> KeyUp.\r\n* On KeyDown we trigger Avalonia handlers, which might execute readClipboardText.\r\n* When readClipboardText was executed, we mark ClipboardState as Pending and setup clipboard promise,\r\n* which will un-handle KeyDown event, basically allowing browser to pass a Paste event properly.\r\n* On actual Paste event we execute promise callbacks, resuming async operation, and returning pasted text to the app.\r\n* Note #1, on every KeyUp event we will reset all the state and reject pending promises if any, as this event it expected to come after Paste.\r\n* Note #2, whole this code will be executed only on legacy browsers like Mozilla, where clipboard.readText is not available.\r\n* Note #3, with all of these hacks Clipboard.ReadText will still work only on actual \"paste\" gesture initiated by user.\r\n* */\r\nenum ClipboardState {\r\n None,\r\n Ready,\r\n Pending\r\n}\r\n\r\nexport class InputHelper {\r\n static clipboardState: ClipboardState = ClipboardState.None;\r\n static resolveClipboard?: any;\r\n static rejectClipboard?: any;\r\n\r\n public static initializeBackgroundHandlers() {\r\n if (this.clipboardState !== ClipboardState.None) {\r\n return;\r\n }\r\n\r\n globalThis.addEventListener(\"paste\", (args: any) => {\r\n if (this.clipboardState === ClipboardState.Pending) {\r\n this.resolveClipboard(args.clipboardData.getData(\"text\"));\r\n }\r\n });\r\n this.clipboardState = ClipboardState.Ready;\r\n }\r\n\r\n public static async readClipboardText(): Promise {\r\n if (globalThis.navigator.clipboard.readText) {\r\n return await globalThis.navigator.clipboard.readText();\r\n } else {\r\n try {\r\n return await new Promise((resolve, reject) => {\r\n this.clipboardState = ClipboardState.Pending;\r\n this.resolveClipboard = resolve;\r\n this.rejectClipboard = reject;\r\n });\r\n } finally {\r\n this.clipboardState = ClipboardState.Ready;\r\n this.resolveClipboard = null;\r\n this.rejectClipboard = null;\r\n }\r\n }\r\n }\r\n\r\n public static subscribeKeyEvents(\r\n element: HTMLInputElement,\r\n keyDownCallback: (code: string, key: string, modifiers: RawInputModifiers) => boolean,\r\n keyUpCallback: (code: string, key: string, modifiers: RawInputModifiers) => boolean) {\r\n const keyDownHandler = (args: KeyboardEvent) => {\r\n if (keyDownCallback(args.code, args.key, this.getModifiers(args))) {\r\n if (this.clipboardState !== ClipboardState.Pending) {\r\n args.preventDefault();\r\n }\r\n }\r\n };\r\n element.addEventListener(\"keydown\", keyDownHandler);\r\n\r\n const keyUpHandler = (args: KeyboardEvent) => {\r\n if (keyUpCallback(args.code, args.key, this.getModifiers(args))) {\r\n args.preventDefault();\r\n }\r\n if (this.rejectClipboard) {\r\n this.rejectClipboard();\r\n }\r\n };\r\n\r\n element.addEventListener(\"keyup\", keyUpHandler);\r\n\r\n return () => {\r\n element.removeEventListener(\"keydown\", keyDownHandler);\r\n element.removeEventListener(\"keyup\", keyUpHandler);\r\n };\r\n }\r\n\r\n public static subscribeTextEvents(\r\n element: HTMLInputElement,\r\n beforeInputCallback: (args: InputEvent, start: number, end: number) => boolean,\r\n inputCallback: (type: string, data: string | null) => boolean,\r\n compositionStartCallback: (args: CompositionEvent) => boolean,\r\n compositionUpdateCallback: (args: CompositionEvent) => boolean,\r\n compositionEndCallback: (args: CompositionEvent) => boolean) {\r\n const inputHandler = (args: Event) => {\r\n const inputEvent = args as InputEvent;\r\n\r\n // todo check cast\r\n if (inputCallback(inputEvent.type, inputEvent.data)) {\r\n args.preventDefault();\r\n }\r\n };\r\n element.addEventListener(\"input\", inputHandler);\r\n\r\n const compositionStartHandler = (args: CompositionEvent) => {\r\n if (compositionStartCallback(args)) {\r\n args.preventDefault();\r\n }\r\n };\r\n element.addEventListener(\"compositionstart\", compositionStartHandler);\r\n\r\n const beforeInputHandler = (args: InputEvent) => {\r\n const ranges = args.getTargetRanges();\r\n let start = -1;\r\n let end = -1;\r\n if (ranges.length > 0) {\r\n start = ranges[0].startOffset;\r\n end = ranges[0].endOffset;\r\n }\r\n\r\n if (args.inputType === \"insertCompositionText\") {\r\n start = 2;\r\n end = start + 2;\r\n }\r\n if (beforeInputCallback(args, start, end)) {\r\n args.preventDefault();\r\n }\r\n };\r\n element.addEventListener(\"beforeinput\", beforeInputHandler);\r\n\r\n const compositionUpdateHandler = (args: CompositionEvent) => {\r\n if (compositionUpdateCallback(args)) {\r\n args.preventDefault();\r\n }\r\n };\r\n element.addEventListener(\"compositionupdate\", compositionUpdateHandler);\r\n\r\n const compositionEndHandler = (args: CompositionEvent) => {\r\n if (compositionEndCallback(args)) {\r\n args.preventDefault();\r\n }\r\n };\r\n element.addEventListener(\"compositionend\", compositionEndHandler);\r\n\r\n return () => {\r\n element.removeEventListener(\"input\", inputHandler);\r\n element.removeEventListener(\"compositionstart\", compositionStartHandler);\r\n element.removeEventListener(\"compositionupdate\", compositionUpdateHandler);\r\n element.removeEventListener(\"compositionend\", compositionEndHandler);\r\n };\r\n }\r\n\r\n public static subscribePointerEvents(\r\n element: HTMLInputElement,\r\n pointerMoveCallback: (args: PointerEvent) => boolean,\r\n pointerDownCallback: (args: PointerEvent) => boolean,\r\n pointerUpCallback: (args: PointerEvent) => boolean,\r\n pointerCancelCallback: (args: PointerEvent) => boolean,\r\n wheelCallback: (args: WheelEvent) => boolean\r\n ) {\r\n const pointerMoveHandler = (args: PointerEvent) => {\r\n pointerMoveCallback(args);\r\n args.preventDefault();\r\n };\r\n\r\n const pointerDownHandler = (args: PointerEvent) => {\r\n pointerDownCallback(args);\r\n args.preventDefault();\r\n };\r\n\r\n const pointerUpHandler = (args: PointerEvent) => {\r\n pointerUpCallback(args);\r\n args.preventDefault();\r\n };\r\n\r\n const pointerCancelHandler = (args: PointerEvent) => {\r\n pointerCancelCallback(args);\r\n args.preventDefault();\r\n };\r\n\r\n const wheelHandler = (args: WheelEvent) => {\r\n wheelCallback(args);\r\n args.preventDefault();\r\n };\r\n\r\n element.addEventListener(\"pointermove\", pointerMoveHandler);\r\n element.addEventListener(\"pointerdown\", pointerDownHandler);\r\n element.addEventListener(\"pointerup\", pointerUpHandler);\r\n element.addEventListener(\"wheel\", wheelHandler);\r\n element.addEventListener(\"pointercancel\", pointerCancelHandler);\r\n\r\n return () => {\r\n element.removeEventListener(\"pointerover\", pointerMoveHandler);\r\n element.removeEventListener(\"pointerdown\", pointerDownHandler);\r\n element.removeEventListener(\"pointerup\", pointerUpHandler);\r\n element.removeEventListener(\"pointercancel\", pointerCancelHandler);\r\n element.removeEventListener(\"wheel\", wheelHandler);\r\n };\r\n }\r\n\r\n public static subscribeInputEvents(\r\n element: HTMLInputElement,\r\n inputCallback: (value: string) => boolean\r\n ) {\r\n const inputHandler = (args: Event) => {\r\n if (inputCallback((args as any).value)) {\r\n args.preventDefault();\r\n }\r\n };\r\n element.addEventListener(\"input\", inputHandler);\r\n\r\n return () => {\r\n element.removeEventListener(\"input\", inputHandler);\r\n };\r\n }\r\n\r\n public static subscribeDropEvents(\r\n element: HTMLInputElement,\r\n dragEvent: (args: any) => boolean\r\n ) {\r\n const dragHandler = (args: Event) => {\r\n if (dragEvent(args as any)) {\r\n args.preventDefault();\r\n }\r\n };\r\n element.addEventListener(\"dragover\", dragHandler);\r\n element.addEventListener(\"dragenter\", dragHandler);\r\n element.addEventListener(\"dragleave\", dragHandler);\r\n element.addEventListener(\"drop\", dragHandler);\r\n\r\n return () => {\r\n element.removeEventListener(\"dragover\", dragHandler);\r\n element.removeEventListener(\"dragenter\", dragHandler);\r\n element.removeEventListener(\"dragleave\", dragHandler);\r\n element.removeEventListener(\"drop\", dragHandler);\r\n };\r\n }\r\n\r\n public static getCoalescedEvents(pointerEvent: PointerEvent): PointerEvent[] {\r\n return pointerEvent.getCoalescedEvents();\r\n }\r\n\r\n public static clearInput(inputElement: HTMLInputElement) {\r\n inputElement.value = \"\";\r\n }\r\n\r\n public static focusElement(inputElement: HTMLElement) {\r\n inputElement.focus();\r\n }\r\n\r\n public static setCursor(inputElement: HTMLInputElement, kind: string) {\r\n if (kind === \"default\") {\r\n inputElement.style.removeProperty(\"cursor\");\r\n } else {\r\n inputElement.style.cursor = kind;\r\n }\r\n }\r\n\r\n public static setBounds(inputElement: HTMLInputElement, x: number, y: number, caretWidth: number, caretHeight: number, caret: number) {\r\n inputElement.style.left = (x).toFixed(0) + \"px\";\r\n inputElement.style.top = (y).toFixed(0) + \"px\";\r\n\r\n const { left, top } = CaretHelper.getCaretCoordinates(inputElement, caret);\r\n\r\n inputElement.style.left = (x - left).toFixed(0) + \"px\";\r\n inputElement.style.top = (y - top).toFixed(0) + \"px\";\r\n }\r\n\r\n public static hide(inputElement: HTMLInputElement) {\r\n inputElement.style.display = \"none\";\r\n }\r\n\r\n public static show(inputElement: HTMLInputElement) {\r\n inputElement.style.display = \"block\";\r\n }\r\n\r\n public static setSurroundingText(inputElement: HTMLInputElement, text: string, start: number, end: number) {\r\n if (!inputElement) {\r\n return;\r\n }\r\n\r\n inputElement.value = text;\r\n inputElement.setSelectionRange(start, end);\r\n inputElement.style.width = \"20px\";\r\n inputElement.style.width = `${inputElement.scrollWidth}px`;\r\n }\r\n\r\n private static getModifiers(args: KeyboardEvent): RawInputModifiers {\r\n let modifiers = RawInputModifiers.None;\r\n\r\n if (args.ctrlKey) { modifiers |= RawInputModifiers.Control; }\r\n if (args.altKey) { modifiers |= RawInputModifiers.Alt; }\r\n if (args.shiftKey) { modifiers |= RawInputModifiers.Shift; }\r\n if (args.metaKey) { modifiers |= RawInputModifiers.Meta; }\r\n\r\n return modifiers;\r\n }\r\n}\r\n", "export class AvaloniaDOM {\r\n public static addClass(element: HTMLElement, className: string): void {\r\n element.classList.add(className);\r\n }\r\n\r\n static observeDarkMode(observer: (isDarkMode: boolean, isHighContrast: boolean) => boolean) {\r\n if (globalThis.matchMedia === undefined) {\r\n return false;\r\n }\r\n\r\n const colorShemeMedia = globalThis.matchMedia(\"(prefers-color-scheme: dark)\");\r\n const prefersContrastMedia = globalThis.matchMedia(\"(prefers-contrast: more)\");\r\n\r\n colorShemeMedia.addEventListener(\"change\", (args: MediaQueryListEvent) => {\r\n observer(args.matches, prefersContrastMedia.matches);\r\n });\r\n prefersContrastMedia.addEventListener(\"change\", (args: MediaQueryListEvent) => {\r\n observer(colorShemeMedia.matches, args.matches);\r\n });\r\n\r\n return {\r\n isDarkMode: colorShemeMedia.matches,\r\n isHighContrast: prefersContrastMedia.matches\r\n };\r\n }\r\n\r\n static createAvaloniaHost(host: HTMLElement) {\r\n const randomIdPart = Math.random().toString(36).replace(/[^a-z]+/g, \"\").substr(2, 10);\r\n\r\n // Root element\r\n host.classList.add(\"avalonia-container\");\r\n host.tabIndex = 0;\r\n host.oncontextmenu = function () { return false; };\r\n host.style.overflow = \"hidden\";\r\n host.style.touchAction = \"none\";\r\n\r\n // Rendering target canvas\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.id = `canvas${randomIdPart}`;\r\n canvas.classList.add(\"avalonia-canvas\");\r\n canvas.style.width = \"100%\";\r\n canvas.style.position = \"absolute\";\r\n\r\n // Native controls host\r\n const nativeHost = document.createElement(\"div\");\r\n nativeHost.id = `nativeHost${randomIdPart}`;\r\n nativeHost.classList.add(\"avalonia-native-host\");\r\n nativeHost.style.left = \"0px\";\r\n nativeHost.style.top = \"0px\";\r\n nativeHost.style.width = \"100%\";\r\n nativeHost.style.height = \"100%\";\r\n nativeHost.style.position = \"absolute\";\r\n\r\n // IME\r\n const inputElement = document.createElement(\"input\");\r\n inputElement.id = `inputElement${randomIdPart}`;\r\n inputElement.classList.add(\"avalonia-input-element\");\r\n inputElement.autocapitalize = \"none\";\r\n inputElement.type = \"text\";\r\n inputElement.spellcheck = false;\r\n inputElement.style.padding = \"0\";\r\n inputElement.style.margin = \"0\";\r\n inputElement.style.position = \"absolute\";\r\n inputElement.style.overflow = \"hidden\";\r\n inputElement.style.borderStyle = \"hidden\";\r\n inputElement.style.outline = \"none\";\r\n inputElement.style.background = \"transparent\";\r\n inputElement.style.color = \"transparent\";\r\n inputElement.style.display = \"none\";\r\n inputElement.style.height = \"20px\";\r\n inputElement.style.zIndex = \"-1\";\r\n inputElement.onpaste = function () { return false; };\r\n inputElement.oncopy = function () { return false; };\r\n inputElement.oncut = function () { return false; };\r\n\r\n host.prepend(inputElement);\r\n host.prepend(nativeHost);\r\n host.prepend(canvas);\r\n\r\n return {\r\n host,\r\n canvas,\r\n nativeHost,\r\n inputElement\r\n };\r\n }\r\n\r\n public static isFullscreen(): boolean {\r\n return document.fullscreenElement != null;\r\n }\r\n\r\n public static async setFullscreen(isFullscreen: boolean) {\r\n if (isFullscreen) {\r\n const doc = document.documentElement;\r\n await doc.requestFullscreen();\r\n } else {\r\n await document.exitFullscreen();\r\n }\r\n }\r\n\r\n public static getSafeAreaPadding(): number[] {\r\n const top = parseFloat(getComputedStyle(document.documentElement).getPropertyValue(\"--sat\"));\r\n const bottom = parseFloat(getComputedStyle(document.documentElement).getPropertyValue(\"--sab\"));\r\n const left = parseFloat(getComputedStyle(document.documentElement).getPropertyValue(\"--sal\"));\r\n const right = parseFloat(getComputedStyle(document.documentElement).getPropertyValue(\"--sar\"));\r\n\r\n return [left, top, bottom, right];\r\n }\r\n}\r\n", "export class Caniuse {\r\n public static hasNativeFilePicker(): boolean {\r\n return \"showSaveFilePicker\" in globalThis;\r\n }\r\n\r\n public static isMobile(): boolean {\r\n const userAgentData = (globalThis.navigator as any)?.userAgentData;\r\n if (userAgentData) {\r\n return userAgentData.mobile;\r\n }\r\n\r\n const userAgent = navigator.userAgent;\r\n const regex1 = /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i;\r\n const regex2 = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw(n|u)|c55\\/|capi|ccwa|cdm|cell|chtm|cldc|cmd|co(mp|nd)|craw|da(it|ll|ng)|dbte|dcs|devi|dica|dmob|do(c|p)o|ds(12|d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(|_)|g1 u|g560|gene|gf5|gmo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd(m|p|t)|hei|hi(pt|ta)|hp( i|ip)|hsc|ht(c(| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i(20|go|ma)|i230|iac( ||\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|[a-w])|libw|lynx|m1w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|mcr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|([1-8]|c))|phil|pire|pl(ay|uc)|pn2|po(ck|rt|se)|prox|psio|ptg|qaa|qc(07|12|21|32|60|[2-7]|i)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h|oo|p)|sdk\\/|se(c(|0|1)|47|mc|nd|ri)|sgh|shar|sie(|m)|sk0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h|v|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl|tdg|tel(i|m)|tim|tmo|to(pl|sh)|ts(70|m|m3|m5)|tx9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas|your|zeto|zte/i;\r\n return regex1.test(userAgent) || regex2.test(userAgent.substr(0, 4));\r\n }\r\n}\r\n", "import FileSystemWritableFileStream from \"native-file-system-adapter/types/src/FileSystemWritableFileStream\";\r\nimport { IMemoryView } from \"../../types/dotnet\";\r\n\r\nexport class StreamHelper {\r\n public static async seek(stream: FileSystemWritableFileStream, position: number) {\r\n return await stream.seek(position);\r\n }\r\n\r\n public static async truncate(stream: FileSystemWritableFileStream, size: number) {\r\n return await stream.truncate(size);\r\n }\r\n\r\n public static async close(stream: FileSystemWritableFileStream) {\r\n return await stream.close();\r\n }\r\n\r\n public static async write(stream: FileSystemWritableFileStream, span: IMemoryView) {\r\n const array = new Uint8Array(span.byteLength);\r\n span.copyTo(array);\r\n\r\n return await stream.write(array);\r\n }\r\n\r\n public static byteLength(stream: Blob) {\r\n return stream.size;\r\n }\r\n\r\n public static async sliceArrayBuffer(stream: Blob, offset: number, count: number) {\r\n const buffer = await stream.slice(offset, offset + count).arrayBuffer();\r\n return new Uint8Array(buffer);\r\n }\r\n\r\n public static toMemoryView(buffer: Uint8Array): Uint8Array {\r\n return buffer;\r\n }\r\n}\r\n", "class NativeControlHostTopLevelAttachment {\r\n _child?: HTMLElement;\r\n _host?: HTMLElement;\r\n}\r\n\r\nexport class NativeControlHost {\r\n public static createDefaultChild(parent?: HTMLElement): HTMLElement {\r\n return document.createElement(\"div\");\r\n }\r\n\r\n public static createAttachment(): NativeControlHostTopLevelAttachment {\r\n return new NativeControlHostTopLevelAttachment();\r\n }\r\n\r\n public static initializeWithChildHandle(element: NativeControlHostTopLevelAttachment, child: HTMLElement): void {\r\n element._child = child;\r\n element._child.style.position = \"absolute\";\r\n }\r\n\r\n public static attachTo(element: NativeControlHostTopLevelAttachment, host?: HTMLElement): void {\r\n if (element._host && element._child) {\r\n element._host.removeChild(element._child);\r\n }\r\n\r\n element._host = host;\r\n\r\n if (element._host && element._child) {\r\n element._host.appendChild(element._child);\r\n }\r\n }\r\n\r\n public static showInBounds(element: NativeControlHostTopLevelAttachment, x: number, y: number, width: number, height: number): void {\r\n if (element._child) {\r\n element._child.style.top = `${y}px`;\r\n element._child.style.left = `${x}px`;\r\n element._child.style.width = `${width}px`;\r\n element._child.style.height = `${height}px`;\r\n element._child.style.display = \"block\";\r\n }\r\n }\r\n\r\n public static hideWithSize(element: NativeControlHostTopLevelAttachment, width: number, height: number): void {\r\n if (element._child) {\r\n element._child.style.width = `${width}px`;\r\n element._child.style.height = `${height}px`;\r\n element._child.style.display = \"none\";\r\n }\r\n }\r\n\r\n public static releaseChild(element: NativeControlHostTopLevelAttachment): void {\r\n if (element._child) {\r\n element._child = undefined;\r\n }\r\n }\r\n}\r\n", "export class NavigationHelper {\r\n public static addBackHandler(backHandlerCallback: () => Boolean) {\r\n history.pushState(null, \"\", window.location.href);\r\n window.onpopstate = () => {\r\n const handled = backHandlerCallback();\r\n\r\n if (!handled) {\r\n history.back();\r\n } else {\r\n history.forward();\r\n }\r\n };\r\n }\r\n}\r\n", "export class GeneralHelpers {\r\n public static itemsArrayAt(instance: any, key: any): any[] {\r\n const items = instance[key];\r\n if (!items) {\r\n return [];\r\n }\r\n\r\n const retItems = [];\r\n for (let i = 0; i < items.length; i++) {\r\n retItems[i] = items[i];\r\n }\r\n return retItems;\r\n }\r\n\r\n public static itemAt(instance: any, key: any): any {\r\n const item = instance[key];\r\n return item;\r\n }\r\n\r\n public static callMethod(instance: any, name: string /*, args */): any {\r\n const args = Array.prototype.slice.call(arguments, 2);\r\n return instance[name].apply(instance, args);\r\n }\r\n}\r\n", "import { SizeWatcher, DpiWatcher, Canvas } from \"./avalonia/canvas\";\r\nimport { InputHelper } from \"./avalonia/input\";\r\nimport { AvaloniaDOM } from \"./avalonia/dom\";\r\nimport { Caniuse } from \"./avalonia/caniuse\";\r\nimport { StreamHelper } from \"./avalonia/stream\";\r\nimport { NativeControlHost } from \"./avalonia/nativeControlHost\";\r\nimport { NavigationHelper } from \"./avalonia/navigationHelper\";\r\nimport { GeneralHelpers } from \"./avalonia/generalHelpers\";\r\n\r\nasync function registerServiceWorker(path: string, scope: string | undefined) {\r\n if (\"serviceWorker\" in navigator) {\r\n await globalThis.navigator.serviceWorker.register(path, scope ? { scope } : undefined);\r\n }\r\n}\r\n\r\nexport {\r\n Caniuse,\r\n Canvas,\r\n InputHelper,\r\n SizeWatcher,\r\n DpiWatcher,\r\n AvaloniaDOM,\r\n StreamHelper,\r\n NativeControlHost,\r\n NavigationHelper,\r\n GeneralHelpers,\r\n registerServiceWorker\r\n};\r\n"], "mappings": "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", "names": ["Canvas", "useGL", "element", "renderFrameCallback", "ctx", "GL", "GLctx", "fbo", "elementId", "view", "htmlCanvas", "enable", "renderLoop", "_a", "_b", "width", "height", "contextAttributes", "SizeWatcher", "callback", "handleResize", "args", "entries", "entry", "instance", "DpiWatcher", "currentDpi", "lastDpi", "CaretHelper", "element", "position", "options", "_a", "_b", "isBrowser", "debug", "el", "div", "style", "computed", "isInput", "properties", "prop", "height", "outerHeight", "targetHeight", "isFirefox", "span", "coordinates", "InputHelper", "args", "resolve", "reject", "element", "keyDownCallback", "keyUpCallback", "keyDownHandler", "keyUpHandler", "beforeInputCallback", "inputCallback", "compositionStartCallback", "compositionUpdateCallback", "compositionEndCallback", "inputHandler", "inputEvent", "compositionStartHandler", "beforeInputHandler", "ranges", "start", "end", "compositionUpdateHandler", "compositionEndHandler", "pointerMoveCallback", "pointerDownCallback", "pointerUpCallback", "pointerCancelCallback", "wheelCallback", "pointerMoveHandler", "pointerDownHandler", "pointerUpHandler", "pointerCancelHandler", "wheelHandler", "dragEvent", "dragHandler", "pointerEvent", "inputElement", "kind", "x", "y", "caretWidth", "caretHeight", "caret", "left", "top", "CaretHelper", "text", "modifiers", "AvaloniaDOM", "element", "className", "observer", "colorShemeMedia", "prefersContrastMedia", "args", "host", "randomIdPart", "canvas", "nativeHost", "inputElement", "isFullscreen", "top", "bottom", "left", "right", "Caniuse", "_a", "userAgentData", "userAgent", "regex1", "regex2", "StreamHelper", "stream", "position", "size", "span", "array", "offset", "count", "buffer", "NativeControlHostTopLevelAttachment", "NativeControlHost", "parent", "element", "child", "host", "x", "y", "width", "height", "NavigationHelper", "backHandlerCallback", "GeneralHelpers", "instance", "key", "items", "retItems", "i", "name", "args", "registerServiceWorker", "path", "scope"] }