( sizes: readonly number[], index: number, targetSize: number, )
| 302 | * @returns Updated sizes with expanded panel |
| 303 | */ |
| 304 | export function expandPanel( |
| 305 | sizes: readonly number[], |
| 306 | index: number, |
| 307 | targetSize: number, |
| 308 | ): readonly number[] { |
| 309 | if (index < 0 || index >= sizes.length) { |
| 310 | return sizes; |
| 311 | } |
| 312 | |
| 313 | const newSizes = [...sizes]; |
| 314 | const currentSize = sizes[index] ?? 0; |
| 315 | const delta = targetSize - currentSize; |
| 316 | |
| 317 | if (delta <= 0) { |
| 318 | return sizes; |
| 319 | } |
| 320 | |
| 321 | let taken = 0; |
| 322 | |
| 323 | // Take space from adjacent panels |
| 324 | if (index > 0) { |
| 325 | const neighborSize = newSizes[index - 1] ?? 0; |
| 326 | const take = Math.min(delta - taken, neighborSize); |
| 327 | newSizes[index - 1] = neighborSize - take; |
| 328 | taken += take; |
| 329 | } else if (index < sizes.length - 1) { |
| 330 | const neighborSize = newSizes[index + 1] ?? 0; |
| 331 | const take = Math.min(delta - taken, neighborSize); |
| 332 | newSizes[index + 1] = neighborSize - take; |
| 333 | taken += take; |
| 334 | } |
| 335 | |
| 336 | if (taken <= 0) { |
| 337 | return sizes; |
| 338 | } |
| 339 | |
| 340 | newSizes[index] = currentSize + taken; |
| 341 | return Object.freeze(newSizes); |
| 342 | } |
| 343 | |
| 344 | /** |
| 345 | * Hit test to determine if a point is on a divider. |
no outgoing calls
no test coverage detected