uicore-ts 1.1.115 → 1.1.116
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.
|
@@ -134,17 +134,17 @@ export declare class UIRectangle extends UIObject {
|
|
|
134
134
|
_rectanglePointDidChange(): void;
|
|
135
135
|
}
|
|
136
136
|
type RectangleChainMethods<TResult> = {
|
|
137
|
-
[K in keyof UIRectangle as (K extends 'IF' | 'ELSE' | 'ELSE_IF' | 'ENDIF' ? never : K)]: UIRectangle[K] extends (...args: infer Args) => infer R ? R extends UIRectangle | UIRectangle[] ? (...args: Args) => UIRectangleConditionalChain<R, TResult
|
|
137
|
+
[K in keyof UIRectangle as (K extends 'IF' | 'ELSE' | 'ELSE_IF' | 'ENDIF' ? never : K)]: UIRectangle[K] extends (...args: infer Args) => infer R ? R extends UIRectangle | UIRectangle[] ? (...args: Args) => UIRectangleConditionalChain<R, TResult> : never : never;
|
|
138
138
|
};
|
|
139
139
|
type ArrayChainMethods<TResult> = {
|
|
140
|
-
[K in keyof UIRectangle[]]: UIRectangle[][K] extends UIRectangle ? UIRectangleConditionalChain<UIRectangle, TResult
|
|
140
|
+
[K in keyof UIRectangle[]]: UIRectangle[][K] extends UIRectangle ? UIRectangleConditionalChain<UIRectangle, TResult> : UIRectangle[][K] extends (...args: infer Args) => infer R ? R extends UIRectangle | UIRectangle[] ? (...args: Args) => UIRectangleConditionalChain<R, TResult> : never : never;
|
|
141
141
|
};
|
|
142
142
|
type SharedChainMethods<TCurrent, TResult> = {
|
|
143
|
-
TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult
|
|
144
|
-
ELSE_IF
|
|
145
|
-
ELSE
|
|
146
|
-
ENDIF(): TResult;
|
|
147
|
-
ENDIF<R>(performFunction: (result: TResult) => R): R;
|
|
143
|
+
TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult>;
|
|
144
|
+
ELSE_IF(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;
|
|
145
|
+
ELSE(): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;
|
|
146
|
+
ENDIF(): TResult | TCurrent;
|
|
147
|
+
ENDIF<R>(performFunction: (result: TResult | TCurrent) => R): R;
|
|
148
148
|
};
|
|
149
149
|
type UIRectangleConditionalChain<TCurrent, TResult = TCurrent> = (TCurrent extends UIRectangle ? RectangleChainMethods<TResult> : {}) & (TCurrent extends UIRectangle[] ? ArrayChainMethods<TResult> : {}) & SharedChainMethods<TCurrent, TResult>;
|
|
150
150
|
export {};
|
|
@@ -691,115 +691,63 @@ class UIRectangle extends import_UIObject.UIObject {
|
|
|
691
691
|
}
|
|
692
692
|
}
|
|
693
693
|
class UIRectangleConditionalBlock {
|
|
694
|
-
constructor(
|
|
695
|
-
this.
|
|
696
|
-
this.
|
|
694
|
+
constructor(initialResult, condition) {
|
|
695
|
+
this.originalResult = initialResult;
|
|
696
|
+
this.currentResult = initialResult;
|
|
697
697
|
this.conditionMet = condition;
|
|
698
|
-
this.currentResult = initialResult != null ? initialResult : rectangle;
|
|
699
698
|
}
|
|
700
699
|
createProxy() {
|
|
701
700
|
const self = this;
|
|
702
|
-
return new Proxy(
|
|
703
|
-
get(
|
|
701
|
+
return new Proxy({}, {
|
|
702
|
+
get(_, prop) {
|
|
704
703
|
if (prop === "TRANSFORM") {
|
|
705
704
|
return (fn) => {
|
|
706
705
|
if (self.conditionMet) {
|
|
707
706
|
const result = fn(self.currentResult);
|
|
708
707
|
self.currentResult = result;
|
|
709
|
-
if (result instanceof UIRectangle) {
|
|
710
|
-
self.parentRectangle = result;
|
|
711
|
-
}
|
|
712
708
|
}
|
|
713
709
|
return self.createProxy();
|
|
714
710
|
};
|
|
715
711
|
}
|
|
716
712
|
if (prop === "ELSE_IF") {
|
|
717
713
|
return (condition) => {
|
|
718
|
-
if (!self.
|
|
714
|
+
if (!self.conditionMet) {
|
|
719
715
|
self.conditionMet = condition;
|
|
716
|
+
self.currentResult = self.originalResult;
|
|
720
717
|
}
|
|
721
|
-
|
|
722
|
-
self.parentRectangle,
|
|
723
|
-
self.conditionMet,
|
|
724
|
-
self.currentResult
|
|
725
|
-
);
|
|
726
|
-
newBlock.branchHasExecuted = self.branchHasExecuted;
|
|
727
|
-
return newBlock.createProxy();
|
|
718
|
+
return self.createProxy();
|
|
728
719
|
};
|
|
729
720
|
}
|
|
730
721
|
if (prop === "ELSE") {
|
|
731
722
|
return () => {
|
|
732
|
-
if (!self.
|
|
723
|
+
if (!self.conditionMet) {
|
|
733
724
|
self.conditionMet = true;
|
|
725
|
+
self.currentResult = self.originalResult;
|
|
734
726
|
}
|
|
735
|
-
|
|
736
|
-
self.parentRectangle,
|
|
737
|
-
self.conditionMet,
|
|
738
|
-
self.currentResult
|
|
739
|
-
);
|
|
740
|
-
newBlock.branchHasExecuted = self.branchHasExecuted;
|
|
741
|
-
return newBlock.createProxy();
|
|
727
|
+
return self.createProxy();
|
|
742
728
|
};
|
|
743
729
|
}
|
|
744
730
|
if (prop === "ENDIF") {
|
|
745
731
|
let endif2 = function(performFunction) {
|
|
746
|
-
|
|
747
|
-
return performFunction(self.currentResult);
|
|
748
|
-
}
|
|
749
|
-
return self.currentResult;
|
|
732
|
+
return performFunction ? performFunction(self.currentResult) : self.currentResult;
|
|
750
733
|
};
|
|
751
734
|
var endif = endif2;
|
|
752
735
|
return endif2;
|
|
753
736
|
}
|
|
754
|
-
const
|
|
755
|
-
if (
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
self.parentRectangle = result;
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
return self.createProxy();
|
|
770
|
-
};
|
|
771
|
-
}
|
|
772
|
-
const value = array[prop];
|
|
773
|
-
if (value instanceof UIRectangle) {
|
|
774
|
-
return (() => {
|
|
775
|
-
if (self.conditionMet) {
|
|
776
|
-
if (!self.branchHasExecuted)
|
|
777
|
-
self.branchHasExecuted = true;
|
|
778
|
-
self.currentResult = value;
|
|
779
|
-
self.parentRectangle = value;
|
|
780
|
-
}
|
|
781
|
-
return self.createProxy();
|
|
782
|
-
})();
|
|
783
|
-
}
|
|
784
|
-
return value;
|
|
785
|
-
} else {
|
|
786
|
-
const value = target[prop];
|
|
787
|
-
if (value instanceof Function) {
|
|
788
|
-
return (...args) => {
|
|
789
|
-
if (self.conditionMet) {
|
|
790
|
-
if (!self.branchHasExecuted)
|
|
791
|
-
self.branchHasExecuted = true;
|
|
792
|
-
const result = value.apply(target, args);
|
|
793
|
-
self.currentResult = result;
|
|
794
|
-
if (result instanceof UIRectangle) {
|
|
795
|
-
self.parentRectangle = result;
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
return self.createProxy();
|
|
799
|
-
};
|
|
800
|
-
}
|
|
737
|
+
const value = self.currentResult[prop];
|
|
738
|
+
if (typeof value === "function") {
|
|
739
|
+
return (...args) => {
|
|
740
|
+
if (self.conditionMet) {
|
|
741
|
+
const result = value.apply(self.currentResult, args);
|
|
742
|
+
self.currentResult = result;
|
|
743
|
+
}
|
|
744
|
+
return self.createProxy();
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
if (self.conditionMet) {
|
|
748
|
+
self.currentResult = value;
|
|
801
749
|
}
|
|
802
|
-
return
|
|
750
|
+
return self.createProxy();
|
|
803
751
|
}
|
|
804
752
|
});
|
|
805
753
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../scripts/UIRectangle.ts"],
|
|
4
|
-
"sourcesContent": ["import { FIRST_OR_NIL, IS, IS_DEFINED, IS_NIL, IS_NOT_LIKE_NULL, IS_NOT_NIL, nil, NO, UIObject, YES } from \"./UIObject\"\nimport { UIPoint } from \"./UIPoint\"\nimport { UIView } from \"./UIView\"\n\n\nexport type SizeNumberOrFunctionOrView = number | ((constrainingOrthogonalSize: number) => number) | UIView\n\nexport class UIRectangle extends UIObject {\n \n _isBeingUpdated: boolean\n rectanglePointDidChange?: (b: any) => void\n max: UIPoint\n min: UIPoint\n \n // The min and max values are just for storage.\n // You need to call rectangleByEnforcingMinAndMaxSizes to make use of them.\n minHeight?: number\n maxHeight?: number\n minWidth?: number\n maxWidth?: number\n \n \n constructor(x: number = 0, y: number = 0, height: number = 0, width: number = 0) {\n \n super()\n \n this.min = new UIPoint(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY)\n this.max = new UIPoint(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY)\n \n this.min.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n this.max.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n \n this._isBeingUpdated = NO\n \n this.min = new UIPoint(x, y)\n this.max = new UIPoint(x + width, y + height)\n \n if (IS_NIL(height)) {\n this.max.y = height\n }\n \n if (IS_NIL(width)) {\n this.max.x = width\n }\n \n }\n \n \n copy() {\n \n const result = new UIRectangle(this.x, this.y, this.height, this.width)\n \n result.minHeight = this.minHeight\n result.minWidth = this.minWidth\n result.maxHeight = this.maxHeight\n result.maxWidth = this.maxWidth\n \n return result\n \n }\n \n isEqualTo(rectangle: UIRectangle | null | undefined) {\n return (IS(rectangle) && this.min.isEqualTo(rectangle.min) && this.max.isEqualTo(rectangle.max))\n }\n \n static zero() {\n return new UIRectangle(0, 0, 0, 0)\n }\n \n containsPoint(point: UIPoint) {\n return this.min.x <= point.x && this.min.y <= point.y &&\n point.x <= this.max.x && point.y <= this.max.y\n }\n \n updateByAddingPoint(point: UIPoint) {\n \n if (!point) {\n point = new UIPoint(0, 0)\n }\n \n this.beginUpdates()\n \n const min = this.min.copy()\n if (min.x === nil) {\n min.x = this.max.x\n }\n if (min.y === nil) {\n min.y = this.max.y\n }\n \n const max = this.max.copy()\n if (max.x === nil) {\n max.x = this.min.x\n }\n if (max.y === nil) {\n max.y = this.min.y\n }\n \n this.min.x = Math.min(min.x, point.x)\n this.min.y = Math.min(min.y, point.y)\n this.max.x = Math.max(max.x, point.x)\n this.max.y = Math.max(max.y, point.y)\n \n this.finishUpdates()\n \n }\n \n scale(scale: number) {\n if (IS_NOT_NIL(this.max.y)) {\n this.height = this.height * scale\n }\n if (IS_NOT_NIL(this.max.x)) {\n this.width = this.width * scale\n }\n }\n \n get height() {\n if (this.max.y === nil) {\n return nil\n }\n return this.max.y - this.min.y\n }\n \n set height(height: number) {\n this.max.y = this.min.y + height\n }\n \n \n get width() {\n if (this.max.x === nil) {\n return nil\n }\n return this.max.x - this.min.x\n }\n \n set width(width: number) {\n this.max.x = this.min.x + width\n }\n \n \n get x() {\n return this.min.x\n }\n \n set x(x: number) {\n \n this.beginUpdates()\n \n const width = this.width\n this.min.x = x\n this.max.x = this.min.x + width\n \n this.finishUpdates()\n \n }\n \n \n get y() {\n return this.min.y\n }\n \n \n set y(y: number) {\n \n this.beginUpdates()\n \n const height = this.height\n this.min.y = y\n this.max.y = this.min.y + height\n \n this.finishUpdates()\n \n }\n \n \n get topLeft() {\n return this.min.copy()\n }\n \n get topRight() {\n return new UIPoint(this.max.x, this.y)\n }\n \n get bottomLeft() {\n return new UIPoint(this.x, this.max.y)\n }\n \n get bottomRight() {\n return this.max.copy()\n }\n \n \n get center() {\n return this.min.copy().add(this.min.to(this.max).scale(0.5))\n }\n \n set center(center: UIPoint) {\n const offset = this.center.to(center)\n this.offsetByPoint(offset)\n }\n \n offsetByPoint(offset: UIPoint) {\n this.min.add(offset)\n this.max.add(offset)\n \n return this\n }\n \n \n concatenateWithRectangle(rectangle: UIRectangle) {\n this.updateByAddingPoint(rectangle.bottomRight)\n this.updateByAddingPoint(rectangle.topLeft)\n return this\n }\n \n rectangleByConcatenatingWithRectangle(rectangle: UIRectangle) {\n return this.copy().concatenateWithRectangle(rectangle)\n }\n \n \n intersectionRectangleWithRectangle(rectangle: UIRectangle): UIRectangle {\n \n const result = this.copy()\n \n result.beginUpdates()\n \n const min = result.min\n if (min.x === nil) {\n min.x = rectangle.max.x - Math.min(result.width, rectangle.width)\n }\n if (min.y === nil) {\n min.y = rectangle.max.y - Math.min(result.height, rectangle.height)\n }\n \n const max = result.max\n if (max.x === nil) {\n max.x = rectangle.min.x + Math.min(result.width, rectangle.width)\n }\n if (max.y === nil) {\n max.y = rectangle.min.y + Math.min(result.height, rectangle.height)\n }\n \n result.min.x = Math.max(result.min.x, rectangle.min.x)\n result.min.y = Math.max(result.min.y, rectangle.min.y)\n result.max.x = Math.min(result.max.x, rectangle.max.x)\n result.max.y = Math.min(result.max.y, rectangle.max.y)\n \n \n if (result.height < 0) {\n \n const averageY = (this.center.y + rectangle.center.y) * 0.5\n result.min.y = averageY\n result.max.y = averageY\n \n }\n \n if (result.width < 0) {\n \n const averageX = (this.center.x + rectangle.center.x) * 0.5\n result.min.x = averageX\n result.max.x = averageX\n \n }\n \n result.finishUpdates()\n \n return result\n \n }\n \n \n get area() {\n return this.height * this.width\n }\n \n \n intersectsWithRectangle(rectangle: UIRectangle) {\n return (this.intersectionRectangleWithRectangle(rectangle).area != 0)\n }\n \n \n // add some space around the rectangle\n rectangleWithInsets(left: number, right: number, bottom: number, top: number) {\n const result = this.copy()\n result.min.x = this.min.x + left\n result.max.x = this.max.x - right\n result.min.y = this.min.y + top\n result.max.y = this.max.y - bottom\n return result\n }\n \n rectangleWithInset(inset: number) {\n return this.rectangleWithInsets(inset, inset, inset, inset)\n }\n \n rectangleWithHeight(height: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n height = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.copy()\n result.height = height\n \n if (centeredOnPosition != nil) {\n const change = height - this.height\n result.offsetByPoint(new UIPoint(0, change * centeredOnPosition).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithWidth(width: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n width = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.copy()\n result.width = width\n \n if (centeredOnPosition != nil) {\n const change = width - this.width\n result.offsetByPoint(new UIPoint(change * centeredOnPosition, 0).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithHeightRelativeToWidth(heightRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithHeight(this.width * heightRatio, centeredOnPosition)\n }\n \n rectangleWithWidthRelativeToHeight(widthRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithWidth(this.height * widthRatio, centeredOnPosition)\n }\n \n rectangleWithX(x: number, centeredOnPosition: number = 0) {\n \n const result = this.copy()\n result.x = x - result.width * centeredOnPosition\n \n return result\n \n }\n \n rectangleWithY(y: number, centeredOnPosition: number = 0) {\n \n const result = this.copy()\n result.y = y - result.height * centeredOnPosition\n \n return result\n \n }\n \n \n rectangleByAddingX(x: number) {\n \n const result = this.copy()\n result.x = this.x + x\n \n return result\n \n }\n \n rectangleByAddingY(y: number) {\n \n const result = this.copy()\n result.y = this.y + y\n \n return result\n \n }\n \n rectangleByAddingWidth(widthToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithWidth(this.width + widthToAdd, centeredOnPosition)\n \n return result\n \n }\n \n rectangleByAddingHeight(heightToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithHeight(this.height + heightToAdd, centeredOnPosition)\n \n return result\n \n }\n \n \n rectangleWithRelativeValues(\n relativeXPosition: number,\n widthMultiplier: number,\n relativeYPosition: number,\n heightMultiplier: number\n ) {\n \n const result = this.copy()\n \n const width = result.width\n const height = result.height\n \n result.width = widthMultiplier * width\n result.height = heightMultiplier * height\n \n result.center = new UIPoint(\n relativeXPosition * width,\n relativeYPosition * height\n )\n \n return result\n \n }\n \n \n /**\n * Returns a rectangle with a maximum width constraint\n * If current width exceeds max, centers the constrained width\n */\n rectangleWithMaxWidth(maxWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width <= maxWidth) {\n return this.copy()\n }\n return this.rectangleWithWidth(maxWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with a maximum height constraint\n */\n rectangleWithMaxHeight(maxHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height <= maxHeight) {\n return this.copy()\n }\n return this.rectangleWithHeight(maxHeight, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum width constraint\n */\n rectangleWithMinWidth(minWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width >= minWidth) {\n return this.copy()\n }\n return this.rectangleWithWidth(minWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum height constraint\n */\n rectangleWithMinHeight(minHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height >= minHeight) {\n return this.copy()\n }\n return this.rectangleWithHeight(minHeight, centeredOnPosition)\n }\n \n // Returns a new rectangle that is positioned relative to the reference rectangle\n // By default, it makes a copy of this rectangle taht is centered in the target rectangle\n rectangleByCenteringInRectangle(referenceRectangle: UIRectangle, xPosition = 0.5, yPosition = 0.5) {\n const result = this.copy()\n result.center = referenceRectangle.topLeft\n .pointByAddingX(xPosition * referenceRectangle.width)\n .pointByAddingY(yPosition * referenceRectangle.height)\n return result\n }\n \n \n rectanglesBySplittingWidth(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as any[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(weights.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n weights = weights.map(weight => this._widthNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteWidths as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteWidths = (absoluteWidths as number[]).summedValue\n const totalRelativeWidth = this.width - sumOfPaddings - sumOfAbsoluteWidths\n let previousCellMaxX = this.x\n \n for (let i = 0; i < weights.length; i++) {\n \n let resultWidth: number\n if (IS_NOT_NIL(absoluteWidths[i])) {\n resultWidth = (absoluteWidths[i] || 0) as number\n }\n else {\n resultWidth = totalRelativeWidth * (weights[i] as number / sumOfWeights)\n }\n \n const rectangle = this.rectangleWithWidth(resultWidth)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.x = previousCellMaxX\n previousCellMaxX = rectangle.max.x + padding\n result.push(rectangle)\n \n }\n \n return result\n \n }\n \n rectanglesBySplittingHeight(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as number[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(weights.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n weights = weights.map(weight => this._heightNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteHeights as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteHeights = (absoluteHeights as number[]).summedValue\n const totalRelativeHeight = this.height - sumOfPaddings - sumOfAbsoluteHeights\n let previousCellMaxY = this.y\n \n for (let i = 0; i < weights.length; i++) {\n let resultHeight: number\n if (IS_NOT_NIL(absoluteHeights[i])) {\n \n resultHeight = (absoluteHeights[i] || 0) as number\n \n }\n else {\n \n resultHeight = totalRelativeHeight * (weights[i] as number / sumOfWeights)\n \n }\n \n const rectangle = this.rectangleWithHeight(resultHeight)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.y = previousCellMaxY\n previousCellMaxY = rectangle.max.y + padding\n //rectangle = rectangle.rectangleWithInsets(0, 0, padding, 0);\n result.push(rectangle)\n }\n \n return result\n \n }\n \n \n rectanglesByEquallySplittingWidth(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultWidth = (this.width - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithWidth(resultWidth, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n rectanglesByEquallySplittingHeight(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultHeight = (this.height - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithHeight(resultHeight, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n \n distributeViewsAlongWidth(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteWidths?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingWidth(weights, paddings, absoluteWidths)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n distributeViewsAlongHeight(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteHeights?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingHeight(weights, paddings, absoluteHeights)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n \n distributeViewsEquallyAlongWidth(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingWidth(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n distributeViewsEquallyAlongHeight(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingHeight(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n \n _heightNumberFromSizeNumberOrFunctionOrView(height: SizeNumberOrFunctionOrView) {\n if (height instanceof Function) {\n return height(this.width)\n }\n if (height instanceof UIView) {\n return height.intrinsicContentHeight(this.width)\n }\n return height\n }\n \n _widthNumberFromSizeNumberOrFunctionOrView(width: SizeNumberOrFunctionOrView) {\n if (width instanceof Function) {\n return width(this.height)\n }\n if (width instanceof UIView) {\n return width.intrinsicContentWidth(this.height)\n }\n return width\n }\n \n rectangleForNextRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.max.y + padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForNextColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.max.x + padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n }\n \n rectangleForPreviousRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.min.y - heightNumber - padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForPreviousColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.min.x - widthNumber - padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n \n }\n \n /**\n * Distributes views vertically as a column, assigning frames and returning them.\n * Each view is positioned below the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for views (overrides intrinsic height)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsColumn(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.copy()\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithHeight(views[i])\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n frame.height = absoluteHeights[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextRow(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views horizontally as a row, assigning frames and returning them.\n * Each view is positioned to the right of the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteWidths - Optional fixed widths for views (overrides intrinsic width)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsRow(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.copy()\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(views.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithWidth(views[i])\n \n if (IS_NOT_NIL(absoluteWidths[i])) {\n frame.width = absoluteWidths[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextColumn(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views as a grid (2D array), assigning frames and returning them.\n * The first index represents rows (vertical), the second index represents columns (horizontal).\n * Example: views[0] is the first row, views[0][0] is the first column in the first row.\n * Each row is laid out horizontally, and rows are stacked vertically.\n * @param views - 2D array where views[row][column] represents the grid structure\n * @param paddings - Vertical padding between rows (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for each row (overrides intrinsic height)\n * @returns 2D array of rectangles where frames[row][column] matches views[row][column]\n */\n framesByDistributingViewsAsGrid(\n views: UIView[][],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[][] = []\n let currentRowRectangle = this.copy()\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const rowViews = views[i]\n const rowFrames = currentRowRectangle.framesByDistributingViewsAsRow(rowViews)\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n const heightNumber = absoluteHeights[i] as number\n rowFrames.forEach((frame, j) => {\n frame.height = heightNumber\n rowViews[j].frame = frame\n })\n }\n \n frames.push(rowFrames)\n \n const padding = (paddings[i] || 0) as number\n const maxHeight = Math.max(...rowFrames.map(f => f.height))\n currentRowRectangle = currentRowRectangle.rectangleForNextRow(padding, maxHeight)\n }\n \n return frames\n }\n \n rectangleWithIntrinsicContentSizeForView(view: UIView, centeredOnXPosition = 0, centeredOnYPosition = 0) {\n const intrinsicContentSize = view.intrinsicContentSize()\n return this.rectangleWithHeight(intrinsicContentSize.height, centeredOnYPosition)\n .rectangleWithWidth(intrinsicContentSize.width, centeredOnXPosition)\n }\n \n settingMinHeight(minHeight?: number) {\n this.minHeight = minHeight\n return this\n }\n \n settingMinWidth(minWidth?: number) {\n this.minWidth = minWidth\n return this\n }\n \n settingMaxHeight(maxHeight?: number) {\n this.maxHeight = maxHeight\n return this\n }\n \n settingMaxWidth(maxWidth?: number) {\n this.maxWidth = maxWidth\n return this\n }\n \n rectangleByEnforcingMinAndMaxSizes(centeredOnXPosition = 0, centeredOnYPosition = 0) {\n return this.rectangleWithHeight(\n [\n [this.height, this.maxHeight].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minHeight\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnYPosition\n ).rectangleWithWidth(\n [\n [this.width, this.maxWidth].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minWidth\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnXPosition\n )\n }\n \n \n assignedAsFrameOfView(view: UIView) {\n view.frame = this\n return this\n }\n \n \n override toString() {\n \n const result = \"[\" + this.class.name + \"] { x: \" + this.x + \", y: \" + this.y + \", \" +\n \"height: \" + this.height.toFixed(2) + \", width: \" + this.height.toFixed(2) + \" }\"\n \n return result\n \n }\n \n get [Symbol.toStringTag]() {\n return this.toString()\n }\n \n \n IF(condition: boolean): UIRectangleConditionalChain<UIRectangle> {\n const conditionalBlock = new UIRectangleConditionalBlock(this, condition)\n // @ts-ignore\n return conditionalBlock.getProxy()\n }\n \n // These will be intercepted by the proxy, but we define them for TypeScript\n ELSE_IF(condition: boolean): UIRectangle {\n return this\n }\n \n ELSE(): UIRectangle {\n return this\n }\n \n ENDIF(): this\n ENDIF<T, R>(performFunction: (result: T) => R): R\n ENDIF<T, R>(performFunction?: (result: T) => R): R | this {\n if (performFunction) {\n return performFunction(this as any)\n }\n return this\n }\n \n \n // Bounding box\n static boundingBoxForPoints(points: UIPoint[]) {\n const result = new UIRectangle()\n for (let i = 0; i < points.length; i++) {\n result.updateByAddingPoint(points[i])\n }\n return result\n }\n \n static boundingBoxForRectanglesAndPoints(rectanglesAndPoints: (UIPoint | UIRectangle)[]) {\n const result = new UIRectangle()\n for (let i = 0; i < rectanglesAndPoints.length; i++) {\n const rectangleOrPoint = rectanglesAndPoints[i]\n if (rectangleOrPoint instanceof UIRectangle) {\n result.updateByAddingPoint(rectangleOrPoint.min)\n result.updateByAddingPoint(rectangleOrPoint.max)\n }\n else {\n result.updateByAddingPoint(rectangleOrPoint)\n }\n }\n return result\n }\n \n \n beginUpdates() {\n this._isBeingUpdated = YES\n }\n \n finishUpdates() {\n this._isBeingUpdated = NO\n this.didChange()\n }\n \n \n didChange() {\n \n // Callback to be set by delegate\n \n }\n \n _rectanglePointDidChange() {\n if (!this._isBeingUpdated) {\n this.didChange()\n }\n }\n \n \n}\n\n\n// 1. Methods available when holding a UIRectangle\ntype RectangleChainMethods<TResult> = {\n [K in keyof UIRectangle as (\n // Exclude IF to prevent circular reference TS2615\n // Exclude Control Flow keys as they are handled in SharedChainMethods\n K extends 'IF' | 'ELSE' | 'ELSE_IF' | 'ENDIF' ? never : K\n )]:\n UIRectangle[K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle | UIRectangle[] // Filter: Must return Rect or Rect[]\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult | R>\n : never\n : never\n};\n\n// 2. Methods available when holding a UIRectangle[]\ntype ArrayChainMethods<TResult> = {\n [K in keyof UIRectangle[]]:\n // Case 1: It is a property (getter) that returns a UIRectangle\n UIRectangle[][K] extends UIRectangle\n ? UIRectangleConditionalChain<UIRectangle, TResult | UIRectangle>\n // Case 2: It is a function that returns a UIRectangle\n : UIRectangle[][K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult | R>\n : never\n : never\n};\n\n\n\n// 3. Methods available in both states (Control Flow + Transform)\ntype SharedChainMethods<TCurrent, TResult> = {\n // TRANSFORM allows manual conversion from TCurrent to a UIRectangle\n TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult | R>;\n \n // ELSE_IF and ELSE reset the state to the base UIRectangle\n ELSE_IF<U>(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult | U>;\n ELSE<U>(): UIRectangleConditionalChain<UIRectangle, TResult | U>;\n \n // ENDIF returns the final result\n ENDIF(): TResult;\n ENDIF<R>(performFunction: (result: TResult) => R): R;\n};\n\n// 4. The Main Type\n// Conditionally combines the specific methods based on TCurrent, plus the shared methods\ntype UIRectangleConditionalChain<TCurrent, TResult = TCurrent> =\n// Use {} instead of never to avoid collapsing the intersection to 'never'\n (TCurrent extends UIRectangle ? RectangleChainMethods<TResult> : {}) &\n (TCurrent extends UIRectangle[] ? ArrayChainMethods<TResult> : {}) &\n SharedChainMethods<TCurrent, TResult>;\n\n\nclass UIRectangleConditionalBlock {\n private parentRectangle: UIRectangle\n private conditionMet: boolean\n private branchHasExecuted: boolean = false\n private currentResult: any\n \n constructor(rectangle: UIRectangle, condition: boolean, initialResult?: any) {\n this.parentRectangle = rectangle\n this.conditionMet = condition\n this.currentResult = initialResult ?? rectangle\n }\n \n private createProxy(): UIRectangleConditionalChain<any, any> {\n const self = this\n return new Proxy(this.parentRectangle, {\n get(target, prop) {\n \n // 1. Handle Control Flow Methods\n if (prop === 'TRANSFORM') {\n return <R extends UIRectangle>(fn: (current: any) => R) => {\n if (self.conditionMet) {\n const result = fn(self.currentResult)\n self.currentResult = result\n if (result instanceof UIRectangle) {\n self.parentRectangle = result\n }\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ELSE_IF') {\n return <U>(condition: boolean) => {\n if (!self.branchHasExecuted && !self.conditionMet) {\n self.conditionMet = condition\n }\n const newBlock = new UIRectangleConditionalBlock(\n self.parentRectangle,\n self.conditionMet,\n self.currentResult\n )\n newBlock.branchHasExecuted = self.branchHasExecuted\n return newBlock.createProxy()\n }\n }\n \n if (prop === 'ELSE') {\n return <U>() => {\n if (!self.branchHasExecuted && !self.conditionMet) {\n self.conditionMet = true\n }\n const newBlock = new UIRectangleConditionalBlock(\n self.parentRectangle,\n self.conditionMet,\n self.currentResult\n )\n newBlock.branchHasExecuted = self.branchHasExecuted\n return newBlock.createProxy()\n }\n }\n \n if (prop === 'ENDIF') {\n function endif(): any\n function endif<R>(performFunction: (result: any) => R): R\n function endif<R>(performFunction?: (result: any) => R): R | any {\n if (performFunction) {\n return performFunction(self.currentResult)\n }\n return self.currentResult\n }\n return endif\n }\n \n // 2. Handle Array State\n const isArrayState = Array.isArray(self.currentResult)\n \n if (isArrayState) {\n const array = self.currentResult\n const descriptor = Object.getOwnPropertyDescriptor(Array.prototype, prop)\n \n // Case A: It's a method on the Array prototype\n if (descriptor && descriptor.value instanceof Function) {\n return (...args: any[]) => {\n if (self.conditionMet) {\n if (!self.branchHasExecuted) self.branchHasExecuted = true\n const result = descriptor.value.apply(array, args)\n self.currentResult = result\n if (result instanceof UIRectangle) {\n self.parentRectangle = result\n }\n }\n return self.createProxy()\n }\n }\n \n // Case B: It's a getter/property on the Array prototype (e.g., lastElement)\n // We access the value on the array instance\n const value = array[prop]\n \n if (value instanceof UIRectangle) {\n // Special handling: If accessing a property that is a UIRectangle,\n // we treat it as a transition to keep the chain alive.\n return (() => {\n if (self.conditionMet) {\n if (!self.branchHasExecuted) self.branchHasExecuted = true\n self.currentResult = value\n self.parentRectangle = value\n }\n return self.createProxy()\n })()\n }\n \n // Case C: Other properties (like 'length', 'map', etc) -> Return raw value\n // This breaks the chain, which is expected behavior for non-Rectangle properties\n return value\n }\n \n // 3. Handle Rectangle State\n else {\n const value = target[prop as keyof UIRectangle]\n if (value instanceof Function) {\n return (...args: any[]) => {\n if (self.conditionMet) {\n if (!self.branchHasExecuted) self.branchHasExecuted = true\n const result = (value as Function).apply(target, args)\n self.currentResult = result\n if (result instanceof UIRectangle) {\n self.parentRectangle = result\n }\n }\n return self.createProxy()\n }\n }\n }\n \n return (target as any)[prop]\n }\n }) as any\n }\n \n getProxy(): UIRectangleConditionalChain<any, any> {\n return this.createProxy()\n }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { FIRST_OR_NIL, IS, IS_DEFINED, IS_NIL, IS_NOT_LIKE_NULL, IS_NOT_NIL, nil, NO, UIObject, YES } from \"./UIObject\"\nimport { UIPoint } from \"./UIPoint\"\nimport { UIView } from \"./UIView\"\n\n\nexport type SizeNumberOrFunctionOrView = number | ((constrainingOrthogonalSize: number) => number) | UIView\n\nexport class UIRectangle extends UIObject {\n \n _isBeingUpdated: boolean\n rectanglePointDidChange?: (b: any) => void\n max: UIPoint\n min: UIPoint\n \n // The min and max values are just for storage.\n // You need to call rectangleByEnforcingMinAndMaxSizes to make use of them.\n minHeight?: number\n maxHeight?: number\n minWidth?: number\n maxWidth?: number\n \n \n constructor(x: number = 0, y: number = 0, height: number = 0, width: number = 0) {\n \n super()\n \n this.min = new UIPoint(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY)\n this.max = new UIPoint(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY)\n \n this.min.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n this.max.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n \n this._isBeingUpdated = NO\n \n this.min = new UIPoint(x, y)\n this.max = new UIPoint(x + width, y + height)\n \n if (IS_NIL(height)) {\n this.max.y = height\n }\n \n if (IS_NIL(width)) {\n this.max.x = width\n }\n \n }\n \n \n copy() {\n \n const result = new UIRectangle(this.x, this.y, this.height, this.width)\n \n result.minHeight = this.minHeight\n result.minWidth = this.minWidth\n result.maxHeight = this.maxHeight\n result.maxWidth = this.maxWidth\n \n return result\n \n }\n \n isEqualTo(rectangle: UIRectangle | null | undefined) {\n return (IS(rectangle) && this.min.isEqualTo(rectangle.min) && this.max.isEqualTo(rectangle.max))\n }\n \n static zero() {\n return new UIRectangle(0, 0, 0, 0)\n }\n \n containsPoint(point: UIPoint) {\n return this.min.x <= point.x && this.min.y <= point.y &&\n point.x <= this.max.x && point.y <= this.max.y\n }\n \n updateByAddingPoint(point: UIPoint) {\n \n if (!point) {\n point = new UIPoint(0, 0)\n }\n \n this.beginUpdates()\n \n const min = this.min.copy()\n if (min.x === nil) {\n min.x = this.max.x\n }\n if (min.y === nil) {\n min.y = this.max.y\n }\n \n const max = this.max.copy()\n if (max.x === nil) {\n max.x = this.min.x\n }\n if (max.y === nil) {\n max.y = this.min.y\n }\n \n this.min.x = Math.min(min.x, point.x)\n this.min.y = Math.min(min.y, point.y)\n this.max.x = Math.max(max.x, point.x)\n this.max.y = Math.max(max.y, point.y)\n \n this.finishUpdates()\n \n }\n \n scale(scale: number) {\n if (IS_NOT_NIL(this.max.y)) {\n this.height = this.height * scale\n }\n if (IS_NOT_NIL(this.max.x)) {\n this.width = this.width * scale\n }\n }\n \n get height() {\n if (this.max.y === nil) {\n return nil\n }\n return this.max.y - this.min.y\n }\n \n set height(height: number) {\n this.max.y = this.min.y + height\n }\n \n \n get width() {\n if (this.max.x === nil) {\n return nil\n }\n return this.max.x - this.min.x\n }\n \n set width(width: number) {\n this.max.x = this.min.x + width\n }\n \n \n get x() {\n return this.min.x\n }\n \n set x(x: number) {\n \n this.beginUpdates()\n \n const width = this.width\n this.min.x = x\n this.max.x = this.min.x + width\n \n this.finishUpdates()\n \n }\n \n \n get y() {\n return this.min.y\n }\n \n \n set y(y: number) {\n \n this.beginUpdates()\n \n const height = this.height\n this.min.y = y\n this.max.y = this.min.y + height\n \n this.finishUpdates()\n \n }\n \n \n get topLeft() {\n return this.min.copy()\n }\n \n get topRight() {\n return new UIPoint(this.max.x, this.y)\n }\n \n get bottomLeft() {\n return new UIPoint(this.x, this.max.y)\n }\n \n get bottomRight() {\n return this.max.copy()\n }\n \n \n get center() {\n return this.min.copy().add(this.min.to(this.max).scale(0.5))\n }\n \n set center(center: UIPoint) {\n const offset = this.center.to(center)\n this.offsetByPoint(offset)\n }\n \n offsetByPoint(offset: UIPoint) {\n this.min.add(offset)\n this.max.add(offset)\n \n return this\n }\n \n \n concatenateWithRectangle(rectangle: UIRectangle) {\n this.updateByAddingPoint(rectangle.bottomRight)\n this.updateByAddingPoint(rectangle.topLeft)\n return this\n }\n \n rectangleByConcatenatingWithRectangle(rectangle: UIRectangle) {\n return this.copy().concatenateWithRectangle(rectangle)\n }\n \n \n intersectionRectangleWithRectangle(rectangle: UIRectangle): UIRectangle {\n \n const result = this.copy()\n \n result.beginUpdates()\n \n const min = result.min\n if (min.x === nil) {\n min.x = rectangle.max.x - Math.min(result.width, rectangle.width)\n }\n if (min.y === nil) {\n min.y = rectangle.max.y - Math.min(result.height, rectangle.height)\n }\n \n const max = result.max\n if (max.x === nil) {\n max.x = rectangle.min.x + Math.min(result.width, rectangle.width)\n }\n if (max.y === nil) {\n max.y = rectangle.min.y + Math.min(result.height, rectangle.height)\n }\n \n result.min.x = Math.max(result.min.x, rectangle.min.x)\n result.min.y = Math.max(result.min.y, rectangle.min.y)\n result.max.x = Math.min(result.max.x, rectangle.max.x)\n result.max.y = Math.min(result.max.y, rectangle.max.y)\n \n \n if (result.height < 0) {\n \n const averageY = (this.center.y + rectangle.center.y) * 0.5\n result.min.y = averageY\n result.max.y = averageY\n \n }\n \n if (result.width < 0) {\n \n const averageX = (this.center.x + rectangle.center.x) * 0.5\n result.min.x = averageX\n result.max.x = averageX\n \n }\n \n result.finishUpdates()\n \n return result\n \n }\n \n \n get area() {\n return this.height * this.width\n }\n \n \n intersectsWithRectangle(rectangle: UIRectangle) {\n return (this.intersectionRectangleWithRectangle(rectangle).area != 0)\n }\n \n \n // add some space around the rectangle\n rectangleWithInsets(left: number, right: number, bottom: number, top: number) {\n const result = this.copy()\n result.min.x = this.min.x + left\n result.max.x = this.max.x - right\n result.min.y = this.min.y + top\n result.max.y = this.max.y - bottom\n return result\n }\n \n rectangleWithInset(inset: number) {\n return this.rectangleWithInsets(inset, inset, inset, inset)\n }\n \n rectangleWithHeight(height: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n height = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.copy()\n result.height = height\n \n if (centeredOnPosition != nil) {\n const change = height - this.height\n result.offsetByPoint(new UIPoint(0, change * centeredOnPosition).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithWidth(width: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n width = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.copy()\n result.width = width\n \n if (centeredOnPosition != nil) {\n const change = width - this.width\n result.offsetByPoint(new UIPoint(change * centeredOnPosition, 0).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithHeightRelativeToWidth(heightRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithHeight(this.width * heightRatio, centeredOnPosition)\n }\n \n rectangleWithWidthRelativeToHeight(widthRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithWidth(this.height * widthRatio, centeredOnPosition)\n }\n \n rectangleWithX(x: number, centeredOnPosition: number = 0) {\n \n const result = this.copy()\n result.x = x - result.width * centeredOnPosition\n \n return result\n \n }\n \n rectangleWithY(y: number, centeredOnPosition: number = 0) {\n \n const result = this.copy()\n result.y = y - result.height * centeredOnPosition\n \n return result\n \n }\n \n \n rectangleByAddingX(x: number) {\n \n const result = this.copy()\n result.x = this.x + x\n \n return result\n \n }\n \n rectangleByAddingY(y: number) {\n \n const result = this.copy()\n result.y = this.y + y\n \n return result\n \n }\n \n rectangleByAddingWidth(widthToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithWidth(this.width + widthToAdd, centeredOnPosition)\n \n return result\n \n }\n \n rectangleByAddingHeight(heightToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithHeight(this.height + heightToAdd, centeredOnPosition)\n \n return result\n \n }\n \n \n rectangleWithRelativeValues(\n relativeXPosition: number,\n widthMultiplier: number,\n relativeYPosition: number,\n heightMultiplier: number\n ) {\n \n const result = this.copy()\n \n const width = result.width\n const height = result.height\n \n result.width = widthMultiplier * width\n result.height = heightMultiplier * height\n \n result.center = new UIPoint(\n relativeXPosition * width,\n relativeYPosition * height\n )\n \n return result\n \n }\n \n \n /**\n * Returns a rectangle with a maximum width constraint\n * If current width exceeds max, centers the constrained width\n */\n rectangleWithMaxWidth(maxWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width <= maxWidth) {\n return this.copy()\n }\n return this.rectangleWithWidth(maxWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with a maximum height constraint\n */\n rectangleWithMaxHeight(maxHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height <= maxHeight) {\n return this.copy()\n }\n return this.rectangleWithHeight(maxHeight, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum width constraint\n */\n rectangleWithMinWidth(minWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width >= minWidth) {\n return this.copy()\n }\n return this.rectangleWithWidth(minWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum height constraint\n */\n rectangleWithMinHeight(minHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height >= minHeight) {\n return this.copy()\n }\n return this.rectangleWithHeight(minHeight, centeredOnPosition)\n }\n \n // Returns a new rectangle that is positioned relative to the reference rectangle\n // By default, it makes a copy of this rectangle taht is centered in the target rectangle\n rectangleByCenteringInRectangle(referenceRectangle: UIRectangle, xPosition = 0.5, yPosition = 0.5) {\n const result = this.copy()\n result.center = referenceRectangle.topLeft\n .pointByAddingX(xPosition * referenceRectangle.width)\n .pointByAddingY(yPosition * referenceRectangle.height)\n return result\n }\n \n \n rectanglesBySplittingWidth(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as any[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(weights.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n weights = weights.map(weight => this._widthNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteWidths as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteWidths = (absoluteWidths as number[]).summedValue\n const totalRelativeWidth = this.width - sumOfPaddings - sumOfAbsoluteWidths\n let previousCellMaxX = this.x\n \n for (let i = 0; i < weights.length; i++) {\n \n let resultWidth: number\n if (IS_NOT_NIL(absoluteWidths[i])) {\n resultWidth = (absoluteWidths[i] || 0) as number\n }\n else {\n resultWidth = totalRelativeWidth * (weights[i] as number / sumOfWeights)\n }\n \n const rectangle = this.rectangleWithWidth(resultWidth)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.x = previousCellMaxX\n previousCellMaxX = rectangle.max.x + padding\n result.push(rectangle)\n \n }\n \n return result\n \n }\n \n rectanglesBySplittingHeight(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as number[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(weights.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n weights = weights.map(weight => this._heightNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteHeights as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteHeights = (absoluteHeights as number[]).summedValue\n const totalRelativeHeight = this.height - sumOfPaddings - sumOfAbsoluteHeights\n let previousCellMaxY = this.y\n \n for (let i = 0; i < weights.length; i++) {\n let resultHeight: number\n if (IS_NOT_NIL(absoluteHeights[i])) {\n \n resultHeight = (absoluteHeights[i] || 0) as number\n \n }\n else {\n \n resultHeight = totalRelativeHeight * (weights[i] as number / sumOfWeights)\n \n }\n \n const rectangle = this.rectangleWithHeight(resultHeight)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.y = previousCellMaxY\n previousCellMaxY = rectangle.max.y + padding\n //rectangle = rectangle.rectangleWithInsets(0, 0, padding, 0);\n result.push(rectangle)\n }\n \n return result\n \n }\n \n \n rectanglesByEquallySplittingWidth(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultWidth = (this.width - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithWidth(resultWidth, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n rectanglesByEquallySplittingHeight(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultHeight = (this.height - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithHeight(resultHeight, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n \n distributeViewsAlongWidth(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteWidths?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingWidth(weights, paddings, absoluteWidths)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n distributeViewsAlongHeight(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteHeights?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingHeight(weights, paddings, absoluteHeights)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n \n distributeViewsEquallyAlongWidth(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingWidth(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n distributeViewsEquallyAlongHeight(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingHeight(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n \n _heightNumberFromSizeNumberOrFunctionOrView(height: SizeNumberOrFunctionOrView) {\n if (height instanceof Function) {\n return height(this.width)\n }\n if (height instanceof UIView) {\n return height.intrinsicContentHeight(this.width)\n }\n return height\n }\n \n _widthNumberFromSizeNumberOrFunctionOrView(width: SizeNumberOrFunctionOrView) {\n if (width instanceof Function) {\n return width(this.height)\n }\n if (width instanceof UIView) {\n return width.intrinsicContentWidth(this.height)\n }\n return width\n }\n \n rectangleForNextRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.max.y + padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForNextColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.max.x + padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n }\n \n rectangleForPreviousRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.min.y - heightNumber - padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForPreviousColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.min.x - widthNumber - padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n \n }\n \n /**\n * Distributes views vertically as a column, assigning frames and returning them.\n * Each view is positioned below the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for views (overrides intrinsic height)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsColumn(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.copy()\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithHeight(views[i])\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n frame.height = absoluteHeights[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextRow(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views horizontally as a row, assigning frames and returning them.\n * Each view is positioned to the right of the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteWidths - Optional fixed widths for views (overrides intrinsic width)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsRow(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.copy()\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(views.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithWidth(views[i])\n \n if (IS_NOT_NIL(absoluteWidths[i])) {\n frame.width = absoluteWidths[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextColumn(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views as a grid (2D array), assigning frames and returning them.\n * The first index represents rows (vertical), the second index represents columns (horizontal).\n * Example: views[0] is the first row, views[0][0] is the first column in the first row.\n * Each row is laid out horizontally, and rows are stacked vertically.\n * @param views - 2D array where views[row][column] represents the grid structure\n * @param paddings - Vertical padding between rows (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for each row (overrides intrinsic height)\n * @returns 2D array of rectangles where frames[row][column] matches views[row][column]\n */\n framesByDistributingViewsAsGrid(\n views: UIView[][],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[][] = []\n let currentRowRectangle = this.copy()\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const rowViews = views[i]\n const rowFrames = currentRowRectangle.framesByDistributingViewsAsRow(rowViews)\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n const heightNumber = absoluteHeights[i] as number\n rowFrames.forEach((frame, j) => {\n frame.height = heightNumber\n rowViews[j].frame = frame\n })\n }\n \n frames.push(rowFrames)\n \n const padding = (paddings[i] || 0) as number\n const maxHeight = Math.max(...rowFrames.map(f => f.height))\n currentRowRectangle = currentRowRectangle.rectangleForNextRow(padding, maxHeight)\n }\n \n return frames\n }\n \n rectangleWithIntrinsicContentSizeForView(view: UIView, centeredOnXPosition = 0, centeredOnYPosition = 0) {\n const intrinsicContentSize = view.intrinsicContentSize()\n return this.rectangleWithHeight(intrinsicContentSize.height, centeredOnYPosition)\n .rectangleWithWidth(intrinsicContentSize.width, centeredOnXPosition)\n }\n \n settingMinHeight(minHeight?: number) {\n this.minHeight = minHeight\n return this\n }\n \n settingMinWidth(minWidth?: number) {\n this.minWidth = minWidth\n return this\n }\n \n settingMaxHeight(maxHeight?: number) {\n this.maxHeight = maxHeight\n return this\n }\n \n settingMaxWidth(maxWidth?: number) {\n this.maxWidth = maxWidth\n return this\n }\n \n rectangleByEnforcingMinAndMaxSizes(centeredOnXPosition = 0, centeredOnYPosition = 0) {\n return this.rectangleWithHeight(\n [\n [this.height, this.maxHeight].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minHeight\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnYPosition\n ).rectangleWithWidth(\n [\n [this.width, this.maxWidth].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minWidth\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnXPosition\n )\n }\n \n \n assignedAsFrameOfView(view: UIView) {\n view.frame = this\n return this\n }\n \n \n override toString() {\n \n const result = \"[\" + this.class.name + \"] { x: \" + this.x + \", y: \" + this.y + \", \" +\n \"height: \" + this.height.toFixed(2) + \", width: \" + this.height.toFixed(2) + \" }\"\n \n return result\n \n }\n \n get [Symbol.toStringTag]() {\n return this.toString()\n }\n \n \n IF(condition: boolean): UIRectangleConditionalChain<UIRectangle> {\n const conditionalBlock = new UIRectangleConditionalBlock(this, condition)\n // @ts-ignore\n return conditionalBlock.getProxy()\n }\n \n // These will be intercepted by the proxy, but we define them for TypeScript\n ELSE_IF(condition: boolean): UIRectangle {\n return this\n }\n \n ELSE(): UIRectangle {\n return this\n }\n \n ENDIF(): this\n ENDIF<T, R>(performFunction: (result: T) => R): R\n ENDIF<T, R>(performFunction?: (result: T) => R): R | this {\n if (performFunction) {\n return performFunction(this as any)\n }\n return this\n }\n \n \n // Bounding box\n static boundingBoxForPoints(points: UIPoint[]) {\n const result = new UIRectangle()\n for (let i = 0; i < points.length; i++) {\n result.updateByAddingPoint(points[i])\n }\n return result\n }\n \n static boundingBoxForRectanglesAndPoints(rectanglesAndPoints: (UIPoint | UIRectangle)[]) {\n const result = new UIRectangle()\n for (let i = 0; i < rectanglesAndPoints.length; i++) {\n const rectangleOrPoint = rectanglesAndPoints[i]\n if (rectangleOrPoint instanceof UIRectangle) {\n result.updateByAddingPoint(rectangleOrPoint.min)\n result.updateByAddingPoint(rectangleOrPoint.max)\n }\n else {\n result.updateByAddingPoint(rectangleOrPoint)\n }\n }\n return result\n }\n \n \n beginUpdates() {\n this._isBeingUpdated = YES\n }\n \n finishUpdates() {\n this._isBeingUpdated = NO\n this.didChange()\n }\n \n \n didChange() {\n \n // Callback to be set by delegate\n \n }\n \n _rectanglePointDidChange() {\n if (!this._isBeingUpdated) {\n this.didChange()\n }\n }\n \n \n}\n\n\n// 1. Methods available when holding a UIRectangle\ntype RectangleChainMethods<TResult> = {\n [K in keyof UIRectangle as (\n K extends 'IF' | 'ELSE' | 'ELSE_IF' | 'ENDIF' ? never : K\n )]:\n UIRectangle[K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle | UIRectangle[]\n // CHANGE: We do NOT add 'R' to 'TResult' here. We only update the current state (R).\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult>\n : never\n : never\n};\n\n// 2. Methods available when holding a UIRectangle[]\ntype ArrayChainMethods<TResult> = {\n [K in keyof UIRectangle[]]:\n UIRectangle[][K] extends UIRectangle\n ? UIRectangleConditionalChain<UIRectangle, TResult> // No accumulation for properties\n : UIRectangle[][K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle | UIRectangle[]\n // CHANGE: We do NOT add 'R' to 'TResult' here either.\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult>\n : never\n : never\n};\n\n// 3. Methods available in both states (Control Flow + Transform)\ntype SharedChainMethods<TCurrent, TResult> = {\n // TRANSFORM acts as a standard method, it should not leak intermediate types into TResult\n TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult>;\n \n // ELSE_IF marks the end of a branch. We MUST capture the current state (TCurrent) and add it to TResult.\n // The new chain starts with the original UIRectangle state for the next branch.\n ELSE_IF(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;\n \n // ELSE marks the end of a branch. Same logic as ELSE_IF.\n ELSE(): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;\n \n // ENDIF marks the end of the block. Same logic: capture TCurrent into TResult.\n ENDIF(): TResult | TCurrent;\n ENDIF<R>(performFunction: (result: TResult | TCurrent) => R): R;\n};\n\n// 4. The Main Type (No changes needed here, just re-stating for context)\ntype UIRectangleConditionalChain<TCurrent, TResult = TCurrent> =\n (TCurrent extends UIRectangle ? RectangleChainMethods<TResult> : {}) &\n (TCurrent extends UIRectangle[] ? ArrayChainMethods<TResult> : {}) &\n SharedChainMethods<TCurrent, TResult>;\n\n\nclass UIRectangleConditionalBlock {\n // The value we are currently chaining on (can be UIRectangle or UIRectangle[])\n private currentResult: any\n // The value where the IF block started (needed to reset for ELSE branches)\n private originalResult: any\n private conditionMet: boolean\n \n constructor(initialResult: UIRectangle, condition: boolean) {\n this.originalResult = initialResult\n this.currentResult = initialResult\n this.conditionMet = condition\n }\n \n private createProxy(): UIRectangleConditionalChain<any, any> {\n const self = this\n \n // The target is irrelevant; we delegate everything to self.currentResult\n return new Proxy({}, {\n get(_, prop) {\n \n // 1. Control Flow Methods\n \n if (prop === 'TRANSFORM') {\n return <R extends UIRectangle>(fn: (current: any) => R) => {\n if (self.conditionMet) {\n const result = fn(self.currentResult)\n self.currentResult = result\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ELSE_IF') {\n return <U>(condition: boolean) => {\n // Only enter this branch if no previous branch has run\n if (!self.conditionMet) {\n self.conditionMet = condition\n // Reset the state to the original starting point for this new branch\n self.currentResult = self.originalResult\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ELSE') {\n return <U>() => {\n if (!self.conditionMet) {\n self.conditionMet = true\n // Reset the state to the original starting point\n self.currentResult = self.originalResult\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ENDIF') {\n function endif(): any\n function endif<R>(performFunction: (result: any) => R): R\n function endif<R>(performFunction?: (result: any) => R): R | any {\n return performFunction ? performFunction(self.currentResult) : self.currentResult\n }\n return endif\n }\n \n // 2. Forwarding to currentResult (Rectangle or Array)\n \n const value = self.currentResult[prop]\n \n // Case A: It's a function (method call)\n if (typeof value === 'function') {\n return (...args: any[]) => {\n if (self.conditionMet) {\n // Call the method on the CURRENT object, and update the state\n const result = value.apply(self.currentResult, args)\n self.currentResult = result\n }\n return self.createProxy()\n }\n }\n \n // Case B: It's a property (getter)\n // Accessing a property acts as a transition (e.g. accessing .lastElement)\n if (self.conditionMet) {\n self.currentResult = value\n }\n \n return self.createProxy()\n }\n }) as any\n }\n \n getProxy(): UIRectangleConditionalChain<any, any> {\n return this.createProxy()\n }\n \n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["endif"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uicore-ts",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.116",
|
|
4
4
|
"description": "UICore is a library to build native-like user interfaces using pure Typescript. No HTML is needed at all. Components are described as TS classes and all user interactions are handled explicitly. This library is strongly inspired by the UIKit framework that is used in IOS. In addition, UICore has tools to handle URL based routing, array sorting and filtering and adds a number of other utilities for convenience.",
|
|
5
5
|
"main": "compiledScripts/index.js",
|
|
6
6
|
"types": "compiledScripts/index.d.ts",
|
package/scripts/UIRectangle.ts
CHANGED
|
@@ -1016,13 +1016,12 @@ export class UIRectangle extends UIObject {
|
|
|
1016
1016
|
// 1. Methods available when holding a UIRectangle
|
|
1017
1017
|
type RectangleChainMethods<TResult> = {
|
|
1018
1018
|
[K in keyof UIRectangle as (
|
|
1019
|
-
// Exclude IF to prevent circular reference TS2615
|
|
1020
|
-
// Exclude Control Flow keys as they are handled in SharedChainMethods
|
|
1021
1019
|
K extends 'IF' | 'ELSE' | 'ELSE_IF' | 'ENDIF' ? never : K
|
|
1022
1020
|
)]:
|
|
1023
1021
|
UIRectangle[K] extends (...args: infer Args) => infer R
|
|
1024
|
-
? R extends UIRectangle | UIRectangle[]
|
|
1025
|
-
|
|
1022
|
+
? R extends UIRectangle | UIRectangle[]
|
|
1023
|
+
// CHANGE: We do NOT add 'R' to 'TResult' here. We only update the current state (R).
|
|
1024
|
+
? (...args: Args) => UIRectangleConditionalChain<R, TResult>
|
|
1026
1025
|
: never
|
|
1027
1026
|
: never
|
|
1028
1027
|
};
|
|
@@ -1030,68 +1029,67 @@ type RectangleChainMethods<TResult> = {
|
|
|
1030
1029
|
// 2. Methods available when holding a UIRectangle[]
|
|
1031
1030
|
type ArrayChainMethods<TResult> = {
|
|
1032
1031
|
[K in keyof UIRectangle[]]:
|
|
1033
|
-
// Case 1: It is a property (getter) that returns a UIRectangle
|
|
1034
1032
|
UIRectangle[][K] extends UIRectangle
|
|
1035
|
-
? UIRectangleConditionalChain<UIRectangle, TResult
|
|
1036
|
-
// Case 2: It is a function that returns a UIRectangle
|
|
1033
|
+
? UIRectangleConditionalChain<UIRectangle, TResult> // No accumulation for properties
|
|
1037
1034
|
: UIRectangle[][K] extends (...args: infer Args) => infer R
|
|
1038
|
-
? R extends UIRectangle
|
|
1039
|
-
|
|
1035
|
+
? R extends UIRectangle | UIRectangle[]
|
|
1036
|
+
// CHANGE: We do NOT add 'R' to 'TResult' here either.
|
|
1037
|
+
? (...args: Args) => UIRectangleConditionalChain<R, TResult>
|
|
1040
1038
|
: never
|
|
1041
1039
|
: never
|
|
1042
1040
|
};
|
|
1043
1041
|
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
1042
|
// 3. Methods available in both states (Control Flow + Transform)
|
|
1047
1043
|
type SharedChainMethods<TCurrent, TResult> = {
|
|
1048
|
-
// TRANSFORM
|
|
1049
|
-
TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult
|
|
1044
|
+
// TRANSFORM acts as a standard method, it should not leak intermediate types into TResult
|
|
1045
|
+
TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult>;
|
|
1046
|
+
|
|
1047
|
+
// ELSE_IF marks the end of a branch. We MUST capture the current state (TCurrent) and add it to TResult.
|
|
1048
|
+
// The new chain starts with the original UIRectangle state for the next branch.
|
|
1049
|
+
ELSE_IF(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;
|
|
1050
1050
|
|
|
1051
|
-
//
|
|
1052
|
-
|
|
1053
|
-
ELSE<U>(): UIRectangleConditionalChain<UIRectangle, TResult | U>;
|
|
1051
|
+
// ELSE marks the end of a branch. Same logic as ELSE_IF.
|
|
1052
|
+
ELSE(): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;
|
|
1054
1053
|
|
|
1055
|
-
// ENDIF
|
|
1056
|
-
ENDIF(): TResult;
|
|
1057
|
-
ENDIF<R>(performFunction: (result: TResult) => R): R;
|
|
1054
|
+
// ENDIF marks the end of the block. Same logic: capture TCurrent into TResult.
|
|
1055
|
+
ENDIF(): TResult | TCurrent;
|
|
1056
|
+
ENDIF<R>(performFunction: (result: TResult | TCurrent) => R): R;
|
|
1058
1057
|
};
|
|
1059
1058
|
|
|
1060
|
-
// 4. The Main Type
|
|
1061
|
-
// Conditionally combines the specific methods based on TCurrent, plus the shared methods
|
|
1059
|
+
// 4. The Main Type (No changes needed here, just re-stating for context)
|
|
1062
1060
|
type UIRectangleConditionalChain<TCurrent, TResult = TCurrent> =
|
|
1063
|
-
// Use {} instead of never to avoid collapsing the intersection to 'never'
|
|
1064
1061
|
(TCurrent extends UIRectangle ? RectangleChainMethods<TResult> : {}) &
|
|
1065
1062
|
(TCurrent extends UIRectangle[] ? ArrayChainMethods<TResult> : {}) &
|
|
1066
1063
|
SharedChainMethods<TCurrent, TResult>;
|
|
1067
1064
|
|
|
1068
1065
|
|
|
1069
1066
|
class UIRectangleConditionalBlock {
|
|
1070
|
-
|
|
1071
|
-
private conditionMet: boolean
|
|
1072
|
-
private branchHasExecuted: boolean = false
|
|
1067
|
+
// The value we are currently chaining on (can be UIRectangle or UIRectangle[])
|
|
1073
1068
|
private currentResult: any
|
|
1069
|
+
// The value where the IF block started (needed to reset for ELSE branches)
|
|
1070
|
+
private originalResult: any
|
|
1071
|
+
private conditionMet: boolean
|
|
1074
1072
|
|
|
1075
|
-
constructor(
|
|
1076
|
-
this.
|
|
1073
|
+
constructor(initialResult: UIRectangle, condition: boolean) {
|
|
1074
|
+
this.originalResult = initialResult
|
|
1075
|
+
this.currentResult = initialResult
|
|
1077
1076
|
this.conditionMet = condition
|
|
1078
|
-
this.currentResult = initialResult ?? rectangle
|
|
1079
1077
|
}
|
|
1080
1078
|
|
|
1081
1079
|
private createProxy(): UIRectangleConditionalChain<any, any> {
|
|
1082
1080
|
const self = this
|
|
1083
|
-
|
|
1084
|
-
|
|
1081
|
+
|
|
1082
|
+
// The target is irrelevant; we delegate everything to self.currentResult
|
|
1083
|
+
return new Proxy({}, {
|
|
1084
|
+
get(_, prop) {
|
|
1085
|
+
|
|
1086
|
+
// 1. Control Flow Methods
|
|
1085
1087
|
|
|
1086
|
-
// 1. Handle Control Flow Methods
|
|
1087
1088
|
if (prop === 'TRANSFORM') {
|
|
1088
1089
|
return <R extends UIRectangle>(fn: (current: any) => R) => {
|
|
1089
1090
|
if (self.conditionMet) {
|
|
1090
1091
|
const result = fn(self.currentResult)
|
|
1091
1092
|
self.currentResult = result
|
|
1092
|
-
if (result instanceof UIRectangle) {
|
|
1093
|
-
self.parentRectangle = result
|
|
1094
|
-
}
|
|
1095
1093
|
}
|
|
1096
1094
|
return self.createProxy()
|
|
1097
1095
|
}
|
|
@@ -1099,31 +1097,24 @@ class UIRectangleConditionalBlock {
|
|
|
1099
1097
|
|
|
1100
1098
|
if (prop === 'ELSE_IF') {
|
|
1101
1099
|
return <U>(condition: boolean) => {
|
|
1102
|
-
if
|
|
1100
|
+
// Only enter this branch if no previous branch has run
|
|
1101
|
+
if (!self.conditionMet) {
|
|
1103
1102
|
self.conditionMet = condition
|
|
1103
|
+
// Reset the state to the original starting point for this new branch
|
|
1104
|
+
self.currentResult = self.originalResult
|
|
1104
1105
|
}
|
|
1105
|
-
|
|
1106
|
-
self.parentRectangle,
|
|
1107
|
-
self.conditionMet,
|
|
1108
|
-
self.currentResult
|
|
1109
|
-
)
|
|
1110
|
-
newBlock.branchHasExecuted = self.branchHasExecuted
|
|
1111
|
-
return newBlock.createProxy()
|
|
1106
|
+
return self.createProxy()
|
|
1112
1107
|
}
|
|
1113
1108
|
}
|
|
1114
1109
|
|
|
1115
1110
|
if (prop === 'ELSE') {
|
|
1116
1111
|
return <U>() => {
|
|
1117
|
-
if (!self.
|
|
1112
|
+
if (!self.conditionMet) {
|
|
1118
1113
|
self.conditionMet = true
|
|
1114
|
+
// Reset the state to the original starting point
|
|
1115
|
+
self.currentResult = self.originalResult
|
|
1119
1116
|
}
|
|
1120
|
-
|
|
1121
|
-
self.parentRectangle,
|
|
1122
|
-
self.conditionMet,
|
|
1123
|
-
self.currentResult
|
|
1124
|
-
)
|
|
1125
|
-
newBlock.branchHasExecuted = self.branchHasExecuted
|
|
1126
|
-
return newBlock.createProxy()
|
|
1117
|
+
return self.createProxy()
|
|
1127
1118
|
}
|
|
1128
1119
|
}
|
|
1129
1120
|
|
|
@@ -1131,77 +1122,34 @@ class UIRectangleConditionalBlock {
|
|
|
1131
1122
|
function endif(): any
|
|
1132
1123
|
function endif<R>(performFunction: (result: any) => R): R
|
|
1133
1124
|
function endif<R>(performFunction?: (result: any) => R): R | any {
|
|
1134
|
-
|
|
1135
|
-
return performFunction(self.currentResult)
|
|
1136
|
-
}
|
|
1137
|
-
return self.currentResult
|
|
1125
|
+
return performFunction ? performFunction(self.currentResult) : self.currentResult
|
|
1138
1126
|
}
|
|
1139
1127
|
return endif
|
|
1140
1128
|
}
|
|
1141
1129
|
|
|
1142
|
-
// 2.
|
|
1143
|
-
|
|
1130
|
+
// 2. Forwarding to currentResult (Rectangle or Array)
|
|
1131
|
+
|
|
1132
|
+
const value = self.currentResult[prop]
|
|
1144
1133
|
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
if (self.conditionMet) {
|
|
1153
|
-
if (!self.branchHasExecuted) self.branchHasExecuted = true
|
|
1154
|
-
const result = descriptor.value.apply(array, args)
|
|
1155
|
-
self.currentResult = result
|
|
1156
|
-
if (result instanceof UIRectangle) {
|
|
1157
|
-
self.parentRectangle = result
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
return self.createProxy()
|
|
1134
|
+
// Case A: It's a function (method call)
|
|
1135
|
+
if (typeof value === 'function') {
|
|
1136
|
+
return (...args: any[]) => {
|
|
1137
|
+
if (self.conditionMet) {
|
|
1138
|
+
// Call the method on the CURRENT object, and update the state
|
|
1139
|
+
const result = value.apply(self.currentResult, args)
|
|
1140
|
+
self.currentResult = result
|
|
1161
1141
|
}
|
|
1142
|
+
return self.createProxy()
|
|
1162
1143
|
}
|
|
1163
|
-
|
|
1164
|
-
// Case B: It's a getter/property on the Array prototype (e.g., lastElement)
|
|
1165
|
-
// We access the value on the array instance
|
|
1166
|
-
const value = array[prop]
|
|
1167
|
-
|
|
1168
|
-
if (value instanceof UIRectangle) {
|
|
1169
|
-
// Special handling: If accessing a property that is a UIRectangle,
|
|
1170
|
-
// we treat it as a transition to keep the chain alive.
|
|
1171
|
-
return (() => {
|
|
1172
|
-
if (self.conditionMet) {
|
|
1173
|
-
if (!self.branchHasExecuted) self.branchHasExecuted = true
|
|
1174
|
-
self.currentResult = value
|
|
1175
|
-
self.parentRectangle = value
|
|
1176
|
-
}
|
|
1177
|
-
return self.createProxy()
|
|
1178
|
-
})()
|
|
1179
|
-
}
|
|
1180
|
-
|
|
1181
|
-
// Case C: Other properties (like 'length', 'map', etc) -> Return raw value
|
|
1182
|
-
// This breaks the chain, which is expected behavior for non-Rectangle properties
|
|
1183
|
-
return value
|
|
1184
1144
|
}
|
|
1185
1145
|
|
|
1186
|
-
//
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
return (...args: any[]) => {
|
|
1191
|
-
if (self.conditionMet) {
|
|
1192
|
-
if (!self.branchHasExecuted) self.branchHasExecuted = true
|
|
1193
|
-
const result = (value as Function).apply(target, args)
|
|
1194
|
-
self.currentResult = result
|
|
1195
|
-
if (result instanceof UIRectangle) {
|
|
1196
|
-
self.parentRectangle = result
|
|
1197
|
-
}
|
|
1198
|
-
}
|
|
1199
|
-
return self.createProxy()
|
|
1200
|
-
}
|
|
1201
|
-
}
|
|
1146
|
+
// Case B: It's a property (getter)
|
|
1147
|
+
// Accessing a property acts as a transition (e.g. accessing .lastElement)
|
|
1148
|
+
if (self.conditionMet) {
|
|
1149
|
+
self.currentResult = value
|
|
1202
1150
|
}
|
|
1203
1151
|
|
|
1204
|
-
return (
|
|
1152
|
+
return self.createProxy()
|
|
1205
1153
|
}
|
|
1206
1154
|
}) as any
|
|
1207
1155
|
}
|
|
@@ -1209,6 +1157,7 @@ class UIRectangleConditionalBlock {
|
|
|
1209
1157
|
getProxy(): UIRectangleConditionalChain<any, any> {
|
|
1210
1158
|
return this.createProxy()
|
|
1211
1159
|
}
|
|
1160
|
+
|
|
1212
1161
|
}
|
|
1213
1162
|
|
|
1214
1163
|
|