Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
registry=https://registry.npmjs.org/
4 changes: 2 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
- [x] Add circle-ray intersection helper
- [x] Implement swept AABB collision checks
- [x] Document new modules in `docs/index.d.ts` and examples folder
- [ ] Achieve >80% coverage across new modules
- [x] Achieve >80% coverage across new modules

## Milestone 0.3.0 – Web Performance & Data Pipelines
- [x] Introduce request deduplication helper
- [ ] Ship virtual scrolling utilities
- [x] Ship virtual scrolling utilities
- [ ] Add diff/patch helpers for nested JSON structures
- [ ] Create benchmarking scripts to compare algorithm variants
- [ ] Expand CI to include coverage gating and bundle size checks
Expand Down
29 changes: 29 additions & 0 deletions docs/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,35 @@ export function throttle<T extends (...args: any[]) => any>(
limit: number
): (...args: Parameters<T>) => void;

/**
* Virtual scrolling window calculator for fixed-height lists.
* Use for: long lists, chat logs, table virtualization.
* Performance: O(visible + overrides) per update.
* Import: util/virtualScroll.ts
*/
export interface VirtualScrollOptions {
itemCount: number;
itemHeight: number;
scrollOffset: number;
viewportHeight: number;
overscan?: number;
measurements?: ReadonlyArray<number | undefined>;
}
export interface VirtualItem {
index: number;
offset: number;
size: number;
}
export interface VirtualRange {
startIndex: number;
endIndex: number;
padFront: number;
padEnd: number;
totalSize: number;
items: VirtualItem[];
}
export function calculateVirtualRange(options: VirtualScrollOptions): VirtualRange;

/**
* Least recently used cache.
* Use for: memoizing responses, data loaders, pagination caches.
Expand Down
12 changes: 12 additions & 0 deletions examples/virtualScroll.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { calculateVirtualRange } from '../src/index.js';

const range = calculateVirtualRange({
itemCount: 1000,
itemHeight: 24,
viewportHeight: 240,
scrollOffset: 480,
overscan: 2,
});

console.log(`render ${range.startIndex} to ${range.endIndex}`);
console.log(range.items.slice(0, 3));
Loading