@akinon/pz-theme 2.0.58-rc.0 → 2.0.58
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/CHANGELOG.md +11 -31
- package/package.json +4 -4
- package/src/blocks/button-block.tsx +23 -1
- package/src/blocks/link-block.tsx +21 -10
- package/src/blocks/panel-block.tsx +67 -237
- package/src/chrome/__tests__/theme-config-source.test.ts +53 -7
- package/src/chrome/placeholder-slugs.ts +41 -0
- package/src/chrome/theme-config-source.ts +17 -2
- package/src/components/with-designer-features.tsx +49 -2
- package/src/hooks/use-block-action.ts +209 -0
- package/src/index.ts +51 -1
- package/src/overlays/__tests__/modal-preview-host.test.tsx +316 -0
- package/src/overlays/__tests__/modal-registry.test.ts +205 -0
- package/src/overlays/__tests__/modal-triggers.test.tsx +272 -0
- package/src/overlays/__tests__/overlay-bus.test.tsx +197 -0
- package/src/overlays/__tests__/theme-modal-mount.test.tsx +234 -0
- package/src/overlays/modal-dom-bridge.ts +104 -0
- package/src/overlays/modal-frequency.ts +104 -0
- package/src/overlays/modal-host-beacon.tsx +35 -0
- package/src/overlays/modal-preview-host.tsx +159 -0
- package/src/overlays/modal-registry.ts +289 -0
- package/src/overlays/overlay-bus.ts +214 -0
- package/src/overlays/overlay-surface.tsx +386 -0
- package/src/overlays/theme-modal-mount.tsx +179 -0
- package/src/overlays/theme-modals.tsx +82 -0
- package/src/overlays/use-editor-modals.ts +109 -0
- package/src/overlays/use-modal-auto-trigger.ts +187 -0
- package/src/overlays/use-modal-preview.ts +127 -0
- package/src/overlays/use-overlay-breakpoint.ts +68 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import { parseEditorMessage } from '../editor-bridge';
|
|
6
|
+
import { breakpointForWidth } from '../utils/breakpoints';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Which breakpoint the surrounding page is at.
|
|
10
|
+
*
|
|
11
|
+
* `ThemePlaceholderWrapper` already tracks this for the sections it renders,
|
|
12
|
+
* but a modal host is not inside a placeholder — it is mounted once in the
|
|
13
|
+
* brand's layout — so it cannot read that state and needs its own copy of the
|
|
14
|
+
* same rule.
|
|
15
|
+
*
|
|
16
|
+
* Two sources, exactly as the wrapper has: the viewport on a live storefront,
|
|
17
|
+
* and the editor's forced breakpoint in the canvas. Inside the iframe the
|
|
18
|
+
* viewport is the iframe's, not the device the designer picked, so the message
|
|
19
|
+
* wins there and the resize listener is not installed at all.
|
|
20
|
+
*/
|
|
21
|
+
export const useOverlayBreakpoint = (): string => {
|
|
22
|
+
const [breakpoint, setBreakpoint] = useState<string>('desktop');
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (typeof window === 'undefined') return undefined;
|
|
26
|
+
|
|
27
|
+
const inIframe = (() => {
|
|
28
|
+
try {
|
|
29
|
+
return window.self !== window.top;
|
|
30
|
+
} catch {
|
|
31
|
+
// Cross-origin parent: the access threw, which itself means embedded.
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
})();
|
|
35
|
+
|
|
36
|
+
if (inIframe) {
|
|
37
|
+
const handleMessage = (event: MessageEvent) => {
|
|
38
|
+
const message = parseEditorMessage(event);
|
|
39
|
+
if (message?.type !== 'CHANGE_BREAKPOINT') return;
|
|
40
|
+
|
|
41
|
+
const next = (message.data as { breakpoint?: string })?.breakpoint;
|
|
42
|
+
if (next) setBreakpoint(next);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
window.addEventListener('message', handleMessage);
|
|
46
|
+
|
|
47
|
+
return () => window.removeEventListener('message', handleMessage);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const read = () => setBreakpoint(breakpointForWidth(window.innerWidth));
|
|
51
|
+
|
|
52
|
+
let timeoutId: ReturnType<typeof setTimeout>;
|
|
53
|
+
const handleResize = () => {
|
|
54
|
+
clearTimeout(timeoutId);
|
|
55
|
+
timeoutId = setTimeout(read, 200);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
read();
|
|
59
|
+
window.addEventListener('resize', handleResize);
|
|
60
|
+
|
|
61
|
+
return () => {
|
|
62
|
+
window.removeEventListener('resize', handleResize);
|
|
63
|
+
clearTimeout(timeoutId);
|
|
64
|
+
};
|
|
65
|
+
}, []);
|
|
66
|
+
|
|
67
|
+
return breakpoint;
|
|
68
|
+
};
|