@rationalbloks/frontblok-components 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/shared/ErrorBoundary.tsx","../src/shared/ConfirmationModal.tsx","../src/shared/ErrorFallback.tsx","../src/shared/Navbar.tsx","../src/views/AuthView.tsx","../src/views/ForgotPasswordView.tsx","../src/views/ResetPasswordView.tsx","../src/views/VerifyEmailView.tsx","../src/views/SupportView.tsx","../src/views/SettingsView.tsx","../src/theme/index.ts"],"sourcesContent":["// ========================================================================\r\n// STYLED ERROR BOUNDARY\r\n// ========================================================================\r\n// Standalone styled error boundary with MUI aesthetics.\r\n// ========================================================================\r\n\r\nimport { Component, ErrorInfo, ReactNode } from 'react';\r\nimport { Box, Button, Typography, Container, Paper } from '@mui/material';\r\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n supportEmail?: string;\r\n}\r\n\r\ninterface State {\r\n hasError: boolean;\r\n error: Error | null;\r\n errorInfo: ErrorInfo | null;\r\n}\r\n\r\nclass ErrorBoundary extends Component<Props, State> {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): Partial<State> {\r\n return {\r\n hasError: true,\r\n error,\r\n };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n console.error('React Error Boundary caught an error:', error);\r\n console.error('Error Info:', errorInfo);\r\n \r\n this.setState({\r\n error,\r\n errorInfo,\r\n });\r\n }\r\n\r\n resetError = () => {\r\n this.setState({\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n });\r\n \r\n window.location.href = '/';\r\n };\r\n\r\n render() {\r\n const supportEmail = this.props.supportEmail || 'support@example.com';\r\n \r\n if (this.state.hasError) {\r\n return (\r\n <Container maxWidth=\"md\">\r\n <Box\r\n sx={{\r\n minHeight: '100vh',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n py: 4,\r\n }}\r\n >\r\n <Paper\r\n elevation={3}\r\n sx={{\r\n p: 4,\r\n textAlign: 'center',\r\n maxWidth: 600,\r\n }}\r\n >\r\n <ErrorOutlineIcon\r\n sx={{\r\n fontSize: 80,\r\n color: 'error.main',\r\n mb: 2,\r\n }}\r\n />\r\n \r\n <Typography variant=\"h4\" gutterBottom fontWeight={700}>\r\n Oops! Something went wrong\r\n </Typography>\r\n \r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 3 }}>\r\n We're sorry for the inconvenience. An unexpected error occurred.\r\n Our team has been notified and we're working on a fix.\r\n </Typography>\r\n\r\n {/* Show error details in development mode */}\r\n {import.meta.env.DEV && this.state.error && (\r\n <Paper\r\n variant=\"outlined\"\r\n sx={{\r\n p: 2,\r\n mb: 3,\r\n textAlign: 'left',\r\n backgroundColor: '#f5f5f5',\r\n maxHeight: 300,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <Typography variant=\"subtitle2\" fontWeight={600} gutterBottom>\r\n Error Details (Development Only):\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n component=\"pre\"\r\n sx={{\r\n fontFamily: 'monospace',\r\n fontSize: '0.75rem',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {this.state.error.toString()}\r\n {this.state.errorInfo?.componentStack}\r\n </Typography>\r\n </Paper>\r\n )}\r\n\r\n <Box sx={{ display: 'flex', gap: 2, justifyContent: 'center' }}>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={this.resetError}\r\n size=\"large\"\r\n >\r\n Return to Home\r\n </Button>\r\n \r\n <Button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n onClick={() => window.location.reload()}\r\n size=\"large\"\r\n >\r\n Reload Page\r\n </Button>\r\n </Box>\r\n\r\n <Typography\r\n variant=\"caption\"\r\n color=\"text.secondary\"\r\n sx={{ mt: 3, display: 'block' }}\r\n >\r\n If the problem persists, please contact{' '}\r\n <a href={`mailto:${supportEmail}`}>{supportEmail}</a>\r\n </Typography>\r\n </Paper>\r\n </Box>\r\n </Container>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\nexport default ErrorBoundary;\r\n","// ========================================================================\r\n// STYLED CONFIRMATION MODAL\r\n// ========================================================================\r\n// Beautiful confirmation modal with MUI aesthetics.\r\n// ========================================================================\r\n\r\nimport React from 'react';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Button,\r\n Box,\r\n Typography,\r\n CircularProgress,\r\n Alert,\r\n Divider,\r\n alpha,\r\n} from '@mui/material';\r\nimport {\r\n Warning as WarningIcon,\r\n CheckCircle as SuccessIcon,\r\n Error as ErrorIcon,\r\n Info as InfoIcon,\r\n} from '@mui/icons-material';\r\n\r\nexport type ConfirmationModalSeverity = 'info' | 'warning' | 'error' | 'success';\r\n\r\nexport interface ConfirmationModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n onConfirm: () => void;\r\n title: string;\r\n message: string | React.ReactNode;\r\n confirmText?: string;\r\n cancelText?: string;\r\n severity?: ConfirmationModalSeverity;\r\n isLoading?: boolean;\r\n warning?: string;\r\n details?: { label: string; oldValue: string; newValue: string }[];\r\n bulletPoints?: string[];\r\n}\r\n\r\nconst severityConfig = {\r\n info: { icon: InfoIcon, color: 'info.main', bgColor: 'info.light' },\r\n warning: { icon: WarningIcon, color: 'warning.main', bgColor: 'warning.light' },\r\n error: { icon: ErrorIcon, color: 'error.main', bgColor: 'error.light' },\r\n success: { icon: SuccessIcon, color: 'success.main', bgColor: 'success.light' },\r\n};\r\n\r\nexport const ConfirmationModal: React.FC<ConfirmationModalProps> = ({\r\n open,\r\n onClose,\r\n onConfirm,\r\n title,\r\n message,\r\n confirmText = 'Confirm',\r\n cancelText = 'Cancel',\r\n severity = 'info',\r\n isLoading = false,\r\n warning,\r\n details,\r\n bulletPoints,\r\n}) => {\r\n const config = severityConfig[severity];\r\n const IconComponent = config.icon;\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={isLoading ? undefined : onClose}\r\n maxWidth=\"sm\"\r\n fullWidth\r\n PaperProps={{\r\n sx: {\r\n borderRadius: 2,\r\n boxShadow: '0 8px 32px rgba(0,0,0,0.12)',\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 1.5,\r\n pb: 1,\r\n borderBottom: '1px solid',\r\n borderColor: 'divider',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n width: 40,\r\n height: 40,\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n bgcolor: (theme) => alpha(theme.palette[severity].main, 0.1),\r\n }}\r\n >\r\n <IconComponent sx={{ color: config.color, fontSize: 24 }} />\r\n </Box>\r\n <Typography variant=\"h6\" fontWeight={600}>\r\n {title}\r\n </Typography>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ pt: 2.5, pb: 1 }}>\r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 2 }}>\r\n {message}\r\n </Typography>\r\n\r\n {details && details.length > 0 && (\r\n <Box\r\n sx={{\r\n bgcolor: 'grey.50',\r\n borderRadius: 1,\r\n p: 2,\r\n mb: 2,\r\n }}\r\n >\r\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1.5 }}>\r\n Changes:\r\n </Typography>\r\n {details.map((detail, index) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n py: 0.75,\r\n borderBottom: index < details.length - 1 ? '1px solid' : 'none',\r\n borderColor: 'divider',\r\n }}\r\n >\r\n <Typography variant=\"body2\" fontWeight={500}>\r\n {detail.label}\r\n </Typography>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n {detail.oldValue}\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"primary.main\" fontWeight={600}>\r\n →\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"primary.main\" fontWeight={600}>\r\n {detail.newValue}\r\n </Typography>\r\n </Box>\r\n </Box>\r\n ))}\r\n </Box>\r\n )}\r\n\r\n {warning && (\r\n <Alert\r\n severity=\"warning\"\r\n icon={<WarningIcon />}\r\n sx={{\r\n mb: 2,\r\n '& .MuiAlert-message': {\r\n fontWeight: 500,\r\n },\r\n }}\r\n >\r\n {warning}\r\n </Alert>\r\n )}\r\n\r\n {bulletPoints && bulletPoints.length > 0 && (\r\n <Box sx={{ mb: 1 }}>\r\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1 }}>\r\n This action will:\r\n </Typography>\r\n <Box component=\"ul\" sx={{ m: 0, pl: 2.5 }}>\r\n {bulletPoints.map((point, index) => (\r\n <Box\r\n component=\"li\"\r\n key={index}\r\n sx={{ mb: 0.5 }}\r\n >\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n {point}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n )}\r\n </DialogContent>\r\n\r\n <Divider />\r\n\r\n <DialogActions sx={{ px: 3, py: 2, gap: 1 }}>\r\n <Button\r\n onClick={onClose}\r\n disabled={isLoading}\r\n variant=\"outlined\"\r\n color=\"inherit\"\r\n sx={{ minWidth: 100 }}\r\n >\r\n {cancelText}\r\n </Button>\r\n <Button\r\n onClick={onConfirm}\r\n disabled={isLoading}\r\n variant=\"contained\"\r\n color={severity === 'error' ? 'error' : severity === 'warning' ? 'warning' : 'primary'}\r\n sx={{ minWidth: 120 }}\r\n startIcon={isLoading ? <CircularProgress size={18} color=\"inherit\" /> : null}\r\n >\r\n {isLoading ? 'Processing...' : confirmText}\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default ConfirmationModal;\r\n","// ========================================================================\r\n// STYLED ERROR FALLBACK\r\n// ========================================================================\r\n// Beautiful error fallback UI using MUI components.\r\n// ========================================================================\r\n\r\nimport React from 'react';\r\nimport { Box, Button, Typography, Container, Paper } from '@mui/material';\r\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\r\n\r\nexport interface ErrorFallbackProps {\r\n error: Error | null;\r\n errorInfo: React.ErrorInfo | null;\r\n resetError: () => void;\r\n supportEmail: string;\r\n}\r\n\r\n// Styled Error Fallback\r\n//\r\n// Use this as the renderFallback prop for ErrorBoundary:\r\n//\r\n// <ErrorBoundary renderFallback={ErrorFallback}>\r\n// <App />\r\n// </ErrorBoundary>\r\nexport const ErrorFallback: React.FC<ErrorFallbackProps> = ({\r\n error,\r\n errorInfo,\r\n resetError,\r\n supportEmail,\r\n}) => {\r\n return (\r\n <Container maxWidth=\"md\">\r\n <Box\r\n sx={{\r\n minHeight: '100vh',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n py: 4,\r\n }}\r\n >\r\n <Paper\r\n elevation={3}\r\n sx={{\r\n p: 4,\r\n textAlign: 'center',\r\n maxWidth: 600,\r\n }}\r\n >\r\n <ErrorOutlineIcon\r\n sx={{\r\n fontSize: 80,\r\n color: 'error.main',\r\n mb: 2,\r\n }}\r\n />\r\n \r\n <Typography variant=\"h4\" gutterBottom fontWeight={700}>\r\n Oops! Something went wrong\r\n </Typography>\r\n \r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 3 }}>\r\n We're sorry for the inconvenience. An unexpected error occurred.\r\n Our team has been notified and we're working on a fix.\r\n </Typography>\r\n\r\n {/* Show error details in development mode */}\r\n {import.meta.env.DEV && error && (\r\n <Paper\r\n variant=\"outlined\"\r\n sx={{\r\n p: 2,\r\n mb: 3,\r\n textAlign: 'left',\r\n backgroundColor: '#f5f5f5',\r\n maxHeight: 300,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <Typography variant=\"subtitle2\" fontWeight={600} gutterBottom>\r\n Error Details (Development Only):\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n component=\"pre\"\r\n sx={{\r\n fontFamily: 'monospace',\r\n fontSize: '0.75rem',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {error.toString()}\r\n {errorInfo?.componentStack}\r\n </Typography>\r\n </Paper>\r\n )}\r\n\r\n <Box sx={{ display: 'flex', gap: 2, justifyContent: 'center' }}>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={resetError}\r\n size=\"large\"\r\n >\r\n Return to Home\r\n </Button>\r\n \r\n <Button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n onClick={() => window.location.reload()}\r\n size=\"large\"\r\n >\r\n Reload Page\r\n </Button>\r\n </Box>\r\n\r\n <Typography\r\n variant=\"caption\"\r\n color=\"text.secondary\"\r\n sx={{ mt: 3, display: 'block' }}\r\n >\r\n If the problem persists, please contact{' '}\r\n <a href={`mailto:${supportEmail}`}>{supportEmail}</a>\r\n </Typography>\r\n </Paper>\r\n </Box>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default ErrorFallback;\r\n","// ========================================================================\r\n// STYLED NAVBAR\r\n// ========================================================================\r\n// Configurable styled navbar with MUI aesthetics.\r\n// All the visual aesthetics (gradient, colors, shadows, etc.) are defined here.\r\n// ========================================================================\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useNavigate, useLocation, Link } from 'react-router-dom';\r\nimport {\r\n AppBar,\r\n Toolbar,\r\n Typography,\r\n Button,\r\n Box,\r\n Avatar,\r\n Menu,\r\n MenuItem,\r\n IconButton,\r\n Chip,\r\n Divider\r\n} from '@mui/material';\r\nimport {\r\n ExitToApp,\r\n Settings as SettingsIcon,\r\n} from '@mui/icons-material';\r\n\r\n// ========================================================================\r\n// TYPE DEFINITIONS\r\n// ========================================================================\r\n\r\nexport interface NavigationItem {\r\n id: string; // Route path\r\n label: string; // Display text\r\n icon: React.ReactElement;\r\n}\r\n\r\nexport interface BrandConfig {\r\n name: string;\r\n logo: string;\r\n}\r\n\r\nexport interface NavigationConfig {\r\n public: NavigationItem[];\r\n authenticated: NavigationItem[];\r\n}\r\n\r\nexport interface AuthHookResult {\r\n user: {\r\n first_name?: string;\r\n last_name?: string;\r\n email?: string;\r\n } | null;\r\n isAuthenticated: boolean;\r\n logout: () => void;\r\n}\r\n\r\nexport interface NavbarConfig {\r\n brand: BrandConfig;\r\n navigation: NavigationConfig;\r\n useAuth: () => AuthHookResult;\r\n /** Gradient colors for navbar background */\r\n navbarGradient: {\r\n start: string; // e.g., '#1800ad'\r\n end: string; // e.g., '#0d0067'\r\n };\r\n userRoleLabel?: string;\r\n authRoute?: string;\r\n settingsRoute?: string;\r\n isActiveOverride?: (path: string, locationPath: string) => boolean;\r\n}\r\n\r\n// ========================================================================\r\n// NAVBAR FACTORY\r\n// ========================================================================\r\n\r\nexport function createNavbar(config: NavbarConfig) {\r\n const {\r\n brand,\r\n navigation,\r\n useAuth,\r\n navbarGradient,\r\n userRoleLabel = 'User',\r\n authRoute = '/auth',\r\n settingsRoute = '/settings',\r\n isActiveOverride,\r\n } = config;\r\n\r\n // Return the configured Navbar component\r\n const Navbar = () => {\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const { user, isAuthenticated, logout } = useAuth();\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n const handleMenuOpen = (event: { currentTarget: HTMLElement }) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleMenuClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleLogout = () => {\r\n handleMenuClose();\r\n logout();\r\n navigate('/');\r\n };\r\n\r\n // Close menu on scroll - professional UX\r\n useEffect(() => {\r\n const handleScroll = () => {\r\n if (anchorEl) {\r\n handleMenuClose();\r\n }\r\n };\r\n\r\n window.addEventListener('scroll', handleScroll);\r\n return () => window.removeEventListener('scroll', handleScroll);\r\n }, [anchorEl]);\r\n\r\n // Check if a nav item is active\r\n const isActive = (path: string): boolean => {\r\n if (isActiveOverride) {\r\n return isActiveOverride(path, location.pathname);\r\n }\r\n return location.pathname === path;\r\n };\r\n\r\n // Build navigation items based on auth state\r\n const getNavigationItems = (): NavigationItem[] => {\r\n if (!isAuthenticated) {\r\n return navigation.public;\r\n }\r\n return [...navigation.public, ...navigation.authenticated];\r\n };\r\n\r\n const navigationItems = getNavigationItems();\r\n const isMenuOpen = Boolean(anchorEl);\r\n\r\n return (\r\n <AppBar \r\n position=\"fixed\" \r\n sx={{ \r\n background: `linear-gradient(135deg, ${navbarGradient.start} 0%, ${navbarGradient.end} 100%)`,\r\n boxShadow: '0 4px 20px rgba(24, 0, 173, 0.3)',\r\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\r\n top: 0,\r\n zIndex: 1100\r\n }}\r\n >\r\n <Toolbar sx={{ px: 3 }}>\r\n {/* Logo - Clickable Home Button with Icon */}\r\n <Box \r\n sx={{ \r\n display: 'flex', \r\n alignItems: 'center', \r\n flexGrow: 1,\r\n cursor: 'pointer',\r\n '&:hover': {\r\n opacity: 0.85\r\n },\r\n transition: 'opacity 0.2s ease'\r\n }}\r\n onClick={() => navigate('/')}\r\n >\r\n {/* Logo Icon */}\r\n <Box\r\n component=\"img\"\r\n src={brand.logo}\r\n alt={brand.name}\r\n sx={{\r\n width: 36,\r\n height: 36,\r\n borderRadius: '8px',\r\n mr: 2,\r\n boxShadow: '0 2px 8px rgba(96, 165, 250, 0.3)'\r\n }}\r\n />\r\n \r\n {/* Brand Name */}\r\n <Typography variant=\"h6\" component=\"div\" sx={{ \r\n fontWeight: 700,\r\n fontSize: '1.25rem',\r\n letterSpacing: '-0.5px',\r\n color: 'white'\r\n }}>\r\n {brand.name}\r\n </Typography>\r\n </Box>\r\n\r\n {/* Navigation Links */}\r\n <Box sx={{ \r\n display: { xs: 'none', md: 'flex' }, \r\n alignItems: 'center', \r\n gap: 1, \r\n mr: 3 \r\n }}>\r\n {navigationItems.slice(1).map((item) => (\r\n <Button\r\n key={item.id}\r\n color=\"inherit\"\r\n component={Link}\r\n to={item.id}\r\n startIcon={React.cloneElement(item.icon as React.ReactElement<{ sx?: object }>, { sx: { fontSize: '18px' } })}\r\n sx={{ \r\n textTransform: 'none',\r\n fontWeight: 500,\r\n px: 2,\r\n py: 1,\r\n borderRadius: '8px',\r\n backgroundColor: isActive(item.id) ? 'rgba(255, 255, 255, 0.15)' : 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\r\n transform: 'translateY(-1px)'\r\n },\r\n transition: 'all 0.2s ease',\r\n textDecoration: 'none'\r\n }}\r\n >\r\n {item.label}\r\n </Button>\r\n ))}\r\n </Box>\r\n\r\n {/* Auth Actions */}\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\r\n {!isAuthenticated ? (\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(authRoute)}\r\n sx={{ \r\n bgcolor: 'white',\r\n color: 'primary.main',\r\n textTransform: 'none',\r\n fontWeight: 700,\r\n px: 3,\r\n '&:hover': { \r\n bgcolor: 'rgba(255, 255, 255, 0.9)',\r\n transform: 'translateY(-1px)'\r\n },\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Access Portal\r\n </Button>\r\n ) : (\r\n <IconButton\r\n size=\"large\"\r\n onClick={handleMenuOpen}\r\n color=\"inherit\"\r\n sx={{ \r\n '&:hover': { backgroundColor: 'rgba(255, 255, 255, 0.1)' }\r\n }}\r\n >\r\n <Avatar \r\n sx={{ \r\n width: 36, \r\n height: 36, \r\n bgcolor: 'rgba(255, 255, 255, 0.2)',\r\n fontSize: '1rem',\r\n fontWeight: 600,\r\n border: '2px solid rgba(255, 255, 255, 0.2)'\r\n }}\r\n >\r\n {user?.first_name ? user.first_name.charAt(0).toUpperCase() : 'U'}\r\n </Avatar>\r\n </IconButton>\r\n )}\r\n </Box>\r\n\r\n {/* User Dropdown Menu */}\r\n {isAuthenticated && (\r\n <Menu\r\n anchorEl={anchorEl}\r\n open={isMenuOpen}\r\n onClose={handleMenuClose}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }}\r\n transformOrigin={{\r\n vertical: 'top',\r\n horizontal: 'right',\r\n }}\r\n PaperProps={{\r\n sx: {\r\n mt: 1.5,\r\n minWidth: 280,\r\n maxWidth: 320,\r\n borderRadius: '16px',\r\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08)',\r\n border: '1px solid rgba(0, 0, 0, 0.06)',\r\n overflow: 'hidden',\r\n backdropFilter: 'blur(10px)',\r\n '& .MuiList-root': {\r\n py: 1\r\n },\r\n '& .MuiMenuItem-root': {\r\n py: 1.25,\r\n px: 2.5,\r\n mx: 1,\r\n my: 0.25,\r\n borderRadius: '10px',\r\n fontSize: '0.9375rem',\r\n transition: 'all 0.15s cubic-bezier(0.4, 0, 0.2, 1)',\r\n '&:hover': {\r\n backgroundColor: 'rgba(59, 130, 246, 0.08)',\r\n transform: 'translateX(2px)'\r\n }\r\n },\r\n },\r\n }}\r\n slotProps={{\r\n paper: {\r\n elevation: 0\r\n }\r\n }}\r\n >\r\n {/* User Info Header */}\r\n <Box sx={{ \r\n px: 3, \r\n py: 2.5, \r\n background: 'linear-gradient(135deg, rgba(59, 130, 246, 0.05) 0%, rgba(147, 51, 234, 0.05) 100%)',\r\n borderBottom: '1px solid rgba(0, 0, 0, 0.06)'\r\n }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1.5 }}>\r\n <Avatar \r\n sx={{ \r\n width: 44, \r\n height: 44, \r\n bgcolor: 'primary.main',\r\n fontSize: '1.1rem',\r\n fontWeight: 700,\r\n mr: 1.5,\r\n boxShadow: '0 2px 8px rgba(59, 130, 246, 0.25)'\r\n }}\r\n >\r\n {user?.first_name ? user.first_name.charAt(0).toUpperCase() : 'U'}\r\n </Avatar>\r\n <Box sx={{ flex: 1, minWidth: 0 }}>\r\n <Typography \r\n variant=\"subtitle1\" \r\n fontWeight=\"600\" \r\n sx={{ \r\n mb: 0.25,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {user ? `${user.first_name} ${user.last_name}` : 'User'}\r\n </Typography>\r\n <Typography \r\n variant=\"caption\" \r\n color=\"text.secondary\"\r\n sx={{ \r\n display: 'block',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {user?.email || 'user@example.com'}\r\n </Typography>\r\n </Box>\r\n </Box>\r\n <Chip \r\n size=\"small\" \r\n label={userRoleLabel}\r\n color=\"primary\"\r\n sx={{\r\n height: 24,\r\n fontSize: '0.75rem',\r\n fontWeight: 600,\r\n borderRadius: '6px'\r\n }}\r\n />\r\n </Box>\r\n\r\n {/* Menu Items */}\r\n <Box sx={{ py: 0.5 }}>\r\n <MenuItem onClick={() => { navigate(settingsRoute); handleMenuClose(); }}>\r\n <SettingsIcon sx={{ mr: 2, fontSize: 20, color: 'text.secondary' }} />\r\n <Typography variant=\"body2\" fontWeight=\"500\">Settings</Typography>\r\n </MenuItem>\r\n \r\n <Divider sx={{ my: 0.5, mx: 1 }} />\r\n \r\n <MenuItem \r\n onClick={handleLogout} \r\n sx={{ \r\n color: 'error.main',\r\n '&:hover': {\r\n backgroundColor: 'rgba(239, 68, 68, 0.08)'\r\n }\r\n }}\r\n >\r\n <ExitToApp sx={{ mr: 2, fontSize: 20 }} />\r\n <Typography variant=\"body2\" fontWeight=\"500\">Sign Out</Typography>\r\n </MenuItem>\r\n </Box>\r\n </Menu>\r\n )}\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n };\r\n\r\n return Navbar;\r\n}\r\n","// ============================================================================\r\n// AUTH VIEW\r\n// ============================================================================\r\n// Login and registration page with configurable branding.\r\n// Props-based: pass branding, authApi, useAuth, generateOAuthNonce.\r\n//\r\n// Design:\r\n// - All customization via props\r\n// - No hidden imports or context\r\n// - Google OAuth with CSRF nonce protection\r\n// ============================================================================\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { GoogleLogin, CredentialResponse } from '@react-oauth/google';\r\nimport {\r\n Box,\r\n Typography,\r\n Button,\r\n TextField,\r\n Card,\r\n CardContent,\r\n Container,\r\n Chip,\r\n Alert,\r\n CircularProgress,\r\n Divider,\r\n Link,\r\n IconButton,\r\n InputAdornment,\r\n useTheme,\r\n Stack\r\n} from '@mui/material';\r\nimport {\r\n Email,\r\n Lock,\r\n Person,\r\n Business,\r\n Visibility,\r\n VisibilityOff,\r\n Security\r\n} from '@mui/icons-material';\r\nimport { AuthViewProps } from '../types';\r\n\r\nexport const AuthView: React.FC<AuthViewProps> = ({\r\n branding,\r\n authApi,\r\n useAuth,\r\n generateOAuthNonce,\r\n}) => {\r\n const theme = useTheme();\r\n const navigate = useNavigate();\r\n const { login, register, isLoading, error } = useAuth();\r\n \r\n const [mode, setMode] = useState<'login' | 'register'>('login');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [localError, setLocalError] = useState('');\r\n const [success, setSuccess] = useState('');\r\n \r\n // Generate nonce once on component mount for Google OAuth\r\n const [oauthNonce] = useState(() => generateOAuthNonce());\r\n\r\n useEffect(() => {\r\n console.log('[SECURITY] OAuth nonce generated:', oauthNonce.substring(0, 8) + '...');\r\n }, [oauthNonce]);\r\n\r\n const [formData, setFormData] = useState({\r\n email: '',\r\n password: '',\r\n name: '',\r\n company: '',\r\n confirmPassword: ''\r\n });\r\n\r\n const handleInputChange = (field: string) => (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormData(prev => ({\r\n ...prev,\r\n [field]: event.target.value\r\n }));\r\n setLocalError('');\r\n };\r\n\r\n const validateForm = () => {\r\n if (!formData.email || !formData.password) {\r\n setLocalError('Email and password are required');\r\n return false;\r\n }\r\n\r\n if (mode === 'register') {\r\n if (!formData.name) {\r\n setLocalError('Name is required');\r\n return false;\r\n }\r\n if (formData.password !== formData.confirmPassword) {\r\n setLocalError('Passwords do not match');\r\n return false;\r\n }\r\n if (formData.password.length < 6) {\r\n setLocalError('Password must be at least 6 characters');\r\n return false;\r\n }\r\n }\r\n\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(formData.email)) {\r\n setLocalError('Please enter a valid email address');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (event: React.FormEvent) => {\r\n event.preventDefault();\r\n \r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n setLocalError('');\r\n\r\n try {\r\n if (mode === 'login') {\r\n const success = await login(formData.email, formData.password);\r\n if (success) {\r\n setSuccess(branding.messages.loginSuccess);\r\n setTimeout(() => {\r\n navigate(branding.dashboardRoute);\r\n }, 1500);\r\n }\r\n } else {\r\n // Split name into first and last name\r\n const nameParts = formData.name.trim().split(' ');\r\n const firstName = nameParts[0] || formData.name;\r\n const lastName = nameParts.slice(1).join(' ') || 'User';\r\n \r\n const success = await register(formData.email, formData.password, firstName, lastName);\r\n if (success) {\r\n setSuccess(branding.messages.registerSuccess);\r\n setTimeout(() => {\r\n navigate(branding.dashboardRoute);\r\n }, 1500);\r\n }\r\n }\r\n } catch (err: any) {\r\n setLocalError(err.message || 'Authentication failed. Please try again.');\r\n }\r\n };\r\n\r\n const switchMode = () => {\r\n setMode(mode === 'login' ? 'register' : 'login');\r\n setLocalError('');\r\n setSuccess('');\r\n setFormData({\r\n email: '',\r\n password: '',\r\n name: '',\r\n company: '',\r\n confirmPassword: ''\r\n });\r\n };\r\n\r\n // Google OAuth success handler\r\n const handleGoogleSuccess = async (credentialResponse: CredentialResponse) => {\r\n try {\r\n setLocalError('');\r\n \r\n if (!credentialResponse.credential) {\r\n throw new Error('No credential received from Google');\r\n }\r\n\r\n // Single call handles nonce verification and cleanup\r\n const result = await authApi.googleLogin(credentialResponse.credential);\r\n \r\n if (result.is_new_user) {\r\n setSuccess(branding.messages.googleNewUser);\r\n }\r\n \r\n window.location.href = branding.dashboardRoute;\r\n \r\n } catch (err: any) {\r\n setLocalError(err.message || 'Google authentication failed');\r\n }\r\n };\r\n\r\n const handleGoogleError = () => {\r\n setLocalError('Google authentication failed. Please try again.');\r\n };\r\n\r\n const displayError = localError || error;\r\n\r\n return (\r\n <Box sx={{ \r\n minHeight: '100vh',\r\n background: 'var(--basecamp-bg)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n py: { xs: 0, md: 4 },\r\n px: { xs: 0, md: 3 }\r\n }}>\r\n <Container maxWidth=\"sm\" sx={{ px: { xs: 0, md: 3 } }}>\r\n <Card\r\n sx={{\r\n width: '100%',\r\n maxWidth: { xs: '100%', sm: 400, md: 380 },\r\n margin: '0 auto',\r\n boxShadow: { xs: 'none', md: '0 8px 40px rgba(30, 64, 175, 0.12)' },\r\n border: { xs: 'none', md: '1px solid rgba(30, 64, 175, 0.08)' },\r\n borderRadius: { xs: 0, md: 2.5 },\r\n overflow: 'hidden',\r\n minHeight: { xs: '100vh', md: 'auto' }\r\n }}\r\n >\r\n <CardContent sx={{ p: { xs: 2.5, sm: 3.5, md: 4 } }}>\r\n {/* Logo & Brand - Uses BRANDING config */}\r\n <Box sx={{ textAlign: 'center', mb: { xs: 2.5, md: 3.5 } }}>\r\n <Box\r\n sx={{\r\n width: { xs: 48, md: 56 },\r\n height: { xs: 48, md: 56 },\r\n background: branding.primaryGradient,\r\n borderRadius: { xs: 1.5, md: 2 },\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: { xs: 1.5, md: 2 },\r\n boxShadow: branding.logoShadow,\r\n }}\r\n >\r\n <Typography sx={{ \r\n fontWeight: 900, \r\n fontSize: { xs: '1.5rem', md: '1.75rem' },\r\n color: 'white',\r\n }}>\r\n {branding.logoLetter}\r\n </Typography>\r\n </Box>\r\n \r\n <Typography \r\n variant=\"h4\" \r\n fontWeight={800} \r\n sx={{ \r\n mb: { xs: 0.25, md: 0.5 }, \r\n color: 'text.primary',\r\n fontSize: { xs: '1.375rem', sm: '1.5rem', md: '1.75rem' }\r\n }}\r\n >\r\n {branding.appName}\r\n </Typography>\r\n <Typography \r\n variant=\"body1\" \r\n color=\"text.secondary\" \r\n sx={{ fontSize: { xs: '0.8125rem', md: '0.875rem' } }}\r\n >\r\n {branding.tagline}\r\n </Typography>\r\n </Box>\r\n\r\n {/* Google OAuth - Custom Styled Button */}\r\n <Button\r\n fullWidth\r\n variant=\"outlined\"\r\n size=\"large\"\r\n onClick={() => {\r\n const googleBtn = document.querySelector('[role=\"button\"]') as HTMLElement;\r\n if (googleBtn) googleBtn.click();\r\n }}\r\n sx={{\r\n py: { xs: 1.1, md: 1.3 },\r\n mb: { xs: 2, md: 2.5 },\r\n borderColor: 'rgba(0, 0, 0, 0.23)',\r\n color: 'text.primary',\r\n textTransform: 'none',\r\n fontSize: { xs: '0.875rem', md: '0.9375rem' },\r\n fontWeight: 500,\r\n '&:hover': {\r\n borderColor: 'rgba(0, 0, 0, 0.4)',\r\n bgcolor: 'rgba(0, 0, 0, 0.02)'\r\n },\r\n display: 'flex',\r\n gap: 1.5,\r\n justifyContent: 'center'\r\n }}\r\n >\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M19.6 10.227c0-.709-.064-1.39-.182-2.045H10v3.868h5.382a4.6 4.6 0 01-1.996 3.018v2.51h3.232c1.891-1.742 2.982-4.305 2.982-7.35z\" fill=\"#4285F4\"/>\r\n <path d=\"M10 20c2.7 0 4.964-.895 6.618-2.423l-3.232-2.509c-.895.6-2.04.955-3.386.955-2.605 0-4.81-1.76-5.595-4.123H1.064v2.59A9.996 9.996 0 0010 20z\" fill=\"#34A853\"/>\r\n <path d=\"M4.405 11.9c-.2-.6-.314-1.24-.314-1.9 0-.66.114-1.3.314-1.9V5.51H1.064A9.996 9.996 0 000 10c0 1.614.386 3.14 1.064 4.49l3.34-2.59z\" fill=\"#FBBC05\"/>\r\n <path d=\"M10 3.977c1.468 0 2.786.505 3.823 1.496l2.868-2.868C14.959.99 12.695 0 10 0 6.09 0 2.71 2.24 1.064 5.51l3.34 2.59C5.19 5.736 7.395 3.977 10 3.977z\" fill=\"#EA4335\"/>\r\n </svg>\r\n Sign in with Google\r\n </Button>\r\n\r\n {/* Hidden Google Login Component */}\r\n <Box sx={{ display: 'none' }}>\r\n <GoogleLogin\r\n onSuccess={handleGoogleSuccess}\r\n onError={handleGoogleError}\r\n nonce={oauthNonce}\r\n />\r\n </Box>\r\n\r\n <Divider sx={{ my: { xs: 2, md: 2.5 } }}>\r\n <Chip label=\"or\" size=\"small\" sx={{ fontSize: { xs: '0.75rem', md: '0.8125rem' } }} />\r\n </Divider>\r\n\r\n {/* Alerts */}\r\n {displayError && (\r\n <Alert severity=\"error\" sx={{ mb: { xs: 2, md: 2.5 }, fontSize: { xs: '0.8125rem', md: '0.875rem' } }}>\r\n {displayError}\r\n </Alert>\r\n )}\r\n {success && (\r\n <Alert severity=\"success\" sx={{ mb: { xs: 2, md: 2.5 }, fontSize: { xs: '0.8125rem', md: '0.875rem' } }}>\r\n {success}\r\n </Alert>\r\n )}\r\n\r\n {/* Form */}\r\n <Box component=\"form\" onSubmit={handleSubmit}>\r\n <Stack spacing={{ xs: 1.75, md: 2 }}>\r\n {mode === 'register' && (\r\n <>\r\n <TextField\r\n fullWidth\r\n label=\"Full Name\"\r\n value={formData.name}\r\n onChange={handleInputChange('name')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Person />\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n <TextField\r\n fullWidth\r\n label=\"Company Name (Optional)\"\r\n value={formData.company}\r\n onChange={handleInputChange('company')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Business />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </>\r\n )}\r\n\r\n <TextField\r\n fullWidth\r\n label=\"Email Address\"\r\n type=\"email\"\r\n value={formData.email}\r\n onChange={handleInputChange('email')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Email />\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n\r\n <TextField\r\n fullWidth\r\n label=\"Password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={formData.password}\r\n onChange={handleInputChange('password')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Lock />\r\n </InputAdornment>\r\n ),\r\n endAdornment: (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n onClick={() => setShowPassword(!showPassword)}\r\n edge=\"end\"\r\n >\r\n {showPassword ? <VisibilityOff /> : <Visibility />}\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n\r\n {mode === 'register' && (\r\n <TextField\r\n fullWidth\r\n label=\"Confirm Password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={formData.confirmPassword}\r\n onChange={handleInputChange('confirmPassword')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Lock />\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n )}\r\n\r\n <Button\r\n type=\"submit\"\r\n variant=\"contained\"\r\n fullWidth\r\n size=\"large\"\r\n disabled={isLoading}\r\n sx={{\r\n py: { xs: 1.1, md: 1.3 },\r\n fontSize: { xs: '0.875rem', md: '0.9375rem' },\r\n fontWeight: 600,\r\n textTransform: 'none',\r\n mt: { xs: 0.5, md: 0.75 },\r\n background: branding.primaryGradient,\r\n '&:hover': {\r\n background: branding.primaryGradientHover,\r\n }\r\n }}\r\n >\r\n {isLoading ? (\r\n <CircularProgress size={24} color=\"inherit\" />\r\n ) : (\r\n mode === 'login' ? 'Sign In' : 'Create Account'\r\n )}\r\n </Button>\r\n </Stack>\r\n </Box>\r\n\r\n {/* Footer Links */}\r\n <Box sx={{ textAlign: 'center', mt: { xs: 2.5, md: 3 } }}>\r\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ fontSize: { xs: '0.8125rem', md: '0.875rem' } }}>\r\n {mode === 'login' ? \"Don't have an account? \" : \"Already have an account? \"}\r\n <Link\r\n component=\"button\"\r\n type=\"button\"\r\n onClick={switchMode}\r\n sx={{\r\n fontWeight: 600,\r\n textDecoration: 'none',\r\n color: theme.palette.primary.main,\r\n fontSize: { xs: '0.8125rem', md: '0.875rem' },\r\n '&:hover': {\r\n textDecoration: 'underline'\r\n }\r\n }}\r\n >\r\n {mode === 'login' ? 'Sign up free' : 'Sign in'}\r\n </Link>\r\n </Typography>\r\n </Box>\r\n\r\n {mode === 'login' && (\r\n <Box sx={{ textAlign: 'center', mt: { xs: 1.5, md: 2 } }}>\r\n <Link\r\n component=\"button\"\r\n type=\"button\"\r\n variant=\"body2\"\r\n onClick={() => navigate('/forgot-password')}\r\n sx={{\r\n color: theme.palette.text.secondary,\r\n textDecoration: 'none',\r\n fontSize: { xs: '0.75rem', md: '0.8125rem' },\r\n '&:hover': {\r\n textDecoration: 'underline',\r\n color: theme.palette.primary.main\r\n }\r\n }}\r\n >\r\n Forgot your password?\r\n </Link>\r\n </Box>\r\n )}\r\n\r\n {/* Security Badge */}\r\n <Box sx={{ textAlign: 'center', mt: { xs: 2.5, md: 3 }, pt: { xs: 2.5, md: 3 }, borderTop: '1px solid', borderColor: 'divider' }}>\r\n <Chip \r\n icon={<Security sx={{ fontSize: { xs: '12px', md: '13px' } }} />}\r\n label={branding.securityBadge}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n sx={{ \r\n color: 'text.secondary',\r\n borderColor: 'divider',\r\n fontSize: { xs: '0.6875rem', md: '0.75rem' }\r\n }}\r\n />\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Container>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AuthView;\r\n","// ========================================================================\r\n// PASSWORD RESET REQUEST VIEW\r\n// Allows users to request a password reset link via email\r\n// ========================================================================\r\n\r\nimport { useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Paper,\r\n Typography,\r\n TextField,\r\n Button,\r\n Box,\r\n Alert,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport { Email as EmailIcon, ArrowBack } from '@mui/icons-material';\r\n\r\nexport interface ForgotPasswordViewProps {\r\n /** Auth API object with requestPasswordReset method */\r\n authApi: {\r\n requestPasswordReset: (email: string) => Promise<unknown>;\r\n };\r\n /** Route to navigate back to login (default: '/auth') */\r\n authRoute?: string;\r\n}\r\n\r\nexport default function ForgotPasswordView({ authApi, authRoute = '/auth' }: ForgotPasswordViewProps) {\r\n const navigate = useNavigate();\r\n const [email, setEmail] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setLoading(true);\r\n\r\n try {\r\n const result = await authApi.requestPasswordReset(email) as { dev_token?: string } | undefined;\r\n setSuccess(true);\r\n \r\n // Show dev token in development mode ONLY (Vite exposes import.meta.env.DEV)\r\n if (import.meta.env.DEV && result?.dev_token) {\r\n console.log('[DEV] Password reset token:', result.dev_token);\r\n alert(`[DEV MODE] Reset token: ${result.dev_token}\\nUse this at /reset-password?token=${result.dev_token}`);\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to send reset email');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <EmailIcon sx={{ fontSize: 64, color: 'success.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Check Your Email\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n If an account exists with the email <strong>{email}</strong>, \r\n you will receive a password reset link shortly.\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\r\n The link will expire in 1 hour for security reasons.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(authRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Back to Login\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Button\r\n startIcon={<ArrowBack />}\r\n onClick={() => navigate(authRoute)}\r\n sx={{ mb: 2 }}\r\n >\r\n Back to Login\r\n </Button>\r\n\r\n <Typography variant=\"h4\" gutterBottom>\r\n Reset Password\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Enter your email address and we'll send you a link to reset your password.\r\n </Typography>\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n\r\n <Box component=\"form\" onSubmit={handleSubmit}>\r\n <TextField\r\n fullWidth\r\n label=\"Email Address\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n autoFocus\r\n sx={{ mb: 3 }}\r\n />\r\n\r\n <Button\r\n type=\"submit\"\r\n fullWidth\r\n variant=\"contained\"\r\n size=\"large\"\r\n disabled={loading}\r\n startIcon={loading ? <CircularProgress size={20} /> : <EmailIcon />}\r\n >\r\n {loading ? 'Sending...' : 'Send Reset Link'}\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n}\r\n","// ========================================================================\r\n// PASSWORD RESET VIEW\r\n// Allows users to set a new password using the reset token from email\r\n// ========================================================================\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Paper,\r\n Typography,\r\n TextField,\r\n Button,\r\n Box,\r\n Alert,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport { Lock as LockIcon, CheckCircle } from '@mui/icons-material';\r\n\r\nexport interface ResetPasswordViewProps {\r\n /** Auth API object with resetPassword method */\r\n authApi: {\r\n resetPassword: (token: string, newPassword: string) => Promise<unknown>;\r\n };\r\n /** Route to navigate after successful reset (default: '/auth') */\r\n authRoute?: string;\r\n}\r\n\r\nexport default function ResetPasswordView({ authApi, authRoute = '/auth' }: ResetPasswordViewProps) {\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setError('Invalid or missing reset token');\r\n }\r\n }, [token]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n // Validation\r\n if (newPassword.length < 8) {\r\n setError('Password must be at least 8 characters long');\r\n return;\r\n }\r\n\r\n if (newPassword !== confirmPassword) {\r\n setError('Passwords do not match');\r\n return;\r\n }\r\n\r\n if (!token) {\r\n setError('Invalid reset token');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n\r\n try {\r\n await authApi.resetPassword(token, newPassword);\r\n setSuccess(true);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to reset password');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <CheckCircle sx={{ fontSize: 64, color: 'success.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Password Reset Successful\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Your password has been updated. You can now log in with your new password.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(authRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Go to Login\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Typography variant=\"h4\" gutterBottom>\r\n Set New Password\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Enter your new password below.\r\n </Typography>\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n\r\n <Box component=\"form\" onSubmit={handleSubmit}>\r\n <TextField\r\n fullWidth\r\n label=\"New Password\"\r\n type=\"password\"\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n required\r\n autoFocus\r\n helperText=\"Must be at least 8 characters\"\r\n sx={{ mb: 2 }}\r\n />\r\n\r\n <TextField\r\n fullWidth\r\n label=\"Confirm New Password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n sx={{ mb: 3 }}\r\n />\r\n\r\n <Button\r\n type=\"submit\"\r\n fullWidth\r\n variant=\"contained\"\r\n size=\"large\"\r\n disabled={loading || !token}\r\n startIcon={loading ? <CircularProgress size={20} /> : <LockIcon />}\r\n >\r\n {loading ? 'Resetting...' : 'Reset Password'}\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n}\r\n","// ========================================================================\r\n// EMAIL VERIFICATION VIEW\r\n// Verifies user's email address using token from verification email\r\n// ========================================================================\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Paper,\r\n Typography,\r\n Button,\r\n Box,\r\n Alert,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport { CheckCircle, Error as ErrorIcon } from '@mui/icons-material';\r\n\r\nexport interface VerifyEmailViewProps {\r\n /** Auth API object with verifyEmail method */\r\n authApi: {\r\n verifyEmail: (token: string) => Promise<unknown>;\r\n };\r\n /** Route to navigate after successful verification (default: '/projects') */\r\n successRoute?: string;\r\n /** Route to navigate on error (default: '/settings') */\r\n errorRoute?: string;\r\n}\r\n\r\nexport default function VerifyEmailView({ \r\n authApi, \r\n successRoute = '/projects',\r\n errorRoute = '/settings'\r\n}: VerifyEmailViewProps) {\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setError('Invalid or missing verification token');\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n await authApi.verifyEmail(token);\r\n setSuccess(true);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to verify email');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token]);\r\n\r\n if (loading) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <CircularProgress size={64} sx={{ mb: 2 }} />\r\n <Typography variant=\"h5\">\r\n Verifying your email...\r\n </Typography>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n if (success) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <CheckCircle sx={{ fontSize: 64, color: 'success.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Email Verified!\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Your email address has been successfully verified. \r\n You can now access all features of your account.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(successRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Continue\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <ErrorIcon sx={{ fontSize: 64, color: 'error.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Verification Failed\r\n </Typography>\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n <Typography color=\"text.secondary\" paragraph>\r\n The verification link may have expired or is invalid. \r\n Please request a new verification email from your account settings.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(errorRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Go to Settings\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n}\r\n","/**\r\n * Support View - Simplified & Clean\r\n */\r\nimport { useState } from 'react';\r\nimport {\r\n Box,\r\n Typography,\r\n Card,\r\n CardContent,\r\n Button,\r\n TextField,\r\n Alert,\r\n Stack,\r\n Divider,\r\n} from '@mui/material';\r\nimport {\r\n Email as EmailIcon,\r\n Send as SendIcon,\r\n CheckCircle as CheckCircleIcon,\r\n} from '@mui/icons-material';\r\n\r\nconst SupportView = () => {\r\n const [supportForm, setSupportForm] = useState({\r\n subject: '',\r\n message: '',\r\n });\r\n const [formSubmitted, setFormSubmitted] = useState(false);\r\n\r\n const handleFormChange = (field: string) => (event: { target: { value: string } }) => {\r\n setSupportForm(prev => ({\r\n ...prev,\r\n [field]: event.target.value\r\n }));\r\n };\r\n\r\n const handleSubmitSupport = (event: { preventDefault: () => void }) => {\r\n event.preventDefault();\r\n setFormSubmitted(true);\r\n setTimeout(() => {\r\n setFormSubmitted(false);\r\n setSupportForm({ subject: '', message: '' });\r\n }, 3000);\r\n };\r\n\r\n return (\r\n <Box sx={{ maxWidth: '1400px', margin: '0 auto', p: 3 }}>\r\n {/* Header */}\r\n <Box sx={{ mb: 4 }}>\r\n <Typography variant=\"h4\" component=\"h1\" sx={{ fontWeight: 700, mb: 1, color: 'text.primary' }}>\r\n Support\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 3 }}>\r\n Need help? Send us a message and we'll get back to you within 4 hours\r\n </Typography>\r\n \r\n {/* Status */}\r\n <Alert \r\n severity=\"success\" \r\n icon={<CheckCircleIcon />}\r\n sx={{ \r\n maxWidth: 600,\r\n '& .MuiAlert-message': {\r\n fontSize: '0.9rem',\r\n }\r\n }}\r\n >\r\n All systems operational • Average response: 2.3 hours\r\n </Alert>\r\n </Box>\r\n\r\n <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '2fr 1fr' }, gap: 4 }}>\r\n {/* Support Form */}\r\n <Card sx={{ boxShadow: 2 }}>\r\n <CardContent sx={{ p: 4 }}>\r\n <Typography variant=\"h6\" sx={{ fontWeight: 600, mb: 3 }}>\r\n Send Support Request\r\n </Typography>\r\n \r\n {formSubmitted && (\r\n <Alert severity=\"success\" sx={{ mb: 3 }}>\r\n Request submitted! We'll respond within 4 hours.\r\n </Alert>\r\n )}\r\n\r\n <Box component=\"form\" onSubmit={handleSubmitSupport}>\r\n <Stack spacing={3}>\r\n <TextField\r\n fullWidth\r\n label=\"Subject\"\r\n value={supportForm.subject}\r\n onChange={handleFormChange('subject')}\r\n placeholder=\"Brief description of your issue\"\r\n required\r\n />\r\n \r\n <TextField\r\n fullWidth\r\n label=\"Message\"\r\n multiline\r\n rows={8}\r\n value={supportForm.message}\r\n onChange={handleFormChange('message')}\r\n placeholder=\"Please provide details about your issue...\"\r\n required\r\n />\r\n \r\n <Button\r\n type=\"submit\"\r\n variant=\"contained\"\r\n size=\"large\"\r\n startIcon={<SendIcon />}\r\n disabled={formSubmitted}\r\n sx={{\r\n bgcolor: 'primary.main',\r\n color: 'white',\r\n fontWeight: 600,\r\n py: 1.5,\r\n borderRadius: 1.5,\r\n textTransform: 'none',\r\n '&:hover': {\r\n bgcolor: 'primary.dark',\r\n }\r\n }}\r\n >\r\n Send Request\r\n </Button>\r\n </Stack>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Quick Help Sidebar */}\r\n <Box>\r\n <Card sx={{ boxShadow: 2, bgcolor: 'primary.lighter' }}>\r\n <CardContent sx={{ p: 3 }}>\r\n <Typography variant=\"h6\" sx={{ fontWeight: 600, mb: 2 }}>\r\n Quick Help\r\n </Typography>\r\n <Stack spacing={1.5}>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n • Check the Documentation page for API guides\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n • View your API usage on the Dashboard\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n • Manage projects in the Projects page\r\n </Typography>\r\n </Stack>\r\n </CardContent>\r\n </Card>\r\n\r\n <Card sx={{ boxShadow: 2, mt: 3 }}>\r\n <CardContent sx={{ p: 3 }}>\r\n <Typography variant=\"h6\" sx={{ fontWeight: 600, mb: 2 }}>\r\n Response Time\r\n </Typography>\r\n <Stack spacing={1.5}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\r\n <EmailIcon sx={{ color: 'primary.main', fontSize: 20 }} />\r\n <Box>\r\n <Typography variant=\"body2\" fontWeight={600}>\r\n Average response\r\n </Typography>\r\n <Typography variant=\"caption\" color=\"text.secondary\">\r\n Within 4 hours\r\n </Typography>\r\n </Box>\r\n </Box>\r\n <Divider />\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Monday - Friday\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n 9:00 AM - 6:00 PM PST\r\n </Typography>\r\n </Stack>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SupportView;","// ========================================================================\r\n// SETTINGS VIEW\r\n// ========================================================================\r\n// Universal user settings and account management view.\r\n// Works with any frontblok-auth API instance.\r\n//\r\n// Features:\r\n// - Profile information display\r\n// - Sign out\r\n// - Account deletion with confirmation dialog\r\n//\r\n// This is the base settings view that every RationalBloks app needs.\r\n// Apps can extend it by wrapping or composing additional sections.\r\n//\r\n// Usage:\r\n// import { SettingsView } from '@rationalbloks/frontblok-components';\r\n// \r\n// <SettingsView\r\n// authApi={authApi}\r\n// useAuth={useClientAuth}\r\n// />\r\n// ========================================================================\r\n\r\nimport React, { useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Typography,\r\n Box,\r\n Paper,\r\n Button,\r\n Divider,\r\n Avatar,\r\n Stack,\r\n Alert,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n TextField,\r\n} from '@mui/material';\r\nimport {\r\n Person as PersonIcon,\r\n ExitToApp as LogoutIcon,\r\n DeleteForever as DeleteIcon,\r\n} from '@mui/icons-material';\r\n\r\n// ========================================================================\r\n// TYPES\r\n// ========================================================================\r\n\r\nexport interface SettingsViewAuthApi {\r\n deleteAccount: (password: string, confirmText: string) => Promise<{ message: string; note: string }>;\r\n}\r\n\r\nexport interface SettingsViewUser {\r\n first_name?: string;\r\n last_name?: string;\r\n email?: string;\r\n}\r\n\r\nexport interface SettingsViewProps {\r\n /** The auth API instance (must have deleteAccount method) */\r\n authApi: SettingsViewAuthApi;\r\n /** The useAuth hook from your app */\r\n useAuth: () => {\r\n user: SettingsViewUser | null;\r\n logout: () => void;\r\n };\r\n /** Route to navigate to after logout/delete. Default: '/' */\r\n homeRoute?: string;\r\n /** Optional additional content to render between profile and danger zone */\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ========================================================================\r\n// COMPONENT\r\n// ========================================================================\r\n\r\nexport const SettingsView: React.FC<SettingsViewProps> = ({\r\n authApi,\r\n useAuth,\r\n homeRoute = '/',\r\n children,\r\n}) => {\r\n const navigate = useNavigate();\r\n const { user, logout } = useAuth();\r\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\r\n const [deleteConfirmation, setDeleteConfirmation] = useState('');\r\n const [deletePassword, setDeletePassword] = useState('');\r\n const [error, setError] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const handleLogout = () => {\r\n logout();\r\n navigate(homeRoute);\r\n };\r\n\r\n const handleDeleteAccount = async () => {\r\n if (deleteConfirmation !== 'DELETE') {\r\n setError('Please type DELETE to confirm');\r\n return;\r\n }\r\n\r\n if (!deletePassword) {\r\n setError('Please enter your password');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.deleteAccount(deletePassword, deleteConfirmation);\r\n logout();\r\n navigate(homeRoute);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to delete account');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <Container maxWidth=\"md\" sx={{ py: 4 }}>\r\n <Typography variant=\"h4\" fontWeight={700} gutterBottom>\r\n Settings\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"text.secondary\" paragraph>\r\n Manage your account settings and preferences.\r\n </Typography>\r\n\r\n {/* Profile Section */}\r\n <Paper sx={{ p: 3, mb: 3 }}>\r\n <Typography variant=\"h6\" fontWeight={600} gutterBottom>\r\n Profile Information\r\n </Typography>\r\n <Divider sx={{ mb: 3 }} />\r\n \r\n <Stack direction=\"row\" spacing={3} alignItems=\"center\">\r\n <Avatar\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n bgcolor: 'primary.main',\r\n fontSize: '2rem',\r\n }}\r\n >\r\n {user?.first_name?.charAt(0).toUpperCase() || <PersonIcon />}\r\n </Avatar>\r\n <Box>\r\n <Typography variant=\"h5\" fontWeight={600}>\r\n {user?.first_name} {user?.last_name}\r\n </Typography>\r\n <Typography color=\"text.secondary\">\r\n {user?.email}\r\n </Typography>\r\n </Box>\r\n </Stack>\r\n </Paper>\r\n\r\n {/* Account Actions */}\r\n <Paper sx={{ p: 3, mb: 3 }}>\r\n <Typography variant=\"h6\" fontWeight={600} gutterBottom>\r\n Account Actions\r\n </Typography>\r\n <Divider sx={{ mb: 3 }} />\r\n\r\n <Stack spacing={2}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\r\n <Box>\r\n <Typography fontWeight={500}>Sign Out</Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Sign out of your account on this device.\r\n </Typography>\r\n </Box>\r\n <Button\r\n variant=\"outlined\"\r\n startIcon={<LogoutIcon />}\r\n onClick={handleLogout}\r\n >\r\n Sign Out\r\n </Button>\r\n </Box>\r\n </Stack>\r\n </Paper>\r\n\r\n {/* Optional additional content (app-specific settings sections) */}\r\n {children}\r\n\r\n {/* Danger Zone */}\r\n <Paper sx={{ p: 3, border: '1px solid', borderColor: 'error.main' }}>\r\n <Typography variant=\"h6\" fontWeight={600} color=\"error\" gutterBottom>\r\n Danger Zone\r\n </Typography>\r\n <Divider sx={{ mb: 3 }} />\r\n\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\r\n <Box>\r\n <Typography fontWeight={500}>Delete Account</Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Permanently delete your account and all associated data.\r\n </Typography>\r\n </Box>\r\n <Button\r\n variant=\"outlined\"\r\n color=\"error\"\r\n startIcon={<DeleteIcon />}\r\n onClick={() => setDeleteDialogOpen(true)}\r\n >\r\n Delete Account\r\n </Button>\r\n </Box>\r\n </Paper>\r\n\r\n {/* Delete Confirmation Dialog */}\r\n <Dialog open={deleteDialogOpen} onClose={() => setDeleteDialogOpen(false)}>\r\n <DialogTitle>Delete Account</DialogTitle>\r\n <DialogContent>\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n This action cannot be undone. All your data will be permanently deleted.\r\n </Alert>\r\n <Typography paragraph>\r\n Enter your password and type <strong>DELETE</strong> to confirm:\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n type=\"password\"\r\n value={deletePassword}\r\n onChange={(e) => setDeletePassword(e.target.value)}\r\n placeholder=\"Enter your password\"\r\n sx={{ mb: 2 }}\r\n />\r\n <TextField\r\n fullWidth\r\n value={deleteConfirmation}\r\n onChange={(e) => setDeleteConfirmation(e.target.value)}\r\n placeholder=\"Type DELETE to confirm\"\r\n />\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => setDeleteDialogOpen(false)}>Cancel</Button>\r\n <Button\r\n color=\"error\"\r\n variant=\"contained\"\r\n onClick={handleDeleteAccount}\r\n disabled={loading}\r\n >\r\n {loading ? 'Deleting...' : 'Delete My Account'}\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default SettingsView;\r\n","// ========================================================================\r\n// THEME CONFIGURATION\r\n// ========================================================================\r\n// Universal MUI theme factory for RationalBloks apps.\r\n//\r\n// Provides the standard RationalBloks look & feel (warm beige background,\r\n// professional blue palette, polished typography) while allowing per-app\r\n// customization through options.\r\n//\r\n// This lives in the package so theme improvements (new component overrides,\r\n// better defaults) propagate to all apps via npm update.\r\n//\r\n// Usage:\r\n// import { createAppTheme } from '@rationalbloks/frontblok-components';\r\n// const theme = createAppTheme(); // standard theme\r\n// const theme = createAppTheme({ paletteOverrides: { primary: { main: '#e91e63' } } });\r\n// ========================================================================\r\n\r\nimport { createTheme, type ThemeOptions } from '@mui/material/styles';\r\n\r\n// ========================================================================\r\n// DEFAULT COLOR PALETTE\r\n// ========================================================================\r\n\r\nexport const defaultPalette = {\r\n primary: {\r\n main: '#1e40af',\r\n 50: '#eff6ff',\r\n 100: '#dbeafe',\r\n 500: '#3b82f6',\r\n 600: '#2563eb',\r\n 700: '#1d4ed8',\r\n 900: '#1e3a8a',\r\n },\r\n secondary: {\r\n main: '#6b7280',\r\n },\r\n success: {\r\n main: '#10b981',\r\n },\r\n warning: {\r\n main: '#f59e0b',\r\n },\r\n error: {\r\n main: '#ef4444',\r\n },\r\n background: {\r\n default: 'hsl(33.3, 60%, 97.1%)', // Beautiful warm beige\r\n paper: '#FCFAF7', // Warm white for cards\r\n },\r\n};\r\n\r\n// ========================================================================\r\n// DEFAULT TYPOGRAPHY\r\n// ========================================================================\r\n\r\nexport const defaultTypography = {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n h1: {\r\n fontWeight: 700,\r\n letterSpacing: '-0.5px',\r\n },\r\n h2: {\r\n fontWeight: 700,\r\n letterSpacing: '-0.4px',\r\n },\r\n h3: {\r\n fontWeight: 600,\r\n letterSpacing: '-0.3px',\r\n },\r\n h4: {\r\n fontWeight: 700,\r\n letterSpacing: '-0.2px',\r\n },\r\n h5: {\r\n fontWeight: 600,\r\n letterSpacing: '-0.1px',\r\n },\r\n h6: {\r\n fontWeight: 600,\r\n letterSpacing: '-0.08px',\r\n },\r\n};\r\n\r\n// ========================================================================\r\n// DEFAULT COMPONENT OVERRIDES\r\n// ========================================================================\r\n\r\nexport const defaultComponents: ThemeOptions['components'] = {\r\n MuiButton: {\r\n styleOverrides: {\r\n root: {\r\n textTransform: 'none' as const,\r\n fontWeight: 600,\r\n borderRadius: '8px',\r\n },\r\n },\r\n },\r\n MuiCard: {\r\n styleOverrides: {\r\n root: {\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.05)',\r\n border: '1px solid #f3f4f6',\r\n },\r\n },\r\n },\r\n MuiChip: {\r\n styleOverrides: {\r\n root: {\r\n fontWeight: 600,\r\n },\r\n },\r\n },\r\n MuiSelect: {\r\n styleOverrides: {\r\n select: {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n MuiTextField: {\r\n styleOverrides: {\r\n root: {\r\n '& .MuiInputBase-input': {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n },\r\n MuiInputBase: {\r\n styleOverrides: {\r\n root: {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n MuiMenuItem: {\r\n styleOverrides: {\r\n root: {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n};\r\n\r\n// ========================================================================\r\n// DEFAULT NAVBAR GRADIENT\r\n// ========================================================================\r\n\r\nexport const defaultNavbarGradient = {\r\n start: '#1800ad',\r\n end: '#0d0067',\r\n};\r\n\r\n// ========================================================================\r\n// THEME FACTORY FUNCTION\r\n// ========================================================================\r\n\r\nexport interface AppThemeOptions {\r\n /** Override default palette colors */\r\n paletteOverrides?: Record<string, unknown>;\r\n /** Override default typography settings */\r\n typographyOverrides?: Record<string, unknown>;\r\n /** Override default component styles */\r\n componentsOverrides?: ThemeOptions['components'];\r\n /** Border radius for shapes. Default: 12 */\r\n borderRadius?: number;\r\n}\r\n\r\n/**\r\n * Creates a MUI theme with RationalBloks defaults.\r\n * \r\n * All defaults can be overridden per-app via the options parameter.\r\n * The defaults include:\r\n * - Warm beige background\r\n * - Professional blue primary palette\r\n * - System font typography with tight letter-spacing\r\n * - Polished component overrides (no uppercase buttons, rounded cards, etc.)\r\n * \r\n * @param options - Customization options\r\n * @returns A MUI Theme object\r\n * \r\n * @example\r\n * ```typescript\r\n * // Use defaults\r\n * const theme = createAppTheme();\r\n * \r\n * // Override primary color\r\n * const theme = createAppTheme({\r\n * paletteOverrides: { primary: { main: '#e91e63' } },\r\n * });\r\n * ```\r\n */\r\nexport function createAppTheme(options: AppThemeOptions = {}) {\r\n const {\r\n paletteOverrides = {},\r\n typographyOverrides = {},\r\n componentsOverrides = {},\r\n borderRadius = 12,\r\n } = options;\r\n\r\n return createTheme({\r\n palette: {\r\n ...defaultPalette,\r\n ...paletteOverrides,\r\n } as ThemeOptions['palette'],\r\n typography: {\r\n ...defaultTypography,\r\n ...typographyOverrides,\r\n },\r\n shape: {\r\n borderRadius,\r\n },\r\n components: {\r\n ...defaultComponents,\r\n ...componentsOverrides,\r\n },\r\n });\r\n}\r\n"],"names":["Component","jsx","Container","Box","jsxs","Paper","Typography","Button","InfoIcon","WarningIcon","ErrorIcon","SuccessIcon","Dialog","DialogTitle","alpha","DialogContent","Alert","Divider","DialogActions","CircularProgress","useNavigate","useLocation","useState","useEffect","AppBar","Toolbar","Link","IconButton","Avatar","Menu","Chip","MenuItem","SettingsIcon","ExitToApp","useTheme","success","Card","CardContent","GoogleLogin","Stack","Fragment","TextField","InputAdornment","Person","Business","Email","Lock","VisibilityOff","Visibility","Security","EmailIcon","ArrowBack","useSearchParams","CheckCircle","LockIcon","CheckCircleIcon","SendIcon","PersonIcon","LogoutIcon","DeleteIcon","createTheme"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/shared/ErrorBoundary.tsx","../src/shared/ConfirmationModal.tsx","../src/shared/ErrorFallback.tsx","../src/shared/Navbar.tsx","../src/views/AuthView.tsx","../src/views/ForgotPasswordView.tsx","../src/views/ResetPasswordView.tsx","../src/views/VerifyEmailView.tsx","../src/views/SupportView.tsx","../src/views/SettingsView.tsx","../src/theme/index.ts"],"sourcesContent":["// ========================================================================\r\n// STYLED ERROR BOUNDARY\r\n// ========================================================================\r\n// Standalone styled error boundary with MUI aesthetics.\r\n// ========================================================================\r\n\r\nimport { Component, ErrorInfo, ReactNode } from 'react';\r\nimport { Box, Button, Typography, Container, Paper } from '@mui/material';\r\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n supportEmail?: string;\r\n}\r\n\r\ninterface State {\r\n hasError: boolean;\r\n error: Error | null;\r\n errorInfo: ErrorInfo | null;\r\n}\r\n\r\nclass ErrorBoundary extends Component<Props, State> {\r\n constructor(props: Props) {\r\n super(props);\r\n this.state = {\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): Partial<State> {\r\n return {\r\n hasError: true,\r\n error,\r\n };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n console.error('React Error Boundary caught an error:', error);\r\n console.error('Error Info:', errorInfo);\r\n \r\n this.setState({\r\n error,\r\n errorInfo,\r\n });\r\n }\r\n\r\n resetError = () => {\r\n this.setState({\r\n hasError: false,\r\n error: null,\r\n errorInfo: null,\r\n });\r\n \r\n window.location.href = '/';\r\n };\r\n\r\n render() {\r\n const supportEmail = this.props.supportEmail || 'support@example.com';\r\n \r\n if (this.state.hasError) {\r\n return (\r\n <Container maxWidth=\"md\">\r\n <Box\r\n sx={{\r\n minHeight: '100vh',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n py: 4,\r\n }}\r\n >\r\n <Paper\r\n elevation={3}\r\n sx={{\r\n p: 4,\r\n textAlign: 'center',\r\n maxWidth: 600,\r\n }}\r\n >\r\n <ErrorOutlineIcon\r\n sx={{\r\n fontSize: 80,\r\n color: 'error.main',\r\n mb: 2,\r\n }}\r\n />\r\n \r\n <Typography variant=\"h4\" gutterBottom fontWeight={700}>\r\n Oops! Something went wrong\r\n </Typography>\r\n \r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 3 }}>\r\n We're sorry for the inconvenience. An unexpected error occurred.\r\n Our team has been notified and we're working on a fix.\r\n </Typography>\r\n\r\n {/* Show error details in development mode */}\r\n {import.meta.env.DEV && this.state.error && (\r\n <Paper\r\n variant=\"outlined\"\r\n sx={{\r\n p: 2,\r\n mb: 3,\r\n textAlign: 'left',\r\n backgroundColor: '#f5f5f5',\r\n maxHeight: 300,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <Typography variant=\"subtitle2\" fontWeight={600} gutterBottom>\r\n Error Details (Development Only):\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n component=\"pre\"\r\n sx={{\r\n fontFamily: 'monospace',\r\n fontSize: '0.75rem',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {this.state.error.toString()}\r\n {this.state.errorInfo?.componentStack}\r\n </Typography>\r\n </Paper>\r\n )}\r\n\r\n <Box sx={{ display: 'flex', gap: 2, justifyContent: 'center' }}>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={this.resetError}\r\n size=\"large\"\r\n >\r\n Return to Home\r\n </Button>\r\n \r\n <Button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n onClick={() => window.location.reload()}\r\n size=\"large\"\r\n >\r\n Reload Page\r\n </Button>\r\n </Box>\r\n\r\n <Typography\r\n variant=\"caption\"\r\n color=\"text.secondary\"\r\n sx={{ mt: 3, display: 'block' }}\r\n >\r\n If the problem persists, please contact{' '}\r\n <a href={`mailto:${supportEmail}`}>{supportEmail}</a>\r\n </Typography>\r\n </Paper>\r\n </Box>\r\n </Container>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n\r\nexport default ErrorBoundary;\r\n","// ========================================================================\r\n// STYLED CONFIRMATION MODAL\r\n// ========================================================================\r\n// Beautiful confirmation modal with MUI aesthetics.\r\n// ========================================================================\r\n\r\nimport React from 'react';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Button,\r\n Box,\r\n Typography,\r\n CircularProgress,\r\n Alert,\r\n Divider,\r\n alpha,\r\n} from '@mui/material';\r\nimport {\r\n Warning as WarningIcon,\r\n CheckCircle as SuccessIcon,\r\n Error as ErrorIcon,\r\n Info as InfoIcon,\r\n} from '@mui/icons-material';\r\n\r\nexport type ConfirmationModalSeverity = 'info' | 'warning' | 'error' | 'success';\r\n\r\nexport interface ConfirmationModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n onConfirm: () => void;\r\n title: string;\r\n message: string | React.ReactNode;\r\n confirmText?: string;\r\n cancelText?: string;\r\n severity?: ConfirmationModalSeverity;\r\n isLoading?: boolean;\r\n warning?: string;\r\n details?: { label: string; oldValue: string; newValue: string }[];\r\n bulletPoints?: string[];\r\n}\r\n\r\nconst severityConfig = {\r\n info: { icon: InfoIcon, color: 'info.main', bgColor: 'info.light' },\r\n warning: { icon: WarningIcon, color: 'warning.main', bgColor: 'warning.light' },\r\n error: { icon: ErrorIcon, color: 'error.main', bgColor: 'error.light' },\r\n success: { icon: SuccessIcon, color: 'success.main', bgColor: 'success.light' },\r\n};\r\n\r\nexport const ConfirmationModal: React.FC<ConfirmationModalProps> = ({\r\n open,\r\n onClose,\r\n onConfirm,\r\n title,\r\n message,\r\n confirmText = 'Confirm',\r\n cancelText = 'Cancel',\r\n severity = 'info',\r\n isLoading = false,\r\n warning,\r\n details,\r\n bulletPoints,\r\n}) => {\r\n const config = severityConfig[severity];\r\n const IconComponent = config.icon;\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={isLoading ? undefined : onClose}\r\n maxWidth=\"sm\"\r\n fullWidth\r\n PaperProps={{\r\n sx: {\r\n borderRadius: 2,\r\n boxShadow: '0 8px 32px rgba(0,0,0,0.12)',\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 1.5,\r\n pb: 1,\r\n borderBottom: '1px solid',\r\n borderColor: 'divider',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n width: 40,\r\n height: 40,\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n bgcolor: (theme) => alpha(theme.palette[severity].main, 0.1),\r\n }}\r\n >\r\n <IconComponent sx={{ color: config.color, fontSize: 24 }} />\r\n </Box>\r\n <Typography variant=\"h6\" fontWeight={600}>\r\n {title}\r\n </Typography>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ pt: 2.5, pb: 1 }}>\r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 2 }}>\r\n {message}\r\n </Typography>\r\n\r\n {details && details.length > 0 && (\r\n <Box\r\n sx={{\r\n bgcolor: 'grey.50',\r\n borderRadius: 1,\r\n p: 2,\r\n mb: 2,\r\n }}\r\n >\r\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1.5 }}>\r\n Changes:\r\n </Typography>\r\n {details.map((detail, index) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n py: 0.75,\r\n borderBottom: index < details.length - 1 ? '1px solid' : 'none',\r\n borderColor: 'divider',\r\n }}\r\n >\r\n <Typography variant=\"body2\" fontWeight={500}>\r\n {detail.label}\r\n </Typography>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n {detail.oldValue}\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"primary.main\" fontWeight={600}>\r\n →\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"primary.main\" fontWeight={600}>\r\n {detail.newValue}\r\n </Typography>\r\n </Box>\r\n </Box>\r\n ))}\r\n </Box>\r\n )}\r\n\r\n {warning && (\r\n <Alert\r\n severity=\"warning\"\r\n icon={<WarningIcon />}\r\n sx={{\r\n mb: 2,\r\n '& .MuiAlert-message': {\r\n fontWeight: 500,\r\n },\r\n }}\r\n >\r\n {warning}\r\n </Alert>\r\n )}\r\n\r\n {bulletPoints && bulletPoints.length > 0 && (\r\n <Box sx={{ mb: 1 }}>\r\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1 }}>\r\n This action will:\r\n </Typography>\r\n <Box component=\"ul\" sx={{ m: 0, pl: 2.5 }}>\r\n {bulletPoints.map((point, index) => (\r\n <Box\r\n component=\"li\"\r\n key={index}\r\n sx={{ mb: 0.5 }}\r\n >\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n {point}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n )}\r\n </DialogContent>\r\n\r\n <Divider />\r\n\r\n <DialogActions sx={{ px: 3, py: 2, gap: 1 }}>\r\n <Button\r\n onClick={onClose}\r\n disabled={isLoading}\r\n variant=\"outlined\"\r\n color=\"inherit\"\r\n sx={{ minWidth: 100 }}\r\n >\r\n {cancelText}\r\n </Button>\r\n <Button\r\n onClick={onConfirm}\r\n disabled={isLoading}\r\n variant=\"contained\"\r\n color={severity === 'error' ? 'error' : severity === 'warning' ? 'warning' : 'primary'}\r\n sx={{ minWidth: 120 }}\r\n startIcon={isLoading ? <CircularProgress size={18} color=\"inherit\" /> : null}\r\n >\r\n {isLoading ? 'Processing...' : confirmText}\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default ConfirmationModal;\r\n","// ========================================================================\r\n// STYLED ERROR FALLBACK\r\n// ========================================================================\r\n// Beautiful error fallback UI using MUI components.\r\n// ========================================================================\r\n\r\nimport React from 'react';\r\nimport { Box, Button, Typography, Container, Paper } from '@mui/material';\r\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\r\n\r\nexport interface ErrorFallbackProps {\r\n error: Error | null;\r\n errorInfo: React.ErrorInfo | null;\r\n resetError: () => void;\r\n supportEmail: string;\r\n}\r\n\r\n// Styled Error Fallback\r\n//\r\n// Use this as the renderFallback prop for ErrorBoundary:\r\n//\r\n// <ErrorBoundary renderFallback={ErrorFallback}>\r\n// <App />\r\n// </ErrorBoundary>\r\nexport const ErrorFallback: React.FC<ErrorFallbackProps> = ({\r\n error,\r\n errorInfo,\r\n resetError,\r\n supportEmail,\r\n}) => {\r\n return (\r\n <Container maxWidth=\"md\">\r\n <Box\r\n sx={{\r\n minHeight: '100vh',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n py: 4,\r\n }}\r\n >\r\n <Paper\r\n elevation={3}\r\n sx={{\r\n p: 4,\r\n textAlign: 'center',\r\n maxWidth: 600,\r\n }}\r\n >\r\n <ErrorOutlineIcon\r\n sx={{\r\n fontSize: 80,\r\n color: 'error.main',\r\n mb: 2,\r\n }}\r\n />\r\n \r\n <Typography variant=\"h4\" gutterBottom fontWeight={700}>\r\n Oops! Something went wrong\r\n </Typography>\r\n \r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 3 }}>\r\n We're sorry for the inconvenience. An unexpected error occurred.\r\n Our team has been notified and we're working on a fix.\r\n </Typography>\r\n\r\n {/* Show error details in development mode */}\r\n {import.meta.env.DEV && error && (\r\n <Paper\r\n variant=\"outlined\"\r\n sx={{\r\n p: 2,\r\n mb: 3,\r\n textAlign: 'left',\r\n backgroundColor: '#f5f5f5',\r\n maxHeight: 300,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <Typography variant=\"subtitle2\" fontWeight={600} gutterBottom>\r\n Error Details (Development Only):\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n component=\"pre\"\r\n sx={{\r\n fontFamily: 'monospace',\r\n fontSize: '0.75rem',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n }}\r\n >\r\n {error.toString()}\r\n {errorInfo?.componentStack}\r\n </Typography>\r\n </Paper>\r\n )}\r\n\r\n <Box sx={{ display: 'flex', gap: 2, justifyContent: 'center' }}>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={resetError}\r\n size=\"large\"\r\n >\r\n Return to Home\r\n </Button>\r\n \r\n <Button\r\n variant=\"outlined\"\r\n color=\"secondary\"\r\n onClick={() => window.location.reload()}\r\n size=\"large\"\r\n >\r\n Reload Page\r\n </Button>\r\n </Box>\r\n\r\n <Typography\r\n variant=\"caption\"\r\n color=\"text.secondary\"\r\n sx={{ mt: 3, display: 'block' }}\r\n >\r\n If the problem persists, please contact{' '}\r\n <a href={`mailto:${supportEmail}`}>{supportEmail}</a>\r\n </Typography>\r\n </Paper>\r\n </Box>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default ErrorFallback;\r\n","// ========================================================================\r\n// STYLED NAVBAR\r\n// ========================================================================\r\n// Configurable styled navbar with MUI aesthetics.\r\n// All the visual aesthetics (gradient, colors, shadows, etc.) are defined here.\r\n// ========================================================================\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useNavigate, useLocation, Link } from 'react-router-dom';\r\nimport {\r\n AppBar,\r\n Toolbar,\r\n Typography,\r\n Button,\r\n Box,\r\n Avatar,\r\n Menu,\r\n MenuItem,\r\n IconButton,\r\n Chip,\r\n Divider\r\n} from '@mui/material';\r\nimport {\r\n ExitToApp,\r\n Settings as SettingsIcon,\r\n} from '@mui/icons-material';\r\n\r\n// ========================================================================\r\n// TYPE DEFINITIONS\r\n// ========================================================================\r\n\r\nexport interface NavigationItem {\r\n id: string; // Route path\r\n label: string; // Display text\r\n icon: React.ReactElement;\r\n}\r\n\r\nexport interface BrandConfig {\r\n name: string;\r\n logo: string;\r\n}\r\n\r\nexport interface NavigationConfig {\r\n public: NavigationItem[];\r\n authenticated: NavigationItem[];\r\n}\r\n\r\nexport interface AuthHookResult {\r\n user: {\r\n first_name?: string;\r\n last_name?: string;\r\n email?: string;\r\n } | null;\r\n isAuthenticated: boolean;\r\n logout: () => void;\r\n}\r\n\r\nexport interface NavbarConfig {\r\n brand: BrandConfig;\r\n navigation: NavigationConfig;\r\n useAuth: () => AuthHookResult;\r\n // Gradient colors for navbar background\r\n navbarGradient: {\r\n start: string; // e.g., '#1800ad'\r\n end: string; // e.g., '#0d0067'\r\n };\r\n userRoleLabel?: string;\r\n authRoute?: string;\r\n settingsRoute?: string;\r\n isActiveOverride?: (path: string, locationPath: string) => boolean;\r\n}\r\n\r\n// ========================================================================\r\n// NAVBAR FACTORY\r\n// ========================================================================\r\n\r\nexport function createNavbar(config: NavbarConfig) {\r\n const {\r\n brand,\r\n navigation,\r\n useAuth,\r\n navbarGradient,\r\n userRoleLabel = 'User',\r\n authRoute = '/auth',\r\n settingsRoute = '/settings',\r\n isActiveOverride,\r\n } = config;\r\n\r\n // Return the configured Navbar component\r\n const Navbar = () => {\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const { user, isAuthenticated, logout } = useAuth();\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n const handleMenuOpen = (event: { currentTarget: HTMLElement }) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleMenuClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleLogout = () => {\r\n handleMenuClose();\r\n logout();\r\n navigate('/');\r\n };\r\n\r\n // Close menu on scroll - professional UX\r\n useEffect(() => {\r\n const handleScroll = () => {\r\n if (anchorEl) {\r\n handleMenuClose();\r\n }\r\n };\r\n\r\n window.addEventListener('scroll', handleScroll);\r\n return () => window.removeEventListener('scroll', handleScroll);\r\n }, [anchorEl]);\r\n\r\n // Check if a nav item is active\r\n const isActive = (path: string): boolean => {\r\n if (isActiveOverride) {\r\n return isActiveOverride(path, location.pathname);\r\n }\r\n return location.pathname === path;\r\n };\r\n\r\n // Build navigation items based on auth state\r\n const getNavigationItems = (): NavigationItem[] => {\r\n if (!isAuthenticated) {\r\n return navigation.public;\r\n }\r\n return [...navigation.public, ...navigation.authenticated];\r\n };\r\n\r\n const navigationItems = getNavigationItems();\r\n const isMenuOpen = Boolean(anchorEl);\r\n\r\n return (\r\n <AppBar \r\n position=\"fixed\" \r\n sx={{ \r\n background: `linear-gradient(135deg, ${navbarGradient.start} 0%, ${navbarGradient.end} 100%)`,\r\n boxShadow: '0 4px 20px rgba(24, 0, 173, 0.3)',\r\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\r\n top: 0,\r\n zIndex: 1100\r\n }}\r\n >\r\n <Toolbar sx={{ px: 3 }}>\r\n {/* Logo - Clickable Home Button with Icon */}\r\n <Box \r\n sx={{ \r\n display: 'flex', \r\n alignItems: 'center', \r\n flexGrow: 1,\r\n cursor: 'pointer',\r\n '&:hover': {\r\n opacity: 0.85\r\n },\r\n transition: 'opacity 0.2s ease'\r\n }}\r\n onClick={() => navigate('/')}\r\n >\r\n {/* Logo Icon */}\r\n <Box\r\n component=\"img\"\r\n src={brand.logo}\r\n alt={brand.name}\r\n sx={{\r\n width: 36,\r\n height: 36,\r\n borderRadius: '8px',\r\n mr: 2,\r\n boxShadow: '0 2px 8px rgba(96, 165, 250, 0.3)'\r\n }}\r\n />\r\n \r\n {/* Brand Name */}\r\n <Typography variant=\"h6\" component=\"div\" sx={{ \r\n fontWeight: 700,\r\n fontSize: '1.25rem',\r\n letterSpacing: '-0.5px',\r\n color: 'white'\r\n }}>\r\n {brand.name}\r\n </Typography>\r\n </Box>\r\n\r\n {/* Navigation Links */}\r\n <Box sx={{ \r\n display: { xs: 'none', md: 'flex' }, \r\n alignItems: 'center', \r\n gap: 1, \r\n mr: 3 \r\n }}>\r\n {navigationItems.slice(1).map((item) => (\r\n <Button\r\n key={item.id}\r\n color=\"inherit\"\r\n component={Link}\r\n to={item.id}\r\n startIcon={React.cloneElement(item.icon as React.ReactElement<{ sx?: object }>, { sx: { fontSize: '18px' } })}\r\n sx={{ \r\n textTransform: 'none',\r\n fontWeight: 500,\r\n px: 2,\r\n py: 1,\r\n borderRadius: '8px',\r\n backgroundColor: isActive(item.id) ? 'rgba(255, 255, 255, 0.15)' : 'transparent',\r\n '&:hover': { \r\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\r\n transform: 'translateY(-1px)'\r\n },\r\n transition: 'all 0.2s ease',\r\n textDecoration: 'none'\r\n }}\r\n >\r\n {item.label}\r\n </Button>\r\n ))}\r\n </Box>\r\n\r\n {/* Auth Actions */}\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\r\n {!isAuthenticated ? (\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(authRoute)}\r\n sx={{ \r\n bgcolor: 'white',\r\n color: 'primary.main',\r\n textTransform: 'none',\r\n fontWeight: 700,\r\n px: 3,\r\n '&:hover': { \r\n bgcolor: 'rgba(255, 255, 255, 0.9)',\r\n transform: 'translateY(-1px)'\r\n },\r\n transition: 'all 0.2s ease'\r\n }}\r\n >\r\n Access Portal\r\n </Button>\r\n ) : (\r\n <IconButton\r\n size=\"large\"\r\n onClick={handleMenuOpen}\r\n color=\"inherit\"\r\n sx={{ \r\n '&:hover': { backgroundColor: 'rgba(255, 255, 255, 0.1)' }\r\n }}\r\n >\r\n <Avatar \r\n sx={{ \r\n width: 36, \r\n height: 36, \r\n bgcolor: 'rgba(255, 255, 255, 0.2)',\r\n fontSize: '1rem',\r\n fontWeight: 600,\r\n border: '2px solid rgba(255, 255, 255, 0.2)'\r\n }}\r\n >\r\n {user?.first_name ? user.first_name.charAt(0).toUpperCase() : 'U'}\r\n </Avatar>\r\n </IconButton>\r\n )}\r\n </Box>\r\n\r\n {/* User Dropdown Menu */}\r\n {isAuthenticated && (\r\n <Menu\r\n anchorEl={anchorEl}\r\n open={isMenuOpen}\r\n onClose={handleMenuClose}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }}\r\n transformOrigin={{\r\n vertical: 'top',\r\n horizontal: 'right',\r\n }}\r\n PaperProps={{\r\n sx: {\r\n mt: 1.5,\r\n minWidth: 280,\r\n maxWidth: 320,\r\n borderRadius: '16px',\r\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08)',\r\n border: '1px solid rgba(0, 0, 0, 0.06)',\r\n overflow: 'hidden',\r\n backdropFilter: 'blur(10px)',\r\n '& .MuiList-root': {\r\n py: 1\r\n },\r\n '& .MuiMenuItem-root': {\r\n py: 1.25,\r\n px: 2.5,\r\n mx: 1,\r\n my: 0.25,\r\n borderRadius: '10px',\r\n fontSize: '0.9375rem',\r\n transition: 'all 0.15s cubic-bezier(0.4, 0, 0.2, 1)',\r\n '&:hover': {\r\n backgroundColor: 'rgba(59, 130, 246, 0.08)',\r\n transform: 'translateX(2px)'\r\n }\r\n },\r\n },\r\n }}\r\n slotProps={{\r\n paper: {\r\n elevation: 0\r\n }\r\n }}\r\n >\r\n {/* User Info Header */}\r\n <Box sx={{ \r\n px: 3, \r\n py: 2.5, \r\n background: 'linear-gradient(135deg, rgba(59, 130, 246, 0.05) 0%, rgba(147, 51, 234, 0.05) 100%)',\r\n borderBottom: '1px solid rgba(0, 0, 0, 0.06)'\r\n }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1.5 }}>\r\n <Avatar \r\n sx={{ \r\n width: 44, \r\n height: 44, \r\n bgcolor: 'primary.main',\r\n fontSize: '1.1rem',\r\n fontWeight: 700,\r\n mr: 1.5,\r\n boxShadow: '0 2px 8px rgba(59, 130, 246, 0.25)'\r\n }}\r\n >\r\n {user?.first_name ? user.first_name.charAt(0).toUpperCase() : 'U'}\r\n </Avatar>\r\n <Box sx={{ flex: 1, minWidth: 0 }}>\r\n <Typography \r\n variant=\"subtitle1\" \r\n fontWeight=\"600\" \r\n sx={{ \r\n mb: 0.25,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {user ? `${user.first_name} ${user.last_name}` : 'User'}\r\n </Typography>\r\n <Typography \r\n variant=\"caption\" \r\n color=\"text.secondary\"\r\n sx={{ \r\n display: 'block',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {user?.email || 'user@example.com'}\r\n </Typography>\r\n </Box>\r\n </Box>\r\n <Chip \r\n size=\"small\" \r\n label={userRoleLabel}\r\n color=\"primary\"\r\n sx={{\r\n height: 24,\r\n fontSize: '0.75rem',\r\n fontWeight: 600,\r\n borderRadius: '6px'\r\n }}\r\n />\r\n </Box>\r\n\r\n {/* Menu Items */}\r\n <Box sx={{ py: 0.5 }}>\r\n <MenuItem onClick={() => { navigate(settingsRoute); handleMenuClose(); }}>\r\n <SettingsIcon sx={{ mr: 2, fontSize: 20, color: 'text.secondary' }} />\r\n <Typography variant=\"body2\" fontWeight=\"500\">Settings</Typography>\r\n </MenuItem>\r\n \r\n <Divider sx={{ my: 0.5, mx: 1 }} />\r\n \r\n <MenuItem \r\n onClick={handleLogout} \r\n sx={{ \r\n color: 'error.main',\r\n '&:hover': {\r\n backgroundColor: 'rgba(239, 68, 68, 0.08)'\r\n }\r\n }}\r\n >\r\n <ExitToApp sx={{ mr: 2, fontSize: 20 }} />\r\n <Typography variant=\"body2\" fontWeight=\"500\">Sign Out</Typography>\r\n </MenuItem>\r\n </Box>\r\n </Menu>\r\n )}\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n };\r\n\r\n return Navbar;\r\n}\r\n","// ============================================================================\r\n// AUTH VIEW\r\n// ============================================================================\r\n// Login and registration page with configurable branding.\r\n// Props-based: pass branding, authApi, useAuth, generateOAuthNonce.\r\n//\r\n// Design:\r\n// - All customization via props\r\n// - No hidden imports or context\r\n// - Google OAuth with CSRF nonce protection\r\n// ============================================================================\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { GoogleLogin, CredentialResponse } from '@react-oauth/google';\r\nimport {\r\n Box,\r\n Typography,\r\n Button,\r\n TextField,\r\n Card,\r\n CardContent,\r\n Container,\r\n Chip,\r\n Alert,\r\n CircularProgress,\r\n Divider,\r\n Link,\r\n IconButton,\r\n InputAdornment,\r\n useTheme,\r\n Stack\r\n} from '@mui/material';\r\nimport {\r\n Email,\r\n Lock,\r\n Person,\r\n Business,\r\n Visibility,\r\n VisibilityOff,\r\n Security\r\n} from '@mui/icons-material';\r\nimport { AuthViewProps } from '../types';\r\n\r\nexport const AuthView: React.FC<AuthViewProps> = ({\r\n branding,\r\n authApi,\r\n useAuth,\r\n generateOAuthNonce,\r\n}) => {\r\n const theme = useTheme();\r\n const navigate = useNavigate();\r\n const { login, register, isLoading, error } = useAuth();\r\n \r\n const [mode, setMode] = useState<'login' | 'register'>('login');\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [localError, setLocalError] = useState('');\r\n const [success, setSuccess] = useState('');\r\n \r\n // Generate nonce once on component mount for Google OAuth\r\n const [oauthNonce] = useState(() => generateOAuthNonce());\r\n\r\n useEffect(() => {\r\n console.log('[SECURITY] OAuth nonce generated:', oauthNonce.substring(0, 8) + '...');\r\n }, [oauthNonce]);\r\n\r\n const [formData, setFormData] = useState({\r\n email: '',\r\n password: '',\r\n name: '',\r\n company: '',\r\n confirmPassword: ''\r\n });\r\n\r\n const handleInputChange = (field: string) => (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setFormData(prev => ({\r\n ...prev,\r\n [field]: event.target.value\r\n }));\r\n setLocalError('');\r\n };\r\n\r\n const validateForm = () => {\r\n if (!formData.email || !formData.password) {\r\n setLocalError('Email and password are required');\r\n return false;\r\n }\r\n\r\n if (mode === 'register') {\r\n if (!formData.name) {\r\n setLocalError('Name is required');\r\n return false;\r\n }\r\n if (formData.password !== formData.confirmPassword) {\r\n setLocalError('Passwords do not match');\r\n return false;\r\n }\r\n if (formData.password.length < 6) {\r\n setLocalError('Password must be at least 6 characters');\r\n return false;\r\n }\r\n }\r\n\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(formData.email)) {\r\n setLocalError('Please enter a valid email address');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const handleSubmit = async (event: React.FormEvent) => {\r\n event.preventDefault();\r\n \r\n if (!validateForm()) {\r\n return;\r\n }\r\n\r\n setLocalError('');\r\n\r\n try {\r\n if (mode === 'login') {\r\n const success = await login(formData.email, formData.password);\r\n if (success) {\r\n setSuccess(branding.messages.loginSuccess);\r\n setTimeout(() => {\r\n navigate(branding.dashboardRoute);\r\n }, 1500);\r\n }\r\n } else {\r\n // Split name into first and last name\r\n const nameParts = formData.name.trim().split(' ');\r\n const firstName = nameParts[0] || formData.name;\r\n const lastName = nameParts.slice(1).join(' ') || 'User';\r\n \r\n const success = await register(formData.email, formData.password, firstName, lastName);\r\n if (success) {\r\n setSuccess(branding.messages.registerSuccess);\r\n setTimeout(() => {\r\n navigate(branding.dashboardRoute);\r\n }, 1500);\r\n }\r\n }\r\n } catch (err: any) {\r\n setLocalError(err.message || 'Authentication failed. Please try again.');\r\n }\r\n };\r\n\r\n const switchMode = () => {\r\n setMode(mode === 'login' ? 'register' : 'login');\r\n setLocalError('');\r\n setSuccess('');\r\n setFormData({\r\n email: '',\r\n password: '',\r\n name: '',\r\n company: '',\r\n confirmPassword: ''\r\n });\r\n };\r\n\r\n // Google OAuth success handler\r\n const handleGoogleSuccess = async (credentialResponse: CredentialResponse) => {\r\n try {\r\n setLocalError('');\r\n \r\n if (!credentialResponse.credential) {\r\n throw new Error('No credential received from Google');\r\n }\r\n\r\n // Single call handles nonce verification and cleanup\r\n const result = await authApi.googleLogin(credentialResponse.credential);\r\n \r\n if (result.is_new_user) {\r\n setSuccess(branding.messages.googleNewUser);\r\n }\r\n \r\n window.location.href = branding.dashboardRoute;\r\n \r\n } catch (err: any) {\r\n setLocalError(err.message || 'Google authentication failed');\r\n }\r\n };\r\n\r\n const handleGoogleError = () => {\r\n setLocalError('Google authentication failed. Please try again.');\r\n };\r\n\r\n const displayError = localError || error;\r\n\r\n return (\r\n <Box sx={{ \r\n minHeight: '100vh',\r\n background: 'var(--basecamp-bg)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n py: { xs: 0, md: 4 },\r\n px: { xs: 0, md: 3 }\r\n }}>\r\n <Container maxWidth=\"sm\" sx={{ px: { xs: 0, md: 3 } }}>\r\n <Card\r\n sx={{\r\n width: '100%',\r\n maxWidth: { xs: '100%', sm: 400, md: 380 },\r\n margin: '0 auto',\r\n boxShadow: { xs: 'none', md: '0 8px 40px rgba(30, 64, 175, 0.12)' },\r\n border: { xs: 'none', md: '1px solid rgba(30, 64, 175, 0.08)' },\r\n borderRadius: { xs: 0, md: 2.5 },\r\n overflow: 'hidden',\r\n minHeight: { xs: '100vh', md: 'auto' }\r\n }}\r\n >\r\n <CardContent sx={{ p: { xs: 2.5, sm: 3.5, md: 4 } }}>\r\n {/* Logo & Brand - Uses BRANDING config */}\r\n <Box sx={{ textAlign: 'center', mb: { xs: 2.5, md: 3.5 } }}>\r\n <Box\r\n sx={{\r\n width: { xs: 48, md: 56 },\r\n height: { xs: 48, md: 56 },\r\n background: branding.primaryGradient,\r\n borderRadius: { xs: 1.5, md: 2 },\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: { xs: 1.5, md: 2 },\r\n boxShadow: branding.logoShadow,\r\n }}\r\n >\r\n <Typography sx={{ \r\n fontWeight: 900, \r\n fontSize: { xs: '1.5rem', md: '1.75rem' },\r\n color: 'white',\r\n }}>\r\n {branding.logoLetter}\r\n </Typography>\r\n </Box>\r\n \r\n <Typography \r\n variant=\"h4\" \r\n fontWeight={800} \r\n sx={{ \r\n mb: { xs: 0.25, md: 0.5 }, \r\n color: 'text.primary',\r\n fontSize: { xs: '1.375rem', sm: '1.5rem', md: '1.75rem' }\r\n }}\r\n >\r\n {branding.appName}\r\n </Typography>\r\n <Typography \r\n variant=\"body1\" \r\n color=\"text.secondary\" \r\n sx={{ fontSize: { xs: '0.8125rem', md: '0.875rem' } }}\r\n >\r\n {branding.tagline}\r\n </Typography>\r\n </Box>\r\n\r\n {/* Google OAuth - Custom Styled Button */}\r\n <Button\r\n fullWidth\r\n variant=\"outlined\"\r\n size=\"large\"\r\n onClick={() => {\r\n const googleBtn = document.querySelector('[role=\"button\"]') as HTMLElement;\r\n if (googleBtn) googleBtn.click();\r\n }}\r\n sx={{\r\n py: { xs: 1.1, md: 1.3 },\r\n mb: { xs: 2, md: 2.5 },\r\n borderColor: 'rgba(0, 0, 0, 0.23)',\r\n color: 'text.primary',\r\n textTransform: 'none',\r\n fontSize: { xs: '0.875rem', md: '0.9375rem' },\r\n fontWeight: 500,\r\n '&:hover': {\r\n borderColor: 'rgba(0, 0, 0, 0.4)',\r\n bgcolor: 'rgba(0, 0, 0, 0.02)'\r\n },\r\n display: 'flex',\r\n gap: 1.5,\r\n justifyContent: 'center'\r\n }}\r\n >\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M19.6 10.227c0-.709-.064-1.39-.182-2.045H10v3.868h5.382a4.6 4.6 0 01-1.996 3.018v2.51h3.232c1.891-1.742 2.982-4.305 2.982-7.35z\" fill=\"#4285F4\"/>\r\n <path d=\"M10 20c2.7 0 4.964-.895 6.618-2.423l-3.232-2.509c-.895.6-2.04.955-3.386.955-2.605 0-4.81-1.76-5.595-4.123H1.064v2.59A9.996 9.996 0 0010 20z\" fill=\"#34A853\"/>\r\n <path d=\"M4.405 11.9c-.2-.6-.314-1.24-.314-1.9 0-.66.114-1.3.314-1.9V5.51H1.064A9.996 9.996 0 000 10c0 1.614.386 3.14 1.064 4.49l3.34-2.59z\" fill=\"#FBBC05\"/>\r\n <path d=\"M10 3.977c1.468 0 2.786.505 3.823 1.496l2.868-2.868C14.959.99 12.695 0 10 0 6.09 0 2.71 2.24 1.064 5.51l3.34 2.59C5.19 5.736 7.395 3.977 10 3.977z\" fill=\"#EA4335\"/>\r\n </svg>\r\n Sign in with Google\r\n </Button>\r\n\r\n {/* Hidden Google Login Component */}\r\n <Box sx={{ display: 'none' }}>\r\n <GoogleLogin\r\n onSuccess={handleGoogleSuccess}\r\n onError={handleGoogleError}\r\n nonce={oauthNonce}\r\n />\r\n </Box>\r\n\r\n <Divider sx={{ my: { xs: 2, md: 2.5 } }}>\r\n <Chip label=\"or\" size=\"small\" sx={{ fontSize: { xs: '0.75rem', md: '0.8125rem' } }} />\r\n </Divider>\r\n\r\n {/* Alerts */}\r\n {displayError && (\r\n <Alert severity=\"error\" sx={{ mb: { xs: 2, md: 2.5 }, fontSize: { xs: '0.8125rem', md: '0.875rem' } }}>\r\n {displayError}\r\n </Alert>\r\n )}\r\n {success && (\r\n <Alert severity=\"success\" sx={{ mb: { xs: 2, md: 2.5 }, fontSize: { xs: '0.8125rem', md: '0.875rem' } }}>\r\n {success}\r\n </Alert>\r\n )}\r\n\r\n {/* Form */}\r\n <Box component=\"form\" onSubmit={handleSubmit}>\r\n <Stack spacing={{ xs: 1.75, md: 2 }}>\r\n {mode === 'register' && (\r\n <>\r\n <TextField\r\n fullWidth\r\n label=\"Full Name\"\r\n value={formData.name}\r\n onChange={handleInputChange('name')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Person />\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n <TextField\r\n fullWidth\r\n label=\"Company Name (Optional)\"\r\n value={formData.company}\r\n onChange={handleInputChange('company')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Business />\r\n </InputAdornment>\r\n ),\r\n }}\r\n />\r\n </>\r\n )}\r\n\r\n <TextField\r\n fullWidth\r\n label=\"Email Address\"\r\n type=\"email\"\r\n value={formData.email}\r\n onChange={handleInputChange('email')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Email />\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n\r\n <TextField\r\n fullWidth\r\n label=\"Password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={formData.password}\r\n onChange={handleInputChange('password')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Lock />\r\n </InputAdornment>\r\n ),\r\n endAdornment: (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n onClick={() => setShowPassword(!showPassword)}\r\n edge=\"end\"\r\n >\r\n {showPassword ? <VisibilityOff /> : <Visibility />}\r\n </IconButton>\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n\r\n {mode === 'register' && (\r\n <TextField\r\n fullWidth\r\n label=\"Confirm Password\"\r\n type={showPassword ? 'text' : 'password'}\r\n value={formData.confirmPassword}\r\n onChange={handleInputChange('confirmPassword')}\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <Lock />\r\n </InputAdornment>\r\n ),\r\n }}\r\n required\r\n />\r\n )}\r\n\r\n <Button\r\n type=\"submit\"\r\n variant=\"contained\"\r\n fullWidth\r\n size=\"large\"\r\n disabled={isLoading}\r\n sx={{\r\n py: { xs: 1.1, md: 1.3 },\r\n fontSize: { xs: '0.875rem', md: '0.9375rem' },\r\n fontWeight: 600,\r\n textTransform: 'none',\r\n mt: { xs: 0.5, md: 0.75 },\r\n background: branding.primaryGradient,\r\n '&:hover': {\r\n background: branding.primaryGradientHover,\r\n }\r\n }}\r\n >\r\n {isLoading ? (\r\n <CircularProgress size={24} color=\"inherit\" />\r\n ) : (\r\n mode === 'login' ? 'Sign In' : 'Create Account'\r\n )}\r\n </Button>\r\n </Stack>\r\n </Box>\r\n\r\n {/* Footer Links */}\r\n <Box sx={{ textAlign: 'center', mt: { xs: 2.5, md: 3 } }}>\r\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ fontSize: { xs: '0.8125rem', md: '0.875rem' } }}>\r\n {mode === 'login' ? \"Don't have an account? \" : \"Already have an account? \"}\r\n <Link\r\n component=\"button\"\r\n type=\"button\"\r\n onClick={switchMode}\r\n sx={{\r\n fontWeight: 600,\r\n textDecoration: 'none',\r\n color: theme.palette.primary.main,\r\n fontSize: { xs: '0.8125rem', md: '0.875rem' },\r\n '&:hover': {\r\n textDecoration: 'underline'\r\n }\r\n }}\r\n >\r\n {mode === 'login' ? 'Sign up free' : 'Sign in'}\r\n </Link>\r\n </Typography>\r\n </Box>\r\n\r\n {mode === 'login' && (\r\n <Box sx={{ textAlign: 'center', mt: { xs: 1.5, md: 2 } }}>\r\n <Link\r\n component=\"button\"\r\n type=\"button\"\r\n variant=\"body2\"\r\n onClick={() => navigate('/forgot-password')}\r\n sx={{\r\n color: theme.palette.text.secondary,\r\n textDecoration: 'none',\r\n fontSize: { xs: '0.75rem', md: '0.8125rem' },\r\n '&:hover': {\r\n textDecoration: 'underline',\r\n color: theme.palette.primary.main\r\n }\r\n }}\r\n >\r\n Forgot your password?\r\n </Link>\r\n </Box>\r\n )}\r\n\r\n {/* Security Badge */}\r\n <Box sx={{ textAlign: 'center', mt: { xs: 2.5, md: 3 }, pt: { xs: 2.5, md: 3 }, borderTop: '1px solid', borderColor: 'divider' }}>\r\n <Chip \r\n icon={<Security sx={{ fontSize: { xs: '12px', md: '13px' } }} />}\r\n label={branding.securityBadge}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n sx={{ \r\n color: 'text.secondary',\r\n borderColor: 'divider',\r\n fontSize: { xs: '0.6875rem', md: '0.75rem' }\r\n }}\r\n />\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Container>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AuthView;\r\n","// ========================================================================\r\n// PASSWORD RESET REQUEST VIEW\r\n// Allows users to request a password reset link via email\r\n// ========================================================================\r\n\r\nimport { useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Paper,\r\n Typography,\r\n TextField,\r\n Button,\r\n Box,\r\n Alert,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport { Email as EmailIcon, ArrowBack } from '@mui/icons-material';\r\n\r\nexport interface ForgotPasswordViewProps {\r\n // Auth API object with requestPasswordReset method\r\n authApi: {\r\n requestPasswordReset: (email: string) => Promise<unknown>;\r\n };\r\n // Route to navigate back to login (default: '/auth')\r\n authRoute?: string;\r\n}\r\n\r\nexport default function ForgotPasswordView({ authApi, authRoute = '/auth' }: ForgotPasswordViewProps) {\r\n const navigate = useNavigate();\r\n const [email, setEmail] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setLoading(true);\r\n\r\n try {\r\n const result = await authApi.requestPasswordReset(email) as { dev_token?: string } | undefined;\r\n setSuccess(true);\r\n \r\n // Show dev token in development mode ONLY (Vite exposes import.meta.env.DEV)\r\n if (import.meta.env.DEV && result?.dev_token) {\r\n console.log('[DEV] Password reset token:', result.dev_token);\r\n alert(`[DEV MODE] Reset token: ${result.dev_token}\\nUse this at /reset-password?token=${result.dev_token}`);\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to send reset email');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <EmailIcon sx={{ fontSize: 64, color: 'success.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Check Your Email\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n If an account exists with the email <strong>{email}</strong>, \r\n you will receive a password reset link shortly.\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\" paragraph>\r\n The link will expire in 1 hour for security reasons.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(authRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Back to Login\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Button\r\n startIcon={<ArrowBack />}\r\n onClick={() => navigate(authRoute)}\r\n sx={{ mb: 2 }}\r\n >\r\n Back to Login\r\n </Button>\r\n\r\n <Typography variant=\"h4\" gutterBottom>\r\n Reset Password\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Enter your email address and we'll send you a link to reset your password.\r\n </Typography>\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n\r\n <Box component=\"form\" onSubmit={handleSubmit}>\r\n <TextField\r\n fullWidth\r\n label=\"Email Address\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n autoComplete=\"email\"\r\n autoFocus\r\n sx={{ mb: 3 }}\r\n />\r\n\r\n <Button\r\n type=\"submit\"\r\n fullWidth\r\n variant=\"contained\"\r\n size=\"large\"\r\n disabled={loading}\r\n startIcon={loading ? <CircularProgress size={20} /> : <EmailIcon />}\r\n >\r\n {loading ? 'Sending...' : 'Send Reset Link'}\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n}\r\n","// ========================================================================\r\n// PASSWORD RESET VIEW\r\n// Allows users to set a new password using the reset token from email\r\n// ========================================================================\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Paper,\r\n Typography,\r\n TextField,\r\n Button,\r\n Box,\r\n Alert,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport { Lock as LockIcon, CheckCircle } from '@mui/icons-material';\r\n\r\nexport interface ResetPasswordViewProps {\r\n // Auth API object with resetPassword method\r\n authApi: {\r\n resetPassword: (token: string, newPassword: string) => Promise<unknown>;\r\n };\r\n // Route to navigate after successful reset (default: '/auth')\r\n authRoute?: string;\r\n}\r\n\r\nexport default function ResetPasswordView({ authApi, authRoute = '/auth' }: ResetPasswordViewProps) {\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setError('Invalid or missing reset token');\r\n }\r\n }, [token]);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n\r\n // Validation\r\n if (newPassword.length < 8) {\r\n setError('Password must be at least 8 characters long');\r\n return;\r\n }\r\n\r\n if (newPassword !== confirmPassword) {\r\n setError('Passwords do not match');\r\n return;\r\n }\r\n\r\n if (!token) {\r\n setError('Invalid reset token');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n\r\n try {\r\n await authApi.resetPassword(token, newPassword);\r\n setSuccess(true);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to reset password');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <CheckCircle sx={{ fontSize: 64, color: 'success.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Password Reset Successful\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Your password has been updated. You can now log in with your new password.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(authRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Go to Login\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Typography variant=\"h4\" gutterBottom>\r\n Set New Password\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Enter your new password below.\r\n </Typography>\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n\r\n <Box component=\"form\" onSubmit={handleSubmit}>\r\n <TextField\r\n fullWidth\r\n label=\"New Password\"\r\n type=\"password\"\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n required\r\n autoFocus\r\n helperText=\"Must be at least 8 characters\"\r\n sx={{ mb: 2 }}\r\n />\r\n\r\n <TextField\r\n fullWidth\r\n label=\"Confirm New Password\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n sx={{ mb: 3 }}\r\n />\r\n\r\n <Button\r\n type=\"submit\"\r\n fullWidth\r\n variant=\"contained\"\r\n size=\"large\"\r\n disabled={loading || !token}\r\n startIcon={loading ? <CircularProgress size={20} /> : <LockIcon />}\r\n >\r\n {loading ? 'Resetting...' : 'Reset Password'}\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n}\r\n","// ========================================================================\r\n// EMAIL VERIFICATION VIEW\r\n// Verifies user's email address using token from verification email\r\n// ========================================================================\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Paper,\r\n Typography,\r\n Button,\r\n Box,\r\n Alert,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport { CheckCircle, Error as ErrorIcon } from '@mui/icons-material';\r\n\r\nexport interface VerifyEmailViewProps {\r\n // Auth API object with verifyEmail method\r\n authApi: {\r\n verifyEmail: (token: string) => Promise<unknown>;\r\n };\r\n // Route to navigate after successful verification (default: '/projects')\r\n successRoute?: string;\r\n // Route to navigate on error (default: '/settings')\r\n errorRoute?: string;\r\n}\r\n\r\nexport default function VerifyEmailView({ \r\n authApi, \r\n successRoute = '/projects',\r\n errorRoute = '/settings'\r\n}: VerifyEmailViewProps) {\r\n const navigate = useNavigate();\r\n const [searchParams] = useSearchParams();\r\n const token = searchParams.get('token');\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n const verifyEmail = async () => {\r\n if (!token) {\r\n setError('Invalid or missing verification token');\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n await authApi.verifyEmail(token);\r\n setSuccess(true);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to verify email');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n verifyEmail();\r\n }, [token]);\r\n\r\n if (loading) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <CircularProgress size={64} sx={{ mb: 2 }} />\r\n <Typography variant=\"h5\">\r\n Verifying your email...\r\n </Typography>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n if (success) {\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <CheckCircle sx={{ fontSize: 64, color: 'success.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Email Verified!\r\n </Typography>\r\n <Typography color=\"text.secondary\" paragraph>\r\n Your email address has been successfully verified. \r\n You can now access all features of your account.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(successRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Continue\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n }\r\n\r\n return (\r\n <Container maxWidth=\"sm\" sx={{ mt: 8 }}>\r\n <Paper elevation={3} sx={{ p: 4 }}>\r\n <Box textAlign=\"center\">\r\n <ErrorIcon sx={{ fontSize: 64, color: 'error.main', mb: 2 }} />\r\n <Typography variant=\"h4\" gutterBottom>\r\n Verification Failed\r\n </Typography>\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n <Typography color=\"text.secondary\" paragraph>\r\n The verification link may have expired or is invalid. \r\n Please request a new verification email from your account settings.\r\n </Typography>\r\n <Button\r\n variant=\"contained\"\r\n onClick={() => navigate(errorRoute)}\r\n sx={{ mt: 2 }}\r\n >\r\n Go to Settings\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Container>\r\n );\r\n}\r\n","// Support View - Simplified & Clean\r\nimport { useState } from 'react';\r\nimport {\r\n Box,\r\n Typography,\r\n Card,\r\n CardContent,\r\n Button,\r\n TextField,\r\n Alert,\r\n Stack,\r\n Divider,\r\n} from '@mui/material';\r\nimport {\r\n Email as EmailIcon,\r\n Send as SendIcon,\r\n CheckCircle as CheckCircleIcon,\r\n} from '@mui/icons-material';\r\n\r\nconst SupportView = () => {\r\n const [supportForm, setSupportForm] = useState({\r\n subject: '',\r\n message: '',\r\n });\r\n const [formSubmitted, setFormSubmitted] = useState(false);\r\n\r\n const handleFormChange = (field: string) => (event: { target: { value: string } }) => {\r\n setSupportForm(prev => ({\r\n ...prev,\r\n [field]: event.target.value\r\n }));\r\n };\r\n\r\n const handleSubmitSupport = (event: { preventDefault: () => void }) => {\r\n event.preventDefault();\r\n setFormSubmitted(true);\r\n setTimeout(() => {\r\n setFormSubmitted(false);\r\n setSupportForm({ subject: '', message: '' });\r\n }, 3000);\r\n };\r\n\r\n return (\r\n <Box sx={{ maxWidth: '1400px', margin: '0 auto', p: 3 }}>\r\n {/* Header */}\r\n <Box sx={{ mb: 4 }}>\r\n <Typography variant=\"h4\" component=\"h1\" sx={{ fontWeight: 700, mb: 1, color: 'text.primary' }}>\r\n Support\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ mb: 3 }}>\r\n Need help? Send us a message and we'll get back to you within 4 hours\r\n </Typography>\r\n \r\n {/* Status */}\r\n <Alert \r\n severity=\"success\" \r\n icon={<CheckCircleIcon />}\r\n sx={{ \r\n maxWidth: 600,\r\n '& .MuiAlert-message': {\r\n fontSize: '0.9rem',\r\n }\r\n }}\r\n >\r\n All systems operational • Average response: 2.3 hours\r\n </Alert>\r\n </Box>\r\n\r\n <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '2fr 1fr' }, gap: 4 }}>\r\n {/* Support Form */}\r\n <Card sx={{ boxShadow: 2 }}>\r\n <CardContent sx={{ p: 4 }}>\r\n <Typography variant=\"h6\" sx={{ fontWeight: 600, mb: 3 }}>\r\n Send Support Request\r\n </Typography>\r\n \r\n {formSubmitted && (\r\n <Alert severity=\"success\" sx={{ mb: 3 }}>\r\n Request submitted! We'll respond within 4 hours.\r\n </Alert>\r\n )}\r\n\r\n <Box component=\"form\" onSubmit={handleSubmitSupport}>\r\n <Stack spacing={3}>\r\n <TextField\r\n fullWidth\r\n label=\"Subject\"\r\n value={supportForm.subject}\r\n onChange={handleFormChange('subject')}\r\n placeholder=\"Brief description of your issue\"\r\n required\r\n />\r\n \r\n <TextField\r\n fullWidth\r\n label=\"Message\"\r\n multiline\r\n rows={8}\r\n value={supportForm.message}\r\n onChange={handleFormChange('message')}\r\n placeholder=\"Please provide details about your issue...\"\r\n required\r\n />\r\n \r\n <Button\r\n type=\"submit\"\r\n variant=\"contained\"\r\n size=\"large\"\r\n startIcon={<SendIcon />}\r\n disabled={formSubmitted}\r\n sx={{\r\n bgcolor: 'primary.main',\r\n color: 'white',\r\n fontWeight: 600,\r\n py: 1.5,\r\n borderRadius: 1.5,\r\n textTransform: 'none',\r\n '&:hover': {\r\n bgcolor: 'primary.dark',\r\n }\r\n }}\r\n >\r\n Send Request\r\n </Button>\r\n </Stack>\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n\r\n {/* Quick Help Sidebar */}\r\n <Box>\r\n <Card sx={{ boxShadow: 2, bgcolor: 'primary.lighter' }}>\r\n <CardContent sx={{ p: 3 }}>\r\n <Typography variant=\"h6\" sx={{ fontWeight: 600, mb: 2 }}>\r\n Quick Help\r\n </Typography>\r\n <Stack spacing={1.5}>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n • Check the Documentation page for API guides\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n • View your API usage on the Dashboard\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n • Manage projects in the Projects page\r\n </Typography>\r\n </Stack>\r\n </CardContent>\r\n </Card>\r\n\r\n <Card sx={{ boxShadow: 2, mt: 3 }}>\r\n <CardContent sx={{ p: 3 }}>\r\n <Typography variant=\"h6\" sx={{ fontWeight: 600, mb: 2 }}>\r\n Response Time\r\n </Typography>\r\n <Stack spacing={1.5}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\r\n <EmailIcon sx={{ color: 'primary.main', fontSize: 20 }} />\r\n <Box>\r\n <Typography variant=\"body2\" fontWeight={600}>\r\n Average response\r\n </Typography>\r\n <Typography variant=\"caption\" color=\"text.secondary\">\r\n Within 4 hours\r\n </Typography>\r\n </Box>\r\n </Box>\r\n <Divider />\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Monday - Friday\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n 9:00 AM - 6:00 PM PST\r\n </Typography>\r\n </Stack>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SupportView;","// ========================================================================\r\n// SETTINGS VIEW\r\n// ========================================================================\r\n// Universal user settings and account management view.\r\n// Works with any frontblok-auth API instance.\r\n//\r\n// Features:\r\n// - Profile information display\r\n// - Sign out\r\n// - Account deletion with confirmation dialog\r\n//\r\n// This is the base settings view that every RationalBloks app needs.\r\n// Apps can extend it by wrapping or composing additional sections.\r\n//\r\n// Usage:\r\n// import { SettingsView } from '@rationalbloks/frontblok-components';\r\n// \r\n// <SettingsView\r\n// authApi={authApi}\r\n// useAuth={useClientAuth}\r\n// />\r\n// ========================================================================\r\n\r\nimport React, { useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Container,\r\n Typography,\r\n Box,\r\n Paper,\r\n Button,\r\n Divider,\r\n Avatar,\r\n Stack,\r\n Alert,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n TextField,\r\n} from '@mui/material';\r\nimport {\r\n Person as PersonIcon,\r\n ExitToApp as LogoutIcon,\r\n DeleteForever as DeleteIcon,\r\n} from '@mui/icons-material';\r\n\r\n// ========================================================================\r\n// TYPES\r\n// ========================================================================\r\n\r\nexport interface SettingsViewAuthApi {\r\n deleteAccount: (password: string, confirmText: string) => Promise<{ message: string; note: string }>;\r\n}\r\n\r\nexport interface SettingsViewUser {\r\n first_name?: string;\r\n last_name?: string;\r\n email?: string;\r\n}\r\n\r\nexport interface SettingsViewProps {\r\n // The auth API instance (must have deleteAccount method)\r\n authApi: SettingsViewAuthApi;\r\n // The useAuth hook from your app\r\n useAuth: () => {\r\n user: SettingsViewUser | null;\r\n logout: () => void;\r\n };\r\n // Route to navigate to after logout/delete. Default: '/'\r\n homeRoute?: string;\r\n // Optional additional content to render between profile and danger zone\r\n children?: React.ReactNode;\r\n}\r\n\r\n// ========================================================================\r\n// COMPONENT\r\n// ========================================================================\r\n\r\nexport const SettingsView: React.FC<SettingsViewProps> = ({\r\n authApi,\r\n useAuth,\r\n homeRoute = '/',\r\n children,\r\n}) => {\r\n const navigate = useNavigate();\r\n const { user, logout } = useAuth();\r\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\r\n const [deleteConfirmation, setDeleteConfirmation] = useState('');\r\n const [deletePassword, setDeletePassword] = useState('');\r\n const [error, setError] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const handleLogout = () => {\r\n logout();\r\n navigate(homeRoute);\r\n };\r\n\r\n const handleDeleteAccount = async () => {\r\n if (deleteConfirmation !== 'DELETE') {\r\n setError('Please type DELETE to confirm');\r\n return;\r\n }\r\n\r\n if (!deletePassword) {\r\n setError('Please enter your password');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.deleteAccount(deletePassword, deleteConfirmation);\r\n logout();\r\n navigate(homeRoute);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to delete account');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <Container maxWidth=\"md\" sx={{ py: 4 }}>\r\n <Typography variant=\"h4\" fontWeight={700} gutterBottom>\r\n Settings\r\n </Typography>\r\n <Typography variant=\"body1\" color=\"text.secondary\" paragraph>\r\n Manage your account settings and preferences.\r\n </Typography>\r\n\r\n {/* Profile Section */}\r\n <Paper sx={{ p: 3, mb: 3 }}>\r\n <Typography variant=\"h6\" fontWeight={600} gutterBottom>\r\n Profile Information\r\n </Typography>\r\n <Divider sx={{ mb: 3 }} />\r\n \r\n <Stack direction=\"row\" spacing={3} alignItems=\"center\">\r\n <Avatar\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n bgcolor: 'primary.main',\r\n fontSize: '2rem',\r\n }}\r\n >\r\n {user?.first_name?.charAt(0).toUpperCase() || <PersonIcon />}\r\n </Avatar>\r\n <Box>\r\n <Typography variant=\"h5\" fontWeight={600}>\r\n {user?.first_name} {user?.last_name}\r\n </Typography>\r\n <Typography color=\"text.secondary\">\r\n {user?.email}\r\n </Typography>\r\n </Box>\r\n </Stack>\r\n </Paper>\r\n\r\n {/* Account Actions */}\r\n <Paper sx={{ p: 3, mb: 3 }}>\r\n <Typography variant=\"h6\" fontWeight={600} gutterBottom>\r\n Account Actions\r\n </Typography>\r\n <Divider sx={{ mb: 3 }} />\r\n\r\n <Stack spacing={2}>\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\r\n <Box>\r\n <Typography fontWeight={500}>Sign Out</Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Sign out of your account on this device.\r\n </Typography>\r\n </Box>\r\n <Button\r\n variant=\"outlined\"\r\n startIcon={<LogoutIcon />}\r\n onClick={handleLogout}\r\n >\r\n Sign Out\r\n </Button>\r\n </Box>\r\n </Stack>\r\n </Paper>\r\n\r\n {/* Optional additional content (app-specific settings sections) */}\r\n {children}\r\n\r\n {/* Danger Zone */}\r\n <Paper sx={{ p: 3, border: '1px solid', borderColor: 'error.main' }}>\r\n <Typography variant=\"h6\" fontWeight={600} color=\"error\" gutterBottom>\r\n Danger Zone\r\n </Typography>\r\n <Divider sx={{ mb: 3 }} />\r\n\r\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\r\n <Box>\r\n <Typography fontWeight={500}>Delete Account</Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n Permanently delete your account and all associated data.\r\n </Typography>\r\n </Box>\r\n <Button\r\n variant=\"outlined\"\r\n color=\"error\"\r\n startIcon={<DeleteIcon />}\r\n onClick={() => setDeleteDialogOpen(true)}\r\n >\r\n Delete Account\r\n </Button>\r\n </Box>\r\n </Paper>\r\n\r\n {/* Delete Confirmation Dialog */}\r\n <Dialog open={deleteDialogOpen} onClose={() => setDeleteDialogOpen(false)}>\r\n <DialogTitle>Delete Account</DialogTitle>\r\n <DialogContent>\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n This action cannot be undone. All your data will be permanently deleted.\r\n </Alert>\r\n <Typography paragraph>\r\n Enter your password and type <strong>DELETE</strong> to confirm:\r\n </Typography>\r\n <TextField\r\n fullWidth\r\n type=\"password\"\r\n value={deletePassword}\r\n onChange={(e) => setDeletePassword(e.target.value)}\r\n placeholder=\"Enter your password\"\r\n sx={{ mb: 2 }}\r\n />\r\n <TextField\r\n fullWidth\r\n value={deleteConfirmation}\r\n onChange={(e) => setDeleteConfirmation(e.target.value)}\r\n placeholder=\"Type DELETE to confirm\"\r\n />\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => setDeleteDialogOpen(false)}>Cancel</Button>\r\n <Button\r\n color=\"error\"\r\n variant=\"contained\"\r\n onClick={handleDeleteAccount}\r\n disabled={loading}\r\n >\r\n {loading ? 'Deleting...' : 'Delete My Account'}\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default SettingsView;\r\n","// ========================================================================\r\n// THEME CONFIGURATION\r\n// ========================================================================\r\n// Universal MUI theme factory for RationalBloks apps.\r\n//\r\n// Provides the standard RationalBloks look & feel (warm beige background,\r\n// professional blue palette, polished typography) while allowing per-app\r\n// customization through options.\r\n//\r\n// This lives in the package so theme improvements (new component overrides,\r\n// better defaults) propagate to all apps via npm update.\r\n//\r\n// Usage:\r\n// import { createAppTheme } from '@rationalbloks/frontblok-components';\r\n// const theme = createAppTheme(); // standard theme\r\n// const theme = createAppTheme({ paletteOverrides: { primary: { main: '#e91e63' } } });\r\n// ========================================================================\r\n\r\nimport { createTheme, type ThemeOptions } from '@mui/material/styles';\r\n\r\n// ========================================================================\r\n// DEFAULT COLOR PALETTE\r\n// ========================================================================\r\n\r\nexport const defaultPalette = {\r\n primary: {\r\n main: '#1e40af',\r\n 50: '#eff6ff',\r\n 100: '#dbeafe',\r\n 500: '#3b82f6',\r\n 600: '#2563eb',\r\n 700: '#1d4ed8',\r\n 900: '#1e3a8a',\r\n },\r\n secondary: {\r\n main: '#6b7280',\r\n },\r\n success: {\r\n main: '#10b981',\r\n },\r\n warning: {\r\n main: '#f59e0b',\r\n },\r\n error: {\r\n main: '#ef4444',\r\n },\r\n background: {\r\n default: 'hsl(33.3, 60%, 97.1%)', // Beautiful warm beige\r\n paper: '#FCFAF7', // Warm white for cards\r\n },\r\n};\r\n\r\n// ========================================================================\r\n// DEFAULT TYPOGRAPHY\r\n// ========================================================================\r\n\r\nexport const defaultTypography = {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n h1: {\r\n fontWeight: 700,\r\n letterSpacing: '-0.5px',\r\n },\r\n h2: {\r\n fontWeight: 700,\r\n letterSpacing: '-0.4px',\r\n },\r\n h3: {\r\n fontWeight: 600,\r\n letterSpacing: '-0.3px',\r\n },\r\n h4: {\r\n fontWeight: 700,\r\n letterSpacing: '-0.2px',\r\n },\r\n h5: {\r\n fontWeight: 600,\r\n letterSpacing: '-0.1px',\r\n },\r\n h6: {\r\n fontWeight: 600,\r\n letterSpacing: '-0.08px',\r\n },\r\n};\r\n\r\n// ========================================================================\r\n// DEFAULT COMPONENT OVERRIDES\r\n// ========================================================================\r\n\r\nexport const defaultComponents: ThemeOptions['components'] = {\r\n MuiButton: {\r\n styleOverrides: {\r\n root: {\r\n textTransform: 'none' as const,\r\n fontWeight: 600,\r\n borderRadius: '8px',\r\n },\r\n },\r\n },\r\n MuiCard: {\r\n styleOverrides: {\r\n root: {\r\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.05)',\r\n border: '1px solid #f3f4f6',\r\n },\r\n },\r\n },\r\n MuiChip: {\r\n styleOverrides: {\r\n root: {\r\n fontWeight: 600,\r\n },\r\n },\r\n },\r\n MuiSelect: {\r\n styleOverrides: {\r\n select: {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n MuiTextField: {\r\n styleOverrides: {\r\n root: {\r\n '& .MuiInputBase-input': {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n },\r\n MuiInputBase: {\r\n styleOverrides: {\r\n root: {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n MuiMenuItem: {\r\n styleOverrides: {\r\n root: {\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"Segoe UI\", \"Helvetica Neue\", sans-serif',\r\n },\r\n },\r\n },\r\n};\r\n\r\n// ========================================================================\r\n// DEFAULT NAVBAR GRADIENT\r\n// ========================================================================\r\n\r\nexport const defaultNavbarGradient = {\r\n start: '#1800ad',\r\n end: '#0d0067',\r\n};\r\n\r\n// ========================================================================\r\n// THEME FACTORY FUNCTION\r\n// ========================================================================\r\n\r\nexport interface AppThemeOptions {\r\n // Override default palette colors\r\n paletteOverrides?: Record<string, unknown>;\r\n // Override default typography settings\r\n typographyOverrides?: Record<string, unknown>;\r\n // Override default component styles\r\n componentsOverrides?: ThemeOptions['components'];\r\n // Border radius for shapes. Default: 12\r\n borderRadius?: number;\r\n}\r\n\r\n// Creates a MUI theme with RationalBloks defaults.\r\n//\r\n// All defaults can be overridden per-app via the options parameter.\r\n// The defaults include:\r\n// - Warm beige background\r\n// - Professional blue primary palette\r\n// - System font typography with tight letter-spacing\r\n// - Polished component overrides (no uppercase buttons, rounded cards, etc.)\r\n//\r\n// Example:\r\n// // Use defaults\r\n// const theme = createAppTheme();\r\n//\r\n// // Override primary color\r\n// const theme = createAppTheme({\r\n// paletteOverrides: { primary: { main: '#e91e63' } },\r\n// });\r\nexport function createAppTheme(options: AppThemeOptions = {}) {\r\n const {\r\n paletteOverrides = {},\r\n typographyOverrides = {},\r\n componentsOverrides = {},\r\n borderRadius = 12,\r\n } = options;\r\n\r\n return createTheme({\r\n palette: {\r\n ...defaultPalette,\r\n ...paletteOverrides,\r\n } as ThemeOptions['palette'],\r\n typography: {\r\n ...defaultTypography,\r\n ...typographyOverrides,\r\n },\r\n shape: {\r\n borderRadius,\r\n },\r\n components: {\r\n ...defaultComponents,\r\n ...componentsOverrides,\r\n },\r\n });\r\n}\r\n"],"names":["Component","jsx","Container","Box","jsxs","Paper","Typography","Button","InfoIcon","WarningIcon","ErrorIcon","SuccessIcon","Dialog","DialogTitle","alpha","DialogContent","Alert","Divider","DialogActions","CircularProgress","useNavigate","useLocation","useState","useEffect","AppBar","Toolbar","Link","IconButton","Avatar","Menu","Chip","MenuItem","SettingsIcon","ExitToApp","useTheme","success","Card","CardContent","GoogleLogin","Stack","Fragment","TextField","InputAdornment","Person","Business","Email","Lock","VisibilityOff","Visibility","Security","EmailIcon","ArrowBack","useSearchParams","CheckCircle","LockIcon","CheckCircleIcon","SendIcon","PersonIcon","LogoutIcon","DeleteIcon","createTheme"],"mappings":"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"}