zuljaman-banner-components 1.0.22 → 1.0.24
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 +228 -131
- package/dist/components/BannerRenderer/BannerRenderer.d.ts +8 -0
- package/dist/components/BannerRenderer/BannerRenderer.d.ts.map +1 -0
- package/dist/components/BannerRenderer/BannerRenderer.js +325 -0
- package/dist/components/BannerRenderer/components/CopyElement.d.ts +62 -0
- package/dist/components/BannerRenderer/components/CopyElement.d.ts.map +1 -0
- package/dist/components/BannerRenderer/components/CopyElement.js +220 -0
- package/dist/components/BannerRenderer/components/InteractiveLines.d.ts +26 -0
- package/dist/components/BannerRenderer/components/InteractiveLines.d.ts.map +1 -0
- package/dist/components/BannerRenderer/components/InteractiveLines.js +172 -0
- package/dist/components/BannerRenderer/components/LogoElement.d.ts +55 -0
- package/dist/components/BannerRenderer/components/LogoElement.d.ts.map +1 -0
- package/dist/components/BannerRenderer/components/LogoElement.js +53 -0
- package/dist/components/BannerRenderer/components/VisualGuides.d.ts +43 -0
- package/dist/components/BannerRenderer/components/VisualGuides.d.ts.map +1 -0
- package/dist/components/BannerRenderer/components/VisualGuides.js +110 -0
- package/dist/components/BannerRenderer/components/index.d.ts +12 -0
- package/dist/components/BannerRenderer/components/index.d.ts.map +1 -0
- package/dist/components/BannerRenderer/components/index.js +14 -0
- package/dist/components/BannerRenderer/constants.d.ts +15 -0
- package/dist/components/BannerRenderer/constants.d.ts.map +1 -0
- package/dist/components/BannerRenderer/constants.js +36 -0
- package/dist/components/BannerRenderer/hooks/index.d.ts +14 -0
- package/dist/components/BannerRenderer/hooks/index.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/index.js +16 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.d.ts +30 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.js +87 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.d.ts +13 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.js +21 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.d.ts +71 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.js +151 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.d.ts +66 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.js +332 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.d.ts +61 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.js +180 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.d.ts +60 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.js +178 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning.d.ts +8 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useAutoPositioning.js +12 -0
- package/dist/components/BannerRenderer/hooks/useDragSnap.d.ts +30 -0
- package/dist/components/BannerRenderer/hooks/useDragSnap.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useDragSnap.js +90 -0
- package/dist/components/BannerRenderer/hooks/useElementRefs.d.ts +22 -0
- package/dist/components/BannerRenderer/hooks/useElementRefs.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useElementRefs.js +70 -0
- package/dist/components/BannerRenderer/hooks/useLineDrawing.d.ts +40 -0
- package/dist/components/BannerRenderer/hooks/useLineDrawing.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useLineDrawing.js +198 -0
- package/dist/components/BannerRenderer/hooks/useProximityDetection.d.ts +43 -0
- package/dist/components/BannerRenderer/hooks/useProximityDetection.d.ts.map +1 -0
- package/dist/components/BannerRenderer/hooks/useProximityDetection.js +491 -0
- package/dist/components/BannerRenderer/index.d.ts +6 -0
- package/dist/components/BannerRenderer/index.d.ts.map +1 -0
- package/dist/components/BannerRenderer/index.js +8 -0
- package/dist/components/{BannerRenderer.d.ts → BannerRenderer/types.d.ts} +29 -8
- package/dist/components/BannerRenderer/types.d.ts.map +1 -0
- package/dist/components/BannerRenderer/types.js +5 -0
- package/dist/components/BannerRenderer/utils/alignmentUtils.d.ts +38 -0
- package/dist/components/BannerRenderer/utils/alignmentUtils.d.ts.map +1 -0
- package/dist/components/BannerRenderer/utils/alignmentUtils.js +138 -0
- package/dist/components/BannerRenderer/utils/elementCheckUtils.d.ts +22 -0
- package/dist/components/BannerRenderer/utils/elementCheckUtils.d.ts.map +1 -0
- package/dist/components/BannerRenderer/utils/elementCheckUtils.js +37 -0
- package/dist/components/BannerRenderer/utils/elementIdUtils.d.ts +25 -0
- package/dist/components/BannerRenderer/utils/elementIdUtils.d.ts.map +1 -0
- package/dist/components/BannerRenderer/utils/elementIdUtils.js +56 -0
- package/dist/components/BannerRenderer/utils/fontUtils.d.ts +12 -0
- package/dist/components/BannerRenderer/utils/fontUtils.d.ts.map +1 -0
- package/dist/components/BannerRenderer/utils/fontUtils.js +26 -0
- package/dist/components/BannerRenderer/utils/graphUtils.d.ts +54 -0
- package/dist/components/BannerRenderer/utils/graphUtils.d.ts.map +1 -0
- package/dist/components/BannerRenderer/utils/graphUtils.js +138 -0
- package/dist/components/BannerRenderer/utils/index.d.ts +12 -0
- package/dist/components/BannerRenderer/utils/index.d.ts.map +1 -0
- package/dist/components/BannerRenderer/utils/index.js +27 -0
- package/dist/components/BannerRenderer/utils/snapUtils.d.ts +38 -0
- package/dist/components/BannerRenderer/utils/snapUtils.d.ts.map +1 -0
- package/dist/components/BannerRenderer/utils/snapUtils.js +109 -0
- package/dist/components/BannerVisor.d.ts.map +1 -1
- package/dist/components/BannerVisor.js +8 -1
- package/dist/components/index.js +1 -1
- package/dist/components/shared/DraggableElement.d.ts +11 -0
- package/dist/components/shared/DraggableElement.d.ts.map +1 -1
- package/dist/components/shared/DraggableElement.js +51 -51
- package/dist/components/styles/Style1/substyleConfig.d.ts.map +1 -1
- package/dist/components/styles/Style1/substyleConfig.js +53 -54
- package/dist/components/styles/Style2/substyleConfig.js +78 -78
- package/dist/components/styles/Style3/substyleConfig.d.ts.map +1 -1
- package/dist/components/styles/Style3/substyleConfig.js +40 -37
- package/dist/components/styles/Style4/substyleConfig.js +57 -57
- package/dist/components/styles/types/substyleTypes.d.ts +32 -15
- package/dist/components/styles/types/substyleTypes.d.ts.map +1 -1
- package/dist/components/styles/utils/chainValidation.d.ts +41 -0
- package/dist/components/styles/utils/chainValidation.d.ts.map +1 -0
- package/dist/components/styles/utils/chainValidation.js +148 -0
- package/dist/components/styles/utils/positioningUtils.d.ts +207 -11
- package/dist/components/styles/utils/positioningUtils.d.ts.map +1 -1
- package/dist/components/styles/utils/positioningUtils.js +520 -19
- package/dist/constants/characterLimits.d.ts +4 -16
- package/dist/constants/characterLimits.d.ts.map +1 -1
- package/dist/constants/characterLimits.js +28 -26
- package/dist/constants/styleConfigs.js +6 -6
- package/dist/styleConfig.d.ts +4 -4
- package/dist/styleConfig.d.ts.map +1 -1
- package/dist/styleConfig.js +8 -16
- package/dist/types.d.ts +42 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/components/BannerRenderer.d.ts.map +0 -1
- package/dist/components/BannerRenderer.js +0 -559
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* debugPositions - Extracts and calculates auto-positioning configuration from completed lines
|
|
4
|
+
*
|
|
5
|
+
* This function analyzes the completed proximity lines and generates an AutoPositioningConfig
|
|
6
|
+
* that can be saved and reused to recreate the same positioning in other contexts.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createDebugPositions = createDebugPositions;
|
|
10
|
+
const positioningUtils_1 = require("../../../styles/utils/positioningUtils");
|
|
11
|
+
/**
|
|
12
|
+
* Creates the debugPositions function with the given parameters
|
|
13
|
+
* Returns a function that can be called to generate the auto-positioning config
|
|
14
|
+
*/
|
|
15
|
+
function createDebugPositions(params) {
|
|
16
|
+
const { completedLines, copies, logoTranslateX, logoTranslateY, logoWidth, config, sizeMultiplier, logoRef, copyRefs, bannerContainerRef, } = params;
|
|
17
|
+
return function debugPositions() {
|
|
18
|
+
if (completedLines.size === 0) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const allLinks = [];
|
|
22
|
+
const allElements = new Set();
|
|
23
|
+
let globalGapRem = 0;
|
|
24
|
+
let linkCount = 0;
|
|
25
|
+
// Process ALL lines from completedLines
|
|
26
|
+
completedLines.forEach((toId, fromId) => {
|
|
27
|
+
const fromRef = (0, positioningUtils_1.getElementRef)(fromId, { logo: logoRef.current, copies: copyRefs.current }, copies);
|
|
28
|
+
const toRef = (0, positioningUtils_1.getElementRef)(toId, { logo: logoRef.current, copies: copyRefs.current }, copies);
|
|
29
|
+
if (fromRef && toRef && bannerContainerRef.current) {
|
|
30
|
+
const bannerBounds = bannerContainerRef.current.getBoundingClientRect();
|
|
31
|
+
const fromBounds = fromRef.getBoundingClientRect();
|
|
32
|
+
const toBounds = toRef.getBoundingClientRect();
|
|
33
|
+
const fromCenterY = (fromBounds.top + fromBounds.height / 2 - bannerBounds.top - bannerBounds.height / 2) / sizeMultiplier;
|
|
34
|
+
const toCenterY = (toBounds.top + toBounds.height / 2 - bannerBounds.top - bannerBounds.height / 2) / sizeMultiplier;
|
|
35
|
+
const bannerHeight = bannerBounds.height / sizeMultiplier;
|
|
36
|
+
const fromDistToTop = Math.abs(fromCenterY + bannerHeight / 2);
|
|
37
|
+
const fromDistToBottom = Math.abs(fromCenterY - bannerHeight / 2);
|
|
38
|
+
const toDistToTop = Math.abs(toCenterY + bannerHeight / 2);
|
|
39
|
+
const toDistToBottom = Math.abs(toCenterY - bannerHeight / 2);
|
|
40
|
+
const fromClosestEdge = Math.min(fromDistToTop, fromDistToBottom);
|
|
41
|
+
const toClosestEdge = Math.min(toDistToTop, toDistToBottom);
|
|
42
|
+
const anchorId = fromClosestEdge < toClosestEdge ? fromId : toId;
|
|
43
|
+
const targetId = anchorId === fromId ? toId : fromId;
|
|
44
|
+
const anchorBounds = anchorId === fromId ? fromBounds : toBounds;
|
|
45
|
+
const targetBounds = anchorId === fromId ? toBounds : fromBounds;
|
|
46
|
+
const anchorY = (anchorBounds.top + anchorBounds.height / 2 - bannerBounds.top - bannerBounds.height / 2) / sizeMultiplier;
|
|
47
|
+
const targetY = (targetBounds.top + targetBounds.height / 2 - bannerBounds.top - bannerBounds.height / 2) / sizeMultiplier;
|
|
48
|
+
const direction = targetY < anchorY ? 'up' : 'down';
|
|
49
|
+
const anchorBottom = anchorBounds.bottom;
|
|
50
|
+
const anchorTop = anchorBounds.top;
|
|
51
|
+
const targetBottom = targetBounds.bottom;
|
|
52
|
+
const targetTop = targetBounds.top;
|
|
53
|
+
let gapPixels;
|
|
54
|
+
if (direction === 'down') {
|
|
55
|
+
gapPixels = (targetTop - anchorBottom) / sizeMultiplier;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
gapPixels = (anchorTop - targetBottom) / sizeMultiplier;
|
|
59
|
+
}
|
|
60
|
+
const REM_TO_PIXELS = 16;
|
|
61
|
+
const gapRem = gapPixels / REM_TO_PIXELS;
|
|
62
|
+
const anchorElement = anchorId;
|
|
63
|
+
const targetElement = targetId;
|
|
64
|
+
const anchorData = (0, positioningUtils_1.getCopyData)(anchorElement, copies, config, logoTranslateX, logoTranslateY, logoWidth);
|
|
65
|
+
const targetData = (0, positioningUtils_1.getCopyData)(targetElement, copies, config, logoTranslateX, logoTranslateY, logoWidth);
|
|
66
|
+
if (anchorData && targetData) {
|
|
67
|
+
allLinks.push({ fromElement: anchorElement, toElement: targetElement, direction: direction });
|
|
68
|
+
allElements.add(anchorElement);
|
|
69
|
+
allElements.add(targetElement);
|
|
70
|
+
globalGapRem += Number(gapRem.toFixed(2));
|
|
71
|
+
linkCount++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (allLinks.length > 0) {
|
|
76
|
+
const avgGapRem = linkCount > 0 ? globalGapRem / linkCount : 0;
|
|
77
|
+
return {
|
|
78
|
+
autoPositioningConfig: {
|
|
79
|
+
enabled: true,
|
|
80
|
+
links: allLinks,
|
|
81
|
+
},
|
|
82
|
+
gapRem: Number(avgGapRem.toFixed(2)),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useAutoPositioning module
|
|
3
|
+
*
|
|
4
|
+
* Main hook and sub-hooks for auto-positioning functionality.
|
|
5
|
+
*/
|
|
6
|
+
export { useAutoPositioning, type UseAutoPositioningParams, type UseAutoPositioningReturn, type AutoPositioningOverride, } from './useAutoPositioningMain';
|
|
7
|
+
export type { SubstyleConfig, AutoPositioningConfig, AutoPositioningLink } from './useAutoPositioningMain';
|
|
8
|
+
export { createDebugPositions } from './debugPositions';
|
|
9
|
+
export type { GeneratedAutoPositioningConfig, DebugPositionsParams } from './debugPositions';
|
|
10
|
+
export { useAnchorEdgeLocking, type AnchorEdgeState, type UseAnchorEdgeLockingParams } from './useAnchorEdgeLocking';
|
|
11
|
+
export { useHeightCompensation, type UseHeightCompensationParams } from './useHeightCompensation';
|
|
12
|
+
export { useChainPositioning, type UseChainPositioningParams } from './useChainPositioning';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/BannerRenderer/hooks/useAutoPositioning/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7F,OAAO,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrH,OAAO,EAAE,qBAAqB,EAAE,KAAK,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* useAutoPositioning module
|
|
4
|
+
*
|
|
5
|
+
* Main hook and sub-hooks for auto-positioning functionality.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.useChainPositioning = exports.useHeightCompensation = exports.useAnchorEdgeLocking = exports.createDebugPositions = exports.useAutoPositioning = void 0;
|
|
9
|
+
// Main hook (default export)
|
|
10
|
+
var useAutoPositioningMain_1 = require("./useAutoPositioningMain");
|
|
11
|
+
Object.defineProperty(exports, "useAutoPositioning", { enumerable: true, get: function () { return useAutoPositioningMain_1.useAutoPositioning; } });
|
|
12
|
+
// Debug positions utility
|
|
13
|
+
var debugPositions_1 = require("./debugPositions");
|
|
14
|
+
Object.defineProperty(exports, "createDebugPositions", { enumerable: true, get: function () { return debugPositions_1.createDebugPositions; } });
|
|
15
|
+
// Sub-hooks (for advanced usage)
|
|
16
|
+
var useAnchorEdgeLocking_1 = require("./useAnchorEdgeLocking");
|
|
17
|
+
Object.defineProperty(exports, "useAnchorEdgeLocking", { enumerable: true, get: function () { return useAnchorEdgeLocking_1.useAnchorEdgeLocking; } });
|
|
18
|
+
var useHeightCompensation_1 = require("./useHeightCompensation");
|
|
19
|
+
Object.defineProperty(exports, "useHeightCompensation", { enumerable: true, get: function () { return useHeightCompensation_1.useHeightCompensation; } });
|
|
20
|
+
var useChainPositioning_1 = require("./useChainPositioning");
|
|
21
|
+
Object.defineProperty(exports, "useChainPositioning", { enumerable: true, get: function () { return useChainPositioning_1.useChainPositioning; } });
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useAnchorEdgeLocking hook
|
|
3
|
+
*
|
|
4
|
+
* Handles capturing anchor edge configuration and initial positioning in testing mode.
|
|
5
|
+
* When a link is created, saves the anchor's gap to the nearest edge.
|
|
6
|
+
* In testing mode, auto-positions elements based on saved config.
|
|
7
|
+
*/
|
|
8
|
+
import type { CopyConfig } from '../../../../types';
|
|
9
|
+
import type { SubstyleConfig, AutoPositioningConfig } from '../../../styles/types/substyleTypes';
|
|
10
|
+
/**
|
|
11
|
+
* State representing the anchor's edge-locking configuration.
|
|
12
|
+
* Used to maintain consistent positioning when element heights change.
|
|
13
|
+
*/
|
|
14
|
+
export interface AnchorEdgeState {
|
|
15
|
+
/** ID of the anchor element (e.g., 'logo' or 'copy-0') */
|
|
16
|
+
anchorId: string;
|
|
17
|
+
/** Which edge of the banner the anchor is locked to */
|
|
18
|
+
edge: 'top' | 'bottom';
|
|
19
|
+
/** Distance from anchor to the locked edge in unscaled pixels */
|
|
20
|
+
gapToEdge: number;
|
|
21
|
+
/** Anchor's height when the link was created (baseline for compensation) */
|
|
22
|
+
initialHeight: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parameters for useAnchorEdgeLocking hook.
|
|
26
|
+
*/
|
|
27
|
+
export interface UseAnchorEdgeLockingParams {
|
|
28
|
+
/** Map of active links (fromId → toId) */
|
|
29
|
+
activeLinks: Map<string, string>;
|
|
30
|
+
/** Array of copy configurations */
|
|
31
|
+
copies: CopyConfig[];
|
|
32
|
+
/** Current size multiplier for scaling */
|
|
33
|
+
sizeMultiplier: number;
|
|
34
|
+
/** Whether in creation mode (user positioning) or testing mode (auto positioning) */
|
|
35
|
+
creationMode: boolean;
|
|
36
|
+
/** Reference to the logo element */
|
|
37
|
+
logoRef: React.RefObject<HTMLDivElement | null>;
|
|
38
|
+
/** References to copy elements */
|
|
39
|
+
copyRefs: React.MutableRefObject<(HTMLDivElement | null)[]>;
|
|
40
|
+
/** Reference to the banner container */
|
|
41
|
+
bannerContainerRef: React.RefObject<HTMLDivElement | null>;
|
|
42
|
+
/** Derived auto-positioning configuration */
|
|
43
|
+
derivedAutoConfig: AutoPositioningConfig | undefined;
|
|
44
|
+
/** Substyle configuration */
|
|
45
|
+
config: SubstyleConfig;
|
|
46
|
+
/** Callback to update copy position */
|
|
47
|
+
onCopyPositionChange?: (index: number, pos: {
|
|
48
|
+
x: number;
|
|
49
|
+
y: number;
|
|
50
|
+
}) => void;
|
|
51
|
+
/** Current anchor edge configuration state */
|
|
52
|
+
anchorEdgeConfig: AnchorEdgeState | null;
|
|
53
|
+
/** Setter for anchor edge configuration */
|
|
54
|
+
setAnchorEdgeConfig: React.Dispatch<React.SetStateAction<AnchorEdgeState | null>>;
|
|
55
|
+
/** Record of target element heights */
|
|
56
|
+
targetHeights: Record<string, number>;
|
|
57
|
+
/** Setter for target heights */
|
|
58
|
+
setTargetHeights: React.Dispatch<React.SetStateAction<Record<string, number>>>;
|
|
59
|
+
/** Ref to track if initial positioning has been done */
|
|
60
|
+
initialPositioningDoneRef: React.MutableRefObject<boolean>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Hook that manages anchor edge locking and initial positioning.
|
|
64
|
+
*
|
|
65
|
+
* Responsibilities:
|
|
66
|
+
* - Capture anchor edge config when links are created
|
|
67
|
+
* - Track target element heights
|
|
68
|
+
* - Apply initial positioning in testing mode
|
|
69
|
+
*/
|
|
70
|
+
export declare function useAnchorEdgeLocking({ activeLinks, copies, sizeMultiplier, creationMode, logoRef, copyRefs, bannerContainerRef, derivedAutoConfig, config, onCopyPositionChange, anchorEdgeConfig, setAnchorEdgeConfig, targetHeights, setTargetHeights, initialPositioningDoneRef, }: UseAnchorEdgeLockingParams): void;
|
|
71
|
+
//# sourceMappingURL=useAnchorEdgeLocking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnchorEdgeLocking.d.ts","sourceRoot":"","sources":["../../../../../src/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAQjG;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,0CAA0C;IAC1C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,mCAAmC;IACnC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,YAAY,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD,kCAAkC;IAClC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5D,wCAAwC;IACxC,kBAAkB,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3D,6CAA6C;IAC7C,iBAAiB,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACrD,6BAA6B;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,uCAAuC;IACvC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9E,8CAA8C;IAC9C,gBAAgB,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,2CAA2C;IAC3C,mBAAmB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAClF,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gCAAgC;IAChC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/E,wDAAwD;IACxD,yBAAyB,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;CAC5D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,MAAM,EACN,cAAc,EACd,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,EACN,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,yBAAyB,GAC1B,EAAE,0BAA0B,GAAG,IAAI,CAuJnC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* useAnchorEdgeLocking hook
|
|
4
|
+
*
|
|
5
|
+
* Handles capturing anchor edge configuration and initial positioning in testing mode.
|
|
6
|
+
* When a link is created, saves the anchor's gap to the nearest edge.
|
|
7
|
+
* In testing mode, auto-positions elements based on saved config.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.useAnchorEdgeLocking = useAnchorEdgeLocking;
|
|
11
|
+
const react_1 = require("react");
|
|
12
|
+
const positioningUtils_1 = require("../../../styles/utils/positioningUtils");
|
|
13
|
+
/**
|
|
14
|
+
* Hook that manages anchor edge locking and initial positioning.
|
|
15
|
+
*
|
|
16
|
+
* Responsibilities:
|
|
17
|
+
* - Capture anchor edge config when links are created
|
|
18
|
+
* - Track target element heights
|
|
19
|
+
* - Apply initial positioning in testing mode
|
|
20
|
+
*/
|
|
21
|
+
function useAnchorEdgeLocking({ activeLinks, copies, sizeMultiplier, creationMode, logoRef, copyRefs, bannerContainerRef, derivedAutoConfig, config, onCopyPositionChange, anchorEdgeConfig, setAnchorEdgeConfig, targetHeights, setTargetHeights, initialPositioningDoneRef, }) {
|
|
22
|
+
// Capture anchor edge config and target heights when there are active links
|
|
23
|
+
// Works in both creationMode (completedLines) and testing mode (derivedAutoConfig.links)
|
|
24
|
+
(0, react_1.useEffect)(() => {
|
|
25
|
+
if (activeLinks.size === 0 || !bannerContainerRef.current) {
|
|
26
|
+
// Clear anchor config and target heights when no links
|
|
27
|
+
if (activeLinks.size === 0) {
|
|
28
|
+
if (anchorEdgeConfig)
|
|
29
|
+
setAnchorEdgeConfig(null);
|
|
30
|
+
if (Object.keys(targetHeights).length > 0)
|
|
31
|
+
setTargetHeights({});
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Find the ANCHOR (element that is source but NOT target of any link)
|
|
36
|
+
const targetElementIds = new Set(Array.from(activeLinks.values()));
|
|
37
|
+
const sourceElements = new Set(Array.from(activeLinks.keys()));
|
|
38
|
+
let anchorId;
|
|
39
|
+
for (const sourceId of sourceElements) {
|
|
40
|
+
if (!targetElementIds.has(sourceId)) {
|
|
41
|
+
anchorId = sourceId;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!anchorId)
|
|
46
|
+
return;
|
|
47
|
+
// Capture anchor config if we don't have one yet, or if anchor changed
|
|
48
|
+
if (!anchorEdgeConfig || anchorEdgeConfig.anchorId !== anchorId) {
|
|
49
|
+
const anchorRef = (0, positioningUtils_1.getElementRef)(anchorId, { logo: logoRef.current, copies: copyRefs.current }, copies);
|
|
50
|
+
if (anchorRef) {
|
|
51
|
+
const edge = (0, positioningUtils_1.detectNearestEdge)(anchorRef, bannerContainerRef.current, sizeMultiplier);
|
|
52
|
+
const gapToEdge = (0, positioningUtils_1.calculateGapToEdge)(anchorRef, edge, bannerContainerRef.current, sizeMultiplier);
|
|
53
|
+
const initialHeight = anchorRef.getBoundingClientRect().height / sizeMultiplier;
|
|
54
|
+
setAnchorEdgeConfig({
|
|
55
|
+
anchorId,
|
|
56
|
+
edge,
|
|
57
|
+
gapToEdge,
|
|
58
|
+
initialHeight,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Capture initial heights for any new TARGET elements
|
|
63
|
+
const newTargetHeights = { ...targetHeights };
|
|
64
|
+
let hasNewTargets = false;
|
|
65
|
+
targetElementIds.forEach(targetId => {
|
|
66
|
+
if (!(targetId in newTargetHeights)) {
|
|
67
|
+
const targetRef = (0, positioningUtils_1.getElementRef)(targetId, { logo: logoRef.current, copies: copyRefs.current }, copies);
|
|
68
|
+
if (targetRef) {
|
|
69
|
+
const height = targetRef.getBoundingClientRect().height / sizeMultiplier;
|
|
70
|
+
newTargetHeights[targetId] = height;
|
|
71
|
+
hasNewTargets = true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (hasNewTargets) {
|
|
76
|
+
setTargetHeights(newTargetHeights);
|
|
77
|
+
}
|
|
78
|
+
// INITIAL POSITIONING: Apply in both testing mode AND creationMode
|
|
79
|
+
// In creationMode, when lines are initialized from autoPositioningConfig, we need to position elements
|
|
80
|
+
// In testing mode, we auto-position based on saved config
|
|
81
|
+
// Only run ONCE to avoid infinite loops (copies changes trigger this effect)
|
|
82
|
+
// SKIP if copies already have saved positions (custom styles)
|
|
83
|
+
const copiesHaveSavedPositions = copies.some(c => c.translateY !== undefined && c.translateY !== 0);
|
|
84
|
+
// Allow initial positioning in both modes when config has links
|
|
85
|
+
if (!initialPositioningDoneRef.current && onCopyPositionChange && (derivedAutoConfig === null || derivedAutoConfig === void 0 ? void 0 : derivedAutoConfig.enabled) && (derivedAutoConfig === null || derivedAutoConfig === void 0 ? void 0 : derivedAutoConfig.links) && !copiesHaveSavedPositions) {
|
|
86
|
+
const anchorRef = (0, positioningUtils_1.getElementRef)(anchorId, { logo: logoRef.current, copies: copyRefs.current }, copies);
|
|
87
|
+
if (!anchorRef)
|
|
88
|
+
return;
|
|
89
|
+
// Build links array with gaps from derivedAutoConfig
|
|
90
|
+
const links = derivedAutoConfig.links.map(link => {
|
|
91
|
+
var _a, _b;
|
|
92
|
+
return ({
|
|
93
|
+
from: link.fromElement,
|
|
94
|
+
to: link.toElement,
|
|
95
|
+
gapRem: (_b = (_a = link.gapRem) !== null && _a !== void 0 ? _a : config.gapRem) !== null && _b !== void 0 ? _b : 0
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
// Measure current heights of all elements in the chain
|
|
99
|
+
const elementHeights = {};
|
|
100
|
+
const chainElementIds = new Set();
|
|
101
|
+
links.forEach(link => {
|
|
102
|
+
chainElementIds.add(link.from);
|
|
103
|
+
chainElementIds.add(link.to);
|
|
104
|
+
});
|
|
105
|
+
for (const elementId of chainElementIds) {
|
|
106
|
+
const ref = (0, positioningUtils_1.getElementRef)(elementId, { logo: logoRef.current, copies: copyRefs.current }, copies);
|
|
107
|
+
if (ref) {
|
|
108
|
+
elementHeights[elementId] = ref.getBoundingClientRect().height / sizeMultiplier;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Calculate absolute positions for all targets
|
|
112
|
+
const absolutePositions = (0, positioningUtils_1.calculateTargetPositionsFromAnchor)(anchorRef, bannerContainerRef.current, sizeMultiplier, links, elementHeights, anchorId);
|
|
113
|
+
// Apply positions to targets via translateY
|
|
114
|
+
for (const [elementId, absoluteY] of Object.entries(absolutePositions)) {
|
|
115
|
+
if (elementId === 'logo')
|
|
116
|
+
continue;
|
|
117
|
+
if (elementId === anchorId)
|
|
118
|
+
continue;
|
|
119
|
+
const styleSlotMatch = elementId.match(/^copy-(\d+)$/);
|
|
120
|
+
if (!styleSlotMatch)
|
|
121
|
+
continue;
|
|
122
|
+
const styleSlot = parseInt(styleSlotMatch[1], 10);
|
|
123
|
+
const copy = copies.find(c => c.styleSlot === styleSlot) || copies[styleSlot];
|
|
124
|
+
if (!copy)
|
|
125
|
+
continue;
|
|
126
|
+
const copyIndex = copies.indexOf(copy);
|
|
127
|
+
if (copyIndex === -1)
|
|
128
|
+
continue;
|
|
129
|
+
const targetRef = (0, positioningUtils_1.getElementRef)(elementId, { logo: logoRef.current, copies: copyRefs.current }, copies);
|
|
130
|
+
if (!targetRef)
|
|
131
|
+
continue;
|
|
132
|
+
const targetRect = targetRef.getBoundingClientRect();
|
|
133
|
+
const containerRect = bannerContainerRef.current.getBoundingClientRect();
|
|
134
|
+
const bannerCenterY = containerRect.top + containerRect.height / 2;
|
|
135
|
+
const currentCenterY = ((targetRect.top + targetRect.height / 2) - bannerCenterY) / sizeMultiplier;
|
|
136
|
+
const currentTranslateY = copy.translateY || 0;
|
|
137
|
+
const deltaY = absoluteY - currentCenterY;
|
|
138
|
+
const newTranslateY = currentTranslateY + deltaY;
|
|
139
|
+
// Debug log - uncomment for troubleshooting
|
|
140
|
+
// console.log(`🎯 Initial positioning ${elementId}: currentCenterY=${currentCenterY.toFixed(2)}, targetCenterY=${absoluteY.toFixed(2)}, delta=${deltaY.toFixed(2)}, translateY=${newTranslateY.toFixed(2)}`);
|
|
141
|
+
console.log('🔒 ANCHOR-LOCK onCopyPositionChange:', { copyIndex, elementId, newTranslateY: newTranslateY.toFixed(2) });
|
|
142
|
+
onCopyPositionChange(copyIndex, {
|
|
143
|
+
x: copy.translateX || 0,
|
|
144
|
+
y: newTranslateY,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Mark initial positioning as done
|
|
148
|
+
initialPositioningDoneRef.current = true;
|
|
149
|
+
}
|
|
150
|
+
}, [activeLinks, copies, sizeMultiplier, anchorEdgeConfig, targetHeights, logoRef, copyRefs, bannerContainerRef, creationMode, onCopyPositionChange, derivedAutoConfig, config.gapRem, setAnchorEdgeConfig, setTargetHeights, initialPositioningDoneRef]);
|
|
151
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useAutoPositioning hook - Main Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* This is the main hook that orchestrates all auto-positioning functionality.
|
|
5
|
+
* It composes several sub-hooks for better organization and maintainability.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import type { CopyConfig } from '../../../../types';
|
|
9
|
+
import type { SubstyleConfig, AutoPositioningConfig, AutoPositioningLink } from '../../../styles/types/substyleTypes';
|
|
10
|
+
import { type GeneratedAutoPositioningConfig } from './debugPositions';
|
|
11
|
+
export type { SubstyleConfig, AutoPositioningConfig, AutoPositioningLink };
|
|
12
|
+
export type { GeneratedAutoPositioningConfig } from './debugPositions';
|
|
13
|
+
export interface AutoPositioningOverride {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
config?: AutoPositioningConfig;
|
|
16
|
+
gapRem?: number;
|
|
17
|
+
copies?: SubstyleConfig['copies'];
|
|
18
|
+
}
|
|
19
|
+
export interface UseAutoPositioningParams {
|
|
20
|
+
logoRef: React.RefObject<HTMLDivElement | null>;
|
|
21
|
+
copyRefs: React.MutableRefObject<(HTMLDivElement | null)[]>;
|
|
22
|
+
bannerContainerRef: React.RefObject<HTMLDivElement | null>;
|
|
23
|
+
copies: CopyConfig[];
|
|
24
|
+
sizeMultiplier: number;
|
|
25
|
+
creationMode: boolean;
|
|
26
|
+
completedLines: Map<string, string>;
|
|
27
|
+
manualLines: Set<string>;
|
|
28
|
+
lineGaps: Map<string, number>;
|
|
29
|
+
setCompletedLines: React.Dispatch<React.SetStateAction<Map<string, string>>>;
|
|
30
|
+
setManualLines: React.Dispatch<React.SetStateAction<Set<string>>>;
|
|
31
|
+
setLineGaps: React.Dispatch<React.SetStateAction<Map<string, number>>>;
|
|
32
|
+
config: SubstyleConfig;
|
|
33
|
+
autoPositioningOverride?: AutoPositioningOverride;
|
|
34
|
+
logoTranslateX: number;
|
|
35
|
+
logoTranslateY: number;
|
|
36
|
+
logoRotation: number;
|
|
37
|
+
logoWidth?: number;
|
|
38
|
+
bannerStyle: number;
|
|
39
|
+
onApplyAutoPositioning?: (config: {
|
|
40
|
+
config: AutoPositioningConfig;
|
|
41
|
+
gapRem: number;
|
|
42
|
+
}) => void;
|
|
43
|
+
onCopyPositionChange?: (index: number, pos: {
|
|
44
|
+
x: number;
|
|
45
|
+
y: number;
|
|
46
|
+
}) => void;
|
|
47
|
+
onConnectionsDeleted?: () => void;
|
|
48
|
+
exposeDebugFunctions?: boolean;
|
|
49
|
+
areElementsOverlapping: (id1: string, id2: string) => boolean;
|
|
50
|
+
areVerticallyAligned: (id1: string, id2: string) => boolean;
|
|
51
|
+
/** Unique key identifying the current style/substyle configuration - triggers reset when changed */
|
|
52
|
+
configKey?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface UseAutoPositioningReturn {
|
|
55
|
+
autoOffsets: Record<number, number>;
|
|
56
|
+
anchorCompensation: number;
|
|
57
|
+
lineRecalcTrigger: number;
|
|
58
|
+
derivedAutoConfig: AutoPositioningConfig | undefined;
|
|
59
|
+
debugPositions: () => GeneratedAutoPositioningConfig | null;
|
|
60
|
+
applyAutoPositioningConfig: () => void;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Main hook that orchestrates auto-positioning functionality.
|
|
64
|
+
*/
|
|
65
|
+
export declare function useAutoPositioning({ logoRef, copyRefs, bannerContainerRef, copies, sizeMultiplier, creationMode, completedLines, manualLines, lineGaps, setCompletedLines, setManualLines, setLineGaps, config, autoPositioningOverride, logoTranslateX, logoTranslateY, logoRotation, logoWidth, bannerStyle, onApplyAutoPositioning, onCopyPositionChange, onConnectionsDeleted, exposeDebugFunctions, areElementsOverlapping, areVerticallyAligned, configKey, }: UseAutoPositioningParams): UseAutoPositioningReturn;
|
|
66
|
+
//# sourceMappingURL=useAutoPositioningMain.d.ts.map
|
package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAutoPositioningMain.d.ts","sourceRoot":"","sources":["../../../../../src/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.ts"],"names":[],"mappings":"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"}
|