@netless/telebox-insider 1.0.0-alpha.3 → 1.0.0-alpha.6

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 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 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$: combine(\n [highlightStage$, maximized$],\n ([highlightStage, maximized]) => highlightStage && !maximized\n ),\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","highlightStage2","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/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 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 \"./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$, ratio$],\n ([rootRect, ratio]) => {\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 {\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 { 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 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 collectorRect: RequiredTeleBoxConfig[\"collectorRect$\"];\n};\n\ntype MyReadonlyValConfig = {\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<\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 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 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 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 propsValConfig: PropsValConfig = {\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\n withReadonlyValueEnhancer(this, propsValConfig);\n\n const myReadonlyValConfig: MyReadonlyValConfig = {\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, myReadonlyValConfig, valManager);\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, 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 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:\n collectorRect.x -\n pxIntrinsicSize.width / 2 +\n collectorRect.width / 2,\n y:\n collectorRect.y -\n pxIntrinsicSize.height / 2 +\n 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 { 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 rootRect$: ReadonlyVal<TeleBoxRect>;\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 rootRect$,\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$, 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 $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 { 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 { 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 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 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 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 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$: combine(\n [highlightStage$, maximized$],\n ([highlightStage, maximized]) => highlightStage && !maximized\n ),\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, 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 highlightStage: highlightStage$,\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\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","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$","highlightStage$","root$","stageRect$","combine","rootRect","ratio","width","height","preferredHeight","x","y","preferredWidth","compare","shallowequal","_sideEffect","root","highlightStage","$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","valManager","ValManager","Val","visible$","resizable$","draggable$","zIndex$","focus$","$userContent$","$userFooter$","$userStyles$","minimized","maximized","Minimized","Normal","minSize$","clamp","pxMinSize$","minSize","managerStageRect","intrinsicSize$","reaction","skipUpdate","setValue","intrinsicCoord$","pxIntrinsicSize$","size","pxIntrinsicCoord$","intrinsicCoord","boxHighlightStage$","boxHighlightStage","managerHighlightStage","contentRoot$","contentRect$","teleStage","TeleStage","darkMode","fence","readonly","collectorRect","myReadonlyValConfig","$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$","derive","styles$","el$","$collector","backgroundImage","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","highlightStage2","readonlyValConfig","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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"}