@@ -31,9 +32,9 @@ export function LoaderPending(){
// Other variants...
export function LoaderFullPage({ text = 'Loading...' }: { text?: string }) {
return (
-
+
@@ -41,7 +42,11 @@ export function LoaderFullPage({ text = 'Loading...' }: { text?: string }) {
}
export function LoaderInline({ size = 16 }: { size?: number }) {
- return
+ return (
+
+
+
+ )
}
export function LoaderOverlay({ text }: { text?: string }) {
diff --git a/src/components/form/ConverterPage.tsx b/src/components/form/ConverterPage.tsx
index 3877665..78d487f 100644
--- a/src/components/form/ConverterPage.tsx
+++ b/src/components/form/ConverterPage.tsx
@@ -102,15 +102,17 @@ export function ConverterPage
({
- {output && (
-
- )}
+
+ {output && (
+
+ )}
+
)
diff --git a/src/components/form/FieldErrorMessage.tsx b/src/components/form/FieldErrorMessage.tsx
deleted file mode 100644
index 69e5812..0000000
--- a/src/components/form/FieldErrorMessage.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { formatFieldErrors } from '@/lib/errors'
-import type { StandardSchemaIssue } from '@/lib/errors'
-
-interface FieldErrorMessageProps {
- meta: { isTouched?: boolean; isBlurred?: boolean; errors?: StandardSchemaIssue[] }
- showWhenSubmitted: boolean
-}
-
-export function FieldErrorMessage({ meta, showWhenSubmitted }: FieldErrorMessageProps) {
- const shouldShow = meta.isTouched || meta.isBlurred || showWhenSubmitted
- const errs = meta.errors ?? []
- return shouldShow && errs.length > 0 ? (
-
{formatFieldErrors(errs)}
- ) : null
-}
diff --git a/src/components/form/SelectField.tsx b/src/components/form/SelectField.tsx
index 8d802c8..ad9e1f5 100644
--- a/src/components/form/SelectField.tsx
+++ b/src/components/form/SelectField.tsx
@@ -1,6 +1,6 @@
import { FormSelect } from './FormSelect'
-import { FieldErrorMessage } from './FieldErrorMessage'
import { useFieldContext } from '@/hooks/form'
+import { formatFieldErrors } from '@/lib/errors'
import type { SelectOption } from '@/lib/converter-configs'
interface SelectFieldProps {
@@ -11,19 +11,18 @@ interface SelectFieldProps {
export function SelectField({ label, options }: SelectFieldProps) {
const field = useFieldContext
()
+ const shouldShow = field.state.meta.isTouched || field.state.meta.isBlurred || field.form.state.isSubmitted
+ const errs = field.state.meta.errors ?? []
+ const errorMessage = shouldShow && errs.length > 0 ? formatFieldErrors(errs) : undefined
+
return (
- <>
- field.setValue(value)}
- options={options}
- />
-
- >
+ field.setValue(value)}
+ options={options}
+ errorMessage={errorMessage}
+ />
)
}
diff --git a/src/components/form/TextAreaField.tsx b/src/components/form/TextAreaField.tsx
index 2b45712..230c614 100644
--- a/src/components/form/TextAreaField.tsx
+++ b/src/components/form/TextAreaField.tsx
@@ -1,6 +1,6 @@
import { FormTextArea } from './FormTextArea'
-import { FieldErrorMessage } from './FieldErrorMessage'
import { useFieldContext } from '@/hooks/form'
+import { formatFieldErrors } from '@/lib/errors'
interface TextAreaFieldProps {
label: string
@@ -19,23 +19,22 @@ export function TextAreaField({
}: TextAreaFieldProps) {
const field = useFieldContext()
+ const shouldShow = field.state.meta.isTouched || field.state.meta.isBlurred || field.form.state.isSubmitted
+ const errs = field.state.meta.errors ?? []
+ const errorMessage = shouldShow && errs.length > 0 ? formatFieldErrors(errs) : undefined
+
return (
- <>
- field.handleChange(value)}
- className={className}
- />
-
- >
+ field.handleChange(value)}
+ className={className}
+ errorMessage={errorMessage}
+ />
)
}
diff --git a/src/components/form/index.ts b/src/components/form/index.ts
index 0156376..7994d33 100644
--- a/src/components/form/index.ts
+++ b/src/components/form/index.ts
@@ -1,5 +1,4 @@
export { FormSelect } from './FormSelect'
export { FormTextArea } from './FormTextArea'
export { FormButton } from './FormButton'
-export { FieldErrorMessage } from './FieldErrorMessage'
export { ConverterPage } from './ConverterPage'
diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx
index f923edd..7891c66 100644
--- a/src/pages/Home.tsx
+++ b/src/pages/Home.tsx
@@ -38,10 +38,11 @@ const Home = () => {
{/* Search Input */}
-
+
setSearchQuery(e.target.value)}
className="w-full pl-10 pr-4 py-3 rounded-lg border border-border bg-background focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent transition-all"
@@ -49,9 +50,10 @@ const Home = () => {
{/* Category Filter */}
-
+
{/* Hover Effect Gradient */}
@@ -173,7 +176,7 @@ interface FeatureCardProps {
const FeatureCard = ({ title, description, icon }: FeatureCardProps) => {
return (
-
{icon}
+
{icon}
{title}
{description}