- {t(
- "Save an opportunity, implement it, then compare matching questions and model versions. Changes in mention rate do not prove causation.",
- )}
-
- {isPending && {t("Monitoring history unavailable. Check the database migration and connection.")}
}
- {mutation.error &&
-
{t("Latest collection")}
-
-
- {data.attempts[0].model} · {data.attempts[0].provider}
-
-
- {t(COLLECTION_STATUS[data.attempts[0].status] || "Failed")}
-
-
-
{data.attempts[0].promptValue}
-
-
+
+
+
+
+ {t("Collect a question")}
+
+
+ {isPending && {t("Loading monitoring history…")}
}
+ {error && (
+ {t("Monitoring history unavailable. Check the database migration and connection.")}
+ )}
+ {data && (
+
+ )}
+ {data && data.attempts.length > 0 && }
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("Saved actions")}
+ {data && data.actions.length > 0 && (
+ {data.actions.length}
+ )}
+
+
+ {t(
+ "Save an opportunity, implement it, then compare matching questions and model versions. Changes in mention rate do not prove causation.",
+ )}
- )}
- {data?.actions.length === 0 && (
-
- {t("No saved actions yet. Collect a baseline, then save a recommendation.")}
-
- )}
- {data?.actions.map((action) => (
-
-
-
{action.title}
-
- {action.status === "planned" ? t("Planned") : t("Applied")}
-
-
- {action.description}
-
- {action.status === "planned" ? (
-
- setNotes({ ...notes, [action.id]: event.target.value })}
- />
-
-
- ) : (
- <>
- {action.implementationNote}
- {action.comparison && (
-
- {t("Matched retests: ")}
- {action.comparison.matched}/{action.comparison.expected} · {action.comparison.missing}
- {t(" missing.")}{" "}
- {action.comparison.deltaPoints === null
- ? t("Awaiting comparable results.")
- : t("Mention rate: {before}% → {after}% ({delta} percentage points).", {
- before: formatRate(action.comparison.beforeRate),
- after: formatRate(action.comparison.afterRate),
- delta: `${action.comparison.deltaPoints > 0 ? "+" : ""}${action.comparison.deltaPoints.toFixed(1)}`,
- })}
-
- )}
-
- >
- )}
-
- ))}
+ {mutation.error && {t(mutation.error.message)}
}
+ {notice && (
+
+ {t(notice.message, notice.values)}
+
+ )}
+ {data?.actions.length === 0 && (
+
+ {t("No saved actions yet. Collect a baseline, then save a recommendation.")}
+
+ )}
+ {data?.actions.map((action) => (
+ setNotes({ ...notes, [action.id]: note })}
+ busy={mutation.isPending}
+ onApply={() => mutation.mutate({ id: action.id, operation: "apply" })}
+ onRetest={() => mutation.mutate({ id: action.id, operation: "retest" })}
+ />
+ ))}
+
diff --git a/apps/web/src/components/nav-main.tsx b/apps/web/src/components/nav-main.tsx
index 2038ebf4..2df36c4f 100644
--- a/apps/web/src/components/nav-main.tsx
+++ b/apps/web/src/components/nav-main.tsx
@@ -57,7 +57,7 @@ export function NavMain({ groups }: { groups: NavGroup[] }) {
setOpenMobile(false)} />}
tooltip={t(item.title)}
- className="text-[13px] font-normal"
+ className="h-9 rounded-lg text-sm font-normal data-[active=true]:font-normal"
isActive={href === activeHref}
>
{item.icon && }
diff --git a/apps/web/src/components/page-header.tsx b/apps/web/src/components/page-header.tsx
index b550d9e6..39fe7c48 100644
--- a/apps/web/src/components/page-header.tsx
+++ b/apps/web/src/components/page-header.tsx
@@ -14,17 +14,17 @@ interface PageHeaderProps {
export function PageHeader({ title, subtitle, infoContent, children }: PageHeaderProps) {
return (
-
-
+
+
{title}
{infoContent && (
- } />
+ } />
{infoContent}
)}
-
{subtitle}
+
{subtitle}
{children}
diff --git a/apps/web/src/components/prompts-editor.tsx b/apps/web/src/components/prompts-editor.tsx
index 2444e1e3..5662ce33 100644
--- a/apps/web/src/components/prompts-editor.tsx
+++ b/apps/web/src/components/prompts-editor.tsx
@@ -182,8 +182,8 @@ export function PromptsEditor({ initialPrompts, brandId, pageTitle, pageDescript
-
{pageTitle}
-
{pageDescription}
+
{t(pageTitle)}
+
{t(pageDescription)}