// Delade UI-komponenter för Guidad Felsökning. // Designfilosofi: professionellt fabriksverktyg — hög kontrast, stora // träffytor (handskvänligt), få val per skärm, inga distraktioner. import { Link } from "react-router-dom"; import { useRef, type ReactNode } from "react"; import type { Tillforlitlighet } from "./domain"; import { TILLFORLITLIGHET_LABEL } from "./domain"; import { MikrofonKnapp } from "./Mikrofon"; export function FelsokningSkal({ rubrik, tillbaka, hoger, children, }: { rubrik: string; tillbaka?: { till: string; text: string }; hoger?: ReactNode; children: ReactNode; }) { return (
{tillbaka && ( ← {tillbaka.text} )}

{rubrik}

{hoger}
{children}
); } export function StorKnapp({ children, onClick, variant = "primar", disabled, type = "button", className = "", }: { children: ReactNode; onClick?: () => void; variant?: "primar" | "sekundar" | "fara"; disabled?: boolean; type?: "button" | "submit"; className?: string; }) { const farg = variant === "primar" ? "bg-amber-400 text-zinc-950 hover:bg-amber-300 active:bg-amber-500" : variant === "fara" ? "bg-red-600 text-white hover:bg-red-500 active:bg-red-700" : "bg-zinc-800 text-zinc-50 border-2 border-zinc-600 hover:bg-zinc-700 active:bg-zinc-600"; return ( ); } export function Panel({ rubrik, children }: { rubrik?: string; children: ReactNode }) { return (
{rubrik &&

{rubrik}

} {children}
); } export function NivaBadge({ niva }: { niva: Tillforlitlighet }) { return {TILLFORLITLIGHET_LABEL[niva]}; } export function TextFalt({ label, varde, satt, platshallare, flerRad, rost, losenord, }: { label: string; varde: string; satt: (v: string) => void; platshallare?: string; flerRad?: boolean; rost?: boolean; losenord?: boolean; }) { // Tal-till-text skriver in i samma redigerbara fält — användaren // granskar och bekräftar alltid innan något sparas i loggen. const vardeRef = useRef(varde); vardeRef.current = varde; const klass = "w-full rounded-lg border-2 border-zinc-600 bg-zinc-950 px-4 py-3 text-lg text-zinc-50 placeholder-zinc-500 focus:border-amber-400 focus:outline-none"; return (