From 6d67d6a7b3e03ef3ac2f5be6f83fae4617e0531c Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Sat, 10 Jan 2026 18:13:12 +0000 Subject: [PATCH] improved counter logic --- packages/frontend/src/components/ui/field.tsx | 3 ++ packages/frontend/src/components/ui/input.tsx | 53 +++++++------------ 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/packages/frontend/src/components/ui/field.tsx b/packages/frontend/src/components/ui/field.tsx index 588c9b2..bd09dd4 100644 --- a/packages/frontend/src/components/ui/field.tsx +++ b/packages/frontend/src/components/ui/field.tsx @@ -14,6 +14,7 @@ export function Field({ tabIndex, spellcheck, maxLength, + showCounter = true, }: { label: string; value?: string; @@ -26,6 +27,7 @@ export function Field({ tabIndex?: number; spellcheck?: boolean; maxLength?: number; + showCounter?: boolean; }) { const [internalTouched, setInternalTouched] = useState(false); const isTouched = submitAttempted || internalTouched; @@ -59,6 +61,7 @@ export function Field({ tabIndex={tabIndex} spellCheck={spellcheck} maxLength={maxLength} + showCounter={showCounter} />
{error || invalidMessage !== "" ? ( diff --git a/packages/frontend/src/components/ui/input.tsx b/packages/frontend/src/components/ui/input.tsx index 997e2ab..e1cfe50 100644 --- a/packages/frontend/src/components/ui/input.tsx +++ b/packages/frontend/src/components/ui/input.tsx @@ -2,30 +2,15 @@ import type * as React from "react"; import { cn } from "@/lib/utils"; -function Input({ className, type, ...props }: React.ComponentProps<"input">) { +function Input({ + className, + type, + showCounter = true, + ...props +}: React.ComponentProps<"input"> & { showCounter?: boolean }) { const maxLength = typeof props.maxLength === "number" ? props.maxLength : undefined; const currentLength = typeof props.value === "string" ? props.value.length : undefined; - const showCounter = typeof maxLength === "number" && maxLength > 0 && typeof currentLength === "number"; - - if (!showCounter) { - return ( - - ); - } - - const counterPercent = currentLength / maxLength; - return (
) { )} {...props} /> - = 1 - ? "text-destructive" - : counterPercent >= 0.8 - ? "text-amber-500" - : "text-muted-foreground", - )} - > - {currentLength}/{maxLength} - + {showCounter && currentLength !== undefined && maxLength !== undefined && ( + = 1 + ? "text-destructive" + : currentLength / maxLength >= 0.75 + ? "text-amber-500" + : "text-muted-foreground", + )} + > + {currentLength}/{maxLength} + + )}
); }