-
+
Processing locally via WebAssembly — 100% Private
diff --git a/src/components/step-configure.tsx b/src/components/step-configure.tsx
index 0ebb326..889fdbb 100644
--- a/src/components/step-configure.tsx
+++ b/src/components/step-configure.tsx
@@ -92,7 +92,13 @@ export function StepConfigure({
cvParams.periodPct ?? 0.2,
forecastParams.freq,
);
- }, [totalDays, cvParams.initialPct, cvParams.horizonPct, cvParams.periodPct, forecastParams.freq]);
+ }, [
+ totalDays,
+ cvParams.initialPct,
+ cvParams.horizonPct,
+ cvParams.periodPct,
+ forecastParams.freq,
+ ]);
useEffect(() => {
fetchCountryMap()
@@ -109,7 +115,13 @@ export function StepConfigure({
const handleStep2InitialChange = (val: number | readonly number[]) => {
const num = Array.isArray(val) ? val[0] : (val as number);
- const updated = constrainCVSplit(totalDays, num, cvSplit.horizonPct, undefined, forecastParams.freq);
+ const updated = constrainCVSplit(
+ totalDays,
+ num,
+ cvSplit.horizonPct,
+ undefined,
+ forecastParams.freq,
+ );
onCVParamsChange({
initial: updated.initialStr,
horizon: updated.horizonStr,
@@ -122,7 +134,13 @@ export function StepConfigure({
const handleStep2HorizonChange = (val: number | readonly number[]) => {
const num = Array.isArray(val) ? val[0] : (val as number);
- const updated = constrainCVSplit(totalDays, cvSplit.initialPct, num, undefined, forecastParams.freq);
+ const updated = constrainCVSplit(
+ totalDays,
+ cvSplit.initialPct,
+ num,
+ undefined,
+ forecastParams.freq,
+ );
onCVParamsChange({
initial: updated.initialStr,
horizon: updated.horizonStr,
@@ -191,7 +209,11 @@ export function StepConfigure({
className="text-xs font-semibold px-2.5 py-1.5 rounded-lg"
>
{actionType === "forecast" && (
-
+
)}
Forecast
@@ -201,7 +223,11 @@ export function StepConfigure({
className="text-xs font-semibold px-2.5 py-1.5 rounded-lg"
>
{actionType === "cross_validation" && (
-
+
)}
Cross-Validate
@@ -229,7 +255,10 @@ export function StepConfigure({
-
+
Model Config Presets
@@ -307,7 +336,10 @@ export function StepConfigure({
}}
className="flex flex-col items-center justify-center h-auto py-2 px-1 text-xs gap-1 border-border/60 hover:border-primary/50"
>
-
+
Conservative
Tighter priors
@@ -365,7 +397,11 @@ export function StepConfigure({
onClick={onSubmit}
className="text-xs font-bold"
>
-
+
{actionType === "forecast"
? "Generate Forecast"
: actionType === "cross_validation"
diff --git a/src/components/step-results.tsx b/src/components/step-results.tsx
index 06dfb2c..1eb2ef9 100644
--- a/src/components/step-results.tsx
+++ b/src/components/step-results.tsx
@@ -204,7 +204,10 @@ export function StepResults({
-
+
No Model Results Found
@@ -296,7 +299,10 @@ export function StepResults({
variant="outline"
className="font-mono text-xs gap-1 border-emerald-500/40 text-emerald-600 dark:text-emerald-400 bg-emerald-500/10 px-2.5 py-0.5 tabular-nums"
>
-
+
Completed in {(executionTimeMs / 1000).toFixed(2)}s
)}
@@ -360,7 +366,11 @@ export function StepResults({
onClick={onRunForecast}
className="text-xs h-8 font-semibold text-primary border-primary/40 hover:bg-primary/10"
>
-
+
Run Forecast
)}
@@ -387,7 +397,10 @@ export function StepResults({
title="Export model data & metrics to JSON"
className="text-xs h-7 px-2 font-semibold"
>
-
+
JSON
@@ -484,7 +500,10 @@ export function StepResults({
onClick={() => setShowChangepoints(!showChangepoints)}
className="h-7 text-xs font-semibold gap-1 px-2.5 border-border/60"
>
-
+
{showChangepoints
? "Hide Changepoints"
: "Show Changepoints"}
@@ -714,7 +733,8 @@ export function StepResults({
value="mape"
className="data-[state=active]:bg-transparent data-[state=active]:border-b-2 data-[state=active]:border-primary rounded-none px-1 pb-2 text-xs font-semibold gap-1.5"
>
-
% Errors (MAPE & MDAPE)
+
%
+ Errors (MAPE & MDAPE)
-
+
Local Processing — Data never leaves your machine