refactor(frontend): migrate JS modules to TypeScript
Wholesale JS -> TS migration of the frontend — stores, utils, actions,
and all Svelte component scripts adopt type annotations. Compile-time
surfaces (app.d.ts, lib/types/) added for shared DTO types.
Build plumbing:
- package.json: dev:frontend script that runs svelte-kit sync first
- tauri.conf.json: beforeDevCommand points at dev:frontend
- run.sh: dropped the sed-hack that temporarily blanked beforeDevCommand;
now relies on npm run dev:frontend to avoid double-Vite
- jsconfig.json: allowImportingTsExtensions
Preserves all Group 1 behaviour:
- page.svelte.ts keeps loadHistory / loadTasks Tauri-first, no
localStorage; saveTranscriptMeta + mapTranscriptRow + mapTaskRow
intact; update_task_cmd and update_transcript_meta_cmd invocations
carry the correct payload shape.
- Toasts, preferences stores typed without behaviour change.
- Viewer still routes segment edits through saveTranscriptMeta; the
Task 1.5 TODO markers are gone.
taskExtractor.ts is functionally improved during the migration:
- multi-task matches in the same sentence
- list-style shopping-verb expansion (get bread, milk, and cheese)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
49
src/lib/utils/virtualList.ts
Normal file
49
src/lib/utils/virtualList.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
export function buildCumulativeOffsets(heights: number[]): number[] {
|
||||
const offsets = new Array(heights.length + 1);
|
||||
offsets[0] = 0;
|
||||
for (let i = 0; i < heights.length; i++) {
|
||||
offsets[i + 1] = offsets[i] + heights[i];
|
||||
}
|
||||
return offsets;
|
||||
}
|
||||
|
||||
export function findVisibleRange(
|
||||
cumulativeOffsets: number[],
|
||||
itemCount: number,
|
||||
scrollTop: number,
|
||||
viewportHeight: number,
|
||||
buffer = 4,
|
||||
) {
|
||||
if (!cumulativeOffsets.length || itemCount === 0 || viewportHeight <= 0) {
|
||||
return { start: 0, end: 0 };
|
||||
}
|
||||
|
||||
let lo = 0;
|
||||
let hi = itemCount - 1;
|
||||
while (lo < hi) {
|
||||
const mid = (lo + hi) >>> 1;
|
||||
if (cumulativeOffsets[mid + 1] < scrollTop) {
|
||||
lo = mid + 1;
|
||||
} else {
|
||||
hi = mid;
|
||||
}
|
||||
}
|
||||
const start = Math.max(0, lo - buffer);
|
||||
|
||||
const endScroll = scrollTop + viewportHeight;
|
||||
lo = start;
|
||||
hi = itemCount - 1;
|
||||
while (lo < hi) {
|
||||
const mid = (lo + hi) >>> 1;
|
||||
if (cumulativeOffsets[mid] < endScroll) {
|
||||
lo = mid + 1;
|
||||
} else {
|
||||
hi = mid;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
start,
|
||||
end: Math.min(itemCount, lo + buffer),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user