@netless/telebox-insider 1.0.0-alpha.2 → 1.0.0-alpha.20

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":"telebox-insider.es.js","sources":["../src/TeleBox/constants.ts","../src/utils.ts","../src/TeleTitleBar/DefaultTitleBar/index.ts","../src/TeleStage/index.ts","../src/TeleBox/index.ts","../src/TeleBoxManager/constants.ts","../src/TeleBoxCollector/index.ts","../src/TeleBoxManager/MaxTitleBar/index.ts","../src/TeleBoxManager/index.ts"],"sourcesContent":["export enum TELE_BOX_COLOR_SCHEME {\n Light = \"light\",\n Dark = \"dark\",\n Auto = \"auto\",\n}\n\nexport enum TELE_BOX_STATE {\n Normal = \"normal\",\n Minimized = \"minimized\",\n Maximized = \"maximized\",\n}\n\nexport enum TELE_BOX_EVENT {\n DarkMode = \"dark_mode\",\n PrefersColorScheme = \"prefers_color_scheme\",\n Close = \"close\",\n Focus = \"focus\",\n Blur = \"blur\",\n IntrinsicMove = \"intrinsic_move\",\n IntrinsicResize = \"intrinsic_resize\",\n ZIndex = \"z_index\",\n State = \"state\",\n Minimized = \"minimized\",\n Maximized = \"maximized\",\n Readonly = \"readonly\",\n Destroyed = \"destroyed\",\n}\n\nexport enum TELE_BOX_DELEGATE_EVENT {\n Close = \"close\",\n Maximize = \"maximize\",\n Minimize = \"minimize\",\n}\n\nexport enum TELE_BOX_RESIZE_HANDLE {\n North = \"n\",\n South = \"s\",\n West = \"w\",\n East = \"e\",\n NorthWest = \"nw\",\n NorthEast = \"ne\",\n SouthEast = \"se\",\n SouthWest = \"sw\",\n}\n\nexport const TeleBoxDragHandleType = \"dh\";\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function preventEvent(ev: Event): void {\n ev.stopPropagation();\n if (ev.cancelable) {\n ev.preventDefault();\n }\n}\n\nexport function flattenEvent(ev: MouseEvent | TouchEvent): MouseEvent | Touch {\n return (ev as TouchEvent).touches\n ? (ev as TouchEvent).touches[0]\n : (ev as MouseEvent);\n}\n\nexport function getRandomInt(min: number, max: number): number {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\nlet defaultBoxCount = 1;\n\nexport function getBoxDefaultName(): string {\n return `New Box ${defaultBoxCount++}`;\n}\n\nexport function identity<TValue>(value: TValue): TValue {\n return value;\n}\n\nexport function isTruthy<TValue>(value: TValue): boolean {\n return Boolean(value);\n}\n\nexport function isFalsy<TValue>(value: TValue): boolean {\n return !value;\n}\n","import \"./style.scss\";\n\nimport { SideEffectManager } from \"side-effect-manager\";\n\nimport {\n TeleBoxDragHandleType,\n TELE_BOX_DELEGATE_EVENT,\n TELE_BOX_STATE,\n} from \"../../TeleBox/constants\";\nimport type { TeleBoxState } from \"../../TeleBox/typings\";\nimport type {\n TeleTitleBar,\n TeleTitleBarConfig,\n TeleTitleBarEvent,\n} from \"../typings\";\nimport { preventEvent } from \"../../utils\";\nimport { Val } from \"value-enhancer\";\n\nexport type DefaultTitleBarButton = TeleTitleBarEvent & {\n readonly iconClassName: string;\n readonly isActive?: (state: TeleBoxState) => boolean;\n};\n\nexport interface DefaultTitleBarConfig extends TeleTitleBarConfig {\n buttons?: ReadonlyArray<DefaultTitleBarButton>;\n}\n\nexport class DefaultTitleBar implements TeleTitleBar {\n public constructor({\n readonly$,\n state$,\n title = \"\",\n buttons,\n onEvent,\n onDragStart,\n namespace = \"telebox\",\n }: DefaultTitleBarConfig) {\n this.readonly$ = readonly$;\n this.state$ = state$;\n this.title$ = new Val(title);\n this.onEvent = onEvent;\n this.onDragStart = onDragStart;\n this.namespace = namespace;\n\n this.buttons = buttons || [\n {\n type: TELE_BOX_DELEGATE_EVENT.Minimize,\n iconClassName: this.wrapClassName(\"titlebar-icon-minimize\"),\n },\n {\n type: TELE_BOX_DELEGATE_EVENT.Maximize,\n iconClassName: this.wrapClassName(\"titlebar-icon-maximize\"),\n isActive: (state) => state === TELE_BOX_STATE.Maximized,\n },\n {\n type: TELE_BOX_DELEGATE_EVENT.Close,\n iconClassName: this.wrapClassName(\"titlebar-icon-close\"),\n },\n ];\n\n this.$dragArea = this.renderDragArea();\n }\n\n public readonly namespace: string;\n\n public $titleBar: HTMLElement | undefined;\n\n public $dragArea: HTMLElement;\n\n public get title(): string {\n return this.title$.value;\n }\n\n public setTitle(title: string): void {\n this.title$.setValue(title);\n }\n\n public render(): HTMLElement {\n if (!this.$titleBar) {\n this.$titleBar = document.createElement(\"div\");\n this.$titleBar.className = this.wrapClassName(\"titlebar\");\n\n const $titleArea = document.createElement(\"div\");\n $titleArea.className = this.wrapClassName(\"title-area\");\n $titleArea.dataset.teleBoxHandle = TeleBoxDragHandleType;\n\n const $title = document.createElement(\"h1\");\n $title.className = this.wrapClassName(\"title\");\n $title.dataset.teleBoxHandle = TeleBoxDragHandleType;\n\n $titleArea.appendChild($title);\n $titleArea.appendChild(this.$dragArea);\n\n const $buttonsContainer = document.createElement(\"div\");\n $buttonsContainer.className = this.wrapClassName(\"titlebar-btns\");\n\n this.buttons.forEach(({ iconClassName }, i) => {\n const teleTitleBarBtnIndex = String(i);\n\n const $btn = document.createElement(\"button\");\n $btn.className = `${this.wrapClassName(\n \"titlebar-btn\"\n )} ${iconClassName}`;\n $btn.dataset.teleTitleBarBtnIndex = teleTitleBarBtnIndex;\n $btn.dataset.teleTitleBarNoDblClick = \"true\";\n $buttonsContainer.appendChild($btn);\n });\n\n this.sideEffect.addDisposer(\n this.title$.subscribe((title) => {\n $title.textContent = title;\n $title.title = title;\n }),\n \"render-title\"\n );\n\n this.sideEffect.addDisposer(\n this.state$.subscribe((state) => {\n this.buttons.forEach((btn, i) => {\n if (btn.isActive) {\n $buttonsContainer.children[i]?.classList.toggle(\n \"is-active\",\n btn.isActive(state)\n );\n }\n });\n }),\n \"render-state-btns\"\n );\n\n this.sideEffect.addEventListener(\n $buttonsContainer,\n \"click\",\n (ev) => {\n if (this.readonly$.value) {\n return;\n }\n const target = ev.target as HTMLElement;\n const teleTitleBarBtnIndex = Number(\n target.dataset?.teleTitleBarBtnIndex\n );\n if (\n !Number.isNaN(teleTitleBarBtnIndex) &&\n teleTitleBarBtnIndex < this.buttons.length\n ) {\n preventEvent(ev);\n const btn = this.buttons[teleTitleBarBtnIndex];\n if (this.onEvent) {\n this.onEvent({\n type: btn.type,\n value: btn.value,\n } as TeleTitleBarEvent);\n }\n }\n },\n {},\n \"render-btns-container-click\"\n );\n\n this.$titleBar.appendChild($titleArea);\n this.$titleBar.appendChild($buttonsContainer);\n }\n\n return this.$titleBar;\n }\n\n public renderDragArea(): HTMLElement {\n const $dragArea = document.createElement(\"div\");\n $dragArea.className = this.wrapClassName(\"drag-area\");\n $dragArea.dataset.teleBoxHandle = TeleBoxDragHandleType;\n this.sideEffect.addEventListener(\n $dragArea,\n \"mousedown\",\n this.handleTitleBarClick\n );\n this.sideEffect.addEventListener(\n $dragArea,\n \"touchstart\",\n this.handleTitleBarTouch,\n { passive: true }\n );\n return $dragArea;\n }\n\n public dragHandle(): HTMLElement | undefined {\n return this.$titleBar;\n }\n\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n\n public destroy(): void {\n this.sideEffect.flushAll();\n if (this.$titleBar) {\n this.$titleBar = void 0;\n this.onDragStart = void 0;\n this.onEvent = void 0;\n }\n }\n\n public onEvent?: TeleTitleBarConfig[\"onEvent\"];\n\n public onDragStart?: TeleTitleBarConfig[\"onDragStart\"];\n\n protected readonly$: TeleTitleBarConfig[\"readonly$\"];\n\n protected title$: Val<string>;\n\n protected buttons: ReadonlyArray<DefaultTitleBarButton>;\n\n protected state$: TeleTitleBarConfig[\"state$\"];\n\n protected sideEffect = new SideEffectManager();\n\n protected lastTitleBarClick = {\n timestamp: 0,\n clientX: -100,\n clientY: -100,\n };\n\n protected handleTitleBarClick = (ev: MouseEvent): void => {\n if (this.readonly$.value) {\n return;\n }\n\n if (ev.button !== 0) {\n return; // Not left mouse\n }\n\n if ((ev.target as HTMLElement).dataset?.teleTitleBarNoDblClick) {\n return; // btns\n }\n\n preventEvent(ev);\n\n const now = Date.now();\n if (now - this.lastTitleBarClick.timestamp <= 500) {\n if (\n Math.abs(ev.clientX - this.lastTitleBarClick.clientX) <= 5 &&\n Math.abs(ev.clientY - this.lastTitleBarClick.clientY) <= 5\n ) {\n // double click\n if (this.onEvent) {\n this.onEvent({ type: TELE_BOX_DELEGATE_EVENT.Maximize });\n }\n }\n } else if (this.onDragStart) {\n this.onDragStart(ev);\n }\n this.lastTitleBarClick.timestamp = now;\n this.lastTitleBarClick.clientX = ev.clientX;\n this.lastTitleBarClick.clientY = ev.clientY;\n };\n\n protected lastTitleBarTouch = {\n timestamp: 0,\n clientX: -100,\n clientY: -100,\n };\n\n protected handleTitleBarTouch = (ev: TouchEvent): void => {\n if (this.readonly$.value) {\n return;\n }\n\n if ((ev.target as HTMLElement).dataset?.teleTitleBarNoDblClick) {\n return; // btns\n }\n\n preventEvent(ev);\n\n const now = Date.now();\n const {\n clientX = this.lastTitleBarTouch.clientX + 100,\n clientY = this.lastTitleBarTouch.clientY + 100,\n } = ev.touches[0] || {};\n\n if (now - this.lastTitleBarTouch.timestamp <= 500) {\n if (\n Math.abs(clientX - this.lastTitleBarTouch.clientX) <= 10 &&\n Math.abs(clientY - this.lastTitleBarTouch.clientY) <= 10\n ) {\n // double click\n if (this.onEvent) {\n this.onEvent({ type: TELE_BOX_DELEGATE_EVENT.Maximize });\n }\n }\n } else if (this.onDragStart) {\n this.onDragStart(ev);\n }\n this.lastTitleBarTouch.timestamp = now;\n this.lastTitleBarTouch.clientX = clientX;\n this.lastTitleBarTouch.clientY = clientY;\n };\n}\n","import \"./style.scss\";\n\nimport shallowequal from \"shallowequal\";\nimport { SideEffectManager } from \"side-effect-manager\";\nimport type { ReadonlyVal } from \"value-enhancer\";\nimport { combine } from \"value-enhancer\";\nimport type { TeleBoxRect } from \"../TeleBox/typings\";\n\nexport interface TeleStageConfig {\n namespace: string;\n root$: ReadonlyVal<HTMLElement | null>;\n rootRect$: ReadonlyVal<TeleBoxRect>;\n ratio$: ReadonlyVal<number>;\n highlightStage$: ReadonlyVal<boolean>;\n}\n\nexport class TeleStage {\n private readonly _sideEffect = new SideEffectManager();\n\n public readonly namespace: string;\n public readonly stageRect$: ReadonlyVal<TeleBoxRect>;\n public readonly highlightStage$: ReadonlyVal<boolean>;\n\n public $boxStage?: HTMLDivElement;\n\n constructor({\n namespace,\n rootRect$,\n ratio$,\n highlightStage$,\n root$,\n }: TeleStageConfig) {\n this.namespace = namespace;\n this.highlightStage$ = highlightStage$;\n\n this.stageRect$ = combine(\n [rootRect$, highlightStage$, ratio$],\n ([rootRect, highlightStage, ratio]) => {\n if (!highlightStage) {\n return rootRect;\n }\n\n if (ratio <= 0 || rootRect.width <= 0 || rootRect.height <= 0) {\n return rootRect;\n }\n\n const preferredHeight = rootRect.width * ratio;\n if (preferredHeight === rootRect.height) {\n return rootRect;\n }\n\n if (preferredHeight < rootRect.height) {\n return {\n x: 0,\n y: (rootRect.height - preferredHeight) / 2,\n width: rootRect.width,\n height: preferredHeight,\n };\n }\n\n const preferredWidth = rootRect.height / ratio;\n return {\n x: (rootRect.width - preferredWidth) / 2,\n y: 0,\n width: preferredWidth,\n height: rootRect.height,\n };\n },\n { compare: shallowequal }\n );\n\n this._sideEffect.addDisposer(\n combine([root$, highlightStage$]).subscribe(\n ([root, highlightStage]) => {\n if (root && highlightStage) {\n root.appendChild(this.render());\n } else if (this.$boxStage?.parentNode) {\n this.$boxStage.remove();\n }\n }\n )\n );\n }\n\n private render(): HTMLDivElement {\n if (this.$boxStage) {\n return this.$boxStage;\n }\n\n const $boxStage = document.createElement(\"div\");\n $boxStage.className = this.wrapClassName(\"box-stage-container\");\n const $boxStageMask1 = document.createElement(\"div\");\n $boxStageMask1.className = this.wrapClassName(\"box-stage-mask\");\n const $boxStageMask2 = document.createElement(\"div\");\n $boxStageMask2.className = this.wrapClassName(\"box-stage-mask\");\n const $boxStageFrame = document.createElement(\"div\");\n $boxStageFrame.className = this.wrapClassName(\"box-stage-frame\");\n\n const [\n $topLeftCorner,\n $topRightCorner,\n $bottomLeftCorner,\n $bottomRightCorner,\n ] = [\n \"M0 8V0h8v2H2v6H0Z\",\n \"M8 8V0H0v2h6v6h2Z\",\n \"M0 0v8h8V6H2V0H0Z\",\n \"M8 0v8H0V6h6V0h2Z\",\n ].map((path, i) => {\n const $svg = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"svg\"\n );\n $svg.setAttribute(\"viewBox\", \"0 0 8 8\");\n $svg.setAttribute(\n \"class\",\n `${this.wrapClassName(\"box-stage-frame-corner\")} is-${i}`\n );\n const $path = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"path\"\n );\n $path.setAttribute(\"d\", path);\n $path.setAttribute(\"fill\", \"#3381FF\");\n $svg.appendChild($path);\n return $svg;\n });\n\n $boxStageFrame.appendChild($topLeftCorner);\n $boxStageFrame.appendChild($bottomLeftCorner);\n $boxStageFrame.appendChild($topRightCorner);\n $boxStageFrame.appendChild($bottomRightCorner);\n\n $boxStage.appendChild($boxStageMask1);\n $boxStage.appendChild($boxStageFrame);\n $boxStage.appendChild($boxStageMask2);\n\n this._sideEffect.addDisposer(\n this.highlightStage$.subscribe((highlightStage) => {\n $boxStage.classList.toggle(\"is-active\", highlightStage);\n })\n );\n\n this._sideEffect.addDisposer(\n combine([this.highlightStage$, this.stageRect$]).subscribe(\n ([highlightStage, stageRect]) => {\n if (!highlightStage) {\n return;\n }\n if (stageRect.x > 0) {\n $boxStage.style.flexDirection = \"row\";\n $boxStageMask1.style.width = `${stageRect.x}px`;\n $boxStageMask1.style.height = \"\";\n $boxStageMask2.style.width = `${stageRect.x}px`;\n $boxStageMask2.style.height = \"\";\n } else if (stageRect.y > 0) {\n $boxStage.style.flexDirection = \"column\";\n $boxStageMask1.style.width = \"\";\n $boxStageMask1.style.height = `${stageRect.y}px`;\n $boxStageMask2.style.width = \"\";\n $boxStageMask2.style.height = `${stageRect.y}px`;\n }\n }\n )\n );\n\n this.$boxStage = $boxStage;\n return $boxStage;\n }\n\n public destroy(): void {\n this._sideEffect.flushAll();\n }\n\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n}\n","import \"./style.scss\";\n\nimport Emittery from \"emittery\";\nimport styler from \"stylefire\";\nimport shallowequal from \"shallowequal\";\nimport { genUID, SideEffectManager } from \"side-effect-manager\";\nimport type {\n ReadonlyVal,\n ReadonlyValEnhancedResult,\n ValEnhancedResult,\n} from \"value-enhancer\";\nimport { withValueEnhancer } from \"value-enhancer\";\nimport { combine, Val, withReadonlyValueEnhancer } from \"value-enhancer\";\nimport type { TeleTitleBar } from \"../TeleTitleBar\";\nimport { DefaultTitleBar } from \"../TeleTitleBar\";\nimport { ResizeObserver as ResizeObserverPolyfill } from \"@juggle/resize-observer\";\nimport {\n clamp,\n flattenEvent,\n getBoxDefaultName,\n isFalsy,\n isTruthy,\n preventEvent,\n} from \"../utils\";\nimport {\n TELE_BOX_EVENT,\n TELE_BOX_STATE,\n TELE_BOX_RESIZE_HANDLE,\n} from \"./constants\";\nimport type {\n TeleBoxConfig,\n TeleBoxHandleType,\n TeleBoxState,\n TeleBoxCoord,\n TeleBoxSize,\n TeleBoxEventConfig,\n TeleBoxEvent,\n TeleBoxDelegateEventConfig,\n TeleBoxRect,\n} from \"./typings\";\nimport { TeleStage } from \"../TeleStage\";\n\nexport * from \"./constants\";\nexport * from \"./typings\";\n\nconst ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;\n\ntype RequiredTeleBoxConfig = Required<TeleBoxConfig>;\n\ntype ValConfig = {\n title: Val<RequiredTeleBoxConfig[\"title\"], boolean>;\n visible: Val<RequiredTeleBoxConfig[\"visible\"], boolean>;\n resizable: Val<RequiredTeleBoxConfig[\"resizable\"], boolean>;\n draggable: Val<RequiredTeleBoxConfig[\"draggable\"], boolean>;\n ratio: Val<RequiredTeleBoxConfig[\"ratio\"], boolean>;\n};\n\ntype ReadonlyValConfig = {\n darkMode: RequiredTeleBoxConfig[\"darkMode$\"];\n fence: RequiredTeleBoxConfig[\"fence$\"];\n minimized: RequiredTeleBoxConfig[\"minimized$\"];\n maximized: RequiredTeleBoxConfig[\"maximized$\"];\n readonly: RequiredTeleBoxConfig[\"readonly$\"];\n rootRect: RequiredTeleBoxConfig[\"rootRect$\"];\n managerStageRect: RequiredTeleBoxConfig[\"managerStageRect$\"];\n collectorRect: RequiredTeleBoxConfig[\"collectorRect$\"];\n\n zIndex: Val<RequiredTeleBoxConfig[\"zIndex\"], boolean>;\n focus: Val<RequiredTeleBoxConfig[\"focus\"], boolean>;\n\n $userContent: Val<TeleBoxConfig[\"content\"], boolean>;\n $userFooter: Val<TeleBoxConfig[\"footer\"], boolean>;\n $userStyles: Val<TeleBoxConfig[\"styles\"], boolean>;\n\n minSize: Val<TeleBoxSize, boolean>;\n intrinsicSize: Val<TeleBoxSize, boolean>;\n intrinsicCoord: Val<TeleBoxCoord, boolean>;\n pxMinSize: ReadonlyVal<TeleBoxSize, boolean>;\n pxIntrinsicSize: ReadonlyVal<TeleBoxSize, boolean>;\n pxIntrinsicCoord: ReadonlyVal<TeleBoxCoord, boolean>;\n state: ReadonlyVal<TeleBoxState, boolean>;\n highlightStage: ReadonlyVal<boolean, boolean>;\n boxHighlightStage: Val<boolean | null, boolean>;\n contentRect: Val<TeleBoxRect>;\n contentStageRect: ReadonlyVal<TeleBoxRect | null>;\n};\n\ntype CombinedValEnhancedResult = ReadonlyValEnhancedResult<ReadonlyValConfig> &\n ValEnhancedResult<ValConfig>;\n\nexport interface TeleBox extends CombinedValEnhancedResult {}\n\nexport class TeleBox {\n public constructor({\n id = genUID(),\n title = getBoxDefaultName(),\n namespace = \"telebox\",\n visible = true,\n width = 0.5,\n height = 0.5,\n minWidth = 0,\n minHeight = 0,\n x = 0.1,\n y = 0.1,\n resizable = true,\n draggable = true,\n ratio = -1,\n focus = false,\n zIndex = 100,\n titleBar,\n content,\n footer,\n styles,\n highlightStage = null,\n darkMode$,\n fence$,\n minimized$,\n maximized$,\n readonly$,\n root$,\n rootRect$,\n managerStageRect$,\n stageRatio$,\n collectorRect$,\n managerHighlightStage$,\n }: TeleBoxConfig) {\n this._sideEffect = new SideEffectManager();\n\n this.id = id;\n this.namespace = namespace;\n\n const title$ = new Val(title);\n const visible$ = new Val(visible);\n const resizable$ = new Val(resizable);\n const draggable$ = new Val(draggable);\n const ratio$ = new Val(ratio);\n const zIndex$ = new Val(zIndex);\n const focus$ = new Val(focus);\n const $userContent$ = new Val(content);\n const $userFooter$ = new Val(footer);\n const $userStyles$ = new Val(styles);\n\n const state$ = combine(\n [minimized$, maximized$],\n ([minimized, maximized]): TeleBoxState =>\n minimized\n ? TELE_BOX_STATE.Minimized\n : maximized\n ? TELE_BOX_STATE.Maximized\n : TELE_BOX_STATE.Normal\n );\n\n const minSize$ = new Val(\n {\n width: clamp(minWidth, 0, 1),\n height: clamp(minHeight, 0, 1),\n },\n { compare: shallowequal }\n );\n\n const pxMinSize$ = combine(\n [minSize$, managerStageRect$],\n ([minSize, managerStageRect]) => ({\n width: minSize.width * managerStageRect.width,\n height: minSize.height * managerStageRect.height,\n }),\n { compare: shallowequal }\n );\n\n const intrinsicSize$ = new Val(\n { width, height },\n { compare: shallowequal }\n );\n\n this._sideEffect.addDisposer(\n // check intrinsicSize overflow\n minSize$.reaction((minSize, skipUpdate) => {\n intrinsicSize$.setValue(\n {\n width: Math.max(width, minSize.width),\n height: Math.max(height, minSize.height),\n },\n skipUpdate\n );\n })\n );\n\n const intrinsicCoord$ = new Val({ x, y }, { compare: shallowequal });\n\n const pxIntrinsicSize$ = combine(\n [intrinsicSize$, managerStageRect$],\n ([size, managerStageRect]) => ({\n width: managerStageRect.width * size.width,\n height: managerStageRect.height * size.height,\n }),\n { compare: shallowequal }\n );\n\n const pxIntrinsicCoord$ = combine(\n [intrinsicCoord$, managerStageRect$],\n ([intrinsicCoord, managerStageRect]) => ({\n x:\n intrinsicCoord.x * managerStageRect.width +\n managerStageRect.x,\n y:\n intrinsicCoord.y * managerStageRect.height +\n managerStageRect.y,\n }),\n { compare: shallowequal }\n );\n\n const boxHighlightStage$ = new Val<boolean | null, boolean>(\n highlightStage\n );\n\n const highlightStage$ = combine(\n [maximized$, boxHighlightStage$, managerHighlightStage$],\n ([maximized, boxHighlightStage, managerHighlightStage]) =>\n boxHighlightStage === null\n ? managerHighlightStage && maximized\n : boxHighlightStage\n );\n\n const contentRoot$ = new Val<HTMLElement | null>(null);\n\n const contentRect$ = new Val<TeleBoxRect>(rootRect$.value, {\n compare: shallowequal,\n });\n\n const teleStage = new TeleStage({\n namespace,\n root$: contentRoot$,\n rootRect$: contentRect$,\n ratio$: stageRatio$,\n highlightStage$,\n });\n this._sideEffect.addDisposer(() => teleStage.destroy());\n\n const readonlyValConfig: ReadonlyValConfig = {\n darkMode: darkMode$,\n fence: fence$,\n minimized: minimized$,\n maximized: maximized$,\n readonly: readonly$,\n rootRect: rootRect$,\n managerStageRect: managerStageRect$,\n collectorRect: collectorRect$,\n\n zIndex: zIndex$,\n focus: focus$,\n\n $userContent: $userContent$,\n $userFooter: $userFooter$,\n $userStyles: $userStyles$,\n\n state: state$,\n minSize: minSize$,\n pxMinSize: pxMinSize$,\n intrinsicSize: intrinsicSize$,\n intrinsicCoord: intrinsicCoord$,\n pxIntrinsicSize: pxIntrinsicSize$,\n pxIntrinsicCoord: pxIntrinsicCoord$,\n highlightStage: highlightStage$,\n boxHighlightStage: boxHighlightStage$,\n contentRect: contentRect$,\n contentStageRect: teleStage.stageRect$,\n };\n\n withReadonlyValueEnhancer(this, readonlyValConfig);\n\n const valConfig: ValConfig = {\n title: title$,\n visible: visible$,\n resizable: resizable$,\n draggable: draggable$,\n ratio: ratio$,\n };\n\n withValueEnhancer(this, valConfig);\n\n this.titleBar =\n titleBar ||\n new DefaultTitleBar({\n readonly$: readonly$,\n state$: state$,\n title: title$.value,\n namespace: this.namespace,\n onDragStart: (event) => this._handleTrackStart?.(event),\n onEvent: (event) => this._delegateEvents.emit(event.type),\n });\n\n this._sideEffect.addDisposer(\n ratio$.subscribe((ratio) => {\n if (ratio > 0) {\n this.transform(\n pxIntrinsicCoord$.value.x,\n pxIntrinsicCoord$.value.y,\n pxIntrinsicSize$.value.width,\n pxIntrinsicSize$.value.height,\n true\n );\n }\n })\n );\n\n this._sideEffect.addDisposer(\n fence$.subscribe((fence) => {\n if (fence) {\n this.move(\n pxIntrinsicCoord$.value.x,\n pxIntrinsicCoord$.value.y,\n true\n );\n }\n })\n );\n\n this.$box = this.render();\n contentRoot$.setValue(this.$content.parentElement);\n\n const watchValEvent = <E extends TeleBoxEvent>(\n val: ReadonlyVal<TeleBoxEventConfig[E], boolean>,\n event: E\n ) => {\n this._sideEffect.addDisposer(\n val.reaction((v, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit<any>(event, v);\n }\n })\n );\n };\n\n watchValEvent(darkMode$, TELE_BOX_EVENT.DarkMode);\n watchValEvent(readonly$, TELE_BOX_EVENT.Readonly);\n watchValEvent(zIndex$, TELE_BOX_EVENT.ZIndex);\n watchValEvent(minimized$, TELE_BOX_EVENT.Minimized);\n watchValEvent(maximized$, TELE_BOX_EVENT.Maximized);\n watchValEvent(state$, TELE_BOX_EVENT.State);\n watchValEvent(intrinsicSize$, TELE_BOX_EVENT.IntrinsicResize);\n watchValEvent(intrinsicCoord$, TELE_BOX_EVENT.IntrinsicMove);\n\n this._sideEffect.addDisposer([\n visible$.reaction((visible, skipUpdate) => {\n if (!skipUpdate && !visible) {\n this.events.emit(TELE_BOX_EVENT.Close);\n }\n }),\n focus$.reaction((focus, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n focus ? TELE_BOX_EVENT.Focus : TELE_BOX_EVENT.Blur\n );\n }\n }),\n root$.subscribe((root) => {\n if (root) {\n root.appendChild(this.$box);\n } else if (this.$box.parentNode) {\n this.$box.remove();\n }\n }),\n ]);\n }\n\n public readonly id: string;\n\n /** ClassName Prefix. For CSS styling. Default \"telebox\" */\n public readonly namespace: string;\n\n public readonly events = new Emittery<\n TeleBoxEventConfig,\n TeleBoxEventConfig\n >();\n\n public readonly _delegateEvents = new Emittery<\n TeleBoxDelegateEventConfig,\n TeleBoxDelegateEventConfig\n >();\n\n protected _sideEffect: SideEffectManager;\n\n public titleBar: TeleTitleBar;\n\n /** Minimum box width relative to stage area. 0~1. Default 0. */\n public get minWidth(): number {\n return this._minSize$.value.width;\n }\n\n /** Minimum box height relative to stage area. 0~1. Default 0. */\n public get minHeight(): number {\n return this._minSize$.value.height;\n }\n\n /**\n * @param minWidth Minimum box width relative to stage area. 0~1.\n * @returns this\n */\n public setMinWidth(minWidth: number, skipUpdate = false): void {\n this._minSize$.setValue(\n { width: minWidth, height: this.minHeight },\n skipUpdate\n );\n }\n\n /**\n * @param minHeight Minimum box height relative to container element. 0~1.\n * @returns this\n */\n public setMinHeight(minHeight: number, skipUpdate = false): void {\n this._minSize$.setValue(\n { width: this.minWidth, height: minHeight },\n skipUpdate\n );\n }\n\n /**\n * Resize box.\n * @param width Box width relative to container element. 0~1.\n * @param height Box height relative to container element. 0~1.\n * @param skipUpdate Skip emitting event.\n * @returns this\n */\n public resize(width: number, height: number, skipUpdate = false): void {\n this._intrinsicSize$.setValue(\n {\n width: Math.max(width, this.minWidth),\n height: Math.max(height, this.minHeight),\n },\n skipUpdate\n );\n }\n\n /** Intrinsic box x position relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicX(): number {\n return this._intrinsicCoord$.value.x;\n }\n\n /** Intrinsic box y position relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicY(): number {\n return this._intrinsicCoord$.value.y;\n }\n\n /** Intrinsic box width relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicWidth(): number {\n return this._intrinsicSize$.value.width;\n }\n\n /** Intrinsic box height relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicHeight(): number {\n return this._intrinsicSize$.value.height;\n }\n\n /**\n * Move box position.\n * @param x x position in px.\n * @param y y position in px.\n * @param skipUpdate Skip emitting event.\n * @returns this\n */\n protected move(x: number, y: number, skipUpdate = false): void {\n let safeX: number;\n let safeY: number;\n const managerStageRect = this.managerStageRect;\n const pxIntrinsicSize = this.pxIntrinsicSize;\n\n if (this.fence) {\n safeX = clamp(\n x,\n managerStageRect.x,\n managerStageRect.x +\n managerStageRect.width -\n pxIntrinsicSize.width\n );\n safeY = clamp(\n y,\n managerStageRect.y,\n managerStageRect.y +\n managerStageRect.height -\n pxIntrinsicSize.height\n );\n } else {\n const rootRect = this.rootRect;\n safeX = clamp(\n x,\n rootRect.x - pxIntrinsicSize.width + 20,\n rootRect.x + rootRect.width - 20\n );\n safeY = clamp(y, rootRect.y, rootRect.y + rootRect.height - 20);\n }\n\n this._intrinsicCoord$.setValue(\n {\n x: (safeX - managerStageRect.x) / managerStageRect.width,\n y: (safeY - managerStageRect.y) / managerStageRect.height,\n },\n skipUpdate\n );\n }\n\n /**\n * Resize + Move, with respect to fixed ratio.\n * @param x x position in px.\n * @param y y position in px.\n * @param width Box width in px.\n * @param height Box height in px.\n * @param skipUpdate Skip emitting event.\n * @returns this\n */\n protected transform(\n x: number,\n y: number,\n width: number,\n height: number,\n skipUpdate = false\n ): void {\n const managerStageRect = this.managerStageRect;\n const rootRect = this.rootRect;\n\n width = Math.max(width, this.pxMinSize.width);\n height = Math.max(height, this.pxMinSize.height);\n\n if (this.ratio > 0) {\n const newHeight = this.ratio * width;\n if (y !== this.pxIntrinsicCoord.y) {\n y -= newHeight - height;\n }\n height = newHeight;\n }\n\n if (y < rootRect.y) {\n y = rootRect.y;\n height = this.pxIntrinsicSize.height;\n }\n\n this.move(x, y, skipUpdate);\n this._intrinsicSize$.setValue(\n {\n width: width / managerStageRect.width,\n height: height / managerStageRect.height,\n },\n skipUpdate\n );\n }\n\n /**\n * Mount dom to box content.\n */\n public mountContent(content: HTMLElement): void {\n this._$userContent$.setValue(content);\n }\n\n /**\n * Unmount content from the box.\n */\n public unmountContent(): void {\n this._$userContent$.setValue(undefined);\n }\n\n /**\n * Mount dom to box Footer.\n */\n public mountFooter(footer: HTMLElement): void {\n this._$userFooter$.setValue(footer);\n }\n\n /**\n * Unmount Footer from the box.\n */\n public unmountFooter(): void {\n this._$userFooter$.setValue(undefined);\n }\n\n public getUserStyles(): HTMLStyleElement | undefined {\n return this.$userStyles;\n }\n\n public mountStyles(styles: string | HTMLStyleElement): void {\n let $styles: HTMLStyleElement;\n if (typeof styles === \"string\") {\n $styles = document.createElement(\"style\");\n $styles.textContent = styles;\n } else {\n $styles = styles;\n }\n this._$userStyles$.setValue($styles);\n }\n\n public unmountStyles(): void {\n this._$userStyles$.setValue(undefined);\n }\n\n /** Show stage frame and grey-out the non-stage area. Inherit setting from manager if null. */\n setHighlightStage(highlightStage: boolean | null): void {\n this._boxHighlightStage$.setValue(highlightStage);\n }\n\n /** DOM of the box */\n public $box: HTMLElement;\n\n /** DOM of the box content */\n public $content!: HTMLElement;\n\n /** DOM of the box title bar */\n public $titleBar!: HTMLElement;\n\n /** DOM of the box footer */\n public $footer!: HTMLElement;\n\n protected render(): HTMLElement {\n if (this.$box) {\n return this.$box;\n }\n\n this.$box = document.createElement(\"div\");\n\n this.$box.classList.add(this.wrapClassName(\"box\"));\n\n const bindClassName = <TValue>(\n el: Element,\n val: ReadonlyVal<TValue, boolean>,\n className: string,\n predicate: (value: TValue) => boolean = isTruthy\n ): string => {\n return this._sideEffect.add(() => {\n const wrappedClassName = this.wrapClassName(className);\n return val.subscribe((value) => {\n el.classList.toggle(wrappedClassName, predicate(value));\n });\n });\n };\n\n bindClassName(this.$box, this._readonly$, \"readonly\");\n bindClassName(this.$box, this._draggable$, \"no-drag\", isFalsy);\n bindClassName(this.$box, this._resizable$, \"no-resize\", isFalsy);\n bindClassName(this.$box, this._focus$, \"blur\", isFalsy);\n bindClassName(this.$box, this._darkMode$, \"color-scheme-dark\");\n bindClassName(\n this.$box,\n this._darkMode$,\n \"color-scheme-light\",\n isFalsy\n );\n\n this._sideEffect.add(() => {\n const minimizedClassName = this.wrapClassName(\"minimized\");\n const maximizedClassName = this.wrapClassName(\"maximized\");\n const MAXIMIZED_TIMER_ID = \"box-maximized-timer\";\n\n return this._state$.subscribe((state) => {\n this.$box.classList.toggle(\n minimizedClassName,\n state === TELE_BOX_STATE.Minimized\n );\n\n if (state === TELE_BOX_STATE.Maximized) {\n this._sideEffect.flush(MAXIMIZED_TIMER_ID);\n this.$box.classList.toggle(maximizedClassName, true);\n } else {\n // delay so that transition won't be triggered\n this._sideEffect.setTimeout(\n () => {\n this.$box.classList.toggle(\n maximizedClassName,\n false\n );\n },\n 0,\n MAXIMIZED_TIMER_ID\n );\n }\n });\n });\n\n this._sideEffect.addDisposer(\n this._visible$.subscribe((visible) => {\n this.$box.style.display = visible ? \"block\" : \"none\";\n })\n );\n\n this._sideEffect.addDisposer(\n this._zIndex$.subscribe((zIndex) => {\n this.$box.style.zIndex = String(zIndex);\n })\n );\n\n this.$box.dataset.teleBoxID = this.id;\n\n const boxStyler = styler(this.$box);\n\n const boxStyles$ = combine(\n [\n this._maximized$,\n this._minimized$,\n this._pxIntrinsicSize$,\n this._pxIntrinsicCoord$,\n this._collectorRect$,\n ],\n ([\n maximized,\n minimized,\n pxIntrinsicSize,\n pxIntrinsicCoord,\n collectorRect,\n ]) => {\n if (minimized && collectorRect) {\n return {\n x: collectorRect.x + collectorRect.width / 2,\n y: collectorRect.y + collectorRect.height / 2,\n width: pxIntrinsicSize.width + \"px\",\n height: pxIntrinsicSize.height + \"px\",\n scaleX: collectorRect.width / pxIntrinsicSize.width,\n scaleY: collectorRect.height / pxIntrinsicSize.height,\n };\n }\n if (maximized) {\n return {\n x: 0,\n y: 0,\n width: \"100%\",\n height: \"100%\",\n scaleX: 1,\n scaleY: 1,\n };\n }\n return {\n x: pxIntrinsicCoord.x,\n y: pxIntrinsicCoord.y,\n width: pxIntrinsicSize.width + \"px\",\n height: pxIntrinsicSize.height + \"px\",\n scaleX: 1,\n scaleY: 1,\n };\n },\n { compare: shallowequal }\n );\n\n const boxStyles = boxStyles$.value;\n this.$box.style.width = boxStyles.width;\n this.$box.style.height = boxStyles.height;\n // Add 10px offset on first frame\n // which creates a subtle moving effect\n this.$box.style.transform = `translate(${boxStyles.x - 10}px,${\n boxStyles.y - 10\n }px)`;\n\n this._sideEffect.addDisposer(\n boxStyles$.subscribe((styles) => {\n boxStyler.set(styles);\n })\n );\n\n const $boxMain = document.createElement(\"div\");\n $boxMain.className = this.wrapClassName(\"box-main\");\n this.$box.appendChild($boxMain);\n\n const $titleBar = document.createElement(\"div\");\n $titleBar.className = this.wrapClassName(\"titlebar-wrap\");\n $titleBar.appendChild(this.titleBar.render());\n this.$titleBar = $titleBar;\n\n const $contentWrap = document.createElement(\"div\");\n $contentWrap.className = this.wrapClassName(\"content-wrap\");\n\n const $content = document.createElement(\"div\");\n $content.className =\n this.wrapClassName(\"content\") + \" tele-fancy-scrollbar\";\n this.$content = $content;\n\n this._sideEffect.add(() => {\n const observer = new ResizeObserver((entries) => {\n const rect = entries[0]?.contentRect;\n if (rect) {\n this._contentRect$.setValue({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n });\n }\n });\n observer.observe($content);\n return () => observer.disconnect();\n });\n\n this._sideEffect.add(() => {\n let last$userStyles: HTMLStyleElement | undefined;\n return this._$userStyles$.subscribe(($userStyles) => {\n if (last$userStyles) {\n last$userStyles.remove();\n }\n last$userStyles = $userStyles;\n if ($userStyles) {\n $contentWrap.appendChild($userStyles);\n }\n });\n });\n\n this._sideEffect.add(() => {\n let last$userContent: HTMLElement | undefined;\n return this._$userContent$.subscribe(($userContent) => {\n if (last$userContent) {\n last$userContent.remove();\n }\n last$userContent = $userContent;\n if ($userContent) {\n $content.appendChild($userContent);\n }\n });\n });\n\n $contentWrap.appendChild($content);\n\n const $footer = document.createElement(\"div\");\n $footer.className = this.wrapClassName(\"footer-wrap\");\n this.$footer = $footer;\n\n this._sideEffect.add(() => {\n let last$userFooter: HTMLElement | undefined;\n return this._$userFooter$.subscribe(($userFooter) => {\n if (last$userFooter) {\n last$userFooter.remove();\n }\n last$userFooter = $userFooter;\n if ($userFooter) {\n $footer.appendChild($userFooter);\n }\n });\n });\n\n $boxMain.appendChild($titleBar);\n $boxMain.appendChild($contentWrap);\n $boxMain.appendChild($footer);\n\n this._renderResizeHandlers();\n\n return this.$box;\n }\n\n protected _handleTrackStart?: (ev: MouseEvent | TouchEvent) => void;\n\n public handleTrackStart: (ev: MouseEvent | TouchEvent) => void = (ev) => {\n return this._handleTrackStart?.(ev);\n };\n\n protected _renderResizeHandlers(): void {\n const $resizeHandles = document.createElement(\"div\");\n $resizeHandles.className = this.wrapClassName(\"resize-handles\");\n\n Object.values(TELE_BOX_RESIZE_HANDLE).forEach((handleType) => {\n const $handle = document.createElement(\"div\");\n $handle.className =\n this.wrapClassName(handleType) +\n \" \" +\n this.wrapClassName(\"resize-handle\");\n $handle.dataset.teleBoxHandle = handleType;\n\n $resizeHandles.appendChild($handle);\n });\n\n this.$box.appendChild($resizeHandles);\n\n const TRACKING_DISPOSER_ID = \"handle-tracking-listener\";\n const transformingClassName = this.wrapClassName(\"transforming\");\n\n let $trackMask: HTMLElement | undefined;\n\n let trackStartX = 0;\n let trackStartY = 0;\n\n let trackStartWidth = 0;\n let trackStartHeight = 0;\n\n let trackStartPageX = 0;\n let trackStartPageY = 0;\n\n let trackingHandle: TeleBoxHandleType | undefined;\n\n const handleTracking = (ev: MouseEvent | TouchEvent): void => {\n if (this.state !== TELE_BOX_STATE.Normal) {\n return;\n }\n\n preventEvent(ev);\n\n let { pageX, pageY } = flattenEvent(ev);\n if (pageY < this.rootRect.y) {\n pageY = this.rootRect.y;\n }\n\n const offsetX = pageX - trackStartPageX;\n const offsetY = pageY - trackStartPageY;\n\n let { x: newX, y: newY } = this.pxIntrinsicCoord;\n let { width: newWidth, height: newHeight } = this.pxIntrinsicSize;\n\n switch (trackingHandle) {\n case TELE_BOX_RESIZE_HANDLE.North: {\n newY = trackStartY + offsetY;\n newHeight = trackStartHeight - offsetY;\n break;\n }\n // eslint-disable-next-line no-fallthrough\n case TELE_BOX_RESIZE_HANDLE.South: {\n newHeight = trackStartHeight + offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.West: {\n newX = trackStartX + offsetX;\n newWidth = trackStartWidth - offsetX;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.East: {\n newWidth = trackStartWidth + offsetX;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.NorthWest: {\n newX = trackStartX + offsetX;\n newY = trackStartY + offsetY;\n newWidth = trackStartWidth - offsetX;\n newHeight = trackStartHeight - offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.NorthEast: {\n newY = trackStartY + offsetY;\n newWidth = trackStartWidth + offsetX;\n newHeight = trackStartHeight - offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.SouthEast: {\n newWidth = trackStartWidth + offsetX;\n newHeight = trackStartHeight + offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.SouthWest: {\n newX = trackStartX + offsetX;\n newWidth = trackStartWidth - offsetX;\n newHeight = trackStartHeight + offsetY;\n break;\n }\n default: {\n this.move(trackStartX + offsetX, trackStartY + offsetY);\n return;\n }\n }\n\n this.transform(newX, newY, newWidth, newHeight);\n };\n\n const handleTrackEnd = (ev: MouseEvent | TouchEvent): void => {\n trackingHandle = void 0;\n\n if (!$trackMask) {\n return;\n }\n\n preventEvent(ev);\n\n this.$box.classList.toggle(transformingClassName, false);\n\n this._sideEffect.flush(TRACKING_DISPOSER_ID);\n\n $trackMask.remove();\n };\n\n const handleTrackStart = (ev: MouseEvent | TouchEvent): void => {\n if (this.readonly) {\n return;\n }\n\n if (\n (ev as MouseEvent).button != null &&\n (ev as MouseEvent).button !== 0\n ) {\n // Not left mouse\n return;\n }\n\n if (\n !this.draggable ||\n trackingHandle ||\n this.state !== TELE_BOX_STATE.Normal\n ) {\n return;\n }\n\n const target = ev.target as HTMLElement;\n if (target.dataset?.teleBoxHandle) {\n preventEvent(ev);\n\n ({ x: trackStartX, y: trackStartY } = this.pxIntrinsicCoord);\n ({ width: trackStartWidth, height: trackStartHeight } =\n this.pxIntrinsicSize);\n\n ({ pageX: trackStartPageX, pageY: trackStartPageY } =\n flattenEvent(ev));\n\n trackingHandle = target.dataset\n .teleBoxHandle as TELE_BOX_RESIZE_HANDLE;\n\n if (!$trackMask) {\n $trackMask = document.createElement(\"div\");\n }\n\n const cursor = trackingHandle\n ? this.wrapClassName(`cursor-${trackingHandle}`)\n : \"\";\n\n $trackMask.className = this.wrapClassName(\n `track-mask${cursor ? ` ${cursor}` : \"\"}`\n );\n\n this.$box.appendChild($trackMask);\n\n this.$box.classList.add(transformingClassName);\n\n this._sideEffect.add(() => {\n window.addEventListener(\"mousemove\", handleTracking);\n window.addEventListener(\"touchmove\", handleTracking, {\n passive: false,\n });\n window.addEventListener(\"mouseup\", handleTrackEnd);\n window.addEventListener(\"touchend\", handleTrackEnd, {\n passive: false,\n });\n window.addEventListener(\"touchcancel\", handleTrackEnd, {\n passive: false,\n });\n\n return () => {\n window.removeEventListener(\"mousemove\", handleTracking);\n window.removeEventListener(\"touchmove\", handleTracking);\n window.removeEventListener(\"mouseup\", handleTrackEnd);\n window.removeEventListener(\"touchend\", handleTrackEnd);\n window.removeEventListener(\n \"touchcancel\",\n handleTrackEnd\n );\n };\n }, TRACKING_DISPOSER_ID);\n }\n };\n\n this._handleTrackStart = handleTrackStart;\n\n this._sideEffect.addEventListener(\n $resizeHandles,\n \"mousedown\",\n handleTrackStart,\n {},\n \"box-resizeHandles-mousedown\"\n );\n\n this._sideEffect.addEventListener(\n $resizeHandles,\n \"touchstart\",\n handleTrackStart,\n { passive: false },\n \"box-resizeHandles-touchstart\"\n );\n }\n\n public async destroy(): Promise<void> {\n this.$box.remove();\n this._sideEffect.flushAll();\n this._sideEffect.flushAll();\n\n await this.events.emit(TELE_BOX_EVENT.Destroyed);\n this.events.clearListeners();\n this._delegateEvents.clearListeners();\n }\n\n /**\n * Wrap a className with namespace\n */\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n}\n\ntype PropKeys<K = keyof TeleBox> = K extends keyof TeleBox\n ? // eslint-disable-next-line @typescript-eslint/ban-types\n TeleBox[K] extends Function\n ? never\n : K\n : never;\n\nexport type ReadonlyTeleBox = Pick<\n TeleBox,\n | PropKeys\n | \"wrapClassName\"\n | \"mountContent\"\n | \"mountFooter\"\n | \"mountStyles\"\n | \"handleTrackStart\"\n>;\n","export enum TELE_BOX_MANAGER_EVENT {\n Focused = \"focused\",\n Blurred = \"blurred\",\n Created = \"created\",\n Removed = \"removed\",\n State = \"state\",\n Maximized = \"maximized\",\n Minimized = \"minimized\",\n IntrinsicMove = \"intrinsic_move\",\n IntrinsicResize = \"intrinsic_resize\",\n ZIndex = \"z_index\",\n PrefersColorScheme = \"prefers_color_scheme\",\n DarkMode = \"dark_mode\",\n}\n","import \"./style.scss\";\nimport collectorSVG from \"./icons/collector.svg\";\nimport type { TeleStyles } from \"../typings\";\nimport type {\n ReadonlyVal,\n ReadonlyValEnhancedResult,\n ValEnhancedResult,\n} from \"value-enhancer\";\nimport { withValueEnhancer } from \"value-enhancer\";\nimport { combine } from \"value-enhancer\";\nimport { Val } from \"value-enhancer\";\nimport { withReadonlyValueEnhancer } from \"value-enhancer\";\nimport { SideEffectManager } from \"side-effect-manager\";\nimport type { TeleBoxRect } from \"../TeleBox/typings\";\n\nexport interface TeleBoxCollectorConfig {\n namespace?: string;\n styles?: TeleStyles;\n root$: ReadonlyVal<HTMLElement | null>;\n minimized$: Val<boolean>;\n readonly$: ReadonlyVal<boolean>;\n darkMode$: ReadonlyVal<boolean>;\n rootRect$: ReadonlyVal<TeleBoxRect>;\n}\n\ntype ValConfig = {\n styles: Val<TeleStyles>;\n el: Val<HTMLElement>;\n};\n\ntype ReadonlyValConfig = {\n rect: ReadonlyVal<TeleBoxRect | undefined>;\n visible: ReadonlyVal<boolean>;\n root: ReadonlyVal<HTMLElement | null>;\n};\n\ntype CombinedValEnhancedResult = ValEnhancedResult<ValConfig> &\n ReadonlyValEnhancedResult<ReadonlyValConfig>;\n\nexport interface TeleBoxCollector extends CombinedValEnhancedResult {}\n\nexport class TeleBoxCollector {\n public constructor({\n minimized$,\n readonly$,\n darkMode$,\n rootRect$,\n namespace = \"telebox\",\n styles = {},\n root$,\n }: TeleBoxCollectorConfig) {\n this.namespace = namespace;\n\n const rect$ = new Val<TeleBoxRect | undefined>(void 0);\n const visible$ = minimized$;\n const styles$ = new Val(styles);\n const el$ = new Val<HTMLElement>(document.createElement(\"button\"));\n\n const valConfig: ValConfig = {\n styles: styles$,\n el: el$,\n };\n\n withValueEnhancer(this, valConfig);\n\n const readonlyValConfig: ReadonlyValConfig = {\n rect: rect$,\n visible: visible$,\n root: root$,\n };\n\n withReadonlyValueEnhancer(this, readonlyValConfig);\n\n el$.value.className = this.wrapClassName(\"collector\");\n el$.value.style.backgroundImage = `url('${collectorSVG}')`;\n\n this._sideEffect.addDisposer(\n el$.subscribe(($collector) => {\n this._sideEffect.addEventListener(\n $collector,\n \"click\",\n () => {\n if (!readonly$.value) {\n minimized$.setValue(false);\n }\n },\n {},\n \"telebox-collector-click\"\n );\n\n this._sideEffect.addDisposer(\n [\n visible$.subscribe((visible) => {\n $collector.classList.toggle(\n this.wrapClassName(\"collector-visible\"),\n visible\n );\n }),\n readonly$.subscribe((readonly) => {\n $collector.classList.toggle(\n this.wrapClassName(\"collector-readonly\"),\n readonly\n );\n }),\n darkMode$.subscribe((darkMode) => {\n $collector.classList.toggle(\n this.wrapClassName(\"color-scheme-dark\"),\n darkMode\n );\n $collector.classList.toggle(\n this.wrapClassName(\"color-scheme-light\"),\n !darkMode\n );\n }),\n styles$.subscribe((styles) => {\n Object.keys(styles).forEach((key) => {\n const value = styles[\n key as keyof TeleStyles\n ] as string;\n if (value != null) {\n $collector.style[key as keyof TeleStyles] =\n value;\n }\n });\n }),\n root$.subscribe((root) => {\n if (root) {\n root.appendChild($collector);\n }\n }),\n // Place after $collector appended to the DOM so that rect calc works\n combine([minimized$, rootRect$, root$]).subscribe(\n ([minimized, rootRect, root]) => {\n if (minimized && root) {\n const { x, y, width, height } =\n $collector.getBoundingClientRect();\n rect$.setValue({\n x: x - rootRect.x,\n y: y - rootRect.y,\n width,\n height,\n });\n }\n }\n ),\n ],\n \"telebox-collector-el\"\n );\n })\n );\n }\n\n public readonly namespace: string;\n\n protected readonly _sideEffect = new SideEffectManager();\n\n public destroy(): void {\n this._sideEffect.flushAll();\n }\n\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n}\n","import \"./style.scss\";\n\nimport type { TeleBox } from \"../../TeleBox\";\nimport type { DefaultTitleBarConfig } from \"../../TeleTitleBar\";\nimport { DefaultTitleBar } from \"../../TeleTitleBar\";\nimport { TELE_BOX_STATE } from \"../../TeleBox/constants\";\nimport type { TeleBoxRect } from \"../../TeleBox/typings\";\nimport type { ReadonlyVal } from \"value-enhancer\";\nimport { combine } from \"value-enhancer\";\n\nexport type MaxTitleBarTitle = Pick<TeleBox, \"id\" | \"title\">;\n\nexport interface MaxTitleBarConfig extends DefaultTitleBarConfig {\n darkMode$: ReadonlyVal<boolean>;\n boxes$: ReadonlyVal<TeleBox[]>;\n rootRect$: ReadonlyVal<TeleBoxRect>;\n root$: ReadonlyVal<HTMLElement | null>;\n}\n\nexport class MaxTitleBar extends DefaultTitleBar {\n public constructor(config: MaxTitleBarConfig) {\n super(config);\n\n this.boxes$ = config.boxes$;\n this.rootRect$ = config.rootRect$;\n this.darkMode$ = config.darkMode$;\n\n this.sideEffect.addDisposer(\n config.root$.subscribe((root) => {\n if (root) {\n root.appendChild(this.render());\n } else if (this.$titleBar?.parentNode) {\n this.$titleBar.remove();\n }\n })\n );\n }\n\n public focusBox(box?: TeleBox): void {\n if (this.focusedBox && this.focusedBox === box) {\n return;\n }\n\n if (this.$titles && this.state$.value === TELE_BOX_STATE.Maximized) {\n const { children } = this.$titles.firstElementChild as HTMLElement;\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const $tab = children[i] as HTMLElement;\n const id = $tab.dataset?.teleBoxID;\n if (id) {\n if (box && id === box.id) {\n $tab.classList.toggle(\n this.wrapClassName(\"titles-tab-focus\"),\n true\n );\n } else if (this.focusedBox && id === this.focusedBox.id) {\n $tab.classList.toggle(\n this.wrapClassName(\"titles-tab-focus\"),\n false\n );\n }\n }\n }\n }\n this.focusedBox = box;\n }\n\n public render(): HTMLElement {\n if (this.$titleBar) {\n return this.$titleBar;\n }\n\n const $titleBar = super.render();\n\n $titleBar.classList.add(this.wrapClassName(\"max-titlebar\"));\n\n this.sideEffect.addDisposer(\n [\n this.rootRect$.subscribe((rootRect) => {\n const { x, y, width } = rootRect;\n $titleBar.style.transform = `translate(${x}px, ${y}px)`;\n $titleBar.style.width = width + \"px\";\n }),\n this.state$.subscribe((state) => {\n $titleBar.classList.toggle(\n this.wrapClassName(\"max-titlebar-maximized\"),\n state === TELE_BOX_STATE.Maximized\n );\n }),\n this.readonly$.subscribe((readonly) => {\n $titleBar.classList.toggle(\n this.wrapClassName(\"readonly\"),\n readonly\n );\n }),\n this.darkMode$.subscribe((darkMode) => {\n $titleBar.classList.toggle(\n this.wrapClassName(\"color-scheme-dark\"),\n darkMode\n );\n $titleBar.classList.toggle(\n this.wrapClassName(\"color-scheme-light\"),\n !darkMode\n );\n }),\n combine([this.state$, this.boxes$]).subscribe(\n ([state, titles]) => {\n if (state === TELE_BOX_STATE.Maximized) {\n $titleBar.classList.toggle(\n this.wrapClassName(\"max-titlebar-single-title\"),\n titles.length === 1\n );\n if (titles.length === 1) {\n this.setTitle(titles[0].title);\n } else {\n $titleBar.replaceChild(\n this.renderTitles(),\n $titleBar.firstElementChild as HTMLElement\n );\n }\n }\n }\n ),\n ],\n \"max-render\"\n );\n\n const $titlesArea = document.createElement(\"div\");\n $titlesArea.classList.add(this.wrapClassName(\"titles-area\"));\n $titleBar.insertBefore($titlesArea, $titleBar.firstElementChild);\n\n return $titleBar;\n }\n\n public destroy(): void {\n super.destroy();\n this.$titles = void 0;\n this.focusedBox = void 0;\n }\n\n protected renderTitles(): HTMLElement {\n this.$titles = document.createElement(\"div\");\n this.$titles.className = this.wrapClassName(\"titles\");\n\n this.sideEffect.addEventListener(\n this.$titles,\n \"wheel\",\n (ev) => {\n (ev.currentTarget as HTMLElement).scrollBy({\n left: ev.deltaY > 0 ? 250 : -250,\n behavior: \"smooth\",\n });\n },\n { passive: false },\n \"max-render-wheel-titles\"\n );\n\n const $content = document.createElement(\"div\");\n $content.className = this.wrapClassName(\"titles-content\");\n this.$titles.appendChild($content);\n\n const disposers = this.boxes$.value.map((box) => {\n const $tab = document.createElement(\"button\");\n $tab.className = this.wrapClassName(\"titles-tab\");\n $tab.textContent = box.title;\n $tab.dataset.teleBoxID = box.id;\n $tab.dataset.teleTitleBarNoDblClick = \"true\";\n\n if (this.focusedBox && box.id === this.focusedBox.id) {\n $tab.classList.add(this.wrapClassName(\"titles-tab-focus\"));\n }\n\n $content.appendChild($tab);\n\n return box._title$.reaction((title) => ($tab.textContent = title));\n });\n\n this.sideEffect.addDisposer(\n () => disposers.forEach((disposer) => disposer()),\n \"max-render-tab-titles\"\n );\n\n return this.$titles;\n }\n\n public focusedBox: TeleBox | undefined;\n\n protected darkMode$: MaxTitleBarConfig[\"darkMode$\"];\n protected boxes$: MaxTitleBarConfig[\"boxes$\"];\n protected rootRect$: MaxTitleBarConfig[\"rootRect$\"];\n\n protected $titles: HTMLElement | undefined;\n}\n","import shallowequal from \"shallowequal\";\nimport { ResizeObserver as ResizeObserverPolyfill } from \"@juggle/resize-observer\";\nimport { SideEffectManager } from \"side-effect-manager\";\nimport type {\n ReadonlyVal,\n ValEnhancedResult,\n ReadonlyValEnhancedResult,\n} from \"value-enhancer\";\nimport {\n combine,\n Val,\n withValueEnhancer,\n withReadonlyValueEnhancer,\n} from \"value-enhancer\";\nimport Emittery from \"emittery\";\nimport type {\n ReadonlyTeleBox,\n TeleBoxColorScheme,\n TeleBoxRect,\n TeleBoxState,\n} from \"../TeleBox\";\nimport {\n TeleBox,\n TELE_BOX_EVENT,\n TELE_BOX_STATE,\n TELE_BOX_COLOR_SCHEME,\n TELE_BOX_DELEGATE_EVENT,\n} from \"../TeleBox\";\nimport { TeleBoxCollector } from \"../TeleBoxCollector\";\nimport { TELE_BOX_MANAGER_EVENT } from \"./constants\";\nimport type {\n TeleBoxManagerConfig,\n TeleBoxManagerCreateConfig,\n TeleBoxManagerEventConfig,\n TeleBoxManagerQueryConfig,\n TeleBoxManagerUpdateConfig,\n} from \"./typings\";\nimport { MaxTitleBar } from \"./MaxTitleBar\";\nimport { TeleStage } from \"../TeleStage\";\n\nexport * from \"./typings\";\nexport * from \"./constants\";\n\nconst ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;\n\ntype ReadonlyValConfig = {\n darkMode: ReadonlyVal<boolean, boolean>;\n state: ReadonlyVal<TeleBoxState, boolean>;\n root: Val<HTMLElement | null>;\n rootRect: Val<TeleBoxRect>;\n stageRect: ReadonlyVal<TeleBoxRect>;\n};\n\ntype ValConfig = {\n prefersColorScheme: Val<TeleBoxColorScheme, boolean>;\n readonly: Val<boolean, boolean>;\n minimized: Val<boolean, boolean>;\n maximized: Val<boolean, boolean>;\n fence: Val<boolean, boolean>;\n stageRatio: Val<number, boolean>;\n highlightStage: Val<boolean, boolean>;\n};\n\ntype CombinedValEnhancedResult = ValEnhancedResult<ValConfig> &\n ReadonlyValEnhancedResult<ReadonlyValConfig>;\n\nexport interface TeleBoxManager extends CombinedValEnhancedResult {}\n\nexport class TeleBoxManager {\n public constructor({\n root = null,\n prefersColorScheme = TELE_BOX_COLOR_SCHEME.Light,\n minimized = false,\n maximized = false,\n fence = false,\n collector,\n namespace = \"telebox\",\n readonly = false,\n stageRatio = -1,\n highlightStage = true,\n }: TeleBoxManagerConfig = {}) {\n this._sideEffect = new SideEffectManager();\n\n this.namespace = namespace;\n\n const root$ = new Val(root);\n const readonly$ = new Val(readonly);\n const minimized$ = new Val(minimized);\n const maximized$ = new Val(maximized);\n const fence$ = new Val(fence);\n const stageRatio$ = new Val(stageRatio);\n const highlightStage$ = new Val(highlightStage);\n\n const rootRect$ = new Val<TeleBoxRect>(\n {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n { compare: shallowequal }\n );\n this._sideEffect.addDisposer(\n root$.subscribe((root) => {\n this._sideEffect.add(() => {\n if (!root) {\n return () => void 0;\n }\n const observer = new ResizeObserver((entries) => {\n this._sideEffect.setTimeout(\n // debounce\n () => {\n const rect = entries[0]?.contentRect;\n if (rect) {\n rootRect$.setValue({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n });\n }\n },\n 50,\n \"root-resize-observer\"\n );\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, \"calc-root-rect\");\n })\n );\n\n this.boxes$ = new Val<TeleBox[]>([]);\n this.topBox$ = new Val<TeleBox | undefined>(undefined);\n this._sideEffect.addDisposer(\n this.boxes$.subscribe((boxes) => {\n if (boxes.length > 0) {\n const topBox = boxes.reduce((topBox, box) =>\n topBox.zIndex > box.zIndex ? topBox : box\n );\n this.topBox$.setValue(topBox);\n } else {\n this.topBox$.setValue(undefined);\n }\n })\n );\n\n const prefersDarkMatch = window.matchMedia(\n \"(prefers-color-scheme: dark)\"\n );\n const prefersDark$ = new Val(false);\n if (prefersDarkMatch) {\n prefersDark$.setValue(prefersDarkMatch.matches);\n this._sideEffect.add(() => {\n const handler = (evt: MediaQueryListEvent): void => {\n prefersDark$.setValue(evt.matches);\n };\n prefersDarkMatch.addEventListener(\"change\", handler);\n return () =>\n prefersDarkMatch.removeEventListener(\"change\", handler);\n });\n }\n\n const prefersColorScheme$ = new Val(prefersColorScheme);\n this._sideEffect.addDisposer(\n prefersColorScheme$.reaction((prefersColorScheme, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.PrefersColorScheme,\n prefersColorScheme\n );\n }\n })\n );\n\n const darkMode$ = combine(\n [prefersDark$, prefersColorScheme$],\n ([prefersDark, prefersColorScheme]) =>\n prefersColorScheme === \"auto\"\n ? prefersDark\n : prefersColorScheme === \"dark\"\n );\n\n const state$ = combine(\n [minimized$, maximized$],\n ([minimized, maximized]): TeleBoxState =>\n minimized\n ? TELE_BOX_STATE.Minimized\n : maximized\n ? TELE_BOX_STATE.Maximized\n : TELE_BOX_STATE.Normal\n );\n\n this.collector =\n collector ??\n new TeleBoxCollector({\n minimized$: minimized$,\n readonly$: readonly$,\n darkMode$: darkMode$,\n namespace,\n root$,\n rootRect$,\n });\n\n const teleStage = new TeleStage({\n namespace,\n rootRect$,\n ratio$: stageRatio$,\n root$,\n highlightStage$,\n });\n this._sideEffect.addDisposer(() => teleStage.destroy());\n\n const readonlyValConfig: ReadonlyValConfig = {\n darkMode: darkMode$,\n state: state$,\n root: root$,\n rootRect: rootRect$,\n stageRect: teleStage.stageRect$,\n };\n\n withReadonlyValueEnhancer(this, readonlyValConfig);\n\n const valConfig: ValConfig = {\n prefersColorScheme: prefersColorScheme$,\n readonly: readonly$,\n fence: fence$,\n minimized: minimized$,\n maximized: maximized$,\n stageRatio: stageRatio$,\n highlightStage: highlightStage$,\n };\n\n withValueEnhancer(this, valConfig);\n\n const closeBtnClassName = this.wrapClassName(\"titlebar-icon-close\");\n\n const checkFocusBox = (ev: MouseEvent | TouchEvent): void => {\n if (readonly$.value) {\n return;\n }\n\n const target = ev.target as HTMLElement;\n if (!target.tagName) {\n return;\n }\n\n for (\n let el: HTMLElement | null = target;\n el;\n el = el.parentElement\n ) {\n if (el.classList && el.classList.contains(closeBtnClassName)) {\n return;\n }\n const id = el.dataset?.teleBoxID;\n if (id) {\n const box = this.getBox(id);\n if (box) {\n this.focusBox(box);\n this.makeBoxTop(box);\n return;\n }\n }\n }\n };\n\n this._sideEffect.addEventListener(\n window,\n \"mousedown\",\n checkFocusBox,\n true\n );\n this._sideEffect.addEventListener(\n window,\n \"touchstart\",\n checkFocusBox,\n true\n );\n\n this.titleBar = new MaxTitleBar({\n namespace: this.namespace,\n boxes$: this.boxes$,\n darkMode$: darkMode$,\n readonly$: readonly$,\n state$: state$,\n root$,\n rootRect$: rootRect$,\n onEvent: (event): void => {\n switch (event.type) {\n case TELE_BOX_DELEGATE_EVENT.Maximize: {\n maximized$.setValue(!maximized$.value);\n break;\n }\n case TELE_BOX_DELEGATE_EVENT.Minimize: {\n minimized$.setValue(true);\n break;\n }\n case TELE_BOX_EVENT.Close: {\n this.removeTopBox();\n this.focusTopBox();\n break;\n }\n default: {\n break;\n }\n }\n },\n });\n\n this._sideEffect.addDisposer([\n state$.reaction((state, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.State, state);\n }\n }),\n maximized$.reaction((maximized, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.Maximized,\n maximized\n );\n }\n }),\n minimized$.reaction((minimized, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.Minimized,\n minimized\n );\n }\n }),\n darkMode$.reaction((darkMode, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.DarkMode, darkMode);\n }\n }),\n ]);\n }\n\n public get boxes(): ReadonlyArray<TeleBox> {\n return this.boxes$.value;\n }\n\n public get topBox(): TeleBox | undefined {\n return this.topBox$.value;\n }\n\n public readonly events = new Emittery<\n TeleBoxManagerEventConfig,\n TeleBoxManagerEventConfig\n >();\n\n protected _sideEffect: SideEffectManager;\n\n public readonly namespace: string;\n\n /** @deprecated use setMaximized and setMinimized instead */\n public setState(state: TeleBoxState, skipUpdate = false): this {\n switch (state) {\n case TELE_BOX_STATE.Maximized: {\n this.setMinimized(false, skipUpdate);\n this.setMaximized(true, skipUpdate);\n break;\n }\n case TELE_BOX_STATE.Minimized: {\n this.setMinimized(true, skipUpdate);\n this.setMaximized(false, skipUpdate);\n break;\n }\n default: {\n this.setMinimized(false, skipUpdate);\n this.setMaximized(false, skipUpdate);\n break;\n }\n }\n return this;\n }\n\n public create(\n config: TeleBoxManagerCreateConfig = {},\n smartPosition = true\n ): ReadonlyTeleBox {\n const box = new TeleBox({\n zIndex: this.topBox ? this.topBox.zIndex + 1 : 100,\n ...config,\n ...(smartPosition ? this.smartPosition(config) : {}),\n namespace: this.namespace,\n root$: this._root$,\n darkMode$: this._darkMode$,\n maximized$: this._maximized$,\n minimized$: this._minimized$,\n fence$: this._fence$,\n rootRect$: this._rootRect$,\n managerStageRect$: this._stageRect$,\n stageRatio$: this._stageRatio$,\n readonly$: this._readonly$,\n collectorRect$: this.collector._rect$,\n managerHighlightStage$: this._highlightStage$,\n });\n\n if (box.focus) {\n this.focusBox(box);\n if (smartPosition) {\n this.makeBoxTop(box);\n }\n }\n\n this.boxes$.setValue([...this.boxes, box]);\n\n this._sideEffect.addDisposer([\n box._delegateEvents.on(TELE_BOX_DELEGATE_EVENT.Maximize, () => {\n this.setMaximized(!this.maximized);\n }),\n box._delegateEvents.on(TELE_BOX_DELEGATE_EVENT.Minimize, () => {\n this.setMinimized(true);\n }),\n box._delegateEvents.on(TELE_BOX_DELEGATE_EVENT.Close, () => {\n this.remove(box);\n this.focusTopBox();\n }),\n box._intrinsicCoord$.reaction((_, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.IntrinsicMove, box);\n }\n }),\n box._intrinsicSize$.reaction((_, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.IntrinsicResize,\n box\n );\n }\n }),\n box._zIndex$.reaction((_, skipUpdate) => {\n if (this.boxes.length > 0) {\n const topBox = this.boxes.reduce((topBox, box) =>\n topBox.zIndex > box.zIndex ? topBox : box\n );\n this.topBox$.setValue(topBox);\n }\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.ZIndex, box);\n }\n }),\n ]);\n\n this.events.emit(TELE_BOX_MANAGER_EVENT.Created, box);\n\n return box;\n }\n\n public query(config?: TeleBoxManagerQueryConfig): ReadonlyTeleBox[] {\n return config\n ? this.boxes.filter(this.teleBoxMatcher(config))\n : [...this.boxes];\n }\n\n public queryOne(\n config?: TeleBoxManagerQueryConfig\n ): ReadonlyTeleBox | undefined {\n return config\n ? this.boxes.find(this.teleBoxMatcher(config))\n : this.boxes[0];\n }\n\n public update(\n boxID: string,\n config: TeleBoxManagerUpdateConfig,\n skipUpdate = false\n ): void {\n const box = this.boxes.find((box) => box.id === boxID);\n if (box) {\n return this.updateBox(box, config, skipUpdate);\n }\n }\n\n public updateAll(\n config: TeleBoxManagerUpdateConfig,\n skipUpdate = false\n ): void {\n this.boxes.forEach((box) => {\n this.updateBox(box, config, skipUpdate);\n });\n }\n\n public remove(\n boxOrID: string | TeleBox,\n skipUpdate = false\n ): ReadonlyTeleBox | undefined {\n const index = this.getBoxIndex(boxOrID);\n if (index >= 0) {\n const boxes = this.boxes.slice();\n const deletedBoxes = boxes.splice(index, 1);\n this.boxes$.setValue(boxes);\n deletedBoxes.forEach((box) => box.destroy());\n if (!skipUpdate) {\n if (this.boxes.length <= 0) {\n this.setMaximized(false);\n this.setMinimized(false);\n }\n this.events.emit(TELE_BOX_MANAGER_EVENT.Removed, deletedBoxes);\n }\n return deletedBoxes[0];\n }\n return;\n }\n\n public removeTopBox(): ReadonlyTeleBox | undefined {\n if (this.topBox) {\n return this.remove(this.topBox);\n }\n return;\n }\n\n public removeAll(skipUpdate = false): ReadonlyTeleBox[] {\n const deletedBoxes = this.boxes$.value;\n this.boxes$.setValue([]);\n deletedBoxes.forEach((box) => box.destroy());\n if (!skipUpdate) {\n if (this.boxes.length <= 0) {\n this.setMaximized(false);\n this.setMinimized(false);\n }\n this.events.emit(TELE_BOX_MANAGER_EVENT.Removed, deletedBoxes);\n }\n return deletedBoxes;\n }\n\n /**\n * Mount manager to a container element.\n */\n public mount(root: HTMLElement): void {\n this._root$.setValue(root);\n }\n\n /**\n * Unmount manager from the container element.\n */\n public unmount(): void {\n this._root$.setValue(null);\n }\n\n public destroy(skipUpdate = false): void {\n this.events.clearListeners();\n this._sideEffect.flushAll();\n this.removeAll(skipUpdate);\n this.collector.destroy();\n this.titleBar.destroy();\n }\n\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n\n public focusBox(boxOrID: string | TeleBox, skipUpdate = false): void {\n const targetBox = this.getBox(boxOrID);\n if (targetBox) {\n this.boxes.forEach((box) => {\n if (targetBox === box) {\n let focusChanged = false;\n if (!targetBox.focus) {\n focusChanged = true;\n targetBox._focus$.setValue(true, skipUpdate);\n }\n if (focusChanged && !skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.Focused,\n targetBox\n );\n }\n } else if (box.focus) {\n this.blurBox(box, skipUpdate);\n }\n });\n this.titleBar.focusBox(targetBox);\n }\n }\n\n public focusTopBox(): void {\n if (this.topBox && !this.topBox.focus) {\n return this.focusBox(this.topBox);\n }\n }\n\n public blurBox(boxOrID: string | TeleBox, skipUpdate = false): void {\n const targetBox = this.getBox(boxOrID);\n if (targetBox) {\n if (targetBox.focus) {\n targetBox._focus$.setValue(false, skipUpdate);\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.Blurred, targetBox);\n }\n }\n if (this.titleBar.focusedBox === targetBox) {\n this.titleBar.focusBox();\n }\n }\n }\n\n public blurAll(skipUpdate = false): void {\n this.boxes.forEach((box) => {\n if (box.focus) {\n box._focus$.setValue(false, skipUpdate);\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.Blurred, box);\n }\n }\n });\n if (this.titleBar.focusedBox) {\n this.titleBar.focusBox();\n }\n }\n\n public collector: TeleBoxCollector;\n public titleBar: MaxTitleBar;\n\n protected boxes$: Val<TeleBox[]>;\n protected topBox$: Val<TeleBox | undefined>;\n\n protected teleBoxMatcher(\n config: TeleBoxManagerQueryConfig\n ): (box: TeleBox) => boolean {\n const keys = Object.keys(config) as Array<\n keyof TeleBoxManagerQueryConfig\n >;\n return (box: TeleBox): boolean =>\n keys.every((key) => config[key] === box[key]);\n }\n\n protected updateBox(\n box: TeleBox,\n config: TeleBoxManagerUpdateConfig,\n skipUpdate = false\n ): void {\n if (config.x != null || config.y != null) {\n box._intrinsicCoord$.setValue(\n {\n x: config.x ?? box.intrinsicX,\n y: config.y ?? box.intrinsicY,\n },\n skipUpdate\n );\n }\n if (config.width != null || config.height != null) {\n box._intrinsicSize$.setValue(\n {\n width: config.width ?? box.intrinsicWidth,\n height: config.height ?? box.intrinsicHeight,\n },\n skipUpdate\n );\n }\n if (config.title != null) {\n box._title$.setValue(config.title);\n }\n if (config.visible != null) {\n box._visible$.setValue(config.visible, skipUpdate);\n }\n if (config.resizable != null) {\n box._resizable$.setValue(config.resizable, skipUpdate);\n }\n if (config.draggable != null) {\n box._draggable$.setValue(config.draggable, skipUpdate);\n }\n if (config.ratio != null) {\n box._ratio$.setValue(config.ratio, skipUpdate);\n }\n if (config.zIndex != null) {\n box._zIndex$.setValue(config.zIndex, skipUpdate);\n }\n if (config.content != null) {\n box.mountContent(config.content);\n }\n if (config.footer != null) {\n box.mountFooter(config.footer);\n }\n if (config.minHeight != null || config.minWidth != null) {\n box._minSize$.setValue(\n {\n width: config.minWidth ?? box.minWidth,\n height: config.minHeight ?? box.minHeight,\n },\n skipUpdate\n );\n }\n }\n\n /** Keep new boxes staggered inside stage area */\n protected smartPosition(rect: Partial<TeleBoxRect>): TeleBoxRect {\n let { x, y } = rect;\n const { width = 0.5, height = 0.5 } = rect;\n const stageRect = this.stageRect;\n const topBox = this.topBox;\n\n if (x == null) {\n let pxX = stageRect.x + 20;\n if (topBox) {\n const pxPreferredX = topBox.pxIntrinsicCoord.x + 20;\n const pxIntrinsicWidth = width * stageRect.width;\n if (\n pxPreferredX + pxIntrinsicWidth <=\n stageRect.x + stageRect.width\n ) {\n pxX = pxPreferredX;\n }\n }\n x = (pxX - stageRect.x) / stageRect.width;\n }\n\n if (y == null) {\n let pxY = stageRect.y + 20;\n if (topBox) {\n const pxPreferredY = topBox.pxIntrinsicCoord.y + 20;\n const pxIntrinsicHeight = height * stageRect.height;\n if (\n pxPreferredY + pxIntrinsicHeight <=\n stageRect.y + stageRect.height\n ) {\n pxY = pxPreferredY;\n }\n }\n y = (pxY - stageRect.y) / stageRect.height;\n }\n\n return { x, y, width, height };\n }\n\n protected makeBoxTop(box: TeleBox, skipUpdate = false): void {\n if (this.topBox) {\n if (box !== this.topBox) {\n box._zIndex$.setValue(this.topBox.zIndex + 1, skipUpdate);\n }\n }\n }\n\n protected getBoxIndex(boxOrID: TeleBox | string): number {\n return typeof boxOrID === \"string\"\n ? this.boxes.findIndex((box) => box.id === boxOrID)\n : this.boxes.findIndex((box) => box === boxOrID);\n }\n\n protected getBox(boxOrID: TeleBox | string): TeleBox | undefined {\n return typeof boxOrID === \"string\"\n ? this.boxes.find((box) => box.id === boxOrID)\n : boxOrID;\n }\n}\n"],"names":["TELE_BOX_COLOR_SCHEME","TELE_BOX_COLOR_SCHEME2","TELE_BOX_STATE","TELE_BOX_STATE2","TELE_BOX_EVENT","TELE_BOX_EVENT2","TELE_BOX_DELEGATE_EVENT","TELE_BOX_DELEGATE_EVENT2","TELE_BOX_RESIZE_HANDLE","TELE_BOX_RESIZE_HANDLE2","TeleBoxDragHandleType","value","min","max","Math","ev","stopPropagation","cancelable","preventDefault","touches","defaultBoxCount","Boolean","constructor","readonly$","state$","title","buttons","onEvent","onDragStart","namespace","SideEffectManager","timestamp","clientX","clientY","this","button","target","dataset","teleTitleBarNoDblClick","now","Date","lastTitleBarClick","abs","type","Maximize","lastTitleBarTouch","title$","Val","Minimize","iconClassName","wrapClassName","isActive","state","Maximized","Close","$dragArea","renderDragArea","setTitle","setValue","render","$titleBar","document","createElement","className","$titleArea","teleBoxHandle","$title","appendChild","$buttonsContainer","forEach","i","teleTitleBarBtnIndex","String","$btn","sideEffect","addDisposer","subscribe","textContent","btn","children","classList","toggle","addEventListener","Number","isNaN","length","handleTitleBarClick","handleTitleBarTouch","passive","dragHandle","destroy","flushAll","rootRect$","ratio$","highlightStage$","root$","stageRect$","combine","rootRect","highlightStage","ratio","width","height","preferredHeight","x","y","preferredWidth","compare","shallowequal","_sideEffect","root","$boxStage","parentNode","remove","$boxStageMask1","$boxStageMask2","$boxStageFrame","$topLeftCorner","$topRightCorner","$bottomLeftCorner","$bottomRightCorner","map","path","$svg","createElementNS","setAttribute","$path","stageRect","style","flexDirection","ResizeObserver","window","ResizeObserverPolyfill","id","genUID","getBoxDefaultName","visible","minWidth","minHeight","resizable","draggable","focus","zIndex","titleBar","content","footer","styles","darkMode$","fence$","minimized$","maximized$","managerStageRect$","stageRatio$","collectorRect$","managerHighlightStage$","Emittery","_handleTrackStart","visible$","resizable$","draggable$","zIndex$","focus$","$userContent$","$userFooter$","$userStyles$","minimized","maximized","Minimized","Normal","minSize$","clamp","pxMinSize$","minSize","managerStageRect","intrinsicSize$","reaction","skipUpdate","intrinsicCoord$","pxIntrinsicSize$","size","pxIntrinsicCoord$","intrinsicCoord","boxHighlightStage$","boxHighlightStage","managerHighlightStage","contentRoot$","contentRect$","teleStage","TeleStage","readonlyValConfig","darkMode","fence","readonly","collectorRect","$userContent","$userFooter","$userStyles","pxMinSize","intrinsicSize","pxIntrinsicSize","pxIntrinsicCoord","contentRect","contentStageRect","DefaultTitleBar","event","_delegateEvents","emit","ratio2","transform","move","$box","$content","parentElement","watchValEvent","val","v","events","DarkMode","Readonly","ZIndex","State","IntrinsicResize","IntrinsicMove","visible2","focus2","Focus","Blur","_minSize$","setMinWidth","setMinHeight","resize","_intrinsicSize$","_intrinsicCoord$","safeX","safeY","newHeight","mountContent","_$userContent$","unmountContent","mountFooter","_$userFooter$","unmountFooter","getUserStyles","mountStyles","$styles","_$userStyles$","unmountStyles","setHighlightStage","_boxHighlightStage$","add","bindClassName","el","predicate","isTruthy","wrappedClassName","_readonly$","_draggable$","isFalsy","_resizable$","_focus$","_darkMode$","minimizedClassName","maximizedClassName","MAXIMIZED_TIMER_ID","_state$","flush","setTimeout","_visible$","display","_zIndex$","teleBoxID","boxStyler","styler","boxStyles$","_maximized$","_minimized$","_pxIntrinsicSize$","_pxIntrinsicCoord$","_collectorRect$","scaleX","scaleY","boxStyles","set","$boxMain","$contentWrap","observer","entries","rect","_contentRect$","observe","disconnect","last$userStyles","last$userContent","$footer","last$userFooter","_renderResizeHandlers","$resizeHandles","values","handleType","$handle","TRACKING_DISPOSER_ID","transformingClassName","$trackMask","trackingHandle","trackStartX","trackStartY","trackStartWidth","trackStartHeight","trackStartPageX","trackStartPageY","handleTracking","pageX","pageY","flattenEvent","offsetX","offsetY","newX","newY","newWidth","North","South","West","East","NorthWest","NorthEast","SouthEast","SouthWest","handleTrackEnd","handleTrackStart","cursor","removeEventListener","Destroyed","clearListeners","TELE_BOX_MANAGER_EVENT","TELE_BOX_MANAGER_EVENT2","rect$","styles$","el$","backgroundImage","$collector","styles2","keys","key","getBoundingClientRect","config","boxes$","focusBox","box","focusedBox","$titles","firstElementChild","$tab","super","titles","replaceChild","renderTitles","$titlesArea","insertBefore","currentTarget","scrollBy","left","deltaY","behavior","disposers","_title$","disposer","prefersColorScheme","Light","collector","stageRatio","innerWidth","innerHeight","root2","topBox$","boxes","topBox","reduce","topBox2","prefersDarkMatch","matchMedia","prefersDark$","matches","handler","evt","prefersColorScheme$","prefersColorScheme2","PrefersColorScheme","prefersDark","minimized2","maximized2","TeleBoxCollector","closeBtnClassName","checkFocusBox","tagName","contains","getBox","makeBoxTop","MaxTitleBar","removeTopBox","focusTopBox","setState","setMinimized","setMaximized","create","smartPosition","TeleBox","_root$","_fence$","_rootRect$","_stageRect$","_stageRatio$","_rect$","_highlightStage$","on","_","box2","Created","query","filter","teleBoxMatcher","queryOne","find","update","boxID","updateBox","updateAll","boxOrID","index","getBoxIndex","slice","deletedBoxes","splice","Removed","removeAll","mount","unmount","targetBox","focusChanged","Focused","blurBox","Blurred","blurAll","Object","every","intrinsicX","intrinsicY","intrinsicWidth","intrinsicHeight","_ratio$","pxX","pxPreferredX","pxY","pxPreferredY","findIndex"],"mappings":"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"}
1
+ {"version":3,"file":"telebox-insider.es.js","sources":["../src/TeleBox/constants.ts","../src/utils.ts","../src/TeleTitleBar/DefaultTitleBar/index.ts","../src/TeleBox/utils.ts","../src/TeleBox/index.ts","../src/TeleBoxManager/constants.ts","../src/TeleBoxCollector/index.ts","../src/TeleBoxManager/MaxTitleBar/index.ts","../src/TeleBoxManager/index.ts"],"sourcesContent":["export enum TELE_BOX_COLOR_SCHEME {\n Light = \"light\",\n Dark = \"dark\",\n Auto = \"auto\",\n}\n\nexport enum TELE_BOX_STATE {\n Normal = \"normal\",\n Minimized = \"minimized\",\n Maximized = \"maximized\",\n}\n\nexport enum TELE_BOX_EVENT {\n DarkMode = \"dark_mode\",\n PrefersColorScheme = \"prefers_color_scheme\",\n Close = \"close\",\n Focus = \"focus\",\n Blur = \"blur\",\n IntrinsicMove = \"intrinsic_move\",\n IntrinsicResize = \"intrinsic_resize\",\n ZIndex = \"z_index\",\n State = \"state\",\n Minimized = \"minimized\",\n Maximized = \"maximized\",\n Readonly = \"readonly\",\n Destroyed = \"destroyed\",\n}\n\nexport enum TELE_BOX_DELEGATE_EVENT {\n Close = \"close\",\n Maximize = \"maximize\",\n Minimize = \"minimize\",\n}\n\nexport enum TELE_BOX_RESIZE_HANDLE {\n North = \"n\",\n South = \"s\",\n West = \"w\",\n East = \"e\",\n NorthWest = \"nw\",\n NorthEast = \"ne\",\n SouthEast = \"se\",\n SouthWest = \"sw\",\n}\n\nexport const TeleBoxDragHandleType = \"dh\";\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function preventEvent(ev: Event): void {\n ev.stopPropagation();\n if (ev.cancelable) {\n ev.preventDefault();\n }\n}\n\nexport function flattenEvent(ev: MouseEvent | TouchEvent): MouseEvent | Touch {\n return (ev as TouchEvent).touches\n ? (ev as TouchEvent).touches[0]\n : (ev as MouseEvent);\n}\n\nexport function getRandomInt(min: number, max: number): number {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\nlet defaultBoxCount = 1;\n\nexport function getBoxDefaultName(): string {\n return `New Box ${defaultBoxCount++}`;\n}\n\nexport function identity<TValue>(value: TValue): TValue {\n return value;\n}\n\nexport function isTruthy<TValue>(value: TValue): boolean {\n return Boolean(value);\n}\n\nexport function isFalsy<TValue>(value: TValue): boolean {\n return !value;\n}\n","import \"./style.scss\";\n\nimport { SideEffectManager } from \"side-effect-manager\";\n\nimport {\n TeleBoxDragHandleType,\n TELE_BOX_DELEGATE_EVENT,\n TELE_BOX_STATE,\n} from \"../../TeleBox/constants\";\nimport type { TeleBoxState } from \"../../TeleBox/typings\";\nimport type {\n TeleTitleBar,\n TeleTitleBarConfig,\n TeleTitleBarEvent,\n} from \"../typings\";\nimport { preventEvent } from \"../../utils\";\nimport type { ReadonlyVal } from \"value-enhancer\";\n\nexport type DefaultTitleBarButton = TeleTitleBarEvent & {\n readonly iconClassName: string;\n readonly isActive?: (state: TeleBoxState) => boolean;\n};\n\nexport interface DefaultTitleBarConfig extends TeleTitleBarConfig {\n buttons?: ReadonlyArray<DefaultTitleBarButton>;\n}\n\nexport class DefaultTitleBar implements TeleTitleBar {\n public constructor({\n readonly$,\n state$,\n title$,\n buttons,\n onEvent,\n onDragStart,\n namespace = \"telebox\",\n }: DefaultTitleBarConfig) {\n this.readonly$ = readonly$;\n this.state$ = state$;\n this.title$ = title$;\n this.onEvent = onEvent;\n this.onDragStart = onDragStart;\n this.namespace = namespace;\n\n this.buttons = buttons || [\n {\n type: TELE_BOX_DELEGATE_EVENT.Minimize,\n iconClassName: this.wrapClassName(\"titlebar-icon-minimize\"),\n },\n {\n type: TELE_BOX_DELEGATE_EVENT.Maximize,\n iconClassName: this.wrapClassName(\"titlebar-icon-maximize\"),\n isActive: (state) => state === TELE_BOX_STATE.Maximized,\n },\n {\n type: TELE_BOX_DELEGATE_EVENT.Close,\n iconClassName: this.wrapClassName(\"titlebar-icon-close\"),\n },\n ];\n\n this.$dragArea = this.renderDragArea();\n }\n\n public readonly namespace: string;\n\n public $titleBar: HTMLElement | undefined;\n\n public $dragArea: HTMLElement;\n\n public render(): HTMLElement {\n if (!this.$titleBar) {\n this.$titleBar = document.createElement(\"div\");\n this.$titleBar.className = this.wrapClassName(\"titlebar\");\n\n const $titleArea = document.createElement(\"div\");\n $titleArea.className = this.wrapClassName(\"title-area\");\n $titleArea.dataset.teleBoxHandle = TeleBoxDragHandleType;\n\n const $title = document.createElement(\"h1\");\n $title.className = this.wrapClassName(\"title\");\n $title.dataset.teleBoxHandle = TeleBoxDragHandleType;\n\n $titleArea.appendChild($title);\n $titleArea.appendChild(this.$dragArea);\n\n const $buttonsContainer = document.createElement(\"div\");\n $buttonsContainer.className = this.wrapClassName(\"titlebar-btns\");\n\n this.buttons.forEach(({ iconClassName }, i) => {\n const teleTitleBarBtnIndex = String(i);\n\n const $btn = document.createElement(\"button\");\n $btn.className = `${this.wrapClassName(\n \"titlebar-btn\"\n )} ${iconClassName}`;\n $btn.dataset.teleTitleBarBtnIndex = teleTitleBarBtnIndex;\n $btn.dataset.teleTitleBarNoDblClick = \"true\";\n $buttonsContainer.appendChild($btn);\n });\n\n this.sideEffect.addDisposer(\n this.title$.subscribe((title) => {\n $title.textContent = title;\n $title.title = title;\n }),\n \"render-title\"\n );\n\n this.sideEffect.addDisposer(\n this.state$.subscribe((state) => {\n this.buttons.forEach((btn, i) => {\n if (btn.isActive) {\n $buttonsContainer.children[i]?.classList.toggle(\n \"is-active\",\n btn.isActive(state)\n );\n }\n });\n }),\n \"render-state-btns\"\n );\n\n this.sideEffect.addEventListener(\n $buttonsContainer,\n \"click\",\n (ev) => {\n if (this.readonly$.value) {\n return;\n }\n const target = ev.target as HTMLElement;\n const teleTitleBarBtnIndex = Number(\n target.dataset?.teleTitleBarBtnIndex\n );\n if (\n !Number.isNaN(teleTitleBarBtnIndex) &&\n teleTitleBarBtnIndex < this.buttons.length\n ) {\n preventEvent(ev);\n const btn = this.buttons[teleTitleBarBtnIndex];\n if (this.onEvent) {\n this.onEvent({\n type: btn.type,\n value: btn.value,\n } as TeleTitleBarEvent);\n }\n }\n },\n {},\n \"render-btns-container-click\"\n );\n\n this.$titleBar.appendChild($titleArea);\n this.$titleBar.appendChild($buttonsContainer);\n }\n\n return this.$titleBar;\n }\n\n public renderDragArea(): HTMLElement {\n const $dragArea = document.createElement(\"div\");\n $dragArea.className = this.wrapClassName(\"drag-area\");\n $dragArea.dataset.teleBoxHandle = TeleBoxDragHandleType;\n this.sideEffect.addEventListener(\n $dragArea,\n \"mousedown\",\n this.handleTitleBarClick\n );\n this.sideEffect.addEventListener(\n $dragArea,\n \"touchstart\",\n this.handleTitleBarTouch,\n { passive: true }\n );\n return $dragArea;\n }\n\n public dragHandle(): HTMLElement | undefined {\n return this.$titleBar;\n }\n\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n\n public destroy(): void {\n this.sideEffect.flushAll();\n if (this.$titleBar) {\n this.$titleBar = void 0;\n this.onDragStart = void 0;\n this.onEvent = void 0;\n }\n }\n\n public onEvent?: TeleTitleBarConfig[\"onEvent\"];\n\n public onDragStart?: TeleTitleBarConfig[\"onDragStart\"];\n\n protected readonly$: TeleTitleBarConfig[\"readonly$\"];\n\n protected title$: ReadonlyVal<string>;\n\n protected buttons: ReadonlyArray<DefaultTitleBarButton>;\n\n protected state$: TeleTitleBarConfig[\"state$\"];\n\n protected sideEffect = new SideEffectManager();\n\n protected lastTitleBarClick = {\n timestamp: 0,\n clientX: -100,\n clientY: -100,\n };\n\n protected handleTitleBarClick = (ev: MouseEvent): void => {\n if (this.readonly$.value) {\n return;\n }\n\n if (ev.button !== 0) {\n return; // Not left mouse\n }\n\n if ((ev.target as HTMLElement).dataset?.teleTitleBarNoDblClick) {\n return; // btns\n }\n\n preventEvent(ev);\n\n const now = Date.now();\n if (now - this.lastTitleBarClick.timestamp <= 500) {\n if (\n Math.abs(ev.clientX - this.lastTitleBarClick.clientX) <= 5 &&\n Math.abs(ev.clientY - this.lastTitleBarClick.clientY) <= 5\n ) {\n // double click\n if (this.onEvent) {\n this.onEvent({ type: TELE_BOX_DELEGATE_EVENT.Maximize });\n }\n }\n } else if (this.onDragStart) {\n this.onDragStart(ev);\n }\n this.lastTitleBarClick.timestamp = now;\n this.lastTitleBarClick.clientX = ev.clientX;\n this.lastTitleBarClick.clientY = ev.clientY;\n };\n\n protected lastTitleBarTouch = {\n timestamp: 0,\n clientX: -100,\n clientY: -100,\n };\n\n protected handleTitleBarTouch = (ev: TouchEvent): void => {\n if (this.readonly$.value) {\n return;\n }\n\n if ((ev.target as HTMLElement).dataset?.teleTitleBarNoDblClick) {\n return; // btns\n }\n\n preventEvent(ev);\n\n const now = Date.now();\n const {\n clientX = this.lastTitleBarTouch.clientX + 100,\n clientY = this.lastTitleBarTouch.clientY + 100,\n } = ev.touches[0] || {};\n\n if (now - this.lastTitleBarTouch.timestamp <= 500) {\n if (\n Math.abs(clientX - this.lastTitleBarTouch.clientX) <= 10 &&\n Math.abs(clientY - this.lastTitleBarTouch.clientY) <= 10\n ) {\n // double click\n if (this.onEvent) {\n this.onEvent({ type: TELE_BOX_DELEGATE_EVENT.Maximize });\n }\n }\n } else if (this.onDragStart) {\n this.onDragStart(ev);\n }\n this.lastTitleBarTouch.timestamp = now;\n this.lastTitleBarTouch.clientX = clientX;\n this.lastTitleBarTouch.clientY = clientY;\n };\n}\n","import type { TeleBoxRect } from \"./typings\";\n\nexport function calcStageRect([rootRect, ratio]: [\n TeleBoxRect,\n number\n]): TeleBoxRect {\n if (ratio <= 0 || rootRect.width <= 0 || rootRect.height <= 0) {\n return rootRect;\n }\n\n const preferredHeight = rootRect.width * ratio;\n if (preferredHeight === rootRect.height) {\n return rootRect;\n }\n\n if (preferredHeight < rootRect.height) {\n return {\n x: 0,\n y: (rootRect.height - preferredHeight) / 2,\n width: rootRect.width,\n height: preferredHeight,\n };\n }\n\n const preferredWidth = rootRect.height / ratio;\n return {\n x: (rootRect.width - preferredWidth) / 2,\n y: 0,\n width: preferredWidth,\n height: rootRect.height,\n };\n}\n","import \"./style.scss\";\n\nimport Emittery from \"emittery\";\nimport styler from \"stylefire\";\nimport shallowequal from \"shallowequal\";\nimport { genUID, SideEffectManager } from \"side-effect-manager\";\nimport type {\n ReadonlyVal,\n ReadonlyValEnhancedResult,\n ValEnhancedResult,\n} from \"value-enhancer\";\nimport {\n combine,\n Val,\n withReadonlyValueEnhancer,\n withValueEnhancer,\n ValManager,\n} from \"value-enhancer\";\nimport type { TeleTitleBar } from \"../TeleTitleBar\";\nimport { DefaultTitleBar } from \"../TeleTitleBar\";\nimport { ResizeObserver as ResizeObserverPolyfill } from \"@juggle/resize-observer\";\nimport {\n clamp,\n flattenEvent,\n getBoxDefaultName,\n isFalsy,\n isTruthy,\n preventEvent,\n} from \"../utils\";\nimport {\n TELE_BOX_EVENT,\n TELE_BOX_STATE,\n TELE_BOX_RESIZE_HANDLE,\n} from \"./constants\";\nimport type {\n TeleBoxConfig,\n TeleBoxHandleType,\n TeleBoxState,\n TeleBoxCoord,\n TeleBoxSize,\n TeleBoxEventConfig,\n TeleBoxEvent,\n TeleBoxDelegateEventConfig,\n TeleBoxRect,\n} from \"./typings\";\nimport { calcStageRect } from \"./utils\";\n\nexport * from \"./constants\";\nexport * from \"./typings\";\n\nconst ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;\n\ntype RequiredTeleBoxConfig = Required<TeleBoxConfig>;\n\ntype ValConfig = {\n title: Val<RequiredTeleBoxConfig[\"title\"], boolean>;\n visible: Val<RequiredTeleBoxConfig[\"visible\"], boolean>;\n resizable: Val<RequiredTeleBoxConfig[\"resizable\"], boolean>;\n draggable: Val<RequiredTeleBoxConfig[\"draggable\"], boolean>;\n boxRatio: Val<RequiredTeleBoxConfig[\"boxRatio\"], boolean>;\n stageRatio: Val<RequiredTeleBoxConfig[\"stageRatio\"], boolean>;\n stageStyle: Val<RequiredTeleBoxConfig[\"stageStyle\"], boolean>;\n bodyStyle: Val<RequiredTeleBoxConfig[\"bodyStyle\"], boolean>;\n};\n\ntype PropsValConfig = {\n darkMode: RequiredTeleBoxConfig[\"darkMode$\"];\n fence: RequiredTeleBoxConfig[\"fence$\"];\n minimized: RequiredTeleBoxConfig[\"minimized$\"];\n maximized: RequiredTeleBoxConfig[\"maximized$\"];\n readonly: RequiredTeleBoxConfig[\"readonly$\"];\n rootRect: RequiredTeleBoxConfig[\"rootRect$\"];\n managerStageRect: RequiredTeleBoxConfig[\"managerStageRect$\"];\n defaultBoxStageStyle: RequiredTeleBoxConfig[\"defaultBoxStageStyle$\"];\n defaultBoxBodyStyle: RequiredTeleBoxConfig[\"defaultBoxBodyStyle$\"];\n collectorRect: RequiredTeleBoxConfig[\"collectorRect$\"];\n};\n\ntype MyReadonlyValConfig = {\n zIndex: Val<RequiredTeleBoxConfig[\"zIndex\"], boolean>;\n focus: Val<RequiredTeleBoxConfig[\"focus\"], boolean>;\n\n minSize: Val<TeleBoxSize, boolean>;\n intrinsicSize: Val<TeleBoxSize, boolean>;\n intrinsicCoord: Val<TeleBoxCoord, boolean>;\n pxMinSize: ReadonlyVal<TeleBoxSize, boolean>;\n pxIntrinsicSize: ReadonlyVal<TeleBoxSize, boolean>;\n pxIntrinsicCoord: ReadonlyVal<TeleBoxCoord, boolean>;\n state: ReadonlyVal<TeleBoxState, boolean>;\n bodyRect: Val<TeleBoxRect>;\n stageRect: ReadonlyVal<TeleBoxRect>;\n};\n\ntype CombinedValEnhancedResult = ReadonlyValEnhancedResult<\n PropsValConfig & MyReadonlyValConfig\n> &\n ValEnhancedResult<ValConfig>;\n\nexport interface TeleBox extends CombinedValEnhancedResult {}\n\nexport class TeleBox {\n public constructor({\n id = genUID(),\n title = getBoxDefaultName(),\n namespace = \"telebox\",\n visible = true,\n width = 0.5,\n height = 0.5,\n minWidth = 0,\n minHeight = 0,\n x = 0.1,\n y = 0.1,\n resizable = true,\n draggable = true,\n boxRatio = -1,\n focus = false,\n zIndex = 100,\n stageRatio = null,\n titleBar,\n content,\n stage,\n footer,\n styles,\n userStyles,\n bodyStyle = null,\n stageStyle = null,\n darkMode$,\n fence$,\n minimized$,\n maximized$,\n readonly$,\n root,\n rootRect$,\n managerStageRect$,\n managerStageRatio$,\n defaultBoxBodyStyle$,\n defaultBoxStageStyle$,\n collectorRect$,\n }: TeleBoxConfig) {\n this._sideEffect = new SideEffectManager();\n\n this.id = id;\n this.namespace = namespace;\n\n const valManager = new ValManager();\n this._sideEffect.addDisposer(() => valManager.destroy());\n\n const title$ = new Val(title);\n const visible$ = new Val(visible);\n const resizable$ = new Val(resizable);\n const draggable$ = new Val(draggable);\n const boxRatio$ = new Val(boxRatio);\n const zIndex$ = new Val(zIndex);\n const focus$ = new Val(focus);\n\n const state$ = combine(\n [minimized$, maximized$],\n ([minimized, maximized]): TeleBoxState =>\n minimized\n ? TELE_BOX_STATE.Minimized\n : maximized\n ? TELE_BOX_STATE.Maximized\n : TELE_BOX_STATE.Normal\n );\n\n const minSize$ = new Val(\n {\n width: clamp(minWidth, 0, 1),\n height: clamp(minHeight, 0, 1),\n },\n { compare: shallowequal }\n );\n\n const pxMinSize$ = combine(\n [minSize$, managerStageRect$],\n ([minSize, managerStageRect]) => ({\n width: minSize.width * managerStageRect.width,\n height: minSize.height * managerStageRect.height,\n }),\n { compare: shallowequal }\n );\n\n const intrinsicSize$ = new Val(\n { width, height },\n { compare: shallowequal }\n );\n\n this._sideEffect.addDisposer(\n // check intrinsicSize overflow\n minSize$.reaction((minSize, skipUpdate) => {\n intrinsicSize$.setValue(\n {\n width: Math.max(width, minSize.width),\n height: Math.max(height, minSize.height),\n },\n skipUpdate\n );\n })\n );\n\n const intrinsicCoord$ = new Val({ x, y }, { compare: shallowequal });\n\n const pxIntrinsicSize$ = combine(\n [intrinsicSize$, managerStageRect$],\n ([size, managerStageRect]) => ({\n width: managerStageRect.width * size.width,\n height: managerStageRect.height * size.height,\n }),\n { compare: shallowequal }\n );\n\n const pxIntrinsicCoord$ = combine(\n [intrinsicCoord$, managerStageRect$],\n ([intrinsicCoord, managerStageRect]) => ({\n x: intrinsicCoord.x * managerStageRect.width,\n y: intrinsicCoord.y * managerStageRect.height,\n }),\n { compare: shallowequal }\n );\n\n const bodyStyle$ = new Val<string | null>(bodyStyle);\n const stageStyle$ = new Val<string | null>(stageStyle);\n\n const contentRoot$ = new Val<HTMLElement | null>(null);\n const bodyRect$ = new Val<TeleBoxRect>(managerStageRect$.value, {\n compare: shallowequal,\n });\n const stageRatio$ = new Val(stageRatio);\n const finalStageRatio$ = combine(\n [stageRatio$, managerStageRatio$],\n ([stageRatio, managerStageRatio]) => stageRatio ?? managerStageRatio\n );\n const stageRect$ = combine(\n [bodyRect$, finalStageRatio$],\n calcStageRect,\n { compare: shallowequal }\n );\n\n const propsValConfig: PropsValConfig = {\n darkMode: darkMode$,\n fence: fence$,\n minimized: minimized$,\n maximized: maximized$,\n readonly: readonly$,\n rootRect: rootRect$,\n managerStageRect: managerStageRect$,\n defaultBoxBodyStyle: defaultBoxBodyStyle$,\n defaultBoxStageStyle: defaultBoxStageStyle$,\n collectorRect: collectorRect$,\n };\n\n withReadonlyValueEnhancer(this, propsValConfig);\n\n const myReadonlyValConfig: MyReadonlyValConfig = {\n zIndex: zIndex$,\n focus: focus$,\n\n state: state$,\n minSize: minSize$,\n pxMinSize: pxMinSize$,\n intrinsicSize: intrinsicSize$,\n intrinsicCoord: intrinsicCoord$,\n pxIntrinsicSize: pxIntrinsicSize$,\n pxIntrinsicCoord: pxIntrinsicCoord$,\n bodyRect: bodyRect$,\n stageRect: stageRect$,\n };\n\n withReadonlyValueEnhancer(this, myReadonlyValConfig, valManager);\n\n const valConfig: ValConfig = {\n title: title$,\n visible: visible$,\n resizable: resizable$,\n draggable: draggable$,\n boxRatio: boxRatio$,\n stageRatio: stageRatio$,\n bodyStyle: bodyStyle$,\n stageStyle: stageStyle$,\n };\n\n withValueEnhancer(this, valConfig, valManager);\n\n this.titleBar =\n titleBar ||\n new DefaultTitleBar({\n readonly$: readonly$,\n state$: state$,\n title$: title$,\n namespace: this.namespace,\n onDragStart: (event) => this._handleTrackStart?.(event),\n onEvent: (event) => this._delegateEvents.emit(event.type),\n });\n\n this._sideEffect.addDisposer(\n boxRatio$.subscribe((boxRatio) => {\n if (boxRatio > 0) {\n this.transform(\n pxIntrinsicCoord$.value.x,\n pxIntrinsicCoord$.value.y,\n pxIntrinsicSize$.value.width,\n pxIntrinsicSize$.value.height\n );\n }\n })\n );\n\n this._sideEffect.addDisposer(\n fence$.subscribe((fence) => {\n if (fence) {\n this.move(\n pxIntrinsicCoord$.value.x,\n pxIntrinsicCoord$.value.y\n );\n }\n })\n );\n\n this.$box = this._render();\n contentRoot$.setValue(this.$content.parentElement);\n content && this.mountContent(content);\n stage && this.mountStage(stage);\n footer && this.mountFooter(footer);\n styles && this.mountStyles(styles);\n userStyles && this.mountUserStyles(userStyles);\n root.appendChild(this.$box);\n\n const watchValEvent = <E extends TeleBoxEvent>(\n val: ReadonlyVal<TeleBoxEventConfig[E], boolean>,\n event: E\n ) => {\n this._sideEffect.addDisposer(\n val.reaction((v, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit<any>(event, v);\n }\n })\n );\n };\n\n watchValEvent(darkMode$, TELE_BOX_EVENT.DarkMode);\n watchValEvent(readonly$, TELE_BOX_EVENT.Readonly);\n watchValEvent(zIndex$, TELE_BOX_EVENT.ZIndex);\n watchValEvent(minimized$, TELE_BOX_EVENT.Minimized);\n watchValEvent(maximized$, TELE_BOX_EVENT.Maximized);\n watchValEvent(state$, TELE_BOX_EVENT.State);\n watchValEvent(intrinsicSize$, TELE_BOX_EVENT.IntrinsicResize);\n watchValEvent(intrinsicCoord$, TELE_BOX_EVENT.IntrinsicMove);\n\n this._sideEffect.addDisposer([\n visible$.reaction((visible, skipUpdate) => {\n if (!skipUpdate && !visible) {\n this.events.emit(TELE_BOX_EVENT.Close);\n }\n }),\n focus$.reaction((focus, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n focus ? TELE_BOX_EVENT.Focus : TELE_BOX_EVENT.Blur\n );\n }\n }),\n ]);\n }\n\n public readonly id: string;\n\n /** ClassName Prefix. For CSS styling. Default \"telebox\" */\n public readonly namespace: string;\n\n public readonly events = new Emittery<\n TeleBoxEventConfig,\n TeleBoxEventConfig\n >();\n\n public readonly _delegateEvents = new Emittery<\n TeleBoxDelegateEventConfig,\n TeleBoxDelegateEventConfig\n >();\n\n protected _sideEffect: SideEffectManager;\n\n public titleBar: TeleTitleBar;\n\n /** Minimum box width relative to stage area. 0~1. Default 0. */\n public get minWidth(): number {\n return this._minSize$.value.width;\n }\n\n /** Minimum box height relative to stage area. 0~1. Default 0. */\n public get minHeight(): number {\n return this._minSize$.value.height;\n }\n\n /**\n * @param minWidth Minimum box width relative to stage area. 0~1.\n * @returns this\n */\n public setMinWidth(minWidth: number, skipUpdate = false): void {\n this._minSize$.setValue(\n { width: minWidth, height: this.minHeight },\n skipUpdate\n );\n }\n\n /**\n * @param minHeight Minimum box height relative to container element. 0~1.\n * @returns this\n */\n public setMinHeight(minHeight: number, skipUpdate = false): void {\n this._minSize$.setValue(\n { width: this.minWidth, height: minHeight },\n skipUpdate\n );\n }\n\n /**\n * Resize box.\n * @param width Box width relative to container element. 0~1.\n * @param height Box height relative to container element. 0~1.\n * @param skipUpdate Skip emitting event.\n * @returns this\n */\n public resize(width: number, height: number, skipUpdate = false): void {\n this._intrinsicSize$.setValue(\n {\n width: Math.max(width, this.minWidth),\n height: Math.max(height, this.minHeight),\n },\n skipUpdate\n );\n }\n\n /** Intrinsic box x position relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicX(): number {\n return this._intrinsicCoord$.value.x;\n }\n\n /** Intrinsic box y position relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicY(): number {\n return this._intrinsicCoord$.value.y;\n }\n\n /** Intrinsic box width relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicWidth(): number {\n return this._intrinsicSize$.value.width;\n }\n\n /** Intrinsic box height relative to container element(without counting the effect of maximization or minimization). 0~1. Default 0.1. */\n public get intrinsicHeight(): number {\n return this._intrinsicSize$.value.height;\n }\n\n /**\n * Move box position.\n * @param x x position in px.\n * @param y y position in px.\n * @param skipUpdate Skip emitting event.\n * @returns this\n */\n protected move(x: number, y: number, skipUpdate = false): void {\n let safeX: number;\n let safeY: number;\n const managerStageRect = this.managerStageRect;\n const pxIntrinsicSize = this.pxIntrinsicSize;\n\n if (this.fence) {\n safeX = clamp(x, 0, managerStageRect.width - pxIntrinsicSize.width);\n safeY = clamp(\n y,\n 0,\n managerStageRect.height - pxIntrinsicSize.height\n );\n } else {\n safeX = clamp(\n x,\n -(pxIntrinsicSize.width - 120),\n 0 + managerStageRect.width - 20\n );\n safeY = clamp(y, 0, 0 + managerStageRect.height - 20);\n }\n\n this._intrinsicCoord$.setValue(\n {\n x: safeX / managerStageRect.width,\n y: safeY / managerStageRect.height,\n },\n skipUpdate\n );\n }\n\n /**\n * Resize + Move, with respect to fixed ratio.\n * @param x x position in px.\n * @param y y position in px.\n * @param width Box width in px.\n * @param height Box height in px.\n * @param skipUpdate Skip emitting event.\n * @returns this\n */\n protected transform(\n x: number,\n y: number,\n width: number,\n height: number,\n skipUpdate = false\n ): void {\n const managerStageRect = this.managerStageRect;\n\n width = Math.max(width, this.pxMinSize.width);\n height = Math.max(height, this.pxMinSize.height);\n\n if (this.boxRatio > 0) {\n const newHeight = this.boxRatio * width;\n if (y !== this.pxIntrinsicCoord.y) {\n y -= newHeight - height;\n }\n height = newHeight;\n }\n\n if (y < 0) {\n y = 0;\n height = this.pxIntrinsicSize.height;\n }\n\n this.move(x, y, skipUpdate);\n this._intrinsicSize$.setValue(\n {\n width: width / managerStageRect.width,\n height: height / managerStageRect.height,\n },\n skipUpdate\n );\n }\n\n private $authorContent?: HTMLElement;\n\n /** Mount dom to box content. */\n public mountContent(content: HTMLElement): void {\n this.$authorContent?.remove();\n this.$authorContent = content;\n this.$content.appendChild(content);\n }\n\n /** Unmount content from the box. */\n public unmountContent(): void {\n if (this.$authorContent) {\n this.$authorContent.remove();\n this.$authorContent = undefined;\n }\n }\n\n private $authorStage?: HTMLElement;\n\n /** Mount dom to box stage. */\n public mountStage(stage: HTMLElement): void {\n this.$authorStage?.remove();\n this.$authorStage = stage;\n if (!this.$stage) {\n this.$stage = this._renderStage();\n }\n this.$stage.appendChild(stage);\n if (!this.$stage.parentElement) {\n this.$body.appendChild(this.$stage);\n }\n }\n\n /** Unmount content from the box. */\n public unmountStage(): void {\n if (this.$authorStage) {\n this.$authorStage.remove();\n this.$authorStage = undefined;\n }\n this.$stage?.remove();\n }\n\n private $authorFooter?: HTMLElement;\n\n /** Mount dom to box Footer. */\n public mountFooter(footer: HTMLElement): void {\n this.$authorFooter?.remove();\n this.$authorFooter = footer;\n this.$footer.appendChild(footer);\n }\n\n /** Unmount Footer from the box. */\n public unmountFooter(): void {\n if (this.$authorFooter) {\n this.$authorFooter.remove();\n this.$authorFooter = undefined;\n }\n }\n\n /** Mount styles for box content */\n public mountStyles(styles: string): void {\n this.$styles.textContent = styles;\n }\n\n /** Umount styles for box content */\n public unmountStyles(): void {\n this.$styles.textContent = \"\";\n }\n\n /** Mount user styles for box content */\n public mountUserStyles(styles: string): void {\n this.$userStyles.textContent = styles;\n }\n\n /** Umount user styles for box content */\n public unmountUserStyles(): void {\n this.$userStyles.textContent = \"\";\n }\n\n /** DOM of the box */\n public $box: HTMLElement;\n\n /** DOM of the box body */\n public $body!: HTMLElement;\n\n /** DOM of the box content container inside box body */\n public $content!: HTMLElement;\n\n /** DOM of the box stage area inside box body */\n public $stage?: HTMLElement;\n\n /** DOM of custom box content styles */\n public $styles!: HTMLStyleElement;\n\n /** DOM of end user custom box content styles */\n public $userStyles!: HTMLStyleElement;\n\n /** DOM of the box title bar container */\n public $titleBar!: HTMLElement;\n\n /** DOM of the box footer container */\n public $footer!: HTMLElement;\n\n private _render(): HTMLElement {\n if (this.$box) {\n return this.$box;\n }\n\n this.$box = document.createElement(\"div\");\n\n this.$box.classList.add(this.wrapClassName(\"box\"));\n\n const bindClassName = <TValue>(\n el: Element,\n val: ReadonlyVal<TValue, boolean>,\n className: string,\n predicate: (value: TValue) => boolean = isTruthy\n ): string => {\n return this._sideEffect.add(() => {\n const wrappedClassName = this.wrapClassName(className);\n return val.subscribe((value) => {\n el.classList.toggle(wrappedClassName, predicate(value));\n });\n });\n };\n\n bindClassName(this.$box, this._readonly$, \"readonly\");\n bindClassName(this.$box, this._draggable$, \"no-drag\", isFalsy);\n bindClassName(this.$box, this._resizable$, \"no-resize\", isFalsy);\n bindClassName(this.$box, this._focus$, \"blur\", isFalsy);\n bindClassName(this.$box, this._darkMode$, \"color-scheme-dark\");\n bindClassName(\n this.$box,\n this._darkMode$,\n \"color-scheme-light\",\n isFalsy\n );\n\n this._sideEffect.add(() => {\n const minimizedClassName = this.wrapClassName(\"minimized\");\n const maximizedClassName = this.wrapClassName(\"maximized\");\n const MAXIMIZED_TIMER_ID = \"box-maximized-timer\";\n\n return this._state$.subscribe((state) => {\n this.$box.classList.toggle(\n minimizedClassName,\n state === TELE_BOX_STATE.Minimized\n );\n\n if (state === TELE_BOX_STATE.Maximized) {\n this._sideEffect.flush(MAXIMIZED_TIMER_ID);\n this.$box.classList.toggle(maximizedClassName, true);\n } else {\n // delay so that transition won't be triggered\n this._sideEffect.setTimeout(\n () => {\n this.$box.classList.toggle(\n maximizedClassName,\n false\n );\n },\n 0,\n MAXIMIZED_TIMER_ID\n );\n }\n });\n });\n\n this._sideEffect.addDisposer(\n this._visible$.subscribe((visible) => {\n this.$box.style.display = visible ? \"block\" : \"none\";\n })\n );\n\n this._sideEffect.addDisposer(\n this._zIndex$.subscribe((zIndex) => {\n this.$box.style.zIndex = String(zIndex);\n })\n );\n\n this.$box.dataset.teleBoxID = this.id;\n\n const boxStyler = styler(this.$box);\n\n const boxStyles$ = combine(\n [\n this._maximized$,\n this._minimized$,\n this._pxIntrinsicSize$,\n this._pxIntrinsicCoord$,\n this._collectorRect$,\n this._rootRect$,\n this._managerStageRect$,\n ],\n ([\n maximized,\n minimized,\n pxIntrinsicSize,\n pxIntrinsicCoord,\n collectorRect,\n rootRect,\n managerStageRect,\n ]) => {\n const styles: {\n x: number;\n y: number;\n width: number;\n height: number;\n scaleX: number;\n scaleY: number;\n } = maximized\n ? {\n x: -managerStageRect.x,\n y: -managerStageRect.y,\n width: rootRect.width,\n height: rootRect.height,\n scaleX: 1,\n scaleY: 1,\n }\n : {\n x: pxIntrinsicCoord.x,\n y: pxIntrinsicCoord.y,\n width: pxIntrinsicSize.width,\n height: pxIntrinsicSize.height,\n scaleX: 1,\n scaleY: 1,\n };\n if (minimized && collectorRect) {\n const { width: boxWidth, height: boxHeight } = maximized\n ? this.rootRect\n : pxIntrinsicSize;\n styles.x =\n collectorRect.x -\n boxWidth / 2 +\n collectorRect.width / 2 -\n managerStageRect.x;\n styles.y =\n collectorRect.y -\n boxHeight / 2 +\n collectorRect.height / 2 -\n managerStageRect.y;\n styles.scaleX = collectorRect.width / boxWidth;\n styles.scaleY = collectorRect.height / boxHeight;\n }\n return styles;\n },\n { compare: shallowequal }\n );\n\n const boxStyles = boxStyles$.value;\n this.$box.style.width = boxStyles.width + \"px\";\n this.$box.style.height = boxStyles.height + \"px\";\n // Add 10px offset on first frame\n // which creates a subtle moving effect\n this.$box.style.transform = `translate(${boxStyles.x - 10}px,${\n boxStyles.y - 10\n }px)`;\n\n this._sideEffect.addDisposer(\n boxStyles$.subscribe((styles) => {\n boxStyler.set(styles);\n })\n );\n\n const $boxMain = document.createElement(\"div\");\n $boxMain.className = this.wrapClassName(\"box-main\");\n this.$box.appendChild($boxMain);\n\n const $titleBar = document.createElement(\"div\");\n $titleBar.className = this.wrapClassName(\"titlebar-wrap\");\n $titleBar.appendChild(this.titleBar.render());\n this.$titleBar = $titleBar;\n\n const $body = document.createElement(\"div\");\n $body.className = this.wrapClassName(\"content-wrap\");\n this.$body = $body;\n\n const $styles = document.createElement(\"style\");\n this.$styles = $styles;\n $body.appendChild($styles);\n\n const $userStyles = document.createElement(\"style\");\n this.$userStyles = $userStyles;\n $body.appendChild($userStyles);\n\n const $content = document.createElement(\"div\");\n $content.className =\n this.wrapClassName(\"content\") + \" tele-fancy-scrollbar\";\n this.$content = $content;\n this._sideEffect.addDisposer(\n combine(\n [this._bodyStyle$, this._defaultBoxBodyStyle$],\n ([bodyStyle, defaultBoxBodyStyle]) =>\n bodyStyle ?? defaultBoxBodyStyle\n ).subscribe((style) => ($content.style.cssText = style || \"\"))\n );\n\n $body.appendChild($content);\n\n const $footer = document.createElement(\"div\");\n $footer.className = this.wrapClassName(\"footer-wrap\");\n this.$footer = $footer;\n\n $boxMain.appendChild($titleBar);\n $boxMain.appendChild($body);\n $boxMain.appendChild($footer);\n\n this._renderResizeHandlers();\n\n const updateBodyRect = (): void => {\n const rect = $body.getBoundingClientRect();\n this._bodyRect$.setValue({\n x: 0,\n y: 0,\n width: rect.width,\n height: rect.height,\n });\n };\n this._sideEffect.add(() => {\n const observer = new ResizeObserver(() => {\n if (!this.minimized) {\n updateBodyRect();\n }\n });\n observer.observe($body);\n return () => observer.disconnect();\n });\n this._sideEffect.addDisposer(\n this._minimized$.reaction((minimized) => {\n // correct content size when restoring from minimized\n if (!minimized) {\n this._sideEffect.setTimeout(\n updateBodyRect,\n 400,\n \"minimized-content-rect-fix\"\n );\n }\n })\n );\n\n return this.$box;\n }\n\n private _renderStage(): HTMLDivElement {\n const $stage = document.createElement(\"div\");\n\n $stage.className = this.wrapClassName(\"content-stage\");\n const updateStageRect = (stageRect: TeleBoxRect): void => {\n $stage.style.top = stageRect.y + \"px\";\n $stage.style.left = stageRect.x + \"px\";\n $stage.style.width = stageRect.width + \"px\";\n $stage.style.height = stageRect.height + \"px\";\n };\n this._sideEffect.addDisposer(\n [\n combine(\n [this._stageStyle$, this._defaultBoxStageStyle$],\n ([stageStyle, defaultBoxStageStyle]) =>\n stageStyle ?? defaultBoxStageStyle\n ).subscribe((styles) => {\n $stage.style.cssText = styles || \"\";\n updateStageRect(this._stageRect$.value);\n }),\n this._stageRect$.subscribe(updateStageRect),\n ],\n \"content-stage-styles\"\n );\n return $stage;\n }\n\n private _handleTrackStart?: (ev: MouseEvent | TouchEvent) => void;\n\n public handleTrackStart: (ev: MouseEvent | TouchEvent) => void = (ev) => {\n return this._handleTrackStart?.(ev);\n };\n\n private _renderResizeHandlers(): void {\n const $resizeHandles = document.createElement(\"div\");\n $resizeHandles.className = this.wrapClassName(\"resize-handles\");\n\n Object.values(TELE_BOX_RESIZE_HANDLE).forEach((handleType) => {\n const $handle = document.createElement(\"div\");\n $handle.className =\n this.wrapClassName(handleType) +\n \" \" +\n this.wrapClassName(\"resize-handle\");\n $handle.dataset.teleBoxHandle = handleType;\n\n $resizeHandles.appendChild($handle);\n });\n\n this.$box.appendChild($resizeHandles);\n\n const TRACKING_DISPOSER_ID = \"handle-tracking-listener\";\n const transformingClassName = this.wrapClassName(\"transforming\");\n\n let $trackMask: HTMLElement | undefined;\n\n let trackStartX = 0;\n let trackStartY = 0;\n\n let trackStartWidth = 0;\n let trackStartHeight = 0;\n\n let trackStartPageX = 0;\n let trackStartPageY = 0;\n\n let trackingHandle: TeleBoxHandleType | undefined;\n\n const handleTracking = (ev: MouseEvent | TouchEvent): void => {\n if (this.state !== TELE_BOX_STATE.Normal) {\n return;\n }\n\n preventEvent(ev);\n\n let { pageX, pageY } = flattenEvent(ev);\n if (pageY < 0) {\n pageY = 0;\n }\n\n const offsetX = pageX - trackStartPageX;\n const offsetY = pageY - trackStartPageY;\n\n let { x: newX, y: newY } = this.pxIntrinsicCoord;\n let { width: newWidth, height: newHeight } = this.pxIntrinsicSize;\n\n switch (trackingHandle) {\n case TELE_BOX_RESIZE_HANDLE.North: {\n newY = trackStartY + offsetY;\n newHeight = trackStartHeight - offsetY;\n break;\n }\n // eslint-disable-next-line no-fallthrough\n case TELE_BOX_RESIZE_HANDLE.South: {\n newHeight = trackStartHeight + offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.West: {\n newX = trackStartX + offsetX;\n newWidth = trackStartWidth - offsetX;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.East: {\n newWidth = trackStartWidth + offsetX;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.NorthWest: {\n newX = trackStartX + offsetX;\n newY = trackStartY + offsetY;\n newWidth = trackStartWidth - offsetX;\n newHeight = trackStartHeight - offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.NorthEast: {\n newY = trackStartY + offsetY;\n newWidth = trackStartWidth + offsetX;\n newHeight = trackStartHeight - offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.SouthEast: {\n newWidth = trackStartWidth + offsetX;\n newHeight = trackStartHeight + offsetY;\n break;\n }\n case TELE_BOX_RESIZE_HANDLE.SouthWest: {\n newX = trackStartX + offsetX;\n newWidth = trackStartWidth - offsetX;\n newHeight = trackStartHeight + offsetY;\n break;\n }\n default: {\n this.move(trackStartX + offsetX, trackStartY + offsetY);\n return;\n }\n }\n\n this.transform(newX, newY, newWidth, newHeight);\n };\n\n const handleTrackEnd = (ev: MouseEvent | TouchEvent): void => {\n trackingHandle = void 0;\n\n if (!$trackMask) {\n return;\n }\n\n preventEvent(ev);\n\n this.$box.classList.toggle(transformingClassName, false);\n\n this._sideEffect.flush(TRACKING_DISPOSER_ID);\n\n $trackMask.remove();\n };\n\n const handleTrackStart = (ev: MouseEvent | TouchEvent): void => {\n if (this.readonly) {\n return;\n }\n\n if (\n (ev as MouseEvent).button != null &&\n (ev as MouseEvent).button !== 0\n ) {\n // Not left mouse\n return;\n }\n\n if (\n !this.draggable ||\n trackingHandle ||\n this.state !== TELE_BOX_STATE.Normal\n ) {\n return;\n }\n\n const target = ev.target as HTMLElement;\n if (target.dataset?.teleBoxHandle) {\n preventEvent(ev);\n\n ({ x: trackStartX, y: trackStartY } = this.pxIntrinsicCoord);\n ({ width: trackStartWidth, height: trackStartHeight } =\n this.pxIntrinsicSize);\n\n ({ pageX: trackStartPageX, pageY: trackStartPageY } =\n flattenEvent(ev));\n\n trackingHandle = target.dataset\n .teleBoxHandle as TELE_BOX_RESIZE_HANDLE;\n\n if (!$trackMask) {\n $trackMask = document.createElement(\"div\");\n }\n\n const cursor = trackingHandle\n ? this.wrapClassName(`cursor-${trackingHandle}`)\n : \"\";\n\n $trackMask.className = this.wrapClassName(\n `track-mask${cursor ? ` ${cursor}` : \"\"}`\n );\n\n this.$box.appendChild($trackMask);\n\n this.$box.classList.add(transformingClassName);\n\n this._sideEffect.add(() => {\n window.addEventListener(\"mousemove\", handleTracking);\n window.addEventListener(\"touchmove\", handleTracking, {\n passive: false,\n });\n window.addEventListener(\"mouseup\", handleTrackEnd);\n window.addEventListener(\"touchend\", handleTrackEnd, {\n passive: false,\n });\n window.addEventListener(\"touchcancel\", handleTrackEnd, {\n passive: false,\n });\n\n return () => {\n window.removeEventListener(\"mousemove\", handleTracking);\n window.removeEventListener(\"touchmove\", handleTracking);\n window.removeEventListener(\"mouseup\", handleTrackEnd);\n window.removeEventListener(\"touchend\", handleTrackEnd);\n window.removeEventListener(\n \"touchcancel\",\n handleTrackEnd\n );\n };\n }, TRACKING_DISPOSER_ID);\n }\n };\n\n this._handleTrackStart = handleTrackStart;\n\n this._sideEffect.addEventListener(\n $resizeHandles,\n \"mousedown\",\n handleTrackStart,\n {},\n \"box-resizeHandles-mousedown\"\n );\n\n this._sideEffect.addEventListener(\n $resizeHandles,\n \"touchstart\",\n handleTrackStart,\n { passive: false },\n \"box-resizeHandles-touchstart\"\n );\n }\n\n public async destroy(): Promise<void> {\n this.$box.remove();\n this._sideEffect.flushAll();\n this._sideEffect.flushAll();\n\n await this.events.emit(TELE_BOX_EVENT.Destroyed);\n this.events.clearListeners();\n this._delegateEvents.clearListeners();\n }\n\n /**\n * Wrap a className with namespace\n */\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n}\n\ntype PropKeys<K = keyof TeleBox> = K extends keyof TeleBox\n ? // eslint-disable-next-line @typescript-eslint/ban-types\n TeleBox[K] extends Function\n ? never\n : K\n : never;\n\nexport type ReadonlyTeleBox = Pick<\n TeleBox,\n | PropKeys\n | \"wrapClassName\"\n | \"mountContent\"\n | \"unmountContent\"\n | \"mountFooter\"\n | \"unmountFooter\"\n | \"mountStage\"\n | \"unmountStage\"\n | \"mountStyles\"\n | \"unmountStyles\"\n | \"setTitle\"\n | \"setDraggable\"\n | \"setResizable\"\n | \"setVisible\"\n | \"setBoxRatio\"\n | \"setStageRatio\"\n | \"setStageStyle\"\n | \"setBodyStyle\"\n | \"handleTrackStart\"\n | \"onValChanged\"\n>;\n","export enum TELE_BOX_MANAGER_EVENT {\n Focused = \"focused\",\n Blurred = \"blurred\",\n Created = \"created\",\n Removed = \"removed\",\n State = \"state\",\n Maximized = \"maximized\",\n Minimized = \"minimized\",\n IntrinsicMove = \"intrinsic_move\",\n IntrinsicResize = \"intrinsic_resize\",\n ZIndex = \"z_index\",\n PrefersColorScheme = \"prefers_color_scheme\",\n DarkMode = \"dark_mode\",\n}\n","import \"./style.scss\";\nimport collectorSVG from \"./icons/collector.svg\";\nimport type { TeleStyles } from \"../typings\";\nimport type {\n ReadonlyVal,\n ReadonlyValEnhancedResult,\n ValEnhancedResult,\n} from \"value-enhancer\";\nimport { derive } from \"value-enhancer\";\nimport {\n withValueEnhancer,\n combine,\n Val,\n withReadonlyValueEnhancer,\n ValManager,\n} from \"value-enhancer\";\nimport { SideEffectManager } from \"side-effect-manager\";\nimport type { TeleBoxRect } from \"../TeleBox/typings\";\n\nexport interface TeleBoxCollectorConfig {\n namespace?: string;\n styles?: TeleStyles;\n root$: ReadonlyVal<HTMLElement | null>;\n minimized$: Val<boolean>;\n readonly$: ReadonlyVal<boolean>;\n darkMode$: ReadonlyVal<boolean>;\n}\n\ntype ValConfig = {\n styles: Val<TeleStyles>;\n $collector: Val<HTMLElement>;\n};\n\ntype PropsValConfig = {\n root: TeleBoxCollectorConfig[\"root$\"];\n};\n\ntype MyReadonlyValConfig = {\n rect: ReadonlyVal<TeleBoxRect | undefined>;\n visible: ReadonlyVal<boolean>;\n};\n\ntype CombinedValEnhancedResult = ValEnhancedResult<ValConfig> &\n ReadonlyValEnhancedResult<PropsValConfig & MyReadonlyValConfig>;\n\nexport interface TeleBoxCollector extends CombinedValEnhancedResult {}\n\nexport class TeleBoxCollector {\n public constructor({\n minimized$,\n readonly$,\n darkMode$,\n namespace = \"telebox\",\n styles = {},\n root$,\n }: TeleBoxCollectorConfig) {\n this.namespace = namespace;\n\n const valManager = new ValManager();\n this._sideEffect.addDisposer(() => valManager.destroy());\n\n const rect$ = new Val<TeleBoxRect | undefined>(void 0);\n const visible$ = derive(minimized$);\n const styles$ = new Val(styles);\n const el$ = new Val<HTMLElement>(document.createElement(\"button\"));\n\n const valConfig: ValConfig = {\n styles: styles$,\n $collector: el$,\n };\n\n withValueEnhancer(this, valConfig, valManager);\n\n const propsValConfig: PropsValConfig = {\n root: root$,\n };\n\n withReadonlyValueEnhancer(this, propsValConfig);\n\n const myReadonlyValConfig: MyReadonlyValConfig = {\n rect: rect$,\n visible: visible$,\n };\n\n withReadonlyValueEnhancer(this, myReadonlyValConfig, valManager);\n\n el$.value.className = this.wrapClassName(\"collector\");\n el$.value.style.backgroundImage = `url('${collectorSVG}')`;\n\n this._sideEffect.addDisposer(\n el$.subscribe(($collector) => {\n this._sideEffect.addEventListener(\n $collector,\n \"click\",\n () => {\n if (!readonly$.value) {\n minimized$.setValue(false);\n }\n },\n {},\n \"telebox-collector-click\"\n );\n\n this._sideEffect.addDisposer(\n [\n visible$.subscribe((visible) => {\n $collector.classList.toggle(\n this.wrapClassName(\"collector-visible\"),\n visible\n );\n }),\n readonly$.subscribe((readonly) => {\n $collector.classList.toggle(\n this.wrapClassName(\"collector-readonly\"),\n readonly\n );\n }),\n darkMode$.subscribe((darkMode) => {\n $collector.classList.toggle(\n this.wrapClassName(\"color-scheme-dark\"),\n darkMode\n );\n $collector.classList.toggle(\n this.wrapClassName(\"color-scheme-light\"),\n !darkMode\n );\n }),\n styles$.subscribe((styles) => {\n Object.keys(styles).forEach((key) => {\n const value = styles[\n key as keyof TeleStyles\n ] as string;\n if (value != null) {\n $collector.style[key as keyof TeleStyles] =\n value;\n }\n });\n }),\n root$.subscribe((root) => {\n if (root) {\n root.appendChild($collector);\n }\n }),\n // Place after $collector appended to the DOM so that rect calc works\n combine([minimized$, root$]).subscribe(\n ([minimized, root]) => {\n if (minimized && root) {\n const { x, y, width, height } =\n $collector.getBoundingClientRect();\n const rootRect =\n root.getBoundingClientRect();\n rect$.setValue({\n x: x - rootRect.x,\n y: y - rootRect.y,\n width,\n height,\n });\n }\n }\n ),\n ],\n \"telebox-collector-el\"\n );\n })\n );\n }\n\n public readonly namespace: string;\n\n protected readonly _sideEffect = new SideEffectManager();\n\n public destroy(): void {\n this._sideEffect.flushAll();\n }\n\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n}\n","import \"./style.scss\";\n\nimport type { TeleBox } from \"../../TeleBox\";\nimport type { DefaultTitleBarConfig } from \"../../TeleTitleBar\";\nimport { DefaultTitleBar } from \"../../TeleTitleBar\";\nimport { TELE_BOX_STATE } from \"../../TeleBox/constants\";\nimport type { TeleBoxRect } from \"../../TeleBox/typings\";\nimport type { ReadonlyVal } from \"value-enhancer\";\nimport { combine } from \"value-enhancer\";\n\nexport type MaxTitleBarTitle = Pick<TeleBox, \"id\" | \"title\">;\n\nexport interface MaxTitleBarConfig extends DefaultTitleBarConfig {\n darkMode$: ReadonlyVal<boolean>;\n boxes$: ReadonlyVal<TeleBox[]>;\n rootRect$: ReadonlyVal<TeleBoxRect>;\n root$: ReadonlyVal<HTMLElement | null>;\n}\n\nexport class MaxTitleBar extends DefaultTitleBar {\n public constructor(config: MaxTitleBarConfig) {\n super(config);\n\n this.boxes$ = config.boxes$;\n this.rootRect$ = config.rootRect$;\n this.darkMode$ = config.darkMode$;\n\n this.sideEffect.addDisposer(\n config.root$.subscribe((root) => {\n if (root) {\n root.appendChild(this.render());\n } else if (this.$titleBar?.parentNode) {\n this.$titleBar.remove();\n }\n })\n );\n }\n\n public focusBox(box?: TeleBox): void {\n if (this.focusedBox && this.focusedBox === box) {\n return;\n }\n\n if (this.$titles && this.state$.value === TELE_BOX_STATE.Maximized) {\n const { children } = this.$titles.firstElementChild as HTMLElement;\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const $tab = children[i] as HTMLElement;\n const id = $tab.dataset?.teleBoxID;\n if (id) {\n if (box && id === box.id) {\n $tab.classList.toggle(\n this.wrapClassName(\"titles-tab-focus\"),\n true\n );\n } else if (this.focusedBox && id === this.focusedBox.id) {\n $tab.classList.toggle(\n this.wrapClassName(\"titles-tab-focus\"),\n false\n );\n }\n }\n }\n }\n this.focusedBox = box;\n }\n\n public render(): HTMLElement {\n if (this.$titleBar) {\n return this.$titleBar;\n }\n\n const $titleBar = super.render();\n\n $titleBar.classList.add(this.wrapClassName(\"max-titlebar\"));\n\n this.sideEffect.addDisposer(\n [\n this.state$.subscribe((state) => {\n $titleBar.classList.toggle(\n this.wrapClassName(\"max-titlebar-maximized\"),\n state === TELE_BOX_STATE.Maximized\n );\n }),\n this.readonly$.subscribe((readonly) => {\n $titleBar.classList.toggle(\n this.wrapClassName(\"readonly\"),\n readonly\n );\n }),\n this.darkMode$.subscribe((darkMode) => {\n $titleBar.classList.toggle(\n this.wrapClassName(\"color-scheme-dark\"),\n darkMode\n );\n $titleBar.classList.toggle(\n this.wrapClassName(\"color-scheme-light\"),\n !darkMode\n );\n }),\n combine([this.state$, this.boxes$]).subscribe(\n ([state, titles]) => {\n if (state === TELE_BOX_STATE.Maximized) {\n $titleBar.classList.toggle(\n this.wrapClassName(\"max-titlebar-single-title\"),\n titles.length === 1\n );\n if (titles.length !== 1) {\n $titleBar.replaceChild(\n this.renderTitles(),\n $titleBar.firstElementChild as HTMLElement\n );\n }\n }\n }\n ),\n ],\n \"max-render\"\n );\n\n const $titlesArea = document.createElement(\"div\");\n $titlesArea.classList.add(this.wrapClassName(\"titles-area\"));\n $titleBar.insertBefore($titlesArea, $titleBar.firstElementChild);\n\n return $titleBar;\n }\n\n public destroy(): void {\n super.destroy();\n this.$titles = void 0;\n this.focusedBox = void 0;\n }\n\n protected renderTitles(): HTMLElement {\n this.$titles = document.createElement(\"div\");\n this.$titles.className = this.wrapClassName(\"titles\");\n\n this.sideEffect.addEventListener(\n this.$titles,\n \"wheel\",\n (ev) => {\n (ev.currentTarget as HTMLElement).scrollBy({\n left: ev.deltaY > 0 ? 250 : -250,\n behavior: \"smooth\",\n });\n },\n { passive: false },\n \"max-render-wheel-titles\"\n );\n\n const $content = document.createElement(\"div\");\n $content.className = this.wrapClassName(\"titles-content\");\n this.$titles.appendChild($content);\n\n const disposers = this.boxes$.value.map((box) => {\n const $tab = document.createElement(\"button\");\n $tab.className = this.wrapClassName(\"titles-tab\");\n $tab.textContent = box.title;\n $tab.dataset.teleBoxID = box.id;\n $tab.dataset.teleTitleBarNoDblClick = \"true\";\n\n if (this.focusedBox && box.id === this.focusedBox.id) {\n $tab.classList.add(this.wrapClassName(\"titles-tab-focus\"));\n }\n\n $content.appendChild($tab);\n\n return box._title$.reaction((title) => ($tab.textContent = title));\n });\n\n this.sideEffect.addDisposer(\n () => disposers.forEach((disposer) => disposer()),\n \"max-render-tab-titles\"\n );\n\n return this.$titles;\n }\n\n public focusedBox: TeleBox | undefined;\n\n protected darkMode$: MaxTitleBarConfig[\"darkMode$\"];\n protected boxes$: MaxTitleBarConfig[\"boxes$\"];\n protected rootRect$: MaxTitleBarConfig[\"rootRect$\"];\n\n protected $titles: HTMLElement | undefined;\n}\n","import \"./style.scss\";\n\nimport shallowequal from \"shallowequal\";\nimport { ResizeObserver as ResizeObserverPolyfill } from \"@juggle/resize-observer\";\nimport { SideEffectManager } from \"side-effect-manager\";\nimport type {\n ReadonlyVal,\n ValEnhancedResult,\n ReadonlyValEnhancedResult,\n} from \"value-enhancer\";\nimport { derive } from \"value-enhancer\";\nimport {\n combine,\n Val,\n withValueEnhancer,\n withReadonlyValueEnhancer,\n ValManager,\n} from \"value-enhancer\";\nimport Emittery from \"emittery\";\nimport type {\n ReadonlyTeleBox,\n TeleBoxColorScheme,\n TeleBoxRect,\n TeleBoxState,\n} from \"../TeleBox\";\nimport {\n TeleBox,\n TELE_BOX_EVENT,\n TELE_BOX_STATE,\n TELE_BOX_COLOR_SCHEME,\n TELE_BOX_DELEGATE_EVENT,\n} from \"../TeleBox\";\nimport { TeleBoxCollector } from \"../TeleBoxCollector\";\nimport { TELE_BOX_MANAGER_EVENT } from \"./constants\";\nimport type {\n TeleBoxManagerConfig,\n TeleBoxManagerCreateConfig,\n TeleBoxManagerEventConfig,\n TeleBoxManagerQueryConfig,\n TeleBoxManagerUpdateConfig,\n} from \"./typings\";\nimport { MaxTitleBar } from \"./MaxTitleBar\";\nimport { calcStageRect } from \"../TeleBox/utils\";\n\nexport * from \"./typings\";\nexport * from \"./constants\";\n\nconst ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;\n\ntype ReadonlyValConfig = {\n darkMode: ReadonlyVal<boolean, boolean>;\n state: ReadonlyVal<TeleBoxState, boolean>;\n root: Val<HTMLElement | null>;\n rootRect: Val<TeleBoxRect>;\n stageRect: ReadonlyVal<TeleBoxRect>;\n};\n\ntype ValConfig = {\n prefersColorScheme: Val<TeleBoxColorScheme, boolean>;\n readonly: Val<boolean, boolean>;\n minimized: Val<boolean, boolean>;\n maximized: Val<boolean, boolean>;\n fence: Val<boolean, boolean>;\n stageRatio: Val<number, boolean>;\n containerStyle: Val<string>;\n stageStyle: Val<string>;\n defaultBoxBodyStyle: Val<string | null>;\n defaultBoxStageStyle: Val<string | null>;\n};\n\ntype CombinedValEnhancedResult = ValEnhancedResult<ValConfig> &\n ReadonlyValEnhancedResult<ReadonlyValConfig>;\n\nexport interface TeleBoxManager extends CombinedValEnhancedResult {}\n\nexport class TeleBoxManager {\n public constructor({\n root = null,\n prefersColorScheme = TELE_BOX_COLOR_SCHEME.Light,\n minimized = false,\n maximized = false,\n fence = true,\n collector,\n namespace = \"telebox\",\n readonly = false,\n stageRatio = -1,\n containerStyle = \"\",\n stageStyle = \"\",\n defaultBoxBodyStyle = null,\n defaultBoxStageStyle = null,\n }: TeleBoxManagerConfig = {}) {\n this._sideEffect = new SideEffectManager();\n\n this.namespace = namespace;\n\n const valManager = new ValManager();\n this._sideEffect.addDisposer(() => valManager.destroy());\n\n const root$ = new Val(root);\n const readonly$ = new Val(readonly);\n const minimized$ = new Val(minimized);\n const maximized$ = new Val(maximized);\n const fence$ = new Val(fence);\n const containerStyle$ = new Val(containerStyle);\n const stageStyle$ = new Val(stageStyle);\n const stageRatio$ = new Val(stageRatio);\n const defaultBoxBodyStyle$ = new Val(defaultBoxBodyStyle);\n const defaultBoxStageStyle$ = new Val(defaultBoxStageStyle);\n\n const rootRect$ = new Val<TeleBoxRect>(\n {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n { compare: shallowequal }\n );\n this._sideEffect.addDisposer(\n root$.subscribe((root) => {\n this._sideEffect.add(() => {\n if (!root) {\n return () => void 0;\n }\n const observer = new ResizeObserver(() => {\n const rect = root.getBoundingClientRect();\n rootRect$.setValue({\n x: 0,\n y: 0,\n width: rect.width,\n height: rect.height,\n });\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, \"calc-root-rect\");\n })\n );\n\n const stageRect$ = combine([rootRect$, stageRatio$], calcStageRect, {\n compare: shallowequal,\n });\n\n this.boxes$ = new Val<TeleBox[]>([]);\n this.topBox$ = new Val<TeleBox | undefined>(undefined);\n this._sideEffect.addDisposer(\n this.boxes$.subscribe((boxes) => {\n if (boxes.length > 0) {\n const topBox = boxes.reduce((topBox, box) =>\n topBox.zIndex > box.zIndex ? topBox : box\n );\n this.topBox$.setValue(topBox);\n } else {\n this.topBox$.setValue(undefined);\n }\n })\n );\n\n const prefersDarkMatch = window.matchMedia(\n \"(prefers-color-scheme: dark)\"\n );\n const prefersDark$ = new Val(false);\n if (prefersDarkMatch) {\n prefersDark$.setValue(prefersDarkMatch.matches);\n this._sideEffect.add(() => {\n const handler = (evt: MediaQueryListEvent): void => {\n prefersDark$.setValue(evt.matches);\n };\n prefersDarkMatch.addEventListener(\"change\", handler);\n return () =>\n prefersDarkMatch.removeEventListener(\"change\", handler);\n });\n }\n\n const prefersColorScheme$ = new Val(prefersColorScheme);\n this._sideEffect.addDisposer(\n prefersColorScheme$.reaction((prefersColorScheme, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.PrefersColorScheme,\n prefersColorScheme\n );\n }\n })\n );\n\n const darkMode$ = combine(\n [prefersDark$, prefersColorScheme$],\n ([prefersDark, prefersColorScheme]) =>\n prefersColorScheme === \"auto\"\n ? prefersDark\n : prefersColorScheme === \"dark\"\n );\n\n const state$ = combine(\n [minimized$, maximized$],\n ([minimized, maximized]): TeleBoxState =>\n minimized\n ? TELE_BOX_STATE.Minimized\n : maximized\n ? TELE_BOX_STATE.Maximized\n : TELE_BOX_STATE.Normal\n );\n\n this.collector =\n collector ??\n new TeleBoxCollector({\n minimized$: minimized$,\n readonly$: readonly$,\n darkMode$: darkMode$,\n namespace,\n root$,\n });\n\n const readonlyValConfig: ReadonlyValConfig = {\n darkMode: darkMode$,\n state: state$,\n root: root$,\n rootRect: rootRect$,\n stageRect: stageRect$,\n };\n\n withReadonlyValueEnhancer(this, readonlyValConfig, valManager);\n\n const valConfig: ValConfig = {\n prefersColorScheme: prefersColorScheme$,\n readonly: readonly$,\n fence: fence$,\n minimized: minimized$,\n maximized: maximized$,\n stageRatio: stageRatio$,\n containerStyle: containerStyle$,\n stageStyle: stageStyle$,\n defaultBoxBodyStyle: defaultBoxBodyStyle$,\n defaultBoxStageStyle: defaultBoxStageStyle$,\n };\n\n withValueEnhancer(this, valConfig, valManager);\n\n const closeBtnClassName = this.wrapClassName(\"titlebar-icon-close\");\n\n const checkFocusBox = (ev: MouseEvent | TouchEvent): void => {\n if (readonly$.value) {\n return;\n }\n\n const target = ev.target as HTMLElement;\n if (!target.tagName) {\n return;\n }\n\n for (\n let el: HTMLElement | null = target;\n el;\n el = el.parentElement\n ) {\n if (el.classList && el.classList.contains(closeBtnClassName)) {\n return;\n }\n const id = el.dataset?.teleBoxID;\n if (id) {\n const box = this.getBox(id);\n if (box) {\n this.focusBox(box);\n this.makeBoxTop(box);\n return;\n }\n }\n }\n };\n\n this._sideEffect.addEventListener(\n window,\n \"mousedown\",\n checkFocusBox,\n true\n );\n this._sideEffect.addEventListener(\n window,\n \"touchstart\",\n checkFocusBox,\n true\n );\n\n this.titleBar = new MaxTitleBar({\n namespace: this.namespace,\n title$: derive(this.topBox$, (topBox) => topBox?.title || \"\"),\n boxes$: this.boxes$,\n darkMode$: darkMode$,\n readonly$: readonly$,\n state$: state$,\n root$,\n rootRect$: rootRect$,\n onEvent: (event): void => {\n switch (event.type) {\n case TELE_BOX_DELEGATE_EVENT.Maximize: {\n maximized$.setValue(!maximized$.value);\n break;\n }\n case TELE_BOX_DELEGATE_EVENT.Minimize: {\n minimized$.setValue(true);\n break;\n }\n case TELE_BOX_EVENT.Close: {\n this.removeTopBox();\n this.focusTopBox();\n break;\n }\n default: {\n break;\n }\n }\n },\n });\n\n this._sideEffect.addDisposer([\n state$.reaction((state, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.State, state);\n }\n }),\n maximized$.reaction((maximized, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.Maximized,\n maximized\n );\n }\n }),\n minimized$.reaction((minimized, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.Minimized,\n minimized\n );\n }\n }),\n darkMode$.reaction((darkMode, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.DarkMode, darkMode);\n }\n }),\n ]);\n\n this.$container = document.createElement(\"div\");\n this.$container.className = this.wrapClassName(\"manager-container\");\n\n this.$stage = document.createElement(\"div\");\n this.$stage.className = this.wrapClassName(\"manager-stage\");\n this.$container.appendChild(this.$stage);\n\n this._sideEffect.addDisposer([\n darkMode$.subscribe((darkMode) => {\n this.$container.classList.toggle(\n this.wrapClassName(\"color-scheme-dark\"),\n darkMode\n );\n this.$container.classList.toggle(\n this.wrapClassName(\"color-scheme-light\"),\n !darkMode\n );\n }),\n maximized$.subscribe((maximized) => {\n this.$container.classList.toggle(\"is-maximized\", maximized);\n }),\n minimized$.subscribe((minimized) => {\n this.$container.classList.toggle(\"is-minimized\", minimized);\n }),\n containerStyle$.subscribe((containerStyle) => {\n this.$container.style.cssText = containerStyle;\n }),\n stageStyle$.subscribe((stageStyle) => {\n this.$stage.style.cssText = stageStyle;\n this.$stage.style.width = stageRect$.value.width + \"px\";\n this.$stage.style.height = stageRect$.value.height + \"px\";\n }),\n stageRect$.subscribe((stageRect) => {\n this.$stage.style.width = stageRect.width + \"px\";\n this.$stage.style.height = stageRect.height + \"px\";\n }),\n root$.subscribe((root) => {\n if (root) {\n root.appendChild(this.$container);\n } else if (this.$container.parentElement) {\n this.$container.remove();\n }\n }),\n ]);\n }\n\n public readonly $container: HTMLDivElement;\n\n public readonly $stage: HTMLDivElement;\n\n public get boxes(): ReadonlyArray<TeleBox> {\n return this.boxes$.value;\n }\n\n public get topBox(): TeleBox | undefined {\n return this.topBox$.value;\n }\n\n public readonly events = new Emittery<\n TeleBoxManagerEventConfig,\n TeleBoxManagerEventConfig\n >();\n\n protected _sideEffect: SideEffectManager;\n\n public readonly namespace: string;\n\n /** @deprecated use setMaximized and setMinimized instead */\n public setState(state: TeleBoxState, skipUpdate = false): this {\n switch (state) {\n case TELE_BOX_STATE.Maximized: {\n this.setMinimized(false, skipUpdate);\n this.setMaximized(true, skipUpdate);\n break;\n }\n case TELE_BOX_STATE.Minimized: {\n this.setMinimized(true, skipUpdate);\n this.setMaximized(false, skipUpdate);\n break;\n }\n default: {\n this.setMinimized(false, skipUpdate);\n this.setMaximized(false, skipUpdate);\n break;\n }\n }\n return this;\n }\n\n public create(\n config: TeleBoxManagerCreateConfig = {},\n smartPosition = true\n ): ReadonlyTeleBox {\n const box = new TeleBox({\n zIndex: this.topBox ? this.topBox.zIndex + 1 : 100,\n ...config,\n ...(smartPosition ? this.smartPosition(config) : {}),\n namespace: this.namespace,\n root: this.$stage,\n darkMode$: this._darkMode$,\n maximized$: this._maximized$,\n minimized$: this._minimized$,\n fence$: this._fence$,\n rootRect$: this._rootRect$,\n managerStageRect$: this._stageRect$,\n managerStageRatio$: this._stageRatio$,\n readonly$: this._readonly$,\n collectorRect$: this.collector._rect$,\n defaultBoxBodyStyle$: this._defaultBoxBodyStyle$,\n defaultBoxStageStyle$: this._defaultBoxStageStyle$,\n });\n\n if (box.focus) {\n this.focusBox(box);\n if (smartPosition) {\n this.makeBoxTop(box);\n }\n }\n\n this.boxes$.setValue([...this.boxes, box]);\n\n this._sideEffect.addDisposer([\n box._delegateEvents.on(TELE_BOX_DELEGATE_EVENT.Maximize, () => {\n this.setMaximized(!this.maximized);\n }),\n box._delegateEvents.on(TELE_BOX_DELEGATE_EVENT.Minimize, () => {\n this.setMinimized(true);\n }),\n box._delegateEvents.on(TELE_BOX_DELEGATE_EVENT.Close, () => {\n this.remove(box);\n this.focusTopBox();\n }),\n box._intrinsicCoord$.reaction((_, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.IntrinsicMove, box);\n }\n }),\n box._intrinsicSize$.reaction((_, skipUpdate) => {\n if (!skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.IntrinsicResize,\n box\n );\n }\n }),\n box._zIndex$.reaction((_, skipUpdate) => {\n if (this.boxes.length > 0) {\n const topBox = this.boxes.reduce((topBox, box) =>\n topBox.zIndex > box.zIndex ? topBox : box\n );\n this.topBox$.setValue(topBox);\n }\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.ZIndex, box);\n }\n }),\n ]);\n\n this.events.emit(TELE_BOX_MANAGER_EVENT.Created, box);\n\n return box;\n }\n\n public query(config?: TeleBoxManagerQueryConfig): ReadonlyTeleBox[] {\n return config\n ? this.boxes.filter(this.teleBoxMatcher(config))\n : [...this.boxes];\n }\n\n public queryOne(\n config?: TeleBoxManagerQueryConfig\n ): ReadonlyTeleBox | undefined {\n return config\n ? this.boxes.find(this.teleBoxMatcher(config))\n : this.boxes[0];\n }\n\n public update(\n boxID: string,\n config: TeleBoxManagerUpdateConfig,\n skipUpdate = false\n ): void {\n const box = this.boxes.find((box) => box.id === boxID);\n if (box) {\n return this.updateBox(box, config, skipUpdate);\n }\n }\n\n public updateAll(\n config: TeleBoxManagerUpdateConfig,\n skipUpdate = false\n ): void {\n this.boxes.forEach((box) => {\n this.updateBox(box, config, skipUpdate);\n });\n }\n\n public remove(\n boxOrID: string | TeleBox,\n skipUpdate = false\n ): ReadonlyTeleBox | undefined {\n const index = this.getBoxIndex(boxOrID);\n if (index >= 0) {\n const boxes = this.boxes.slice();\n const deletedBoxes = boxes.splice(index, 1);\n this.boxes$.setValue(boxes);\n deletedBoxes.forEach((box) => box.destroy());\n if (!skipUpdate) {\n if (this.boxes.length <= 0) {\n this.setMaximized(false);\n this.setMinimized(false);\n }\n this.events.emit(TELE_BOX_MANAGER_EVENT.Removed, deletedBoxes);\n }\n return deletedBoxes[0];\n }\n return;\n }\n\n public removeTopBox(): ReadonlyTeleBox | undefined {\n if (this.topBox) {\n return this.remove(this.topBox);\n }\n return;\n }\n\n public removeAll(skipUpdate = false): ReadonlyTeleBox[] {\n const deletedBoxes = this.boxes$.value;\n this.boxes$.setValue([]);\n deletedBoxes.forEach((box) => box.destroy());\n if (!skipUpdate) {\n if (this.boxes.length <= 0) {\n this.setMaximized(false);\n this.setMinimized(false);\n }\n this.events.emit(TELE_BOX_MANAGER_EVENT.Removed, deletedBoxes);\n }\n return deletedBoxes;\n }\n\n /**\n * Mount manager to a container element.\n */\n public mount(root: HTMLElement): void {\n this._root$.setValue(root);\n }\n\n /**\n * Unmount manager from the container element.\n */\n public unmount(): void {\n this._root$.setValue(null);\n }\n\n public destroy(skipUpdate = false): void {\n this.events.clearListeners();\n this._sideEffect.flushAll();\n this.removeAll(skipUpdate);\n this.collector.destroy();\n this.titleBar.destroy();\n }\n\n public wrapClassName(className: string): string {\n return `${this.namespace}-${className}`;\n }\n\n public focusBox(boxOrID: string | TeleBox, skipUpdate = false): void {\n const targetBox = this.getBox(boxOrID);\n if (targetBox) {\n this.boxes.forEach((box) => {\n if (targetBox === box) {\n let focusChanged = false;\n if (!targetBox.focus) {\n focusChanged = true;\n targetBox._focus$.setValue(true, skipUpdate);\n }\n if (focusChanged && !skipUpdate) {\n this.events.emit(\n TELE_BOX_MANAGER_EVENT.Focused,\n targetBox\n );\n }\n } else if (box.focus) {\n this.blurBox(box, skipUpdate);\n }\n });\n this.titleBar.focusBox(targetBox);\n }\n }\n\n public focusTopBox(): void {\n if (this.topBox && !this.topBox.focus) {\n return this.focusBox(this.topBox);\n }\n }\n\n public blurBox(boxOrID: string | TeleBox, skipUpdate = false): void {\n const targetBox = this.getBox(boxOrID);\n if (targetBox) {\n if (targetBox.focus) {\n targetBox._focus$.setValue(false, skipUpdate);\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.Blurred, targetBox);\n }\n }\n if (this.titleBar.focusedBox === targetBox) {\n this.titleBar.focusBox();\n }\n }\n }\n\n public blurAll(skipUpdate = false): void {\n this.boxes.forEach((box) => {\n if (box.focus) {\n box._focus$.setValue(false, skipUpdate);\n if (!skipUpdate) {\n this.events.emit(TELE_BOX_MANAGER_EVENT.Blurred, box);\n }\n }\n });\n if (this.titleBar.focusedBox) {\n this.titleBar.focusBox();\n }\n }\n\n public collector: TeleBoxCollector;\n public titleBar: MaxTitleBar;\n\n protected boxes$: Val<TeleBox[]>;\n protected topBox$: Val<TeleBox | undefined>;\n\n protected teleBoxMatcher(\n config: TeleBoxManagerQueryConfig\n ): (box: TeleBox) => boolean {\n const keys = Object.keys(config) as Array<\n keyof TeleBoxManagerQueryConfig\n >;\n return (box: TeleBox): boolean =>\n keys.every((key) => config[key] === box[key]);\n }\n\n protected updateBox(\n box: TeleBox,\n config: TeleBoxManagerUpdateConfig,\n skipUpdate = false\n ): void {\n if (config.x != null || config.y != null) {\n box._intrinsicCoord$.setValue(\n {\n x: config.x ?? box.intrinsicX,\n y: config.y ?? box.intrinsicY,\n },\n skipUpdate\n );\n }\n if (config.width != null || config.height != null) {\n box._intrinsicSize$.setValue(\n {\n width: config.width ?? box.intrinsicWidth,\n height: config.height ?? box.intrinsicHeight,\n },\n skipUpdate\n );\n }\n if (config.title != null) {\n box._title$.setValue(config.title);\n }\n if (config.visible != null) {\n box._visible$.setValue(config.visible, skipUpdate);\n }\n if (config.resizable != null) {\n box._resizable$.setValue(config.resizable, skipUpdate);\n }\n if (config.draggable != null) {\n box._draggable$.setValue(config.draggable, skipUpdate);\n }\n if (config.boxRatio != null) {\n box._boxRatio$.setValue(config.boxRatio, skipUpdate);\n }\n if (config.zIndex != null) {\n box._zIndex$.setValue(config.zIndex, skipUpdate);\n }\n if (config.stageRatio !== undefined) {\n box.setStageRatio(config.stageRatio, skipUpdate);\n }\n if (config.content != null) {\n box.mountContent(config.content);\n }\n if (config.footer != null) {\n box.mountFooter(config.footer);\n }\n if (config.minHeight != null || config.minWidth != null) {\n box._minSize$.setValue(\n {\n width: config.minWidth ?? box.minWidth,\n height: config.minHeight ?? box.minHeight,\n },\n skipUpdate\n );\n }\n }\n\n /** Keep new boxes staggered inside stage area */\n protected smartPosition(rect: Partial<TeleBoxRect>): TeleBoxRect {\n let { x, y } = rect;\n const { width = 0.5, height = 0.5 } = rect;\n const stageRect = this.stageRect;\n const topBox = this.topBox;\n\n if (x == null) {\n let pxX = 20;\n if (topBox) {\n const pxPreferredX = topBox.pxIntrinsicCoord.x + 20;\n const pxIntrinsicWidth = width * stageRect.width;\n if (pxPreferredX + pxIntrinsicWidth <= stageRect.width) {\n pxX = pxPreferredX;\n }\n }\n x = pxX / stageRect.width;\n }\n\n if (y == null) {\n let pxY = 20;\n if (topBox) {\n const pxPreferredY = topBox.pxIntrinsicCoord.y + 20;\n const pxIntrinsicHeight = height * stageRect.height;\n if (pxPreferredY + pxIntrinsicHeight <= stageRect.height) {\n pxY = pxPreferredY;\n }\n }\n y = pxY / stageRect.height;\n }\n\n return { x, y, width, height };\n }\n\n protected makeBoxTop(box: TeleBox, skipUpdate = false): void {\n if (this.topBox) {\n if (box !== this.topBox) {\n box._zIndex$.setValue(this.topBox.zIndex + 1, skipUpdate);\n }\n }\n }\n\n protected getBoxIndex(boxOrID: TeleBox | string): number {\n return typeof boxOrID === \"string\"\n ? this.boxes.findIndex((box) => box.id === boxOrID)\n : this.boxes.findIndex((box) => box === boxOrID);\n }\n\n protected getBox(boxOrID: TeleBox | string): TeleBox | undefined {\n return typeof boxOrID === \"string\"\n ? this.boxes.find((box) => box.id === boxOrID)\n : boxOrID;\n }\n}\n"],"names":["TELE_BOX_COLOR_SCHEME","TELE_BOX_COLOR_SCHEME2","TELE_BOX_STATE","TELE_BOX_STATE2","TELE_BOX_EVENT","TELE_BOX_EVENT2","TELE_BOX_DELEGATE_EVENT","TELE_BOX_DELEGATE_EVENT2","TELE_BOX_RESIZE_HANDLE","TELE_BOX_RESIZE_HANDLE2","TeleBoxDragHandleType","value","min","max","Math","ev","stopPropagation","cancelable","preventDefault","touches","defaultBoxCount","Boolean","constructor","readonly$","state$","title$","buttons","onEvent","onDragStart","namespace","SideEffectManager","timestamp","clientX","clientY","this","button","target","dataset","teleTitleBarNoDblClick","now","Date","lastTitleBarClick","abs","type","Maximize","lastTitleBarTouch","Minimize","iconClassName","wrapClassName","isActive","state","Maximized","Close","$dragArea","renderDragArea","render","$titleBar","document","createElement","className","$titleArea","teleBoxHandle","$title","appendChild","$buttonsContainer","forEach","i","teleTitleBarBtnIndex","String","$btn","sideEffect","addDisposer","subscribe","title","textContent","btn","children","classList","toggle","addEventListener","Number","isNaN","length","handleTitleBarClick","handleTitleBarTouch","passive","dragHandle","destroy","flushAll","rootRect","ratio","width","height","preferredHeight","x","y","preferredWidth","ResizeObserver","window","ResizeObserverPolyfill","id","genUID","getBoxDefaultName","visible","minWidth","minHeight","resizable","draggable","boxRatio","focus","zIndex","stageRatio","titleBar","content","stage","footer","styles","userStyles","bodyStyle","stageStyle","darkMode$","fence$","minimized$","maximized$","root","rootRect$","managerStageRect$","managerStageRatio$","defaultBoxBodyStyle$","defaultBoxStageStyle$","collectorRect$","Emittery","_handleTrackStart","_sideEffect","valManager","ValManager","Val","visible$","resizable$","draggable$","boxRatio$","zIndex$","focus$","combine","minimized","maximized","Minimized","Normal","minSize$","clamp","compare","shallowequal","pxMinSize$","minSize","managerStageRect","intrinsicSize$","reaction","skipUpdate","setValue","intrinsicCoord$","pxIntrinsicSize$","size","pxIntrinsicCoord$","intrinsicCoord","bodyStyle$","stageStyle$","contentRoot$","bodyRect$","stageRatio$","finalStageRatio$","stageRatio2","managerStageRatio","stageRect$","calcStageRect","darkMode","fence","readonly","defaultBoxBodyStyle","defaultBoxStageStyle","collectorRect","pxMinSize","intrinsicSize","pxIntrinsicSize","pxIntrinsicCoord","bodyRect","stageRect","DefaultTitleBar","event","_delegateEvents","emit","boxRatio2","transform","move","$box","_render","$content","parentElement","mountContent","mountStage","mountFooter","mountStyles","mountUserStyles","watchValEvent","val","v","events","DarkMode","Readonly","ZIndex","State","IntrinsicResize","IntrinsicMove","visible2","focus2","Focus","Blur","_minSize$","setMinWidth","setMinHeight","resize","_intrinsicSize$","_intrinsicCoord$","safeX","safeY","newHeight","$authorContent","remove","unmountContent","$authorStage","$stage","_renderStage","$body","unmountStage","$authorFooter","$footer","unmountFooter","$styles","unmountStyles","$userStyles","unmountUserStyles","add","bindClassName","el","predicate","isTruthy","wrappedClassName","_readonly$","_draggable$","isFalsy","_resizable$","_focus$","_darkMode$","minimizedClassName","maximizedClassName","MAXIMIZED_TIMER_ID","_state$","flush","setTimeout","_visible$","style","display","_zIndex$","teleBoxID","boxStyler","styler","boxStyles$","_maximized$","_minimized$","_pxIntrinsicSize$","_pxIntrinsicCoord$","_collectorRect$","_rootRect$","_managerStageRect$","scaleX","scaleY","boxWidth","boxHeight","boxStyles","set","$boxMain","_bodyStyle$","_defaultBoxBodyStyle$","style2","cssText","_renderResizeHandlers","updateBodyRect","rect","getBoundingClientRect","_bodyRect$","observer","observe","disconnect","updateStageRect","top","left","_stageStyle$","_defaultBoxStageStyle$","_stageRect$","$resizeHandles","values","handleType","$handle","TRACKING_DISPOSER_ID","transformingClassName","$trackMask","trackingHandle","trackStartX","trackStartY","trackStartWidth","trackStartHeight","trackStartPageX","trackStartPageY","handleTracking","pageX","pageY","flattenEvent","offsetX","offsetY","newX","newY","newWidth","North","South","West","East","NorthWest","NorthEast","SouthEast","SouthWest","handleTrackEnd","handleTrackStart","cursor","removeEventListener","Destroyed","clearListeners","TELE_BOX_MANAGER_EVENT","TELE_BOX_MANAGER_EVENT2","root$","rect$","derive","styles$","el$","$collector","backgroundImage","styles2","keys","key","config","boxes$","parentNode","focusBox","box","focusedBox","$titles","firstElementChild","$tab","super","titles","replaceChild","renderTitles","$titlesArea","insertBefore","currentTarget","scrollBy","deltaY","behavior","disposers","map","_title$","disposer","prefersColorScheme","Light","collector","containerStyle","containerStyle$","innerWidth","innerHeight","root2","topBox$","boxes","topBox","reduce","topBox2","prefersDarkMatch","matchMedia","prefersDark$","matches","handler","evt","prefersColorScheme$","prefersColorScheme2","PrefersColorScheme","prefersDark","minimized2","maximized2","TeleBoxCollector","closeBtnClassName","checkFocusBox","tagName","contains","getBox","makeBoxTop","MaxTitleBar","removeTopBox","focusTopBox","$container","containerStyle2","stageStyle2","setState","setMinimized","setMaximized","create","smartPosition","TeleBox","_fence$","_stageRatio$","_rect$","on","_","box2","Created","query","filter","teleBoxMatcher","queryOne","find","update","boxID","updateBox","updateAll","boxOrID","index","getBoxIndex","slice","deletedBoxes","splice","Removed","removeAll","mount","_root$","unmount","targetBox","focusChanged","Focused","blurBox","Blurred","blurAll","Object","every","intrinsicX","intrinsicY","intrinsicWidth","intrinsicHeight","_boxRatio$","setStageRatio","pxX","pxPreferredX","pxY","pxPreferredY","findIndex"],"mappings":"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"}