@netless/window-manager 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/constants.ts","../src/Utils/error.ts","../src/AppListener.ts","../src/Register/storage.ts","../src/Register/loader.ts","../src/Register/index.ts","../src/Utils/Common.ts","../src/AppContext.ts","../src/Utils/log.ts","../src/AppProxy.ts","../src/AttributesDelegate.ts","../src/BoxManager.ts","../src/Utils/CameraStore.ts","../src/MainView.ts","../src/ViewManager.ts","../src/Utils/Reactive.ts","../src/AppManager.ts","../node_modules/svelte/internal/index.mjs","../src/Cursor/Cursor.svelte","../src/Cursor/icons.ts","../src/image/pencil-cursor.png","../src/image/selector-cursor.png","../src/image/eraser-cursor.png","../src/image/shape-cursor.svg","../src/image/text-cursor.svg","../src/Cursor/Cursor.ts","../src/Cursor/index.ts","../src/index.ts","../src/Utils/RoomHacker.ts"],"sourcesContent":["export enum Events {\n AppMove = \"AppMove\",\n AppFocus = \"AppFocus\",\n AppResize = \"AppResize\",\n AppBlur = \"AppBlur\",\n AppBoxStateChange = \"AppBoxStateChange\",\n AppSnapshot = \"AppSnapshot\",\n AppClose = \"AppClose\",\n GetAttributes = \"GetAttributes\",\n UpdateWindowManagerWrapper = \"UpdateWindowManagerWrapper\",\n InitReplay = \"InitReplay\",\n WindowCreated = \"WindowCreated\",\n SetMainViewScenePath = \"SetMainViewScenePath\",\n SetMainViewSceneIndex = \"SetMainViewSceneIndex\",\n MainViewFocus = \"MainViewFocus\",\n SwitchViewsToFreedom = \"SwitchViewsToFreedom\",\n}\n\nexport const MagixEventName = \"__WindowManger\";\n\nexport enum AppAttributes {\n Size = \"size\",\n Position = \"position\",\n SnapshotRect = \"SnapshotRect\",\n SceneIndex = \"SceneIndex\",\n}\n\nexport enum AppEvents {\n setBoxSize = \"setBoxSize\",\n setBoxMinSize = \"setBoxMinSize\",\n destroy = \"destroy\",\n}\n\nexport enum AppStatus {\n StartCreate = \"StartCreate\",\n}\n\nexport enum CursorState {\n Leave = \"leave\",\n Normal = \"normal\",\n}\n\nexport const REQUIRE_VERSION = \"2.13.16\";\n\nexport const MIN_WIDTH = 340 / 720;\nexport const MIN_HEIGHT = 340 / 720;\n\nexport const SET_SCENEPATH_DELAY = 100; // 设置 scenePath 的延迟事件\n\nexport const DEFAULT_COLLECTOR_STYLE = { right: \"10px\", bottom: \"15px\", position: \"absolute\" };\n\nexport const DEFAULT_CONTAINER_RATIO = 9 / 16;\n","export class AppCreateError extends Error {\n override message = \"[WindowManager]: app duplicate exists and cannot be created again\";\n}\n\nexport class AppNotRegisterError extends Error {\n constructor(kind: string) {\n super(`[WindowManager]: app ${kind} need register or provide src`);\n }\n}\n\nexport class AppManagerNotInitError extends Error {\n override message = \"[WindowManager]: AppManager must be initialized\";\n}\n\nexport class WhiteWebSDKInvalidError extends Error {\n constructor(version: string) {\n super(`[WindowManager]: white-web-sdk version must large than ${version}`);\n }\n}\n\nexport class ParamsInvalidError extends Error {\n override message = \"[WindowManager]: kind must be a valid string\";\n}\n\nexport class BoxNotCreatedError extends Error {\n override message = \"[WindowManager]: box need created\";\n}\n","import { Events, MagixEventName } from \"./constants\";\nimport { TELE_BOX_STATE } from \"@netless/telebox-insider\";\nimport { ViewVisionMode } from \"white-web-sdk\";\nimport type { Event } from \"white-web-sdk\";\nimport type { TeleBox } from \"@netless/telebox-insider\";\nimport type { ViewManager } from \"./ViewManager\";\nimport type { AppProxy } from \"./AppProxy\";\nimport type { AppManager } from \"./AppManager\";\nimport type { WindowManager } from \"./index\";\n\nexport class AppListeners {\n private displayer = this.manager.displayer;\n private boxManager = this.manager.boxManager;\n\n constructor(\n private manager: AppManager,\n private windowManager: WindowManager,\n private viewManager: ViewManager,\n private appProxies: Map<string, AppProxy>\n ) {}\n\n public addListeners() {\n this.displayer.addMagixEventListener(MagixEventName, this.mainMagixEventListener);\n }\n\n public removeListeners() {\n this.displayer.removeMagixEventListener(MagixEventName, this.mainMagixEventListener);\n }\n\n private mainMagixEventListener = (event: Event) => {\n if (event.authorId !== this.displayer.observerId) {\n const data = event.payload;\n switch (data.eventName) {\n case Events.AppMove: {\n this.appMoveHandler(data.payload);\n break;\n }\n case Events.AppFocus: {\n this.appFocusHandler(data.payload);\n break;\n }\n case Events.AppResize: {\n this.appResizeHandler(data.payload);\n break;\n }\n case Events.AppBlur: {\n this.appBlurHandler(data.payload);\n break;\n }\n case Events.AppBoxStateChange: {\n this.appBoxStateHandler(data.payload);\n break;\n }\n case Events.AppSnapshot: {\n this.appSnapshotHandler(data.payload);\n break;\n }\n case Events.AppClose: {\n this.appCloseHandler(data.payload);\n break;\n }\n case Events.MainViewFocus: {\n this.mainViewFocusHandler();\n break;\n }\n case Events.SwitchViewsToFreedom: {\n this.switchViewsToFreedomHandler();\n break;\n }\n default:\n break;\n }\n }\n };\n\n private appMoveHandler = (payload: any) => {\n this.boxManager.moveBox(payload);\n };\n\n private appFocusHandler = (payload: any) => {\n this.boxManager.focusBox(payload);\n this.manager.viewManager.refreshViews();\n };\n\n private appResizeHandler = (payload: any) => {\n this.boxManager.resizeBox(Object.assign(payload, { skipUpdate: true }));\n this.manager.room?.refreshViewSize();\n };\n\n private appBlurHandler = (payload: any) => {\n const proxy = this.appProxies.get(payload.appId);\n if (proxy) {\n proxy.appEmitter.emit(\"writableChange\", false);\n if (proxy.view?.mode === ViewVisionMode.Writable) {\n this.manager.viewManager.refreshViews();\n }\n }\n };\n\n private appBoxStateHandler = (payload: any) => {\n this.boxManager.setBoxState(payload.state);\n if (payload.state === TELE_BOX_STATE.Minimized) {\n this.manager.viewManager.refreshViews();\n this.viewManager.switchMainViewToWriter();\n }\n };\n\n private appSnapshotHandler = (payload: any) => {\n const box = this.boxManager.getBox(payload.appId) as TeleBox;\n if (box) {\n box.setSnapshot(payload.rect);\n }\n };\n\n private appCloseHandler = (payload: any) => {\n this.boxManager.closeBox(payload.appId);\n const appProxy = this.manager.appProxies.get(payload.appId);\n if (appProxy) {\n appProxy.destroy(true, true);\n }\n };\n\n private mainViewFocusHandler = () => {\n this.manager.boxManager.blurFocusBox();\n this.manager.viewManager.freedomAllViews();\n };\n\n private switchViewsToFreedomHandler = () => {\n this.manager.viewManager.freedomAllViews();\n };\n}\n","const DatabaseName = \"__WindowManagerAppCache\";\n\nlet db: IDBDatabase;\nlet store: IDBObjectStore;\n\nexport const initDb = async () => {\n db = await createDb();\n}\n\nexport const setItem = (key: string, val: any) => {\n if (!db) return;\n return addRecord(db, { kind: key, sourceCode: val })\n};\n\nexport const getItem = async (key: string): Promise<string | null> => {\n if (!db) return null;\n return await query(db, key);\n};\n\nexport const removeItem = (key: string) => {\n if (!db) return;\n return deleteRecord(db, key);\n};\n\nfunction createDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DatabaseName, 2);\n request.onerror = (e) => {\n reject(e);\n }\n\n request.onupgradeneeded = (event: any) => {\n const db = event.target.result as IDBDatabase;\n if (!db.objectStoreNames.contains(\"apps\")) {\n store = db.createObjectStore(\"apps\", { keyPath: \"kind\" });\n store.createIndex(\"kind\", \"kind\", { unique: true });\n }\n }\n\n request.onsuccess = () => {\n const db = request.result;\n resolve(db);\n }\n })\n}\n\nfunction query<T>(db: IDBDatabase, val: string): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const index = db.transaction([\"apps\"]).objectStore(\"apps\").index(\"kind\");\n const request = index.get(val);\n request.onerror = (e) => reject(e);\n request.onsuccess = () => {\n if (request.result) {\n resolve(request.result);\n } else {\n resolve(null);\n }\n }\n })\n}\n\nfunction addRecord(db: IDBDatabase, payload: any): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = db.transaction([\"apps\"], \"readwrite\").objectStore(\"apps\").add(payload);\n request.onsuccess = () => resolve();\n request.onerror = () => reject();\n })\n}\n\nfunction deleteRecord(db: IDBDatabase, key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = db.transaction([\"apps\"], \"readwrite\").objectStore(\"apps\").delete(key);\n request.onsuccess = () => resolve();\n request.onerror = () => reject();\n })\n}\n","import { getItem, setItem } from \"./storage\";\nimport type { NetlessApp } from \"../typings\";\n\nconst Prefix = \"NetlessApp\";\n\nconst TIMEOUT = 10000; // 10 秒超时\n\nexport const getScript = async (url: string): Promise<string> => {\n const item = await getItem(url);\n if (item) {\n return item;\n } else {\n const result = await fetchWithTimeout(url, { timeout: TIMEOUT });\n const text = await result.text();\n await setItem(url, text);\n return text;\n }\n};\n\nexport const executeScript = (text: string, appName: string): NetlessApp => {\n let result = Function(text + `;return ${appName}`)();\n if (typeof result === \"undefined\") {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n result = window[appName];\n }\n return result;\n};\n\nexport const loadApp = async (\n url: string,\n key: string,\n name?: string\n): Promise<NetlessApp | undefined> => {\n const appName = name || Prefix + key;\n const text = await getScript(url);\n try {\n return executeScript(text, appName);\n } catch (error: any) {\n if (error.message.includes(\"Can only have one anonymous define call per script file\")) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const define = window.define;\n if (\"function\" == typeof define && define.amd) {\n delete define.amd;\n }\n return executeScript(text, appName);\n }\n }\n};\n\nasync function fetchWithTimeout(resource: string, options: RequestInit & { timeout: number }) {\n const { timeout = 10000 } = options;\n\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(resource, {\n ...options,\n signal: controller.signal,\n headers: {\n \"content-type\": \"text/plain\",\n },\n });\n clearTimeout(id);\n\n return response;\n}\n","import Emittery from \"emittery\";\nimport type { NetlessApp, RegisterEvents, RegisterParams } from \"../typings\";\nimport { loadApp } from \"./loader\";\n\nclass AppRegister {\n public kindEmitters: Map<string, Emittery<RegisterEvents>> = new Map();\n public registered: Map<string, RegisterParams> = new Map();\n public appClassesCache: Map<string, Promise<NetlessApp>> = new Map();\n public appClasses: Map<string, () => Promise<NetlessApp>> = new Map();\n\n public async register(params: RegisterParams): Promise<void> {\n this.registered.set(params.kind, params);\n \n const srcOrAppOrFunction = params.src\n let downloadApp: () => Promise<NetlessApp>\n \n if (typeof srcOrAppOrFunction === \"string\") {\n downloadApp = async () => {\n const appClass = await loadApp(srcOrAppOrFunction, params.kind);\n if (appClass) {\n return appClass\n } else {\n throw new Error(`[WindowManager]: load remote script failed, ${srcOrAppOrFunction}`);\n }\n }\n } else if (typeof srcOrAppOrFunction === \"function\") {\n downloadApp = srcOrAppOrFunction\n } else {\n downloadApp = async () => srcOrAppOrFunction\n }\n\n this.appClasses.set(params.kind, async () => {\n let app = this.appClassesCache.get(params.kind)\n if (!app) {\n app = downloadApp()\n this.appClassesCache.set(params.kind, app)\n }\n return app\n });\n \n if (params.addHooks) {\n const emitter = this.createKindEmitter(params.kind);\n if (emitter) {\n params.addHooks(emitter);\n }\n }\n }\n\n public async notifyApp<T extends keyof RegisterEvents>(kind: string, event: T, payload: RegisterEvents[T]) {\n const emitter = this.kindEmitters.get(kind);\n await emitter?.emit(event, payload);\n }\n\n private createKindEmitter(kind: string) {\n if (!this.kindEmitters.has(kind)) {\n const emitter = new Emittery<RegisterEvents>();\n this.kindEmitters.set(kind, emitter);\n }\n return this.kindEmitters.get(kind);\n }\n}\n\nexport const appRegister = new AppRegister();\n","import { emitter } from \"../index\";\nimport type { PublicEvent } from \"../index\";\nimport { v4 } from \"uuid\";\nimport type { Displayer, ViewVisionMode, Room, View } from \"white-web-sdk\";\nimport { debounce } from \"lodash\";\nimport type Emittery from \"emittery\";\nimport { appRegister } from \"../Register\";\n\nexport const genAppId = async (kind: string) => {\n const impl = await appRegister.appClasses.get(kind)?.();\n if (impl && impl.config?.singleton) {\n return kind;\n }\n return `${kind}-${v4().replace(\"-\", \"\").slice(0, 8)}`;\n};\n\nexport const setViewFocusScenePath = (view: View, focusScenePath: string) => {\n if (view.focusScenePath !== focusScenePath) {\n view.focusScenePath = focusScenePath;\n }\n};\n\nexport const setScenePath = (room: Room | undefined, scenePath: string) => {\n if (room) {\n if (room.state.sceneState.scenePath !== scenePath) {\n room.setScenePath(scenePath);\n }\n }\n};\n\nexport const setViewMode = (view: View, mode: ViewVisionMode) => {\n if (view.mode !== mode) {\n view.mode = mode;\n }\n};\n\nexport const emitError = (error: Error) => {\n if (emitter.listenerCount(\"error\") > 0) {\n emitter.emit(\"error\", error);\n } else {\n console.log(\"[WindowManager]:\", error);\n }\n};\n\nexport const notifyMainViewModeChange = debounce(\n (callbacks: Emittery<PublicEvent>, mode: ViewVisionMode) => {\n callbacks.emit(\"mainViewModeChange\", mode);\n },\n 200\n);\n\nexport const makeValidScenePath = (displayer: Displayer, scenePath: string) => {\n const scenes = displayer.entireScenes()[scenePath];\n const firstSceneName = scenes[0].name;\n if (scenePath === \"/\") {\n return `/${firstSceneName}`;\n } else {\n return `${scenePath}/${firstSceneName}`;\n }\n};\n\nexport const getVersionNumber = (version: string) => {\n const versionString = version.split(\".\").map(s => s.padStart(2, \"0\")).join(\"\");\n return parseInt(versionString);\n};\n\nexport const wait = (time: number) => new Promise((resolve) => setTimeout(resolve, time));\n","import {\n autorun,\n listenDisposed,\n listenUpdated,\n reaction,\n unlistenDisposed,\n unlistenUpdated\n } from 'white-web-sdk';\nimport { BoxNotCreatedError } from './Utils/error';\nimport { wait } from './Utils/Common';\nimport type { Room, SceneDefinition, View } from \"white-web-sdk\";\nimport type { ReadonlyTeleBox } from \"@netless/telebox-insider\";\nimport type Emittery from \"emittery\";\nimport type { BoxManager } from \"./BoxManager\";\nimport type { AppEmitterEvent } from \"./index\";\nimport type { AppManager } from \"./AppManager\";\nimport type { AppProxy } from \"./AppProxy\";\n\nexport class AppContext<TAttrs extends Record<string, any>, AppOptions = any> {\n public readonly emitter: Emittery<AppEmitterEvent<TAttrs>>;\n public readonly mobxUtils = {\n autorun,\n reaction,\n };\n public readonly objectUtils = {\n listenUpdated,\n unlistenUpdated,\n listenDisposed,\n unlistenDisposed\n };\n private boxManager: BoxManager;\n private delegate = this.manager.delegate;\n public readonly isAddApp: boolean;\n\n constructor(\n private manager: AppManager,\n public appId: string,\n private appProxy: AppProxy,\n public setScenes: (scenes: SceneDefinition[]) => void,\n private appOptions?: AppOptions | (() => AppOptions),\n ) {\n this.emitter = appProxy.appEmitter;\n this.boxManager = this.manager.boxManager;\n this.isAddApp = appProxy.isAddApp;\n }\n\n public getDisplayer() {\n return this.manager.displayer;\n }\n\n public getAttributes(): TAttrs | undefined {\n return this.appProxy.attributes;\n }\n\n public getScenes(): SceneDefinition[] | undefined {\n const appAttr = this.delegate.getAppAttributes(this.appId);\n if (appAttr?.isDynamicPPT) {\n const appProxy = this.manager.appProxies.get(this.appId);\n if (appProxy) {\n return appProxy.scenes;\n }\n } else {\n return appAttr?.options[\"scenes\"];\n }\n }\n\n public getView(): View | undefined {\n return this.appProxy.view;\n }\n\n public getInitScenePath() {\n return this.manager.getAppInitPath(this.appId);\n }\n\n public getIsWritable(): boolean {\n return this.manager.canOperate;\n }\n\n public getBox(): ReadonlyTeleBox {\n const box = this.boxManager.getBox(this.appId);\n if (box) {\n return box;\n } else {\n throw new BoxNotCreatedError();\n }\n }\n\n public getRoom(): Room | undefined {\n return this.manager.room;\n }\n\n public setAttributes(attributes: TAttrs) {\n this.manager.safeSetAttributes({ [this.appId]: attributes });\n }\n\n public updateAttributes(keys: string[], value: any) {\n if (this.manager.attributes[this.appId]) {\n this.manager.safeUpdateAttributes([this.appId, ...keys], value);\n }\n }\n\n public async setScenePath(scenePath: string): Promise<void> {\n if (!this.appProxy.box) return;\n if (this.appProxy.box.focus) {\n this.getRoom()?.setScenePath(scenePath);\n } else {\n this.emitter.emit(\"focus\", true);\n await wait(50);\n this.getRoom()?.setScenePath(scenePath);\n }\n }\n\n public mountView(dom: HTMLDivElement): void {\n const view = this.getView();\n if (view) {\n view.divElement = dom;\n setTimeout(() => {\n // 渲染需要时间,延迟 refresh\n this.getRoom()?.refreshViewSize();\n }, 1000);\n }\n }\n\n public getAppOptions(): AppOptions | undefined {\n return typeof this.appOptions === 'function' ? (this.appOptions as () => AppOptions)() : this.appOptions\n }\n}\n","import { WindowManager } from \"../index\";\n\nexport const log = (...args: any[]): void => {\n if (WindowManager.debug) {\n console.log(`[WindowManager]:`, ...args);\n }\n};\n","import Emittery from \"emittery\";\nimport { AppAttributes, AppEvents, Events } from \"./constants\";\nimport { AppContext } from \"./AppContext\";\nimport { appRegister } from \"./Register\";\nimport { autorun, ViewVisionMode } from \"white-web-sdk\";\nimport { log } from \"./Utils/log\";\nimport {\n notifyMainViewModeChange,\n setScenePath,\n setViewFocusScenePath,\n setViewMode,\n} from \"./Utils/Common\";\nimport { callbacks, emitter } from \"./index\";\nimport type {\n AppEmitterEvent,\n AppInitState,\n BaseInsertParams,\n setAppOptions,\n AppListenerKeys,\n} from \"./index\";\nimport type { Camera, SceneDefinition, SceneState, View } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\nimport type { NetlessApp } from \"./typings\";\nimport type { ReadonlyTeleBox } from \"@netless/telebox-insider\";\n\nexport class AppProxy {\n public id: string;\n public scenePath?: string;\n public appEmitter: Emittery<AppEmitterEvent>;\n public scenes?: SceneDefinition[];\n\n private appListener: any;\n private disposer: any;\n private boxManager = this.manager.boxManager;\n private appProxies = this.manager.appProxies;\n private viewManager = this.manager.viewManager;\n private kind: string;\n public isAddApp: boolean;\n private status: \"normal\" | \"destroyed\" = \"normal\";\n\n constructor(\n private params: BaseInsertParams,\n private manager: AppManager,\n appId: string,\n isAddApp: boolean\n ) {\n this.kind = params.kind;\n this.id = appId;\n this.appProxies.set(this.id, this);\n this.appEmitter = new Emittery();\n this.appListener = this.makeAppEventListener(this.id);\n const options = this.params.options;\n if (options) {\n this.scenePath = options.scenePath;\n const attr = this.manager.delegate.getAppAttributes(this.id);\n if (attr?.isDynamicPPT && this.scenePath) {\n this.scenes = this.manager.displayer.entireScenes()[this.scenePath];\n } else {\n this.scenes = options.scenes;\n }\n }\n if (this.params.options?.scenePath) {\n // 只有传入了 scenePath 的 App 才会创建 View\n this.createView();\n this.addCameraListener();\n }\n this.isAddApp = isAddApp;\n }\n\n public get sceneIndex(): number {\n return this.manager.delegate.getAppSceneIndex(this.id);\n }\n\n public setSceneIndex(index: number): void {\n return this.manager.delegate.updateAppState(this.id, AppAttributes.SceneIndex, index);\n }\n\n public get view(): View | undefined {\n return this.manager.viewManager.getView(this.id);\n }\n\n public get isWritable(): boolean {\n return this.manager.canOperate && !this.box?.readonly;\n }\n\n public get attributes() {\n return this.manager.attributes[this.id];\n }\n\n public getSceneName(): string | undefined {\n if (this.sceneIndex !== undefined) {\n return this.scenes?.[this.sceneIndex]?.name;\n }\n }\n\n public getFullScenePath(): string | undefined {\n if (this.scenePath && this.getSceneName()) {\n return `${this.scenePath}/${this.getSceneName()}`;\n }\n }\n\n public setScenes(scenes: SceneDefinition[]): void {\n this.scenes = scenes;\n }\n\n public async baseInsertApp(focus?: boolean): Promise<{ appId: string; app: NetlessApp }> {\n const params = this.params;\n if (params.kind) {\n const appImpl = await appRegister.appClasses.get(params.kind)?.();\n const appParams = appRegister.registered.get(params.kind);\n if (appImpl) {\n await this.setupApp(this.id, appImpl, params.options, appParams?.appOptions);\n } else {\n throw new Error(`[WindowManager]: app load failed ${params.kind} ${params.src}`);\n }\n this.boxManager.updateManagerRect();\n if (focus) {\n this.focusBox();\n this.manager.viewManager.switchAppToWriter(this.id);\n this.manager.delegate.setMainViewFocusPath();\n }\n return {\n appId: this.id,\n app: appImpl,\n };\n } else {\n throw new Error(\"[WindowManager]: kind require\");\n }\n }\n\n public get box(): ReadonlyTeleBox | undefined {\n return this.boxManager.getBox(this.id);\n }\n\n private focusBox() {\n this.boxManager.focusBox({ appId: this.id });\n }\n\n private async setupApp(appId: string, app: NetlessApp, options?: setAppOptions, appOptions?: any) {\n log(\"setupApp\", appId, app, options);\n const context = new AppContext(this.manager, appId, this, this.setScenes, appOptions);\n try {\n emitter.once(`${appId}${Events.WindowCreated}`).then(async () => {\n const boxInitState = this.getAppInitState(appId);\n this.boxManager.updateBoxState(boxInitState);\n this.appEmitter.onAny(this.appListener);\n this.appAttributesUpdateListener(appId);\n this.setViewFocusScenePath();\n setTimeout(async () => {\n // 延迟执行 setup, 防止初始化的属性没有更新成功\n const result = await app.setup(context);\n appRegister.notifyApp(app.kind, \"created\", { appId, result });\n if (boxInitState) {\n if (boxInitState.focus && this.scenePath) {\n this.manager.viewManager.switchAppToWriter(this.id);\n }\n if (!boxInitState?.x || !boxInitState.y || !boxInitState.snapshotRect) {\n this.boxManager.setBoxInitState(appId);\n }\n }\n const box = this.boxManager.getBox(appId);\n if (box) {\n this.boxManager.resizeBox({\n // 兼容移动端创建时会出现 PPT 不适配的问题\n appId,\n width: box.width + 0.001,\n height: box.height + 0.001,\n skipUpdate: true,\n });\n }\n }, 50);\n });\n this.boxManager.createBox({\n appId: appId,\n app,\n options,\n canOperate: this.manager.canOperate,\n });\n } catch (error: any) {\n console.error(error);\n throw new Error(`[WindowManager]: app setup error: ${error.message}`);\n }\n }\n\n public switchToWritable() {\n if (this.view) {\n try {\n if (this.view.mode === ViewVisionMode.Writable) return;\n if (this.manager.mainView.mode === ViewVisionMode.Writable) {\n this.manager.delegate.setMainViewFocusPath();\n notifyMainViewModeChange(callbacks, ViewVisionMode.Freedom);\n setViewMode(this.manager.mainView, ViewVisionMode.Freedom);\n }\n setViewMode(this.view, ViewVisionMode.Writable);\n } catch (error) {\n log(\"switch view failed\", error);\n }\n }\n }\n\n public getAppInitState = (id: string) => {\n const attrs = this.manager.delegate.getAppState(id);\n if (!attrs) return;\n const position = attrs?.[AppAttributes.Position];\n const focus = this.manager.attributes.focus;\n const size = attrs?.[AppAttributes.Size];\n const snapshotRect = attrs?.[AppAttributes.SnapshotRect];\n const sceneIndex = attrs?.[AppAttributes.SceneIndex];\n const boxState = this.manager.attributes[\"boxState\"];\n let payload = { boxState } as AppInitState;\n if (position) {\n payload = { ...payload, id: id, x: position.x, y: position.y };\n }\n if (focus === id) {\n payload = { ...payload, focus: true };\n }\n if (size) {\n payload = { ...payload, width: size.width, height: size.height };\n }\n if (snapshotRect) {\n payload = { ...payload, snapshotRect };\n }\n if (sceneIndex) {\n payload = { ...payload, sceneIndex };\n }\n emitter.emit(Events.InitReplay, payload);\n return payload;\n };\n\n public emitAppSceneStateChange(sceneState: SceneState) {\n this.appEmitter.emit(\"sceneStateChange\", sceneState);\n }\n\n public emitAppIsWritableChange() {\n this.appEmitter.emit(\"writableChange\", this.isWritable);\n }\n\n private makeAppEventListener(appId: string) {\n return (eventName: AppListenerKeys, data: any) => {\n if (!this.manager.canOperate) return;\n switch (eventName) {\n case \"setBoxSize\": {\n this.boxManager.resizeBox({\n appId,\n width: data.width,\n height: data.height,\n skipUpdate: false,\n });\n break;\n }\n case \"setBoxMinSize\": {\n this.boxManager.setBoxMinSize({\n appId,\n minWidth: data.minwidth,\n minHeight: data.minheight,\n });\n break;\n }\n case \"setBoxTitle\": {\n this.boxManager.setBoxTitle({ appId, title: data.title });\n break;\n }\n case AppEvents.destroy: {\n if (this.status === \"destroyed\") return;\n this.destroy(true, data?.error);\n if (data?.error) {\n console.error(data?.error);\n }\n break;\n }\n case \"focus\": {\n this.boxManager.focusBox({ appId: this.id });\n emitter.emit(\"focus\", { appId: this.id });\n break;\n }\n default: {\n break;\n }\n }\n };\n }\n\n private appAttributesUpdateListener = (appId: string) => {\n const disposer = autorun(() => {\n const attrs = this.manager.windowManger.attributes[appId];\n if (attrs) {\n this.appEmitter.emit(\"attributesUpdate\", attrs);\n }\n });\n this.disposer = disposer;\n };\n\n public recoverCamera(): void {\n this.manager.cameraStore.recoverCamera(this.id, this.view);\n }\n\n public setScenePath(): void {\n const fullScenePath = this.getFullScenePath();\n if (this.manager.room && fullScenePath && this.view) {\n setScenePath(this.manager.room, fullScenePath);\n }\n }\n\n public switchToFreedom(): void {\n if (this.view && this.view.mode === ViewVisionMode.Writable) {\n const scenePath = this.getFullScenePath();\n if (scenePath) {\n setViewFocusScenePath(this.view, scenePath);\n setViewMode(this.view, ViewVisionMode.Freedom);\n }\n }\n }\n\n public setViewFocusScenePath() {\n const fullPath = this.getFullScenePath();\n if (fullPath && this.view) {\n setViewFocusScenePath(this.view, fullPath);\n }\n }\n\n public addCameraListener() {\n this.view?.callbacks.on(\"onCameraUpdated\", this.cameraListener);\n }\n\n public removeCameraListener() {\n this.view?.callbacks.off(\"onCameraUpdated\", this.cameraListener);\n }\n\n private createView(): View {\n const view = this.viewManager.createView(this.id);\n this.setViewFocusScenePath();\n return view;\n }\n\n private cameraListener = (camera: Camera) => {\n this.manager.cameraStore.setCamera(this.id, camera);\n };\n\n public async destroy(needCloseBox: boolean, cleanAttrs: boolean, error?: Error) {\n this.status = \"destroyed\";\n await appRegister.notifyApp(this.kind, \"destroy\", { appId: this.id });\n await this.appEmitter.emit(\"destroy\", { error });\n this.appEmitter.clearListeners();\n emitter.emit(`destroy-${this.id}`, { error });\n if (needCloseBox) {\n this.boxManager.closeBox(this.id);\n }\n if (this.disposer) {\n this.disposer();\n }\n if (cleanAttrs) {\n this.manager.delegate.cleanAppAttributes(this.id);\n }\n this.appProxies.delete(this.id);\n this.manager.cameraStore.deleteCamera(this.id);\n this.removeCameraListener();\n this.manager.viewManager.destroyView(this.id);\n this.manager.appStatus.delete(this.id);\n }\n}\n","import { AppAttributes } from \"./constants\";\nimport { get, pick } from \"lodash\";\nimport { setViewFocusScenePath } from \"./Utils/Common\";\nimport type { AddAppParams, AppSyncAttributes } from \"./index\";\nimport type { Camera, Size } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\n\nexport enum Fields {\n Apps = \"apps\",\n Focus = \"focus\",\n State = \"state\",\n BoxState = \"boxState\",\n MainViewCamera = \"mainViewCamera\",\n MainViewSize = \"mainViewSize\",\n Broadcaster = \"broadcaster\",\n Cursors = \"cursors\",\n Position = \"position\",\n CursorState = \"cursorState\",\n}\n\nexport type Apps = {\n [key: string]: AppSyncAttributes;\n};\n\ntype Position = {\n x: number;\n y: number;\n};\n\nexport class AttributesDelegate {\n constructor(private manager: AppManager) {}\n\n public apps(): Apps {\n return get(this.manager.attributes, [Fields.Apps]);\n }\n\n public get focus() {\n return get(this.manager.attributes, [Fields.Focus]);\n }\n\n public get broadcaster() {\n return get(this.manager.attributes, [Fields.Broadcaster]);\n }\n\n public getAppAttributes(id: string): AppSyncAttributes {\n return get(this.apps(), [id]);\n }\n\n public getAppState(id: string) {\n return get(this.apps(), [id, Fields.State]);\n }\n\n public setupAppAttributes(params: AddAppParams, id: string, isDynamicPPT: boolean) {\n const attributes = this.manager.attributes;\n if (!attributes.apps) {\n this.manager.safeSetAttributes({ apps: {} });\n }\n const attrNames = [\"scenePath\", \"title\"];\n if (!isDynamicPPT) {\n attrNames.push(\"scenes\");\n }\n const options = pick(params.options, attrNames);\n const attrs: AppSyncAttributes = { kind: params.kind, options, isDynamicPPT };\n if (typeof params.src === \"string\") {\n attrs.src = params.src;\n }\n this.manager.safeUpdateAttributes([Fields.Apps, id], attrs);\n this.manager.safeUpdateAttributes([Fields.Apps, id, Fields.State], {\n [AppAttributes.Size]: {},\n [AppAttributes.Position]: {},\n [AppAttributes.SnapshotRect]: {},\n [AppAttributes.SceneIndex]: 0,\n });\n }\n\n public updateAppState(appId: string, stateName: AppAttributes, state: any) {\n if (get(this.manager.attributes, [Fields.Apps, appId, Fields.State])) {\n this.manager.safeUpdateAttributes([Fields.Apps, appId, Fields.State, stateName], state);\n }\n }\n\n public cleanAppAttributes(id: string) {\n this.manager.safeUpdateAttributes([Fields.Apps, id], undefined);\n this.manager.safeSetAttributes({ [id]: undefined });\n const focus = this.manager.attributes[Fields.Focus];\n if (focus === id) {\n this.cleanFocus();\n }\n }\n\n public cleanFocus() {\n this.manager.safeSetAttributes({ [Fields.Focus]: undefined });\n }\n\n public cleanAttributes() {\n this.manager.safeSetAttributes({\n [Fields.Apps]: undefined,\n [Fields.BoxState]: undefined,\n [Fields.Focus]: undefined,\n _mainScenePath: undefined,\n _mainSceneIndex: undefined,\n });\n }\n\n public getAppSceneIndex(id: string) {\n return this.getAppState(id)?.[AppAttributes.SceneIndex];\n }\n\n public getAppScenePath(id: string) {\n return this.getAppAttributes(id)?.options?.scenePath;\n }\n\n public getMainViewScenePath() {\n return this.manager.attributes[\"_mainScenePath\"];\n }\n\n public getMainViewSceneIndex() {\n return this.manager.attributes[\"_mainSceneIndex\"];\n }\n\n public getBoxState() {\n return this.manager.attributes[Fields.BoxState];\n }\n\n public setMainViewScenePath(scenePath: string) {\n this.manager.safeSetAttributes({ _mainScenePath: scenePath });\n }\n\n public setMainViewSceneIndex(index: number) {\n this.manager.safeSetAttributes({ _mainSceneIndex: index });\n }\n\n public getMainViewCamera(): Camera {\n return get(this.manager.attributes, [Fields.MainViewCamera]);\n }\n\n public getMainViewSize(): Size {\n return get(this.manager.attributes, [Fields.MainViewSize]);\n }\n\n public setMainViewCamera(camera: Camera | undefined) {\n this.manager.safeSetAttributes({ [Fields.MainViewCamera]: { ...camera } });\n }\n\n public setMainViewSize(size: Size | undefined) {\n this.manager.safeSetAttributes({ [Fields.MainViewSize]: { ...size } });\n }\n\n public setBroadcaster(observerId: number | undefined) {\n this.manager.safeSetAttributes({ [Fields.Broadcaster]: observerId });\n }\n\n public setAppFocus(appId: string, focus: boolean) {\n if (focus) {\n this.manager.safeSetAttributes({ [Fields.Focus]: appId });\n } else {\n this.manager.safeSetAttributes({ [Fields.Focus]: undefined });\n }\n }\n\n public updateCursor(observerId: string, position: Position) {\n if (!get(this.manager.attributes, [Fields.Cursors, observerId])) {\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId], {});\n }\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId, Fields.Position], position);\n }\n\n public updateCursorState(observerId: string, cursorState: string | undefined) {\n if (!get(this.manager.attributes, [Fields.Cursors, observerId])) {\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId], {});\n }\n this.manager.safeUpdateAttributes(\n [Fields.Cursors, observerId, Fields.CursorState],\n cursorState\n );\n }\n\n public getCursorState(observerId: string) {\n return get(this.manager.attributes, [Fields.Cursors, observerId, Fields.CursorState]);\n }\n\n public cleanCursor(observerId: string) {\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId], undefined);\n }\n\n // TODO 状态中保存一个 SceneName 优化性能\n public setMainViewFocusPath() {\n const scenePath = this.getMainViewScenePath();\n if (scenePath) {\n setViewFocusScenePath(this.manager.mainView, scenePath);\n }\n }\n}\n","import { callbacks, emitter, WindowManager } from \"./index\";\nimport type { AddAppOptions, AppInitState } from \"./index\";\nimport { AppAttributes, DEFAULT_COLLECTOR_STYLE, Events, MIN_HEIGHT, MIN_WIDTH } from \"./constants\";\nimport { debounce, get, isEmpty, maxBy } from \"lodash\";\nimport {\n TELE_BOX_MANAGER_EVENT,\n TELE_BOX_STATE,\n TeleBoxCollector,\n TeleBoxManager,\n} from \"@netless/telebox-insider\";\nimport type {\n TeleBoxManagerUpdateConfig,\n TeleBoxManagerCreateConfig,\n ReadonlyTeleBox,\n TeleBox,\n TeleBoxManagerConfig,\n} from \"@netless/telebox-insider\";\nimport type Emittery from \"emittery\";\nimport type { AppManager } from \"./AppManager\";\nimport type { NetlessApp } from \"./typings\";\nimport type { View } from \"white-web-sdk\";\nimport type { AppProxy } from \"./AppProxy\";\n\nexport { TELE_BOX_STATE };\n\nexport type CreateBoxParams = {\n appId: string;\n app: NetlessApp;\n view?: View;\n emitter?: Emittery;\n options?: AddAppOptions;\n canOperate?: boolean;\n};\n\ntype AppId = { appId: string };\n\ntype MoveBoxParams = AppId & { x: number; y: number };\n\ntype ResizeBoxParams = AppId & { width: number; height: number; skipUpdate: boolean };\n\ntype SetBoxMinSizeParams = AppId & { minWidth: number; minHeight: number };\n\ntype SetBoxTitleParams = AppId & { title: string };\n\nexport type CreateCollectorConfig = {\n collectorContainer?: HTMLElement;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n};\n\nexport class BoxManager {\n public teleBoxManager: TeleBoxManager;\n public appBoxMap: Map<string, string> = new Map();\n\n constructor(\n private manager: AppManager,\n private mainView: View,\n private appProxies: Map<string, AppProxy>,\n collectorConfig?: CreateCollectorConfig\n ) {\n this.mainView = mainView;\n this.teleBoxManager = this.setupBoxManager(collectorConfig);\n this.teleBoxManager.events.on(TELE_BOX_MANAGER_EVENT.State, state => {\n if (state) {\n callbacks.emit(\"boxStateChange\", state);\n emitter.emit(state, undefined);\n }\n });\n this.teleBoxManager.events.on(\"removed\", boxes => {\n boxes.forEach(box => {\n emitter.emit(\"close\", { appId: box.id });\n });\n });\n this.teleBoxManager.events.on(\n \"move\",\n debounce((box: ReadonlyTeleBox): void => {\n emitter.emit(\"move\", { appId: box.id, x: box.x, y: box.y });\n }, 50)\n );\n this.teleBoxManager.events.on(\n \"resize\",\n debounce((box: ReadonlyTeleBox): void => {\n emitter.emit(\"resize\", { appId: box.id, width: box.width, height: box.height });\n }, 200)\n );\n this.teleBoxManager.events.on(\"focused\", box => {\n if (box) {\n if (this.manager.canOperate) {\n emitter.emit(\"focus\", { appId: box.id });\n } else {\n this.updateBox(box.id, { focus: false });\n }\n } else {\n this.blurFocusBox();\n }\n });\n this.teleBoxManager.events.on(\"snapshot\", box => {\n emitter.emit(\"snapshot\", { appId: box.id, rect: { ...box.rectSnapshot } });\n });\n }\n\n public get boxState(): string {\n return this.teleBoxManager.state;\n }\n\n public createBox(params: CreateBoxParams): void {\n if (!this.teleBoxManager) return;\n let { minwidth = MIN_WIDTH, minheight = MIN_HEIGHT } = params.app.config ?? {};\n const { width, height } = params.app.config ?? {};\n const title = params.options?.title || params.appId;\n const rect = this.teleBoxManager.containerRect;\n\n if (minwidth > 1) {\n minwidth = minwidth / rect.width;\n }\n\n if (minheight > 1) {\n minheight = minheight / rect.height;\n }\n\n const createBoxConfig: TeleBoxManagerCreateConfig = {\n title,\n minWidth: minwidth,\n minHeight: minheight,\n width,\n height,\n id: params.appId,\n };\n this.teleBoxManager.create(createBoxConfig);\n emitter.emit(`${params.appId}${Events.WindowCreated}`);\n\n const appState = this.manager.delegate.getAppState(params.appId);\n if (appState) {\n const snapshotRect = get(appState, [AppAttributes.SnapshotRect]);\n if (isEmpty(snapshotRect)) {\n this.setBoxInitState(params.appId);\n }\n }\n }\n\n public setBoxInitState(appId: string): void {\n const box = this.teleBoxManager.queryOne({ id: appId });\n if (box) {\n emitter.emit(\"snapshot\", { appId: appId, rect: { ...box.rectSnapshot } });\n if (box.state === TELE_BOX_STATE.Maximized) {\n emitter.emit(\"resize\", {\n appId: appId,\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n });\n }\n }\n }\n\n public setupBoxManager(collectorConfig?: CreateCollectorConfig): TeleBoxManager {\n const root = WindowManager.wrapper ? WindowManager.wrapper : document.body;\n const rect = root.getBoundingClientRect();\n const initManagerState: TeleBoxManagerConfig = {\n root: root,\n containerRect: {\n x: 0,\n y: 0,\n width: rect.width,\n height: rect.height,\n },\n fence: false,\n };\n const container = collectorConfig?.collectorContainer || WindowManager.wrapper;\n const styles = { ...DEFAULT_COLLECTOR_STYLE, ...collectorConfig?.collectorStyles };\n const teleBoxCollector = new TeleBoxCollector({\n styles: styles,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n }).mount(container!);\n initManagerState.collector = teleBoxCollector;\n const manager = new TeleBoxManager(initManagerState);\n if (this.teleBoxManager) {\n this.teleBoxManager.destroy();\n }\n this.teleBoxManager = manager;\n return manager;\n }\n\n public getBox(appId: string): ReadonlyTeleBox | undefined {\n return this.teleBoxManager.queryOne({ id: appId });\n }\n\n public closeBox(appId: string): ReadonlyTeleBox | undefined {\n return this.teleBoxManager.remove(appId);\n }\n\n public updateBox(appId: string, config: TeleBoxManagerUpdateConfig): void {\n return this.teleBoxManager.update(appId, config);\n }\n\n public boxIsFocus(appId: string): boolean | undefined {\n const box = this.getBox(appId);\n return box?.focus;\n }\n\n public getFocusBox(): ReadonlyTeleBox | undefined {\n const boxes = this.teleBoxManager.query({ focus: true });\n return boxes[0];\n }\n\n public getTopBox(): ReadonlyTeleBox | undefined {\n const boxes = this.teleBoxManager.query();\n return maxBy(boxes, \"zIndex\");\n }\n\n public updateBoxState(state?: AppInitState): void {\n if (!state) return;\n const box = this.getBox(state.id);\n if (box) {\n this.teleBoxManager.update(box.id, {\n x: state.x,\n y: state.y,\n width: state.width || 0.5,\n height: state.height || 0.5,\n });\n if (state.focus) {\n this.teleBoxManager.update(box.id, { focus: true });\n }\n if (state.boxState) {\n this.teleBoxManager.setState(state.boxState);\n }\n if (state.snapshotRect) {\n (box as TeleBox).setSnapshot(state.snapshotRect);\n }\n }\n }\n\n public updateManagerRect(): void {\n const rect = this.mainView.divElement?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n const containerRect = { x: 0, y: 0, width: rect.width, height: rect.height };\n this.teleBoxManager.setContainerRect(containerRect);\n this.appProxies.forEach(proxy => {\n if (this.teleBoxManager) {\n proxy.appEmitter.emit(\"containerRectUpdate\", this.teleBoxManager.containerRect);\n }\n });\n }\n }\n\n public moveBox({ appId, x, y }: MoveBoxParams): void {\n this.teleBoxManager.update(appId, { x, y }, true);\n }\n\n public focusBox({ appId }: AppId): void {\n this.teleBoxManager.update(appId, { focus: true }, true);\n }\n\n public resizeBox({ appId, width, height, skipUpdate }: ResizeBoxParams): void {\n this.teleBoxManager.update(appId, { width, height }, skipUpdate);\n }\n\n public setBoxMinSize(params: SetBoxMinSizeParams): void {\n this.teleBoxManager.update(\n params.appId,\n {\n minWidth: params.minWidth,\n minHeight: params.minHeight,\n },\n true\n );\n }\n\n public setBoxTitle(params: SetBoxTitleParams): void {\n this.teleBoxManager.update(params.appId, { title: params.title }, true);\n }\n\n public blurAllBox(): void {\n this.teleBoxManager.updateAll({ focus: false });\n }\n\n public blurFocusBox(): void {\n const focusBoxes = this.teleBoxManager.query({ focus: true });\n if (focusBoxes.length) {\n const box = focusBoxes[0];\n this.teleBoxManager.update(box.id, { focus: false });\n }\n }\n\n public updateAll(config: TeleBoxManagerUpdateConfig): void {\n this.teleBoxManager.updateAll(config);\n }\n\n public setBoxState(state: TELE_BOX_STATE): void {\n this.teleBoxManager.setState(state, true);\n callbacks.emit(\"boxStateChange\", state);\n }\n}\n","import type { Camera, View } from \"white-web-sdk\";\nimport { AnimationMode } from \"white-web-sdk\";\n\nexport class CameraStore {\n private cameras: Map<string, Camera> = new Map();\n\n public setCamera(id: string, camera: Camera) {\n this.cameras.set(id, camera);\n }\n\n public getCamera(id: string) {\n return this.cameras.get(id);\n }\n\n public deleteCamera(id: string) {\n this.cameras.delete(id);\n }\n\n public recoverCamera(id: string, view?: View) {\n const camera = this.cameras.get(id);\n if (camera && view) {\n view.moveCamera({\n ...camera,\n animationMode: AnimationMode.Immediately,\n });\n }\n }\n}\n","import { AnimationMode, reaction } from 'white-web-sdk';\nimport { Fields } from './AttributesDelegate';\nimport { isEmpty, isEqual } from 'lodash';\nimport type { Camera, Size, View } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\n\nexport class MainViewProxy {\n private scale?: number;\n private size?: Size;\n private disposers: any[] = [];\n \n constructor(private manager: AppManager) {\n const delegate = this.manager.delegate;\n const displayer = this.manager.displayer;\n\n this.disposers.push(\n reaction(\n () => this.manager.attributes?.[Fields.MainViewCamera],\n camera => {\n if (delegate.broadcaster !== displayer.observerId && camera) {\n this.moveCamera(camera);\n }\n },\n {\n fireImmediately: true,\n }\n )\n );\n this.disposers.push(\n reaction(\n () => this.manager.attributes?.[Fields.MainViewSize],\n size => {\n if (delegate.broadcaster !== displayer.observerId && size) {\n this.moveCameraToContian(size);\n this.moveCamera(delegate.getMainViewCamera());\n }\n },\n {\n fireImmediately: true,\n }\n )\n );\n\n }\n\n public get view(): View {\n return this.manager.viewManager.mainView; \n }\n\n public moveCameraToContian(size: Size): void {\n if (!isEmpty(size) && !isEqual(size, this.size)) {\n this.view.moveCameraToContain({\n width: size.width,\n height: size.height,\n originX: -size.width / 2,\n originY: -size.height / 2,\n animationMode: AnimationMode.Immediately,\n });\n this.size = size;\n this.scale = this.view.camera.scale;\n }\n }\n\n public moveCamera(camera: Camera): void {\n if (!isEmpty(camera)) {\n if (isEqual(camera, this.view.camera)) return;\n const { centerX, centerY, scale } = camera;\n const needScale = scale * (this.scale || 1);\n this.view.moveCamera({\n centerX: centerX,\n centerY: centerY,\n scale: needScale,\n animationMode: AnimationMode.Immediately,\n });\n }\n }\n\n public destroy() {\n this.disposers.forEach(disposer => disposer());\n }\n}\n","import { callbacks, WindowManager } from \"./index\";\nimport { debounce } from \"lodash\";\nimport { Events, SET_SCENEPATH_DELAY } from \"./constants\";\nimport {\n notifyMainViewModeChange,\n setScenePath,\n setViewFocusScenePath,\n setViewMode,\n} from \"./Utils/Common\";\nimport { TELE_BOX_STATE } from \"@netless/telebox-insider\";\nimport { ViewVisionMode } from \"white-web-sdk\";\nimport type { Camera, Displayer, Size, View } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\nimport type { CameraStore } from \"./Utils/CameraStore\";\n\nexport class ViewManager {\n public mainView: View;\n private views: Map<string, View> = new Map();\n private mainViewIsAddListener = false;\n private delegate = this.manager.delegate;\n private timer?: number;\n\n constructor(\n private displayer: Displayer,\n private manager: AppManager,\n private cameraStore: CameraStore\n ) {\n this.mainView = this.createMainView();\n this.addMainViewCameraListener();\n }\n\n public get currentScenePath(): string {\n return this.displayer.state.sceneState.scenePath;\n }\n\n public createMainView(): View {\n const mainView = this.displayer.views.createView();\n this.cameraStore.setCamera(\"mainView\", mainView.camera);\n mainView.callbacks.on(\"onSizeUpdated\", (size: Size) => {\n this.manager.boxManager.updateManagerRect();\n if (this.delegate.broadcaster === this.displayer.observerId) {\n this.setMainViewSize(size);\n }\n });\n this.switchMainViewModeToWriter();\n return mainView;\n }\n\n public setMainViewSize = debounce(size => {\n this.manager.delegate.setMainViewSize({ ...size });\n }, 200);\n\n public createView(appId: string): View {\n const view = this.displayer.views.createView();\n this.cameraStore.setCamera(appId, view.camera);\n setViewMode(view, ViewVisionMode.Freedom);\n this.views.set(appId, view);\n return view;\n }\n\n public destroyView(appId: string): void {\n const view = this.views.get(appId);\n if (view) {\n this.releaseView(view);\n this.views.delete(appId);\n }\n }\n\n private releaseView(view: View) {\n if (!(view as any).didRelease) {\n view.release();\n }\n }\n\n public getView(appId: string): View | undefined {\n return this.views.get(appId);\n }\n\n private addMainViewCameraListener() {\n this.mainView.callbacks.on(\"onCameraUpdated\", this.mainViewCameraListener);\n }\n\n private removeMainViewCameraListener() {\n this.mainView.callbacks.off(\"onCameraUpdated\", this.mainViewCameraListener);\n }\n\n public switchMainViewToFreedom(): void {\n this.manager.delegate.setMainViewFocusPath();\n notifyMainViewModeChange(callbacks, ViewVisionMode.Freedom);\n setViewMode(this.mainView, ViewVisionMode.Freedom);\n }\n\n public switchMainViewModeToWriter(): void {\n if (!this.manager.canOperate) return;\n if (this.mainView) {\n if (this.mainView.mode === ViewVisionMode.Writable) return;\n notifyMainViewModeChange(callbacks, ViewVisionMode.Writable);\n setViewMode(this.mainView, ViewVisionMode.Writable);\n }\n }\n\n public addMainViewListener(): void {\n if (this.mainViewIsAddListener) return;\n if (this.mainView.divElement) {\n this.mainView.divElement.addEventListener(\"click\", this.mainViewClickListener);\n this.mainView.divElement.addEventListener(\"touchend\", this.mainViewClickListener);\n this.mainViewIsAddListener = true;\n }\n }\n\n public removeMainViewListener(): void {\n if (this.mainView.divElement) {\n this.mainView.divElement.removeEventListener(\"click\", this.mainViewClickListener);\n this.mainView.divElement.removeEventListener(\"touchend\", this.mainViewClickListener);\n }\n }\n\n private mainViewClickListener = () => {\n this.mainViewClickHandler();\n };\n\n public async mainViewClickHandler(): Promise<void> {\n if (!this.manager.canOperate) return;\n if (this.mainView.mode === ViewVisionMode.Writable) return;\n this.manager.delegate.cleanFocus();\n this.freedomAllViews();\n this.manager.dispatchInternalEvent(Events.SwitchViewsToFreedom, {});\n this.manager.dispatchInternalEvent(Events.MainViewFocus, {});\n this.manager.boxManager.blurFocusBox();\n await this.manager.viewManager.switchMainViewToWriter();\n }\n\n private mainViewCameraListener = (camera: Camera) => {\n this.cameraStore.setCamera(\"mainView\", camera);\n if (this.delegate.broadcaster === this.displayer.observerId) {\n this.delegate.setMainViewCamera({ ...camera });\n }\n };\n\n public switchMainViewToWriter(): Promise<boolean> {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n return new Promise((resolve, reject) => {\n this.timer = window.setTimeout(() => {\n try {\n const mainViewScenePath = this.manager.delegate.getMainViewScenePath();\n if (mainViewScenePath) {\n this.freedomAllViews();\n this.removeMainViewCameraListener();\n setScenePath(this.manager.room, mainViewScenePath);\n this.switchMainViewModeToWriter();\n this.manager.cameraStore.recoverCamera(\"mainView\", this.mainView);\n this.addMainViewCameraListener();\n }\n resolve(true);\n } catch (error) {\n reject(error);\n }\n }, SET_SCENEPATH_DELAY);\n });\n }\n\n public refreshViews(): void {\n const focus = this.manager.delegate.focus;\n this.setMainViewFocusScenePath();\n if (focus) {\n const appProxy = this.manager.appProxies.get(focus);\n if (appProxy) {\n if (appProxy.view?.mode === ViewVisionMode.Writable) return;\n appProxy.removeCameraListener();\n appProxy.switchToWritable();\n appProxy.recoverCamera();\n appProxy.addCameraListener();\n }\n } else {\n if (this.manager.mainView.mode === ViewVisionMode.Writable) return;\n this.freedomAllViews();\n this.switchMainViewToWriter();\n }\n }\n\n private setMainViewFocusScenePath() {\n const mainViewScenePath = this.manager.delegate.getMainViewScenePath();\n if (mainViewScenePath) {\n setViewFocusScenePath(this.manager.mainView, mainViewScenePath);\n }\n }\n\n public freedomAllViews(): void {\n this.manager.appProxies.forEach(appProxy => {\n appProxy.setViewFocusScenePath();\n if (appProxy.view) {\n appProxy.view.mode = ViewVisionMode.Freedom;\n }\n });\n if (this.mainView.mode === ViewVisionMode.Writable) {\n notifyMainViewModeChange(callbacks, ViewVisionMode.Freedom);\n this.mainView.mode = ViewVisionMode.Freedom;\n }\n if (!this.manager.viewManager.mainView.focusScenePath) {\n this.manager.delegate.setMainViewFocusPath();\n }\n }\n\n public switchAppToWriter(id: string): void {\n this.freedomAllViews();\n // 为了同步端不闪烁, 需要给 room setScenePath 一个延迟\n setTimeout(() => {\n const appProxy = this.manager.appProxies.get(id);\n if (appProxy) {\n const boxState = this.manager.delegate.getBoxState();\n if (boxState && boxState === TELE_BOX_STATE.Minimized) {\n return;\n }\n appProxy.removeCameraListener();\n appProxy.setScenePath();\n appProxy.switchToWritable();\n appProxy.recoverCamera();\n appProxy.addCameraListener();\n }\n }, SET_SCENEPATH_DELAY);\n }\n\n public destroy(): void {\n this.removeMainViewListener();\n if (WindowManager.wrapper) {\n WindowManager.wrapper.parentNode?.removeChild(WindowManager.wrapper);\n WindowManager.wrapper = undefined;\n }\n this.releaseView(this.mainView);\n }\n}\n\nexport const setupWrapper = (\n root: HTMLElement\n): {\n playground: HTMLDivElement;\n wrapper: HTMLDivElement;\n sizer: HTMLDivElement;\n mainViewElement: HTMLDivElement;\n} => {\n const playground = document.createElement(\"div\");\n playground.className = \"netless-window-manager-playground\";\n\n const sizer = document.createElement(\"div\");\n sizer.className = \"netless-window-manager-sizer\";\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"netless-window-manager-wrapper\";\n\n const mainViewElement = document.createElement(\"div\");\n mainViewElement.className = \"netless-window-manager-main-view\";\n\n playground.appendChild(sizer);\n sizer.appendChild(wrapper);\n wrapper.appendChild(mainViewElement);\n root.appendChild(playground);\n WindowManager.wrapper = wrapper;\n\n return { playground, wrapper, sizer, mainViewElement };\n};\n","import { listenUpdated, unlistenUpdated, reaction, UpdateEventKind } from \"white-web-sdk\";\nimport type { AkkoObjectUpdatedProperty } from \"white-web-sdk\";\n\nexport const onObjectInserted = (object: any, func: () => void) => { // 兼容\b老版本的 reaction\n if (listenUpdated) {\n const listener = (events: readonly AkkoObjectUpdatedProperty<any>[]) => {\n const kinds = events.map(e => e.kind);\n if (kinds.includes(UpdateEventKind.Inserted)) {\n func();\n }\n }\n listenUpdated(object, listener);\n func();\n return () => unlistenUpdated(object, listener);\n } else {\n return reaction(\n () => object,\n () => {\n func();\n }, {\n fireImmediately: true,\n }\n )\n }\n}\n","import { AppAttributes, AppStatus, Events, MagixEventName } from \"./constants\";\nimport { AppListeners } from \"./AppListener\";\nimport { AppProxy } from \"./AppProxy\";\nimport { AttributesDelegate, Fields } from \"./AttributesDelegate\";\nimport { BoxManager, TELE_BOX_STATE } from \"./BoxManager\";\nimport { callbacks, emitter } from \"./index\";\nimport { CameraStore } from \"./Utils/CameraStore\";\nimport { genAppId, makeValidScenePath } from \"./Utils/Common\";\nimport { isRoom, reaction, ScenePathType } from \"white-web-sdk\";\nimport { log } from \"./Utils/log\";\nimport { MainViewProxy } from \"./MainView\";\nimport { ViewManager } from \"./ViewManager\";\nimport type { Displayer, DisplayerState, Room } from \"white-web-sdk\";\nimport type { CreateCollectorConfig } from \"./BoxManager\";\nimport type { AddAppParams, BaseInsertParams, WindowManager } from \"./index\";\nimport { onObjectInserted } from \"./Utils/Reactive\";\n\nexport class AppManager {\n public displayer: Displayer;\n public boxManager: BoxManager;\n public cameraStore: CameraStore;\n public viewManager: ViewManager;\n public appProxies: Map<string, AppProxy> = new Map();\n public appStatus: Map<string, AppStatus> = new Map();\n public delegate = new AttributesDelegate(this);\n public mainViewProxy: MainViewProxy;\n\n private appListeners: AppListeners;\n private reactionDisposers: any[] = [];\n\n constructor(public windowManger: WindowManager, options: CreateCollectorConfig) {\n this.displayer = windowManger.displayer;\n this.cameraStore = new CameraStore();\n this.viewManager = new ViewManager(this.displayer as Room, this, this.cameraStore);\n this.boxManager = new BoxManager(this, this.viewManager.mainView, this.appProxies, options);\n this.appListeners = new AppListeners(\n this,\n this.windowManger,\n this.viewManager,\n this.appProxies\n );\n this.displayer.callbacks.on(this.eventName, this.displayerStateListener);\n this.displayerWritableListener(!this.room?.isWritable);\n this.displayer.callbacks.on(\"onEnableWriteNowChanged\", this.displayerWritableListener);\n this.appListeners.addListeners();\n this.mainViewProxy = new MainViewProxy(this);\n\n emitter.once(\"onCreated\").then(async () => {\n await this.attributesUpdateCallback(this.attributes.apps);\n emitter.onAny(this.boxEventListener);\n const disposer = onObjectInserted(this.attributes.apps, () => {\n this.attributesUpdateCallback(this.attributes.apps);\n });\n this.reactionDisposers.push(disposer);\n this.reactionDisposers.push(\n reaction(\n () => this.attributes[Fields.Broadcaster],\n id => {\n callbacks.emit(\"broadcastChange\", id);\n }\n )\n )\n if (!this.attributes.apps || Object.keys(this.attributes.apps).length === 0) {\n const mainScenePath = this.delegate.getMainViewScenePath();\n if (!mainScenePath) return;\n const sceneState = this.displayer.state.sceneState;\n if (sceneState.scenePath !== mainScenePath) {\n this.room?.setScenePath(mainScenePath);\n }\n }\n });\n }\n\n /**\n * 插件更新 attributes 时的回调\n *\n * @param {*} attributes\n * @memberof WindowManager\n */\n public async attributesUpdateCallback(apps: any) {\n if (apps) {\n for (const id in apps) {\n if (!this.appProxies.has(id) && !this.appStatus.has(id)) {\n const app = apps[id];\n await this.baseInsertApp(\n {\n kind: app.kind,\n options: app.options,\n isDynamicPPT: app.isDynamicPPT,\n },\n id,\n false\n );\n this.focusByAttributes(apps);\n }\n }\n }\n }\n\n public async addApp(params: AddAppParams, isDynamicPPT: boolean): Promise<string | undefined> {\n log(\"addApp\", params);\n const { appId, needFocus } = await this.beforeAddApp(params, isDynamicPPT);\n const appProxy = await this.baseInsertApp(params, appId, true, needFocus);\n this.afterAddApp(appProxy);\n return appProxy?.id;\n }\n\n private async beforeAddApp(params: AddAppParams, isDynamicPPT: boolean) {\n const appId = await genAppId(params.kind);\n this.appStatus.set(appId, AppStatus.StartCreate);\n this.delegate.setupAppAttributes(params, appId, isDynamicPPT);\n if (this.boxManager.boxState === TELE_BOX_STATE.Minimized) {\n this.boxManager.teleBoxManager.setState(TELE_BOX_STATE.Normal);\n }\n const needFocus = this.boxManager.boxState !== TELE_BOX_STATE.Minimized;\n if (needFocus) {\n this.delegate.setAppFocus(appId, true);\n }\n const attrs = params.attributes ?? {};\n this.safeUpdateAttributes([appId], attrs);\n return { appId, needFocus };\n }\n\n private afterAddApp(appProxy: AppProxy | undefined) {\n if (appProxy) {\n emitter.emit(\"move\", {\n appId: appProxy.id,\n x: appProxy.box?.x,\n y: appProxy.box?.y,\n });\n }\n }\n\n public async closeApp(appId: string) {\n const appProxy = this.appProxies.get(appId);\n if (appProxy) {\n appProxy.destroy(true, true);\n }\n }\n\n private async baseInsertApp(\n params: BaseInsertParams,\n appId: string,\n isAddApp: boolean,\n focus?: boolean\n ) {\n this.appStatus.set(appId, AppStatus.StartCreate);\n if (this.appProxies.has(appId)) {\n console.warn(\"[WindowManager]: app duplicate exists and cannot be created again\");\n return;\n }\n const appProxy = new AppProxy(params, this, appId, isAddApp);\n if (appProxy) {\n await appProxy.baseInsertApp(focus);\n this.appStatus.delete(appId);\n return appProxy;\n } else {\n this.appStatus.delete(appId);\n throw new Error(\"[WindowManger]: initialize AppProxy failed\");\n }\n }\n\n private displayerStateListener = (state: Partial<DisplayerState>) => {\n const sceneState = state.sceneState;\n if (sceneState) {\n const scenePath = sceneState.scenePath;\n this.appProxies.forEach(appProxy => {\n if (appProxy.scenePath && scenePath.startsWith(appProxy.scenePath)) {\n appProxy.emitAppSceneStateChange(sceneState);\n if (sceneState.index !== appProxy.sceneIndex) {\n appProxy.setSceneIndex(sceneState.index);\n }\n }\n });\n this.viewManager.refreshViews();\n }\n if (state.roomMembers) {\n this.windowManger.cursorManager?.setRoomMembers(state.roomMembers);\n this.windowManger.cursorManager?.cleanMemberAttributes(state.roomMembers);\n }\n this.appProxies.forEach(appProxy => {\n appProxy.appEmitter.emit(\"roomStateChange\", state);\n });\n };\n\n private displayerWritableListener = (isReadonly: boolean) => {\n const isWritable = !isReadonly;\n const isManualWritable =\n this.windowManger.readonly === undefined || this.windowManger.readonly === false;\n if (this.windowManger.readonly === undefined) {\n this.boxManager.teleBoxManager.setReadonly(isReadonly);\n } else {\n this.boxManager.teleBoxManager.setReadonly(!(isWritable && isManualWritable));\n }\n this.appProxies.forEach(appProxy => {\n appProxy.emitAppIsWritableChange();\n });\n };\n\n private get eventName() {\n return isRoom(this.displayer) ? \"onRoomStateChanged\" : \"onPlayerStateChanged\";\n }\n\n public get attributes() {\n return this.windowManger.attributes;\n }\n\n public get canOperate() {\n return this.windowManger.canOperate;\n }\n\n public get room() {\n return isRoom(this.displayer) ? (this.displayer as Room) : undefined;\n }\n\n public get mainView() {\n return this.windowManger.mainView;\n }\n\n public safeSetAttributes(attributes: any) {\n this.windowManger.safeSetAttributes(attributes);\n }\n\n public safeUpdateAttributes(keys: string[], value: any) {\n this.windowManger.safeUpdateAttributes(keys, value);\n }\n\n public setMainViewScenePath(scenePath: string) {\n if (this.room) {\n const scenePathType = this.displayer.scenePathType(scenePath);\n if (scenePathType === ScenePathType.None) {\n throw new Error(`${scenePath} not valid scene`);\n } else if (scenePathType === ScenePathType.Page) {\n this._setMainViewScenePath(scenePath);\n } else if (scenePathType === ScenePathType.Dir) {\n const validScenePath = makeValidScenePath(this.displayer, scenePath);\n this._setMainViewScenePath(validScenePath);\n }\n }\n }\n\n private _setMainViewScenePath(scenePath: string) {\n this.safeSetAttributes({ _mainScenePath: scenePath });\n this.viewManager.freedomAllViews();\n this.viewManager.switchMainViewToWriter();\n this.delegate.setMainViewFocusPath();\n }\n\n public setMainViewSceneIndex(index: number) {\n if (this.room) {\n this.safeSetAttributes({ _mainSceneIndex: index });\n this.viewManager.freedomAllViews();\n this.viewManager.switchMainViewToWriter();\n this.room.setSceneIndex(index);\n this.delegate.setMainViewScenePath(this.room.state.sceneState.scenePath);\n this.delegate.setMainViewFocusPath();\n }\n }\n\n public getAppInitPath(appId: string): string | undefined {\n const attrs = this.delegate.getAppAttributes(appId);\n if (attrs) {\n return attrs?.options?.scenePath;\n }\n }\n\n public safeDispatchMagixEvent(event: string, payload: any) {\n if (this.canOperate) {\n (this.displayer as Room).dispatchMagixEvent(event, payload);\n }\n }\n\n private boxEventListener = (eventName: string | number, payload: any) => {\n switch (eventName) {\n case \"move\": {\n this.dispatchInternalEvent(Events.AppMove, payload);\n this.delegate.updateAppState(payload.appId, AppAttributes.Position, {\n x: payload.x,\n y: payload.y,\n });\n break;\n }\n case \"focus\": {\n this.windowManger.safeSetAttributes({ focus: payload.appId });\n const appProxy = this.appProxies.get(payload.appId);\n if (appProxy?.scenePath) {\n this.dispatchInternalEvent(Events.SwitchViewsToFreedom, {});\n this.viewManager.switchAppToWriter(payload.appId);\n }\n this.dispatchInternalEvent(Events.AppFocus, payload);\n break;\n }\n case \"blur\": {\n this.dispatchInternalEvent(Events.AppBlur, payload);\n break;\n }\n case \"resize\": {\n if (payload.width && payload.height) {\n this.dispatchInternalEvent(Events.AppResize, payload);\n this.delegate.updateAppState(payload.appId, AppAttributes.Size, {\n width: payload.width,\n height: payload.height,\n });\n this.room?.refreshViewSize();\n }\n break;\n }\n case TELE_BOX_STATE.Minimized: {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppBoxStateChange,\n payload: {\n ...payload,\n state: eventName,\n },\n });\n this.safeSetAttributes({ boxState: eventName });\n\n this.delegate.cleanFocus();\n this.boxManager.blurFocusBox();\n this.viewManager.freedomAllViews();\n this.viewManager.switchMainViewToWriter();\n break;\n }\n case TELE_BOX_STATE.Maximized: {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppBoxStateChange,\n payload: {\n ...payload,\n state: eventName,\n },\n });\n const topBox = this.boxManager.getTopBox();\n if (topBox) {\n emitter.emit(\"focus\", { appId: topBox.id });\n }\n this.safeSetAttributes({ boxState: eventName });\n break;\n }\n case TELE_BOX_STATE.Normal: {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppBoxStateChange,\n payload: {\n ...payload,\n state: eventName,\n },\n });\n this.safeSetAttributes({ boxState: eventName });\n break;\n }\n case \"snapshot\": {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppSnapshot,\n payload,\n });\n\n this.delegate.updateAppState(payload.appId, AppAttributes.SnapshotRect, {\n ...payload.rect,\n });\n break;\n }\n case \"close\": {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppClose,\n payload,\n });\n const appProxy = this.appProxies.get(payload.appId);\n if (appProxy) {\n appProxy.destroy(false, true, payload.error);\n }\n setTimeout(() => {\n this.viewManager.refreshViews();\n }, 100);\n break;\n }\n default:\n break;\n }\n };\n\n public focusByAttributes(apps: any) {\n if (apps && Object.keys(apps).length === this.boxManager.appBoxMap.size) {\n const focusAppId = this.delegate.focus;\n if (focusAppId) {\n this.boxManager.focusBox({ appId: focusAppId });\n }\n }\n }\n\n public dispatchInternalEvent(event: Events, payload: any) {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: event,\n payload: payload,\n });\n }\n\n public destroy() {\n this.displayer.callbacks.off(this.eventName, this.displayerStateListener);\n this.displayer.callbacks.off(\"onEnableWriteNowChanged\", this.displayerWritableListener);\n this.appListeners.removeListeners();\n emitter.offAny(this.boxEventListener);\n if (this.reactionDisposers.length) {\n this.reactionDisposers.map(disposer => disposer());\n this.reactionDisposers = [];\n }\n if (this.appProxies.size) {\n this.appProxies.forEach(appProxy => {\n appProxy.destroy(true, false);\n });\n }\n this.viewManager.destroy();\n this.mainViewProxy.destroy();\n callbacks.clearListeners();\n }\n}\n","function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentElement !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration();\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n select.selectedIndex = -1; // no option should be selected\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, bubbles = false) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor() {\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n this.e = element(target.nodeName);\n this.t = target;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes) {\n super();\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = append_empty_stylesheet(node).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n set_current_component(null);\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '&quot;',\n \"'\": '&#39;',\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction escape_attribute_value(value) {\n return typeof value === 'string' ? escape(value) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : context || []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : options.context || []),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.42.4' }, detail), true));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, identity, init, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, src_url_equal, start_hydrating, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","<script lang=\"ts\">\n import { isEmpty } from \"lodash\";\n\n export let cursorName: string;\n export let tagName: string;\n export let backgroundColor: string;\n export let appliance: string;\n export let x: number;\n export let y: number;\n export let src: string;\n export let visible: boolean;\n export let avatar: string;\n export let theme: string;\n export let color: string;\n export let cursorTagBackgroundColor: string;\n export let opacity: number;\n\n $: hasName = !isEmpty(cursorName);\n $: hasTagName = !isEmpty(tagName);\n $: hasAvatar = !isEmpty(avatar);\n $: display = visible ? \"initial\" : \"none\";\n\n const computedAvatarStyle = () => {\n return Object.entries({\n width: (hasName ? 19 : 28) + \"px\",\n height: (hasName ? 19 : 28) + \"px\",\n position: hasName ? \"initial\" : \"absolute\",\n \"border-color\": hasName ? \"white\" : backgroundColor,\n \"margin-right\": (hasName ? 4 : 0) + \"px\",\n })\n .map(([key, v]) => `${key}: ${v}`)\n .join(\";\");\n };\n</script>\n\n<div\n class=\"netless-window-manager-cursor-mid\"\n style=\"transform: translateX({x}px) translateY({y}px);display: {display}\"\n>\n <div class=\"netless-window-manager-cursor-name\">\n <div\n class={theme}\n style=\"background-color: {backgroundColor};color: {color};opacity: {opacity}\"\n >\n {#if hasAvatar}\n <img\n class=\"cursor-selector-avatar\"\n style={computedAvatarStyle()}\n src={avatar}\n alt=\"avatar\"\n />\n {/if}\n {cursorName}\n {#if hasTagName}\n <span class=\"cursor-tag-name\" style=\"background-color: {cursorTagBackgroundColor}\">\n {tagName}\n </span>\n {/if}\n </div>\n </div>\n <div class=\"cursor-image-wrapper\">\n <img class=\"cursor-{appliance}-image\" {src} alt={appliance} />\n </div>\n</div>\n","import { ApplianceNames } from \"white-web-sdk\";\nimport pencil from \"../image/pencil-cursor.png\";\nimport selector from \"../image/selector-cursor.png\";\nimport eraser from \"../image/eraser-cursor.png\";\nimport shape from \"../image/shape-cursor.svg\";\nimport text from \"../image/text-cursor.svg\";\n\nexport const ApplianceMap: {\n [key: string]: string;\n} = {\n [ApplianceNames.pencil]: pencil,\n [ApplianceNames.selector]: selector,\n [ApplianceNames.eraser]: eraser,\n [ApplianceNames.shape]: shape,\n [ApplianceNames.text]: text,\n};\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5zaGFwZS1jdXJzb3I8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0icGF0aC0xIj48L3BhdGg+CiAgICAgICAgPGZpbHRlciB4PSItNjQuNiUiIHk9Ii01OS41JSIgd2lkdGg9IjIyOS4zJSIgaGVpZ2h0PSIyNDYuMSUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci0yIj4KICAgICAgICAgICAgPGZlTW9ycGhvbG9neSByYWRpdXM9IjEiIG9wZXJhdG9yPSJkaWxhdGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dTcHJlYWRPdXRlcjEiPjwvZmVNb3JwaG9sb2d5PgogICAgICAgICAgICA8ZmVPZmZzZXQgZHg9IjAiIGR5PSIyIiBpbj0ic2hhZG93U3ByZWFkT3V0ZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZU9mZnNldD4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMyIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd0JsdXJPdXRlcjEiIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJvdXQiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMTYgMCIgdHlwZT0ibWF0cml4IiBpbj0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbG9yTWF0cml4PgogICAgICAgIDwvZmlsdGVyPgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi00IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iV2hpdGVib2FyZC1HdWlkZWxpbmVzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQ0LjAwMDAwMCwgLTc1MS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InNoYXBlLWN1cnNvciIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzQ0LjAwMDAwMCwgNzUxLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vS00NCIgZmlsbD0iI0ZGRkZGRiIgb3BhY2l0eT0iMC4wMSIgeD0iMCIgeT0iMCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgICAgPGcgaWQ9IuW9oueKtue7k+WQiCIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjEiIGZpbHRlcj0idXJsKCNmaWx0ZXItMikiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIxIiBkPSJNMjAsMjEgQzIwLjQ4NTQxMDMsMjEgMjAuODk4MDg1LDIxLjM0Nzk5OTMgMjAuOTg5OTQ3OSwyMS44NjU0ODc3IEwyMSwyMiBMMjEsMjcgQzIxLDI3LjU1MjI4NDcgMjAuNTUyMjg0NywyOCAyMCwyOCBDMTkuNTE0NTg5NywyOCAxOS4xMDE5MTUsMjcuNjUyMDAwNyAxOS4wMTAwNTIxLDI3LjEzNDUxMjMgTDE5LDI3IEwxOSwyMiBDMTksMjEuNDQ3NzE1MyAxOS40NDc3MTUzLDIxIDIwLDIxIFogTTI3LDE5IEMyNy41NTIyODQ3LDE5IDI4LDE5LjQ0NzcxNTMgMjgsMjAgQzI4LDIwLjQ4NTQxMDMgMjcuNjUyMDAwNywyMC44OTgwODUgMjcuMTM0NTEyMywyMC45ODk5NDc5IEwyNywyMSBMMjIsMjEgQzIxLjQ0NzcxNTMsMjEgMjEsMjAuNTUyMjg0NyAyMSwyMCBDMjEsMTkuNTE0NTg5NyAyMS4zNDc5OTkzLDE5LjEwMTkxNSAyMS44NjU0ODc3LDE5LjAxMDA1MjEgTDIyLDE5IEwyNywxOSBaIE0xOCwxOSBDMTguNTUyMjg0NywxOSAxOSwxOS40NDc3MTUzIDE5LDIwIEMxOSwyMC40ODU0MTAzIDE4LjY1MjAwMDcsMjAuODk4MDg1IDE4LjEzNDUxMjMsMjAuOTg5OTQ3OSBMMTgsMjEgTDEzLDIxIEMxMi40NDc3MTUzLDIxIDEyLDIwLjU1MjI4NDcgMTIsMjAgQzEyLDE5LjUxNDU4OTcgMTIuMzQ3OTk5MywxOS4xMDE5MTUgMTIuODY1NDg3NywxOS4wMTAwNTIxIEwxMywxOSBMMTgsMTkgWiBNMjAsMTIgQzIwLjQ4NTQxMDMsMTIgMjAuODk4MDg1LDEyLjM0Nzk5OTMgMjAuOTg5OTQ3OSwxMi44NjU0ODc3IEwyMSwxMyBMMjEsMTggQzIxLDE4LjU1MjI4NDcgMjAuNTUyMjg0NywxOSAyMCwxOSBDMTkuNTE0NTg5NywxOSAxOS4xMDE5MTUsMTguNjUyMDAwNyAxOS4wMTAwNTIxLDE4LjEzNDUxMjMgTDE5LDE4IEwxOSwxMyBDMTksMTIuNDQ3NzE1MyAxOS40NDc3MTUzLDEyIDIwLDEyIFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9oiIgZmlsbD0iI0ZGRkZGRiIgeD0iMTguNSIgeT0iMTciIHdpZHRoPSIzIiBoZWlnaHQ9IjYiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaIiIGZpbGw9IiNGRkZGRkYiIHg9IjE3IiB5PSIxOC41IiB3aWR0aD0iNiIgaGVpZ2h0PSIzIj48L3JlY3Q+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjMjEyMzI0IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDdweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDcgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT50ZXh0LWN1cnNvcjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxwYXRoIGQ9Ik0xNiwyNi41IEMxNS43MjM4NTc2LDI2LjUgMTUuNSwyNi4yNzYxNDI0IDE1LjUsMjYgQzE1LjUsMjUuNzU0NTQwMSAxNS42NzY4NzUyLDI1LjU1MDM5MTYgMTUuOTEwMTI0NCwyNS41MDgwNTU3IEwxNiwyNS41IEwxOS41LDI1LjUgTDE5LjUsMTQuNSBMMTYsMTQuNSBDMTUuNzIzODU3NiwxNC41IDE1LjUsMTQuMjc2MTQyNCAxNS41LDE0IEMxNS41LDEzLjc1NDU0MDEgMTUuNjc2ODc1MiwxMy41NTAzOTE2IDE1LjkxMDEyNDQsMTMuNTA4MDU1NyBMMTYsMTMuNSBMMjQsMTMuNSBDMjQuMjc2MTQyNCwxMy41IDI0LjUsMTMuNzIzODU3NiAyNC41LDE0IEMyNC41LDE0LjI0NTQ1OTkgMjQuMzIzMTI0OCwxNC40NDk2MDg0IDI0LjA4OTg3NTYsMTQuNDkxOTQ0MyBMMjQsMTQuNSBMMjAuNSwxNC41IEwyMC41LDI1LjUgTDI0LDI1LjUgQzI0LjI3NjE0MjQsMjUuNSAyNC41LDI1LjcyMzg1NzYgMjQuNSwyNiBDMjQuNSwyNi4yNDU0NTk5IDI0LjMyMzEyNDgsMjYuNDQ5NjA4NCAyNC4wODk4NzU2LDI2LjQ5MTk0NDMgTDI0LDI2LjUgTDE2LDI2LjUgWiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgICAgIDxmaWx0ZXIgeD0iLTI4NC4wJSIgeT0iLTgxLjUlIiB3aWR0aD0iNjY4LjElIiBoZWlnaHQ9IjI5My45JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMSIgb3BlcmF0b3I9ImRpbGF0ZSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd1NwcmVhZE91dGVyMSI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjIiIGluPSJzaGFkb3dTcHJlYWRPdXRlcjEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzIiBpbj0ic2hhZG93T2Zmc2V0T3V0ZXIxIiByZXN1bHQ9InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93Qmx1ck91dGVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9Im91dCIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29tcG9zaXRlPgogICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xNiAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgPC9maWx0ZXI+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0i6aG16Z2iLTQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXaGl0ZWJvYXJkLUd1aWRlbGluZXMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODguMDAwMDAwLCAtNjcyLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0idGV4dC1jdXJzb3IiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM5Mi4wMDAwMDAsIDY3Mi4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaLlpIfku70tNDAiIGZpbGw9IiNGRkZGRkYiIG9wYWNpdHk9IjAuMDEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgICAgICAgICAgPHVzZSBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIxIiBmaWx0ZXI9InVybCgjZmlsdGVyLTIpIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMSIgZD0iTTE5LDI1IEwxOSwxNSBMMTYsMTUgQzE1LjQ0NzcxNTMsMTUgMTUsMTQuNTUyMjg0NyAxNSwxNCBDMTUsMTMuNTE0NTg5NyAxNS4zNDc5OTkzLDEzLjEwMTkxNSAxNS44NjU0ODc3LDEzLjAxMDA1MjEgTDE2LDEzIEwyNCwxMyBDMjQuNTUyMjg0NywxMyAyNSwxMy40NDc3MTUzIDI1LDE0IEMyNSwxNC40ODU0MTAzIDI0LjY1MjAwMDcsMTQuODk4MDg1IDI0LjEzNDUxMjMsMTQuOTg5OTQ3OSBMMjQsMTUgTDIxLDE1IEwyMSwyNSBMMjQsMjUgQzI0LjU1MjI4NDcsMjUgMjUsMjUuNDQ3NzE1MyAyNSwyNiBDMjUsMjYuNDg1NDEwMyAyNC42NTIwMDA3LDI2Ljg5ODA4NSAyNC4xMzQ1MTIzLDI2Ljk4OTk0NzkgTDI0LDI3IEwxNiwyNyBDMTUuNDQ3NzE1MywyNyAxNSwyNi41NTIyODQ3IDE1LDI2IEMxNSwyNS41MTQ1ODk3IDE1LjM0Nzk5OTMsMjUuMTAxOTE1IDE1Ljg2NTQ4NzcsMjUuMDEwMDUyMSBMMTYsMjUgTDE5LDI1IFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"","import App from './Cursor.svelte';\nimport pRetry from 'p-retry';\nimport { ApplianceMap } from './icons';\nimport { ApplianceNames, autorun } from 'white-web-sdk';\nimport { CursorState } from '../constants';\nimport { Fields } from '../AttributesDelegate';\nimport { get, omit } from 'lodash';\nimport type { RoomMember } from \"white-web-sdk\";\nimport type { CursorManager } from \"./index\";\nimport type { WindowManager } from \"../index\";\nimport type { SvelteComponent } from \"svelte\";\n\nexport type Payload = {\n [key: string]: any\n}\n\nexport class Cursor {\n private member?: RoomMember;\n private disposer: any;\n private timer?: number;\n private component?: SvelteComponent;\n\n constructor(\n private manager: WindowManager,\n private cursors: any,\n private memberId: string,\n private cursorManager: CursorManager,\n private wrapper?: HTMLElement\n ) {\n this.setMember();\n this.createCursor();\n pRetry(() => {\n this.disposer && this.disposer();\n if (!this.cursorPosition) {\n throw new Error();\n }\n this.startReaction();\n }, { retries: 3 });\n this.autoHidden();\n }\n\n private startReaction() {\n this.disposer = autorun(() => {\n const cursor = this.cursorPosition;\n const state = this.cursorState;\n if (cursor) {\n const x = cursor.x;\n const y = cursor.y;\n const rect = this.cursorManager.wrapperRect;\n const containerRect = this.cursorManager.containerRect;\n if (this.component && rect && containerRect) {\n this.autoHidden();\n const translateX = x * rect.width; // x 需要减去一半的 cursor 的宽, 加上 icon 的宽\n const translateY = y * rect.height - 15; // y 减去 cursor 的高\n this.component.$set({ visible: true, x: translateX, y: translateY });\n }\n }\n if (state && state === CursorState.Leave) {\n this.hide();\n }\n });\n }\n\n public get memberApplianceName() {\n return this.member?.memberState?.currentApplianceName;\n }\n\n public get memberColor() {\n const rgb = this.member?.memberState?.strokeColor.join(\",\");\n return `rgb(${rgb})`;\n }\n\n private get payload(): Payload | undefined {\n return this.member?.payload;\n }\n\n public get memberCursorName() {\n return this.payload?.cursorName || this.memberId;\n }\n\n private get memberTheme() {\n if (this.payload?.theme) {\n return \"cursor-inner-mellow\";\n } else {\n return \"cursor-inner\";\n }\n }\n\n private get memberCursorTextColor() {\n return this.payload?.cursorTextColor || \"#FFFFFF\";\n }\n\n private get memberCursorTagBackgroundColor() {\n return this.payload?.cursorTagBackgroundColor || this.memberColor;\n }\n\n private get memberAvatar() {\n return this.payload?.avatar;\n }\n\n private get memberOpacity() {\n if (!this.memberCursorName && !this.memberAvatar) {\n return 0;\n } else {\n return 1;\n }\n }\n\n public get cursorState() {\n return get(this.cursors, [this.memberId, Fields.CursorState]);\n }\n\n public get cursorPosition() {\n return get(this.cursors, [this.memberId, Fields.Position]);\n }\n\n public getFocusBox() {\n return this.cursorManager.getFocusBox();\n }\n\n private autoHidden() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = window.setTimeout(() => {\n this.hide();\n }, 1000 * 10); // 10 秒钟自动隐藏\n }\n\n private async createCursor() {\n if (this.member && this.wrapper) {\n this.component = new App({\n target: this.wrapper,\n props: this.initProps(),\n });\n }\n }\n\n private initProps() {\n return {\n x: 0,\n y: 0,\n appliance: this.memberApplianceName,\n avatar: this.memberAvatar,\n src: this.getIcon(),\n visible: false,\n backgroundColor: this.memberColor,\n cursorName: this.memberCursorName,\n theme: this.memberTheme,\n color: this.memberCursorTextColor,\n cursorTagBackgroundColor: this.memberCursorTagBackgroundColor,\n opacity: this.memberOpacity,\n };\n }\n\n private getIcon() {\n if (this.member) {\n const applianceSrc = ApplianceMap[this.memberApplianceName || ApplianceNames.shape];\n return applianceSrc || ApplianceMap[ApplianceNames.shape];\n }\n }\n\n public setMember() {\n this.member = this.cursorManager.roomMembers?.find(\n member => member.memberId === Number(this.memberId)\n );\n this.component?.$set(omit(this.initProps(), [\"x\", \"y\", \"visible\"]));\n }\n\n public destroy() {\n this.disposer && this.disposer();\n if (this.component) {\n this.component.$destroy();\n }\n this.cursorManager.cursorInstances.delete(this.memberId);\n }\n\n public hide() {\n if (this.component) {\n this.component.$set({ visible: false });\n }\n }\n}\n","import { Cursor } from './Cursor';\nimport { CursorState } from '../constants';\nimport { debounce } from 'lodash';\nimport { Fields } from '../AttributesDelegate';\nimport { TELE_BOX_STATE } from '@netless/telebox-insider';\nimport { WindowManager } from '../index';\nimport type { RoomMember } from \"white-web-sdk\";\nimport type { AppManager } from \"../AppManager\";\nimport { onObjectInserted } from '../Utils/Reactive';\n\nexport class CursorManager {\n public containerRect?: DOMRect;\n public wrapperRect?: DOMRect;\n private disposer: any;\n public cursorInstances: Map<string, Cursor> = new Map();\n public roomMembers?: readonly RoomMember[];\n\n constructor(private manager: WindowManager, private appManager: AppManager) {\n this.roomMembers = this.manager.room?.state.roomMembers;\n const wrapper = WindowManager.wrapper;\n if (wrapper) {\n wrapper.addEventListener(\"mousemove\", this.mouseMoveListener);\n wrapper.addEventListener(\"touchmove\", this.touchMoveListener);\n wrapper.addEventListener(\"mouseleave\", this.mouseLeaveListener);\n wrapper.addEventListener(\"touchend\", this.mouseLeaveListener);\n this.initCursorAttributes();\n this.wrapperRect = wrapper.getBoundingClientRect();\n this.startReaction(wrapper);\n }\n }\n\n private startReaction(wrapper: HTMLElement) {\n this.disposer = onObjectInserted(this.cursors, () => {\n this.handleRoomMembersChange(wrapper);\n });\n }\n\n private handleRoomMembersChange(wrapper: HTMLElement) {\n const memberIds = this.roomMembers?.map(member => member.memberId);\n if (memberIds?.length) {\n for (const memberId in this.cursors) {\n if (\n memberIds.includes(Number(memberId)) &&\n !this.cursorInstances.has(memberId) &&\n memberId !== this.observerId\n ) {\n const component = new Cursor(\n this.manager,\n this.cursors,\n memberId,\n this,\n wrapper\n );\n this.cursorInstances.set(memberId, component);\n }\n }\n }\n }\n\n private get observerId() {\n return String(this.manager.displayer.observerId);\n }\n\n public get cursors() {\n return this.manager.attributes?.[Fields.Cursors];\n }\n\n public get boxState() {\n return this.appManager.delegate.getBoxState();\n }\n\n private mouseMoveListener = debounce((event: MouseEvent) => {\n this.updateCursor(event.clientX, event.clientY);\n }, 5);\n\n private touchMoveListener = debounce((event: TouchEvent) => {\n if (event.touches.length === 1) {\n const touchEvent = event.touches[0];\n this.updateCursor(touchEvent.clientX, touchEvent.clientY);\n }\n }, 5);\n\n private initCursorAttributes() {\n this.appManager.delegate.updateCursor(this.observerId, {\n x: 0,\n y: 0,\n });\n this.appManager.delegate.updateCursorState(this.observerId, CursorState.Leave);\n }\n\n public getBoxTitleHeight() {\n if (this.boxState === TELE_BOX_STATE.Maximized) {\n const box = this.appManager.boxManager.getTopBox();\n if (box) {\n return box.$titleBar?.clientHeight;\n }\n }\n }\n\n public getFocusBox() {\n return this.appManager.boxManager.getFocusBox();\n }\n\n private updateCursor(clientX: number, clientY: number) {\n if (this.wrapperRect && this.manager.canOperate) {\n const x = (clientX - this.wrapperRect.x) / this.wrapperRect.width;\n const y = (clientY - this.wrapperRect.y) / this.wrapperRect.height;\n if (this.appManager.delegate.getCursorState(this.observerId)) {\n this.appManager.delegate.updateCursorState(this.observerId, CursorState.Normal);\n }\n this.appManager.delegate.updateCursor(this.observerId, {\n x,\n y,\n });\n }\n }\n\n private mouseLeaveListener = () => {\n this.hideCursor(this.observerId);\n this.appManager.delegate.updateCursorState(this.observerId, CursorState.Leave);\n };\n\n public updateContainerRect() {\n this.containerRect = WindowManager.container?.getBoundingClientRect();\n this.wrapperRect = WindowManager.wrapper?.getBoundingClientRect();\n }\n\n public setRoomMembers(members: readonly RoomMember[]) {\n this.roomMembers = members;\n this.cursorInstances.forEach(cursor => {\n cursor.setMember();\n });\n if (WindowManager.wrapper) {\n this.handleRoomMembersChange(WindowManager.wrapper);\n }\n }\n\n public cleanMemberCursor(memberId: string) {\n this.appManager.delegate.cleanCursor(memberId);\n const cursor = this.cursorInstances.get(memberId);\n if (cursor) {\n cursor.destroy();\n }\n }\n\n public hideCursor(memberId: string) {\n const cursor = this.cursorInstances.get(memberId);\n if (cursor) {\n cursor.hide();\n }\n }\n\n public cleanMemberAttributes(members: readonly RoomMember[]) {\n const memberIds = members.map(member => member.memberId);\n const needDeleteIds = [];\n for (const memberId in this.cursors) {\n const index = memberIds.findIndex(id => id === Number(memberId));\n if (index === -1) {\n needDeleteIds.push(memberId);\n }\n }\n needDeleteIds.forEach(memberId => {\n const instance = this.cursorInstances.get(memberId);\n if (instance) {\n instance.destroy();\n }\n this.appManager.delegate.cleanCursor(memberId);\n });\n }\n\n public destroy() {\n const wrapper = WindowManager.wrapper;\n if (wrapper) {\n wrapper.removeEventListener(\"mousemove\", this.mouseMoveListener);\n wrapper.removeEventListener(\"touchmove\", this.touchMoveListener);\n wrapper.removeEventListener(\"mouseleave\", this.mouseLeaveListener);\n wrapper.removeEventListener(\"touchend\", this.mouseLeaveListener);\n }\n this.disposer && this.disposer();\n if (this.cursorInstances.size) {\n this.cursorInstances.forEach(cursor => cursor.destroy());\n this.cursorInstances.clear();\n }\n }\n}\n","import AppDocsViewer from \"@netless/app-docs-viewer\";\nimport AppMediaPlayer, { setOptions } from \"@netless/app-media-player\";\nimport Emittery from \"emittery\";\nimport { isNull, isObject } from \"lodash\";\nimport {\n AppCreateError,\n AppManagerNotInitError,\n ParamsInvalidError,\n WhiteWebSDKInvalidError,\n} from \"./Utils/error\";\nimport { AppManager } from \"./AppManager\";\nimport { appRegister } from \"./Register\";\nimport { CursorManager } from \"./Cursor\";\nimport type { Apps } from \"./AttributesDelegate\";\nimport { Fields } from \"./AttributesDelegate\";\nimport { getVersionNumber, wait } from \"./Utils/Common\";\nimport {\n InvisiblePlugin,\n isRoom,\n RoomPhase,\n ViewMode,\n ViewVisionMode,\n WhiteVersion,\n} from \"white-web-sdk\";\nimport { log } from \"./Utils/log\";\nimport { replaceRoomFunction } from \"./Utils/RoomHacker\";\nimport { ResizeObserver as ResizeObserverPolyfill } from \"@juggle/resize-observer\";\nimport { setupWrapper } from \"./ViewManager\";\nimport \"./style.css\";\nimport \"@netless/telebox-insider/dist/style.css\";\nimport type {\n Displayer,\n SceneDefinition,\n View,\n Room,\n InvisiblePluginContext,\n Camera,\n} from \"white-web-sdk\";\nimport type { AppListeners } from \"./AppListener\";\nimport type { NetlessApp, RegisterParams } from \"./typings\";\nimport type { TELE_BOX_STATE } from \"./BoxManager\";\nimport { REQUIRE_VERSION, DEFAULT_CONTAINER_RATIO } from \"./constants\";\nimport { initDb } from \"./Register/storage\";\n\nconst ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;\n\nexport type WindowMangerAttributes = {\n modelValue?: string;\n boxState: TELE_BOX_STATE;\n [key: string]: any;\n};\n\nexport type apps = {\n [key: string]: NetlessApp;\n};\n\nexport type AddAppOptions = {\n scenePath?: string;\n title?: string;\n scenes?: SceneDefinition[];\n};\n\nexport type setAppOptions = AddAppOptions & { appOptions?: any };\n\nexport type AddAppParams = {\n kind: string;\n // app 地址(本地 app 不需要传)\n src?: string;\n // 窗口配置\n options?: AddAppOptions;\n // 初始化 attributes\n attributes?: any;\n};\n\nexport type BaseInsertParams = {\n kind: string;\n // app 地址(本地 app 不需要传)\n src?: string;\n // 窗口配置\n options?: AddAppOptions;\n // 初始化 attributes\n attributes?: any;\n isDynamicPPT?: boolean;\n};\n\nexport type AppSyncAttributes = {\n kind: string;\n src?: string;\n options: any;\n state?: any;\n isDynamicPPT?: boolean;\n};\n\nexport type AppInitState = {\n id: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n focus?: boolean;\n snapshotRect?: any;\n boxState?: TELE_BOX_STATE;\n sceneIndex?: number;\n};\n\nexport const emitter: Emittery<{\n onCreated: undefined;\n [key: string]: any;\n}> = new Emittery();\n\nexport type PublicEvent = {\n mainViewModeChange: ViewVisionMode;\n boxStateChange: `${TELE_BOX_STATE}`;\n broadcastChange: number;\n};\n\nexport type MountParams = {\n room: Room;\n container: HTMLElement;\n /** 白板高宽比例, 默认为 9 / 16 */\n containerSizeRatio?: number;\n /** 显示 PS 透明背景,默认 true */\n chessboard?: boolean;\n collectorContainer?: HTMLElement;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n overwriteStyles?: string;\n cursor?: boolean;\n debug?: boolean;\n};\n\nexport const callbacks: Emittery<PublicEvent> = new Emittery();\n\nexport class WindowManager extends InvisiblePlugin<WindowMangerAttributes> {\n public static kind = \"WindowManager\";\n public static displayer: Displayer;\n public static wrapper?: HTMLElement;\n public static playground?: HTMLElement;\n public static container?: HTMLElement;\n public static debug = false;\n public static containerSizeRatio = DEFAULT_CONTAINER_RATIO;\n private static isCreated = false;\n\n public appListeners?: AppListeners;\n\n public readonly?: boolean;\n public emitter: Emittery<PublicEvent> = callbacks;\n private appManager?: AppManager;\n public cursorManager?: CursorManager;\n\n constructor(context: InvisiblePluginContext) {\n super(context);\n }\n\n /**\n * 挂载 WindowManager\n * @deprecated\n */\n public static async mount(\n room: Room,\n container: HTMLElement,\n collectorContainer?: HTMLElement,\n options?: {\n chessboard: boolean;\n containerSizeRatio: number;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n debug?: boolean;\n overwriteStyles?: string;\n }\n ): Promise<WindowManager>;\n\n public static async mount(params: MountParams): Promise<WindowManager>;\n\n public static async mount(\n params: MountParams | Room,\n container?: HTMLElement,\n collectorContainer?: HTMLElement,\n options?: {\n chessboard?: boolean;\n containerSizeRatio: number;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n debug?: boolean;\n overwriteStyles?: string;\n }\n ): Promise<WindowManager> {\n let room: Room;\n let containerSizeRatio: number | undefined;\n let collectorStyles: Partial<CSSStyleDeclaration> | undefined;\n let debug: boolean | undefined;\n let chessboard = true;\n let overwriteStyles: string | undefined;\n let cursor: boolean | undefined;\n if (\"room\" in params) {\n room = params.room;\n container = params.container;\n collectorContainer = params.collectorContainer;\n containerSizeRatio = params.containerSizeRatio;\n collectorStyles = params.collectorStyles;\n debug = params.debug;\n if (params.chessboard != null) {\n chessboard = params.chessboard;\n }\n overwriteStyles = params.overwriteStyles;\n cursor = params.cursor;\n } else {\n room = params;\n containerSizeRatio = options?.containerSizeRatio;\n collectorStyles = options?.collectorStyles;\n debug = options?.debug;\n if (options?.chessboard != null) {\n chessboard = options.chessboard;\n }\n overwriteStyles = options?.overwriteStyles;\n }\n\n this.checkVersion();\n if (room.phase !== RoomPhase.Connected) {\n throw new Error(\"[WindowManager]: Room only Connected can be mount\");\n }\n if (!container) {\n throw new Error(\"[WindowManager]: Container must provide\");\n }\n if (WindowManager.isCreated) {\n throw new Error(\"[WindowManager]: Already created cannot be created again\");\n }\n const manager = await this.initManager(room);\n this.debug = Boolean(debug);\n if (this.debug) {\n setOptions({ verbose: true });\n }\n log(\"[WindowManager]: Already insert room\", manager);\n if (containerSizeRatio) {\n WindowManager.containerSizeRatio = containerSizeRatio;\n }\n WindowManager.container = container;\n const { playground, wrapper, sizer, mainViewElement } = setupWrapper(container);\n WindowManager.playground = playground;\n if (chessboard) {\n sizer.classList.add(\"netless-window-manager-chess-sizer\");\n }\n if (overwriteStyles) {\n const style = document.createElement(\"style\");\n style.textContent = overwriteStyles;\n playground.appendChild(style);\n }\n await manager.ensureAttributes();\n manager.appManager = new AppManager(manager, {\n collectorContainer: collectorContainer,\n collectorStyles: collectorStyles,\n });\n manager.observePlaygroundSize(playground, sizer, wrapper);\n if (cursor) {\n manager.cursorManager = new CursorManager(manager, manager.appManager);\n }\n manager.bindMainView(mainViewElement);\n replaceRoomFunction(room, manager.appManager);\n emitter.emit(\"onCreated\");\n WindowManager.isCreated = true;\n try {\n await initDb();\n } catch (error) {\n console.warn(\"[WindowManager]: indexedDB open failed\");\n console.log(error);\n }\n return manager;\n }\n\n private static async initManager(room: Room): Promise<WindowManager> {\n let manager = room.getInvisiblePlugin(WindowManager.kind) as WindowManager;\n if (!manager) {\n if (isRoom(room)) {\n if (room.isWritable === false) {\n try {\n await room.setWritable(true);\n } catch (error) {\n throw new Error(\"[WindowManger]: room must be switched to be writable\");\n }\n manager = (await room.createInvisiblePlugin(WindowManager, {})) as WindowManager;\n await room.setWritable(false);\n } else {\n manager = (await room.createInvisiblePlugin(WindowManager, {})) as WindowManager;\n }\n }\n }\n return manager;\n }\n\n /**\n * 注册插件\n */\n public static register<AppOptions = any, SetupResult = any, Attributes = any>(\n params: RegisterParams<AppOptions, SetupResult, Attributes>\n ): Promise<void> {\n return appRegister.register(params);\n }\n\n /**\n * 创建 main View\n */\n public createMainView(): View {\n if (this.appManager) {\n return this.appManager.viewManager.mainView;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n /**\n * 创建一个 app 至白板\n */\n public async addApp(params: AddAppParams): Promise<string | undefined> {\n if (this.appManager) {\n if (!params.kind || typeof params.kind !== \"string\") {\n throw new ParamsInvalidError();\n }\n const appImpl = await appRegister.appClasses.get(params.kind)?.();\n if (appImpl && appImpl.config?.singleton) {\n if (this.appManager.appProxies.has(params.kind)) {\n throw new AppCreateError();\n }\n }\n const isDynamicPPT = this.setupScenePath(params, this.appManager);\n if (isDynamicPPT === undefined) {\n return;\n }\n const appId = await this.appManager.addApp(params, Boolean(isDynamicPPT));\n return appId;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n private setupScenePath(params: AddAppParams, appManager: AppManager): boolean | undefined {\n let isDynamicPPT = false;\n if (params.options) {\n const { scenePath, scenes } = params.options;\n if (scenePath) {\n for (const appId in this.apps) {\n const appScenePath = appManager.delegate.getAppScenePath(appId);\n if (appScenePath && appScenePath === scenePath) {\n console.warn(`ScenePath ${scenePath} Already opened`);\n return;\n }\n }\n }\n if (scenePath && scenes && scenes.length > 0) {\n if (this.isDynamicPPT(scenes)) {\n isDynamicPPT = true;\n if (!this.displayer.entireScenes()[scenePath]) {\n this.room?.putScenes(scenePath, scenes);\n }\n } else {\n if (!this.displayer.entireScenes()[scenePath]) {\n this.room?.putScenes(scenePath, [{ name: scenes[0].name }]);\n }\n }\n }\n }\n return isDynamicPPT;\n }\n\n /**\n * 关闭 APP\n */\n public async closeApp(appId: string): Promise<void> {\n return this.appManager?.closeApp(appId);\n }\n\n /**\n * 设置 mainView 的 ScenePath, 并且切换白板为可写状态\n */\n public setMainViewScenePath(scenePath: string): void {\n if (this.appManager) {\n this.appManager.setMainViewScenePath(scenePath);\n }\n }\n\n /**\n * 设置 mainView 的 SceneIndex, 并且切换白板为可写状态\n */\n public setMainViewSceneIndex(index: number): void {\n if (this.appManager) {\n this.appManager.setMainViewSceneIndex(index);\n }\n }\n\n /**\n * 返回 mainView 的 ScenePath\n */\n public getMainViewScenePath(): string {\n return this.appManager?.delegate.getMainViewScenePath();\n }\n\n /**\n * 返回 mainView 的 SceneIndex\n */\n public getMainViewSceneIndex(): number {\n return this.appManager?.delegate.getMainViewSceneIndex();\n }\n\n /**\n * 设置所有 app 的 readonly 模式\n */\n public setReadonly(readonly: boolean): void {\n if (this.room?.isWritable) {\n this.readonly = readonly;\n this.appManager?.boxManager.teleBoxManager.setReadonly(readonly);\n }\n }\n\n /**\n * 切换 mainView 为可写\n */\n public switchMainViewToWriter(): Promise<void> | undefined {\n return this.appManager?.viewManager.mainViewClickHandler();\n }\n\n /**\n * app destroy 回调\n */\n public onAppDestroy(kind: string, listener: (error: Error) => void): void {\n emitter.once(`destroy-${kind}`).then(listener);\n }\n\n /**\n * 设置 ViewMode\n */\n public setViewMode(mode: ViewMode): void {\n if (mode === ViewMode.Broadcaster) {\n this.appManager?.delegate.setBroadcaster(this.displayer.observerId);\n this.appManager?.delegate.setMainViewCamera(this.mainView.camera);\n this.appManager?.delegate.setMainViewSize(this.mainView.size);\n }\n if (mode === ViewMode.Freedom) {\n this.appManager?.delegate.setMainViewCamera(undefined);\n this.appManager?.delegate.setMainViewSize(undefined);\n this.appManager?.delegate.setBroadcaster(undefined);\n }\n }\n\n public get mainView(): View {\n if (this.appManager) {\n return this.appManager.viewManager.mainView;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n public get camera(): Camera {\n if (this.appManager) {\n return this.appManager.viewManager.mainView.camera;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n public get apps(): Apps | undefined {\n return this.appManager?.delegate.apps();\n }\n\n public get boxState(): string {\n if (this.appManager) {\n return this.appManager.boxManager.teleBoxManager.state;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n public override onDestroy(): void {\n this._destroy();\n }\n\n public override destroy(): void {\n this._destroy();\n }\n\n private _destroy() {\n this.containerResizeObserver?.disconnect();\n this.appManager?.destroy();\n this.cursorManager?.destroy();\n WindowManager.container = undefined;\n WindowManager.wrapper = undefined;\n WindowManager.isCreated = false;\n if (WindowManager.playground) {\n WindowManager.playground.parentNode?.removeChild(WindowManager.playground);\n }\n log(\"Destroyed\");\n }\n\n private bindMainView(divElement: HTMLDivElement) {\n if (this.appManager) {\n const mainView = this.appManager.viewManager.mainView;\n mainView.divElement = divElement;\n mainView.mode = ViewVisionMode.Writable;\n if (!mainView.focusScenePath) {\n this.appManager.delegate.setMainViewFocusPath();\n }\n if (!this.appManager.delegate.getMainViewScenePath()) {\n const sceneState = this.displayer.state.sceneState;\n this.appManager.delegate.setMainViewScenePath(sceneState.scenePath);\n this.appManager.delegate.setMainViewSceneIndex(sceneState.index);\n }\n\n if (\n this.appManager.delegate.focus === undefined &&\n mainView.mode !== ViewVisionMode.Writable\n ) {\n this.appManager.viewManager.freedomAllViews();\n this.appManager.viewManager.switchMainViewToWriter();\n }\n this.appManager.viewManager.addMainViewListener();\n }\n }\n\n public get canOperate(): boolean {\n if (isRoom(this.displayer)) {\n return (\n (this.displayer as Room).isWritable &&\n (this.displayer as Room).phase === RoomPhase.Connected\n );\n } else {\n return false;\n }\n }\n\n public get room(): Room | undefined {\n return this.canOperate ? (this.displayer as Room) : undefined;\n }\n\n public get broadcaster(): number | undefined {\n return this.appManager?.delegate.broadcaster;\n }\n\n public safeSetAttributes(attributes: any): void {\n if (this.canOperate) {\n this.setAttributes(attributes);\n }\n }\n\n public safeUpdateAttributes(keys: string[], value: any): void {\n if (this.canOperate) {\n this.updateAttributes(keys, value);\n }\n }\n\n private safeDispatchMagixEvent(event: string, payload: any) {\n if (this.canOperate) {\n (this.displayer as Room).dispatchMagixEvent(event, payload);\n }\n }\n\n private getSceneName(scenePath: string, index?: number) {\n const scenes = this.displayer.entireScenes()[scenePath];\n if (scenes && index !== undefined) {\n return scenes[index]?.name;\n }\n }\n\n private isDynamicPPT(scenes: SceneDefinition[]) {\n const sceneSrc = scenes[0]?.ppt?.src;\n return sceneSrc?.startsWith(\"pptx://\");\n }\n\n private static checkVersion() {\n const version = getVersionNumber(WhiteVersion);\n if (version < getVersionNumber(REQUIRE_VERSION)) {\n throw new WhiteWebSDKInvalidError(REQUIRE_VERSION);\n }\n }\n\n private async ensureAttributes() {\n if (isNull(this.attributes)) {\n await wait(50);\n }\n if (isObject(this.attributes)) {\n if (!this.attributes[Fields.Apps]) {\n this.safeSetAttributes({ [Fields.Apps]: {} });\n }\n if (!this.attributes[Fields.Cursors]) {\n this.safeSetAttributes({ [Fields.Cursors]: {} });\n }\n }\n }\n\n private containerResizeObserver?: ResizeObserver;\n\n private observePlaygroundSize(\n container: HTMLElement,\n sizer: HTMLElement,\n wrapper: HTMLDivElement\n ) {\n this.updateSizer(container.getBoundingClientRect(), sizer, wrapper);\n\n this.containerResizeObserver = new ResizeObserver(entries => {\n const containerRect = entries[0]?.contentRect;\n if (containerRect) {\n this.updateSizer(containerRect, sizer, wrapper);\n this.cursorManager?.updateContainerRect();\n }\n });\n\n this.containerResizeObserver.observe(container);\n }\n\n private updateSizer(\n { width, height }: DOMRectReadOnly,\n sizer: HTMLElement,\n wrapper: HTMLDivElement\n ) {\n if (width && height) {\n if (height / width > WindowManager.containerSizeRatio) {\n height = width * WindowManager.containerSizeRatio;\n sizer.classList.toggle(\"netless-window-manager-sizer-horizontal\", true);\n } else {\n width = height / WindowManager.containerSizeRatio;\n sizer.classList.toggle(\"netless-window-manager-sizer-horizontal\", false);\n }\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n }\n }\n}\n\nWindowManager.register({\n kind: AppDocsViewer.kind,\n src: AppDocsViewer,\n});\nWindowManager.register({\n kind: AppMediaPlayer.kind,\n src: AppMediaPlayer,\n});\n\nexport const BuiltinApps = {\n DocsViewer: AppDocsViewer.kind as string,\n MediaPlayer: AppMediaPlayer.kind as string,\n};\n\nexport * from \"./typings\";\n","import type { Camera, Room } from \"white-web-sdk\";\nimport type { AppManager } from \"../AppManager\";\n\n// 修改多窗口状态下一些失效的方法实现到 manager 的 mainview 上, 降低迁移成本\nexport const replaceRoomFunction = (room: Room, manager: AppManager) => {\n const descriptor = Object.getOwnPropertyDescriptor(room, \"disableCameraTransform\");\n if (descriptor) return;\n Object.defineProperty(room, \"disableCameraTransform\", {\n get() {\n return manager.mainView.disableCameraTransform;\n },\n set(disable: boolean) {\n manager.mainView.disableCameraTransform = disable;\n },\n });\n\n room.moveCamera = (camera: Camera) => manager.mainView.moveCamera(camera);\n room.moveCameraToContain = (...args) => manager.mainView.moveCameraToContain(...args);\n room.convertToPointInWorld = (...args) => manager.mainView.convertToPointInWorld(...args);\n room.setCameraBound = (...args) => manager.mainView.setCameraBound(...args);\n};\n"],"names":["Events","Events2","Error","constructor","version","AppAttributes","AppAttributes2","AppEvents","AppEvents2","AppStatus","CursorState","CursorState2","MIN_WIDTH","MIN_HEIGHT","DEFAULT_COLLECTOR_STYLE","right","bottom","position","manager","windowManager","viewManager","appProxies","this","displayer","boxManager","event","authorId","observerId","data","payload","eventName","AppMove","appMoveHandler","AppFocus","appFocusHandler","AppResize","appResizeHandler","AppBlur","appBlurHandler","AppBoxStateChange","appBoxStateHandler","AppSnapshot","appSnapshotHandler","AppClose","appCloseHandler","MainViewFocus","mainViewFocusHandler","SwitchViewsToFreedom","switchViewsToFreedomHandler","moveBox","focusBox","refreshViews","resizeBox","Object","assign","skipUpdate","room","refreshViewSize","proxy","get","appId","appEmitter","emit","view","mode","ViewVisionMode","Writable","setBoxState","state","TELE_BOX_STATE","Minimized","switchMainViewToWriter","box","getBox","setSnapshot","rect","closeBox","appProxy","destroy","blurFocusBox","freedomAllViews","addListeners","addMagixEventListener","mainMagixEventListener","removeListeners","removeMagixEventListener","db","store","initDb","async","Promise","resolve","reject","request","indexedDB","open","onerror","e","onupgradeneeded","db2","target","result","objectStoreNames","contains","createObjectStore","keyPath","createIndex","unique","onsuccess","setItem","key","val","kind","sourceCode","transaction","objectStore","add","getItem","index","getScript","url","item","resource","options","timeout","controller","AbortController","id","setTimeout","abort","response","fetch","__spreadProps","signal","headers","fetchWithTimeout","text2","text","executeScript","appName","Function","window","appRegister","Map","params","registered","set","srcOrAppOrFunction","src","downloadApp","appClass","name","error","message","includes","define","amd","loadApp","appClasses","app","appClassesCache","addHooks","emitter2","createKindEmitter","kindEmitters","has","Emittery","setViewFocusScenePath","focusScenePath","setScenePath","scenePath","sceneState","setViewMode","notifyMainViewModeChange","debounce","callbacks2","getVersionNumber","versionString","split","map","s","padStart","join","parseInt","wait","time","setScenes","appOptions","autorun","reaction","listenUpdated","unlistenUpdated","listenDisposed","unlistenDisposed","delegate","emitter","isAddApp","getDisplayer","getAttributes","attributes","getScenes","appAttr","getAppAttributes","isDynamicPPT","scenes","getView","getInitScenePath","getAppInitPath","getIsWritable","canOperate","BoxNotCreatedError","getRoom","setAttributes","safeSetAttributes","updateAttributes","keys","value","safeUpdateAttributes","focus","mountView","dom","divElement","getAppOptions","log","args","WindowManager","debug","attrs","getAppState","Position","size","Size","snapshotRect","SnapshotRect","sceneIndex","SceneIndex","boxState","x","y","width","height","InitReplay","appId2","disposer","windowManger","camera","cameraStore","setCamera","appListener","makeAppEventListener","attr2","entireScenes","createView","addCameraListener","getAppSceneIndex","setSceneIndex","updateAppState","readonly","getSceneName","getFullScenePath","appImpl","appParams","setupApp","updateManagerRect","switchAppToWriter","setMainViewFocusPath","context","AppContext","once","WindowCreated","then","boxInitState","getAppInitState","updateBoxState","onAny","appAttributesUpdateListener","setup","notifyApp","setBoxInitState","createBox","switchToWritable","mainView","callbacks","Freedom","emitAppSceneStateChange","emitAppIsWritableChange","isWritable","setBoxMinSize","minWidth","minwidth","minHeight","minheight","setBoxTitle","title","status","recoverCamera","fullScenePath","switchToFreedom","fullPath","on","cameraListener","removeCameraListener","off","needCloseBox","cleanAttrs","clearListeners","cleanAppAttributes","delete","deleteCamera","destroyView","appStatus","Fields","Fields2","apps","Apps","Focus","Broadcaster","State","setupAppAttributes","attrNames","push","pick","stateName","cleanFocus","cleanAttributes","BoxState","_mainScenePath","_mainSceneIndex","getAppScenePath","getMainViewScenePath","getMainViewSceneIndex","getBoxState","setMainViewScenePath","setMainViewSceneIndex","getMainViewCamera","MainViewCamera","getMainViewSize","MainViewSize","setMainViewCamera","__spreadValues","setMainViewSize","setBroadcaster","setAppFocus","updateCursor","Cursors","updateCursorState","cursorState","getCursorState","cleanCursor","collectorConfig","teleBoxManager","setupBoxManager","events","TELE_BOX_MANAGER_EVENT","forEach","updateBox","rectSnapshot","config","containerRect","createBoxConfig","create","appState","isEmpty","queryOne","Maximized","root","wrapper","document","body","getBoundingClientRect","initManagerState","fence","container","collectorContainer","styles","collectorStyles","teleBoxCollector","TeleBoxCollector","mount","collector","TeleBoxManager","remove","update","boxIsFocus","getFocusBox","query","getTopBox","boxes","maxBy","setState","setContainerRect","blurAllBox","updateAll","focusBoxes","length","cameras","getCamera","moveCamera","animationMode","AnimationMode","Immediately","disposers","broadcaster","fireImmediately","moveCameraToContian","isEqual","moveCameraToContain","originX","originY","scale","centerX","centerY","needScale","mainViewClickHandler","createMainView","addMainViewCameraListener","views","switchMainViewModeToWriter","releaseView","didRelease","release","mainViewCameraListener","removeMainViewCameraListener","switchMainViewToFreedom","addMainViewListener","mainViewIsAddListener","addEventListener","mainViewClickListener","removeMainViewListener","removeEventListener","dispatchInternalEvent","timer","mainViewScenePath","setMainViewFocusScenePath","parentNode","removeChild","onObjectInserted","object","func","listener","UpdateEventKind","Inserted","AttributesDelegate","startsWith","roomMembers","cursorManager","setRoomMembers","cleanMemberAttributes","isReadonly","isManualWritable","setReadonly","safeDispatchMagixEvent","topBox","Normal","CameraStore","ViewManager","BoxManager","appListeners","AppListeners","displayerStateListener","displayerWritableListener","mainViewProxy","MainViewProxy","attributesUpdateCallback","boxEventListener","reactionDisposers","mainScenePath","baseInsertApp","focusByAttributes","needFocus","beforeAddApp","afterAddApp","impl","singleton","v4","replace","slice","genAppId","StartCreate","warn","AppProxy","isRoom","scenePathType","ScenePathType","None","Page","_setMainViewScenePath","Dir","validScenePath","firstSceneName","makeValidScenePath","dispatchMagixEvent","appBoxMap","focusAppId","offAny","fn","fns","run","thing","a","b","src_url_equal_anchor","current_component","element_src","createElement","href","node","appendChild","anchor","insertBefore","createTextNode","attribute","removeAttribute","getAttribute","setAttribute","wholeText","important","style","setProperty","component","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","update_scheduled","flushing","seen_callbacks","Set","i","$$","pop","callback","clear","fragment","before_update","dirty","p","ctx","after_update","add_render_callback","outroing","flush","fill","instance2","create_fragment2","not_equal","props","append_styles","parent_component","noop","bound","blank_object","on_mount","on_destroy","on_disconnect","skip_bound","ready","ret","rest","hydrate","nodes","element2","Array","from","childNodes","l","detach","c","intro","block","local","customElement","m","new_on_destroy","filter","is_function","cursorName","tagName","backgroundColor","appliance","visible","avatar","theme","color","cursorTagBackgroundColor","opacity","hasTagName","hasAvatar","display","entries","hasName","v","$destroy","detaching","d","$on","type","indexOf","splice","$set","$$props","obj","$$set","ApplianceMap","ApplianceNames","pencil","selector","eraser","shape","cursors","memberId","setMember","createCursor","cursorPosition","startReaction","retries","autoHidden","cursor","wrapperRect","translateX","translateY","Leave","hide","member","memberState","currentApplianceName","strokeColor","cursorTextColor","memberColor","memberCursorName","memberAvatar","App","initProps","memberApplianceName","getIcon","memberTheme","memberCursorTextColor","memberCursorTagBackgroundColor","memberOpacity","find","Number","omit","cursorInstances","appManager","clientX","clientY","touches","touchEvent","hideCursor","mouseMoveListener","touchMoveListener","mouseLeaveListener","initCursorAttributes","handleRoomMembersChange","memberIds","Cursor","String","getBoxTitleHeight","$titleBar","clientHeight","updateContainerRect","members","cleanMemberCursor","needDeleteIds","findIndex","ResizeObserver","ResizeObserverPolyfill","InvisiblePlugin","containerSizeRatio","overwriteStyles","chessboard","checkVersion","phase","RoomPhase","Connected","_WindowManager","isCreated","initManager","Boolean","verbose","playground","sizer","mainViewElement","className","setupWrapper","classList","style2","textContent","ensureAttributes","AppManager","observePlaygroundSize","CursorManager","bindMainView","getOwnPropertyDescriptor","defineProperty","disableCameraTransform","disable","convertToPointInWorld","setCameraBound","getInvisiblePlugin","setWritable","createInvisiblePlugin","register","AppManagerNotInitError","ParamsInvalidError","AppCreateError","setupScenePath","addApp","appScenePath","putScenes","closeApp","onAppDestroy","ViewMode","onDestroy","_destroy","containerResizeObserver","disconnect","sceneSrc","ppt","WhiteVersion","WhiteWebSDKInvalidError","isNull","isObject","updateSizer","contentRect","observe","toggle","AppDocsViewer","AppMediaPlayer","BuiltinApps","DocsViewer","MediaPlayer"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/constants.ts","../src/Utils/error.ts","../src/AppListener.ts","../src/Register/storage.ts","../src/Register/loader.ts","../src/Register/index.ts","../src/Utils/Common.ts","../src/AppContext.ts","../src/Utils/log.ts","../src/AppProxy.ts","../src/AttributesDelegate.ts","../src/BoxManager.ts","../src/Utils/CameraStore.ts","../src/MainView.ts","../src/ViewManager.ts","../src/Utils/Reactive.ts","../src/AppManager.ts","../node_modules/svelte/internal/index.mjs","../src/Cursor/Cursor.svelte","../src/Cursor/icons.ts","../src/image/pencil-cursor.png","../src/image/selector-cursor.png","../src/image/eraser-cursor.png","../src/image/shape-cursor.svg","../src/image/text-cursor.svg","../src/Cursor/Cursor.ts","../src/Cursor/index.ts","../src/index.ts","../src/Utils/RoomHacker.ts"],"sourcesContent":["export enum Events {\n AppMove = \"AppMove\",\n AppFocus = \"AppFocus\",\n AppResize = \"AppResize\",\n AppBlur = \"AppBlur\",\n AppBoxStateChange = \"AppBoxStateChange\",\n AppSnapshot = \"AppSnapshot\",\n AppClose = \"AppClose\",\n GetAttributes = \"GetAttributes\",\n UpdateWindowManagerWrapper = \"UpdateWindowManagerWrapper\",\n InitReplay = \"InitReplay\",\n WindowCreated = \"WindowCreated\",\n SetMainViewScenePath = \"SetMainViewScenePath\",\n SetMainViewSceneIndex = \"SetMainViewSceneIndex\",\n MainViewFocus = \"MainViewFocus\",\n SwitchViewsToFreedom = \"SwitchViewsToFreedom\",\n}\n\nexport const MagixEventName = \"__WindowManger\";\n\nexport enum AppAttributes {\n Size = \"size\",\n Position = \"position\",\n SnapshotRect = \"SnapshotRect\",\n SceneIndex = \"SceneIndex\",\n}\n\nexport enum AppEvents {\n setBoxSize = \"setBoxSize\",\n setBoxMinSize = \"setBoxMinSize\",\n destroy = \"destroy\",\n}\n\nexport enum AppStatus {\n StartCreate = \"StartCreate\",\n}\n\nexport enum CursorState {\n Leave = \"leave\",\n Normal = \"normal\",\n}\n\nexport const REQUIRE_VERSION = \"2.13.16\";\n\nexport const MIN_WIDTH = 340 / 720;\nexport const MIN_HEIGHT = 340 / 720;\n\nexport const SET_SCENEPATH_DELAY = 100; // 设置 scenePath 的延迟事件\n\nexport const DEFAULT_COLLECTOR_STYLE = { right: \"10px\", bottom: \"15px\", position: \"absolute\" };\n\nexport const DEFAULT_CONTAINER_RATIO = 9 / 16;\n","export class AppCreateError extends Error {\n override message = \"[WindowManager]: app duplicate exists and cannot be created again\";\n}\n\nexport class AppNotRegisterError extends Error {\n constructor(kind: string) {\n super(`[WindowManager]: app ${kind} need register or provide src`);\n }\n}\n\nexport class AppManagerNotInitError extends Error {\n override message = \"[WindowManager]: AppManager must be initialized\";\n}\n\nexport class WhiteWebSDKInvalidError extends Error {\n constructor(version: string) {\n super(`[WindowManager]: white-web-sdk version must large than ${version}`);\n }\n}\n\nexport class ParamsInvalidError extends Error {\n override message = \"[WindowManager]: kind must be a valid string\";\n}\n\nexport class BoxNotCreatedError extends Error {\n override message = \"[WindowManager]: box need created\";\n}\n","import { Events, MagixEventName } from \"./constants\";\nimport { TELE_BOX_STATE } from \"@netless/telebox-insider\";\nimport { ViewVisionMode } from \"white-web-sdk\";\nimport type { Event } from \"white-web-sdk\";\nimport type { TeleBox } from \"@netless/telebox-insider\";\nimport type { ViewManager } from \"./ViewManager\";\nimport type { AppProxy } from \"./AppProxy\";\nimport type { AppManager } from \"./AppManager\";\nimport type { WindowManager } from \"./index\";\n\nexport class AppListeners {\n private displayer = this.manager.displayer;\n private boxManager = this.manager.boxManager;\n\n constructor(\n private manager: AppManager,\n private windowManager: WindowManager,\n private viewManager: ViewManager,\n private appProxies: Map<string, AppProxy>\n ) {}\n\n public addListeners() {\n this.displayer.addMagixEventListener(MagixEventName, this.mainMagixEventListener);\n }\n\n public removeListeners() {\n this.displayer.removeMagixEventListener(MagixEventName, this.mainMagixEventListener);\n }\n\n private mainMagixEventListener = (event: Event) => {\n if (event.authorId !== this.displayer.observerId) {\n const data = event.payload;\n switch (data.eventName) {\n case Events.AppMove: {\n this.appMoveHandler(data.payload);\n break;\n }\n case Events.AppFocus: {\n this.appFocusHandler(data.payload);\n break;\n }\n case Events.AppResize: {\n this.appResizeHandler(data.payload);\n break;\n }\n case Events.AppBlur: {\n this.appBlurHandler(data.payload);\n break;\n }\n case Events.AppBoxStateChange: {\n this.appBoxStateHandler(data.payload);\n break;\n }\n case Events.AppSnapshot: {\n this.appSnapshotHandler(data.payload);\n break;\n }\n case Events.AppClose: {\n this.appCloseHandler(data.payload);\n break;\n }\n case Events.MainViewFocus: {\n this.mainViewFocusHandler();\n break;\n }\n case Events.SwitchViewsToFreedom: {\n this.switchViewsToFreedomHandler();\n break;\n }\n default:\n break;\n }\n }\n };\n\n private appMoveHandler = (payload: any) => {\n this.boxManager.moveBox(payload);\n };\n\n private appFocusHandler = (payload: any) => {\n this.boxManager.focusBox(payload);\n this.manager.viewManager.refreshViews();\n };\n\n private appResizeHandler = (payload: any) => {\n this.boxManager.resizeBox(Object.assign(payload, { skipUpdate: true }));\n this.manager.room?.refreshViewSize();\n };\n\n private appBlurHandler = (payload: any) => {\n const proxy = this.appProxies.get(payload.appId);\n if (proxy) {\n proxy.appEmitter.emit(\"writableChange\", false);\n if (proxy.view?.mode === ViewVisionMode.Writable) {\n this.manager.viewManager.refreshViews();\n }\n }\n };\n\n private appBoxStateHandler = (payload: any) => {\n this.boxManager.setBoxState(payload.state);\n if (payload.state === TELE_BOX_STATE.Minimized) {\n this.manager.viewManager.refreshViews();\n this.viewManager.switchMainViewToWriter();\n }\n };\n\n private appSnapshotHandler = (payload: any) => {\n const box = this.boxManager.getBox(payload.appId) as TeleBox;\n if (box) {\n box.setSnapshot(payload.rect);\n }\n };\n\n private appCloseHandler = (payload: any) => {\n this.boxManager.closeBox(payload.appId);\n const appProxy = this.manager.appProxies.get(payload.appId);\n if (appProxy) {\n appProxy.destroy(true, true);\n }\n };\n\n private mainViewFocusHandler = () => {\n this.manager.boxManager.blurFocusBox();\n this.manager.viewManager.freedomAllViews();\n };\n\n private switchViewsToFreedomHandler = () => {\n this.manager.viewManager.freedomAllViews();\n };\n}\n","const DatabaseName = \"__WindowManagerAppCache\";\n\nlet db: IDBDatabase;\nlet store: IDBObjectStore;\n\nexport const initDb = async () => {\n db = await createDb();\n}\n\nexport const setItem = (key: string, val: any) => {\n if (!db) return;\n return addRecord(db, { kind: key, sourceCode: val })\n};\n\nexport const getItem = async (key: string): Promise<string | null> => {\n if (!db) return null;\n return await query(db, key);\n};\n\nexport const removeItem = (key: string) => {\n if (!db) return;\n return deleteRecord(db, key);\n};\n\nfunction createDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DatabaseName, 2);\n request.onerror = (e) => {\n reject(e);\n }\n\n request.onupgradeneeded = (event: any) => {\n const db = event.target.result as IDBDatabase;\n if (!db.objectStoreNames.contains(\"apps\")) {\n store = db.createObjectStore(\"apps\", { keyPath: \"kind\" });\n store.createIndex(\"kind\", \"kind\", { unique: true });\n }\n }\n\n request.onsuccess = () => {\n const db = request.result;\n resolve(db);\n }\n })\n}\n\nfunction query<T>(db: IDBDatabase, val: string): Promise<T | null> {\n return new Promise((resolve, reject) => {\n const index = db.transaction([\"apps\"]).objectStore(\"apps\").index(\"kind\");\n const request = index.get(val);\n request.onerror = (e) => reject(e);\n request.onsuccess = () => {\n if (request.result) {\n resolve(request.result);\n } else {\n resolve(null);\n }\n }\n })\n}\n\nfunction addRecord(db: IDBDatabase, payload: any): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = db.transaction([\"apps\"], \"readwrite\").objectStore(\"apps\").add(payload);\n request.onsuccess = () => resolve();\n request.onerror = () => reject();\n })\n}\n\nfunction deleteRecord(db: IDBDatabase, key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = db.transaction([\"apps\"], \"readwrite\").objectStore(\"apps\").delete(key);\n request.onsuccess = () => resolve();\n request.onerror = () => reject();\n })\n}\n","import { getItem, setItem } from \"./storage\";\nimport type { NetlessApp } from \"../typings\";\n\nconst Prefix = \"NetlessApp\";\n\nconst TIMEOUT = 10000; // 10 秒超时\n\nexport const getScript = async (url: string): Promise<string> => {\n const item = await getItem(url);\n if (item) {\n return item;\n } else {\n const result = await fetchWithTimeout(url, { timeout: TIMEOUT });\n const text = await result.text();\n await setItem(url, text);\n return text;\n }\n};\n\nexport const executeScript = (text: string, appName: string): NetlessApp => {\n let result = Function(text + `;return ${appName}`)();\n if (typeof result === \"undefined\") {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n result = window[appName];\n }\n return result;\n};\n\nexport const loadApp = async (\n url: string,\n key: string,\n name?: string\n): Promise<NetlessApp | undefined> => {\n const appName = name || Prefix + key;\n const text = await getScript(url);\n try {\n return executeScript(text, appName);\n } catch (error: any) {\n if (error.message.includes(\"Can only have one anonymous define call per script file\")) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const define = window.define;\n if (\"function\" == typeof define && define.amd) {\n delete define.amd;\n }\n return executeScript(text, appName);\n }\n }\n};\n\nasync function fetchWithTimeout(resource: string, options: RequestInit & { timeout: number }) {\n const { timeout = 10000 } = options;\n\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(resource, {\n ...options,\n signal: controller.signal,\n headers: {\n \"content-type\": \"text/plain\",\n },\n });\n clearTimeout(id);\n\n return response;\n}\n","import Emittery from \"emittery\";\nimport type { NetlessApp, RegisterEvents, RegisterParams } from \"../typings\";\nimport { loadApp } from \"./loader\";\n\nclass AppRegister {\n public kindEmitters: Map<string, Emittery<RegisterEvents>> = new Map();\n public registered: Map<string, RegisterParams> = new Map();\n public appClassesCache: Map<string, Promise<NetlessApp>> = new Map();\n public appClasses: Map<string, () => Promise<NetlessApp>> = new Map();\n\n public async register(params: RegisterParams): Promise<void> {\n this.registered.set(params.kind, params);\n \n const srcOrAppOrFunction = params.src\n let downloadApp: () => Promise<NetlessApp>\n \n if (typeof srcOrAppOrFunction === \"string\") {\n downloadApp = async () => {\n const appClass = await loadApp(srcOrAppOrFunction, params.kind);\n if (appClass) {\n return appClass\n } else {\n throw new Error(`[WindowManager]: load remote script failed, ${srcOrAppOrFunction}`);\n }\n }\n } else if (typeof srcOrAppOrFunction === \"function\") {\n downloadApp = srcOrAppOrFunction\n } else {\n downloadApp = async () => srcOrAppOrFunction\n }\n\n this.appClasses.set(params.kind, async () => {\n let app = this.appClassesCache.get(params.kind)\n if (!app) {\n app = downloadApp()\n this.appClassesCache.set(params.kind, app)\n }\n return app\n });\n \n if (params.addHooks) {\n const emitter = this.createKindEmitter(params.kind);\n if (emitter) {\n params.addHooks(emitter);\n }\n }\n }\n\n public async notifyApp<T extends keyof RegisterEvents>(kind: string, event: T, payload: RegisterEvents[T]) {\n const emitter = this.kindEmitters.get(kind);\n await emitter?.emit(event, payload);\n }\n\n private createKindEmitter(kind: string) {\n if (!this.kindEmitters.has(kind)) {\n const emitter = new Emittery<RegisterEvents>();\n this.kindEmitters.set(kind, emitter);\n }\n return this.kindEmitters.get(kind);\n }\n}\n\nexport const appRegister = new AppRegister();\n","import { emitter } from \"../index\";\nimport type { PublicEvent } from \"../index\";\nimport { v4 } from \"uuid\";\nimport type { Displayer, ViewVisionMode, Room, View } from \"white-web-sdk\";\nimport { debounce } from \"lodash\";\nimport type Emittery from \"emittery\";\nimport { appRegister } from \"../Register\";\n\nexport const genAppId = async (kind: string) => {\n const impl = await appRegister.appClasses.get(kind)?.();\n if (impl && impl.config?.singleton) {\n return kind;\n }\n return `${kind}-${v4().replace(\"-\", \"\").slice(0, 8)}`;\n};\n\nexport const setViewFocusScenePath = (view: View, focusScenePath: string) => {\n if (view.focusScenePath !== focusScenePath) {\n view.focusScenePath = focusScenePath;\n }\n};\n\nexport const setScenePath = (room: Room | undefined, scenePath: string) => {\n if (room) {\n if (room.state.sceneState.scenePath !== scenePath) {\n room.setScenePath(scenePath);\n }\n }\n};\n\nexport const setViewMode = (view: View, mode: ViewVisionMode) => {\n if (view.mode !== mode) {\n view.mode = mode;\n }\n};\n\nexport const emitError = (error: Error) => {\n if (emitter.listenerCount(\"error\") > 0) {\n emitter.emit(\"error\", error);\n } else {\n console.log(\"[WindowManager]:\", error);\n }\n};\n\nexport const notifyMainViewModeChange = debounce(\n (callbacks: Emittery<PublicEvent>, mode: ViewVisionMode) => {\n callbacks.emit(\"mainViewModeChange\", mode);\n },\n 200\n);\n\nexport const makeValidScenePath = (displayer: Displayer, scenePath: string) => {\n const scenes = displayer.entireScenes()[scenePath];\n const firstSceneName = scenes[0].name;\n if (scenePath === \"/\") {\n return `/${firstSceneName}`;\n } else {\n return `${scenePath}/${firstSceneName}`;\n }\n};\n\nexport const getVersionNumber = (version: string) => {\n const versionString = version.split(\".\").map(s => s.padStart(2, \"0\")).join(\"\");\n return parseInt(versionString);\n};\n\nexport const wait = (time: number) => new Promise((resolve) => setTimeout(resolve, time));\n","import {\n autorun,\n listenDisposed,\n listenUpdated,\n reaction,\n unlistenDisposed,\n unlistenUpdated\n } from 'white-web-sdk';\nimport { BoxNotCreatedError } from './Utils/error';\nimport { wait } from './Utils/Common';\nimport type { Room, SceneDefinition, View } from \"white-web-sdk\";\nimport type { ReadonlyTeleBox } from \"@netless/telebox-insider\";\nimport type Emittery from \"emittery\";\nimport type { BoxManager } from \"./BoxManager\";\nimport type { AppEmitterEvent } from \"./index\";\nimport type { AppManager } from \"./AppManager\";\nimport type { AppProxy } from \"./AppProxy\";\n\nexport class AppContext<TAttrs extends Record<string, any>, AppOptions = any> {\n public readonly emitter: Emittery<AppEmitterEvent<TAttrs>>;\n public readonly mobxUtils = {\n autorun,\n reaction,\n };\n public readonly objectUtils = {\n listenUpdated,\n unlistenUpdated,\n listenDisposed,\n unlistenDisposed\n };\n private boxManager: BoxManager;\n private delegate = this.manager.delegate;\n public readonly isAddApp: boolean;\n\n constructor(\n private manager: AppManager,\n public appId: string,\n private appProxy: AppProxy,\n public setScenes: (scenes: SceneDefinition[]) => void,\n private appOptions?: AppOptions | (() => AppOptions),\n ) {\n this.emitter = appProxy.appEmitter;\n this.boxManager = this.manager.boxManager;\n this.isAddApp = appProxy.isAddApp;\n }\n\n public getDisplayer() {\n return this.manager.displayer;\n }\n\n public getAttributes(): TAttrs | undefined {\n return this.appProxy.attributes;\n }\n\n public getScenes(): SceneDefinition[] | undefined {\n const appAttr = this.delegate.getAppAttributes(this.appId);\n if (appAttr?.isDynamicPPT) {\n const appProxy = this.manager.appProxies.get(this.appId);\n if (appProxy) {\n return appProxy.scenes;\n }\n } else {\n return appAttr?.options[\"scenes\"];\n }\n }\n\n public getView(): View | undefined {\n return this.appProxy.view;\n }\n\n public getInitScenePath() {\n return this.manager.getAppInitPath(this.appId);\n }\n\n public getIsWritable(): boolean {\n return this.manager.canOperate;\n }\n\n public getBox(): ReadonlyTeleBox {\n const box = this.boxManager.getBox(this.appId);\n if (box) {\n return box;\n } else {\n throw new BoxNotCreatedError();\n }\n }\n\n public getRoom(): Room | undefined {\n return this.manager.room;\n }\n\n public setAttributes(attributes: TAttrs) {\n this.manager.safeSetAttributes({ [this.appId]: attributes });\n }\n\n public updateAttributes(keys: string[], value: any) {\n if (this.manager.attributes[this.appId]) {\n this.manager.safeUpdateAttributes([this.appId, ...keys], value);\n }\n }\n\n public async setScenePath(scenePath: string): Promise<void> {\n if (!this.appProxy.box) return;\n if (this.appProxy.box.focus) {\n this.getRoom()?.setScenePath(scenePath);\n } else {\n this.emitter.emit(\"focus\", true);\n await wait(50);\n this.getRoom()?.setScenePath(scenePath);\n }\n }\n\n public mountView(dom: HTMLDivElement): void {\n const view = this.getView();\n if (view) {\n view.divElement = dom;\n setTimeout(() => {\n // 渲染需要时间,延迟 refresh\n this.getRoom()?.refreshViewSize();\n }, 1000);\n }\n }\n\n public getAppOptions(): AppOptions | undefined {\n return typeof this.appOptions === 'function' ? (this.appOptions as () => AppOptions)() : this.appOptions\n }\n}\n","import { WindowManager } from \"../index\";\n\nexport const log = (...args: any[]): void => {\n if (WindowManager.debug) {\n console.log(`[WindowManager]:`, ...args);\n }\n};\n","import Emittery from \"emittery\";\nimport { AppAttributes, AppEvents, Events } from \"./constants\";\nimport { AppContext } from \"./AppContext\";\nimport { appRegister } from \"./Register\";\nimport { autorun, ViewVisionMode } from \"white-web-sdk\";\nimport { log } from \"./Utils/log\";\nimport {\n notifyMainViewModeChange,\n setScenePath,\n setViewFocusScenePath,\n setViewMode,\n} from \"./Utils/Common\";\nimport { callbacks, emitter } from \"./index\";\nimport type {\n AppEmitterEvent,\n AppInitState,\n BaseInsertParams,\n setAppOptions,\n AppListenerKeys,\n} from \"./index\";\nimport type { Camera, SceneDefinition, SceneState, View } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\nimport type { NetlessApp } from \"./typings\";\nimport type { ReadonlyTeleBox } from \"@netless/telebox-insider\";\n\nexport class AppProxy {\n public id: string;\n public scenePath?: string;\n public appEmitter: Emittery<AppEmitterEvent>;\n public scenes?: SceneDefinition[];\n\n private appListener: any;\n private disposer: any;\n private boxManager = this.manager.boxManager;\n private appProxies = this.manager.appProxies;\n private viewManager = this.manager.viewManager;\n private kind: string;\n public isAddApp: boolean;\n private status: \"normal\" | \"destroyed\" = \"normal\";\n\n constructor(\n private params: BaseInsertParams,\n private manager: AppManager,\n appId: string,\n isAddApp: boolean\n ) {\n this.kind = params.kind;\n this.id = appId;\n this.appProxies.set(this.id, this);\n this.appEmitter = new Emittery();\n this.appListener = this.makeAppEventListener(this.id);\n const options = this.params.options;\n if (options) {\n this.scenePath = options.scenePath;\n const attr = this.manager.delegate.getAppAttributes(this.id);\n if (attr?.isDynamicPPT && this.scenePath) {\n this.scenes = this.manager.displayer.entireScenes()[this.scenePath];\n } else {\n this.scenes = options.scenes;\n }\n }\n if (this.params.options?.scenePath) {\n // 只有传入了 scenePath 的 App 才会创建 View\n this.createView();\n this.addCameraListener();\n }\n this.isAddApp = isAddApp;\n }\n\n public get sceneIndex(): number {\n return this.manager.delegate.getAppSceneIndex(this.id);\n }\n\n public setSceneIndex(index: number): void {\n return this.manager.delegate.updateAppState(this.id, AppAttributes.SceneIndex, index);\n }\n\n public get view(): View | undefined {\n return this.manager.viewManager.getView(this.id);\n }\n\n public get isWritable(): boolean {\n return this.manager.canOperate && !this.box?.readonly;\n }\n\n public get attributes() {\n return this.manager.attributes[this.id];\n }\n\n public getSceneName(): string | undefined {\n if (this.sceneIndex !== undefined) {\n return this.scenes?.[this.sceneIndex]?.name;\n }\n }\n\n public getFullScenePath(): string | undefined {\n if (this.scenePath && this.getSceneName()) {\n return `${this.scenePath}/${this.getSceneName()}`;\n }\n }\n\n public setScenes(scenes: SceneDefinition[]): void {\n this.scenes = scenes;\n }\n\n public async baseInsertApp(focus?: boolean): Promise<{ appId: string; app: NetlessApp }> {\n const params = this.params;\n if (params.kind) {\n const appImpl = await appRegister.appClasses.get(params.kind)?.();\n const appParams = appRegister.registered.get(params.kind);\n if (appImpl) {\n await this.setupApp(this.id, appImpl, params.options, appParams?.appOptions);\n } else {\n throw new Error(`[WindowManager]: app load failed ${params.kind} ${params.src}`);\n }\n this.boxManager.updateManagerRect();\n if (focus) {\n this.focusBox();\n this.manager.viewManager.switchAppToWriter(this.id);\n this.manager.delegate.setMainViewFocusPath();\n }\n return {\n appId: this.id,\n app: appImpl,\n };\n } else {\n throw new Error(\"[WindowManager]: kind require\");\n }\n }\n\n public get box(): ReadonlyTeleBox | undefined {\n return this.boxManager.getBox(this.id);\n }\n\n private focusBox() {\n this.boxManager.focusBox({ appId: this.id });\n }\n\n private async setupApp(appId: string, app: NetlessApp, options?: setAppOptions, appOptions?: any) {\n log(\"setupApp\", appId, app, options);\n const context = new AppContext(this.manager, appId, this, this.setScenes, appOptions);\n try {\n emitter.once(`${appId}${Events.WindowCreated}`).then(async () => {\n const boxInitState = this.getAppInitState(appId);\n this.boxManager.updateBoxState(boxInitState);\n this.appEmitter.onAny(this.appListener);\n this.appAttributesUpdateListener(appId);\n this.setViewFocusScenePath();\n setTimeout(async () => {\n // 延迟执行 setup, 防止初始化的属性没有更新成功\n const result = await app.setup(context);\n appRegister.notifyApp(app.kind, \"created\", { appId, result });\n if (boxInitState) {\n if (boxInitState.focus && this.scenePath) {\n this.manager.viewManager.switchAppToWriter(this.id);\n }\n if (!boxInitState?.x || !boxInitState.y || !boxInitState.snapshotRect) {\n this.boxManager.setBoxInitState(appId);\n }\n }\n const box = this.boxManager.getBox(appId);\n if (box) {\n this.boxManager.resizeBox({\n // 兼容移动端创建时会出现 PPT 不适配的问题\n appId,\n width: box.width + 0.001,\n height: box.height + 0.001,\n skipUpdate: true,\n });\n }\n }, 50);\n });\n this.boxManager.createBox({\n appId: appId,\n app,\n options,\n canOperate: this.manager.canOperate,\n });\n } catch (error: any) {\n console.error(error);\n throw new Error(`[WindowManager]: app setup error: ${error.message}`);\n }\n }\n\n public switchToWritable() {\n if (this.view) {\n try {\n if (this.view.mode === ViewVisionMode.Writable) return;\n if (this.manager.mainView.mode === ViewVisionMode.Writable) {\n this.manager.delegate.setMainViewFocusPath();\n notifyMainViewModeChange(callbacks, ViewVisionMode.Freedom);\n setViewMode(this.manager.mainView, ViewVisionMode.Freedom);\n }\n setViewMode(this.view, ViewVisionMode.Writable);\n } catch (error) {\n log(\"switch view failed\", error);\n }\n }\n }\n\n public getAppInitState = (id: string) => {\n const attrs = this.manager.delegate.getAppState(id);\n if (!attrs) return;\n const position = attrs?.[AppAttributes.Position];\n const focus = this.manager.attributes.focus;\n const size = attrs?.[AppAttributes.Size];\n const snapshotRect = attrs?.[AppAttributes.SnapshotRect];\n const sceneIndex = attrs?.[AppAttributes.SceneIndex];\n const boxState = this.manager.attributes[\"boxState\"];\n let payload = { boxState } as AppInitState;\n if (position) {\n payload = { ...payload, id: id, x: position.x, y: position.y };\n }\n if (focus === id) {\n payload = { ...payload, focus: true };\n }\n if (size) {\n payload = { ...payload, width: size.width, height: size.height };\n }\n if (snapshotRect) {\n payload = { ...payload, snapshotRect };\n }\n if (sceneIndex) {\n payload = { ...payload, sceneIndex };\n }\n emitter.emit(Events.InitReplay, payload);\n return payload;\n };\n\n public emitAppSceneStateChange(sceneState: SceneState) {\n this.appEmitter.emit(\"sceneStateChange\", sceneState);\n }\n\n public emitAppIsWritableChange() {\n this.appEmitter.emit(\"writableChange\", this.isWritable);\n }\n\n private makeAppEventListener(appId: string) {\n return (eventName: AppListenerKeys, data: any) => {\n if (!this.manager.canOperate) return;\n switch (eventName) {\n case \"setBoxSize\": {\n this.boxManager.resizeBox({\n appId,\n width: data.width,\n height: data.height,\n skipUpdate: false,\n });\n break;\n }\n case \"setBoxMinSize\": {\n this.boxManager.setBoxMinSize({\n appId,\n minWidth: data.minwidth,\n minHeight: data.minheight,\n });\n break;\n }\n case \"setBoxTitle\": {\n this.boxManager.setBoxTitle({ appId, title: data.title });\n break;\n }\n case AppEvents.destroy: {\n if (this.status === \"destroyed\") return;\n this.destroy(true, data?.error);\n if (data?.error) {\n console.error(data?.error);\n }\n break;\n }\n case \"focus\": {\n this.boxManager.focusBox({ appId: this.id });\n emitter.emit(\"focus\", { appId: this.id });\n break;\n }\n default: {\n break;\n }\n }\n };\n }\n\n private appAttributesUpdateListener = (appId: string) => {\n const disposer = autorun(() => {\n const attrs = this.manager.windowManger.attributes[appId];\n if (attrs) {\n this.appEmitter.emit(\"attributesUpdate\", attrs);\n }\n });\n this.disposer = disposer;\n };\n\n public recoverCamera(): void {\n this.manager.cameraStore.recoverCamera(this.id, this.view);\n }\n\n public setScenePath(): void {\n const fullScenePath = this.getFullScenePath();\n if (this.manager.room && fullScenePath && this.view) {\n setScenePath(this.manager.room, fullScenePath);\n }\n }\n\n public switchToFreedom(): void {\n if (this.view && this.view.mode === ViewVisionMode.Writable) {\n const scenePath = this.getFullScenePath();\n if (scenePath) {\n setViewFocusScenePath(this.view, scenePath);\n setViewMode(this.view, ViewVisionMode.Freedom);\n }\n }\n }\n\n public setViewFocusScenePath() {\n const fullPath = this.getFullScenePath();\n if (fullPath && this.view) {\n setViewFocusScenePath(this.view, fullPath);\n }\n }\n\n public addCameraListener() {\n this.view?.callbacks.on(\"onCameraUpdated\", this.cameraListener);\n }\n\n public removeCameraListener() {\n this.view?.callbacks.off(\"onCameraUpdated\", this.cameraListener);\n }\n\n private createView(): View {\n const view = this.viewManager.createView(this.id);\n this.setViewFocusScenePath();\n return view;\n }\n\n private cameraListener = (camera: Camera) => {\n this.manager.cameraStore.setCamera(this.id, camera);\n };\n\n public async destroy(needCloseBox: boolean, cleanAttrs: boolean, error?: Error) {\n this.status = \"destroyed\";\n await appRegister.notifyApp(this.kind, \"destroy\", { appId: this.id });\n await this.appEmitter.emit(\"destroy\", { error });\n this.appEmitter.clearListeners();\n emitter.emit(`destroy-${this.id}`, { error });\n if (needCloseBox) {\n this.boxManager.closeBox(this.id);\n }\n if (this.disposer) {\n this.disposer();\n }\n if (cleanAttrs) {\n this.manager.delegate.cleanAppAttributes(this.id);\n }\n this.appProxies.delete(this.id);\n this.manager.cameraStore.deleteCamera(this.id);\n this.removeCameraListener();\n this.manager.viewManager.destroyView(this.id);\n this.manager.appStatus.delete(this.id);\n }\n}\n","import { AppAttributes } from \"./constants\";\nimport { get, pick } from \"lodash\";\nimport { setViewFocusScenePath } from \"./Utils/Common\";\nimport type { AddAppParams, AppSyncAttributes } from \"./index\";\nimport type { Camera, Size } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\n\nexport enum Fields {\n Apps = \"apps\",\n Focus = \"focus\",\n State = \"state\",\n BoxState = \"boxState\",\n MainViewCamera = \"mainViewCamera\",\n MainViewSize = \"mainViewSize\",\n Broadcaster = \"broadcaster\",\n Cursors = \"cursors\",\n Position = \"position\",\n CursorState = \"cursorState\",\n}\n\nexport type Apps = {\n [key: string]: AppSyncAttributes;\n};\n\ntype Position = {\n x: number;\n y: number;\n};\n\nexport class AttributesDelegate {\n constructor(private manager: AppManager) {}\n\n public apps(): Apps {\n return get(this.manager.attributes, [Fields.Apps]);\n }\n\n public get focus() {\n return get(this.manager.attributes, [Fields.Focus]);\n }\n\n public get broadcaster() {\n return get(this.manager.attributes, [Fields.Broadcaster]);\n }\n\n public getAppAttributes(id: string): AppSyncAttributes {\n return get(this.apps(), [id]);\n }\n\n public getAppState(id: string) {\n return get(this.apps(), [id, Fields.State]);\n }\n\n public setupAppAttributes(params: AddAppParams, id: string, isDynamicPPT: boolean) {\n const attributes = this.manager.attributes;\n if (!attributes.apps) {\n this.manager.safeSetAttributes({ apps: {} });\n }\n const attrNames = [\"scenePath\", \"title\"];\n if (!isDynamicPPT) {\n attrNames.push(\"scenes\");\n }\n const options = pick(params.options, attrNames);\n const attrs: AppSyncAttributes = { kind: params.kind, options, isDynamicPPT };\n if (typeof params.src === \"string\") {\n attrs.src = params.src;\n }\n this.manager.safeUpdateAttributes([Fields.Apps, id], attrs);\n this.manager.safeUpdateAttributes([Fields.Apps, id, Fields.State], {\n [AppAttributes.Size]: {},\n [AppAttributes.Position]: {},\n [AppAttributes.SnapshotRect]: {},\n [AppAttributes.SceneIndex]: 0,\n });\n }\n\n public updateAppState(appId: string, stateName: AppAttributes, state: any) {\n if (get(this.manager.attributes, [Fields.Apps, appId, Fields.State])) {\n this.manager.safeUpdateAttributes([Fields.Apps, appId, Fields.State, stateName], state);\n }\n }\n\n public cleanAppAttributes(id: string) {\n this.manager.safeUpdateAttributes([Fields.Apps, id], undefined);\n this.manager.safeSetAttributes({ [id]: undefined });\n const focus = this.manager.attributes[Fields.Focus];\n if (focus === id) {\n this.cleanFocus();\n }\n }\n\n public cleanFocus() {\n this.manager.safeSetAttributes({ [Fields.Focus]: undefined });\n }\n\n public cleanAttributes() {\n this.manager.safeSetAttributes({\n [Fields.Apps]: undefined,\n [Fields.BoxState]: undefined,\n [Fields.Focus]: undefined,\n _mainScenePath: undefined,\n _mainSceneIndex: undefined,\n });\n }\n\n public getAppSceneIndex(id: string) {\n return this.getAppState(id)?.[AppAttributes.SceneIndex];\n }\n\n public getAppScenePath(id: string) {\n return this.getAppAttributes(id)?.options?.scenePath;\n }\n\n public getMainViewScenePath() {\n return this.manager.attributes[\"_mainScenePath\"];\n }\n\n public getMainViewSceneIndex() {\n return this.manager.attributes[\"_mainSceneIndex\"];\n }\n\n public getBoxState() {\n return this.manager.attributes[Fields.BoxState];\n }\n\n public setMainViewScenePath(scenePath: string) {\n this.manager.safeSetAttributes({ _mainScenePath: scenePath });\n }\n\n public setMainViewSceneIndex(index: number) {\n this.manager.safeSetAttributes({ _mainSceneIndex: index });\n }\n\n public getMainViewCamera(): Camera {\n return get(this.manager.attributes, [Fields.MainViewCamera]);\n }\n\n public getMainViewSize(): Size {\n return get(this.manager.attributes, [Fields.MainViewSize]);\n }\n\n public setMainViewCamera(camera: Camera | undefined) {\n this.manager.safeSetAttributes({ [Fields.MainViewCamera]: { ...camera } });\n }\n\n public setMainViewSize(size: Size | undefined) {\n this.manager.safeSetAttributes({ [Fields.MainViewSize]: { ...size } });\n }\n\n public setBroadcaster(observerId: number | undefined) {\n this.manager.safeSetAttributes({ [Fields.Broadcaster]: observerId });\n }\n\n public setAppFocus(appId: string, focus: boolean) {\n if (focus) {\n this.manager.safeSetAttributes({ [Fields.Focus]: appId });\n } else {\n this.manager.safeSetAttributes({ [Fields.Focus]: undefined });\n }\n }\n\n public updateCursor(observerId: string, position: Position) {\n if (!get(this.manager.attributes, [Fields.Cursors, observerId])) {\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId], {});\n }\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId, Fields.Position], position);\n }\n\n public updateCursorState(observerId: string, cursorState: string | undefined) {\n if (!get(this.manager.attributes, [Fields.Cursors, observerId])) {\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId], {});\n }\n this.manager.safeUpdateAttributes(\n [Fields.Cursors, observerId, Fields.CursorState],\n cursorState\n );\n }\n\n public getCursorState(observerId: string) {\n return get(this.manager.attributes, [Fields.Cursors, observerId, Fields.CursorState]);\n }\n\n public cleanCursor(observerId: string) {\n this.manager.safeUpdateAttributes([Fields.Cursors, observerId], undefined);\n }\n\n // TODO 状态中保存一个 SceneName 优化性能\n public setMainViewFocusPath() {\n const scenePath = this.getMainViewScenePath();\n if (scenePath) {\n setViewFocusScenePath(this.manager.mainView, scenePath);\n }\n }\n}\n","import { callbacks, emitter, WindowManager } from \"./index\";\nimport type { AddAppOptions, AppInitState } from \"./index\";\nimport { AppAttributes, DEFAULT_COLLECTOR_STYLE, Events, MIN_HEIGHT, MIN_WIDTH } from \"./constants\";\nimport { debounce, get, isEmpty, maxBy } from \"lodash\";\nimport {\n TELE_BOX_MANAGER_EVENT,\n TELE_BOX_STATE,\n TeleBoxCollector,\n TeleBoxManager,\n} from \"@netless/telebox-insider\";\nimport type {\n TeleBoxManagerUpdateConfig,\n TeleBoxManagerCreateConfig,\n ReadonlyTeleBox,\n TeleBox,\n TeleBoxManagerConfig,\n} from \"@netless/telebox-insider\";\nimport type Emittery from \"emittery\";\nimport type { AppManager } from \"./AppManager\";\nimport type { NetlessApp } from \"./typings\";\nimport type { View } from \"white-web-sdk\";\nimport type { AppProxy } from \"./AppProxy\";\n\nexport { TELE_BOX_STATE };\n\nexport type CreateBoxParams = {\n appId: string;\n app: NetlessApp;\n view?: View;\n emitter?: Emittery;\n options?: AddAppOptions;\n canOperate?: boolean;\n};\n\ntype AppId = { appId: string };\n\ntype MoveBoxParams = AppId & { x: number; y: number };\n\ntype ResizeBoxParams = AppId & { width: number; height: number; skipUpdate: boolean };\n\ntype SetBoxMinSizeParams = AppId & { minWidth: number; minHeight: number };\n\ntype SetBoxTitleParams = AppId & { title: string };\n\nexport type CreateCollectorConfig = {\n collectorContainer?: HTMLElement;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n};\n\nexport class BoxManager {\n public teleBoxManager: TeleBoxManager;\n public appBoxMap: Map<string, string> = new Map();\n\n constructor(\n private manager: AppManager,\n private mainView: View,\n private appProxies: Map<string, AppProxy>,\n collectorConfig?: CreateCollectorConfig\n ) {\n this.mainView = mainView;\n this.teleBoxManager = this.setupBoxManager(collectorConfig);\n this.teleBoxManager.events.on(TELE_BOX_MANAGER_EVENT.State, state => {\n if (state) {\n callbacks.emit(\"boxStateChange\", state);\n emitter.emit(state, undefined);\n }\n });\n this.teleBoxManager.events.on(\"removed\", boxes => {\n boxes.forEach(box => {\n emitter.emit(\"close\", { appId: box.id });\n });\n });\n this.teleBoxManager.events.on(\n \"move\",\n debounce((box: ReadonlyTeleBox): void => {\n emitter.emit(\"move\", { appId: box.id, x: box.x, y: box.y });\n }, 50)\n );\n this.teleBoxManager.events.on(\n \"resize\",\n debounce((box: ReadonlyTeleBox): void => {\n emitter.emit(\"resize\", { appId: box.id, width: box.width, height: box.height });\n }, 200)\n );\n this.teleBoxManager.events.on(\"focused\", box => {\n if (box) {\n if (this.manager.canOperate) {\n emitter.emit(\"focus\", { appId: box.id });\n } else {\n this.updateBox(box.id, { focus: false });\n }\n } else {\n this.blurFocusBox();\n }\n });\n this.teleBoxManager.events.on(\"snapshot\", box => {\n emitter.emit(\"snapshot\", { appId: box.id, rect: { ...box.rectSnapshot } });\n });\n }\n\n public get boxState(): string {\n return this.teleBoxManager.state;\n }\n\n public createBox(params: CreateBoxParams): void {\n if (!this.teleBoxManager) return;\n let { minwidth = MIN_WIDTH, minheight = MIN_HEIGHT } = params.app.config ?? {};\n const { width, height } = params.app.config ?? {};\n const title = params.options?.title || params.appId;\n const rect = this.teleBoxManager.containerRect;\n\n if (minwidth > 1) {\n minwidth = minwidth / rect.width;\n }\n\n if (minheight > 1) {\n minheight = minheight / rect.height;\n }\n\n const createBoxConfig: TeleBoxManagerCreateConfig = {\n title,\n minWidth: minwidth,\n minHeight: minheight,\n width,\n height,\n id: params.appId,\n };\n this.teleBoxManager.create(createBoxConfig);\n emitter.emit(`${params.appId}${Events.WindowCreated}`);\n\n const appState = this.manager.delegate.getAppState(params.appId);\n if (appState) {\n const snapshotRect = get(appState, [AppAttributes.SnapshotRect]);\n if (isEmpty(snapshotRect)) {\n this.setBoxInitState(params.appId);\n }\n }\n }\n\n public setBoxInitState(appId: string): void {\n const box = this.teleBoxManager.queryOne({ id: appId });\n if (box) {\n emitter.emit(\"snapshot\", { appId: appId, rect: { ...box.rectSnapshot } });\n if (box.state === TELE_BOX_STATE.Maximized) {\n emitter.emit(\"resize\", {\n appId: appId,\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n });\n }\n }\n }\n\n public setupBoxManager(collectorConfig?: CreateCollectorConfig): TeleBoxManager {\n const root = WindowManager.wrapper ? WindowManager.wrapper : document.body;\n const rect = root.getBoundingClientRect();\n const initManagerState: TeleBoxManagerConfig = {\n root: root,\n containerRect: {\n x: 0,\n y: 0,\n width: rect.width,\n height: rect.height,\n },\n fence: false,\n };\n const container = collectorConfig?.collectorContainer || WindowManager.wrapper;\n const styles = { ...DEFAULT_COLLECTOR_STYLE, ...collectorConfig?.collectorStyles };\n const teleBoxCollector = new TeleBoxCollector({\n styles: styles,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n }).mount(container!);\n initManagerState.collector = teleBoxCollector;\n const manager = new TeleBoxManager(initManagerState);\n if (this.teleBoxManager) {\n this.teleBoxManager.destroy();\n }\n this.teleBoxManager = manager;\n return manager;\n }\n\n public getBox(appId: string): ReadonlyTeleBox | undefined {\n return this.teleBoxManager.queryOne({ id: appId });\n }\n\n public closeBox(appId: string): ReadonlyTeleBox | undefined {\n return this.teleBoxManager.remove(appId);\n }\n\n public updateBox(appId: string, config: TeleBoxManagerUpdateConfig): void {\n return this.teleBoxManager.update(appId, config);\n }\n\n public boxIsFocus(appId: string): boolean | undefined {\n const box = this.getBox(appId);\n return box?.focus;\n }\n\n public getFocusBox(): ReadonlyTeleBox | undefined {\n const boxes = this.teleBoxManager.query({ focus: true });\n return boxes[0];\n }\n\n public getTopBox(): ReadonlyTeleBox | undefined {\n const boxes = this.teleBoxManager.query();\n return maxBy(boxes, \"zIndex\");\n }\n\n public updateBoxState(state?: AppInitState): void {\n if (!state) return;\n const box = this.getBox(state.id);\n if (box) {\n this.teleBoxManager.update(box.id, {\n x: state.x,\n y: state.y,\n width: state.width || 0.5,\n height: state.height || 0.5,\n });\n if (state.focus) {\n this.teleBoxManager.update(box.id, { focus: true });\n }\n if (state.boxState) {\n this.teleBoxManager.setState(state.boxState);\n }\n if (state.snapshotRect) {\n (box as TeleBox).setSnapshot(state.snapshotRect);\n }\n }\n }\n\n public updateManagerRect(): void {\n const rect = this.mainView.divElement?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n const containerRect = { x: 0, y: 0, width: rect.width, height: rect.height };\n this.teleBoxManager.setContainerRect(containerRect);\n this.appProxies.forEach(proxy => {\n if (this.teleBoxManager) {\n proxy.appEmitter.emit(\"containerRectUpdate\", this.teleBoxManager.containerRect);\n }\n });\n }\n }\n\n public moveBox({ appId, x, y }: MoveBoxParams): void {\n this.teleBoxManager.update(appId, { x, y }, true);\n }\n\n public focusBox({ appId }: AppId): void {\n this.teleBoxManager.update(appId, { focus: true }, true);\n }\n\n public resizeBox({ appId, width, height, skipUpdate }: ResizeBoxParams): void {\n this.teleBoxManager.update(appId, { width, height }, skipUpdate);\n }\n\n public setBoxMinSize(params: SetBoxMinSizeParams): void {\n this.teleBoxManager.update(\n params.appId,\n {\n minWidth: params.minWidth,\n minHeight: params.minHeight,\n },\n true\n );\n }\n\n public setBoxTitle(params: SetBoxTitleParams): void {\n this.teleBoxManager.update(params.appId, { title: params.title }, true);\n }\n\n public blurAllBox(): void {\n this.teleBoxManager.updateAll({ focus: false });\n }\n\n public blurFocusBox(): void {\n const focusBoxes = this.teleBoxManager.query({ focus: true });\n if (focusBoxes.length) {\n const box = focusBoxes[0];\n this.teleBoxManager.update(box.id, { focus: false });\n }\n }\n\n public updateAll(config: TeleBoxManagerUpdateConfig): void {\n this.teleBoxManager.updateAll(config);\n }\n\n public setBoxState(state: TELE_BOX_STATE): void {\n this.teleBoxManager.setState(state, true);\n callbacks.emit(\"boxStateChange\", state);\n }\n}\n","import type { Camera, View } from \"white-web-sdk\";\nimport { AnimationMode } from \"white-web-sdk\";\n\nexport class CameraStore {\n private cameras: Map<string, Camera> = new Map();\n\n public setCamera(id: string, camera: Camera) {\n this.cameras.set(id, camera);\n }\n\n public getCamera(id: string) {\n return this.cameras.get(id);\n }\n\n public deleteCamera(id: string) {\n this.cameras.delete(id);\n }\n\n public recoverCamera(id: string, view?: View) {\n const camera = this.cameras.get(id);\n if (camera && view) {\n view.moveCamera({\n ...camera,\n animationMode: AnimationMode.Immediately,\n });\n }\n }\n}\n","import { AnimationMode, reaction } from 'white-web-sdk';\nimport { Fields } from './AttributesDelegate';\nimport { isEmpty, isEqual } from 'lodash';\nimport type { Camera, Size, View } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\n\nexport class MainViewProxy {\n private scale?: number;\n private size?: Size;\n private disposers: any[] = [];\n \n constructor(private manager: AppManager) {\n const delegate = this.manager.delegate;\n const displayer = this.manager.displayer;\n\n this.disposers.push(\n reaction(\n () => this.manager.attributes?.[Fields.MainViewCamera],\n camera => {\n if (delegate.broadcaster !== displayer.observerId && camera) {\n this.moveCamera(camera);\n }\n },\n {\n fireImmediately: true,\n }\n )\n );\n this.disposers.push(\n reaction(\n () => this.manager.attributes?.[Fields.MainViewSize],\n size => {\n if (delegate.broadcaster !== displayer.observerId && size) {\n this.moveCameraToContian(size);\n this.moveCamera(delegate.getMainViewCamera());\n }\n },\n {\n fireImmediately: true,\n }\n )\n );\n\n }\n\n public get view(): View {\n return this.manager.viewManager.mainView; \n }\n\n public moveCameraToContian(size: Size): void {\n if (!isEmpty(size) && !isEqual(size, this.size)) {\n this.view.moveCameraToContain({\n width: size.width,\n height: size.height,\n originX: -size.width / 2,\n originY: -size.height / 2,\n animationMode: AnimationMode.Immediately,\n });\n this.size = size;\n this.scale = this.view.camera.scale;\n }\n }\n\n public moveCamera(camera: Camera): void {\n if (!isEmpty(camera)) {\n if (isEqual(camera, this.view.camera)) return;\n const { centerX, centerY, scale } = camera;\n const needScale = scale * (this.scale || 1);\n this.view.moveCamera({\n centerX: centerX,\n centerY: centerY,\n scale: needScale,\n animationMode: AnimationMode.Immediately,\n });\n }\n }\n\n public destroy() {\n this.disposers.forEach(disposer => disposer());\n }\n}\n","import { callbacks, WindowManager } from \"./index\";\nimport { debounce } from \"lodash\";\nimport { Events, SET_SCENEPATH_DELAY } from \"./constants\";\nimport {\n notifyMainViewModeChange,\n setScenePath,\n setViewFocusScenePath,\n setViewMode,\n} from \"./Utils/Common\";\nimport { TELE_BOX_STATE } from \"@netless/telebox-insider\";\nimport { ViewVisionMode } from \"white-web-sdk\";\nimport type { Camera, Displayer, Size, View } from \"white-web-sdk\";\nimport type { AppManager } from \"./AppManager\";\nimport type { CameraStore } from \"./Utils/CameraStore\";\n\nexport class ViewManager {\n public mainView: View;\n private views: Map<string, View> = new Map();\n private mainViewIsAddListener = false;\n private delegate = this.manager.delegate;\n private timer?: number;\n\n constructor(\n private displayer: Displayer,\n private manager: AppManager,\n private cameraStore: CameraStore\n ) {\n this.mainView = this.createMainView();\n this.addMainViewCameraListener();\n }\n\n public get currentScenePath(): string {\n return this.displayer.state.sceneState.scenePath;\n }\n\n public createMainView(): View {\n const mainView = this.displayer.views.createView();\n this.cameraStore.setCamera(\"mainView\", mainView.camera);\n mainView.callbacks.on(\"onSizeUpdated\", (size: Size) => {\n this.manager.boxManager.updateManagerRect();\n if (this.delegate.broadcaster === this.displayer.observerId) {\n this.setMainViewSize(size);\n }\n });\n this.switchMainViewModeToWriter();\n return mainView;\n }\n\n public setMainViewSize = debounce(size => {\n this.manager.delegate.setMainViewSize({ ...size });\n }, 200);\n\n public createView(appId: string): View {\n const view = this.displayer.views.createView();\n this.cameraStore.setCamera(appId, view.camera);\n setViewMode(view, ViewVisionMode.Freedom);\n this.views.set(appId, view);\n return view;\n }\n\n public destroyView(appId: string): void {\n const view = this.views.get(appId);\n if (view) {\n this.releaseView(view);\n this.views.delete(appId);\n }\n }\n\n private releaseView(view: View) {\n if (!(view as any).didRelease) {\n view.release();\n }\n }\n\n public getView(appId: string): View | undefined {\n return this.views.get(appId);\n }\n\n private addMainViewCameraListener() {\n this.mainView.callbacks.on(\"onCameraUpdated\", this.mainViewCameraListener);\n }\n\n private removeMainViewCameraListener() {\n this.mainView.callbacks.off(\"onCameraUpdated\", this.mainViewCameraListener);\n }\n\n public switchMainViewToFreedom(): void {\n this.manager.delegate.setMainViewFocusPath();\n notifyMainViewModeChange(callbacks, ViewVisionMode.Freedom);\n setViewMode(this.mainView, ViewVisionMode.Freedom);\n }\n\n public switchMainViewModeToWriter(): void {\n if (!this.manager.canOperate) return;\n if (this.mainView) {\n if (this.mainView.mode === ViewVisionMode.Writable) return;\n notifyMainViewModeChange(callbacks, ViewVisionMode.Writable);\n setViewMode(this.mainView, ViewVisionMode.Writable);\n }\n }\n\n public addMainViewListener(): void {\n if (this.mainViewIsAddListener) return;\n if (this.mainView.divElement) {\n this.mainView.divElement.addEventListener(\"click\", this.mainViewClickListener);\n this.mainView.divElement.addEventListener(\"touchend\", this.mainViewClickListener);\n this.mainViewIsAddListener = true;\n }\n }\n\n public removeMainViewListener(): void {\n if (this.mainView.divElement) {\n this.mainView.divElement.removeEventListener(\"click\", this.mainViewClickListener);\n this.mainView.divElement.removeEventListener(\"touchend\", this.mainViewClickListener);\n }\n }\n\n private mainViewClickListener = () => {\n this.mainViewClickHandler();\n };\n\n public async mainViewClickHandler(): Promise<void> {\n if (!this.manager.canOperate) return;\n if (this.mainView.mode === ViewVisionMode.Writable) return;\n this.manager.delegate.cleanFocus();\n this.freedomAllViews();\n this.manager.dispatchInternalEvent(Events.SwitchViewsToFreedom, {});\n this.manager.dispatchInternalEvent(Events.MainViewFocus, {});\n this.manager.boxManager.blurFocusBox();\n await this.manager.viewManager.switchMainViewToWriter();\n }\n\n private mainViewCameraListener = (camera: Camera) => {\n this.cameraStore.setCamera(\"mainView\", camera);\n if (this.delegate.broadcaster === this.displayer.observerId) {\n this.delegate.setMainViewCamera({ ...camera });\n }\n };\n\n public switchMainViewToWriter(): Promise<boolean> {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n return new Promise((resolve, reject) => {\n this.timer = window.setTimeout(() => {\n try {\n const mainViewScenePath = this.manager.delegate.getMainViewScenePath();\n if (mainViewScenePath) {\n this.freedomAllViews();\n this.removeMainViewCameraListener();\n setScenePath(this.manager.room, mainViewScenePath);\n this.switchMainViewModeToWriter();\n this.manager.cameraStore.recoverCamera(\"mainView\", this.mainView);\n this.addMainViewCameraListener();\n }\n resolve(true);\n } catch (error) {\n reject(error);\n }\n }, SET_SCENEPATH_DELAY);\n });\n }\n\n public refreshViews(): void {\n const focus = this.manager.delegate.focus;\n this.setMainViewFocusScenePath();\n if (focus) {\n const appProxy = this.manager.appProxies.get(focus);\n if (appProxy) {\n if (appProxy.view?.mode === ViewVisionMode.Writable) return;\n appProxy.removeCameraListener();\n appProxy.switchToWritable();\n appProxy.recoverCamera();\n appProxy.addCameraListener();\n }\n } else {\n if (this.manager.mainView.mode === ViewVisionMode.Writable) return;\n this.freedomAllViews();\n this.switchMainViewToWriter();\n }\n }\n\n private setMainViewFocusScenePath() {\n const mainViewScenePath = this.manager.delegate.getMainViewScenePath();\n if (mainViewScenePath) {\n setViewFocusScenePath(this.manager.mainView, mainViewScenePath);\n }\n }\n\n public freedomAllViews(): void {\n this.manager.appProxies.forEach(appProxy => {\n appProxy.setViewFocusScenePath();\n if (appProxy.view) {\n appProxy.view.mode = ViewVisionMode.Freedom;\n }\n });\n if (this.mainView.mode === ViewVisionMode.Writable) {\n notifyMainViewModeChange(callbacks, ViewVisionMode.Freedom);\n this.mainView.mode = ViewVisionMode.Freedom;\n }\n if (!this.manager.viewManager.mainView.focusScenePath) {\n this.manager.delegate.setMainViewFocusPath();\n }\n }\n\n public switchAppToWriter(id: string): void {\n this.freedomAllViews();\n // 为了同步端不闪烁, 需要给 room setScenePath 一个延迟\n setTimeout(() => {\n const appProxy = this.manager.appProxies.get(id);\n if (appProxy) {\n const boxState = this.manager.delegate.getBoxState();\n if (boxState && boxState === TELE_BOX_STATE.Minimized) {\n return;\n }\n appProxy.removeCameraListener();\n appProxy.setScenePath();\n appProxy.switchToWritable();\n appProxy.recoverCamera();\n appProxy.addCameraListener();\n }\n }, SET_SCENEPATH_DELAY);\n }\n\n public destroy(): void {\n this.removeMainViewListener();\n if (WindowManager.wrapper) {\n WindowManager.wrapper.parentNode?.removeChild(WindowManager.wrapper);\n WindowManager.wrapper = undefined;\n }\n this.releaseView(this.mainView);\n }\n}\n\nexport const setupWrapper = (\n root: HTMLElement\n): {\n playground: HTMLDivElement;\n wrapper: HTMLDivElement;\n sizer: HTMLDivElement;\n mainViewElement: HTMLDivElement;\n} => {\n const playground = document.createElement(\"div\");\n playground.className = \"netless-window-manager-playground\";\n\n const sizer = document.createElement(\"div\");\n sizer.className = \"netless-window-manager-sizer\";\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"netless-window-manager-wrapper\";\n\n const mainViewElement = document.createElement(\"div\");\n mainViewElement.className = \"netless-window-manager-main-view\";\n\n playground.appendChild(sizer);\n sizer.appendChild(wrapper);\n wrapper.appendChild(mainViewElement);\n root.appendChild(playground);\n WindowManager.wrapper = wrapper;\n\n return { playground, wrapper, sizer, mainViewElement };\n};\n","import { listenUpdated, unlistenUpdated, reaction, UpdateEventKind } from \"white-web-sdk\";\nimport type { AkkoObjectUpdatedProperty } from \"white-web-sdk\";\n\nexport const onObjectInserted = (object: any, func: () => void) => { // 兼容\b老版本的 reaction\n if (listenUpdated) {\n const listener = (events: readonly AkkoObjectUpdatedProperty<any>[]) => {\n const kinds = events.map(e => e.kind);\n if (kinds.includes(UpdateEventKind.Inserted)) {\n func();\n }\n }\n listenUpdated(object, listener);\n func();\n return () => unlistenUpdated(object, listener);\n } else {\n return reaction(\n () => object,\n () => {\n func();\n }, {\n fireImmediately: true,\n }\n )\n }\n}\n","import { AppAttributes, AppStatus, Events, MagixEventName } from \"./constants\";\nimport { AppListeners } from \"./AppListener\";\nimport { AppProxy } from \"./AppProxy\";\nimport { AttributesDelegate, Fields } from \"./AttributesDelegate\";\nimport { BoxManager, TELE_BOX_STATE } from \"./BoxManager\";\nimport { callbacks, emitter } from \"./index\";\nimport { CameraStore } from \"./Utils/CameraStore\";\nimport { genAppId, makeValidScenePath } from \"./Utils/Common\";\nimport { isRoom, reaction, ScenePathType } from \"white-web-sdk\";\nimport { log } from \"./Utils/log\";\nimport { MainViewProxy } from \"./MainView\";\nimport { ViewManager } from \"./ViewManager\";\nimport type { Displayer, DisplayerState, Room } from \"white-web-sdk\";\nimport type { CreateCollectorConfig } from \"./BoxManager\";\nimport type { AddAppParams, BaseInsertParams, WindowManager } from \"./index\";\nimport { onObjectInserted } from \"./Utils/Reactive\";\n\nexport class AppManager {\n public displayer: Displayer;\n public boxManager: BoxManager;\n public cameraStore: CameraStore;\n public viewManager: ViewManager;\n public appProxies: Map<string, AppProxy> = new Map();\n public appStatus: Map<string, AppStatus> = new Map();\n public delegate = new AttributesDelegate(this);\n public mainViewProxy: MainViewProxy;\n\n private appListeners: AppListeners;\n private reactionDisposers: any[] = [];\n\n constructor(public windowManger: WindowManager, options: CreateCollectorConfig) {\n this.displayer = windowManger.displayer;\n this.cameraStore = new CameraStore();\n this.viewManager = new ViewManager(this.displayer as Room, this, this.cameraStore);\n this.boxManager = new BoxManager(this, this.viewManager.mainView, this.appProxies, options);\n this.appListeners = new AppListeners(\n this,\n this.windowManger,\n this.viewManager,\n this.appProxies\n );\n this.displayer.callbacks.on(this.eventName, this.displayerStateListener);\n this.displayerWritableListener(!this.room?.isWritable);\n this.displayer.callbacks.on(\"onEnableWriteNowChanged\", this.displayerWritableListener);\n this.appListeners.addListeners();\n this.mainViewProxy = new MainViewProxy(this);\n\n emitter.once(\"onCreated\").then(async () => {\n await this.attributesUpdateCallback(this.attributes.apps);\n emitter.onAny(this.boxEventListener);\n const disposer = onObjectInserted(this.attributes.apps, () => {\n this.attributesUpdateCallback(this.attributes.apps);\n });\n this.reactionDisposers.push(disposer);\n this.reactionDisposers.push(\n reaction(\n () => this.attributes[Fields.Broadcaster],\n id => {\n callbacks.emit(\"broadcastChange\", id);\n }\n )\n )\n if (!this.attributes.apps || Object.keys(this.attributes.apps).length === 0) {\n const mainScenePath = this.delegate.getMainViewScenePath();\n if (!mainScenePath) return;\n const sceneState = this.displayer.state.sceneState;\n if (sceneState.scenePath !== mainScenePath) {\n this.room?.setScenePath(mainScenePath);\n }\n }\n });\n }\n\n /**\n * 插件更新 attributes 时的回调\n *\n * @param {*} attributes\n * @memberof WindowManager\n */\n public async attributesUpdateCallback(apps: any) {\n if (apps) {\n for (const id in apps) {\n if (!this.appProxies.has(id) && !this.appStatus.has(id)) {\n const app = apps[id];\n await this.baseInsertApp(\n {\n kind: app.kind,\n options: app.options,\n isDynamicPPT: app.isDynamicPPT,\n },\n id,\n false\n );\n this.focusByAttributes(apps);\n }\n }\n }\n }\n\n public async addApp(params: AddAppParams, isDynamicPPT: boolean): Promise<string | undefined> {\n log(\"addApp\", params);\n const { appId, needFocus } = await this.beforeAddApp(params, isDynamicPPT);\n const appProxy = await this.baseInsertApp(params, appId, true, needFocus);\n this.afterAddApp(appProxy);\n return appProxy?.id;\n }\n\n private async beforeAddApp(params: AddAppParams, isDynamicPPT: boolean) {\n const appId = await genAppId(params.kind);\n this.appStatus.set(appId, AppStatus.StartCreate);\n this.delegate.setupAppAttributes(params, appId, isDynamicPPT);\n if (this.boxManager.boxState === TELE_BOX_STATE.Minimized) {\n this.boxManager.teleBoxManager.setState(TELE_BOX_STATE.Normal);\n }\n const needFocus = this.boxManager.boxState !== TELE_BOX_STATE.Minimized;\n if (needFocus) {\n this.delegate.setAppFocus(appId, true);\n }\n const attrs = params.attributes ?? {};\n this.safeUpdateAttributes([appId], attrs);\n return { appId, needFocus };\n }\n\n private afterAddApp(appProxy: AppProxy | undefined) {\n if (appProxy) {\n emitter.emit(\"move\", {\n appId: appProxy.id,\n x: appProxy.box?.x,\n y: appProxy.box?.y,\n });\n }\n }\n\n public async closeApp(appId: string) {\n const appProxy = this.appProxies.get(appId);\n if (appProxy) {\n appProxy.destroy(true, true);\n }\n }\n\n private async baseInsertApp(\n params: BaseInsertParams,\n appId: string,\n isAddApp: boolean,\n focus?: boolean\n ) {\n this.appStatus.set(appId, AppStatus.StartCreate);\n if (this.appProxies.has(appId)) {\n console.warn(\"[WindowManager]: app duplicate exists and cannot be created again\");\n return;\n }\n const appProxy = new AppProxy(params, this, appId, isAddApp);\n if (appProxy) {\n await appProxy.baseInsertApp(focus);\n this.appStatus.delete(appId);\n return appProxy;\n } else {\n this.appStatus.delete(appId);\n throw new Error(\"[WindowManger]: initialize AppProxy failed\");\n }\n }\n\n private displayerStateListener = (state: Partial<DisplayerState>) => {\n const sceneState = state.sceneState;\n if (sceneState) {\n const scenePath = sceneState.scenePath;\n this.appProxies.forEach(appProxy => {\n if (appProxy.scenePath && scenePath.startsWith(appProxy.scenePath)) {\n appProxy.emitAppSceneStateChange(sceneState);\n if (sceneState.index !== appProxy.sceneIndex) {\n appProxy.setSceneIndex(sceneState.index);\n }\n }\n });\n this.viewManager.refreshViews();\n }\n if (state.roomMembers) {\n this.windowManger.cursorManager?.setRoomMembers(state.roomMembers);\n this.windowManger.cursorManager?.cleanMemberAttributes(state.roomMembers);\n }\n this.appProxies.forEach(appProxy => {\n appProxy.appEmitter.emit(\"roomStateChange\", state);\n });\n };\n\n private displayerWritableListener = (isReadonly: boolean) => {\n const isWritable = !isReadonly;\n const isManualWritable =\n this.windowManger.readonly === undefined || this.windowManger.readonly === false;\n if (this.windowManger.readonly === undefined) {\n this.boxManager.teleBoxManager.setReadonly(isReadonly);\n } else {\n this.boxManager.teleBoxManager.setReadonly(!(isWritable && isManualWritable));\n }\n this.appProxies.forEach(appProxy => {\n appProxy.emitAppIsWritableChange();\n });\n };\n\n private get eventName() {\n return isRoom(this.displayer) ? \"onRoomStateChanged\" : \"onPlayerStateChanged\";\n }\n\n public get attributes() {\n return this.windowManger.attributes;\n }\n\n public get canOperate() {\n return this.windowManger.canOperate;\n }\n\n public get room() {\n return isRoom(this.displayer) ? (this.displayer as Room) : undefined;\n }\n\n public get mainView() {\n return this.windowManger.mainView;\n }\n\n public safeSetAttributes(attributes: any) {\n this.windowManger.safeSetAttributes(attributes);\n }\n\n public safeUpdateAttributes(keys: string[], value: any) {\n this.windowManger.safeUpdateAttributes(keys, value);\n }\n\n public setMainViewScenePath(scenePath: string) {\n if (this.room) {\n const scenePathType = this.displayer.scenePathType(scenePath);\n if (scenePathType === ScenePathType.None) {\n throw new Error(`${scenePath} not valid scene`);\n } else if (scenePathType === ScenePathType.Page) {\n this._setMainViewScenePath(scenePath);\n } else if (scenePathType === ScenePathType.Dir) {\n const validScenePath = makeValidScenePath(this.displayer, scenePath);\n this._setMainViewScenePath(validScenePath);\n }\n }\n }\n\n private _setMainViewScenePath(scenePath: string) {\n this.safeSetAttributes({ _mainScenePath: scenePath });\n this.viewManager.freedomAllViews();\n this.viewManager.switchMainViewToWriter();\n this.delegate.setMainViewFocusPath();\n }\n\n public setMainViewSceneIndex(index: number) {\n if (this.room) {\n this.safeSetAttributes({ _mainSceneIndex: index });\n this.viewManager.freedomAllViews();\n this.viewManager.switchMainViewToWriter();\n this.room.setSceneIndex(index);\n this.delegate.setMainViewScenePath(this.room.state.sceneState.scenePath);\n this.delegate.setMainViewFocusPath();\n }\n }\n\n public getAppInitPath(appId: string): string | undefined {\n const attrs = this.delegate.getAppAttributes(appId);\n if (attrs) {\n return attrs?.options?.scenePath;\n }\n }\n\n public safeDispatchMagixEvent(event: string, payload: any) {\n if (this.canOperate) {\n (this.displayer as Room).dispatchMagixEvent(event, payload);\n }\n }\n\n private boxEventListener = (eventName: string | number, payload: any) => {\n switch (eventName) {\n case \"move\": {\n this.dispatchInternalEvent(Events.AppMove, payload);\n this.delegate.updateAppState(payload.appId, AppAttributes.Position, {\n x: payload.x,\n y: payload.y,\n });\n break;\n }\n case \"focus\": {\n this.windowManger.safeSetAttributes({ focus: payload.appId });\n const appProxy = this.appProxies.get(payload.appId);\n if (appProxy?.scenePath) {\n this.dispatchInternalEvent(Events.SwitchViewsToFreedom, {});\n this.viewManager.switchAppToWriter(payload.appId);\n }\n this.dispatchInternalEvent(Events.AppFocus, payload);\n break;\n }\n case \"blur\": {\n this.dispatchInternalEvent(Events.AppBlur, payload);\n break;\n }\n case \"resize\": {\n if (payload.width && payload.height) {\n this.dispatchInternalEvent(Events.AppResize, payload);\n this.delegate.updateAppState(payload.appId, AppAttributes.Size, {\n width: payload.width,\n height: payload.height,\n });\n this.room?.refreshViewSize();\n }\n break;\n }\n case TELE_BOX_STATE.Minimized: {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppBoxStateChange,\n payload: {\n ...payload,\n state: eventName,\n },\n });\n this.safeSetAttributes({ boxState: eventName });\n\n this.delegate.cleanFocus();\n this.boxManager.blurFocusBox();\n this.viewManager.freedomAllViews();\n this.viewManager.switchMainViewToWriter();\n break;\n }\n case TELE_BOX_STATE.Maximized: {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppBoxStateChange,\n payload: {\n ...payload,\n state: eventName,\n },\n });\n const topBox = this.boxManager.getTopBox();\n if (topBox) {\n emitter.emit(\"focus\", { appId: topBox.id });\n }\n this.safeSetAttributes({ boxState: eventName });\n break;\n }\n case TELE_BOX_STATE.Normal: {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppBoxStateChange,\n payload: {\n ...payload,\n state: eventName,\n },\n });\n this.safeSetAttributes({ boxState: eventName });\n break;\n }\n case \"snapshot\": {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppSnapshot,\n payload,\n });\n\n this.delegate.updateAppState(payload.appId, AppAttributes.SnapshotRect, {\n ...payload.rect,\n });\n break;\n }\n case \"close\": {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: Events.AppClose,\n payload,\n });\n const appProxy = this.appProxies.get(payload.appId);\n if (appProxy) {\n appProxy.destroy(false, true, payload.error);\n }\n setTimeout(() => {\n this.viewManager.refreshViews();\n }, 100);\n break;\n }\n default:\n break;\n }\n };\n\n public focusByAttributes(apps: any) {\n if (apps && Object.keys(apps).length === this.boxManager.appBoxMap.size) {\n const focusAppId = this.delegate.focus;\n if (focusAppId) {\n this.boxManager.focusBox({ appId: focusAppId });\n }\n }\n }\n\n public dispatchInternalEvent(event: Events, payload: any) {\n this.safeDispatchMagixEvent(MagixEventName, {\n eventName: event,\n payload: payload,\n });\n }\n\n public destroy() {\n this.displayer.callbacks.off(this.eventName, this.displayerStateListener);\n this.displayer.callbacks.off(\"onEnableWriteNowChanged\", this.displayerWritableListener);\n this.appListeners.removeListeners();\n emitter.offAny(this.boxEventListener);\n if (this.reactionDisposers.length) {\n this.reactionDisposers.map(disposer => disposer());\n this.reactionDisposers = [];\n }\n if (this.appProxies.size) {\n this.appProxies.forEach(appProxy => {\n appProxy.destroy(true, false);\n });\n }\n this.viewManager.destroy();\n this.mainViewProxy.destroy();\n callbacks.clearListeners();\n }\n}\n","function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentElement !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration();\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n select.selectedIndex = -1; // no option should be selected\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, bubbles = false) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor() {\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n this.e = element(target.nodeName);\n this.t = target;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes) {\n super();\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = append_empty_stylesheet(node).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n set_current_component(null);\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '&quot;',\n \"'\": '&#39;',\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction escape_attribute_value(value) {\n return typeof value === 'string' ? escape(value) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : context || []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : options.context || []),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.42.4' }, detail), true));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, identity, init, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, src_url_equal, start_hydrating, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","<script lang=\"ts\">\n import { isEmpty } from \"lodash\";\n\n export let cursorName: string;\n export let tagName: string;\n export let backgroundColor: string;\n export let appliance: string;\n export let x: number;\n export let y: number;\n export let src: string;\n export let visible: boolean;\n export let avatar: string;\n export let theme: string;\n export let color: string;\n export let cursorTagBackgroundColor: string;\n export let opacity: number;\n\n $: hasName = !isEmpty(cursorName);\n $: hasTagName = !isEmpty(tagName);\n $: hasAvatar = !isEmpty(avatar);\n $: display = visible ? \"initial\" : \"none\";\n\n const computedAvatarStyle = () => {\n return Object.entries({\n width: (hasName ? 19 : 28) + \"px\",\n height: (hasName ? 19 : 28) + \"px\",\n position: hasName ? \"initial\" : \"absolute\",\n \"border-color\": hasName ? \"white\" : backgroundColor,\n \"margin-right\": (hasName ? 4 : 0) + \"px\",\n })\n .map(([key, v]) => `${key}: ${v}`)\n .join(\";\");\n };\n</script>\n\n<div\n class=\"netless-window-manager-cursor-mid\"\n style=\"transform: translateX({x}px) translateY({y}px);display: {display}\"\n>\n <div class=\"netless-window-manager-cursor-name\">\n <div\n class={theme}\n style=\"background-color: {backgroundColor};color: {color};opacity: {opacity}\"\n >\n {#if hasAvatar}\n <img\n class=\"netless-window-manager-cursor-selector-avatar\"\n style={computedAvatarStyle()}\n src={avatar}\n alt=\"avatar\"\n />\n {/if}\n {cursorName}\n {#if hasTagName}\n <span class=\"netless-window-manager-cursor-tag-name\" style=\"background-color: {cursorTagBackgroundColor}\">\n {tagName}\n </span>\n {/if}\n </div>\n </div>\n <div class=\"cursor-image-wrapper\">\n <img class=\"netless-window-manager-cursor-{appliance}-image\" {src} alt={appliance} />\n </div>\n</div>\n","import { ApplianceNames } from \"white-web-sdk\";\nimport pencil from \"../image/pencil-cursor.png\";\nimport selector from \"../image/selector-cursor.png\";\nimport eraser from \"../image/eraser-cursor.png\";\nimport shape from \"../image/shape-cursor.svg\";\nimport text from \"../image/text-cursor.svg\";\n\nexport const ApplianceMap: {\n [key: string]: string;\n} = {\n [ApplianceNames.pencil]: pencil,\n [ApplianceNames.selector]: selector,\n [ApplianceNames.eraser]: eraser,\n [ApplianceNames.shape]: shape,\n [ApplianceNames.text]: text,\n};\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5zaGFwZS1jdXJzb3I8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0icGF0aC0xIj48L3BhdGg+CiAgICAgICAgPGZpbHRlciB4PSItNjQuNiUiIHk9Ii01OS41JSIgd2lkdGg9IjIyOS4zJSIgaGVpZ2h0PSIyNDYuMSUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci0yIj4KICAgICAgICAgICAgPGZlTW9ycGhvbG9neSByYWRpdXM9IjEiIG9wZXJhdG9yPSJkaWxhdGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dTcHJlYWRPdXRlcjEiPjwvZmVNb3JwaG9sb2d5PgogICAgICAgICAgICA8ZmVPZmZzZXQgZHg9IjAiIGR5PSIyIiBpbj0ic2hhZG93U3ByZWFkT3V0ZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZU9mZnNldD4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMyIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd0JsdXJPdXRlcjEiIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJvdXQiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMTYgMCIgdHlwZT0ibWF0cml4IiBpbj0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbG9yTWF0cml4PgogICAgICAgIDwvZmlsdGVyPgogICAgPC9kZWZzPgogICAgPGcgaWQ9Iumhtemdoi00IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iV2hpdGVib2FyZC1HdWlkZWxpbmVzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQ0LjAwMDAwMCwgLTc1MS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgaWQ9InNoYXBlLWN1cnNvciIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzQ0LjAwMDAwMCwgNzUxLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vS00NCIgZmlsbD0iI0ZGRkZGRiIgb3BhY2l0eT0iMC4wMSIgeD0iMCIgeT0iMCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgICAgPGcgaWQ9IuW9oueKtue7k+WQiCIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjEiIGZpbHRlcj0idXJsKCNmaWx0ZXItMikiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIxIiBkPSJNMjAsMjEgQzIwLjQ4NTQxMDMsMjEgMjAuODk4MDg1LDIxLjM0Nzk5OTMgMjAuOTg5OTQ3OSwyMS44NjU0ODc3IEwyMSwyMiBMMjEsMjcgQzIxLDI3LjU1MjI4NDcgMjAuNTUyMjg0NywyOCAyMCwyOCBDMTkuNTE0NTg5NywyOCAxOS4xMDE5MTUsMjcuNjUyMDAwNyAxOS4wMTAwNTIxLDI3LjEzNDUxMjMgTDE5LDI3IEwxOSwyMiBDMTksMjEuNDQ3NzE1MyAxOS40NDc3MTUzLDIxIDIwLDIxIFogTTI3LDE5IEMyNy41NTIyODQ3LDE5IDI4LDE5LjQ0NzcxNTMgMjgsMjAgQzI4LDIwLjQ4NTQxMDMgMjcuNjUyMDAwNywyMC44OTgwODUgMjcuMTM0NTEyMywyMC45ODk5NDc5IEwyNywyMSBMMjIsMjEgQzIxLjQ0NzcxNTMsMjEgMjEsMjAuNTUyMjg0NyAyMSwyMCBDMjEsMTkuNTE0NTg5NyAyMS4zNDc5OTkzLDE5LjEwMTkxNSAyMS44NjU0ODc3LDE5LjAxMDA1MjEgTDIyLDE5IEwyNywxOSBaIE0xOCwxOSBDMTguNTUyMjg0NywxOSAxOSwxOS40NDc3MTUzIDE5LDIwIEMxOSwyMC40ODU0MTAzIDE4LjY1MjAwMDcsMjAuODk4MDg1IDE4LjEzNDUxMjMsMjAuOTg5OTQ3OSBMMTgsMjEgTDEzLDIxIEMxMi40NDc3MTUzLDIxIDEyLDIwLjU1MjI4NDcgMTIsMjAgQzEyLDE5LjUxNDU4OTcgMTIuMzQ3OTk5MywxOS4xMDE5MTUgMTIuODY1NDg3NywxOS4wMTAwNTIxIEwxMywxOSBMMTgsMTkgWiBNMjAsMTIgQzIwLjQ4NTQxMDMsMTIgMjAuODk4MDg1LDEyLjM0Nzk5OTMgMjAuOTg5OTQ3OSwxMi44NjU0ODc3IEwyMSwxMyBMMjEsMTggQzIxLDE4LjU1MjI4NDcgMjAuNTUyMjg0NywxOSAyMCwxOSBDMTkuNTE0NTg5NywxOSAxOS4xMDE5MTUsMTguNjUyMDAwNyAxOS4wMTAwNTIxLDE4LjEzNDUxMjMgTDE5LDE4IEwxOSwxMyBDMTksMTIuNDQ3NzE1MyAxOS40NDc3MTUzLDEyIDIwLDEyIFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9oiIgZmlsbD0iI0ZGRkZGRiIgeD0iMTguNSIgeT0iMTciIHdpZHRoPSIzIiBoZWlnaHQ9IjYiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaIiIGZpbGw9IiNGRkZGRkYiIHg9IjE3IiB5PSIxOC41IiB3aWR0aD0iNiIgaGVpZ2h0PSIzIj48L3JlY3Q+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjAsMjEuNSBDMjAuMjQ1NDU5OSwyMS41IDIwLjQ0OTYwODQsMjEuNjc2ODc1MiAyMC40OTE5NDQzLDIxLjkxMDEyNDQgTDIwLjUsMjIgTDIwLjUsMjcgQzIwLjUsMjcuMjc2MTQyNCAyMC4yNzYxNDI0LDI3LjUgMjAsMjcuNSBDMTkuNzU0NTQwMSwyNy41IDE5LjU1MDM5MTYsMjcuMzIzMTI0OCAxOS41MDgwNTU3LDI3LjA4OTg3NTYgTDE5LjUsMjcgTDE5LjUsMjIgQzE5LjUsMjEuNzIzODU3NiAxOS43MjM4NTc2LDIxLjUgMjAsMjEuNSBaIE0yNywxOS41IEMyNy4yNzYxNDI0LDE5LjUgMjcuNSwxOS43MjM4NTc2IDI3LjUsMjAgQzI3LjUsMjAuMjQ1NDU5OSAyNy4zMjMxMjQ4LDIwLjQ0OTYwODQgMjcuMDg5ODc1NiwyMC40OTE5NDQzIEwyNywyMC41IEwyMiwyMC41IEMyMS43MjM4NTc2LDIwLjUgMjEuNSwyMC4yNzYxNDI0IDIxLjUsMjAgQzIxLjUsMTkuNzU0NTQwMSAyMS42NzY4NzUyLDE5LjU1MDM5MTYgMjEuOTEwMTI0NCwxOS41MDgwNTU3IEwyMiwxOS41IEwyNywxOS41IFogTTE4LDE5LjUgQzE4LjI3NjE0MjQsMTkuNSAxOC41LDE5LjcyMzg1NzYgMTguNSwyMCBDMTguNSwyMC4yNDU0NTk5IDE4LjMyMzEyNDgsMjAuNDQ5NjA4NCAxOC4wODk4NzU2LDIwLjQ5MTk0NDMgTDE4LDIwLjUgTDEzLDIwLjUgQzEyLjcyMzg1NzYsMjAuNSAxMi41LDIwLjI3NjE0MjQgMTIuNSwyMCBDMTIuNSwxOS43NTQ1NDAxIDEyLjY3Njg3NTIsMTkuNTUwMzkxNiAxMi45MTAxMjQ0LDE5LjUwODA1NTcgTDEzLDE5LjUgTDE4LDE5LjUgWiBNMjAsMTIuNSBDMjAuMjQ1NDU5OSwxMi41IDIwLjQ0OTYwODQsMTIuNjc2ODc1MiAyMC40OTE5NDQzLDEyLjkxMDEyNDQgTDIwLjUsMTMgTDIwLjUsMTggQzIwLjUsMTguMjc2MTQyNCAyMC4yNzYxNDI0LDE4LjUgMjAsMTguNSBDMTkuNzU0NTQwMSwxOC41IDE5LjU1MDM5MTYsMTguMzIzMTI0OCAxOS41MDgwNTU3LDE4LjA4OTg3NTYgTDE5LjUsMTggTDE5LjUsMTMgQzE5LjUsMTIuNzIzODU3NiAxOS43MjM4NTc2LDEyLjUgMjAsMTIuNSBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjMjEyMzI0IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"","export default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDdweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDcgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYwLjEgKDg4MTMzKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT50ZXh0LWN1cnNvcjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxwYXRoIGQ9Ik0xNiwyNi41IEMxNS43MjM4NTc2LDI2LjUgMTUuNSwyNi4yNzYxNDI0IDE1LjUsMjYgQzE1LjUsMjUuNzU0NTQwMSAxNS42NzY4NzUyLDI1LjU1MDM5MTYgMTUuOTEwMTI0NCwyNS41MDgwNTU3IEwxNiwyNS41IEwxOS41LDI1LjUgTDE5LjUsMTQuNSBMMTYsMTQuNSBDMTUuNzIzODU3NiwxNC41IDE1LjUsMTQuMjc2MTQyNCAxNS41LDE0IEMxNS41LDEzLjc1NDU0MDEgMTUuNjc2ODc1MiwxMy41NTAzOTE2IDE1LjkxMDEyNDQsMTMuNTA4MDU1NyBMMTYsMTMuNSBMMjQsMTMuNSBDMjQuMjc2MTQyNCwxMy41IDI0LjUsMTMuNzIzODU3NiAyNC41LDE0IEMyNC41LDE0LjI0NTQ1OTkgMjQuMzIzMTI0OCwxNC40NDk2MDg0IDI0LjA4OTg3NTYsMTQuNDkxOTQ0MyBMMjQsMTQuNSBMMjAuNSwxNC41IEwyMC41LDI1LjUgTDI0LDI1LjUgQzI0LjI3NjE0MjQsMjUuNSAyNC41LDI1LjcyMzg1NzYgMjQuNSwyNiBDMjQuNSwyNi4yNDU0NTk5IDI0LjMyMzEyNDgsMjYuNDQ5NjA4NCAyNC4wODk4NzU2LDI2LjQ5MTk0NDMgTDI0LDI2LjUgTDE2LDI2LjUgWiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgICAgIDxmaWx0ZXIgeD0iLTI4NC4wJSIgeT0iLTgxLjUlIiB3aWR0aD0iNjY4LjElIiBoZWlnaHQ9IjI5My45JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMSIgb3BlcmF0b3I9ImRpbGF0ZSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd1NwcmVhZE91dGVyMSI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjIiIGluPSJzaGFkb3dTcHJlYWRPdXRlcjEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzIiBpbj0ic2hhZG93T2Zmc2V0T3V0ZXIxIiByZXN1bHQ9InNoYWRvd0JsdXJPdXRlcjEiPjwvZmVHYXVzc2lhbkJsdXI+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93Qmx1ck91dGVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9Im91dCIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29tcG9zaXRlPgogICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xNiAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgPC9maWx0ZXI+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0i6aG16Z2iLTQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJXaGl0ZWJvYXJkLUd1aWRlbGluZXMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODguMDAwMDAwLCAtNjcyLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0idGV4dC1jdXJzb3IiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM5Mi4wMDAwMDAsIDY3Mi4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaLlpIfku70tNDAiIGZpbGw9IiNGRkZGRkYiIG9wYWNpdHk9IjAuMDEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgICAgICAgICAgPHVzZSBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIxIiBmaWx0ZXI9InVybCgjZmlsdGVyLTIpIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMSIgZD0iTTE5LDI1IEwxOSwxNSBMMTYsMTUgQzE1LjQ0NzcxNTMsMTUgMTUsMTQuNTUyMjg0NyAxNSwxNCBDMTUsMTMuNTE0NTg5NyAxNS4zNDc5OTkzLDEzLjEwMTkxNSAxNS44NjU0ODc3LDEzLjAxMDA1MjEgTDE2LDEzIEwyNCwxMyBDMjQuNTUyMjg0NywxMyAyNSwxMy40NDc3MTUzIDI1LDE0IEMyNSwxNC40ODU0MTAzIDI0LjY1MjAwMDcsMTQuODk4MDg1IDI0LjEzNDUxMjMsMTQuOTg5OTQ3OSBMMjQsMTUgTDIxLDE1IEwyMSwyNSBMMjQsMjUgQzI0LjU1MjI4NDcsMjUgMjUsMjUuNDQ3NzE1MyAyNSwyNiBDMjUsMjYuNDg1NDEwMyAyNC42NTIwMDA3LDI2Ljg5ODA4NSAyNC4xMzQ1MTIzLDI2Ljk4OTk0NzkgTDI0LDI3IEwxNiwyNyBDMTUuNDQ3NzE1MywyNyAxNSwyNi41NTIyODQ3IDE1LDI2IEMxNSwyNS41MTQ1ODk3IDE1LjM0Nzk5OTMsMjUuMTAxOTE1IDE1Ljg2NTQ4NzcsMjUuMDEwMDUyMSBMMTYsMjUgTDE5LDI1IFoiIGZpbGw9IiMyMTIzMjQiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"","import App from './Cursor.svelte';\nimport pRetry from 'p-retry';\nimport { ApplianceMap } from './icons';\nimport { ApplianceNames, autorun } from 'white-web-sdk';\nimport { CursorState } from '../constants';\nimport { Fields } from '../AttributesDelegate';\nimport { get, omit } from 'lodash';\nimport type { RoomMember } from \"white-web-sdk\";\nimport type { CursorManager } from \"./index\";\nimport type { WindowManager } from \"../index\";\nimport type { SvelteComponent } from \"svelte\";\n\nexport type Payload = {\n [key: string]: any\n}\n\nexport class Cursor {\n private member?: RoomMember;\n private disposer: any;\n private timer?: number;\n private component?: SvelteComponent;\n\n constructor(\n private manager: WindowManager,\n private cursors: any,\n private memberId: string,\n private cursorManager: CursorManager,\n private wrapper?: HTMLElement\n ) {\n this.setMember();\n this.createCursor();\n pRetry(() => {\n this.disposer && this.disposer();\n if (!this.cursorPosition) {\n throw new Error();\n }\n this.startReaction();\n }, { retries: 3 });\n this.autoHidden();\n }\n\n private startReaction() {\n this.disposer = autorun(() => {\n const cursor = this.cursorPosition;\n const state = this.cursorState;\n if (cursor) {\n const x = cursor.x;\n const y = cursor.y;\n const rect = this.cursorManager.wrapperRect;\n const containerRect = this.cursorManager.containerRect;\n if (this.component && rect && containerRect) {\n this.autoHidden();\n const translateX = x * rect.width; // x 需要减去一半的 cursor 的宽, 加上 icon 的宽\n const translateY = y * rect.height - 15; // y 减去 cursor 的高\n this.component.$set({ visible: true, x: translateX, y: translateY });\n }\n }\n if (state && state === CursorState.Leave) {\n this.hide();\n }\n });\n }\n\n public get memberApplianceName() {\n return this.member?.memberState?.currentApplianceName;\n }\n\n public get memberColor() {\n const rgb = this.member?.memberState?.strokeColor.join(\",\");\n return `rgb(${rgb})`;\n }\n\n private get payload(): Payload | undefined {\n return this.member?.payload;\n }\n\n public get memberCursorName() {\n return this.payload?.cursorName || this.memberId;\n }\n\n private get memberTheme() {\n if (this.payload?.theme) {\n return \"netless-window-manager-cursor-inner-mellow\";\n } else {\n return \"netless-window-manager-cursor-inner\";\n }\n }\n\n private get memberCursorTextColor() {\n return this.payload?.cursorTextColor || \"#FFFFFF\";\n }\n\n private get memberCursorTagBackgroundColor() {\n return this.payload?.cursorTagBackgroundColor || this.memberColor;\n }\n\n private get memberAvatar() {\n return this.payload?.avatar;\n }\n\n private get memberOpacity() {\n if (!this.memberCursorName && !this.memberAvatar) {\n return 0;\n } else {\n return 1;\n }\n }\n\n public get cursorState() {\n return get(this.cursors, [this.memberId, Fields.CursorState]);\n }\n\n public get cursorPosition() {\n return get(this.cursors, [this.memberId, Fields.Position]);\n }\n\n public getFocusBox() {\n return this.cursorManager.getFocusBox();\n }\n\n private autoHidden() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = window.setTimeout(() => {\n this.hide();\n }, 1000 * 10); // 10 秒钟自动隐藏\n }\n\n private async createCursor() {\n if (this.member && this.wrapper) {\n this.component = new App({\n target: this.wrapper,\n props: this.initProps(),\n });\n }\n }\n\n private initProps() {\n return {\n x: 0,\n y: 0,\n appliance: this.memberApplianceName,\n avatar: this.memberAvatar,\n src: this.getIcon(),\n visible: false,\n backgroundColor: this.memberColor,\n cursorName: this.memberCursorName,\n theme: this.memberTheme,\n color: this.memberCursorTextColor,\n cursorTagBackgroundColor: this.memberCursorTagBackgroundColor,\n opacity: this.memberOpacity,\n };\n }\n\n private getIcon() {\n if (this.member) {\n const applianceSrc = ApplianceMap[this.memberApplianceName || ApplianceNames.shape];\n return applianceSrc || ApplianceMap[ApplianceNames.shape];\n }\n }\n\n public setMember() {\n this.member = this.cursorManager.roomMembers?.find(\n member => member.memberId === Number(this.memberId)\n );\n this.component?.$set(omit(this.initProps(), [\"x\", \"y\", \"visible\"]));\n }\n\n public destroy() {\n this.disposer && this.disposer();\n if (this.component) {\n this.component.$destroy();\n }\n this.cursorManager.cursorInstances.delete(this.memberId);\n }\n\n public hide() {\n if (this.component) {\n this.component.$set({ visible: false });\n }\n }\n}\n","import { Cursor } from './Cursor';\nimport { CursorState } from '../constants';\nimport { debounce } from 'lodash';\nimport { Fields } from '../AttributesDelegate';\nimport { TELE_BOX_STATE } from '@netless/telebox-insider';\nimport { WindowManager } from '../index';\nimport type { RoomMember } from \"white-web-sdk\";\nimport type { AppManager } from \"../AppManager\";\nimport { onObjectInserted } from '../Utils/Reactive';\n\nexport class CursorManager {\n public containerRect?: DOMRect;\n public wrapperRect?: DOMRect;\n private disposer: any;\n public cursorInstances: Map<string, Cursor> = new Map();\n public roomMembers?: readonly RoomMember[];\n\n constructor(private manager: WindowManager, private appManager: AppManager) {\n this.roomMembers = this.manager.room?.state.roomMembers;\n const wrapper = WindowManager.wrapper;\n if (wrapper) {\n wrapper.addEventListener(\"mousemove\", this.mouseMoveListener);\n wrapper.addEventListener(\"touchmove\", this.touchMoveListener);\n wrapper.addEventListener(\"mouseleave\", this.mouseLeaveListener);\n wrapper.addEventListener(\"touchend\", this.mouseLeaveListener);\n this.initCursorAttributes();\n this.wrapperRect = wrapper.getBoundingClientRect();\n this.startReaction(wrapper);\n }\n }\n\n private startReaction(wrapper: HTMLElement) {\n this.disposer = onObjectInserted(this.cursors, () => {\n this.handleRoomMembersChange(wrapper);\n });\n }\n\n private handleRoomMembersChange(wrapper: HTMLElement) {\n const memberIds = this.roomMembers?.map(member => member.memberId);\n if (memberIds?.length) {\n for (const memberId in this.cursors) {\n if (\n memberIds.includes(Number(memberId)) &&\n !this.cursorInstances.has(memberId) &&\n memberId !== this.observerId\n ) {\n const component = new Cursor(\n this.manager,\n this.cursors,\n memberId,\n this,\n wrapper\n );\n this.cursorInstances.set(memberId, component);\n }\n }\n }\n }\n\n private get observerId() {\n return String(this.manager.displayer.observerId);\n }\n\n public get cursors() {\n return this.manager.attributes?.[Fields.Cursors];\n }\n\n public get boxState() {\n return this.appManager.delegate.getBoxState();\n }\n\n private mouseMoveListener = debounce((event: MouseEvent) => {\n this.updateCursor(event.clientX, event.clientY);\n }, 5);\n\n private touchMoveListener = debounce((event: TouchEvent) => {\n if (event.touches.length === 1) {\n const touchEvent = event.touches[0];\n this.updateCursor(touchEvent.clientX, touchEvent.clientY);\n }\n }, 5);\n\n private initCursorAttributes() {\n this.appManager.delegate.updateCursor(this.observerId, {\n x: 0,\n y: 0,\n });\n this.appManager.delegate.updateCursorState(this.observerId, CursorState.Leave);\n }\n\n public getBoxTitleHeight() {\n if (this.boxState === TELE_BOX_STATE.Maximized) {\n const box = this.appManager.boxManager.getTopBox();\n if (box) {\n return box.$titleBar?.clientHeight;\n }\n }\n }\n\n public getFocusBox() {\n return this.appManager.boxManager.getFocusBox();\n }\n\n private updateCursor(clientX: number, clientY: number) {\n if (this.wrapperRect && this.manager.canOperate) {\n const x = (clientX - this.wrapperRect.x) / this.wrapperRect.width;\n const y = (clientY - this.wrapperRect.y) / this.wrapperRect.height;\n if (this.appManager.delegate.getCursorState(this.observerId)) {\n this.appManager.delegate.updateCursorState(this.observerId, CursorState.Normal);\n }\n this.appManager.delegate.updateCursor(this.observerId, {\n x,\n y,\n });\n }\n }\n\n private mouseLeaveListener = () => {\n this.hideCursor(this.observerId);\n this.appManager.delegate.updateCursorState(this.observerId, CursorState.Leave);\n };\n\n public updateContainerRect() {\n this.containerRect = WindowManager.container?.getBoundingClientRect();\n this.wrapperRect = WindowManager.wrapper?.getBoundingClientRect();\n }\n\n public setRoomMembers(members: readonly RoomMember[]) {\n this.roomMembers = members;\n this.cursorInstances.forEach(cursor => {\n cursor.setMember();\n });\n if (WindowManager.wrapper) {\n this.handleRoomMembersChange(WindowManager.wrapper);\n }\n }\n\n public cleanMemberCursor(memberId: string) {\n this.appManager.delegate.cleanCursor(memberId);\n const cursor = this.cursorInstances.get(memberId);\n if (cursor) {\n cursor.destroy();\n }\n }\n\n public hideCursor(memberId: string) {\n const cursor = this.cursorInstances.get(memberId);\n if (cursor) {\n cursor.hide();\n }\n }\n\n public cleanMemberAttributes(members: readonly RoomMember[]) {\n const memberIds = members.map(member => member.memberId);\n const needDeleteIds = [];\n for (const memberId in this.cursors) {\n const index = memberIds.findIndex(id => id === Number(memberId));\n if (index === -1) {\n needDeleteIds.push(memberId);\n }\n }\n needDeleteIds.forEach(memberId => {\n const instance = this.cursorInstances.get(memberId);\n if (instance) {\n instance.destroy();\n }\n this.appManager.delegate.cleanCursor(memberId);\n });\n }\n\n public destroy() {\n const wrapper = WindowManager.wrapper;\n if (wrapper) {\n wrapper.removeEventListener(\"mousemove\", this.mouseMoveListener);\n wrapper.removeEventListener(\"touchmove\", this.touchMoveListener);\n wrapper.removeEventListener(\"mouseleave\", this.mouseLeaveListener);\n wrapper.removeEventListener(\"touchend\", this.mouseLeaveListener);\n }\n this.disposer && this.disposer();\n if (this.cursorInstances.size) {\n this.cursorInstances.forEach(cursor => cursor.destroy());\n this.cursorInstances.clear();\n }\n }\n}\n","import AppDocsViewer from \"@netless/app-docs-viewer\";\nimport AppMediaPlayer, { setOptions } from \"@netless/app-media-player\";\nimport Emittery from \"emittery\";\nimport { isNull, isObject } from \"lodash\";\nimport {\n AppCreateError,\n AppManagerNotInitError,\n ParamsInvalidError,\n WhiteWebSDKInvalidError,\n} from \"./Utils/error\";\nimport { AppManager } from \"./AppManager\";\nimport { appRegister } from \"./Register\";\nimport { CursorManager } from \"./Cursor\";\nimport type { Apps } from \"./AttributesDelegate\";\nimport { Fields } from \"./AttributesDelegate\";\nimport { getVersionNumber, wait } from \"./Utils/Common\";\nimport {\n InvisiblePlugin,\n isRoom,\n RoomPhase,\n ViewMode,\n ViewVisionMode,\n WhiteVersion,\n} from \"white-web-sdk\";\nimport { log } from \"./Utils/log\";\nimport { replaceRoomFunction } from \"./Utils/RoomHacker\";\nimport { ResizeObserver as ResizeObserverPolyfill } from \"@juggle/resize-observer\";\nimport { setupWrapper } from \"./ViewManager\";\nimport \"./style.css\";\nimport \"@netless/telebox-insider/dist/style.css\";\nimport type {\n Displayer,\n SceneDefinition,\n View,\n Room,\n InvisiblePluginContext,\n Camera,\n} from \"white-web-sdk\";\nimport type { AppListeners } from \"./AppListener\";\nimport type { NetlessApp, RegisterParams } from \"./typings\";\nimport type { TELE_BOX_STATE } from \"./BoxManager\";\nimport { REQUIRE_VERSION, DEFAULT_CONTAINER_RATIO } from \"./constants\";\nimport { initDb } from \"./Register/storage\";\n\nconst ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;\n\nexport type WindowMangerAttributes = {\n modelValue?: string;\n boxState: TELE_BOX_STATE;\n [key: string]: any;\n};\n\nexport type apps = {\n [key: string]: NetlessApp;\n};\n\nexport type AddAppOptions = {\n scenePath?: string;\n title?: string;\n scenes?: SceneDefinition[];\n};\n\nexport type setAppOptions = AddAppOptions & { appOptions?: any };\n\nexport type AddAppParams = {\n kind: string;\n // app 地址(本地 app 不需要传)\n src?: string;\n // 窗口配置\n options?: AddAppOptions;\n // 初始化 attributes\n attributes?: any;\n};\n\nexport type BaseInsertParams = {\n kind: string;\n // app 地址(本地 app 不需要传)\n src?: string;\n // 窗口配置\n options?: AddAppOptions;\n // 初始化 attributes\n attributes?: any;\n isDynamicPPT?: boolean;\n};\n\nexport type AppSyncAttributes = {\n kind: string;\n src?: string;\n options: any;\n state?: any;\n isDynamicPPT?: boolean;\n};\n\nexport type AppInitState = {\n id: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n focus?: boolean;\n snapshotRect?: any;\n boxState?: TELE_BOX_STATE;\n sceneIndex?: number;\n};\n\nexport const emitter: Emittery<{\n onCreated: undefined;\n [key: string]: any;\n}> = new Emittery();\n\nexport type PublicEvent = {\n mainViewModeChange: ViewVisionMode;\n boxStateChange: `${TELE_BOX_STATE}`;\n broadcastChange: number;\n};\n\nexport type MountParams = {\n room: Room;\n container: HTMLElement;\n /** 白板高宽比例, 默认为 9 / 16 */\n containerSizeRatio?: number;\n /** 显示 PS 透明背景,默认 true */\n chessboard?: boolean;\n collectorContainer?: HTMLElement;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n overwriteStyles?: string;\n cursor?: boolean;\n debug?: boolean;\n};\n\nexport const callbacks: Emittery<PublicEvent> = new Emittery();\n\nexport class WindowManager extends InvisiblePlugin<WindowMangerAttributes> {\n public static kind = \"WindowManager\";\n public static displayer: Displayer;\n public static wrapper?: HTMLElement;\n public static playground?: HTMLElement;\n public static container?: HTMLElement;\n public static debug = false;\n public static containerSizeRatio = DEFAULT_CONTAINER_RATIO;\n private static isCreated = false;\n\n public appListeners?: AppListeners;\n\n public readonly?: boolean;\n public emitter: Emittery<PublicEvent> = callbacks;\n private appManager?: AppManager;\n public cursorManager?: CursorManager;\n\n constructor(context: InvisiblePluginContext) {\n super(context);\n }\n\n /**\n * 挂载 WindowManager\n * @deprecated\n */\n public static async mount(\n room: Room,\n container: HTMLElement,\n collectorContainer?: HTMLElement,\n options?: {\n chessboard: boolean;\n containerSizeRatio: number;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n debug?: boolean;\n overwriteStyles?: string;\n }\n ): Promise<WindowManager>;\n\n public static async mount(params: MountParams): Promise<WindowManager>;\n\n public static async mount(\n params: MountParams | Room,\n container?: HTMLElement,\n collectorContainer?: HTMLElement,\n options?: {\n chessboard?: boolean;\n containerSizeRatio: number;\n collectorStyles?: Partial<CSSStyleDeclaration>;\n debug?: boolean;\n overwriteStyles?: string;\n }\n ): Promise<WindowManager> {\n let room: Room;\n let containerSizeRatio: number | undefined;\n let collectorStyles: Partial<CSSStyleDeclaration> | undefined;\n let debug: boolean | undefined;\n let chessboard = true;\n let overwriteStyles: string | undefined;\n let cursor: boolean | undefined;\n if (\"room\" in params) {\n room = params.room;\n container = params.container;\n collectorContainer = params.collectorContainer;\n containerSizeRatio = params.containerSizeRatio;\n collectorStyles = params.collectorStyles;\n debug = params.debug;\n if (params.chessboard != null) {\n chessboard = params.chessboard;\n }\n overwriteStyles = params.overwriteStyles;\n cursor = params.cursor;\n } else {\n room = params;\n containerSizeRatio = options?.containerSizeRatio;\n collectorStyles = options?.collectorStyles;\n debug = options?.debug;\n if (options?.chessboard != null) {\n chessboard = options.chessboard;\n }\n overwriteStyles = options?.overwriteStyles;\n }\n\n this.checkVersion();\n if (room.phase !== RoomPhase.Connected) {\n throw new Error(\"[WindowManager]: Room only Connected can be mount\");\n }\n if (!container) {\n throw new Error(\"[WindowManager]: Container must provide\");\n }\n if (WindowManager.isCreated) {\n throw new Error(\"[WindowManager]: Already created cannot be created again\");\n }\n const manager = await this.initManager(room);\n this.debug = Boolean(debug);\n if (this.debug) {\n setOptions({ verbose: true });\n }\n log(\"[WindowManager]: Already insert room\", manager);\n if (containerSizeRatio) {\n WindowManager.containerSizeRatio = containerSizeRatio;\n }\n WindowManager.container = container;\n const { playground, wrapper, sizer, mainViewElement } = setupWrapper(container);\n WindowManager.playground = playground;\n if (chessboard) {\n sizer.classList.add(\"netless-window-manager-chess-sizer\");\n }\n if (overwriteStyles) {\n const style = document.createElement(\"style\");\n style.textContent = overwriteStyles;\n playground.appendChild(style);\n }\n await manager.ensureAttributes();\n manager.appManager = new AppManager(manager, {\n collectorContainer: collectorContainer,\n collectorStyles: collectorStyles,\n });\n manager.observePlaygroundSize(playground, sizer, wrapper);\n if (cursor) {\n manager.cursorManager = new CursorManager(manager, manager.appManager);\n }\n manager.bindMainView(mainViewElement);\n replaceRoomFunction(room, manager.appManager);\n emitter.emit(\"onCreated\");\n WindowManager.isCreated = true;\n try {\n await initDb();\n } catch (error) {\n console.warn(\"[WindowManager]: indexedDB open failed\");\n console.log(error);\n }\n return manager;\n }\n\n private static async initManager(room: Room): Promise<WindowManager> {\n let manager = room.getInvisiblePlugin(WindowManager.kind) as WindowManager;\n if (!manager) {\n if (isRoom(room)) {\n if (room.isWritable === false) {\n try {\n await room.setWritable(true);\n } catch (error) {\n throw new Error(\"[WindowManger]: room must be switched to be writable\");\n }\n manager = (await room.createInvisiblePlugin(WindowManager, {})) as WindowManager;\n await room.setWritable(false);\n } else {\n manager = (await room.createInvisiblePlugin(WindowManager, {})) as WindowManager;\n }\n }\n }\n return manager;\n }\n\n /**\n * 注册插件\n */\n public static register<AppOptions = any, SetupResult = any, Attributes = any>(\n params: RegisterParams<AppOptions, SetupResult, Attributes>\n ): Promise<void> {\n return appRegister.register(params);\n }\n\n /**\n * 创建 main View\n */\n public createMainView(): View {\n if (this.appManager) {\n return this.appManager.viewManager.mainView;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n /**\n * 创建一个 app 至白板\n */\n public async addApp(params: AddAppParams): Promise<string | undefined> {\n if (this.appManager) {\n if (!params.kind || typeof params.kind !== \"string\") {\n throw new ParamsInvalidError();\n }\n const appImpl = await appRegister.appClasses.get(params.kind)?.();\n if (appImpl && appImpl.config?.singleton) {\n if (this.appManager.appProxies.has(params.kind)) {\n throw new AppCreateError();\n }\n }\n const isDynamicPPT = this.setupScenePath(params, this.appManager);\n if (isDynamicPPT === undefined) {\n return;\n }\n const appId = await this.appManager.addApp(params, Boolean(isDynamicPPT));\n return appId;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n private setupScenePath(params: AddAppParams, appManager: AppManager): boolean | undefined {\n let isDynamicPPT = false;\n if (params.options) {\n const { scenePath, scenes } = params.options;\n if (scenePath) {\n for (const appId in this.apps) {\n const appScenePath = appManager.delegate.getAppScenePath(appId);\n if (appScenePath && appScenePath === scenePath) {\n console.warn(`ScenePath ${scenePath} Already opened`);\n return;\n }\n }\n }\n if (scenePath && scenes && scenes.length > 0) {\n if (this.isDynamicPPT(scenes)) {\n isDynamicPPT = true;\n if (!this.displayer.entireScenes()[scenePath]) {\n this.room?.putScenes(scenePath, scenes);\n }\n } else {\n if (!this.displayer.entireScenes()[scenePath]) {\n this.room?.putScenes(scenePath, [{ name: scenes[0].name }]);\n }\n }\n }\n }\n return isDynamicPPT;\n }\n\n /**\n * 关闭 APP\n */\n public async closeApp(appId: string): Promise<void> {\n return this.appManager?.closeApp(appId);\n }\n\n /**\n * 设置 mainView 的 ScenePath, 并且切换白板为可写状态\n */\n public setMainViewScenePath(scenePath: string): void {\n if (this.appManager) {\n this.appManager.setMainViewScenePath(scenePath);\n }\n }\n\n /**\n * 设置 mainView 的 SceneIndex, 并且切换白板为可写状态\n */\n public setMainViewSceneIndex(index: number): void {\n if (this.appManager) {\n this.appManager.setMainViewSceneIndex(index);\n }\n }\n\n /**\n * 返回 mainView 的 ScenePath\n */\n public getMainViewScenePath(): string {\n return this.appManager?.delegate.getMainViewScenePath();\n }\n\n /**\n * 返回 mainView 的 SceneIndex\n */\n public getMainViewSceneIndex(): number {\n return this.appManager?.delegate.getMainViewSceneIndex();\n }\n\n /**\n * 设置所有 app 的 readonly 模式\n */\n public setReadonly(readonly: boolean): void {\n if (this.room?.isWritable) {\n this.readonly = readonly;\n this.appManager?.boxManager.teleBoxManager.setReadonly(readonly);\n }\n }\n\n /**\n * 切换 mainView 为可写\n */\n public switchMainViewToWriter(): Promise<void> | undefined {\n return this.appManager?.viewManager.mainViewClickHandler();\n }\n\n /**\n * app destroy 回调\n */\n public onAppDestroy(kind: string, listener: (error: Error) => void): void {\n emitter.once(`destroy-${kind}`).then(listener);\n }\n\n /**\n * 设置 ViewMode\n */\n public setViewMode(mode: ViewMode): void {\n if (mode === ViewMode.Broadcaster) {\n this.appManager?.delegate.setBroadcaster(this.displayer.observerId);\n this.appManager?.delegate.setMainViewCamera(this.mainView.camera);\n this.appManager?.delegate.setMainViewSize(this.mainView.size);\n }\n if (mode === ViewMode.Freedom) {\n this.appManager?.delegate.setMainViewCamera(undefined);\n this.appManager?.delegate.setMainViewSize(undefined);\n this.appManager?.delegate.setBroadcaster(undefined);\n }\n }\n\n public get mainView(): View {\n if (this.appManager) {\n return this.appManager.viewManager.mainView;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n public get camera(): Camera {\n if (this.appManager) {\n return this.appManager.viewManager.mainView.camera;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n public get apps(): Apps | undefined {\n return this.appManager?.delegate.apps();\n }\n\n public get boxState(): string {\n if (this.appManager) {\n return this.appManager.boxManager.teleBoxManager.state;\n } else {\n throw new AppManagerNotInitError();\n }\n }\n\n public override onDestroy(): void {\n this._destroy();\n }\n\n public override destroy(): void {\n this._destroy();\n }\n\n private _destroy() {\n this.containerResizeObserver?.disconnect();\n this.appManager?.destroy();\n this.cursorManager?.destroy();\n WindowManager.container = undefined;\n WindowManager.wrapper = undefined;\n WindowManager.isCreated = false;\n if (WindowManager.playground) {\n WindowManager.playground.parentNode?.removeChild(WindowManager.playground);\n }\n log(\"Destroyed\");\n }\n\n private bindMainView(divElement: HTMLDivElement) {\n if (this.appManager) {\n const mainView = this.appManager.viewManager.mainView;\n mainView.divElement = divElement;\n mainView.mode = ViewVisionMode.Writable;\n if (!mainView.focusScenePath) {\n this.appManager.delegate.setMainViewFocusPath();\n }\n if (!this.appManager.delegate.getMainViewScenePath()) {\n const sceneState = this.displayer.state.sceneState;\n this.appManager.delegate.setMainViewScenePath(sceneState.scenePath);\n this.appManager.delegate.setMainViewSceneIndex(sceneState.index);\n }\n\n if (\n this.appManager.delegate.focus === undefined &&\n mainView.mode !== ViewVisionMode.Writable\n ) {\n this.appManager.viewManager.freedomAllViews();\n this.appManager.viewManager.switchMainViewToWriter();\n }\n this.appManager.viewManager.addMainViewListener();\n }\n }\n\n public get canOperate(): boolean {\n if (isRoom(this.displayer)) {\n return (\n (this.displayer as Room).isWritable &&\n (this.displayer as Room).phase === RoomPhase.Connected\n );\n } else {\n return false;\n }\n }\n\n public get room(): Room | undefined {\n return this.canOperate ? (this.displayer as Room) : undefined;\n }\n\n public get broadcaster(): number | undefined {\n return this.appManager?.delegate.broadcaster;\n }\n\n public safeSetAttributes(attributes: any): void {\n if (this.canOperate) {\n this.setAttributes(attributes);\n }\n }\n\n public safeUpdateAttributes(keys: string[], value: any): void {\n if (this.canOperate) {\n this.updateAttributes(keys, value);\n }\n }\n\n private safeDispatchMagixEvent(event: string, payload: any) {\n if (this.canOperate) {\n (this.displayer as Room).dispatchMagixEvent(event, payload);\n }\n }\n\n private getSceneName(scenePath: string, index?: number) {\n const scenes = this.displayer.entireScenes()[scenePath];\n if (scenes && index !== undefined) {\n return scenes[index]?.name;\n }\n }\n\n private isDynamicPPT(scenes: SceneDefinition[]) {\n const sceneSrc = scenes[0]?.ppt?.src;\n return sceneSrc?.startsWith(\"pptx://\");\n }\n\n private static checkVersion() {\n const version = getVersionNumber(WhiteVersion);\n if (version < getVersionNumber(REQUIRE_VERSION)) {\n throw new WhiteWebSDKInvalidError(REQUIRE_VERSION);\n }\n }\n\n private async ensureAttributes() {\n if (isNull(this.attributes)) {\n await wait(50);\n }\n if (isObject(this.attributes)) {\n if (!this.attributes[Fields.Apps]) {\n this.safeSetAttributes({ [Fields.Apps]: {} });\n }\n if (!this.attributes[Fields.Cursors]) {\n this.safeSetAttributes({ [Fields.Cursors]: {} });\n }\n }\n }\n\n private containerResizeObserver?: ResizeObserver;\n\n private observePlaygroundSize(\n container: HTMLElement,\n sizer: HTMLElement,\n wrapper: HTMLDivElement\n ) {\n this.updateSizer(container.getBoundingClientRect(), sizer, wrapper);\n\n this.containerResizeObserver = new ResizeObserver(entries => {\n const containerRect = entries[0]?.contentRect;\n if (containerRect) {\n this.updateSizer(containerRect, sizer, wrapper);\n this.cursorManager?.updateContainerRect();\n }\n });\n\n this.containerResizeObserver.observe(container);\n }\n\n private updateSizer(\n { width, height }: DOMRectReadOnly,\n sizer: HTMLElement,\n wrapper: HTMLDivElement\n ) {\n if (width && height) {\n if (height / width > WindowManager.containerSizeRatio) {\n height = width * WindowManager.containerSizeRatio;\n sizer.classList.toggle(\"netless-window-manager-sizer-horizontal\", true);\n } else {\n width = height / WindowManager.containerSizeRatio;\n sizer.classList.toggle(\"netless-window-manager-sizer-horizontal\", false);\n }\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n }\n }\n}\n\nWindowManager.register({\n kind: AppDocsViewer.kind,\n src: AppDocsViewer,\n});\nWindowManager.register({\n kind: AppMediaPlayer.kind,\n src: AppMediaPlayer,\n});\n\nexport const BuiltinApps = {\n DocsViewer: AppDocsViewer.kind as string,\n MediaPlayer: AppMediaPlayer.kind as string,\n};\n\nexport * from \"./typings\";\n","import type { Camera, Room } from \"white-web-sdk\";\nimport type { AppManager } from \"../AppManager\";\n\n// 修改多窗口状态下一些失效的方法实现到 manager 的 mainview 上, 降低迁移成本\nexport const replaceRoomFunction = (room: Room, manager: AppManager) => {\n const descriptor = Object.getOwnPropertyDescriptor(room, \"disableCameraTransform\");\n if (descriptor) return;\n Object.defineProperty(room, \"disableCameraTransform\", {\n get() {\n return manager.mainView.disableCameraTransform;\n },\n set(disable: boolean) {\n manager.mainView.disableCameraTransform = disable;\n },\n });\n\n room.moveCamera = (camera: Camera) => manager.mainView.moveCamera(camera);\n room.moveCameraToContain = (...args) => manager.mainView.moveCameraToContain(...args);\n room.convertToPointInWorld = (...args) => manager.mainView.convertToPointInWorld(...args);\n room.setCameraBound = (...args) => manager.mainView.setCameraBound(...args);\n};\n"],"names":["Events","Events2","Error","constructor","version","AppAttributes","AppAttributes2","AppEvents","AppEvents2","AppStatus","CursorState","CursorState2","MIN_WIDTH","MIN_HEIGHT","DEFAULT_COLLECTOR_STYLE","right","bottom","position","manager","windowManager","viewManager","appProxies","this","displayer","boxManager","event","authorId","observerId","data","payload","eventName","AppMove","appMoveHandler","AppFocus","appFocusHandler","AppResize","appResizeHandler","AppBlur","appBlurHandler","AppBoxStateChange","appBoxStateHandler","AppSnapshot","appSnapshotHandler","AppClose","appCloseHandler","MainViewFocus","mainViewFocusHandler","SwitchViewsToFreedom","switchViewsToFreedomHandler","moveBox","focusBox","refreshViews","resizeBox","Object","assign","skipUpdate","room","refreshViewSize","proxy","get","appId","appEmitter","emit","view","mode","ViewVisionMode","Writable","setBoxState","state","TELE_BOX_STATE","Minimized","switchMainViewToWriter","box","getBox","setSnapshot","rect","closeBox","appProxy","destroy","blurFocusBox","freedomAllViews","addListeners","addMagixEventListener","mainMagixEventListener","removeListeners","removeMagixEventListener","db","store","initDb","async","Promise","resolve","reject","request","indexedDB","open","onerror","e","onupgradeneeded","db2","target","result","objectStoreNames","contains","createObjectStore","keyPath","createIndex","unique","onsuccess","setItem","key","val","kind","sourceCode","transaction","objectStore","add","getItem","index","getScript","url","item","resource","options","timeout","controller","AbortController","id","setTimeout","abort","response","fetch","__spreadProps","signal","headers","fetchWithTimeout","text2","text","executeScript","appName","Function","window","appRegister","Map","params","registered","set","srcOrAppOrFunction","src","downloadApp","appClass","name","error","message","includes","define","amd","loadApp","appClasses","app","appClassesCache","addHooks","emitter2","createKindEmitter","kindEmitters","has","Emittery","setViewFocusScenePath","focusScenePath","setScenePath","scenePath","sceneState","setViewMode","notifyMainViewModeChange","debounce","callbacks2","getVersionNumber","versionString","split","map","s","padStart","join","parseInt","wait","time","setScenes","appOptions","autorun","reaction","listenUpdated","unlistenUpdated","listenDisposed","unlistenDisposed","delegate","emitter","isAddApp","getDisplayer","getAttributes","attributes","getScenes","appAttr","getAppAttributes","isDynamicPPT","scenes","getView","getInitScenePath","getAppInitPath","getIsWritable","canOperate","BoxNotCreatedError","getRoom","setAttributes","safeSetAttributes","updateAttributes","keys","value","safeUpdateAttributes","focus","mountView","dom","divElement","getAppOptions","log","args","WindowManager","debug","attrs","getAppState","Position","size","Size","snapshotRect","SnapshotRect","sceneIndex","SceneIndex","boxState","x","y","width","height","InitReplay","appId2","disposer","windowManger","camera","cameraStore","setCamera","appListener","makeAppEventListener","attr2","entireScenes","createView","addCameraListener","getAppSceneIndex","setSceneIndex","updateAppState","readonly","getSceneName","getFullScenePath","appImpl","appParams","setupApp","updateManagerRect","switchAppToWriter","setMainViewFocusPath","context","AppContext","once","WindowCreated","then","boxInitState","getAppInitState","updateBoxState","onAny","appAttributesUpdateListener","setup","notifyApp","setBoxInitState","createBox","switchToWritable","mainView","callbacks","Freedom","emitAppSceneStateChange","emitAppIsWritableChange","isWritable","setBoxMinSize","minWidth","minwidth","minHeight","minheight","setBoxTitle","title","status","recoverCamera","fullScenePath","switchToFreedom","fullPath","on","cameraListener","removeCameraListener","off","needCloseBox","cleanAttrs","clearListeners","cleanAppAttributes","delete","deleteCamera","destroyView","appStatus","Fields","Fields2","apps","Apps","Focus","Broadcaster","State","setupAppAttributes","attrNames","push","pick","stateName","cleanFocus","cleanAttributes","BoxState","_mainScenePath","_mainSceneIndex","getAppScenePath","getMainViewScenePath","getMainViewSceneIndex","getBoxState","setMainViewScenePath","setMainViewSceneIndex","getMainViewCamera","MainViewCamera","getMainViewSize","MainViewSize","setMainViewCamera","__spreadValues","setMainViewSize","setBroadcaster","setAppFocus","updateCursor","Cursors","updateCursorState","cursorState","getCursorState","cleanCursor","collectorConfig","teleBoxManager","setupBoxManager","events","TELE_BOX_MANAGER_EVENT","forEach","updateBox","rectSnapshot","config","containerRect","createBoxConfig","create","appState","isEmpty","queryOne","Maximized","root","wrapper","document","body","getBoundingClientRect","initManagerState","fence","container","collectorContainer","styles","collectorStyles","teleBoxCollector","TeleBoxCollector","mount","collector","TeleBoxManager","remove","update","boxIsFocus","getFocusBox","query","getTopBox","boxes","maxBy","setState","setContainerRect","blurAllBox","updateAll","focusBoxes","length","cameras","getCamera","moveCamera","animationMode","AnimationMode","Immediately","disposers","broadcaster","fireImmediately","moveCameraToContian","isEqual","moveCameraToContain","originX","originY","scale","centerX","centerY","needScale","mainViewClickHandler","createMainView","addMainViewCameraListener","views","switchMainViewModeToWriter","releaseView","didRelease","release","mainViewCameraListener","removeMainViewCameraListener","switchMainViewToFreedom","addMainViewListener","mainViewIsAddListener","addEventListener","mainViewClickListener","removeMainViewListener","removeEventListener","dispatchInternalEvent","timer","mainViewScenePath","setMainViewFocusScenePath","parentNode","removeChild","onObjectInserted","object","func","listener","UpdateEventKind","Inserted","AttributesDelegate","startsWith","roomMembers","cursorManager","setRoomMembers","cleanMemberAttributes","isReadonly","isManualWritable","setReadonly","safeDispatchMagixEvent","topBox","Normal","CameraStore","ViewManager","BoxManager","appListeners","AppListeners","displayerStateListener","displayerWritableListener","mainViewProxy","MainViewProxy","attributesUpdateCallback","boxEventListener","reactionDisposers","mainScenePath","baseInsertApp","focusByAttributes","needFocus","beforeAddApp","afterAddApp","impl","singleton","v4","replace","slice","genAppId","StartCreate","warn","AppProxy","isRoom","scenePathType","ScenePathType","None","Page","_setMainViewScenePath","Dir","validScenePath","firstSceneName","makeValidScenePath","dispatchMagixEvent","appBoxMap","focusAppId","offAny","fn","fns","run","thing","a","b","src_url_equal_anchor","current_component","element_src","createElement","href","node","appendChild","anchor","insertBefore","createTextNode","attribute","removeAttribute","getAttribute","setAttribute","wholeText","important","style","setProperty","component","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","update_scheduled","flushing","seen_callbacks","Set","i","$$","pop","callback","clear","fragment","before_update","dirty","p","ctx","after_update","add_render_callback","outroing","flush","fill","instance2","create_fragment2","not_equal","props","append_styles","parent_component","noop","bound","blank_object","on_mount","on_destroy","on_disconnect","skip_bound","ready","ret","rest","hydrate","nodes","element2","Array","from","childNodes","l","detach","c","intro","block","local","customElement","m","new_on_destroy","filter","is_function","cursorName","tagName","backgroundColor","appliance","visible","avatar","theme","color","cursorTagBackgroundColor","opacity","hasTagName","hasAvatar","display","entries","hasName","v","$destroy","detaching","d","$on","type","indexOf","splice","$set","$$props","obj","$$set","ApplianceMap","ApplianceNames","pencil","selector","eraser","shape","cursors","memberId","setMember","createCursor","cursorPosition","startReaction","retries","autoHidden","cursor","wrapperRect","translateX","translateY","Leave","hide","member","memberState","currentApplianceName","strokeColor","cursorTextColor","memberColor","memberCursorName","memberAvatar","App","initProps","memberApplianceName","getIcon","memberTheme","memberCursorTextColor","memberCursorTagBackgroundColor","memberOpacity","find","Number","omit","cursorInstances","appManager","clientX","clientY","touches","touchEvent","hideCursor","mouseMoveListener","touchMoveListener","mouseLeaveListener","initCursorAttributes","handleRoomMembersChange","memberIds","Cursor","String","getBoxTitleHeight","$titleBar","clientHeight","updateContainerRect","members","cleanMemberCursor","needDeleteIds","findIndex","ResizeObserver","ResizeObserverPolyfill","InvisiblePlugin","containerSizeRatio","overwriteStyles","chessboard","checkVersion","phase","RoomPhase","Connected","_WindowManager","isCreated","initManager","Boolean","verbose","playground","sizer","mainViewElement","className","setupWrapper","classList","style2","textContent","ensureAttributes","AppManager","observePlaygroundSize","CursorManager","bindMainView","getOwnPropertyDescriptor","defineProperty","disableCameraTransform","disable","convertToPointInWorld","setCameraBound","getInvisiblePlugin","setWritable","createInvisiblePlugin","register","AppManagerNotInitError","ParamsInvalidError","AppCreateError","setupScenePath","addApp","appScenePath","putScenes","closeApp","onAppDestroy","ViewMode","onDestroy","_destroy","containerResizeObserver","disconnect","sceneSrc","ppt","WhiteVersion","WhiteWebSDKInvalidError","isNull","isObject","updateSizer","contentRect","observe","toggle","AppDocsViewer","AppMediaPlayer","BuiltinApps","DocsViewer","MediaPlayer"],"mappings":"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"}