import { useState, useRef, useEffect, type ReactNode } from "react"; import { Zap } from "../../icons/SystemIcons"; export const FIELD = "min-w-0 rounded-xl border border-neutral-800 bg-neutral-900/95 px-3 py-2 text-neutral-100 shadow-[inset_0_1px_0_rgba(255,255,255,0.03)] transition-colors focus-within:border-neutral-600"; export const LABEL = "text-[11px] font-medium uppercase tracking-[0.18em] text-neutral-500"; export const RESPONSIVE_GRID = "grid grid-cols-[repeat(auto-fit,minmax(118px,1fr))] gap-3"; export function formatNumericValue(value: number): string { const rounded = Math.round(value * 100) / 100; return Number.isInteger(rounded) ? `${rounded}` : rounded.toFixed(2).replace(/0+$/, "").replace(/\.$/, ""); } export function clampMotionNumber( value: number | null, min: number, max: number, fallback: number, ): number { if (value == null || !Number.isFinite(value)) return fallback; return Math.min(max, Math.max(min, value)); } export function parsePlainNumber(value: string): number | null { const parsed = Number.parseFloat(value.trim()); return Number.isFinite(parsed) ? parsed : null; } // ── CommitField ── export function CommitField({ value, disabled, onCommit, }: { value: string; disabled?: boolean; onCommit: (nextValue: string) => void; }) { const [draft, setDraft] = useState(value); const focusedRef = useRef(false); useEffect(() => { if (!focusedRef.current) setDraft(value); }, [value]); const commitDraft = () => { focusedRef.current = false; const next = draft.trim(); if (next !== value) onCommit(next); }; return ( { focusedRef.current = true; }} onChange={(event) => setDraft(event.target.value)} onBlur={commitDraft} onKeyDown={(event) => { if (event.key === "Enter") (event.target as HTMLInputElement).blur(); }} className="w-full min-w-0 bg-transparent text-[11px] font-medium text-neutral-100 outline-none disabled:cursor-not-allowed disabled:text-neutral-600" /> ); } // ── DetailField ── export function DetailField({ label, value, disabled, onCommit, }: { label: string; value: string; disabled?: boolean; onCommit: (nextValue: string) => void; }) { return ( ); } // ── SegmentedControl ── export function SegmentedControl({ value, options, onChange, }: { value: string; options: Array<{ label: string; value: string }>; onChange: (value: string) => void; }) { return (