ugcinc-render 1.5.23 → 1.5.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/dist/index.js CHANGED
@@ -944,38 +944,40 @@ function topologicalSortForAxis(elements, axis) {
944
944
  }
945
945
  return { sorted, errors };
946
946
  }
947
- function getSelfAnchorOffsetX(element, selfAnchor) {
947
+ function getSelfAnchorOffsetX(element, selfAnchor, actualWidth) {
948
+ const width = actualWidth ?? element.width;
948
949
  switch (selfAnchor) {
949
950
  case "left":
950
951
  return 0;
951
952
  case "center":
952
- return element.width / 2;
953
+ return width / 2;
953
954
  case "right":
954
- return element.width;
955
+ return width;
955
956
  default:
956
957
  return 0;
957
958
  }
958
959
  }
959
- function getSelfAnchorOffsetY(element, selfAnchor) {
960
+ function getSelfAnchorOffsetY(element, selfAnchor, actualHeight) {
961
+ const height = actualHeight ?? element.height;
960
962
  switch (selfAnchor) {
961
963
  case "top":
962
964
  return 0;
963
965
  case "middle":
964
- return element.height / 2;
966
+ return height / 2;
965
967
  case "bottom":
966
- return element.height;
968
+ return height;
967
969
  default:
968
970
  return 0;
969
971
  }
970
972
  }
971
- function calculateAbsoluteX(element, referenceElement, anchor, selfAnchor, offset) {
973
+ function calculateAbsoluteX(element, referenceElement, anchor, selfAnchor, offset, actualWidth) {
972
974
  const refX = anchor === "left" ? referenceElement.x : referenceElement.x + referenceElement.width;
973
- const selfOffset = getSelfAnchorOffsetX(element, selfAnchor);
975
+ const selfOffset = getSelfAnchorOffsetX(element, selfAnchor, actualWidth);
974
976
  return refX + offset - selfOffset;
975
977
  }
976
- function calculateAbsoluteY(element, referenceElement, anchor, selfAnchor, offset) {
978
+ function calculateAbsoluteY(element, referenceElement, anchor, selfAnchor, offset, actualHeight) {
977
979
  const refY = anchor === "top" ? referenceElement.y : referenceElement.y + referenceElement.height;
978
- const selfOffset = getSelfAnchorOffsetY(element, selfAnchor);
980
+ const selfOffset = getSelfAnchorOffsetY(element, selfAnchor, actualHeight);
979
981
  return refY + offset - selfOffset;
980
982
  }
981
983
  function resolveElementPositions(elements, textValues) {
@@ -1033,26 +1035,37 @@ function resolveElementPositions(elements, textValues) {
1033
1035
  if (refPosition) {
1034
1036
  const defaultSelfAnchor = elem.relativePositionX.anchor === "right" ? "left" : "right";
1035
1037
  const selfAnchor = elem.relativePositionX.selfAnchor ?? defaultSelfAnchor;
1038
+ let actualWidth;
1039
+ let autoResult = null;
1040
+ if (elem.type === "text") {
1041
+ const textContent = getTextContent(elem);
1042
+ autoResult = calculateAutoWidthDimensions(elem, textContent, measureCtx);
1043
+ if (autoResult && elem.autoWidth) {
1044
+ actualWidth = autoResult.actualWidth;
1045
+ }
1046
+ }
1036
1047
  const newX = calculateAbsoluteX(
1037
1048
  elem,
1038
1049
  refPosition,
1039
1050
  elem.relativePositionX.anchor,
1040
1051
  selfAnchor,
1041
- elem.relativePositionX.offset
1052
+ elem.relativePositionX.offset,
1053
+ actualWidth
1054
+ // Use actual width for self anchor calculation
1042
1055
  );
1043
1056
  resolvedX.set(elem.id, { x: newX, width: elem.width });
1044
- if (elem.type === "text") {
1045
- const textContent = getTextContent(elem);
1046
- const autoResult = calculateAutoWidthDimensions({ ...elem, x: newX }, textContent, measureCtx);
1047
- if (autoResult) {
1048
- if (elem.autoWidth) {
1049
- referenceX.set(elem.id, { x: autoResult.actualX, width: autoResult.actualWidth });
1057
+ if (autoResult) {
1058
+ if (elem.autoWidth) {
1059
+ const updatedResult = calculateAutoWidthDimensions({ ...elem, x: newX }, getTextContent(elem), measureCtx);
1060
+ if (updatedResult) {
1061
+ referenceX.set(elem.id, { x: updatedResult.actualX, width: updatedResult.actualWidth });
1062
+ referenceY.set(elem.id, { y: referenceY.get(elem.id)?.y ?? elem.y, height: updatedResult.actualHeight });
1050
1063
  } else {
1051
1064
  referenceX.set(elem.id, { x: newX, width: elem.width });
1052
1065
  }
1053
- referenceY.set(elem.id, { y: referenceY.get(elem.id)?.y ?? elem.y, height: autoResult.actualHeight });
1054
1066
  } else {
1055
1067
  referenceX.set(elem.id, { x: newX, width: elem.width });
1068
+ referenceY.set(elem.id, { y: referenceY.get(elem.id)?.y ?? elem.y, height: autoResult.actualHeight });
1056
1069
  }
1057
1070
  } else {
1058
1071
  referenceX.set(elem.id, { x: newX, width: elem.width });
@@ -1067,22 +1080,26 @@ function resolveElementPositions(elements, textValues) {
1067
1080
  if (refPosition) {
1068
1081
  const defaultSelfAnchor = elem.relativePositionY.anchor === "bottom" ? "top" : "bottom";
1069
1082
  const selfAnchor = elem.relativePositionY.selfAnchor ?? defaultSelfAnchor;
1083
+ let actualHeight;
1084
+ if (elem.type === "text") {
1085
+ const textContent = getTextContent(elem);
1086
+ const autoResult = calculateAutoWidthDimensions(elem, textContent, measureCtx);
1087
+ if (autoResult) {
1088
+ actualHeight = autoResult.actualHeight;
1089
+ }
1090
+ }
1070
1091
  const newY = calculateAbsoluteY(
1071
1092
  elem,
1072
1093
  refPosition,
1073
1094
  elem.relativePositionY.anchor,
1074
1095
  selfAnchor,
1075
- elem.relativePositionY.offset
1096
+ elem.relativePositionY.offset,
1097
+ actualHeight
1098
+ // Use actual height for self anchor calculation
1076
1099
  );
1077
1100
  resolvedY.set(elem.id, { y: newY, height: elem.height });
1078
- if (elem.type === "text") {
1079
- const textContent = getTextContent(elem);
1080
- const autoResult = calculateAutoWidthDimensions({ ...elem, y: newY }, textContent, measureCtx);
1081
- if (autoResult) {
1082
- referenceY.set(elem.id, { y: newY, height: autoResult.actualHeight });
1083
- } else {
1084
- referenceY.set(elem.id, { y: newY, height: elem.height });
1085
- }
1101
+ if (actualHeight !== void 0) {
1102
+ referenceY.set(elem.id, { y: newY, height: actualHeight });
1086
1103
  } else {
1087
1104
  referenceY.set(elem.id, { y: newY, height: elem.height });
1088
1105
  }
package/dist/index.mjs CHANGED
@@ -858,38 +858,40 @@ function topologicalSortForAxis(elements, axis) {
858
858
  }
859
859
  return { sorted, errors };
860
860
  }
861
- function getSelfAnchorOffsetX(element, selfAnchor) {
861
+ function getSelfAnchorOffsetX(element, selfAnchor, actualWidth) {
862
+ const width = actualWidth ?? element.width;
862
863
  switch (selfAnchor) {
863
864
  case "left":
864
865
  return 0;
865
866
  case "center":
866
- return element.width / 2;
867
+ return width / 2;
867
868
  case "right":
868
- return element.width;
869
+ return width;
869
870
  default:
870
871
  return 0;
871
872
  }
872
873
  }
873
- function getSelfAnchorOffsetY(element, selfAnchor) {
874
+ function getSelfAnchorOffsetY(element, selfAnchor, actualHeight) {
875
+ const height = actualHeight ?? element.height;
874
876
  switch (selfAnchor) {
875
877
  case "top":
876
878
  return 0;
877
879
  case "middle":
878
- return element.height / 2;
880
+ return height / 2;
879
881
  case "bottom":
880
- return element.height;
882
+ return height;
881
883
  default:
882
884
  return 0;
883
885
  }
884
886
  }
885
- function calculateAbsoluteX(element, referenceElement, anchor, selfAnchor, offset) {
887
+ function calculateAbsoluteX(element, referenceElement, anchor, selfAnchor, offset, actualWidth) {
886
888
  const refX = anchor === "left" ? referenceElement.x : referenceElement.x + referenceElement.width;
887
- const selfOffset = getSelfAnchorOffsetX(element, selfAnchor);
889
+ const selfOffset = getSelfAnchorOffsetX(element, selfAnchor, actualWidth);
888
890
  return refX + offset - selfOffset;
889
891
  }
890
- function calculateAbsoluteY(element, referenceElement, anchor, selfAnchor, offset) {
892
+ function calculateAbsoluteY(element, referenceElement, anchor, selfAnchor, offset, actualHeight) {
891
893
  const refY = anchor === "top" ? referenceElement.y : referenceElement.y + referenceElement.height;
892
- const selfOffset = getSelfAnchorOffsetY(element, selfAnchor);
894
+ const selfOffset = getSelfAnchorOffsetY(element, selfAnchor, actualHeight);
893
895
  return refY + offset - selfOffset;
894
896
  }
895
897
  function resolveElementPositions(elements, textValues) {
@@ -947,26 +949,37 @@ function resolveElementPositions(elements, textValues) {
947
949
  if (refPosition) {
948
950
  const defaultSelfAnchor = elem.relativePositionX.anchor === "right" ? "left" : "right";
949
951
  const selfAnchor = elem.relativePositionX.selfAnchor ?? defaultSelfAnchor;
952
+ let actualWidth;
953
+ let autoResult = null;
954
+ if (elem.type === "text") {
955
+ const textContent = getTextContent(elem);
956
+ autoResult = calculateAutoWidthDimensions(elem, textContent, measureCtx);
957
+ if (autoResult && elem.autoWidth) {
958
+ actualWidth = autoResult.actualWidth;
959
+ }
960
+ }
950
961
  const newX = calculateAbsoluteX(
951
962
  elem,
952
963
  refPosition,
953
964
  elem.relativePositionX.anchor,
954
965
  selfAnchor,
955
- elem.relativePositionX.offset
966
+ elem.relativePositionX.offset,
967
+ actualWidth
968
+ // Use actual width for self anchor calculation
956
969
  );
957
970
  resolvedX.set(elem.id, { x: newX, width: elem.width });
958
- if (elem.type === "text") {
959
- const textContent = getTextContent(elem);
960
- const autoResult = calculateAutoWidthDimensions({ ...elem, x: newX }, textContent, measureCtx);
961
- if (autoResult) {
962
- if (elem.autoWidth) {
963
- referenceX.set(elem.id, { x: autoResult.actualX, width: autoResult.actualWidth });
971
+ if (autoResult) {
972
+ if (elem.autoWidth) {
973
+ const updatedResult = calculateAutoWidthDimensions({ ...elem, x: newX }, getTextContent(elem), measureCtx);
974
+ if (updatedResult) {
975
+ referenceX.set(elem.id, { x: updatedResult.actualX, width: updatedResult.actualWidth });
976
+ referenceY.set(elem.id, { y: referenceY.get(elem.id)?.y ?? elem.y, height: updatedResult.actualHeight });
964
977
  } else {
965
978
  referenceX.set(elem.id, { x: newX, width: elem.width });
966
979
  }
967
- referenceY.set(elem.id, { y: referenceY.get(elem.id)?.y ?? elem.y, height: autoResult.actualHeight });
968
980
  } else {
969
981
  referenceX.set(elem.id, { x: newX, width: elem.width });
982
+ referenceY.set(elem.id, { y: referenceY.get(elem.id)?.y ?? elem.y, height: autoResult.actualHeight });
970
983
  }
971
984
  } else {
972
985
  referenceX.set(elem.id, { x: newX, width: elem.width });
@@ -981,22 +994,26 @@ function resolveElementPositions(elements, textValues) {
981
994
  if (refPosition) {
982
995
  const defaultSelfAnchor = elem.relativePositionY.anchor === "bottom" ? "top" : "bottom";
983
996
  const selfAnchor = elem.relativePositionY.selfAnchor ?? defaultSelfAnchor;
997
+ let actualHeight;
998
+ if (elem.type === "text") {
999
+ const textContent = getTextContent(elem);
1000
+ const autoResult = calculateAutoWidthDimensions(elem, textContent, measureCtx);
1001
+ if (autoResult) {
1002
+ actualHeight = autoResult.actualHeight;
1003
+ }
1004
+ }
984
1005
  const newY = calculateAbsoluteY(
985
1006
  elem,
986
1007
  refPosition,
987
1008
  elem.relativePositionY.anchor,
988
1009
  selfAnchor,
989
- elem.relativePositionY.offset
1010
+ elem.relativePositionY.offset,
1011
+ actualHeight
1012
+ // Use actual height for self anchor calculation
990
1013
  );
991
1014
  resolvedY.set(elem.id, { y: newY, height: elem.height });
992
- if (elem.type === "text") {
993
- const textContent = getTextContent(elem);
994
- const autoResult = calculateAutoWidthDimensions({ ...elem, y: newY }, textContent, measureCtx);
995
- if (autoResult) {
996
- referenceY.set(elem.id, { y: newY, height: autoResult.actualHeight });
997
- } else {
998
- referenceY.set(elem.id, { y: newY, height: elem.height });
999
- }
1015
+ if (actualHeight !== void 0) {
1016
+ referenceY.set(elem.id, { y: newY, height: actualHeight });
1000
1017
  } else {
1001
1018
  referenceY.set(elem.id, { y: newY, height: elem.height });
1002
1019
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugcinc-render",
3
- "version": "1.5.23",
3
+ "version": "1.5.24",
4
4
  "description": "Unified rendering package for UGC Inc - shared types, components, and compositions for pixel-perfect client/server rendering",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",