9fdf324b0e
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
24 lines
1.1 KiB
TypeScript
24 lines
1.1 KiB
TypeScript
export const VISIBLE_ROWS = 5
|
|
export const CENTER_OFFSET = (VISIBLE_ROWS - 1) / 2 // 2
|
|
|
|
/** Index de valeur logique (0..length-1) centré pour un scrollTop donné. */
|
|
export function valueIndexFromScroll(scrollTop: number, itemHeight: number, length: number): number {
|
|
const flat = Math.round(scrollTop / itemHeight) + CENTER_OFFSET
|
|
return ((flat % length) + length) % length
|
|
}
|
|
|
|
/** scrollTop qui centre l'index donné dans la copie du milieu (buffer à 3 copies). */
|
|
export function scrollTopForValueIndex(valueIndex: number, itemHeight: number, length: number): number {
|
|
const flat = length + valueIndex - CENTER_OFFSET
|
|
return flat * itemHeight
|
|
}
|
|
|
|
/** Recentre le scrollTop dans la copie du milieu [length, 2*length) si on a dérivé. */
|
|
export function loopCorrection(scrollTop: number, itemHeight: number, length: number): number {
|
|
const block = length * itemHeight
|
|
const centeredFlat = Math.round(scrollTop / itemHeight) + CENTER_OFFSET
|
|
if (centeredFlat < length) return scrollTop + block
|
|
if (centeredFlat >= 2 * length) return scrollTop - block
|
|
return scrollTop
|
|
}
|