( sizes: number[], availableForPanels: number, minSizes?: readonly number[], maxSizes?: readonly number[], )
| 23 | }>; |
| 24 | |
| 25 | function normalizePanelCellSizes( |
| 26 | sizes: number[], |
| 27 | availableForPanels: number, |
| 28 | minSizes?: readonly number[], |
| 29 | maxSizes?: readonly number[], |
| 30 | ): void { |
| 31 | // Apply min/max constraints |
| 32 | for (let i = 0; i < sizes.length; i++) { |
| 33 | const minSize = minSizes?.[i] ?? 0; |
| 34 | const maxSize = maxSizes?.[i] ?? availableForPanels; |
| 35 | const size = sizes[i] ?? 0; |
| 36 | sizes[i] = Math.max(minSize, Math.min(maxSize, size)); |
| 37 | } |
| 38 | |
| 39 | // Distribute remainder / shrink overshoot to fit available space |
| 40 | const totalSize = sizes.reduce((a, b) => a + (b ?? 0), 0); |
| 41 | const remainder = availableForPanels - totalSize; |
| 42 | if (remainder > 0) { |
| 43 | let r = remainder; |
| 44 | while (r > 0) { |
| 45 | let progressed = false; |
| 46 | for (let i = 0; i < sizes.length && r > 0; i++) { |
| 47 | const currentSize = sizes[i] ?? 0; |
| 48 | const maxSize = maxSizes?.[i] ?? availableForPanels; |
| 49 | if (currentSize < maxSize) { |
| 50 | sizes[i] = currentSize + 1; |
| 51 | r--; |
| 52 | progressed = true; |
| 53 | } |
| 54 | } |
| 55 | if (!progressed) break; |
| 56 | } |
| 57 | } else if (remainder < 0) { |
| 58 | let overshoot = -remainder; |
| 59 | |
| 60 | // First pass: shrink but respect minSizes. |
| 61 | for (let i = sizes.length - 1; i >= 0 && overshoot > 0; i--) { |
| 62 | const currentSize = sizes[i] ?? 0; |
| 63 | const minSize = minSizes?.[i] ?? 0; |
| 64 | const canReduce = Math.max(0, currentSize - minSize); |
| 65 | if (canReduce === 0) continue; |
| 66 | const delta = Math.min(overshoot, canReduce); |
| 67 | sizes[i] = currentSize - delta; |
| 68 | overshoot -= delta; |
| 69 | } |
| 70 | |
| 71 | // Second pass: if constraints are impossible (sum(minSizes) > available), shrink below mins down to 0. |
| 72 | for (let i = sizes.length - 1; i >= 0 && overshoot > 0; i--) { |
| 73 | const currentSize = sizes[i] ?? 0; |
| 74 | const canReduce = Math.max(0, currentSize); |
| 75 | if (canReduce === 0) continue; |
| 76 | const delta = Math.min(overshoot, canReduce); |
| 77 | sizes[i] = currentSize - delta; |
| 78 | overshoot -= delta; |
| 79 | } |
| 80 | } |
| 81 | } |
| 82 |
no outgoing calls
no test coverage detected