zuljaman-banner-components 1.0.23 → 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.
Files changed (117) hide show
  1. package/README.md +228 -131
  2. package/dist/components/BannerRenderer/BannerRenderer.d.ts +8 -0
  3. package/dist/components/BannerRenderer/BannerRenderer.d.ts.map +1 -0
  4. package/dist/components/BannerRenderer/BannerRenderer.js +325 -0
  5. package/dist/components/BannerRenderer/components/CopyElement.d.ts +62 -0
  6. package/dist/components/BannerRenderer/components/CopyElement.d.ts.map +1 -0
  7. package/dist/components/BannerRenderer/components/CopyElement.js +220 -0
  8. package/dist/components/BannerRenderer/components/InteractiveLines.d.ts +26 -0
  9. package/dist/components/BannerRenderer/components/InteractiveLines.d.ts.map +1 -0
  10. package/dist/components/BannerRenderer/components/InteractiveLines.js +172 -0
  11. package/dist/components/BannerRenderer/components/LogoElement.d.ts +55 -0
  12. package/dist/components/BannerRenderer/components/LogoElement.d.ts.map +1 -0
  13. package/dist/components/BannerRenderer/components/LogoElement.js +53 -0
  14. package/dist/components/BannerRenderer/components/VisualGuides.d.ts +43 -0
  15. package/dist/components/BannerRenderer/components/VisualGuides.d.ts.map +1 -0
  16. package/dist/components/BannerRenderer/components/VisualGuides.js +110 -0
  17. package/dist/components/BannerRenderer/components/index.d.ts +12 -0
  18. package/dist/components/BannerRenderer/components/index.d.ts.map +1 -0
  19. package/dist/components/BannerRenderer/components/index.js +14 -0
  20. package/dist/components/BannerRenderer/constants.d.ts +15 -0
  21. package/dist/components/BannerRenderer/constants.d.ts.map +1 -0
  22. package/dist/components/BannerRenderer/constants.js +36 -0
  23. package/dist/components/BannerRenderer/hooks/index.d.ts +14 -0
  24. package/dist/components/BannerRenderer/hooks/index.d.ts.map +1 -0
  25. package/dist/components/BannerRenderer/hooks/index.js +16 -0
  26. package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.d.ts +30 -0
  27. package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.d.ts.map +1 -0
  28. package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.js +87 -0
  29. package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.d.ts +13 -0
  30. package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.d.ts.map +1 -0
  31. package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.js +21 -0
  32. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.d.ts +71 -0
  33. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.d.ts.map +1 -0
  34. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.js +151 -0
  35. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.d.ts +66 -0
  36. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.d.ts.map +1 -0
  37. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.js +332 -0
  38. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.d.ts +61 -0
  39. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.d.ts.map +1 -0
  40. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.js +180 -0
  41. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.d.ts +60 -0
  42. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.d.ts.map +1 -0
  43. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.js +178 -0
  44. package/dist/components/BannerRenderer/hooks/useAutoPositioning.d.ts +8 -0
  45. package/dist/components/BannerRenderer/hooks/useAutoPositioning.d.ts.map +1 -0
  46. package/dist/components/BannerRenderer/hooks/useAutoPositioning.js +12 -0
  47. package/dist/components/BannerRenderer/hooks/useDragSnap.d.ts +30 -0
  48. package/dist/components/BannerRenderer/hooks/useDragSnap.d.ts.map +1 -0
  49. package/dist/components/BannerRenderer/hooks/useDragSnap.js +90 -0
  50. package/dist/components/BannerRenderer/hooks/useElementRefs.d.ts +22 -0
  51. package/dist/components/BannerRenderer/hooks/useElementRefs.d.ts.map +1 -0
  52. package/dist/components/BannerRenderer/hooks/useElementRefs.js +70 -0
  53. package/dist/components/BannerRenderer/hooks/useLineDrawing.d.ts +40 -0
  54. package/dist/components/BannerRenderer/hooks/useLineDrawing.d.ts.map +1 -0
  55. package/dist/components/BannerRenderer/hooks/useLineDrawing.js +198 -0
  56. package/dist/components/BannerRenderer/hooks/useProximityDetection.d.ts +43 -0
  57. package/dist/components/BannerRenderer/hooks/useProximityDetection.d.ts.map +1 -0
  58. package/dist/components/BannerRenderer/hooks/useProximityDetection.js +491 -0
  59. package/dist/components/BannerRenderer/index.d.ts +6 -0
  60. package/dist/components/BannerRenderer/index.d.ts.map +1 -0
  61. package/dist/components/BannerRenderer/index.js +8 -0
  62. package/dist/components/{BannerRenderer.d.ts → BannerRenderer/types.d.ts} +29 -8
  63. package/dist/components/BannerRenderer/types.d.ts.map +1 -0
  64. package/dist/components/BannerRenderer/types.js +5 -0
  65. package/dist/components/BannerRenderer/utils/alignmentUtils.d.ts +38 -0
  66. package/dist/components/BannerRenderer/utils/alignmentUtils.d.ts.map +1 -0
  67. package/dist/components/BannerRenderer/utils/alignmentUtils.js +138 -0
  68. package/dist/components/BannerRenderer/utils/elementCheckUtils.d.ts +22 -0
  69. package/dist/components/BannerRenderer/utils/elementCheckUtils.d.ts.map +1 -0
  70. package/dist/components/BannerRenderer/utils/elementCheckUtils.js +37 -0
  71. package/dist/components/BannerRenderer/utils/elementIdUtils.d.ts +25 -0
  72. package/dist/components/BannerRenderer/utils/elementIdUtils.d.ts.map +1 -0
  73. package/dist/components/BannerRenderer/utils/elementIdUtils.js +56 -0
  74. package/dist/components/BannerRenderer/utils/fontUtils.d.ts +12 -0
  75. package/dist/components/BannerRenderer/utils/fontUtils.d.ts.map +1 -0
  76. package/dist/components/BannerRenderer/utils/fontUtils.js +26 -0
  77. package/dist/components/BannerRenderer/utils/graphUtils.d.ts +54 -0
  78. package/dist/components/BannerRenderer/utils/graphUtils.d.ts.map +1 -0
  79. package/dist/components/BannerRenderer/utils/graphUtils.js +138 -0
  80. package/dist/components/BannerRenderer/utils/index.d.ts +12 -0
  81. package/dist/components/BannerRenderer/utils/index.d.ts.map +1 -0
  82. package/dist/components/BannerRenderer/utils/index.js +27 -0
  83. package/dist/components/BannerRenderer/utils/snapUtils.d.ts +38 -0
  84. package/dist/components/BannerRenderer/utils/snapUtils.d.ts.map +1 -0
  85. package/dist/components/BannerRenderer/utils/snapUtils.js +109 -0
  86. package/dist/components/BannerVisor.d.ts.map +1 -1
  87. package/dist/components/BannerVisor.js +8 -1
  88. package/dist/components/index.js +1 -1
  89. package/dist/components/shared/DraggableElement.d.ts +11 -0
  90. package/dist/components/shared/DraggableElement.d.ts.map +1 -1
  91. package/dist/components/shared/DraggableElement.js +47 -51
  92. package/dist/components/styles/Style1/substyleConfig.d.ts.map +1 -1
  93. package/dist/components/styles/Style1/substyleConfig.js +53 -54
  94. package/dist/components/styles/Style2/substyleConfig.js +78 -78
  95. package/dist/components/styles/Style3/substyleConfig.d.ts.map +1 -1
  96. package/dist/components/styles/Style3/substyleConfig.js +40 -37
  97. package/dist/components/styles/Style4/substyleConfig.js +57 -57
  98. package/dist/components/styles/types/substyleTypes.d.ts +32 -15
  99. package/dist/components/styles/types/substyleTypes.d.ts.map +1 -1
  100. package/dist/components/styles/utils/chainValidation.d.ts +41 -0
  101. package/dist/components/styles/utils/chainValidation.d.ts.map +1 -0
  102. package/dist/components/styles/utils/chainValidation.js +148 -0
  103. package/dist/components/styles/utils/positioningUtils.d.ts +207 -11
  104. package/dist/components/styles/utils/positioningUtils.d.ts.map +1 -1
  105. package/dist/components/styles/utils/positioningUtils.js +520 -19
  106. package/dist/constants/characterLimits.d.ts +4 -16
  107. package/dist/constants/characterLimits.d.ts.map +1 -1
  108. package/dist/constants/characterLimits.js +28 -26
  109. package/dist/constants/styleConfigs.js +6 -6
  110. package/dist/styleConfig.d.ts +4 -4
  111. package/dist/styleConfig.d.ts.map +1 -1
  112. package/dist/styleConfig.js +8 -16
  113. package/dist/types.d.ts +42 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/package.json +1 -1
  116. package/dist/components/BannerRenderer.d.ts.map +0 -1
  117. package/dist/components/BannerRenderer.js +0 -559
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /**
3
+ * Snap utility functions for BannerRenderer
4
+ * Pure functions for snapping positions and rotations
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.snapRotation = snapRotation;
8
+ exports.toRelativeBounds = toRelativeBounds;
9
+ exports.calculateSnapDelta = calculateSnapDelta;
10
+ /**
11
+ * Snap angle to nearest cardinal direction (0°, 90°, 180°, 270°)
12
+ * @param angle - Input angle in degrees
13
+ * @param snapThreshold - Degrees threshold for snapping (default: 3)
14
+ * @returns Snapped angle or normalized input angle
15
+ */
16
+ function snapRotation(angle, snapThreshold = 3) {
17
+ const snapAngles = [0, 90, 180, 270, -90, -180, -270];
18
+ // Normalize angle to -180 to 180 range
19
+ let normalized = angle % 360;
20
+ if (normalized > 180)
21
+ normalized -= 360;
22
+ if (normalized < -180)
23
+ normalized += 360;
24
+ // Check if close to any snap angle
25
+ for (const snapAngle of snapAngles) {
26
+ if (Math.abs(normalized - snapAngle) < snapThreshold) {
27
+ return snapAngle;
28
+ }
29
+ }
30
+ return normalized;
31
+ }
32
+ /**
33
+ * Convert DOMRect to relative bounds (relative to container center)
34
+ */
35
+ function toRelativeBounds(bounds, containerBounds, sizeMultiplier) {
36
+ return {
37
+ left: (bounds.left - containerBounds.left - containerBounds.width / 2) / sizeMultiplier,
38
+ centerX: (bounds.left + bounds.width / 2 - containerBounds.left - containerBounds.width / 2) / sizeMultiplier,
39
+ right: (bounds.right - containerBounds.left - containerBounds.width / 2) / sizeMultiplier,
40
+ top: (bounds.top - containerBounds.top - containerBounds.height / 2) / sizeMultiplier,
41
+ centerY: (bounds.top + bounds.height / 2 - containerBounds.top - containerBounds.height / 2) / sizeMultiplier,
42
+ bottom: (bounds.bottom - containerBounds.top - containerBounds.height / 2) / sizeMultiplier,
43
+ };
44
+ }
45
+ /**
46
+ * Calculate snap delta for position alignment
47
+ * @param draggedBounds - Bounds of the element being dragged
48
+ * @param otherBoundsArray - Array of other elements' bounds to snap to
49
+ * @param snapThreshold - Pixel threshold for snapping (default: 5)
50
+ * @returns Delta to apply to position for snapping
51
+ */
52
+ function calculateSnapDelta(draggedBounds, otherBoundsArray, snapThreshold = 5) {
53
+ let snapDeltaX = 0;
54
+ let snapDeltaY = 0;
55
+ let hasSnappedX = false;
56
+ let hasSnappedY = false;
57
+ for (const other of otherBoundsArray) {
58
+ // Horizontal snapping (X axis) - only snap to closest alignment
59
+ if (!hasSnappedX) {
60
+ if (Math.abs(draggedBounds.left - other.left) < snapThreshold) {
61
+ snapDeltaX = other.left - draggedBounds.left;
62
+ hasSnappedX = true;
63
+ }
64
+ else if (Math.abs(draggedBounds.centerX - other.centerX) < snapThreshold) {
65
+ snapDeltaX = other.centerX - draggedBounds.centerX;
66
+ hasSnappedX = true;
67
+ }
68
+ else if (Math.abs(draggedBounds.right - other.right) < snapThreshold) {
69
+ snapDeltaX = other.right - draggedBounds.right;
70
+ hasSnappedX = true;
71
+ }
72
+ else if (Math.abs(draggedBounds.right - other.left) < snapThreshold) {
73
+ snapDeltaX = other.left - draggedBounds.right;
74
+ hasSnappedX = true;
75
+ }
76
+ else if (Math.abs(draggedBounds.left - other.right) < snapThreshold) {
77
+ snapDeltaX = other.right - draggedBounds.left;
78
+ hasSnappedX = true;
79
+ }
80
+ }
81
+ // Vertical snapping (Y axis) - only snap to closest alignment
82
+ if (!hasSnappedY) {
83
+ if (Math.abs(draggedBounds.top - other.top) < snapThreshold) {
84
+ snapDeltaY = other.top - draggedBounds.top;
85
+ hasSnappedY = true;
86
+ }
87
+ else if (Math.abs(draggedBounds.centerY - other.centerY) < snapThreshold) {
88
+ snapDeltaY = other.centerY - draggedBounds.centerY;
89
+ hasSnappedY = true;
90
+ }
91
+ else if (Math.abs(draggedBounds.bottom - other.bottom) < snapThreshold) {
92
+ snapDeltaY = other.bottom - draggedBounds.bottom;
93
+ hasSnappedY = true;
94
+ }
95
+ else if (Math.abs(draggedBounds.bottom - other.top) < snapThreshold) {
96
+ snapDeltaY = other.top - draggedBounds.bottom;
97
+ hasSnappedY = true;
98
+ }
99
+ else if (Math.abs(draggedBounds.top - other.bottom) < snapThreshold) {
100
+ snapDeltaY = other.bottom - draggedBounds.top;
101
+ hasSnappedY = true;
102
+ }
103
+ }
104
+ // Early exit if both axes have snapped
105
+ if (hasSnappedX && hasSnappedY)
106
+ break;
107
+ }
108
+ return { deltaX: snapDeltaX, deltaY: snapDeltaY };
109
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"BannerVisor.d.ts","sourceRoot":"","sources":["../../src/components/BannerVisor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAA+C,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAYzE,UAAU,yBAA0B,SAAQ,gBAAgB;IAC1D,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;CACjD;AAUD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAkU3D,CAAC"}
1
+ {"version":3,"file":"BannerVisor.d.ts","sourceRoot":"","sources":["../../src/components/BannerVisor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAA+C,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAYzE,UAAU,yBAA0B,SAAQ,gBAAgB;IAC1D,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;CACjD;AAUD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAgV3D,CAAC"}
@@ -19,7 +19,7 @@ const BannerRenderer_1 = require("./BannerRenderer");
19
19
  const NoImageComponent = () => {
20
20
  return ((0, jsx_runtime_1.jsx)("div", { className: "w-full grow flex items-center justify-center text-neutral-500", children: (0, jsx_runtime_1.jsx)("p", { children: "No image selected" }) }));
21
21
  };
22
- const BannerVisor = ({ backgroundImageUrl, copies, copy1, copy2, bannerStyle = 1, bannerSubstyle, bannerSubSubstyle: _bannerSubSubstyle, logoUrl, postType, sizeMultiplier: externalSizeMultiplier, fontSizeMultiplier = 1.0, copy1FontSizeMultiplier, copy2FontSizeMultiplier, logoSizeMultiplier = 1.0, overlayIntensityMultiplier = 1.0, shadowIntensityMultiplier = 1.0, ImageComponent, logoTranslateX = 0, logoTranslateY = 0, copy1TranslateX = 0, copy1TranslateY = 0, copy2TranslateX = 0, copy2TranslateY = 0, draggableMode = false, onLogoPositionChange, onCopyPositionChange, onCopy1PositionChange, onCopy2PositionChange, onLogoRotationChange, onCopyRotationChange, onCopy1RotationChange, onCopy2RotationChange, logoRotation = 0, copy1Rotation = 0, copy2Rotation = 0, logoWidth, copy1Width, copy2Width, onLogoWidthChange, onCopyWidthChange, onCopy1WidthChange, onCopy2WidthChange, copy1Align = 'left', copy2Align = 'center', copy1FontWeight = 'normal', copy2FontWeight = 'normal', textShadowEnabled, textShadowSize, textShadowIntensity, logoShadowEnabled, logoShadowSize, logoShadowIntensity, noiseEnabled, noiseIntensity, fontFamily, }) => {
22
+ const BannerVisor = ({ backgroundImageUrl, copies, copy1, copy2, bannerStyle = 1, bannerSubstyle, bannerSubSubstyle: _bannerSubSubstyle, logoUrl, postType, sizeMultiplier: externalSizeMultiplier, fontSizeMultiplier = 1.0, copy1FontSizeMultiplier, copy2FontSizeMultiplier, logoSizeMultiplier = 1.0, overlayIntensityMultiplier = 1.0, shadowIntensityMultiplier = 1.0, ImageComponent, logoTranslateX = 0, logoTranslateY = 0, copy1TranslateX = 0, copy1TranslateY = 0, copy2TranslateX = 0, copy2TranslateY = 0, draggableMode = false, creationMode = false, linkingModeActive = false, onDebugPositions, onApplyAutoPositioning, onConnectionsDeleted, onLineGapsChange, autoPositioningOverride, onLogoPositionChange, onCopyPositionChange, onCopy1PositionChange, onCopy2PositionChange, onLogoRotationChange, onCopyRotationChange, onCopy1RotationChange, onCopy2RotationChange, logoRotation = 0, copy1Rotation = 0, copy2Rotation = 0, logoWidth, copy1Width, copy2Width, onLogoWidthChange, onCopyWidthChange, onCopy1WidthChange, onCopy2WidthChange, copy1Align = 'left', copy2Align = 'center', copy1FontWeight = 'normal', copy2FontWeight = 'normal', textShadowEnabled, textShadowSize, textShadowIntensity, logoShadowEnabled, logoShadowSize, logoShadowIntensity, noiseEnabled, noiseIntensity, fontFamily, }) => {
23
23
  var _a;
24
24
  const [internalSizeMultiplier, setInternalSizeMultiplier] = (0, react_1.useState)(1);
25
25
  const containerRef = (0, react_1.useRef)(null);
@@ -139,6 +139,13 @@ const BannerVisor = ({ backgroundImageUrl, copies, copy1, copy2, bannerStyle = 1
139
139
  logoTranslateX,
140
140
  logoTranslateY,
141
141
  draggableMode,
142
+ creationMode,
143
+ linkingModeActive,
144
+ onDebugPositions,
145
+ onApplyAutoPositioning,
146
+ onConnectionsDeleted,
147
+ onLineGapsChange,
148
+ autoPositioningOverride,
142
149
  onLogoPositionChange,
143
150
  onCopyPositionChange: handleCopyPositionChange,
144
151
  onCopyRotationChange: handleCopyRotationChange,
@@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
20
  __exportStar(require("./BannerVisor"), exports);
21
- __exportStar(require("./BannerRenderer"), exports);
21
+ __exportStar(require("./BannerRenderer"), exports); // Now exports from BannerRenderer/index.ts
22
22
  // Note: BannerRenderer is a generic component that handles all banner styles
23
23
  // Use bannerStyle prop (1, 2, 3, etc.) to select the style
24
24
  // Use bannerSubstyle prop (0 for logo only, 1, 2, or 3) to select the substyle
@@ -23,8 +23,19 @@ export interface DraggableElementProps {
23
23
  onSelect: (id: string) => void;
24
24
  onDeselect: () => void;
25
25
  onRotationSnap?: (angle: number) => number;
26
+ onPositionSnap?: (bounds: DOMRect, position: {
27
+ x: number;
28
+ y: number;
29
+ }) => {
30
+ x: number;
31
+ y: number;
32
+ };
26
33
  onDragMove?: (elementId: string, bounds: DOMRect) => void;
27
34
  centerOrigin?: boolean;
35
+ creationMode?: boolean;
36
+ linkingModeActive?: boolean;
37
+ onStartLinking?: () => void;
38
+ onElementClickWhileDrawing?: (targetId: string) => void;
28
39
  children: React.ReactNode;
29
40
  }
30
41
  export declare const DraggableElement: React.FC<DraggableElementProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableElement.d.ts","sourceRoot":"","sources":["../../../src/components/shared/DraggableElement.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IAGpB,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3D,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAC;IAGvB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAG1D,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAwoB5D,CAAC"}
1
+ {"version":3,"file":"DraggableElement.d.ts","sourceRoot":"","sources":["../../../src/components/shared/DraggableElement.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IAGpB,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3D,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAC;IAGvB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnG,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAG1D,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,0BAA0B,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAExD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAuoB5D,CAAC"}
@@ -11,7 +11,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
11
11
  exports.DraggableElement = void 0;
12
12
  const jsx_runtime_1 = require("react/jsx-runtime");
13
13
  const react_1 = __importDefault(require("react"));
14
- const DraggableElement = ({ enabled, position, rotation, width, scale, elementId, isSelected, onPositionChange, onRotationChange, onWidthChange, onSelect, onDeselect, onRotationSnap, onDragMove, centerOrigin = false, children, }) => {
14
+ const DraggableElement = ({ enabled, position, rotation, width, scale, elementId, isSelected, onPositionChange, onRotationChange, onWidthChange, onSelect, onDeselect, onRotationSnap, onPositionSnap, onDragMove, centerOrigin = false, creationMode = false, linkingModeActive = false, onStartLinking, onElementClickWhileDrawing, children, }) => {
15
15
  const [isDragging, setIsDragging] = react_1.default.useState(false);
16
16
  const [isRotating, setIsRotating] = react_1.default.useState(false);
17
17
  const [isResizing, setIsResizing] = react_1.default.useState(false);
@@ -203,10 +203,15 @@ const DraggableElement = ({ enabled, position, rotation, width, scale, elementId
203
203
  hasDraggedRef.current = true;
204
204
  const deltaX = (e.clientX - dragStartPosRef.current.x) / scaleRef.current;
205
205
  const deltaY = (e.clientY - dragStartPosRef.current.y) / scaleRef.current;
206
- const newPosition = {
206
+ let newPosition = {
207
207
  x: startPositionRef.current.x + deltaX,
208
208
  y: startPositionRef.current.y + deltaY,
209
209
  };
210
+ // Apply position snap if callback provided
211
+ if (onPositionSnap && contentOnlyRef.current) {
212
+ const elementBounds = contentOnlyRef.current.getBoundingClientRect();
213
+ newPosition = onPositionSnap(elementBounds, newPosition);
214
+ }
210
215
  setCurrentPosition(newPosition);
211
216
  if (contentOnlyRef.current && onDragMoveRef.current) {
212
217
  const elementBounds = contentOnlyRef.current.getBoundingClientRect();
@@ -367,6 +372,19 @@ const DraggableElement = ({ enabled, position, rotation, width, scale, elementId
367
372
  if (deltaX < 5 && deltaY < 5) {
368
373
  e.preventDefault();
369
374
  e.stopPropagation();
375
+ // If linking mode is active, handle linking instead of normal selection
376
+ if (linkingModeActive) {
377
+ // If another element is drawing, complete the link to this element
378
+ if (onElementClickWhileDrawing) {
379
+ onElementClickWhileDrawing(elementId);
380
+ return; // Don't perform normal selection
381
+ }
382
+ // If no one is drawing, start linking from this element
383
+ if (onStartLinking) {
384
+ onStartLinking();
385
+ return; // Don't perform normal selection
386
+ }
387
+ }
370
388
  if (!isSelected) {
371
389
  onSelect(elementId);
372
390
  }
@@ -394,18 +412,20 @@ const DraggableElement = ({ enabled, position, rotation, width, scale, elementId
394
412
  border: "2px dashed rgba(59, 130, 246, 0.5)",
395
413
  zIndex: 0,
396
414
  pointerEvents: "none",
397
- } })), (0, jsx_runtime_1.jsxs)("div", { ref: rotatingContentRef, style: { transform: `rotate(${rotation}deg)`, position: "relative", display: "inline-block" }, children: [isSelected && ((0, jsx_runtime_1.jsx)("div", { style: {
415
+ } })), (0, jsx_runtime_1.jsxs)("div", { ref: rotatingContentRef, style: { transform: `rotate(${rotation}deg)`, position: "relative", display: "inline-block" }, children: [(isSelected || creationMode) && ((0, jsx_runtime_1.jsx)("div", { style: {
398
416
  position: "absolute",
399
417
  inset: 0,
400
- border: "4px dotted rgba(59, 130, 246, 1)",
418
+ border: creationMode
419
+ ? "4px solid rgba(0, 255, 0, 1)" // Green phosphorescent solid in creation mode
420
+ : "4px dotted rgba(59, 130, 246, 1)", // Blue dotted when selected
401
421
  zIndex: 1,
402
422
  pointerEvents: "none",
403
- } })), onRotationChange && isSelected && ((0, jsx_runtime_1.jsx)("div", { ref: blueHandleRef, className: "rotation-handle", onMouseDown: handleRotationStart, style: {
423
+ } })), onRotationChange && (isSelected || creationMode) && ((0, jsx_runtime_1.jsx)("div", { ref: blueHandleRef, className: "rotation-handle", onMouseDown: handleRotationStart, style: {
404
424
  position: "absolute",
405
- top: "-16px",
406
- right: "-16px",
407
- width: "32px",
408
- height: "32px",
425
+ top: "-20px",
426
+ right: "-20px",
427
+ width: "40px",
428
+ height: "40px",
409
429
  borderRadius: "50%",
410
430
  backgroundColor: "rgba(59, 130, 246, 0.9)",
411
431
  border: "2px solid white",
@@ -413,72 +433,48 @@ const DraggableElement = ({ enabled, position, rotation, width, scale, elementId
413
433
  display: "flex",
414
434
  alignItems: "center",
415
435
  justifyContent: "center",
416
- fontSize: "16px",
436
+ fontSize: "20px",
417
437
  lineHeight: "1",
418
438
  color: "white",
419
439
  zIndex: 1000,
420
440
  boxShadow: "0 2px 4px rgba(0,0,0,0.2)",
421
441
  transform: `rotate(${-rotation}deg)`,
422
442
  transformOrigin: "center center",
423
- }, title: "Drag to rotate", children: "\u21BB" })), onRotationChange && isSelected && ((0, jsx_runtime_1.jsx)("div", { ref: purpleIndicatorRef, style: {
443
+ }, title: "Drag to rotate", children: "\u21BB" })), onRotationChange && (isSelected || creationMode) && ((0, jsx_runtime_1.jsx)("div", { ref: purpleIndicatorRef, style: {
424
444
  position: "absolute",
425
- top: "-16px",
426
- right: "-16px",
427
- width: "32px",
428
- height: "32px",
445
+ top: "-20px",
446
+ right: "-20px",
447
+ width: "40px",
448
+ height: "40px",
429
449
  borderRadius: "50%",
430
450
  backgroundColor: "rgba(139, 92, 246, 0.9)",
431
451
  border: "2px solid white",
432
452
  display: "flex",
433
453
  alignItems: "center",
434
454
  justifyContent: "center",
435
- fontSize: "16px",
455
+ fontSize: "20px",
436
456
  lineHeight: "1",
437
457
  color: "white",
438
458
  zIndex: 999,
439
459
  boxShadow: "0 2px 4px rgba(0,0,0,0.2)",
440
460
  pointerEvents: "none",
441
- }, title: "Rotation indicator", children: "\u21BB" })), isSelected && ((0, jsx_runtime_1.jsx)("div", { className: "width-handle width-handle-left", onMouseDown: (e) => handleResizeStart(e, 'left'), style: {
461
+ }, title: "Rotation indicator", children: "\u21BB" })), (isSelected || creationMode) && ((0, jsx_runtime_1.jsx)("div", { className: "width-handle width-handle-left", onMouseDown: (e) => handleResizeStart(e, 'left'), style: {
442
462
  position: "absolute",
443
- left: "-16px",
444
- top: "50%",
445
- transform: `translateY(-50%) rotate(${-rotation}deg)`,
446
- transformOrigin: "center center",
447
- width: "32px",
448
- height: "32px",
449
- borderRadius: "50%",
450
- backgroundColor: "rgba(16, 185, 129, 0.9)",
451
- border: "2px solid white",
463
+ left: "-6px",
464
+ top: "0",
465
+ width: "12px",
466
+ height: "100%",
452
467
  cursor: "ew-resize",
453
- display: "flex",
454
- alignItems: "center",
455
- justifyContent: "center",
456
- fontSize: "16px",
457
- lineHeight: "1",
458
- color: "white",
459
468
  zIndex: 1000,
460
- boxShadow: "0 2px 4px rgba(0,0,0,0.2)",
461
- }, title: "Drag to resize width", children: "\u27F7" })), isSelected && ((0, jsx_runtime_1.jsx)("div", { className: "width-handle width-handle-right", onMouseDown: (e) => handleResizeStart(e, 'right'), style: {
469
+ }, title: "Drag to resize width" })), (isSelected || creationMode) && ((0, jsx_runtime_1.jsx)("div", { className: "width-handle width-handle-right", onMouseDown: (e) => handleResizeStart(e, 'right'), style: {
462
470
  position: "absolute",
463
- right: "-16px",
464
- top: "50%",
465
- transform: `translateY(-50%) rotate(${-rotation}deg)`,
466
- transformOrigin: "center center",
467
- width: "32px",
468
- height: "32px",
469
- borderRadius: "50%",
470
- backgroundColor: "rgba(16, 185, 129, 0.9)",
471
- border: "2px solid white",
471
+ right: "-6px",
472
+ top: "0",
473
+ width: "12px",
474
+ height: "100%",
472
475
  cursor: "ew-resize",
473
- display: "flex",
474
- alignItems: "center",
475
- justifyContent: "center",
476
- fontSize: "16px",
477
- lineHeight: "1",
478
- color: "white",
479
476
  zIndex: 1000,
480
- boxShadow: "0 2px 4px rgba(0,0,0,0.2)",
481
- }, title: "Drag to resize width", children: "\u27F7" })), (0, jsx_runtime_1.jsx)("div", { ref: contentOnlyRef, style: {
477
+ }, title: "Drag to resize width" })), (0, jsx_runtime_1.jsx)("div", { ref: contentOnlyRef, style: {
482
478
  position: "relative",
483
479
  zIndex: 1,
484
480
  width: width ? `${width}px` : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"substyleConfig.d.ts","sourceRoot":"","sources":["../../../../src/components/styles/Style1/substyleConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIxD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAiFlE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,cAEpD,CAAC"}
1
+ {"version":3,"file":"substyleConfig.d.ts","sourceRoot":"","sources":["../../../../src/components/styles/Style1/substyleConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIxD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAgFlE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,cAEpD,CAAC"}
@@ -18,80 +18,79 @@ exports.STYLE1_SUBSTYLE_CONFIGS = {
18
18
  x: -475, // 6% from left (65px) = -475px from center
19
19
  y: -486, // 5% from top (54px) = -486px from center
20
20
  },
21
- copy1: {
22
- x: 0, // Centered horizontally
23
- y: 432, // 10% from bottom (108px) = 432px from center
24
- width: 950, // 88% of 1080px
25
- alignment: 'center',
26
- },
27
- copy2: {
28
- x: 0, // Centered horizontally
29
- y: 432, // Start at same Y as copy1 (will be auto-positioned above)
30
- width: 950, // 88% of 1080px
31
- alignment: 'center',
32
- },
21
+ copies: [
22
+ {
23
+ x: 0, // Centered horizontally (copy-0)
24
+ y: 432, // 10% from bottom (108px) = 432px from center
25
+ width: 950, // 88% of 1080px
26
+ alignment: 'center',
27
+ },
28
+ {
29
+ x: 0, // Centered horizontally (copy-1)
30
+ y: 432, // Same Y as copy-0, auto-positioning calculates offset
31
+ width: 950, // 88% of 1080px
32
+ alignment: 'center',
33
+ },
34
+ ],
33
35
  autoPositioning: true,
34
36
  autoPositioningConfig: {
35
- anchorElement: 'copy1',
36
- targetElement: 'copy2',
37
- direction: 'up',
37
+ enabled: true,
38
+ links: [
39
+ { fromElement: 'copy-0', toElement: 'copy-1', direction: 'up' },
40
+ ],
38
41
  },
39
42
  gapRem: 1.5,
40
- fontSize: {
41
- copy1: 1.0,
42
- copy2: 0.80,
43
- },
43
+ fontSizes: [1.0, 0.80],
44
44
  },
45
45
  2: {
46
46
  logo: {
47
47
  x: -475,
48
48
  y: -486,
49
49
  },
50
- copy1: {
51
- x: 0,
52
- y: 432,
53
- width: 950,
54
- alignment: 'center',
55
- },
56
- copy2: {
57
- x: -259, // 6% from left (65px), centered within 40% width (432px) = -259px from center
58
- y: -486, // Start at same Y as logo (will be auto-positioned below)
59
- width: 432, // 40% of 1080px
60
- alignment: 'left',
61
- },
50
+ copies: [
51
+ {
52
+ x: 0,
53
+ y: 432,
54
+ width: 950,
55
+ alignment: 'center',
56
+ },
57
+ {
58
+ x: -259, // 6% from left (65px), centered within 40% width (432px) = -259px from center
59
+ y: -486, // Same Y as logo, auto-positioning calculates offset
60
+ width: 432, // 40% of 1080px
61
+ alignment: 'left',
62
+ },
63
+ ],
62
64
  autoPositioning: true,
63
65
  autoPositioningConfig: {
64
- anchorElement: 'logo',
65
- targetElement: 'copy2',
66
- direction: 'down',
66
+ enabled: true,
67
+ links: [
68
+ { fromElement: 'logo', toElement: 'copy-1', direction: 'down' },
69
+ ],
67
70
  },
68
71
  gapRem: 1.5,
69
- fontSize: {
70
- copy1: 1.0,
71
- copy2: 0.80,
72
- },
72
+ fontSizes: [1.0, 0.80],
73
73
  },
74
74
  3: {
75
75
  logo: {
76
76
  x: -475,
77
77
  y: -486,
78
78
  },
79
- copy1: {
80
- x: 0,
81
- y: 432,
82
- width: 950,
83
- alignment: 'center',
84
- },
85
- copy2: {
86
- x: 259, // 6% from right (65px), centered within 40% width (432px) = 259px from center
87
- y: -350, // Moved down from -432 to -350
88
- width: 432, // 40% of 1080px
89
- alignment: 'right',
90
- },
91
- fontSize: {
92
- copy1: 1.0,
93
- copy2: 0.80,
94
- },
79
+ copies: [
80
+ {
81
+ x: 0,
82
+ y: 432,
83
+ width: 950,
84
+ alignment: 'center',
85
+ },
86
+ {
87
+ x: 259, // 6% from right (65px), centered within 40% width (432px) = 259px from center
88
+ y: -350, // Moved down from -432 to -350
89
+ width: 432, // 40% of 1080px
90
+ alignment: 'right',
91
+ },
92
+ ],
93
+ fontSizes: [1.0, 0.80],
95
94
  },
96
95
  };
97
96
  /**