@reforma/components 0.3.3 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Composer/parts.d.ts +1 -1
- package/dist/Composer/parts.d.ts.map +1 -1
- package/dist/Composer/parts.js +102 -98
- package/dist/Composer/parts.js.map +1 -1
- package/dist/Composer/reforma/Composer.module.css +1 -1
- package/dist/Composer/reforma/Composer.module.css.js +24 -22
- package/dist/Composer/reforma/Composer.module.css.js.map +1 -1
- package/dist/Composer/types.d.ts +1 -1
- package/dist/Composer/types.d.ts.map +1 -1
- package/dist/Modal/Modal.d.ts +2 -2
- package/dist/Modal/Modal.d.ts.map +1 -1
- package/dist/Modal/Modal.js +6 -3
- package/dist/Modal/Modal.js.map +1 -1
- package/dist/SettingsLayout/SettingsLayout.d.ts +1 -0
- package/dist/SettingsLayout/SettingsLayout.d.ts.map +1 -1
- package/dist/SettingsLayout/SettingsLayout.js +332 -292
- package/dist/SettingsLayout/SettingsLayout.js.map +1 -1
- package/dist/SettingsLayout/SettingsLayout.module.css +1 -1
- package/dist/SettingsLayout/SettingsLayout.module.css.js +20 -18
- package/dist/SettingsLayout/SettingsLayout.module.css.js.map +1 -1
- package/dist/chat/Attachment/Attachment.d.ts.map +1 -1
- package/dist/chat/Attachment/Attachment.js +14 -16
- package/dist/chat/Attachment/Attachment.js.map +1 -1
- package/dist/chat/Attachment/Attachment.module.css +1 -1
- package/dist/chat/Tool/Tool.d.ts.map +1 -1
- package/dist/chat/Tool/Tool.js +77 -75
- package/dist/chat/Tool/Tool.js.map +1 -1
- package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
- package/dist/chat/Tool/agent/AgentTool.js +18 -17
- package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
- package/dist/chat/Tool/check-page/CheckPageTool.d.ts +4 -0
- package/dist/chat/Tool/check-page/CheckPageTool.d.ts.map +1 -0
- package/dist/chat/Tool/check-page/CheckPageTool.js +75 -0
- package/dist/chat/Tool/check-page/CheckPageTool.js.map +1 -0
- package/dist/chat/Tool/check-page/index.d.ts +2 -0
- package/dist/chat/Tool/check-page/index.d.ts.map +1 -0
- package/dist/chat/Tool/check-page/index.js +5 -0
- package/dist/chat/Tool/check-page/index.js.map +1 -0
- package/dist/index.js +156 -155
- package/dist/modals/ConfirmModal.d.ts +2 -0
- package/dist/modals/ConfirmModal.d.ts.map +1 -1
- package/dist/modals/ConfirmModal.js +88 -60
- package/dist/modals/ConfirmModal.js.map +1 -1
- package/dist/modals/index.d.ts +1 -1
- package/dist/modals/index.d.ts.map +1 -1
- package/dist/modals/index.js +2 -1
- package/dist/openui/functions/index.d.ts +59 -59
- package/dist/openui/functions/index.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/node_modules/clsx/dist/clsx.js +0 -18
- package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/react-aria/dist/private/interactions/useFocusable.js +0 -17
- package/dist/node_modules/react-aria/dist/private/interactions/useFocusable.js.map +0 -1
- package/dist/node_modules/react-aria/dist/private/utils/useObjectRef.js +0 -34
- package/dist/node_modules/react-aria/dist/private/utils/useObjectRef.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/errors.js +0 -38
- package/dist/node_modules/zod/v4/classic/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/parse.js +0 -21
- package/dist/node_modules/zod/v4/classic/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/schemas.js +0 -822
- package/dist/node_modules/zod/v4/classic/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/api.js +0 -561
- package/dist/node_modules/zod/v4/core/api.js.map +0 -1
- package/dist/node_modules/zod/v4/core/checks.js +0 -262
- package/dist/node_modules/zod/v4/core/checks.js.map +0 -1
- package/dist/node_modules/zod/v4/core/core.js +0 -97
- package/dist/node_modules/zod/v4/core/core.js.map +0 -1
- package/dist/node_modules/zod/v4/core/doc.js +0 -35
- package/dist/node_modules/zod/v4/core/doc.js.map +0 -1
- package/dist/node_modules/zod/v4/core/errors.js +0 -79
- package/dist/node_modules/zod/v4/core/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/json-schema-processors.js +0 -308
- package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/memoizer.js +0 -203
- package/dist/node_modules/zod/v4/core/memoizer.js.map +0 -1
- package/dist/node_modules/zod/v4/core/parse.js +0 -113
- package/dist/node_modules/zod/v4/core/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/core/regexes.js +0 -59
- package/dist/node_modules/zod/v4/core/regexes.js.map +0 -1
- package/dist/node_modules/zod/v4/core/registries.js +0 -41
- package/dist/node_modules/zod/v4/core/registries.js.map +0 -1
- package/dist/node_modules/zod/v4/core/schemas.js +0 -1104
- package/dist/node_modules/zod/v4/core/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/to-json-schema.js +0 -380
- package/dist/node_modules/zod/v4/core/to-json-schema.js.map +0 -1
- package/dist/node_modules/zod/v4/core/util.js +0 -465
- package/dist/node_modules/zod/v4/core/util.js.map +0 -1
- package/dist/node_modules/zod/v4/core/versions.js +0 -9
- package/dist/node_modules/zod/v4/core/versions.js.map +0 -1
- package/dist/node_modules/zod/v4/locales/en.js +0 -97
- package/dist/node_modules/zod/v4/locales/en.js.map +0 -1
package/dist/Composer/types.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export type ComposerUploadErr = {
|
|
|
34
34
|
};
|
|
35
35
|
export type ComposerUploadResult = ComposerUploadOk | ComposerUploadErr;
|
|
36
36
|
/** Optional classes for every element rendered by the composer. */
|
|
37
|
-
export type ComposerClassNames = Partial<Record<'root' | 'shell' | 'dropOverlay' | 'dropLabel' | 'notice' | 'main' | 'addButton' | 'toolbarEnd' | 'attachments' | 'attachment' | 'attachmentPreview' | 'attachmentName' | 'attachmentStatus' | 'attachmentRetry' | 'attachmentRemove' | 'fileButton' | 'planButton' | 'planIcon' | 'planLabel' | 'textareaWrap' | 'textarea' | 'plainField' | 'editor' | 'sendButton', string>>;
|
|
37
|
+
export type ComposerClassNames = Partial<Record<'root' | 'shell' | 'dropOverlay' | 'dropLabel' | 'notice' | 'main' | 'addButton' | 'toolbarEnd' | 'attachments' | 'attachment' | 'attachmentPreview' | 'attachmentMeta' | 'attachmentName' | 'attachmentStatus' | 'attachmentRetry' | 'attachmentRemove' | 'fileButton' | 'planButton' | 'planIcon' | 'planLabel' | 'textareaWrap' | 'textarea' | 'plainField' | 'editor' | 'sendButton', string>>;
|
|
38
38
|
export type ComposerNotice = {
|
|
39
39
|
title: string;
|
|
40
40
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/Composer/types.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAExE,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CACzC,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GACzD,MAAM,GAAG,WAAW,GAAG,YAAY,GACnC,aAAa,GAAG,YAAY,GAAG,mBAAmB,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/Composer/types.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAExE,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CACzC,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GACzD,MAAM,GAAG,WAAW,GAAG,YAAY,GACnC,aAAa,GAAG,YAAY,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,gBAAgB,GACxF,kBAAkB,GAAG,iBAAiB,GAAG,kBAAkB,GAC3D,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,WAAW,GACtD,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,EACtE,MAAM,CACT,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC"}
|
package/dist/Modal/Modal.d.ts
CHANGED
|
@@ -223,8 +223,8 @@ declare class Modal<Opts extends ModalOptions = ModalOptions> {
|
|
|
223
223
|
*/
|
|
224
224
|
removeLoader(): void;
|
|
225
225
|
/**
|
|
226
|
-
*
|
|
227
|
-
* Override in extended classes
|
|
226
|
+
* Asks before closing a modal with unsaved changes.
|
|
227
|
+
* Override in extended classes for a custom dialog.
|
|
228
228
|
*/
|
|
229
229
|
showConfirm(): Promise<boolean>;
|
|
230
230
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/Modal/Modal.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/Modal/Modal.ts"],"names":[],"mappings":"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"}
|
package/dist/Modal/Modal.js
CHANGED
|
@@ -889,11 +889,14 @@ const W = class W {
|
|
|
889
889
|
this.enable(), this.loading = !1;
|
|
890
890
|
}
|
|
891
891
|
/**
|
|
892
|
-
*
|
|
893
|
-
* Override in extended classes
|
|
892
|
+
* Asks before closing a modal with unsaved changes.
|
|
893
|
+
* Override in extended classes for a custom dialog.
|
|
894
894
|
*/
|
|
895
895
|
async showConfirm() {
|
|
896
|
-
|
|
896
|
+
const {
|
|
897
|
+
confirmDiscardChanges: t
|
|
898
|
+
} = await import("../modals/ConfirmModal.js");
|
|
899
|
+
return t();
|
|
897
900
|
}
|
|
898
901
|
/**
|
|
899
902
|
* Close modal and show confirmation when data is not saved
|
package/dist/Modal/Modal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sources":["../../src/Modal/Modal.ts"],"sourcesContent":["/**\n * Modal windows\n *\n *\n * Features:\n - Background overlay\n - Display next to element\n - Tabs\n - Window dragging\n - Multiple modals can be shown simultaneously\n - Automatic positioning\n\n * Usage:\n const modal = Modal.create({\n type: 'window', // window type: small or fullscreen\n component: 'name', // component\n props: {}, // component props,\n ...Opts\n });\n */\n\nimport { clamp, getRandomId } from '@reforma/lib';\nimport { makeObservable } from '@reforma/lib/observers';\nimport { action, computed, observable, observableRef, runInAction } from 'mobx';\nimport { animate } from 'motion';\nimport React from 'react';\nimport { flushSync } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\n\nimport { disableFocusByTab, distanceBetween, enableFocusByTab, evaluateValue } from './helpers';\nimport ModalInteractions from './ModalInteractions';\nimport modalStyles from './styles/Modal.module.css';\nimport { ModalRoot } from './views/ModalRoot';\n\nimport type { ModalOptions, ModalPositionAxis, ModalResponsiveMode } from './typings';\n\ntype Writeable<T> = { -readonly [P in keyof T]: T[P] };\ninterface CloseOptions {\n restoreFocus?: boolean;\n}\n\n// Constants\nconst CLOSE_BUTTON_DISTANCE_THRESHOLD = 35;\nconst CLICKOUT_CLOSE_DELAY = 100;\nconst CLICKOUT_BLOCKING_LAYER_SELECTOR = '[data-modal-clickout-layer]';\nconst MODAL_OPEN_DURATION_S = 0.2;\nconst MODAL_CLOSE_DURATION_S = 0.15;\n\nlet popstated = false;\n\nclass Modal<Opts extends ModalOptions = ModalOptions> {\n // Static properties\n static events = makeObservable({});\n static list: Set<Modal> = new Set<Modal>();\n\n static get opened() {\n return Array.from(this.list);\n }\n\n static get visible() {\n return this.opened.filter(m => !m.hidden && m.type !== 'sidebar');\n }\n\n /** Top visible modal, excluding `child`. Used to nest window-type dialogs. */\n static parentOf(child: Modal): Modal | undefined {\n const visible = this.visible.filter(m => m !== child);\n\n return visible.at(-1);\n }\n\n static create(opts: Partial<ModalOptions> = {}): Modal {\n if (!popstated) {\n popstated = true;\n\n // Modal was open, but we navigated away - close it\n window.addEventListener('popstate', (e: any) => {\n if (e.direction === 'backward' && e.oldState?.modalId) {\n const modal = Array.from(this.list).find(m => e.oldState.modalId === m.id);\n\n if (modal) {\n void modal.close(false);\n }\n }\n });\n }\n\n // Check for duplicates before creating the actual instance\n const modals: Array<Modal> = Array.from(this.list);\n\n const name = opts.name || opts.id;\n const createOptions: Partial<ModalOptions> = { ...opts, name };\n const duplicate = opts.duplicate === true;\n const reuseExisting = opts.reuseExisting ?? !duplicate;\n\n const sameIdModal = opts.id\n ? modals.find(m => m.id === opts.id)\n : undefined;\n const sameNameModal = name\n ? modals.find(m => m.name === name)\n : undefined;\n\n if (sameIdModal) {\n if (sameIdModal.canReuseWith(createOptions, reuseExisting)) {\n sameIdModal.reuse(createOptions);\n }\n else {\n sameIdModal.show();\n }\n\n return sameIdModal;\n }\n\n if (sameNameModal) {\n if (sameNameModal.canReuseWith(createOptions, reuseExisting)) {\n sameNameModal.reuse(createOptions);\n\n return sameNameModal;\n }\n\n if (opts.hideOnClose || !duplicate) {\n sameNameModal.show();\n\n return sameNameModal;\n }\n }\n\n // Create modal instance only if unique\n return new this(createOptions);\n }\n\n // Instance properties\n @observableRef accessor options!: Opts;\n public name: string;\n public id: string;\n\n public type = 'window';\n\n @observable accessor hidden = false;\n @observable accessor disabled = false;\n\n public isSaved = true;\n\n @observable accessor loading = false;\n @observable accessor activeTab: string | null = null;\n @observableRef accessor tabOptions: Partial<Opts> = {};\n @observable accessor responsiveMode: ModalResponsiveMode | null = null;\n @observable accessor contentRevision = 0;\n\n @computed get currentOptions(): Opts {\n const tabOptions = this.tabOptions;\n const responsiveMode = this.responsiveMode;\n const tabOptionsWithAdaptive = tabOptions as Partial<Opts> & { adaptive?: Partial<Record<ModalResponsiveMode, Partial<Opts>>> };\n const adaptiveOptions = tabOptionsWithAdaptive.adaptive\n ? (tabOptionsWithAdaptive.adaptive[responsiveMode ?? 'all'] || tabOptionsWithAdaptive.adaptive.all || {})\n : {};\n\n return {\n ...this.options,\n ...tabOptions,\n ...adaptiveOptions,\n props: {\n ...this.options.props,\n ...tabOptions.props,\n ...(adaptiveOptions as any).props,\n },\n };\n }\n\n /**\n * Get default tab ID - returns activeTab from signal/options or first tab ID\n */\n get defaultTabId(): string | null {\n const activeTab = this.activeTab || this.options.activeTab;\n const tabs = this.options.tabs || [];\n const hasTabs = tabs.length > 0;\n\n // Default id not provided or not found in tabs list - return first tab id\n if (hasTabs && (activeTab == null || !tabs.find(tab => tab.id === activeTab))) {\n return tabs[0]?.id || null;\n }\n\n return activeTab || null;\n }\n\n windowEl: HTMLElement | null = null;\n\n public overlay!: HTMLElement;\n\n styles!: {\n top: number;\n left: number;\n position: string | null;\n height: number | string;\n width: number | string;\n maxHeight: number | string | null;\n maxWidth: number | string | null;\n };\n\n bounds!: {\n windowWidth: number;\n windowHeight: number;\n overlayWidth: number;\n overlayHeight: number;\n\n limits: {\n minLeft: number;\n maxLeft: number;\n minTop: number;\n maxTop: number;\n overflowMinLeft: number;\n overflowMaxLeft: number;\n overflowMinTop: number;\n overflowMaxTop: number;\n };\n };\n\n isDragging = false;\n\n #initialCoords: { pageX: number; pageY: number } | null = null;\n\n #scrollableEl?: HTMLElement[];\n #clickOutInclude: (Document | Element)[];\n #eventsAbortController: AbortController;\n #prevActiveElement!: HTMLElement;\n #scrollPositions: WeakMap<HTMLElement, { top: number; left: number }>;\n #targetWatchInterval: number | null = null;\n\n #resizeObserver!: ResizeObserver;\n #disposers: Array<() => void> = [];\n interactions: ModalInteractions;\n\n /**\n * Set tab options based on active tab ID\n * Internal method - use selectTab() for public API\n */\n @action\n private setTabOptions(activeTab: string | null = this.defaultTabId) {\n const tabs = this.options.tabs ?? [];\n\n // No tabs, simple case\n if (!tabs.length) {\n this.activeTab = null;\n this.tabOptions = { ...this.options };\n }\n // Merge all tab options + dynamic options + global window options\n else {\n const activeTabOptions = tabs.find(tab => tab.id === activeTab) || {} as Partial<Opts>;\n const activeTabDerivedOptions = activeTabOptions?.getOptions?.(this) || {};\n\n this.activeTab = activeTab;\n this.tabOptions = this.normalizeOptions({\n ...this.options,\n ...activeTabOptions,\n ...activeTabDerivedOptions,\n });\n }\n }\n\n /**\n * Normalize options - builds full Opts from partial options\n * Override in extended classes (e.g., EditorModal) to add custom defaults\n */\n protected normalizeOptions(opts: Partial<Opts>): Opts {\n const type = opts.type || 'window';\n\n const isOverlayStyle = type === 'overlay';\n const isWindowStyle = type === 'window';\n\n const target = opts.target ?? opts.fromModal?.windowEl;\n\n const options: Partial<Opts> = {\n type,\n handle: isOverlayStyle ? undefined : '[data-modal-title]',\n\n animate: true,\n duplicate: false,\n reuseExisting: true,\n loading: false,\n\n fromModal: null,\n position: ['center', 'center'],\n positionFrom: target ? 'target' : 'screen',\n closeOnTargetLost: !!target && type === 'window',\n target,\n\n component: null,\n props: null,\n\n class: [],\n overlayClass: [],\n theme: (opts.fromModal)?.currentOptions.theme || 'light',\n tabs: [],\n modalActions: [],\n\n title: null,\n closeButton: !isOverlayStyle || !!opts.title,\n\n width: null,\n minWidth: null,\n height: null,\n padding: null,\n\n scrollable: true,\n\n overlay: false,\n shadow: !!opts.overlay, // Enable shadow if overlay is active\n\n clickOut: isWindowStyle,\n clickOutExclude: opts.clickOutExclude || [],\n clickOutInclude: opts.clickOutInclude || [document],\n closeOnEscape: true,\n hideOnClose: false,\n reactHost: false,\n initialResponsiveMode: 'all',\n responsiveModes: {\n all: {\n icon: 'all.svg',\n iconSize: 16,\n tip: 'All',\n },\n mobile: {\n icon: 'mobile.svg',\n iconSize: 16,\n tip: 'Mobile',\n },\n tablet: {\n icon: 'tablet.svg',\n iconSize: 16,\n tip: 'Tablet',\n },\n desktop: {\n icon: 'desktop.svg',\n iconSize: 16,\n tip: 'Desktop',\n },\n },\n\n // Callbacks\n onInit() {},\n onOpen() {},\n onOpened() {},\n onCancel() {},\n onClose() {},\n onBeforeReuse() {},\n onShow() {},\n onHide() {},\n\n ...opts,\n\n limit: {\n overflow: true,\n top: 15,\n left: 15,\n right: 15,\n bottom: 15,\n ...opts.limit || {},\n },\n };\n\n if (typeof options.class === 'string') {\n options.class = [options.class];\n }\n\n if (typeof options.overlayClass === 'string') {\n options.overlayClass = [options.overlayClass];\n }\n\n if (options.scrollable === true) {\n options.scrollable = 'window';\n }\n\n if (options.scrollable === false) {\n options.scrollable = 'hidden';\n }\n\n if (options.scrollable === 'overlay' && options.type === 'window') {\n options.handle = false;\n }\n\n if (typeof options.padding === 'number') {\n options.padding = `${ options.padding }px`;\n }\n\n options.duplicate = options.duplicate === true;\n\n // Dont allow duplicate if hideOnClose is true\n if (options.hideOnClose) {\n options.duplicate = false;\n }\n\n options.reuseExisting = opts.reuseExisting ?? (!options.duplicate && !options.hideOnClose);\n\n if (options.fromModal && options.type !== 'overlay' && opts.overlay !== true) {\n options.shadow = false;\n options.overlay = false;\n }\n else if (options.shadow) {\n options.overlay = true;\n }\n\n options.tabs = (options.tabs ?? []).filter(tab => tab && !tab.hide);\n\n // Find adaptive modes and remove invalid ones\n options.tabs?.forEach((tab, index) => {\n if (!tab.id) {\n tab.id = `tab-${ index }`;\n }\n\n const adaptive = tab.adaptive;\n\n if (adaptive) {\n Object.entries(adaptive).forEach(([mode, data]: [string, any]) => {\n if (!data) {\n delete adaptive[mode];\n }\n });\n }\n });\n\n return options as unknown as Opts;\n }\n\n constructor(opts: Partial<Opts>) {\n // Add in list\n Modal.list.add(this);\n\n // Extend options by getOptions function\n if (typeof opts.getOptions === 'function') {\n opts = {\n ...opts,\n ...opts.getOptions(this),\n };\n }\n\n if (opts.fromModal === undefined\n && (opts.type ?? 'window') !== 'overlay'\n && opts.overlay !== true) {\n const parent = Modal.parentOf(this);\n\n if (parent) {\n opts = { ...opts, fromModal: parent };\n }\n }\n\n // Normalize options\n const options = this.normalizeOptions(opts);\n\n this.options = options;\n\n this.id = options.id || `modal:${ getRandomId(8) }`;\n this.name = options.name ?? this.id;\n this.type = options.type;\n this.#clickOutInclude = options.clickOutInclude || [document];\n this.#eventsAbortController = new AbortController();\n this.#scrollPositions = new WeakMap();\n this.interactions = new ModalInteractions(this);\n\n runInAction(() => {\n this.responsiveMode = evaluateValue(options.initialResponsiveMode) ?? null;\n this.setTabOptions(this.defaultTabId);\n });\n\n requestAnimationFrame(() => {\n // Need to show loader immediately when opening the window\n if (options.loading) {\n this.setLoader();\n }\n\n // If modal created outside of React tree, create modal root\n // and mount it to the DOM\n if (!options.reactHost) {\n this.createModalRoot();\n }\n\n this.#bindEvents();\n this.interactions.initDraggable();\n this.interactions.initResizable();\n\n this.currentOptions.onInit?.(this);\n\n void this.open(true);\n });\n }\n\n /**\n * Triggers a global event on the Modal class\n */\n triggerEvent(event: string) {\n void Modal.events.emit(event, this);\n }\n\n /**\n * Updates options\n */\n @action\n updateOptions(options: Partial<Opts>) {\n const prevWidth = this.currentOptions.width;\n const prevHeight = this.currentOptions.height;\n\n let nextOptions: Partial<Opts> = {\n ...this.options,\n ...options,\n };\n\n if (typeof nextOptions.getOptions === 'function') {\n nextOptions = {\n ...nextOptions,\n ...nextOptions.getOptions(this),\n };\n }\n\n this.options = this.normalizeOptions(nextOptions);\n this.type = this.options.type;\n this.setTabOptions(this.defaultTabId);\n\n if (this.currentOptions.width !== prevWidth || this.currentOptions.height !== prevHeight) {\n this.refreshLayout();\n }\n }\n\n /**\n * Replace options for a reused instance without carrying stale caller options.\n */\n @action\n private replaceOptions(options: Partial<Opts>) {\n let nextOptions: Partial<Opts> = {\n id: this.id,\n name: this.name,\n ...options,\n };\n\n if (typeof nextOptions.getOptions === 'function') {\n nextOptions = {\n ...nextOptions,\n ...nextOptions.getOptions(this),\n };\n }\n\n this.options = this.normalizeOptions(nextOptions);\n this.name = this.options.name ?? this.name;\n this.id = this.options.id ?? this.id;\n this.type = this.options.type;\n this.setTabOptions(this.defaultTabId);\n }\n\n private canReuseWith(options: Partial<Opts>, reuseExisting = options.reuseExisting ?? !options.duplicate) {\n return !!reuseExisting\n && !options.reactHost\n && !options.hideOnClose\n && !this.currentOptions.hideOnClose;\n }\n\n /**\n * Reuse this instance for a new Modal.create call with the same id/name.\n */\n private reuse(options: Partial<Opts>) {\n const previousOptions = this.currentOptions;\n const sameTarget = options.target != null && previousOptions.target === options.target;\n\n if (!sameTarget) {\n previousOptions.onBeforeReuse?.(this);\n }\n\n this.replaceOptions(options);\n\n runInAction(() => {\n this.responsiveMode = evaluateValue(this.options.initialResponsiveMode) ?? null;\n this.contentRevision += 1;\n });\n\n if (this.options.loading) {\n this.setLoader();\n }\n else if (this.loading) {\n this.removeLoader();\n }\n\n if (this.hidden) {\n this.show();\n }\n\n requestAnimationFrame(() => {\n this.refreshLayout();\n });\n\n this.focus();\n }\n\n /**\n * Overlay-scroll and fullscreen overlay skip JS position / max-height —\n * the overlay is the scrollport, the window stays in flow.\n */\n private skipsWindowPositioning(): boolean {\n const { type, scrollable } = this.currentOptions;\n\n return type === 'overlay' || scrollable === 'overlay';\n }\n\n /**\n * Keep a dragged window where the user put it. Otherwise place it from the anchor.\n * A size change only pulls a dragged window back on screen.\n */\n private applyPosition() {\n if (this.currentOptions.handle && this.interactions.hasUserMoved) {\n this.#fixOverflow();\n\n return;\n }\n\n this.updatePosition();\n }\n\n /**\n * Recalculate dimensions and position after options change.\n */\n refreshLayout() {\n if (this.skipsWindowPositioning()) {\n this.stopTargetWatcher();\n\n return;\n }\n\n if (!this.windowEl) {\n return;\n }\n\n this.syncTargetWatcher();\n this.updateBounds();\n this.updateStyles({\n width: this.currentOptions.width ?? '',\n height: this.currentOptions.height ?? '',\n }, true);\n this.updateBounds();\n this.applyPosition();\n }\n\n /**\n * Close anchored windows when their target leaves the visible UI.\n */\n private syncTargetWatcher() {\n if (this.currentOptions.closeOnTargetLost) {\n this.initTargetWatcher();\n\n return;\n }\n\n this.stopTargetWatcher();\n }\n\n private initTargetWatcher() {\n if (this.#targetWatchInterval != null || !this.currentOptions.closeOnTargetLost) {\n return;\n }\n\n const checkTarget = () => {\n if (this.hidden || !this.isTargetLost()) {\n return;\n }\n\n this.cancel({ restoreFocus: false });\n };\n\n this.#targetWatchInterval = window.setInterval(checkTarget, 150);\n this.addDisposer(() => {\n if (this.#targetWatchInterval == null) {\n return;\n }\n\n this.stopTargetWatcher();\n });\n\n checkTarget();\n }\n\n private stopTargetWatcher() {\n if (this.#targetWatchInterval == null) {\n return;\n }\n\n window.clearInterval(this.#targetWatchInterval);\n this.#targetWatchInterval = null;\n }\n\n private isTargetLost() {\n const options = this.currentOptions;\n\n if (!options.closeOnTargetLost || options.type === 'overlay' || options.positionFrom !== 'target') {\n return false;\n }\n\n const target = this.getPositionTarget();\n\n if (!target || target === target.ownerDocument.body || target === target.ownerDocument.documentElement) {\n return false;\n }\n\n if (!target.isConnected) {\n return true;\n }\n\n const frameElement = target.ownerDocument.defaultView?.frameElement as HTMLElement | null;\n\n if (frameElement && (this.isElementInvisible(frameElement) || !frameElement.isConnected)) {\n return true;\n }\n\n return this.isElementInvisible(target);\n }\n\n private getPositionTarget() {\n const options = this.currentOptions;\n\n return options.target || options.fromModal?.windowEl || null;\n }\n\n private isElementInvisible(element: HTMLElement) {\n const style = element.ownerDocument.defaultView?.getComputedStyle(element);\n\n if (style?.display === 'none' || style?.visibility === 'hidden') {\n return true;\n }\n\n const rect = element.getBoundingClientRect();\n\n return element.getClientRects().length === 0 || (!rect.width && !rect.height);\n }\n\n /**\n * Creates modal root using React\n */\n private createModalRoot() {\n const container = document.createElement('div');\n\n container.setAttribute('data-modal-root-container', this.name);\n document.body.appendChild(container);\n\n const root = createRoot(container);\n\n flushSync(() => {\n root.render(\n React.createElement(ModalRoot, {\n modal: this,\n })\n );\n });\n\n this.addDisposer(() => {\n root.unmount();\n\n container.remove();\n });\n }\n\n setOverlay(overlay: HTMLElement | null) {\n if (!overlay) {\n return;\n }\n\n this.overlay = overlay;\n }\n\n setWindow(element: HTMLDivElement | null) {\n this.windowEl = element;\n }\n\n /**\n * Init core modal events (close on ESC or overlay and other)\n */\n #bindEvents() {\n const { overlay } = this;\n const windowEl = this.windowEl;\n\n const handleClose = () => {\n const modals = Modal.visible;\n\n // close all nested modals\n if (modals.length > 1) {\n const currentModalIndex = modals.findIndex(modal => modal.id === this.id);\n const modalsToClose = modals.slice(currentModalIndex + 1);\n\n const eachClosed = modalsToClose.every(modal => modal.cancel());\n\n if (!eachClosed) {\n return false;\n }\n }\n\n this.cancel();\n };\n\n // Helper to check if element matches selector or is within selector\n const matchesSelector = (element: HTMLElement, selector: string): boolean => {\n if (element.matches(selector)) {\n return true;\n }\n\n return element.closest(selector) !== null;\n };\n\n const hasOpenClickoutBlockingLayer = (doc: Document): boolean => doc.querySelector(CLICKOUT_BLOCKING_LAYER_SELECTOR) !== null;\n\n // ESC\n overlay.addEventListener('keydown', (e: KeyboardEvent) => {\n const options = this.currentOptions;\n\n if (!options.closeOnEscape || e.key !== 'Escape') {\n return;\n }\n\n this.cancel();\n\n e.preventDefault();\n e.stopImmediatePropagation();\n }, { signal: this.#eventsAbortController.signal });\n\n // CLOSE BTN\n const closeButtonSelector = '[data-modal-close], header .close, footer .close';\n\n const handleCloseButtonPointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null;\n\n if (target && matchesSelector(target, closeButtonSelector)) {\n const { pageX, pageY } = e;\n\n this.#initialCoords = { pageX, pageY };\n }\n };\n\n const handleCloseButtonPointerUp = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null;\n\n if (!target || !matchesSelector(target, closeButtonSelector)) {\n return;\n }\n\n if (this.#initialCoords != null) {\n const { pageX, pageY } = e;\n const distance = distanceBetween(\n [pageX, pageY],\n [this.#initialCoords.pageX, this.#initialCoords.pageY]\n );\n\n if (+distance.toFixed(0) <= CLOSE_BUTTON_DISTANCE_THRESHOLD) {\n handleClose();\n }\n\n this.#initialCoords = null;\n }\n else {\n handleClose();\n }\n };\n\n overlay.addEventListener('pointerdown', handleCloseButtonPointerDown, { signal: this.#eventsAbortController.signal });\n overlay.addEventListener('pointerup', handleCloseButtonPointerUp, { signal: this.#eventsAbortController.signal });\n\n // ClickOut modal\n let denyClose = false;\n let clickTarget: HTMLElement | null = null;\n let wasLastOnPointerDown = false;\n const resetClickOutState = () => {\n denyClose = false;\n clickTarget = null;\n wasLastOnPointerDown = false;\n };\n\n // Prevent context menu on overlay (not needed)\n overlay.addEventListener('contextmenu', (e: MouseEvent) => {\n if (e.target === overlay) {\n e.preventDefault();\n }\n }, { signal: this.#eventsAbortController.signal });\n\n // Remember the start of the click\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null;\n\n if (!target) {\n denyClose = true;\n\n return;\n }\n\n clickTarget = target;\n\n const options = this.currentOptions;\n const modals = Modal.visible;\n const lastModal = modals[modals.length - 1];\n const clickStartedInsideWindow = windowEl?.contains(target) ?? false;\n const clickStartedOnAnchor = options.target?.contains(target) ?? false;\n const clickStartedInExcludedArea = options.clickOutExclude?.some(selector => matchesSelector(target, selector)) ?? false;\n const clickStartedInBlockingLayer = matchesSelector(target, CLICKOUT_BLOCKING_LAYER_SELECTOR);\n const clickStartedWithBlockingLayerOpen = hasOpenClickoutBlockingLayer(target.ownerDocument);\n\n wasLastOnPointerDown = lastModal === this;\n\n denyClose = e.button !== 0\n || clickStartedInsideWindow\n || clickStartedOnAnchor\n || clickStartedInExcludedArea\n || clickStartedInBlockingLayer\n || clickStartedWithBlockingLayerOpen;\n };\n\n // And the end of the click\n const handlePointerUp = (e: PointerEvent) => {\n if (denyClose || !clickTarget) {\n resetClickOutState();\n\n return;\n }\n\n clickTarget = null;\n\n const target = e.target as HTMLElement | null;\n\n if (!target) {\n resetClickOutState();\n\n return;\n }\n\n const options = this.currentOptions;\n\n // Ignore click on close button, it's handled above\n const closeButton = matchesSelector(target, '[data-modal-close]');\n const dropdownIsOpen = !!document.querySelector('body .dropdown-balloon');\n\n if (closeButton || dropdownIsOpen) {\n resetClickOutState();\n\n return;\n }\n\n // Window is hidden, ignore closing\n if (!wasLastOnPointerDown || this.hidden || this.interactions.isDragging) {\n resetClickOutState();\n\n return;\n }\n\n resetClickOutState();\n\n // Ignore click inside own window\n if (windowEl?.contains(target)) {\n return;\n }\n\n // Closing by outside click is disabled - animate\n if (!options.clickOut) {\n if (options.animate && windowEl) {\n animate(windowEl, {\n scale: [1, 1.02, 1],\n }, {\n duration: 0.18,\n ease: 'circInOut',\n });\n }\n\n return;\n }\n\n // Ignore clicks handled by a higher interaction layer\n if (matchesSelector(target, CLICKOUT_BLOCKING_LAYER_SELECTOR)) {\n return;\n }\n\n const contentRevision = this.contentRevision;\n\n // Slightly delay closing to allow click events that might occur on this element to fire\n setTimeout(() => {\n if (!Modal.list.has(this) || this.contentRevision !== contentRevision) {\n return;\n }\n\n this.cancel({ restoreFocus: false });\n }, CLICKOUT_CLOSE_DELAY);\n };\n\n this.#clickOutInclude.forEach((targetDoc) => {\n targetDoc.addEventListener('pointerdown', (e: Event) => handlePointerDown(e as PointerEvent), {\n capture: true,\n signal: this.#eventsAbortController.signal,\n });\n targetDoc.addEventListener('pointerup', (e: Event) => handlePointerUp(e as PointerEvent), {\n capture: true,\n signal: this.#eventsAbortController.signal,\n });\n });\n }\n\n /**\n * open - Open modal\n *\n * @param {type} isNew Description\n */\n async open(isNew = false) {\n const { options } = this;\n const overlay = this.overlay;\n const win = this.windowEl;\n\n const complete = (): void => {\n this.triggerEvent('open');\n\n overlay.style.transform = '';\n overlay.style.opacity = '';\n overlay.style.visibility = '';\n\n if (win) {\n win.style.transform = '';\n win.style.opacity = '';\n overlay.style.visibility = '';\n }\n\n options.onOpened?.(this);\n };\n\n // Opened from another editor, hide it\n if (options.fromModal) {\n options.fromModal.disable();\n }\n\n const isOverlayStyle = options.type === 'overlay';\n\n if (isOverlayStyle && isNew) {\n history.pushState({ modalId: this.id }, window.document.title, '');\n }\n\n if (isOverlayStyle || options.overlay) {\n document.body.classList.add('overflow');\n }\n\n const shouldAnimate = options.animate && isNew && win;\n\n if (!this.skipsWindowPositioning()) {\n this.updateBounds();\n this.updateStyles();\n this.initResizeObserver();\n this.syncTargetWatcher();\n this.updatePosition();\n }\n\n if (shouldAnimate && win) {\n overlay.style.opacity = String(isOverlayStyle ? 0.6 : 0);\n overlay.style.visibility = 'visible';\n\n const animations = [\n animate(overlay, {\n opacity: 1,\n }, {\n duration: MODAL_OPEN_DURATION_S,\n ease: 'easeOut',\n }),\n animate(win, {\n scale: [0.98, 1],\n y: [10, 0],\n }, {\n duration: MODAL_OPEN_DURATION_S,\n ease: 'circOut',\n }),\n ];\n\n await Promise.all(animations);\n complete();\n }\n else {\n complete();\n }\n\n options.onOpen?.(this);\n\n this.focus();\n }\n\n /**\n * Close modal\n *\n * @param {boolean} [popstate] Need fire popstate event\n */\n async close(popstate = true, { restoreFocus = true }: CloseOptions = {}) {\n const { options } = this;\n\n const isOverlayStyle = options.type === 'overlay';\n\n if (isOverlayStyle && popstate) {\n window.dispatchEvent(new PopStateEvent('popstate'));\n }\n\n // Abort all event listeners\n this.#eventsAbortController.abort();\n\n if (typeof this.#resizeObserver?.disconnect === 'function') {\n this.#resizeObserver.disconnect();\n }\n\n // Blur any inputs\n const focusedElement = this.overlay?.querySelector(':focus');\n\n if (focusedElement && 'blur' in focusedElement && typeof (focusedElement as HTMLElement).blur === 'function') {\n (focusedElement as HTMLElement).blur();\n }\n\n const win = this.windowEl;\n const overlay = this.overlay;\n const shouldAnimate = options.animate && win && overlay;\n\n if (shouldAnimate) {\n await Promise.all([\n animate(win, {\n scale: 0.98,\n y: 10,\n opacity: 0,\n }, {\n duration: MODAL_CLOSE_DURATION_S,\n ease: 'circOut',\n }),\n animate(overlay, {\n opacity: 0,\n }, {\n duration: MODAL_CLOSE_DURATION_S,\n ease: 'easeOut',\n }),\n ]);\n }\n\n options.onClose?.(this);\n\n // Remove from list before triggering event so listeners don't see closed modals\n Modal.list.delete(this);\n\n // Dispose all registered disposers and unmount component\n this.disposeAll();\n\n this.triggerEvent('close');\n\n // Opened from another window, show it\n if (options.fromModal) {\n options.fromModal.enable();\n\n return;\n }\n\n if (restoreFocus && this.#prevActiveElement) {\n this.#prevActiveElement.focus();\n }\n\n if (isOverlayStyle || options.overlay) {\n document.body.classList.remove('overflow');\n }\n }\n\n updateBounds() {\n const modal = this.windowEl;\n\n if (!modal) {\n return;\n }\n\n const { overlay, options } = this;\n const windowWidth = modal.offsetWidth;\n const windowHeight = modal.offsetHeight;\n\n const overlayWidth = overlay.offsetWidth;\n const overlayHeight = overlay.offsetHeight;\n\n const limit = options.limit ?? { top: 15, left: 15, right: 15, bottom: 15 };\n\n this.bounds = {\n windowWidth,\n windowHeight,\n overlayWidth,\n overlayHeight,\n limits: {\n minLeft: limit.left ?? 15,\n maxLeft: overlayWidth - windowWidth - (limit.right ?? 15),\n minTop: limit.top ?? 15,\n maxTop: overlayHeight - windowHeight - (limit.bottom ?? 15),\n overflowMinLeft: (limit.left ?? 15) - windowWidth,\n overflowMaxLeft: overlayWidth - (limit.right ?? 15),\n overflowMinTop: limit.top ?? 15,\n overflowMaxTop: overlayHeight - (limit.bottom ?? 15),\n },\n };\n }\n\n /**\n * Updates window size/position\n *\n * @param {object?} args - css params for modal\n * @param allowOverflow\n */\n updateStyles(args = {}, allowOverflow = false) {\n const { overlay, options } = this;\n\n if (this.skipsWindowPositioning()) {\n return;\n }\n\n const modal = this.windowEl;\n\n if (!modal) {\n return;\n }\n\n const { overlayWidth, overlayHeight, limits } = this.bounds;\n\n let styles: {\n position: string | null;\n top: number;\n left: number;\n width: number | string;\n height: number | string;\n maxWidth: number | string | null;\n maxHeight: number | string | null;\n } = {\n position: null,\n top: 0,\n left: 0,\n width: this.currentOptions.width ?? '',\n height: this.currentOptions.height ?? '',\n maxWidth: null,\n maxHeight: null,\n };\n\n styles = {\n ...styles,\n ...this.styles,\n ...args,\n };\n\n const minLeft = allowOverflow ? limits.overflowMinLeft : limits.minLeft;\n const maxLeft = allowOverflow ? limits.overflowMaxLeft : limits.maxLeft;\n const minTop = allowOverflow ? limits.overflowMinTop : limits.minTop;\n const maxTop = allowOverflow ? limits.overflowMaxTop : limits.maxTop;\n\n // Offset cannot exceed the set limit\n if (options.position) {\n styles.top = (styles.top > maxTop) ? maxTop : (styles.top < minTop) ? minTop : styles.top;\n styles.left = (styles.left > maxLeft) ? maxLeft : (styles.left < minLeft) ? minLeft : styles.left;\n }\n\n const limit = options.limit ?? { top: 15, left: 15, right: 15, bottom: 15 };\n\n styles.maxWidth = overlayWidth - (limit.left ?? 15) - (limit.right ?? 15);\n styles.maxHeight = overlayHeight - (limit.top ?? 15) - (limit.bottom ?? 15);\n\n Object.assign(modal.style, {\n position: styles.position || '',\n top: typeof styles.top === 'number' ? `${ styles.top }px` : String(styles.top),\n left: typeof styles.left === 'number' ? `${ styles.left }px` : String(styles.left),\n width: typeof styles.width === 'number' ? `${ styles.width }px` : String(styles.width),\n height: typeof styles.height === 'number' ? `${ styles.height }px` : String(styles.height),\n maxWidth: styles.maxWidth ? (typeof styles.maxWidth === 'number' ? `${ styles.maxWidth }px` : String(styles.maxWidth)) : '',\n maxHeight: styles.maxHeight ? (typeof styles.maxHeight === 'number' ? `${ styles.maxHeight }px` : String(styles.maxHeight)) : '',\n });\n\n this.styles = { ...styles, position: styles.position };\n\n overlay.dispatchEvent(new CustomEvent('updatePosition', { detail: styles }));\n }\n\n /**\n * Positions the window based on given options (next to element or in part of screen)\n */\n updatePosition() {\n const { overlay, options } = this;\n const modal = this.windowEl;\n\n if (!options.position || this.skipsWindowPositioning() || !modal) {\n return;\n }\n\n if (this.isTargetLost()) {\n this.cancel({ restoreFocus: false });\n\n return;\n }\n\n let top: number;\n let left: number;\n\n const target = this.getPositionTarget();\n const docRect = {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n };\n\n const overlayRect: DOMRect | undefined = overlay?.getBoundingClientRect();\n const itemRect: Writeable<DOMRect> | undefined = target?.getBoundingClientRect()?.toJSON();\n const modalRect: Writeable<DOMRect> = modal.getBoundingClientRect().toJSON();\n const optionWidth = this.currentOptions.width;\n const optionHeight = this.currentOptions.height;\n\n if (typeof optionWidth === 'number') {\n modalRect.width = optionWidth;\n }\n\n if (typeof optionHeight === 'number') {\n modalRect.height = optionHeight;\n }\n\n // Adjust itemRect if target is in a different document (e.g., iframe)\n if (target && itemRect && overlay && target.ownerDocument !== overlay.ownerDocument) {\n const frameElement = target.ownerDocument.defaultView?.frameElement as HTMLElement | null;\n\n if (frameElement) {\n const frameRect = frameElement.getBoundingClientRect();\n\n itemRect.top += frameRect.top;\n itemRect.left += frameRect.left;\n }\n }\n\n const targetRect = ((options.positionFrom === 'target') && itemRect) || overlayRect;\n\n if (!targetRect) {\n return;\n }\n\n // Invisible or removed from DOM element around which we are positioning\n if (options.positionFrom === 'target' && !targetRect.width && !targetRect.height) {\n return;\n }\n\n const [xPos, yPos] = options.position || ['center', 'center'];\n const xGap = xPos.includes('around') ? 7 : 0;\n const yGap = yPos.includes('around') ? 7 : 0;\n\n const { x: offsetX, y: offsetY } = { x: xGap, y: yGap, ...options.positionOffset };\n\n const oppositePosition: Record<ModalPositionAxis, ModalPositionAxis> = {\n start: 'end',\n start_around: 'end_around',\n end: 'start',\n end_around: 'start_around',\n center: 'center',\n };\n\n const positionMapX: Record<ModalPositionAxis, number> = {\n start: targetRect.left + offsetX,\n start_around: targetRect.left - modalRect.width - offsetX,\n end: targetRect.left + targetRect.width - modalRect.width - offsetX,\n end_around: targetRect.left + targetRect.width + offsetX,\n center: targetRect.left + (targetRect.width / 2) - (modalRect.width / 2) + offsetX,\n };\n\n const positionMapY: Record<ModalPositionAxis, number> = {\n start: targetRect.top + offsetY,\n start_around: targetRect.top - modalRect.height - offsetY,\n end: targetRect.top + targetRect.height - modalRect.height - offsetY,\n end_around: targetRect.top + targetRect.height + offsetY,\n center: targetRect.top + (targetRect.height / 2) - (modalRect.height / 2) + offsetY,\n };\n\n left = positionMapX[xPos];\n top = positionMapY[yPos];\n\n // Try to open window from the other side if it doesn't fit\n if (\n (left < 0 && (targetRect.left + modalRect.width + offsetX < docRect.width)) // Overflows left, though it fit on the right\n || ((left + modalRect.width) > docRect.width && targetRect.left > modalRect.width + offsetX) // Cuts off right side of screen, though it fit on the left\n ) {\n left = positionMapX[oppositePosition[xPos]];\n }\n\n if ((top < 0 && targetRect.bottom + modalRect.height + offsetY < docRect.height)\n || (((top + modalRect.height) > docRect.height) && targetRect.top - modalRect.height - offsetY > 0)) {\n top = positionMapY[oppositePosition[yPos]];\n }\n\n // Window cannot overflow beyond screen boundaries\n left = clamp(0, left, docRect.width - modalRect.width);\n top = clamp(options.limit?.top ?? 15, top, docRect.height - modalRect.height);\n\n this.updateStyles({\n position: 'absolute',\n top,\n left,\n });\n }\n\n updateView() {\n // Not implemented in base class\n }\n\n /**\n * Select a tab by ID\n */\n @action\n selectTab(activeTab: string) {\n const previousTabId = this.activeTab;\n\n if (activeTab === previousTabId) {\n return;\n }\n\n const win = this.windowEl;\n\n if (win) {\n win.classList.add(modalStyles.noanimate);\n }\n\n // Update tab options\n this.setTabOptions(activeTab);\n\n // Restore dimensions for new tab\n this.interactions.restoreDimensions();\n\n // Call callback\n this.options.onSelectTab?.(activeTab, this);\n\n // Notify about resize if tab change affects size\n requestAnimationFrame(() => {\n const w = this.windowEl;\n\n if (w) {\n w.classList.remove(modalStyles.noanimate);\n }\n });\n }\n\n /**\n * Toggle responsive mode for the modal\n */\n toggleResponsiveMode(state: string) {\n if (state === this.responsiveMode) {\n return;\n }\n\n const win = this.windowEl;\n\n if (win) {\n win.classList.add(modalStyles.noanimate);\n }\n\n this._setResponsiveMode(state);\n\n this.updateStyles({\n width: this.currentOptions.width,\n height: this.currentOptions.height,\n });\n\n requestAnimationFrame(() => {\n const w = this.windowEl;\n\n if (w) {\n w.classList.remove(modalStyles.noanimate);\n }\n });\n }\n\n /**\n * Set responsive mode for the modal\n */\n protected _setResponsiveMode(state: string) {\n this.responsiveMode = state;\n }\n\n /**\n * Watch for window size changes and fix position if necessary\n */\n initResizeObserver() {\n const onResize = () => {\n if (this.hidden || this.interactions.isDragging || this.interactions.isResizing) {\n return;\n }\n\n const { windowHeight: oldWindowHeight, windowWidth: oldWindowWidth } = this.bounds;\n\n this.updateBounds();\n\n this.applyPosition();\n\n const { windowHeight: newWindowHeight, windowWidth: newWindowWidth } = this.bounds;\n\n if (oldWindowHeight !== newWindowHeight || oldWindowWidth !== newWindowWidth) {\n this.options.onResize?.(this);\n }\n };\n\n // On screen or modal resize\n window.addEventListener('resize', onResize, { signal: this.#eventsAbortController.signal });\n this.#resizeObserver = new ResizeObserver(() => onResize());\n\n if (this.windowEl) {\n this.#resizeObserver.observe(this.windowEl);\n }\n }\n\n /**\n * Hide modal from screen\n */\n @action\n hide({ trigger = true, hideParent = true }: { trigger?: boolean; hideParent?: boolean } = {}) {\n if (this.hidden) {\n return;\n }\n\n this.#saveScrollPosition();\n\n this.hidden = true;\n\n // Hidden from another window, hide it too\n if (hideParent && this.options.fromModal) {\n this.options.fromModal.hide();\n }\n\n document.body.classList.remove('overflow');\n\n if (trigger) {\n this.overlay.dispatchEvent(new CustomEvent('hide'));\n\n this.options.onHide?.(this);\n this.triggerEvent('hide');\n }\n }\n\n /**\n * Show hidden modal\n */\n @action\n show({ trigger = true, showParent = true }: { trigger?: boolean; showParent?: boolean } = {}) {\n // is destroyed\n if (!Modal.list.has(this) || !this.hidden) {\n return;\n }\n\n // Opened from another window, show it too\n if (showParent && this.options.fromModal) {\n this.options.fromModal.show();\n }\n\n this.hidden = false;\n\n // Restore scroll position if it existed\n this.#restoreScrollPosition();\n\n this.focus();\n\n if (trigger) {\n this.overlay.dispatchEvent(new CustomEvent('show'));\n\n this.options.onShow?.(this);\n this.triggerEvent('show');\n }\n }\n\n /**\n * Focus current modal\n */\n focus() {\n if (!this.windowEl) {\n return;\n }\n\n // Something inside this modal is already focused — don't steal it\n if (this.overlay.contains(document.activeElement) && document.activeElement !== this.overlay) {\n return;\n }\n\n if (document.activeElement !== this.overlay) {\n this.#prevActiveElement = document.activeElement as HTMLElement;\n\n this.overlay.focus();\n }\n }\n\n\n /**\n * Shake it\n */\n shake(duration = 300) {\n if (!this.overlay) {\n return;\n }\n\n this.overlay.classList.add('shake');\n\n setTimeout(() => {\n this.overlay.classList.remove('shake');\n }, duration);\n }\n\n /**\n * Make window unactive\n */\n @action\n disable() {\n const win = this.windowEl;\n\n if (win) {\n disableFocusByTab([win]);\n }\n\n this.disabled = true;\n }\n\n /**\n * Make window active\n */\n @action\n enable() {\n const win = this.windowEl;\n\n if (win) {\n enableFocusByTab([win]);\n }\n\n this.disabled = false;\n this.focus();\n }\n\n /**\n * sets the flag that modal is saved\n */\n saved() {\n this.isSaved = true;\n }\n\n /**\n * sets the flag that modal is not saved\n */\n unsaved() {\n this.isSaved = false;\n }\n\n /**\n * Shows loader on the entire editor window\n */\n @action\n setLoader() {\n this.disable();\n\n this.loading = true;\n }\n\n /**\n * Removes loader\n */\n @action\n removeLoader() {\n this.enable();\n\n this.loading = false;\n }\n\n /**\n * Show confirmation dialog for unsaved changes\n * Override in extended classes (e.g., EditorModal) for custom confirmation dialogs\n */\n async showConfirm(): Promise<boolean> {\n\n return window.confirm('You have unsaved changes. Are you sure you want to close?');\n }\n\n /**\n * Close modal and show confirmation when data is not saved\n */\n cancel({ restoreFocus = true }: CloseOptions = {}) {\n const handleClose = () => {\n if (typeof this.options.onCancel === 'function') {\n this.options.onCancel(this);\n }\n\n // Hide modal instead of closing it\n if (this.options.hideOnClose) {\n this.hide();\n }\n // Close modal and destroy instance\n else {\n void this.close(true, { restoreFocus });\n }\n };\n\n // Show confirmation dialog if modal is not saved\n if (!this.isSaved) {\n void this.showConfirm().then((confirmed) => {\n if (confirmed) {\n handleClose();\n }\n });\n\n return false;\n }\n\n // Close modal and destroy instance\n handleClose();\n\n return true;\n }\n\n\n #fixOverflow() {\n const { limits } = this.bounds;\n const { top, left } = this.styles;\n\n let x = left;\n let y = top;\n\n if (y < limits.minTop) {\n y = limits.minTop;\n }\n else if (y > limits.maxTop) {\n y = limits.maxTop;\n }\n\n if (x < limits.minLeft) {\n x = limits.minLeft;\n }\n else if (x > limits.maxLeft) {\n x = limits.maxLeft;\n }\n\n this.updateStyles({\n top: y,\n left: x,\n });\n }\n\n #saveScrollPosition() {\n this.#scrollableEl = Array.from(this.overlay.querySelectorAll('.scrollable-content'));\n\n this.#scrollableEl.forEach((el) => {\n this.#scrollPositions.set(el, {\n top: el.scrollTop || 0,\n left: el.scrollLeft || 0,\n });\n });\n }\n\n #restoreScrollPosition() {\n this.#scrollableEl?.forEach((el) => {\n const position = this.#scrollPositions.get(el);\n\n if (position) {\n el.scrollTo(position.left, position.top);\n }\n });\n }\n\n /**\n * Add a disposer function to be called when modal is closed\n */\n protected addDisposer(disposer: () => void): void {\n this.#disposers.push(disposer);\n }\n\n /**\n * Dispose all registered disposers\n */\n protected disposeAll(): void {\n this.#disposers.forEach(disposer => disposer());\n this.#disposers = [];\n }\n}\n\nexport default Modal;\n"],"names":["_initProto","_init_options","_init_hidden","_init_disabled","_init_loading","_init_activeTab","_init_tabOptions","_init_responsiveMode","_init_contentRevision","_applyDecs","e","r","n","o","a","i","t","c","s","applyDec","u","l","f","p","d","h","m","y","v","g","b","w","S","A","_setFunctionName","P","j","D","E","I","O","k","F","N","_checkInRHS","_toPropertyKey","_toPrimitive","CLOSE_BUTTON_DISTANCE_THRESHOLD","CLICKOUT_CLOSE_DELAY","CLICKOUT_BLOCKING_LAYER_SELECTOR","MODAL_OPEN_DURATION_S","MODAL_CLOSE_DURATION_S","popstated","_Modal","opts","__privateAdd","_Modal_instances","_A","_B","_C","_D","_E","_F","_G","_H","_initialCoords","_scrollableEl","_clickOutInclude","_eventsAbortController","_prevActiveElement","_scrollPositions","_targetWatchInterval","_resizeObserver","_disposers","__privateSet","parent","options","getRandomId","ModalInteractions","runInAction","evaluateValue","__privateMethod","bindEvents_fn","child","modal","modals","name","createOptions","duplicate","reuseExisting","sameIdModal","sameNameModal","__privateGet","tabOptions","responsiveMode","tabOptionsWithAdaptive","adaptiveOptions","activeTab","tabs","tab","activeTabOptions","activeTabDerivedOptions","type","isOverlayStyle","isWindowStyle","target","index","adaptive","mode","data","event","prevWidth","prevHeight","nextOptions","previousOptions","scrollable","fixOverflow_fn","checkTarget","frameElement","element","style","rect","container","root","createRoot","flushSync","React","ModalRoot","overlay","isNew","win","complete","shouldAnimate","animations","animate","popstate","restoreFocus","focusedElement","windowWidth","windowHeight","overlayWidth","overlayHeight","limit","args","allowOverflow","limits","styles","minLeft","maxLeft","minTop","maxTop","top","left","docRect","overlayRect","itemRect","modalRect","optionWidth","optionHeight","frameRect","targetRect","xPos","yPos","xGap","yGap","offsetX","offsetY","oppositePosition","positionMapX","positionMapY","clamp","previousTabId","modalStyles","state","onResize","oldWindowHeight","oldWindowWidth","newWindowHeight","newWindowWidth","trigger","hideParent","saveScrollPosition_fn","showParent","restoreScrollPosition_fn","duration","disableFocusByTab","enableFocusByTab","handleClose","confirmed","disposer","windowEl","currentModalIndex","matchesSelector","selector","hasOpenClickoutBlockingLayer","doc","closeButtonSelector","handleCloseButtonPointerDown","pageX","pageY","handleCloseButtonPointerUp","distanceBetween","denyClose","clickTarget","wasLastOnPointerDown","resetClickOutState","handlePointerDown","lastModal","clickStartedInsideWindow","clickStartedOnAnchor","clickStartedInExcludedArea","clickStartedInBlockingLayer","clickStartedWithBlockingLayerOpen","handlePointerUp","closeButton","dropdownIsOpen","contentRevision","targetDoc","x","el","position","observableRef","observable","computed","action","makeObservable","Modal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Modal.js","sources":["../../src/Modal/Modal.ts"],"sourcesContent":["/**\n * Modal windows\n *\n *\n * Features:\n - Background overlay\n - Display next to element\n - Tabs\n - Window dragging\n - Multiple modals can be shown simultaneously\n - Automatic positioning\n\n * Usage:\n const modal = Modal.create({\n type: 'window', // window type: small or fullscreen\n component: 'name', // component\n props: {}, // component props,\n ...Opts\n });\n */\n\nimport { clamp, getRandomId } from '@reforma/lib';\nimport { makeObservable } from '@reforma/lib/observers';\nimport { action, computed, observable, observableRef, runInAction } from 'mobx';\nimport { animate } from 'motion';\nimport React from 'react';\nimport { flushSync } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\n\nimport { disableFocusByTab, distanceBetween, enableFocusByTab, evaluateValue } from './helpers';\nimport ModalInteractions from './ModalInteractions';\nimport modalStyles from './styles/Modal.module.css';\nimport { ModalRoot } from './views/ModalRoot';\n\nimport type { ModalOptions, ModalPositionAxis, ModalResponsiveMode } from './typings';\n\ntype Writeable<T> = { -readonly [P in keyof T]: T[P] };\ninterface CloseOptions {\n restoreFocus?: boolean;\n}\n\n// Constants\nconst CLOSE_BUTTON_DISTANCE_THRESHOLD = 35;\nconst CLICKOUT_CLOSE_DELAY = 100;\nconst CLICKOUT_BLOCKING_LAYER_SELECTOR = '[data-modal-clickout-layer]';\nconst MODAL_OPEN_DURATION_S = 0.2;\nconst MODAL_CLOSE_DURATION_S = 0.15;\n\nlet popstated = false;\n\nclass Modal<Opts extends ModalOptions = ModalOptions> {\n // Static properties\n static events = makeObservable({});\n static list: Set<Modal> = new Set<Modal>();\n\n static get opened() {\n return Array.from(this.list);\n }\n\n static get visible() {\n return this.opened.filter(m => !m.hidden && m.type !== 'sidebar');\n }\n\n /** Top visible modal, excluding `child`. Used to nest window-type dialogs. */\n static parentOf(child: Modal): Modal | undefined {\n const visible = this.visible.filter(m => m !== child);\n\n return visible.at(-1);\n }\n\n static create(opts: Partial<ModalOptions> = {}): Modal {\n if (!popstated) {\n popstated = true;\n\n // Modal was open, but we navigated away - close it\n window.addEventListener('popstate', (e: any) => {\n if (e.direction === 'backward' && e.oldState?.modalId) {\n const modal = Array.from(this.list).find(m => e.oldState.modalId === m.id);\n\n if (modal) {\n void modal.close(false);\n }\n }\n });\n }\n\n // Check for duplicates before creating the actual instance\n const modals: Array<Modal> = Array.from(this.list);\n\n const name = opts.name || opts.id;\n const createOptions: Partial<ModalOptions> = { ...opts, name };\n const duplicate = opts.duplicate === true;\n const reuseExisting = opts.reuseExisting ?? !duplicate;\n\n const sameIdModal = opts.id\n ? modals.find(m => m.id === opts.id)\n : undefined;\n const sameNameModal = name\n ? modals.find(m => m.name === name)\n : undefined;\n\n if (sameIdModal) {\n if (sameIdModal.canReuseWith(createOptions, reuseExisting)) {\n sameIdModal.reuse(createOptions);\n }\n else {\n sameIdModal.show();\n }\n\n return sameIdModal;\n }\n\n if (sameNameModal) {\n if (sameNameModal.canReuseWith(createOptions, reuseExisting)) {\n sameNameModal.reuse(createOptions);\n\n return sameNameModal;\n }\n\n if (opts.hideOnClose || !duplicate) {\n sameNameModal.show();\n\n return sameNameModal;\n }\n }\n\n // Create modal instance only if unique\n return new this(createOptions);\n }\n\n // Instance properties\n @observableRef accessor options!: Opts;\n public name: string;\n public id: string;\n\n public type = 'window';\n\n @observable accessor hidden = false;\n @observable accessor disabled = false;\n\n public isSaved = true;\n\n @observable accessor loading = false;\n @observable accessor activeTab: string | null = null;\n @observableRef accessor tabOptions: Partial<Opts> = {};\n @observable accessor responsiveMode: ModalResponsiveMode | null = null;\n @observable accessor contentRevision = 0;\n\n @computed get currentOptions(): Opts {\n const tabOptions = this.tabOptions;\n const responsiveMode = this.responsiveMode;\n const tabOptionsWithAdaptive = tabOptions as Partial<Opts> & { adaptive?: Partial<Record<ModalResponsiveMode, Partial<Opts>>> };\n const adaptiveOptions = tabOptionsWithAdaptive.adaptive\n ? (tabOptionsWithAdaptive.adaptive[responsiveMode ?? 'all'] || tabOptionsWithAdaptive.adaptive.all || {})\n : {};\n\n return {\n ...this.options,\n ...tabOptions,\n ...adaptiveOptions,\n props: {\n ...this.options.props,\n ...tabOptions.props,\n ...(adaptiveOptions as any).props,\n },\n };\n }\n\n /**\n * Get default tab ID - returns activeTab from signal/options or first tab ID\n */\n get defaultTabId(): string | null {\n const activeTab = this.activeTab || this.options.activeTab;\n const tabs = this.options.tabs || [];\n const hasTabs = tabs.length > 0;\n\n // Default id not provided or not found in tabs list - return first tab id\n if (hasTabs && (activeTab == null || !tabs.find(tab => tab.id === activeTab))) {\n return tabs[0]?.id || null;\n }\n\n return activeTab || null;\n }\n\n windowEl: HTMLElement | null = null;\n\n public overlay!: HTMLElement;\n\n styles!: {\n top: number;\n left: number;\n position: string | null;\n height: number | string;\n width: number | string;\n maxHeight: number | string | null;\n maxWidth: number | string | null;\n };\n\n bounds!: {\n windowWidth: number;\n windowHeight: number;\n overlayWidth: number;\n overlayHeight: number;\n\n limits: {\n minLeft: number;\n maxLeft: number;\n minTop: number;\n maxTop: number;\n overflowMinLeft: number;\n overflowMaxLeft: number;\n overflowMinTop: number;\n overflowMaxTop: number;\n };\n };\n\n isDragging = false;\n\n #initialCoords: { pageX: number; pageY: number } | null = null;\n\n #scrollableEl?: HTMLElement[];\n #clickOutInclude: (Document | Element)[];\n #eventsAbortController: AbortController;\n #prevActiveElement!: HTMLElement;\n #scrollPositions: WeakMap<HTMLElement, { top: number; left: number }>;\n #targetWatchInterval: number | null = null;\n\n #resizeObserver!: ResizeObserver;\n #disposers: Array<() => void> = [];\n interactions: ModalInteractions;\n\n /**\n * Set tab options based on active tab ID\n * Internal method - use selectTab() for public API\n */\n @action\n private setTabOptions(activeTab: string | null = this.defaultTabId) {\n const tabs = this.options.tabs ?? [];\n\n // No tabs, simple case\n if (!tabs.length) {\n this.activeTab = null;\n this.tabOptions = { ...this.options };\n }\n // Merge all tab options + dynamic options + global window options\n else {\n const activeTabOptions = tabs.find(tab => tab.id === activeTab) || {} as Partial<Opts>;\n const activeTabDerivedOptions = activeTabOptions?.getOptions?.(this) || {};\n\n this.activeTab = activeTab;\n this.tabOptions = this.normalizeOptions({\n ...this.options,\n ...activeTabOptions,\n ...activeTabDerivedOptions,\n });\n }\n }\n\n /**\n * Normalize options - builds full Opts from partial options\n * Override in extended classes (e.g., EditorModal) to add custom defaults\n */\n protected normalizeOptions(opts: Partial<Opts>): Opts {\n const type = opts.type || 'window';\n\n const isOverlayStyle = type === 'overlay';\n const isWindowStyle = type === 'window';\n\n const target = opts.target ?? opts.fromModal?.windowEl;\n\n const options: Partial<Opts> = {\n type,\n handle: isOverlayStyle ? undefined : '[data-modal-title]',\n\n animate: true,\n duplicate: false,\n reuseExisting: true,\n loading: false,\n\n fromModal: null,\n position: ['center', 'center'],\n positionFrom: target ? 'target' : 'screen',\n closeOnTargetLost: !!target && type === 'window',\n target,\n\n component: null,\n props: null,\n\n class: [],\n overlayClass: [],\n theme: (opts.fromModal)?.currentOptions.theme || 'light',\n tabs: [],\n modalActions: [],\n\n title: null,\n closeButton: !isOverlayStyle || !!opts.title,\n\n width: null,\n minWidth: null,\n height: null,\n padding: null,\n\n scrollable: true,\n\n overlay: false,\n shadow: !!opts.overlay, // Enable shadow if overlay is active\n\n clickOut: isWindowStyle,\n clickOutExclude: opts.clickOutExclude || [],\n clickOutInclude: opts.clickOutInclude || [document],\n closeOnEscape: true,\n hideOnClose: false,\n reactHost: false,\n initialResponsiveMode: 'all',\n responsiveModes: {\n all: {\n icon: 'all.svg',\n iconSize: 16,\n tip: 'All',\n },\n mobile: {\n icon: 'mobile.svg',\n iconSize: 16,\n tip: 'Mobile',\n },\n tablet: {\n icon: 'tablet.svg',\n iconSize: 16,\n tip: 'Tablet',\n },\n desktop: {\n icon: 'desktop.svg',\n iconSize: 16,\n tip: 'Desktop',\n },\n },\n\n // Callbacks\n onInit() {},\n onOpen() {},\n onOpened() {},\n onCancel() {},\n onClose() {},\n onBeforeReuse() {},\n onShow() {},\n onHide() {},\n\n ...opts,\n\n limit: {\n overflow: true,\n top: 15,\n left: 15,\n right: 15,\n bottom: 15,\n ...opts.limit || {},\n },\n };\n\n if (typeof options.class === 'string') {\n options.class = [options.class];\n }\n\n if (typeof options.overlayClass === 'string') {\n options.overlayClass = [options.overlayClass];\n }\n\n if (options.scrollable === true) {\n options.scrollable = 'window';\n }\n\n if (options.scrollable === false) {\n options.scrollable = 'hidden';\n }\n\n if (options.scrollable === 'overlay' && options.type === 'window') {\n options.handle = false;\n }\n\n if (typeof options.padding === 'number') {\n options.padding = `${ options.padding }px`;\n }\n\n options.duplicate = options.duplicate === true;\n\n // Dont allow duplicate if hideOnClose is true\n if (options.hideOnClose) {\n options.duplicate = false;\n }\n\n options.reuseExisting = opts.reuseExisting ?? (!options.duplicate && !options.hideOnClose);\n\n if (options.fromModal && options.type !== 'overlay' && opts.overlay !== true) {\n options.shadow = false;\n options.overlay = false;\n }\n else if (options.shadow) {\n options.overlay = true;\n }\n\n options.tabs = (options.tabs ?? []).filter(tab => tab && !tab.hide);\n\n // Find adaptive modes and remove invalid ones\n options.tabs?.forEach((tab, index) => {\n if (!tab.id) {\n tab.id = `tab-${ index }`;\n }\n\n const adaptive = tab.adaptive;\n\n if (adaptive) {\n Object.entries(adaptive).forEach(([mode, data]: [string, any]) => {\n if (!data) {\n delete adaptive[mode];\n }\n });\n }\n });\n\n return options as unknown as Opts;\n }\n\n constructor(opts: Partial<Opts>) {\n // Add in list\n Modal.list.add(this);\n\n // Extend options by getOptions function\n if (typeof opts.getOptions === 'function') {\n opts = {\n ...opts,\n ...opts.getOptions(this),\n };\n }\n\n if (opts.fromModal === undefined\n && (opts.type ?? 'window') !== 'overlay'\n && opts.overlay !== true) {\n const parent = Modal.parentOf(this);\n\n if (parent) {\n opts = { ...opts, fromModal: parent };\n }\n }\n\n // Normalize options\n const options = this.normalizeOptions(opts);\n\n this.options = options;\n\n this.id = options.id || `modal:${ getRandomId(8) }`;\n this.name = options.name ?? this.id;\n this.type = options.type;\n this.#clickOutInclude = options.clickOutInclude || [document];\n this.#eventsAbortController = new AbortController();\n this.#scrollPositions = new WeakMap();\n this.interactions = new ModalInteractions(this);\n\n runInAction(() => {\n this.responsiveMode = evaluateValue(options.initialResponsiveMode) ?? null;\n this.setTabOptions(this.defaultTabId);\n });\n\n requestAnimationFrame(() => {\n // Need to show loader immediately when opening the window\n if (options.loading) {\n this.setLoader();\n }\n\n // If modal created outside of React tree, create modal root\n // and mount it to the DOM\n if (!options.reactHost) {\n this.createModalRoot();\n }\n\n this.#bindEvents();\n this.interactions.initDraggable();\n this.interactions.initResizable();\n\n this.currentOptions.onInit?.(this);\n\n void this.open(true);\n });\n }\n\n /**\n * Triggers a global event on the Modal class\n */\n triggerEvent(event: string) {\n void Modal.events.emit(event, this);\n }\n\n /**\n * Updates options\n */\n @action\n updateOptions(options: Partial<Opts>) {\n const prevWidth = this.currentOptions.width;\n const prevHeight = this.currentOptions.height;\n\n let nextOptions: Partial<Opts> = {\n ...this.options,\n ...options,\n };\n\n if (typeof nextOptions.getOptions === 'function') {\n nextOptions = {\n ...nextOptions,\n ...nextOptions.getOptions(this),\n };\n }\n\n this.options = this.normalizeOptions(nextOptions);\n this.type = this.options.type;\n this.setTabOptions(this.defaultTabId);\n\n if (this.currentOptions.width !== prevWidth || this.currentOptions.height !== prevHeight) {\n this.refreshLayout();\n }\n }\n\n /**\n * Replace options for a reused instance without carrying stale caller options.\n */\n @action\n private replaceOptions(options: Partial<Opts>) {\n let nextOptions: Partial<Opts> = {\n id: this.id,\n name: this.name,\n ...options,\n };\n\n if (typeof nextOptions.getOptions === 'function') {\n nextOptions = {\n ...nextOptions,\n ...nextOptions.getOptions(this),\n };\n }\n\n this.options = this.normalizeOptions(nextOptions);\n this.name = this.options.name ?? this.name;\n this.id = this.options.id ?? this.id;\n this.type = this.options.type;\n this.setTabOptions(this.defaultTabId);\n }\n\n private canReuseWith(options: Partial<Opts>, reuseExisting = options.reuseExisting ?? !options.duplicate) {\n return !!reuseExisting\n && !options.reactHost\n && !options.hideOnClose\n && !this.currentOptions.hideOnClose;\n }\n\n /**\n * Reuse this instance for a new Modal.create call with the same id/name.\n */\n private reuse(options: Partial<Opts>) {\n const previousOptions = this.currentOptions;\n const sameTarget = options.target != null && previousOptions.target === options.target;\n\n if (!sameTarget) {\n previousOptions.onBeforeReuse?.(this);\n }\n\n this.replaceOptions(options);\n\n runInAction(() => {\n this.responsiveMode = evaluateValue(this.options.initialResponsiveMode) ?? null;\n this.contentRevision += 1;\n });\n\n if (this.options.loading) {\n this.setLoader();\n }\n else if (this.loading) {\n this.removeLoader();\n }\n\n if (this.hidden) {\n this.show();\n }\n\n requestAnimationFrame(() => {\n this.refreshLayout();\n });\n\n this.focus();\n }\n\n /**\n * Overlay-scroll and fullscreen overlay skip JS position / max-height —\n * the overlay is the scrollport, the window stays in flow.\n */\n private skipsWindowPositioning(): boolean {\n const { type, scrollable } = this.currentOptions;\n\n return type === 'overlay' || scrollable === 'overlay';\n }\n\n /**\n * Keep a dragged window where the user put it. Otherwise place it from the anchor.\n * A size change only pulls a dragged window back on screen.\n */\n private applyPosition() {\n if (this.currentOptions.handle && this.interactions.hasUserMoved) {\n this.#fixOverflow();\n\n return;\n }\n\n this.updatePosition();\n }\n\n /**\n * Recalculate dimensions and position after options change.\n */\n refreshLayout() {\n if (this.skipsWindowPositioning()) {\n this.stopTargetWatcher();\n\n return;\n }\n\n if (!this.windowEl) {\n return;\n }\n\n this.syncTargetWatcher();\n this.updateBounds();\n this.updateStyles({\n width: this.currentOptions.width ?? '',\n height: this.currentOptions.height ?? '',\n }, true);\n this.updateBounds();\n this.applyPosition();\n }\n\n /**\n * Close anchored windows when their target leaves the visible UI.\n */\n private syncTargetWatcher() {\n if (this.currentOptions.closeOnTargetLost) {\n this.initTargetWatcher();\n\n return;\n }\n\n this.stopTargetWatcher();\n }\n\n private initTargetWatcher() {\n if (this.#targetWatchInterval != null || !this.currentOptions.closeOnTargetLost) {\n return;\n }\n\n const checkTarget = () => {\n if (this.hidden || !this.isTargetLost()) {\n return;\n }\n\n this.cancel({ restoreFocus: false });\n };\n\n this.#targetWatchInterval = window.setInterval(checkTarget, 150);\n this.addDisposer(() => {\n if (this.#targetWatchInterval == null) {\n return;\n }\n\n this.stopTargetWatcher();\n });\n\n checkTarget();\n }\n\n private stopTargetWatcher() {\n if (this.#targetWatchInterval == null) {\n return;\n }\n\n window.clearInterval(this.#targetWatchInterval);\n this.#targetWatchInterval = null;\n }\n\n private isTargetLost() {\n const options = this.currentOptions;\n\n if (!options.closeOnTargetLost || options.type === 'overlay' || options.positionFrom !== 'target') {\n return false;\n }\n\n const target = this.getPositionTarget();\n\n if (!target || target === target.ownerDocument.body || target === target.ownerDocument.documentElement) {\n return false;\n }\n\n if (!target.isConnected) {\n return true;\n }\n\n const frameElement = target.ownerDocument.defaultView?.frameElement as HTMLElement | null;\n\n if (frameElement && (this.isElementInvisible(frameElement) || !frameElement.isConnected)) {\n return true;\n }\n\n return this.isElementInvisible(target);\n }\n\n private getPositionTarget() {\n const options = this.currentOptions;\n\n return options.target || options.fromModal?.windowEl || null;\n }\n\n private isElementInvisible(element: HTMLElement) {\n const style = element.ownerDocument.defaultView?.getComputedStyle(element);\n\n if (style?.display === 'none' || style?.visibility === 'hidden') {\n return true;\n }\n\n const rect = element.getBoundingClientRect();\n\n return element.getClientRects().length === 0 || (!rect.width && !rect.height);\n }\n\n /**\n * Creates modal root using React\n */\n private createModalRoot() {\n const container = document.createElement('div');\n\n container.setAttribute('data-modal-root-container', this.name);\n document.body.appendChild(container);\n\n const root = createRoot(container);\n\n flushSync(() => {\n root.render(\n React.createElement(ModalRoot, {\n modal: this,\n })\n );\n });\n\n this.addDisposer(() => {\n root.unmount();\n\n container.remove();\n });\n }\n\n setOverlay(overlay: HTMLElement | null) {\n if (!overlay) {\n return;\n }\n\n this.overlay = overlay;\n }\n\n setWindow(element: HTMLDivElement | null) {\n this.windowEl = element;\n }\n\n /**\n * Init core modal events (close on ESC or overlay and other)\n */\n #bindEvents() {\n const { overlay } = this;\n const windowEl = this.windowEl;\n\n const handleClose = () => {\n const modals = Modal.visible;\n\n // close all nested modals\n if (modals.length > 1) {\n const currentModalIndex = modals.findIndex(modal => modal.id === this.id);\n const modalsToClose = modals.slice(currentModalIndex + 1);\n\n const eachClosed = modalsToClose.every(modal => modal.cancel());\n\n if (!eachClosed) {\n return false;\n }\n }\n\n this.cancel();\n };\n\n // Helper to check if element matches selector or is within selector\n const matchesSelector = (element: HTMLElement, selector: string): boolean => {\n if (element.matches(selector)) {\n return true;\n }\n\n return element.closest(selector) !== null;\n };\n\n const hasOpenClickoutBlockingLayer = (doc: Document): boolean => doc.querySelector(CLICKOUT_BLOCKING_LAYER_SELECTOR) !== null;\n\n // ESC\n overlay.addEventListener('keydown', (e: KeyboardEvent) => {\n const options = this.currentOptions;\n\n if (!options.closeOnEscape || e.key !== 'Escape') {\n return;\n }\n\n this.cancel();\n\n e.preventDefault();\n e.stopImmediatePropagation();\n }, { signal: this.#eventsAbortController.signal });\n\n // CLOSE BTN\n const closeButtonSelector = '[data-modal-close], header .close, footer .close';\n\n const handleCloseButtonPointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null;\n\n if (target && matchesSelector(target, closeButtonSelector)) {\n const { pageX, pageY } = e;\n\n this.#initialCoords = { pageX, pageY };\n }\n };\n\n const handleCloseButtonPointerUp = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null;\n\n if (!target || !matchesSelector(target, closeButtonSelector)) {\n return;\n }\n\n if (this.#initialCoords != null) {\n const { pageX, pageY } = e;\n const distance = distanceBetween(\n [pageX, pageY],\n [this.#initialCoords.pageX, this.#initialCoords.pageY]\n );\n\n if (+distance.toFixed(0) <= CLOSE_BUTTON_DISTANCE_THRESHOLD) {\n handleClose();\n }\n\n this.#initialCoords = null;\n }\n else {\n handleClose();\n }\n };\n\n overlay.addEventListener('pointerdown', handleCloseButtonPointerDown, { signal: this.#eventsAbortController.signal });\n overlay.addEventListener('pointerup', handleCloseButtonPointerUp, { signal: this.#eventsAbortController.signal });\n\n // ClickOut modal\n let denyClose = false;\n let clickTarget: HTMLElement | null = null;\n let wasLastOnPointerDown = false;\n const resetClickOutState = () => {\n denyClose = false;\n clickTarget = null;\n wasLastOnPointerDown = false;\n };\n\n // Prevent context menu on overlay (not needed)\n overlay.addEventListener('contextmenu', (e: MouseEvent) => {\n if (e.target === overlay) {\n e.preventDefault();\n }\n }, { signal: this.#eventsAbortController.signal });\n\n // Remember the start of the click\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null;\n\n if (!target) {\n denyClose = true;\n\n return;\n }\n\n clickTarget = target;\n\n const options = this.currentOptions;\n const modals = Modal.visible;\n const lastModal = modals[modals.length - 1];\n const clickStartedInsideWindow = windowEl?.contains(target) ?? false;\n const clickStartedOnAnchor = options.target?.contains(target) ?? false;\n const clickStartedInExcludedArea = options.clickOutExclude?.some(selector => matchesSelector(target, selector)) ?? false;\n const clickStartedInBlockingLayer = matchesSelector(target, CLICKOUT_BLOCKING_LAYER_SELECTOR);\n const clickStartedWithBlockingLayerOpen = hasOpenClickoutBlockingLayer(target.ownerDocument);\n\n wasLastOnPointerDown = lastModal === this;\n\n denyClose = e.button !== 0\n || clickStartedInsideWindow\n || clickStartedOnAnchor\n || clickStartedInExcludedArea\n || clickStartedInBlockingLayer\n || clickStartedWithBlockingLayerOpen;\n };\n\n // And the end of the click\n const handlePointerUp = (e: PointerEvent) => {\n if (denyClose || !clickTarget) {\n resetClickOutState();\n\n return;\n }\n\n clickTarget = null;\n\n const target = e.target as HTMLElement | null;\n\n if (!target) {\n resetClickOutState();\n\n return;\n }\n\n const options = this.currentOptions;\n\n // Ignore click on close button, it's handled above\n const closeButton = matchesSelector(target, '[data-modal-close]');\n const dropdownIsOpen = !!document.querySelector('body .dropdown-balloon');\n\n if (closeButton || dropdownIsOpen) {\n resetClickOutState();\n\n return;\n }\n\n // Window is hidden, ignore closing\n if (!wasLastOnPointerDown || this.hidden || this.interactions.isDragging) {\n resetClickOutState();\n\n return;\n }\n\n resetClickOutState();\n\n // Ignore click inside own window\n if (windowEl?.contains(target)) {\n return;\n }\n\n // Closing by outside click is disabled - animate\n if (!options.clickOut) {\n if (options.animate && windowEl) {\n animate(windowEl, {\n scale: [1, 1.02, 1],\n }, {\n duration: 0.18,\n ease: 'circInOut',\n });\n }\n\n return;\n }\n\n // Ignore clicks handled by a higher interaction layer\n if (matchesSelector(target, CLICKOUT_BLOCKING_LAYER_SELECTOR)) {\n return;\n }\n\n const contentRevision = this.contentRevision;\n\n // Slightly delay closing to allow click events that might occur on this element to fire\n setTimeout(() => {\n if (!Modal.list.has(this) || this.contentRevision !== contentRevision) {\n return;\n }\n\n this.cancel({ restoreFocus: false });\n }, CLICKOUT_CLOSE_DELAY);\n };\n\n this.#clickOutInclude.forEach((targetDoc) => {\n targetDoc.addEventListener('pointerdown', (e: Event) => handlePointerDown(e as PointerEvent), {\n capture: true,\n signal: this.#eventsAbortController.signal,\n });\n targetDoc.addEventListener('pointerup', (e: Event) => handlePointerUp(e as PointerEvent), {\n capture: true,\n signal: this.#eventsAbortController.signal,\n });\n });\n }\n\n /**\n * open - Open modal\n *\n * @param {type} isNew Description\n */\n async open(isNew = false) {\n const { options } = this;\n const overlay = this.overlay;\n const win = this.windowEl;\n\n const complete = (): void => {\n this.triggerEvent('open');\n\n overlay.style.transform = '';\n overlay.style.opacity = '';\n overlay.style.visibility = '';\n\n if (win) {\n win.style.transform = '';\n win.style.opacity = '';\n overlay.style.visibility = '';\n }\n\n options.onOpened?.(this);\n };\n\n // Opened from another editor, hide it\n if (options.fromModal) {\n options.fromModal.disable();\n }\n\n const isOverlayStyle = options.type === 'overlay';\n\n if (isOverlayStyle && isNew) {\n history.pushState({ modalId: this.id }, window.document.title, '');\n }\n\n if (isOverlayStyle || options.overlay) {\n document.body.classList.add('overflow');\n }\n\n const shouldAnimate = options.animate && isNew && win;\n\n if (!this.skipsWindowPositioning()) {\n this.updateBounds();\n this.updateStyles();\n this.initResizeObserver();\n this.syncTargetWatcher();\n this.updatePosition();\n }\n\n if (shouldAnimate && win) {\n overlay.style.opacity = String(isOverlayStyle ? 0.6 : 0);\n overlay.style.visibility = 'visible';\n\n const animations = [\n animate(overlay, {\n opacity: 1,\n }, {\n duration: MODAL_OPEN_DURATION_S,\n ease: 'easeOut',\n }),\n animate(win, {\n scale: [0.98, 1],\n y: [10, 0],\n }, {\n duration: MODAL_OPEN_DURATION_S,\n ease: 'circOut',\n }),\n ];\n\n await Promise.all(animations);\n complete();\n }\n else {\n complete();\n }\n\n options.onOpen?.(this);\n\n this.focus();\n }\n\n /**\n * Close modal\n *\n * @param {boolean} [popstate] Need fire popstate event\n */\n async close(popstate = true, { restoreFocus = true }: CloseOptions = {}) {\n const { options } = this;\n\n const isOverlayStyle = options.type === 'overlay';\n\n if (isOverlayStyle && popstate) {\n window.dispatchEvent(new PopStateEvent('popstate'));\n }\n\n // Abort all event listeners\n this.#eventsAbortController.abort();\n\n if (typeof this.#resizeObserver?.disconnect === 'function') {\n this.#resizeObserver.disconnect();\n }\n\n // Blur any inputs\n const focusedElement = this.overlay?.querySelector(':focus');\n\n if (focusedElement && 'blur' in focusedElement && typeof (focusedElement as HTMLElement).blur === 'function') {\n (focusedElement as HTMLElement).blur();\n }\n\n const win = this.windowEl;\n const overlay = this.overlay;\n const shouldAnimate = options.animate && win && overlay;\n\n if (shouldAnimate) {\n await Promise.all([\n animate(win, {\n scale: 0.98,\n y: 10,\n opacity: 0,\n }, {\n duration: MODAL_CLOSE_DURATION_S,\n ease: 'circOut',\n }),\n animate(overlay, {\n opacity: 0,\n }, {\n duration: MODAL_CLOSE_DURATION_S,\n ease: 'easeOut',\n }),\n ]);\n }\n\n options.onClose?.(this);\n\n // Remove from list before triggering event so listeners don't see closed modals\n Modal.list.delete(this);\n\n // Dispose all registered disposers and unmount component\n this.disposeAll();\n\n this.triggerEvent('close');\n\n // Opened from another window, show it\n if (options.fromModal) {\n options.fromModal.enable();\n\n return;\n }\n\n if (restoreFocus && this.#prevActiveElement) {\n this.#prevActiveElement.focus();\n }\n\n if (isOverlayStyle || options.overlay) {\n document.body.classList.remove('overflow');\n }\n }\n\n updateBounds() {\n const modal = this.windowEl;\n\n if (!modal) {\n return;\n }\n\n const { overlay, options } = this;\n const windowWidth = modal.offsetWidth;\n const windowHeight = modal.offsetHeight;\n\n const overlayWidth = overlay.offsetWidth;\n const overlayHeight = overlay.offsetHeight;\n\n const limit = options.limit ?? { top: 15, left: 15, right: 15, bottom: 15 };\n\n this.bounds = {\n windowWidth,\n windowHeight,\n overlayWidth,\n overlayHeight,\n limits: {\n minLeft: limit.left ?? 15,\n maxLeft: overlayWidth - windowWidth - (limit.right ?? 15),\n minTop: limit.top ?? 15,\n maxTop: overlayHeight - windowHeight - (limit.bottom ?? 15),\n overflowMinLeft: (limit.left ?? 15) - windowWidth,\n overflowMaxLeft: overlayWidth - (limit.right ?? 15),\n overflowMinTop: limit.top ?? 15,\n overflowMaxTop: overlayHeight - (limit.bottom ?? 15),\n },\n };\n }\n\n /**\n * Updates window size/position\n *\n * @param {object?} args - css params for modal\n * @param allowOverflow\n */\n updateStyles(args = {}, allowOverflow = false) {\n const { overlay, options } = this;\n\n if (this.skipsWindowPositioning()) {\n return;\n }\n\n const modal = this.windowEl;\n\n if (!modal) {\n return;\n }\n\n const { overlayWidth, overlayHeight, limits } = this.bounds;\n\n let styles: {\n position: string | null;\n top: number;\n left: number;\n width: number | string;\n height: number | string;\n maxWidth: number | string | null;\n maxHeight: number | string | null;\n } = {\n position: null,\n top: 0,\n left: 0,\n width: this.currentOptions.width ?? '',\n height: this.currentOptions.height ?? '',\n maxWidth: null,\n maxHeight: null,\n };\n\n styles = {\n ...styles,\n ...this.styles,\n ...args,\n };\n\n const minLeft = allowOverflow ? limits.overflowMinLeft : limits.minLeft;\n const maxLeft = allowOverflow ? limits.overflowMaxLeft : limits.maxLeft;\n const minTop = allowOverflow ? limits.overflowMinTop : limits.minTop;\n const maxTop = allowOverflow ? limits.overflowMaxTop : limits.maxTop;\n\n // Offset cannot exceed the set limit\n if (options.position) {\n styles.top = (styles.top > maxTop) ? maxTop : (styles.top < minTop) ? minTop : styles.top;\n styles.left = (styles.left > maxLeft) ? maxLeft : (styles.left < minLeft) ? minLeft : styles.left;\n }\n\n const limit = options.limit ?? { top: 15, left: 15, right: 15, bottom: 15 };\n\n styles.maxWidth = overlayWidth - (limit.left ?? 15) - (limit.right ?? 15);\n styles.maxHeight = overlayHeight - (limit.top ?? 15) - (limit.bottom ?? 15);\n\n Object.assign(modal.style, {\n position: styles.position || '',\n top: typeof styles.top === 'number' ? `${ styles.top }px` : String(styles.top),\n left: typeof styles.left === 'number' ? `${ styles.left }px` : String(styles.left),\n width: typeof styles.width === 'number' ? `${ styles.width }px` : String(styles.width),\n height: typeof styles.height === 'number' ? `${ styles.height }px` : String(styles.height),\n maxWidth: styles.maxWidth ? (typeof styles.maxWidth === 'number' ? `${ styles.maxWidth }px` : String(styles.maxWidth)) : '',\n maxHeight: styles.maxHeight ? (typeof styles.maxHeight === 'number' ? `${ styles.maxHeight }px` : String(styles.maxHeight)) : '',\n });\n\n this.styles = { ...styles, position: styles.position };\n\n overlay.dispatchEvent(new CustomEvent('updatePosition', { detail: styles }));\n }\n\n /**\n * Positions the window based on given options (next to element or in part of screen)\n */\n updatePosition() {\n const { overlay, options } = this;\n const modal = this.windowEl;\n\n if (!options.position || this.skipsWindowPositioning() || !modal) {\n return;\n }\n\n if (this.isTargetLost()) {\n this.cancel({ restoreFocus: false });\n\n return;\n }\n\n let top: number;\n let left: number;\n\n const target = this.getPositionTarget();\n const docRect = {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n };\n\n const overlayRect: DOMRect | undefined = overlay?.getBoundingClientRect();\n const itemRect: Writeable<DOMRect> | undefined = target?.getBoundingClientRect()?.toJSON();\n const modalRect: Writeable<DOMRect> = modal.getBoundingClientRect().toJSON();\n const optionWidth = this.currentOptions.width;\n const optionHeight = this.currentOptions.height;\n\n if (typeof optionWidth === 'number') {\n modalRect.width = optionWidth;\n }\n\n if (typeof optionHeight === 'number') {\n modalRect.height = optionHeight;\n }\n\n // Adjust itemRect if target is in a different document (e.g., iframe)\n if (target && itemRect && overlay && target.ownerDocument !== overlay.ownerDocument) {\n const frameElement = target.ownerDocument.defaultView?.frameElement as HTMLElement | null;\n\n if (frameElement) {\n const frameRect = frameElement.getBoundingClientRect();\n\n itemRect.top += frameRect.top;\n itemRect.left += frameRect.left;\n }\n }\n\n const targetRect = ((options.positionFrom === 'target') && itemRect) || overlayRect;\n\n if (!targetRect) {\n return;\n }\n\n // Invisible or removed from DOM element around which we are positioning\n if (options.positionFrom === 'target' && !targetRect.width && !targetRect.height) {\n return;\n }\n\n const [xPos, yPos] = options.position || ['center', 'center'];\n const xGap = xPos.includes('around') ? 7 : 0;\n const yGap = yPos.includes('around') ? 7 : 0;\n\n const { x: offsetX, y: offsetY } = { x: xGap, y: yGap, ...options.positionOffset };\n\n const oppositePosition: Record<ModalPositionAxis, ModalPositionAxis> = {\n start: 'end',\n start_around: 'end_around',\n end: 'start',\n end_around: 'start_around',\n center: 'center',\n };\n\n const positionMapX: Record<ModalPositionAxis, number> = {\n start: targetRect.left + offsetX,\n start_around: targetRect.left - modalRect.width - offsetX,\n end: targetRect.left + targetRect.width - modalRect.width - offsetX,\n end_around: targetRect.left + targetRect.width + offsetX,\n center: targetRect.left + (targetRect.width / 2) - (modalRect.width / 2) + offsetX,\n };\n\n const positionMapY: Record<ModalPositionAxis, number> = {\n start: targetRect.top + offsetY,\n start_around: targetRect.top - modalRect.height - offsetY,\n end: targetRect.top + targetRect.height - modalRect.height - offsetY,\n end_around: targetRect.top + targetRect.height + offsetY,\n center: targetRect.top + (targetRect.height / 2) - (modalRect.height / 2) + offsetY,\n };\n\n left = positionMapX[xPos];\n top = positionMapY[yPos];\n\n // Try to open window from the other side if it doesn't fit\n if (\n (left < 0 && (targetRect.left + modalRect.width + offsetX < docRect.width)) // Overflows left, though it fit on the right\n || ((left + modalRect.width) > docRect.width && targetRect.left > modalRect.width + offsetX) // Cuts off right side of screen, though it fit on the left\n ) {\n left = positionMapX[oppositePosition[xPos]];\n }\n\n if ((top < 0 && targetRect.bottom + modalRect.height + offsetY < docRect.height)\n || (((top + modalRect.height) > docRect.height) && targetRect.top - modalRect.height - offsetY > 0)) {\n top = positionMapY[oppositePosition[yPos]];\n }\n\n // Window cannot overflow beyond screen boundaries\n left = clamp(0, left, docRect.width - modalRect.width);\n top = clamp(options.limit?.top ?? 15, top, docRect.height - modalRect.height);\n\n this.updateStyles({\n position: 'absolute',\n top,\n left,\n });\n }\n\n updateView() {\n // Not implemented in base class\n }\n\n /**\n * Select a tab by ID\n */\n @action\n selectTab(activeTab: string) {\n const previousTabId = this.activeTab;\n\n if (activeTab === previousTabId) {\n return;\n }\n\n const win = this.windowEl;\n\n if (win) {\n win.classList.add(modalStyles.noanimate);\n }\n\n // Update tab options\n this.setTabOptions(activeTab);\n\n // Restore dimensions for new tab\n this.interactions.restoreDimensions();\n\n // Call callback\n this.options.onSelectTab?.(activeTab, this);\n\n // Notify about resize if tab change affects size\n requestAnimationFrame(() => {\n const w = this.windowEl;\n\n if (w) {\n w.classList.remove(modalStyles.noanimate);\n }\n });\n }\n\n /**\n * Toggle responsive mode for the modal\n */\n toggleResponsiveMode(state: string) {\n if (state === this.responsiveMode) {\n return;\n }\n\n const win = this.windowEl;\n\n if (win) {\n win.classList.add(modalStyles.noanimate);\n }\n\n this._setResponsiveMode(state);\n\n this.updateStyles({\n width: this.currentOptions.width,\n height: this.currentOptions.height,\n });\n\n requestAnimationFrame(() => {\n const w = this.windowEl;\n\n if (w) {\n w.classList.remove(modalStyles.noanimate);\n }\n });\n }\n\n /**\n * Set responsive mode for the modal\n */\n protected _setResponsiveMode(state: string) {\n this.responsiveMode = state;\n }\n\n /**\n * Watch for window size changes and fix position if necessary\n */\n initResizeObserver() {\n const onResize = () => {\n if (this.hidden || this.interactions.isDragging || this.interactions.isResizing) {\n return;\n }\n\n const { windowHeight: oldWindowHeight, windowWidth: oldWindowWidth } = this.bounds;\n\n this.updateBounds();\n\n this.applyPosition();\n\n const { windowHeight: newWindowHeight, windowWidth: newWindowWidth } = this.bounds;\n\n if (oldWindowHeight !== newWindowHeight || oldWindowWidth !== newWindowWidth) {\n this.options.onResize?.(this);\n }\n };\n\n // On screen or modal resize\n window.addEventListener('resize', onResize, { signal: this.#eventsAbortController.signal });\n this.#resizeObserver = new ResizeObserver(() => onResize());\n\n if (this.windowEl) {\n this.#resizeObserver.observe(this.windowEl);\n }\n }\n\n /**\n * Hide modal from screen\n */\n @action\n hide({ trigger = true, hideParent = true }: { trigger?: boolean; hideParent?: boolean } = {}) {\n if (this.hidden) {\n return;\n }\n\n this.#saveScrollPosition();\n\n this.hidden = true;\n\n // Hidden from another window, hide it too\n if (hideParent && this.options.fromModal) {\n this.options.fromModal.hide();\n }\n\n document.body.classList.remove('overflow');\n\n if (trigger) {\n this.overlay.dispatchEvent(new CustomEvent('hide'));\n\n this.options.onHide?.(this);\n this.triggerEvent('hide');\n }\n }\n\n /**\n * Show hidden modal\n */\n @action\n show({ trigger = true, showParent = true }: { trigger?: boolean; showParent?: boolean } = {}) {\n // is destroyed\n if (!Modal.list.has(this) || !this.hidden) {\n return;\n }\n\n // Opened from another window, show it too\n if (showParent && this.options.fromModal) {\n this.options.fromModal.show();\n }\n\n this.hidden = false;\n\n // Restore scroll position if it existed\n this.#restoreScrollPosition();\n\n this.focus();\n\n if (trigger) {\n this.overlay.dispatchEvent(new CustomEvent('show'));\n\n this.options.onShow?.(this);\n this.triggerEvent('show');\n }\n }\n\n /**\n * Focus current modal\n */\n focus() {\n if (!this.windowEl) {\n return;\n }\n\n // Something inside this modal is already focused — don't steal it\n if (this.overlay.contains(document.activeElement) && document.activeElement !== this.overlay) {\n return;\n }\n\n if (document.activeElement !== this.overlay) {\n this.#prevActiveElement = document.activeElement as HTMLElement;\n\n this.overlay.focus();\n }\n }\n\n\n /**\n * Shake it\n */\n shake(duration = 300) {\n if (!this.overlay) {\n return;\n }\n\n this.overlay.classList.add('shake');\n\n setTimeout(() => {\n this.overlay.classList.remove('shake');\n }, duration);\n }\n\n /**\n * Make window unactive\n */\n @action\n disable() {\n const win = this.windowEl;\n\n if (win) {\n disableFocusByTab([win]);\n }\n\n this.disabled = true;\n }\n\n /**\n * Make window active\n */\n @action\n enable() {\n const win = this.windowEl;\n\n if (win) {\n enableFocusByTab([win]);\n }\n\n this.disabled = false;\n this.focus();\n }\n\n /**\n * sets the flag that modal is saved\n */\n saved() {\n this.isSaved = true;\n }\n\n /**\n * sets the flag that modal is not saved\n */\n unsaved() {\n this.isSaved = false;\n }\n\n /**\n * Shows loader on the entire editor window\n */\n @action\n setLoader() {\n this.disable();\n\n this.loading = true;\n }\n\n /**\n * Removes loader\n */\n @action\n removeLoader() {\n this.enable();\n\n this.loading = false;\n }\n\n /**\n * Asks before closing a modal with unsaved changes.\n * Override in extended classes for a custom dialog.\n */\n async showConfirm(): Promise<boolean> {\n const { confirmDiscardChanges } = await import('../modals/ConfirmModal');\n\n return confirmDiscardChanges();\n }\n\n /**\n * Close modal and show confirmation when data is not saved\n */\n cancel({ restoreFocus = true }: CloseOptions = {}) {\n const handleClose = () => {\n if (typeof this.options.onCancel === 'function') {\n this.options.onCancel(this);\n }\n\n // Hide modal instead of closing it\n if (this.options.hideOnClose) {\n this.hide();\n }\n // Close modal and destroy instance\n else {\n void this.close(true, { restoreFocus });\n }\n };\n\n // Show confirmation dialog if modal is not saved\n if (!this.isSaved) {\n void this.showConfirm().then((confirmed) => {\n if (confirmed) {\n handleClose();\n }\n });\n\n return false;\n }\n\n // Close modal and destroy instance\n handleClose();\n\n return true;\n }\n\n\n #fixOverflow() {\n const { limits } = this.bounds;\n const { top, left } = this.styles;\n\n let x = left;\n let y = top;\n\n if (y < limits.minTop) {\n y = limits.minTop;\n }\n else if (y > limits.maxTop) {\n y = limits.maxTop;\n }\n\n if (x < limits.minLeft) {\n x = limits.minLeft;\n }\n else if (x > limits.maxLeft) {\n x = limits.maxLeft;\n }\n\n this.updateStyles({\n top: y,\n left: x,\n });\n }\n\n #saveScrollPosition() {\n this.#scrollableEl = Array.from(this.overlay.querySelectorAll('.scrollable-content'));\n\n this.#scrollableEl.forEach((el) => {\n this.#scrollPositions.set(el, {\n top: el.scrollTop || 0,\n left: el.scrollLeft || 0,\n });\n });\n }\n\n #restoreScrollPosition() {\n this.#scrollableEl?.forEach((el) => {\n const position = this.#scrollPositions.get(el);\n\n if (position) {\n el.scrollTo(position.left, position.top);\n }\n });\n }\n\n /**\n * Add a disposer function to be called when modal is closed\n */\n protected addDisposer(disposer: () => void): void {\n this.#disposers.push(disposer);\n }\n\n /**\n * Dispose all registered disposers\n */\n protected disposeAll(): void {\n this.#disposers.forEach(disposer => disposer());\n this.#disposers = [];\n }\n}\n\nexport default Modal;\n"],"names":["_initProto","_init_options","_init_hidden","_init_disabled","_init_loading","_init_activeTab","_init_tabOptions","_init_responsiveMode","_init_contentRevision","_applyDecs","e","r","n","o","a","i","t","c","s","applyDec","u","l","f","p","d","h","m","y","v","g","b","w","S","A","_setFunctionName","P","j","D","E","I","O","k","F","N","_checkInRHS","_toPropertyKey","_toPrimitive","CLOSE_BUTTON_DISTANCE_THRESHOLD","CLICKOUT_CLOSE_DELAY","CLICKOUT_BLOCKING_LAYER_SELECTOR","MODAL_OPEN_DURATION_S","MODAL_CLOSE_DURATION_S","popstated","_Modal","opts","__privateAdd","_Modal_instances","_A","_B","_C","_D","_E","_F","_G","_H","_initialCoords","_scrollableEl","_clickOutInclude","_eventsAbortController","_prevActiveElement","_scrollPositions","_targetWatchInterval","_resizeObserver","_disposers","__privateSet","parent","options","getRandomId","ModalInteractions","runInAction","evaluateValue","__privateMethod","bindEvents_fn","child","modal","modals","name","createOptions","duplicate","reuseExisting","sameIdModal","sameNameModal","__privateGet","tabOptions","responsiveMode","tabOptionsWithAdaptive","adaptiveOptions","activeTab","tabs","tab","activeTabOptions","activeTabDerivedOptions","type","isOverlayStyle","isWindowStyle","target","index","adaptive","mode","data","event","prevWidth","prevHeight","nextOptions","previousOptions","scrollable","fixOverflow_fn","checkTarget","frameElement","element","style","rect","container","root","createRoot","flushSync","React","ModalRoot","overlay","isNew","win","complete","shouldAnimate","animations","animate","popstate","restoreFocus","focusedElement","windowWidth","windowHeight","overlayWidth","overlayHeight","limit","args","allowOverflow","limits","styles","minLeft","maxLeft","minTop","maxTop","top","left","docRect","overlayRect","itemRect","modalRect","optionWidth","optionHeight","frameRect","targetRect","xPos","yPos","xGap","yGap","offsetX","offsetY","oppositePosition","positionMapX","positionMapY","clamp","previousTabId","modalStyles","state","onResize","oldWindowHeight","oldWindowWidth","newWindowHeight","newWindowWidth","trigger","hideParent","saveScrollPosition_fn","showParent","restoreScrollPosition_fn","duration","disableFocusByTab","enableFocusByTab","confirmDiscardChanges","handleClose","confirmed","disposer","windowEl","currentModalIndex","matchesSelector","selector","hasOpenClickoutBlockingLayer","doc","closeButtonSelector","handleCloseButtonPointerDown","pageX","pageY","handleCloseButtonPointerUp","distanceBetween","denyClose","clickTarget","wasLastOnPointerDown","resetClickOutState","handlePointerDown","lastModal","clickStartedInsideWindow","clickStartedOnAnchor","clickStartedInExcludedArea","clickStartedInBlockingLayer","clickStartedWithBlockingLayerOpen","handlePointerUp","closeButton","dropdownIsOpen","contentRevision","targetDoc","x","el","position","observableRef","observable","computed","action","makeObservable","Modal"],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ type SettingsSaveCopy = {
|
|
|
28
28
|
type SettingsSaveVerb = 'save' | 'add' | SettingsSaveCopy;
|
|
29
29
|
interface SettingsSaveContextValue {
|
|
30
30
|
saveRef: RefObject<(() => Promise<boolean>) | null>;
|
|
31
|
+
discardRef: RefObject<(() => void) | null>;
|
|
31
32
|
onDirtyChange: (dirty: boolean) => void;
|
|
32
33
|
setSaveVerb: (verb: SettingsSaveVerb) => void;
|
|
33
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsLayout.d.ts","sourceRoot":"","sources":["../../src/SettingsLayout/SettingsLayout.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SettingsLayout.d.ts","sourceRoot":"","sources":["../../src/SettingsLayout/SettingsLayout.tsx"],"names":[],"mappings":"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"}
|