@effect-tui/react 0.2.1 → 0.2.2

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.
@@ -5,24 +5,61 @@ import { crossDim, crossPos, crossSize, mainDim, mainPos, mainSize, makeRect } f
5
5
  /**
6
6
  * Measure children along a flex axis.
7
7
  * Returns cached sizes and total size.
8
+ *
9
+ * SwiftUI-style measure:
10
+ * 1. First measure all non-greedy children with full available space
11
+ * 2. Then measure greedy children with remaining space
12
+ *
13
+ * This ensures non-greedy elements always get their natural size,
14
+ * even when sibling greedy elements have large content.
8
15
  */
9
16
  export function measureFlex(axis, children, spacing, maxMain, maxCross) {
10
- const sizes = [];
11
- let totalMain = 0;
17
+ const sizes = new Array(children.length);
12
18
  let maxChildCross = 0;
19
+ const totalSpacing = Math.max(0, (children.length - 1) * spacing);
20
+ // Pass 1: Measure non-greedy children first with full available space
21
+ let nonGreedyTotal = 0;
13
22
  for (let i = 0; i < children.length; i++) {
14
23
  const child = children[i];
15
- const remainingMain = Math.max(0, maxMain - totalMain);
16
- // Convert main/cross back to width/height for child measure
17
- const childMaxW = axis === "vertical" ? maxCross : remainingMain;
18
- const childMaxH = axis === "vertical" ? remainingMain : maxCross;
19
- const size = child.measure(childMaxW, childMaxH);
20
- sizes.push(size);
21
- totalMain += mainSize(axis, size);
22
- if (i < children.length - 1)
23
- totalMain += spacing;
24
- maxChildCross = Math.max(maxChildCross, crossSize(axis, size));
24
+ const greedyWeight = getGreedyWeight(child);
25
+ if (greedyWeight === 0) {
26
+ // Non-greedy: measure with full available space
27
+ const childMaxW = axis === "vertical" ? maxCross : maxMain;
28
+ const childMaxH = axis === "vertical" ? maxMain : maxCross;
29
+ const size = child.measure(childMaxW, childMaxH);
30
+ sizes[i] = size;
31
+ nonGreedyTotal += mainSize(axis, size);
32
+ maxChildCross = Math.max(maxChildCross, crossSize(axis, size));
33
+ }
34
+ }
35
+ // Pass 2: Measure greedy children with remaining space
36
+ const remainingForGreedy = Math.max(0, maxMain - nonGreedyTotal - totalSpacing);
37
+ let totalGreedyWeight = 0;
38
+ for (let i = 0; i < children.length; i++) {
39
+ const greedyWeight = getGreedyWeight(children[i]);
40
+ if (greedyWeight > 0)
41
+ totalGreedyWeight += greedyWeight;
25
42
  }
43
+ let greedyMeasuredTotal = 0;
44
+ for (let i = 0; i < children.length; i++) {
45
+ const child = children[i];
46
+ const greedyWeight = getGreedyWeight(child);
47
+ if (greedyWeight > 0) {
48
+ // Greedy: measure with proportional share of remaining space
49
+ const greedyMain = totalGreedyWeight > 0
50
+ ? (remainingForGreedy * greedyWeight) / totalGreedyWeight
51
+ : remainingForGreedy;
52
+ const childMaxW = axis === "vertical" ? maxCross : greedyMain;
53
+ const childMaxH = axis === "vertical" ? greedyMain : maxCross;
54
+ const size = child.measure(childMaxW, childMaxH);
55
+ sizes[i] = size;
56
+ greedyMeasuredTotal += mainSize(axis, size);
57
+ maxChildCross = Math.max(maxChildCross, crossSize(axis, size));
58
+ }
59
+ }
60
+ // Calculate total main dimension
61
+ // Use actual measured sizes, not the constraint
62
+ let totalMain = nonGreedyTotal + greedyMeasuredTotal + totalSpacing;
26
63
  // Build total size from main/cross dimensions
27
64
  const totalW = axis === "vertical" ? maxChildCross : totalMain;
28
65
  const totalH = axis === "vertical" ? totalMain : maxChildCross;
@@ -45,22 +82,33 @@ function getGreedyWeight(child) {
45
82
  }
46
83
  /**
47
84
  * Layout children along a flex axis using cached sizes.
85
+ *
86
+ * SwiftUI-style layout:
87
+ * 1. Non-greedy children get their natural (measured) size
88
+ * 2. Greedy children share the REMAINING space proportionally
89
+ *
90
+ * This ensures non-greedy elements (like footers) are always visible,
91
+ * even when greedy elements (like scroll views) have overflowing content.
48
92
  */
49
93
  export function layoutFlex(axis, children, cachedSizes, rect, spacing, alignment, stretchCross) {
50
- // Calculate totals
51
- let totalNaturalMain = 0;
52
- let totalGreedyWeight = 0;
53
94
  const totalSpacing = Math.max(0, (children.length - 1) * spacing);
95
+ const availableMain = mainDim(axis, rect);
96
+ // Pass 1: Calculate space needed by non-greedy children
97
+ let nonGreedyTotal = 0;
98
+ let totalGreedyWeight = 0;
54
99
  for (let i = 0; i < children.length; i++) {
55
100
  const child = children[i];
56
101
  const size = cachedSizes[i] ?? child.measure(rect.w, rect.h);
57
- totalNaturalMain += mainSize(axis, size);
58
- totalGreedyWeight += getGreedyWeight(child);
102
+ const greedyWeight = getGreedyWeight(child);
103
+ if (greedyWeight === 0) {
104
+ // Non-greedy: use natural size
105
+ nonGreedyTotal += mainSize(axis, size);
106
+ }
107
+ totalGreedyWeight += greedyWeight;
59
108
  }
60
- // Calculate extra space to distribute to greedy children
61
- const availableMain = mainDim(axis, rect);
62
- const extraSpace = Math.max(0, availableMain - totalNaturalMain - totalSpacing);
63
- // Layout children
109
+ // Remaining space for greedy children (after non-greedy + spacing)
110
+ const remainingForGreedy = Math.max(0, availableMain - nonGreedyTotal - totalSpacing);
111
+ // Pass 2: Layout all children
64
112
  let curMainPos = mainPos(axis, rect);
65
113
  const crossStartPos = crossPos(axis, rect);
66
114
  const crossDimVal = crossDim(axis, rect);
@@ -68,8 +116,15 @@ export function layoutFlex(axis, children, cachedSizes, rect, spacing, alignment
68
116
  const child = children[i];
69
117
  const size = cachedSizes[i] ?? { w: 0, h: 0 };
70
118
  const greedyWeight = getGreedyWeight(child);
71
- const greedyExtra = totalGreedyWeight > 0 ? (extraSpace * greedyWeight) / totalGreedyWeight : 0;
72
- const childMainDim = mainSize(axis, size) + greedyExtra;
119
+ let childMainDim;
120
+ if (greedyWeight > 0 && totalGreedyWeight > 0) {
121
+ // Greedy: gets proportional share of remaining space
122
+ childMainDim = (remainingForGreedy * greedyWeight) / totalGreedyWeight;
123
+ }
124
+ else {
125
+ // Non-greedy: gets natural size
126
+ childMainDim = mainSize(axis, size);
127
+ }
73
128
  const childCrossDim = crossSize(axis, size);
74
129
  // Calculate cross position based on alignment
75
130
  let curCrossPos = crossStartPos;
@@ -1 +1 @@
1
- {"version":3,"file":"flex-layout.js","sourceRoot":"","sources":["../../../src/utils/flex-layout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flex-layout.js","sourceRoot":"","sources":["../../../src/utils/flex-layout.ts"],"names":[],"mappings":"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"}