diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a42720b..99bc0b2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -20,6 +20,7 @@ "lucide-react": "^0.453.0", "next": "15.0.3", "next-intl": "^4.8.3", + "next-themes": "^0.4.6", "react": "^18", "react-chartjs-2": "^5.3.1", "react-dom": "^18", @@ -7152,6 +7153,16 @@ "tslib": "^2.8.0" } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", diff --git a/frontend/src/components/ui/Button.tsx b/frontend/src/components/ui/Button.tsx index 30b2dc2..9f3074e 100644 --- a/frontend/src/components/ui/Button.tsx +++ b/frontend/src/components/ui/Button.tsx @@ -2,54 +2,98 @@ import React from 'react' import { cn } from '@/lib/utils' import { ButtonProps } from '@/types/ui' +const Spinner = () => ( + +) + const Button = React.forwardRef( - ({ - className, - variant = 'primary', - size = 'md', - isLoading, - leftIcon, - rightIcon, - children, - ...props - }, ref) => { - const baseClasses = "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stellar-slate focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none" - - const variantClasses = { - primary: "bg-gold-500 text-stellar-navy hover:bg-gold-600", - outline: "border border-stellar-slate bg-transparent hover:bg-stellar-lightNavy hover:text-stellar-white", - ghost: "hover:bg-stellar-lightNavy hover:text-stellar-white", - danger: "bg-red-500 text-white hover:bg-red-600", + ( + { + className, + variant = 'primary', + size = 'md', + isLoading = false, + leftIcon, + rightIcon, + children, + disabled, + ...props + }, + ref + ) => { + const isDisabled = isLoading || disabled + + const baseClasses = + 'inline-flex items-center justify-center rounded-md font-medium transition-colors ' + + 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold-500 focus-visible:ring-offset-2 focus-visible:ring-offset-stellar-navy ' + + 'disabled:opacity-50 disabled:pointer-events-none select-none' + + const variantClasses: Record = { + primary: + 'bg-gold-500 text-stellar-navy hover:bg-gold-600 active:bg-gold-700', + secondary: + 'bg-stellar-lightNavy text-stellar-white border border-stellar-slate ' + + 'hover:bg-stellar-navy hover:border-stellar-lightSlate active:bg-stellar-darkNavy', + outline: + 'border border-stellar-slate bg-transparent text-stellar-lightSlate ' + + 'hover:bg-stellar-lightNavy hover:text-stellar-white active:bg-stellar-navy', + ghost: + 'bg-transparent text-stellar-lightSlate ' + + 'hover:bg-stellar-lightNavy hover:text-stellar-white active:bg-stellar-navy', + danger: + 'bg-red-500 text-white hover:bg-red-600 active:bg-red-700', } - - const sizeClasses = { - sm: "h-9 px-3 rounded-md text-xs", - md: "h-10 px-4 py-2", - lg: "h-11 px-8 rounded-md text-base", + + const sizeClasses: Record = { + sm: 'h-8 px-3 text-xs gap-1.5 rounded', + md: 'h-10 px-4 text-sm gap-2', + lg: 'h-11 px-6 text-base gap-2', } - + return ( @@ -57,6 +101,6 @@ const Button = React.forwardRef( } ) -Button.displayName = "Button" +Button.displayName = 'Button' -export { Button } \ No newline at end of file +export { Button } diff --git a/frontend/src/types/ui.ts b/frontend/src/types/ui.ts index 69365de..84cb04d 100644 --- a/frontend/src/types/ui.ts +++ b/frontend/src/types/ui.ts @@ -1,7 +1,7 @@ import React from 'react' // UI Component Types -export type ButtonVariant = 'primary' | 'outline' | 'ghost' | 'danger' +export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' export type ButtonSize = 'sm' | 'md' | 'lg' export interface ButtonProps extends React.ButtonHTMLAttributes {