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>
31 lines
911 B
Svelte
31 lines
911 B
Svelte
<script lang="ts">
|
|
type SpinnerType = "dots" | "circle" | "pulse" | "stars" | "orbit";
|
|
|
|
let { type = "dots", speed = 100, classes = "" } = $props<{
|
|
type?: SpinnerType;
|
|
speed?: number;
|
|
classes?: string;
|
|
}>();
|
|
|
|
const sequences = {
|
|
dots: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
|
|
circle: ["◴", "◷", "◶", "◵"],
|
|
pulse: ["◉", "◎", "○", "◎"],
|
|
stars: ["·", "✢", "✳", "✶", "✻", "✽"],
|
|
orbit: ["⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈"],
|
|
};
|
|
|
|
let frame = $state(0);
|
|
let chars = $derived(sequences[type as SpinnerType] ?? sequences.dots);
|
|
|
|
$effect(() => {
|
|
frame = 0;
|
|
const interval = setInterval(() => {
|
|
frame = (frame + 1) % chars.length;
|
|
}, speed);
|
|
return () => clearInterval(interval);
|
|
});
|
|
</script>
|
|
|
|
<span class="inline-block {classes}" aria-hidden="true">{chars[frame]}</span>
|