"use client"; import { useMemo, useState } from "react"; import ToolShell from "@/components/toolkit/ToolShell"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; function num(v: string) { const n = parseFloat(v); return Number.isFinite(n) ? n : 0; } export default function Page() { const [speed, setSpeed] = useState("800"); // mm/s const [freq, setFreq] = useState("60"); // kHz const [spotUm, setSpotUm] = useState("50");// µm const result = useMemo(() => { const v = num(speed); // mm/s const f = num(freq); // kHz const dUm = num(spotUm); // µm if (v <= 0 || f <= 0 || dUm <= 0) { return { spacingUm: 0, spacingMm: 0, overlapPct: 0, pulsesPerMm: 0 }; } // distance per pulse const spacingUm = v / f; // µm (derives from v(mm/s) / (f(kHz)*1000) * 1000) const spacingMm = spacingUm / 1000; const overlapPct = Math.max(0, Math.min(100, 100 * (1 - spacingUm / dUm))); const pulsesPerMm = (f * 1000) / v; return { spacingUm, spacingMm, overlapPct, pulsesPerMm }; }, [speed, freq, spotUm]); return ( Inputs Results
Pulse spacing
{result.spacingMm.toFixed(4)} mm
{result.spacingUm.toFixed(1)} µm
Overlap
{result.overlapPct.toFixed(1)}%
Pulses per mm
{result.pulsesPerMm.toFixed(1)}
Rule of thumb
60–80% overlap is common for marking; deeper engraving often higher.
); }