@@ -1584,7 +1577,7 @@ export default function Home() {
diff --git a/components/ui/Badge.tsx b/components/ui/Badge.tsx
new file mode 100644
index 0000000..9c8553a
--- /dev/null
+++ b/components/ui/Badge.tsx
@@ -0,0 +1,40 @@
+'use client'
+
+import { ReactNode } from 'react'
+import { useThemeStyles, cn } from '@/lib/ui-styles'
+
+interface BadgeProps {
+ children: ReactNode
+ variant?: 'primary' | 'success' | 'warning' | 'danger'
+ size?: 'sm' | 'md' | 'lg'
+ className?: string
+}
+
+export default function Badge({
+ children,
+ variant = 'primary',
+ size = 'md',
+ className = '',
+}: BadgeProps) {
+ const styles = useThemeStyles()
+
+ const sizeClasses = {
+ sm: 'px-2 py-0.5 text-xs',
+ md: 'px-2 py-1 text-xs',
+ lg: 'px-3 py-1.5 text-sm',
+ }
+
+ return (
+
+ {children}
+
+ )
+}
+
diff --git a/components/ui/Button.tsx b/components/ui/Button.tsx
new file mode 100644
index 0000000..c77a67d
--- /dev/null
+++ b/components/ui/Button.tsx
@@ -0,0 +1,86 @@
+'use client'
+
+import { ButtonHTMLAttributes, ReactNode, forwardRef } from 'react'
+import { useThemeStyles, cn } from '@/lib/ui-styles'
+
+interface ButtonProps extends ButtonHTMLAttributes
{
+ children: ReactNode
+ variant?: 'primary' | 'secondary' | 'ghost' | 'danger' | 'success'
+ size?: 'sm' | 'md' | 'lg'
+ fullWidth?: boolean
+ loading?: boolean
+}
+
+const Button = forwardRef(
+ (
+ {
+ children,
+ variant = 'primary',
+ size = 'md',
+ fullWidth = false,
+ loading = false,
+ disabled,
+ className = '',
+ ...props
+ },
+ ref
+ ) => {
+ const styles = useThemeStyles()
+
+ const sizeClasses = {
+ sm: styles.buttonModifiers.compactXs,
+ md: '',
+ lg: 'px-8 py-4 text-base',
+ }
+
+ const variantClass = styles.buttonStyles[variant]
+
+ return (
+
+ )
+ }
+)
+
+Button.displayName = 'Button'
+
+export default Button
+
diff --git a/components/ui/Input.tsx b/components/ui/Input.tsx
new file mode 100644
index 0000000..ec2ac97
--- /dev/null
+++ b/components/ui/Input.tsx
@@ -0,0 +1,51 @@
+'use client'
+
+import { InputHTMLAttributes, forwardRef } from 'react'
+import { useThemeStyles, cn } from '@/lib/ui-styles'
+
+interface InputProps extends InputHTMLAttributes {
+ error?: boolean
+ size?: 'sm' | 'md' | 'lg'
+ fullWidth?: boolean
+}
+
+const Input = forwardRef(
+ (
+ {
+ error = false,
+ size = 'md',
+ fullWidth = true,
+ className = '',
+ ...props
+ },
+ ref
+ ) => {
+ const styles = useThemeStyles()
+
+ const sizeClasses = {
+ sm: styles.inputModifiers.compactXs,
+ md: '',
+ lg: 'px-5 py-4 text-base',
+ }
+
+ const inputClass = error ? styles.inputStyles.error : styles.inputStyles.base
+
+ return (
+
+ )
+ }
+)
+
+Input.displayName = 'Input'
+
+export default Input
+
diff --git a/components/ui/Tag.tsx b/components/ui/Tag.tsx
new file mode 100644
index 0000000..3455b8f
--- /dev/null
+++ b/components/ui/Tag.tsx
@@ -0,0 +1,56 @@
+'use client'
+
+import { ReactNode } from 'react'
+import { useThemeStyles, cn } from '@/lib/ui-styles'
+
+interface TagProps {
+ children: ReactNode
+ color?: 'blue' | 'green' | 'orange' | 'purple' | 'indigo' | 'pink' | 'cyan'
+ size?: 'sm' | 'md' | 'lg'
+ className?: string
+ onClick?: () => void
+}
+
+export default function Tag({
+ children,
+ color = 'blue',
+ size = 'md',
+ className = '',
+ onClick,
+}: TagProps) {
+ const styles = useThemeStyles()
+
+ const colorClasses = {
+ blue: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300',
+ green: 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300',
+ orange: 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300',
+ purple: 'bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300',
+ indigo: 'bg-indigo-100 dark:bg-indigo-900/30 text-indigo-700 dark:text-indigo-300',
+ pink: 'bg-pink-100 dark:bg-pink-900/30 text-pink-700 dark:text-pink-300',
+ cyan: 'bg-cyan-100 dark:bg-cyan-900/30 text-cyan-700 dark:text-cyan-300',
+ }
+
+ const sizeClasses = {
+ sm: 'px-2 py-0.5 text-xs',
+ md: 'px-2 py-1 text-xs',
+ lg: 'px-3 py-1.5 text-sm',
+ }
+
+ const baseClasses = 'inline-flex items-center font-medium rounded transition-colors'
+
+ return (
+
+ {children}
+
+ )
+}
+