@gfazioli/mantine-window 1.2.0 → 2.0.0
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/README.md +22 -11
- package/dist/cjs/LayoutIcons.cjs +118 -0
- package/dist/cjs/LayoutIcons.cjs.map +1 -0
- package/dist/cjs/Window.cjs +112 -7
- package/dist/cjs/Window.cjs.map +1 -1
- package/dist/cjs/Window.module.css.cjs +1 -1
- package/dist/cjs/WindowGroup.cjs +195 -0
- package/dist/cjs/WindowGroup.cjs.map +1 -0
- package/dist/cjs/WindowGroup.context.cjs +10 -0
- package/dist/cjs/WindowGroup.context.cjs.map +1 -0
- package/dist/cjs/hooks/use-mantine-window.cjs +181 -36
- package/dist/cjs/hooks/use-mantine-window.cjs.map +1 -1
- package/dist/cjs/hooks/use-responsive-value.cjs +21 -0
- package/dist/cjs/hooks/use-responsive-value.cjs.map +1 -0
- package/dist/cjs/hooks/use-window-state.cjs +142 -64
- package/dist/cjs/hooks/use-window-state.cjs.map +1 -1
- package/dist/cjs/index.cjs +4 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/LayoutIcons.mjs +109 -0
- package/dist/esm/LayoutIcons.mjs.map +1 -0
- package/dist/esm/Window.mjs +113 -8
- package/dist/esm/Window.mjs.map +1 -1
- package/dist/esm/Window.module.css.mjs +1 -1
- package/dist/esm/WindowGroup.context.mjs +7 -0
- package/dist/esm/WindowGroup.context.mjs.map +1 -0
- package/dist/esm/WindowGroup.mjs +193 -0
- package/dist/esm/WindowGroup.mjs.map +1 -0
- package/dist/esm/hooks/use-mantine-window.mjs +183 -38
- package/dist/esm/hooks/use-mantine-window.mjs.map +1 -1
- package/dist/esm/hooks/use-responsive-value.mjs +19 -0
- package/dist/esm/hooks/use-responsive-value.mjs.map +1 -0
- package/dist/esm/hooks/use-window-state.mjs +143 -65
- package/dist/esm/hooks/use-window-state.mjs.map +1 -1
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.layer.css +1 -1
- package/dist/types/LayoutIcons.d.ts +21 -0
- package/dist/types/Window.d.ts +59 -30
- package/dist/types/WindowGroup.context.d.ts +59 -0
- package/dist/types/WindowGroup.d.ts +30 -0
- package/dist/types/hooks/use-mantine-window.d.ts +3 -0
- package/dist/types/hooks/use-responsive-value.d.ts +3 -0
- package/dist/types/hooks/use-window-state.d.ts +17 -5
- package/dist/types/index.d.mts +5 -0
- package/dist/types/index.d.ts +5 -0
- package/package.json +11 -5
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import React, { useRef, useState, useCallback, useEffect, useImperativeHandle } from 'react';
|
|
3
|
+
import { factory, useProps, Box } from '@mantine/core';
|
|
4
|
+
import { useResizeObserver } from '@mantine/hooks';
|
|
5
|
+
import { WindowGroupProvider } from './WindowGroup.context.mjs';
|
|
6
|
+
|
|
7
|
+
const defaultGroupProps = {
|
|
8
|
+
withinPortal: false,
|
|
9
|
+
showToolsButton: true
|
|
10
|
+
};
|
|
11
|
+
const WindowGroup = factory((_props, _ref) => {
|
|
12
|
+
const props = useProps("WindowGroup", defaultGroupProps, _props);
|
|
13
|
+
const {
|
|
14
|
+
id: groupId = "window-group",
|
|
15
|
+
withinPortal = false,
|
|
16
|
+
showToolsButton = true,
|
|
17
|
+
defaultLayout,
|
|
18
|
+
groupRef,
|
|
19
|
+
onLayoutChange,
|
|
20
|
+
children,
|
|
21
|
+
style,
|
|
22
|
+
...others
|
|
23
|
+
} = props;
|
|
24
|
+
const registryRef = useRef(/* @__PURE__ */ new Map());
|
|
25
|
+
const callbacksRef = useRef(/* @__PURE__ */ new Map());
|
|
26
|
+
const [registryVersion, forceUpdate] = useState(0);
|
|
27
|
+
const zIndexMapRef = useRef(/* @__PURE__ */ new Map());
|
|
28
|
+
const zIndexCounterRef = useRef(withinPortal ? 200 : 1);
|
|
29
|
+
const [containerRef, containerRect] = useResizeObserver();
|
|
30
|
+
const containerWidth = containerRect.width || 0;
|
|
31
|
+
const containerHeight = containerRect.height || 0;
|
|
32
|
+
const onLayoutChangeRef = useRef(onLayoutChange);
|
|
33
|
+
onLayoutChangeRef.current = onLayoutChange;
|
|
34
|
+
const registerWindow = useCallback(
|
|
35
|
+
(windowId, state, callbacks) => {
|
|
36
|
+
registryRef.current.set(windowId, state);
|
|
37
|
+
callbacksRef.current.set(windowId, callbacks);
|
|
38
|
+
if (!zIndexMapRef.current.has(windowId)) {
|
|
39
|
+
zIndexCounterRef.current += 1;
|
|
40
|
+
zIndexMapRef.current.set(windowId, zIndexCounterRef.current);
|
|
41
|
+
}
|
|
42
|
+
forceUpdate((n) => n + 1);
|
|
43
|
+
},
|
|
44
|
+
[]
|
|
45
|
+
);
|
|
46
|
+
const unregisterWindow = useCallback((windowId) => {
|
|
47
|
+
registryRef.current.delete(windowId);
|
|
48
|
+
callbacksRef.current.delete(windowId);
|
|
49
|
+
zIndexMapRef.current.delete(windowId);
|
|
50
|
+
forceUpdate((n) => n + 1);
|
|
51
|
+
}, []);
|
|
52
|
+
const updateWindowState = useCallback(
|
|
53
|
+
(windowId, state) => {
|
|
54
|
+
const current = registryRef.current.get(windowId);
|
|
55
|
+
if (current) {
|
|
56
|
+
registryRef.current.set(windowId, { ...current, ...state });
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
[]
|
|
60
|
+
);
|
|
61
|
+
const getZIndex = useCallback(
|
|
62
|
+
(windowId) => {
|
|
63
|
+
return zIndexMapRef.current.get(windowId) ?? (withinPortal ? 200 : 1);
|
|
64
|
+
},
|
|
65
|
+
[withinPortal]
|
|
66
|
+
);
|
|
67
|
+
const bringToFront = useCallback((windowId) => {
|
|
68
|
+
zIndexCounterRef.current += 1;
|
|
69
|
+
zIndexMapRef.current.set(windowId, zIndexCounterRef.current);
|
|
70
|
+
forceUpdate((n) => n + 1);
|
|
71
|
+
}, []);
|
|
72
|
+
const getWindowIds = useCallback(() => {
|
|
73
|
+
return Array.from(registryRef.current.keys());
|
|
74
|
+
}, []);
|
|
75
|
+
const applyLayout = useCallback(
|
|
76
|
+
(layout) => {
|
|
77
|
+
const visibleWindows = Array.from(registryRef.current.entries()).filter(
|
|
78
|
+
([, state]) => state.isVisible && !state.isCollapsed
|
|
79
|
+
);
|
|
80
|
+
if (visibleWindows.length === 0) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const w = containerWidth;
|
|
84
|
+
const h = containerHeight;
|
|
85
|
+
if (w <= 0 || h <= 0) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const gap = 4;
|
|
89
|
+
const positionWindow = (windowId, x, y, width, height) => {
|
|
90
|
+
const cb = callbacksRef.current.get(windowId);
|
|
91
|
+
if (cb) {
|
|
92
|
+
cb.setPosition({ x, y });
|
|
93
|
+
cb.setSize({ width, height });
|
|
94
|
+
}
|
|
95
|
+
updateWindowState(windowId, { x, y, width, height });
|
|
96
|
+
};
|
|
97
|
+
switch (layout) {
|
|
98
|
+
case "arrange-columns": {
|
|
99
|
+
const count = visibleWindows.length;
|
|
100
|
+
const colW = Math.max(0, (w - gap * (count - 1)) / count);
|
|
101
|
+
visibleWindows.forEach(([id], i) => {
|
|
102
|
+
positionWindow(id, i * (colW + gap), 0, colW, h);
|
|
103
|
+
});
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
case "arrange-rows": {
|
|
107
|
+
const count = visibleWindows.length;
|
|
108
|
+
const rowH = Math.max(0, (h - gap * (count - 1)) / count);
|
|
109
|
+
visibleWindows.forEach(([id], i) => {
|
|
110
|
+
positionWindow(id, 0, i * (rowH + gap), w, rowH);
|
|
111
|
+
});
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case "tile": {
|
|
115
|
+
const count = visibleWindows.length;
|
|
116
|
+
const cols = Math.ceil(Math.sqrt(count));
|
|
117
|
+
const rows = Math.ceil(count / cols);
|
|
118
|
+
const cellW = Math.max(0, (w - gap * (cols - 1)) / cols);
|
|
119
|
+
const cellH = Math.max(0, (h - gap * (rows - 1)) / rows);
|
|
120
|
+
visibleWindows.forEach(([id], i) => {
|
|
121
|
+
const col = i % cols;
|
|
122
|
+
const row = Math.floor(i / cols);
|
|
123
|
+
positionWindow(id, col * (cellW + gap), row * (cellH + gap), cellW, cellH);
|
|
124
|
+
});
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
default:
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
onLayoutChangeRef.current?.(layout);
|
|
131
|
+
},
|
|
132
|
+
[containerWidth, containerHeight, updateWindowState]
|
|
133
|
+
);
|
|
134
|
+
const closeAll = useCallback(() => {
|
|
135
|
+
callbacksRef.current.forEach((cb) => cb.setIsVisible(false));
|
|
136
|
+
}, []);
|
|
137
|
+
const collapseAll = useCallback(() => {
|
|
138
|
+
callbacksRef.current.forEach((cb, windowId) => {
|
|
139
|
+
const state = registryRef.current.get(windowId);
|
|
140
|
+
if (state?.collapsable) {
|
|
141
|
+
cb.setIsCollapsed(true);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}, []);
|
|
145
|
+
const expandAll = useCallback(() => {
|
|
146
|
+
callbacksRef.current.forEach((cb, windowId) => {
|
|
147
|
+
const state = registryRef.current.get(windowId);
|
|
148
|
+
if (state?.collapsable) {
|
|
149
|
+
cb.setIsCollapsed(false);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}, []);
|
|
153
|
+
const defaultLayoutAppliedRef = useRef(false);
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
if (!defaultLayout || defaultLayoutAppliedRef.current) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const raf = requestAnimationFrame(() => {
|
|
159
|
+
if (registryRef.current.size > 0 && containerWidth > 0 && containerHeight > 0) {
|
|
160
|
+
applyLayout(defaultLayout);
|
|
161
|
+
defaultLayoutAppliedRef.current = true;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return () => cancelAnimationFrame(raf);
|
|
165
|
+
}, [defaultLayout, applyLayout, containerWidth, containerHeight, registryVersion]);
|
|
166
|
+
const contextValue = {
|
|
167
|
+
groupId,
|
|
168
|
+
withinPortal,
|
|
169
|
+
containerWidth,
|
|
170
|
+
containerHeight,
|
|
171
|
+
registerWindow,
|
|
172
|
+
unregisterWindow,
|
|
173
|
+
updateWindowState,
|
|
174
|
+
getZIndex,
|
|
175
|
+
bringToFront,
|
|
176
|
+
applyLayout,
|
|
177
|
+
closeAll,
|
|
178
|
+
collapseAll,
|
|
179
|
+
expandAll,
|
|
180
|
+
getWindowIds,
|
|
181
|
+
showToolsButton
|
|
182
|
+
};
|
|
183
|
+
useImperativeHandle(groupRef, () => contextValue, [contextValue]);
|
|
184
|
+
const mergedStyle = {
|
|
185
|
+
position: "relative",
|
|
186
|
+
...typeof style === "object" && style || {}
|
|
187
|
+
};
|
|
188
|
+
return /* @__PURE__ */ React.createElement(Box, { ref: containerRef, style: mergedStyle, ...others }, /* @__PURE__ */ React.createElement(WindowGroupProvider, { value: contextValue }, children));
|
|
189
|
+
});
|
|
190
|
+
WindowGroup.displayName = "WindowGroup";
|
|
191
|
+
|
|
192
|
+
export { WindowGroup };
|
|
193
|
+
//# sourceMappingURL=WindowGroup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowGroup.mjs","sources":["../../src/WindowGroup.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { Box, factory, Factory, useProps, type BoxProps } from '@mantine/core';\nimport { useResizeObserver } from '@mantine/hooks';\nimport {\n WindowGroupProvider,\n type WindowCallbacks,\n type WindowGroupContextValue,\n type WindowGroupWindowState,\n type WindowLayout,\n} from './WindowGroup.context';\n\nexport interface WindowGroupProps extends BoxProps {\n /** Unique group identifier */\n id?: string;\n\n /** Whether windows in this group use portal positioning. Default: false */\n withinPortal?: boolean;\n\n /** Whether to show the tools button on windows in this group. Default: true */\n showToolsButton?: boolean;\n\n /** Initial layout to apply after windows have registered. Applied once on mount. */\n defaultLayout?: WindowLayout;\n\n /** Ref to access group API imperatively (applyLayout, closeAll, etc.) */\n groupRef?: React.Ref<WindowGroupContextValue>;\n\n /** Called when a layout is applied */\n onLayoutChange?: (layout: WindowLayout) => void;\n\n /** Children (Window components) */\n children?: React.ReactNode;\n}\n\nexport type WindowGroupStylesNames = 'root';\n\nexport type WindowGroupFactory = Factory<{\n props: WindowGroupProps;\n ref: HTMLDivElement;\n stylesNames: WindowGroupStylesNames;\n}>;\n\nconst defaultGroupProps: Partial<WindowGroupProps> = {\n withinPortal: false,\n showToolsButton: true,\n};\n\nexport const WindowGroup = factory<WindowGroupFactory>((_props, _ref) => {\n const props = useProps('WindowGroup', defaultGroupProps, _props);\n const {\n id: groupId = 'window-group',\n withinPortal = false,\n showToolsButton = true,\n defaultLayout,\n groupRef,\n onLayoutChange,\n children,\n style,\n ...others\n } = props;\n\n // Window registry: state snapshots + callbacks\n const registryRef = useRef<Map<string, WindowGroupWindowState>>(new Map());\n const callbacksRef = useRef<Map<string, WindowCallbacks>>(new Map());\n const [registryVersion, forceUpdate] = useState(0);\n\n // Z-index tracking per group\n const zIndexMapRef = useRef<Map<string, number>>(new Map());\n const zIndexCounterRef = useRef(withinPortal ? 200 : 1);\n\n // Container dimensions for layout calculations\n const [containerRef, containerRect] = useResizeObserver();\n const containerWidth = containerRect.width || 0;\n const containerHeight = containerRect.height || 0;\n\n const onLayoutChangeRef = useRef(onLayoutChange);\n onLayoutChangeRef.current = onLayoutChange;\n\n const registerWindow = useCallback(\n (windowId: string, state: WindowGroupWindowState, callbacks: WindowCallbacks) => {\n registryRef.current.set(windowId, state);\n callbacksRef.current.set(windowId, callbacks);\n if (!zIndexMapRef.current.has(windowId)) {\n zIndexCounterRef.current += 1;\n zIndexMapRef.current.set(windowId, zIndexCounterRef.current);\n }\n forceUpdate((n) => n + 1);\n },\n []\n );\n\n const unregisterWindow = useCallback((windowId: string) => {\n registryRef.current.delete(windowId);\n callbacksRef.current.delete(windowId);\n zIndexMapRef.current.delete(windowId);\n forceUpdate((n) => n + 1);\n }, []);\n\n const updateWindowState = useCallback(\n (windowId: string, state: Partial<WindowGroupWindowState>) => {\n const current = registryRef.current.get(windowId);\n if (current) {\n registryRef.current.set(windowId, { ...current, ...state });\n }\n },\n []\n );\n\n const getZIndex = useCallback(\n (windowId: string) => {\n return zIndexMapRef.current.get(windowId) ?? (withinPortal ? 200 : 1);\n },\n [withinPortal]\n );\n\n const bringToFront = useCallback((windowId: string) => {\n zIndexCounterRef.current += 1;\n zIndexMapRef.current.set(windowId, zIndexCounterRef.current);\n forceUpdate((n) => n + 1);\n }, []);\n\n const getWindowIds = useCallback(() => {\n return Array.from(registryRef.current.keys());\n }, []);\n\n // ─── Layout presets — call Window callbacks directly ──────────────\n\n const applyLayout = useCallback(\n (layout: WindowLayout) => {\n const visibleWindows = Array.from(registryRef.current.entries()).filter(\n ([, state]) => state.isVisible && !state.isCollapsed\n );\n\n if (visibleWindows.length === 0) {\n return;\n }\n\n const w = containerWidth;\n const h = containerHeight;\n\n if (w <= 0 || h <= 0) {\n return;\n }\n\n const gap = 4;\n\n const positionWindow = (\n windowId: string,\n x: number,\n y: number,\n width: number,\n height: number\n ) => {\n const cb = callbacksRef.current.get(windowId);\n if (cb) {\n cb.setPosition({ x, y });\n cb.setSize({ width, height });\n }\n updateWindowState(windowId, { x, y, width, height });\n };\n\n // Group layouts only — single-window layouts are handled by the Window itself\n switch (layout) {\n case 'arrange-columns': {\n const count = visibleWindows.length;\n const colW = Math.max(0, (w - gap * (count - 1)) / count);\n visibleWindows.forEach(([id], i) => {\n positionWindow(id, i * (colW + gap), 0, colW, h);\n });\n break;\n }\n case 'arrange-rows': {\n const count = visibleWindows.length;\n const rowH = Math.max(0, (h - gap * (count - 1)) / count);\n visibleWindows.forEach(([id], i) => {\n positionWindow(id, 0, i * (rowH + gap), w, rowH);\n });\n break;\n }\n case 'tile': {\n const count = visibleWindows.length;\n const cols = Math.ceil(Math.sqrt(count));\n const rows = Math.ceil(count / cols);\n const cellW = Math.max(0, (w - gap * (cols - 1)) / cols);\n const cellH = Math.max(0, (h - gap * (rows - 1)) / rows);\n visibleWindows.forEach(([id], i) => {\n const col = i % cols;\n const row = Math.floor(i / cols);\n positionWindow(id, col * (cellW + gap), row * (cellH + gap), cellW, cellH);\n });\n break;\n }\n default:\n // Single-window layouts (snap-left, etc.) are not handled by the Group\n return;\n }\n onLayoutChangeRef.current?.(layout);\n },\n [containerWidth, containerHeight, updateWindowState]\n );\n\n // ─── Global actions — call Window callbacks directly ──────────────\n\n const closeAll = useCallback(() => {\n callbacksRef.current.forEach((cb) => cb.setIsVisible(false));\n }, []);\n\n const collapseAll = useCallback(() => {\n callbacksRef.current.forEach((cb, windowId) => {\n const state = registryRef.current.get(windowId);\n if (state?.collapsable) {\n cb.setIsCollapsed(true);\n }\n });\n }, []);\n\n const expandAll = useCallback(() => {\n callbacksRef.current.forEach((cb, windowId) => {\n const state = registryRef.current.get(windowId);\n if (state?.collapsable) {\n cb.setIsCollapsed(false);\n }\n });\n }, []);\n\n // ─── Apply default layout after windows register ───────────────────\n\n const defaultLayoutAppliedRef = useRef(false);\n\n useEffect(() => {\n if (!defaultLayout || defaultLayoutAppliedRef.current) {\n return;\n }\n\n // Wait for windows to register and container to be measured\n const raf = requestAnimationFrame(() => {\n if (registryRef.current.size > 0 && containerWidth > 0 && containerHeight > 0) {\n applyLayout(defaultLayout);\n defaultLayoutAppliedRef.current = true;\n }\n });\n\n return () => cancelAnimationFrame(raf);\n }, [defaultLayout, applyLayout, containerWidth, containerHeight, registryVersion]);\n\n // ─── Context value ──────────────────────────────────────────────────\n\n const contextValue: WindowGroupContextValue = {\n groupId,\n withinPortal,\n containerWidth,\n containerHeight,\n registerWindow,\n unregisterWindow,\n updateWindowState,\n getZIndex,\n bringToFront,\n applyLayout,\n closeAll,\n collapseAll,\n expandAll,\n getWindowIds,\n showToolsButton,\n };\n\n // Expose group API via groupRef for external control\n useImperativeHandle(groupRef, () => contextValue, [contextValue]);\n\n const mergedStyle = {\n position: 'relative' as const,\n ...((typeof style === 'object' && style) || {}),\n };\n\n return (\n <Box ref={containerRef} style={mergedStyle} {...others}>\n <WindowGroupProvider value={contextValue}>{children}</WindowGroupProvider>\n </Box>\n );\n});\n\nWindowGroup.displayName = 'WindowGroup';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { useRef, useEffect } from 'react';
|
|
3
|
-
import {
|
|
2
|
+
import { useRef, useEffect, useCallback } from 'react';
|
|
3
|
+
import { useMergedRef } from '@mantine/hooks';
|
|
4
|
+
import { useWindowGroupContext } from '../WindowGroup.context.mjs';
|
|
5
|
+
import { useResponsiveValue } from './use-responsive-value.mjs';
|
|
4
6
|
import { useWindowConstraints } from './use-window-constraints.mjs';
|
|
5
7
|
import { useWindowDimensions } from './use-window-dimensions.mjs';
|
|
6
8
|
import { useWindowDrag } from './use-window-drag.mjs';
|
|
@@ -11,34 +13,119 @@ function useMantineWindow(props) {
|
|
|
11
13
|
const {
|
|
12
14
|
title,
|
|
13
15
|
collapsed,
|
|
16
|
+
collapsable,
|
|
14
17
|
opened,
|
|
15
18
|
onClose,
|
|
16
19
|
id,
|
|
17
20
|
persistState,
|
|
18
|
-
withinPortal,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
withinPortal: withinPortalProp,
|
|
22
|
+
// Controlled position/size
|
|
23
|
+
x: xProp,
|
|
24
|
+
y: yProp,
|
|
25
|
+
width: widthProp,
|
|
26
|
+
height: heightProp,
|
|
27
|
+
// Uncontrolled defaults
|
|
28
|
+
defaultX: defaultXProp,
|
|
29
|
+
defaultY: defaultYProp,
|
|
30
|
+
defaultWidth: defaultWidthProp,
|
|
31
|
+
defaultHeight: defaultHeightProp,
|
|
32
|
+
// Constraints
|
|
33
|
+
minWidth: minWidthProp,
|
|
34
|
+
minHeight: minHeightProp,
|
|
35
|
+
maxWidth: maxWidthProp,
|
|
36
|
+
maxHeight: maxHeightProp,
|
|
37
|
+
dragBounds: dragBoundsProp,
|
|
26
38
|
onPositionChange,
|
|
27
39
|
onSizeChange
|
|
28
40
|
} = props;
|
|
41
|
+
const groupCtx = useWindowGroupContext();
|
|
42
|
+
const isInGroup = groupCtx != null;
|
|
43
|
+
const windowId = id || title || "window";
|
|
44
|
+
const withinPortal = isInGroup ? groupCtx.withinPortal : withinPortalProp;
|
|
45
|
+
const resolvedX = useResponsiveValue(xProp, void 0);
|
|
46
|
+
const resolvedY = useResponsiveValue(yProp, void 0);
|
|
47
|
+
const resolvedWidth = useResponsiveValue(widthProp, void 0);
|
|
48
|
+
const resolvedHeight = useResponsiveValue(heightProp, void 0);
|
|
49
|
+
const resolvedDefaultX = useResponsiveValue(defaultXProp, 20);
|
|
50
|
+
const resolvedDefaultY = useResponsiveValue(defaultYProp, 100);
|
|
51
|
+
const resolvedDefaultWidth = useResponsiveValue(defaultWidthProp, 400);
|
|
52
|
+
const resolvedDefaultHeight = useResponsiveValue(defaultHeightProp, 400);
|
|
53
|
+
const resolvedMinWidth = useResponsiveValue(minWidthProp, 250);
|
|
54
|
+
const resolvedMinHeight = useResponsiveValue(minHeightProp, 100);
|
|
55
|
+
const resolvedMaxWidth = useResponsiveValue(maxWidthProp, void 0);
|
|
56
|
+
const resolvedMaxHeight = useResponsiveValue(maxHeightProp, void 0);
|
|
57
|
+
const resolvedDragBounds = useResponsiveValue(
|
|
58
|
+
dragBoundsProp,
|
|
59
|
+
void 0
|
|
60
|
+
);
|
|
29
61
|
const state = useWindowState({
|
|
30
62
|
id,
|
|
31
63
|
title,
|
|
32
64
|
opened,
|
|
33
65
|
collapsed,
|
|
34
66
|
persistState,
|
|
35
|
-
|
|
36
|
-
|
|
67
|
+
withinPortal,
|
|
68
|
+
// Controlled values (undefined = uncontrolled)
|
|
69
|
+
x: resolvedX,
|
|
70
|
+
y: resolvedY,
|
|
71
|
+
width: resolvedWidth,
|
|
72
|
+
height: resolvedHeight,
|
|
73
|
+
// Uncontrolled defaults
|
|
74
|
+
defaultX: resolvedDefaultX,
|
|
75
|
+
defaultY: resolvedDefaultY,
|
|
76
|
+
defaultWidth: resolvedDefaultWidth,
|
|
77
|
+
defaultHeight: resolvedDefaultHeight,
|
|
37
78
|
onClose,
|
|
38
79
|
onPositionChange,
|
|
39
80
|
onSizeChange
|
|
40
81
|
});
|
|
41
82
|
const windowRef = useRef(null);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (isInGroup) {
|
|
85
|
+
groupCtx.registerWindow(
|
|
86
|
+
windowId,
|
|
87
|
+
{
|
|
88
|
+
id: windowId,
|
|
89
|
+
x: 0,
|
|
90
|
+
y: 0,
|
|
91
|
+
width: 0,
|
|
92
|
+
height: 0,
|
|
93
|
+
isVisible: state.isVisible,
|
|
94
|
+
isCollapsed: state.isCollapsed,
|
|
95
|
+
collapsable: collapsable !== false
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
setPosition: state.setPosition,
|
|
99
|
+
setSize: state.setSize,
|
|
100
|
+
setIsCollapsed: (v) => state.setIsCollapsed(v),
|
|
101
|
+
setIsVisible: (v) => state.setIsVisible(v)
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
return () => groupCtx.unregisterWindow(windowId);
|
|
105
|
+
}
|
|
106
|
+
return void 0;
|
|
107
|
+
}, [isInGroup, windowId]);
|
|
108
|
+
const groupBringToFront = useCallback(() => {
|
|
109
|
+
if (isInGroup) {
|
|
110
|
+
groupCtx.bringToFront(windowId);
|
|
111
|
+
} else {
|
|
112
|
+
state.bringToFront();
|
|
113
|
+
}
|
|
114
|
+
}, [isInGroup, groupCtx, windowId, state.bringToFront]);
|
|
115
|
+
const zIndex = isInGroup ? groupCtx.getZIndex(windowId) : state.zIndex;
|
|
116
|
+
const prevStateRef = useRef({ isVisible: state.isVisible, isCollapsed: state.isCollapsed });
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
if (isInGroup) {
|
|
119
|
+
const changed = prevStateRef.current.isVisible !== state.isVisible || prevStateRef.current.isCollapsed !== state.isCollapsed;
|
|
120
|
+
if (changed) {
|
|
121
|
+
groupCtx.updateWindowState(windowId, {
|
|
122
|
+
isVisible: state.isVisible,
|
|
123
|
+
isCollapsed: state.isCollapsed
|
|
124
|
+
});
|
|
125
|
+
prevStateRef.current = { isVisible: state.isVisible, isCollapsed: state.isCollapsed };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}, [isInGroup, groupCtx, windowId, state.isVisible, state.isCollapsed]);
|
|
42
129
|
const dimensions = useWindowDimensions({
|
|
43
130
|
withinPortal,
|
|
44
131
|
isVisible: state.isVisible,
|
|
@@ -47,11 +134,11 @@ function useMantineWindow(props) {
|
|
|
47
134
|
const constraints = useWindowConstraints({
|
|
48
135
|
position: state.position,
|
|
49
136
|
size: state.size,
|
|
50
|
-
minWidth,
|
|
51
|
-
maxWidth,
|
|
52
|
-
minHeight,
|
|
53
|
-
maxHeight,
|
|
54
|
-
dragBounds,
|
|
137
|
+
minWidth: resolvedMinWidth,
|
|
138
|
+
maxWidth: resolvedMaxWidth,
|
|
139
|
+
minHeight: resolvedMinHeight,
|
|
140
|
+
maxHeight: resolvedMaxHeight,
|
|
141
|
+
dragBounds: resolvedDragBounds,
|
|
55
142
|
withinPortal,
|
|
56
143
|
isMounted: dimensions.isMounted,
|
|
57
144
|
viewportWidth: dimensions.viewportDimensions.width,
|
|
@@ -59,6 +146,56 @@ function useMantineWindow(props) {
|
|
|
59
146
|
containerWidth: dimensions.containerDimensions.width,
|
|
60
147
|
containerHeight: dimensions.containerDimensions.height
|
|
61
148
|
});
|
|
149
|
+
const applySingleLayout = useCallback(
|
|
150
|
+
(layout) => {
|
|
151
|
+
const refW = isInGroup ? groupCtx.containerWidth : withinPortal ? dimensions.viewportDimensions.width : dimensions.containerDimensions.width;
|
|
152
|
+
const refH = isInGroup ? groupCtx.containerHeight : withinPortal ? dimensions.viewportDimensions.height : dimensions.containerDimensions.height;
|
|
153
|
+
if (refW === 0 || refH === 0) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
switch (layout) {
|
|
157
|
+
case "snap-left":
|
|
158
|
+
state.setPosition({ x: 0, y: 0 });
|
|
159
|
+
state.setSize({ width: refW / 2, height: refH });
|
|
160
|
+
break;
|
|
161
|
+
case "snap-right":
|
|
162
|
+
state.setPosition({ x: refW / 2, y: 0 });
|
|
163
|
+
state.setSize({ width: refW / 2, height: refH });
|
|
164
|
+
break;
|
|
165
|
+
case "snap-top":
|
|
166
|
+
state.setPosition({ x: 0, y: 0 });
|
|
167
|
+
state.setSize({ width: refW, height: refH / 2 });
|
|
168
|
+
break;
|
|
169
|
+
case "snap-bottom":
|
|
170
|
+
state.setPosition({ x: 0, y: refH / 2 });
|
|
171
|
+
state.setSize({ width: refW, height: refH / 2 });
|
|
172
|
+
break;
|
|
173
|
+
case "fill":
|
|
174
|
+
state.setPosition({ x: 0, y: 0 });
|
|
175
|
+
state.setSize({ width: refW, height: refH });
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
[isInGroup, groupCtx, withinPortal, dimensions, state.setPosition, state.setSize]
|
|
180
|
+
);
|
|
181
|
+
useEffect(() => {
|
|
182
|
+
if (isInGroup) {
|
|
183
|
+
groupCtx.updateWindowState(windowId, {
|
|
184
|
+
x: constraints.positionPx.x,
|
|
185
|
+
y: constraints.positionPx.y,
|
|
186
|
+
width: constraints.sizePx.width,
|
|
187
|
+
height: constraints.sizePx.height
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}, [
|
|
191
|
+
isInGroup,
|
|
192
|
+
groupCtx,
|
|
193
|
+
windowId,
|
|
194
|
+
constraints.positionPx.x,
|
|
195
|
+
constraints.positionPx.y,
|
|
196
|
+
constraints.sizePx.width,
|
|
197
|
+
constraints.sizePx.height
|
|
198
|
+
]);
|
|
62
199
|
const drag = useWindowDrag({
|
|
63
200
|
positionPx: constraints.positionPx,
|
|
64
201
|
sizePx: constraints.sizePx,
|
|
@@ -71,7 +208,7 @@ function useMantineWindow(props) {
|
|
|
71
208
|
isCollapsed: state.isCollapsed,
|
|
72
209
|
windowRef,
|
|
73
210
|
setPosition: state.setPosition,
|
|
74
|
-
bringToFront:
|
|
211
|
+
bringToFront: groupBringToFront
|
|
75
212
|
});
|
|
76
213
|
const resize = useWindowResize({
|
|
77
214
|
positionPx: constraints.positionPx,
|
|
@@ -79,39 +216,42 @@ function useMantineWindow(props) {
|
|
|
79
216
|
constraintsPx: constraints.constraintsPx,
|
|
80
217
|
setPosition: state.setPosition,
|
|
81
218
|
setSize: state.setSize,
|
|
82
|
-
bringToFront:
|
|
219
|
+
bringToFront: groupBringToFront
|
|
83
220
|
});
|
|
84
|
-
const
|
|
85
|
-
const
|
|
221
|
+
const mergedRef = useMergedRef(windowRef);
|
|
222
|
+
const dragRef = useRef(drag);
|
|
223
|
+
dragRef.current = drag;
|
|
224
|
+
const resizeRef = useRef(resize);
|
|
225
|
+
resizeRef.current = resize;
|
|
86
226
|
useEffect(() => {
|
|
87
227
|
const handleMouseMove = (e) => {
|
|
88
|
-
|
|
89
|
-
if (
|
|
90
|
-
|
|
228
|
+
dragRef.current.handleDragMove(e.clientX, e.clientY);
|
|
229
|
+
if (resizeRef.current.isResizing.current) {
|
|
230
|
+
resizeRef.current.handleResize(e.clientX, e.clientY);
|
|
91
231
|
}
|
|
92
232
|
};
|
|
93
233
|
const handleTouchMove = (e) => {
|
|
94
|
-
if (
|
|
234
|
+
if (dragRef.current.isDragging.current || resizeRef.current.isResizing.current) {
|
|
95
235
|
const touch = e.touches[0];
|
|
96
|
-
|
|
97
|
-
if (
|
|
98
|
-
|
|
236
|
+
dragRef.current.handleDragMove(touch.clientX, touch.clientY);
|
|
237
|
+
if (resizeRef.current.isResizing.current) {
|
|
238
|
+
resizeRef.current.handleResize(touch.clientX, touch.clientY);
|
|
99
239
|
}
|
|
100
240
|
e.preventDefault();
|
|
101
241
|
}
|
|
102
242
|
};
|
|
103
243
|
const handleMouseUp = () => {
|
|
104
|
-
if (
|
|
105
|
-
|
|
106
|
-
|
|
244
|
+
if (dragRef.current.isDragging.current || resizeRef.current.isResizing.current) {
|
|
245
|
+
dragRef.current.handleDragEnd();
|
|
246
|
+
resizeRef.current.handleResizeEnd();
|
|
107
247
|
document.body.style.userSelect = "";
|
|
108
248
|
document.body.style.cursor = "";
|
|
109
249
|
}
|
|
110
250
|
};
|
|
111
251
|
const handleTouchEnd = () => {
|
|
112
|
-
if (
|
|
113
|
-
|
|
114
|
-
|
|
252
|
+
if (dragRef.current.isDragging.current || resizeRef.current.isResizing.current) {
|
|
253
|
+
dragRef.current.handleDragEnd();
|
|
254
|
+
resizeRef.current.handleResizeEnd();
|
|
115
255
|
document.body.style.userSelect = "";
|
|
116
256
|
document.body.style.cursor = "";
|
|
117
257
|
}
|
|
@@ -124,19 +264,22 @@ function useMantineWindow(props) {
|
|
|
124
264
|
return () => {
|
|
125
265
|
document.removeEventListener("mousemove", handleMouseMove);
|
|
126
266
|
document.removeEventListener("mouseup", handleMouseUp);
|
|
127
|
-
document.removeEventListener("touchmove", handleTouchMove
|
|
267
|
+
document.removeEventListener("touchmove", handleTouchMove, {
|
|
268
|
+
passive: false
|
|
269
|
+
});
|
|
128
270
|
document.removeEventListener("touchend", handleTouchEnd);
|
|
129
271
|
document.removeEventListener("touchcancel", handleTouchEnd);
|
|
130
272
|
document.body.style.userSelect = "";
|
|
131
273
|
document.body.style.cursor = "";
|
|
132
274
|
};
|
|
133
|
-
}, [
|
|
275
|
+
}, []);
|
|
134
276
|
return {
|
|
135
277
|
isCollapsed: state.isCollapsed,
|
|
136
278
|
setIsCollapsed: state.setIsCollapsed,
|
|
137
279
|
isVisible: state.isVisible,
|
|
138
280
|
setIsVisible: state.setIsVisible,
|
|
139
|
-
zIndex
|
|
281
|
+
zIndex,
|
|
282
|
+
withinPortal,
|
|
140
283
|
position: constraints.positionPx,
|
|
141
284
|
size: constraints.sizePx,
|
|
142
285
|
windowRef: mergedRef,
|
|
@@ -144,7 +287,9 @@ function useMantineWindow(props) {
|
|
|
144
287
|
handleTouchStartDrag: drag.handleTouchStartDrag,
|
|
145
288
|
resizeHandlers: resize.resizeHandlers,
|
|
146
289
|
handleClose: state.handleClose,
|
|
147
|
-
bringToFront:
|
|
290
|
+
bringToFront: groupBringToFront,
|
|
291
|
+
applySingleLayout,
|
|
292
|
+
groupCtx: isInGroup ? groupCtx : void 0
|
|
148
293
|
};
|
|
149
294
|
}
|
|
150
295
|
|