diff --git a/ui/src/app/components/ImprinkAppBar.tsx b/ui/src/app/components/ImprinkAppBar.tsx index 41b6108..da6836a 100644 --- a/ui/src/app/components/ImprinkAppBar.tsx +++ b/ui/src/app/components/ImprinkAppBar.tsx @@ -58,14 +58,13 @@ export default function ImprinkAppBar() { const navigationLinks: NavLink[] = [ { label: 'Home', href: '/', icon: , show: true }, { label: 'Gallery', href: '/gallery', icon: , show: true }, - { label: 'Orders', href: '/orders', icon: , show: true }, + { label: 'Orders', href: '/orders', icon: , show: !!user }, { label: 'Merchant', href: '/merchant', icon: , show: isMerchant }, ]; const adminLinks: NavLink[] = [ { label: 'Dashboard', href: '/dashboard', icon: , show: isMerchant }, { label: 'Admin', href: '/admin', icon: , show: isAdmin }, - { label: 'Swagger', href: '/swagger', icon: , show: isAdmin }, { label: 'SEQ', href: '/seq', icon: , show: isAdmin }, ]; @@ -164,14 +163,6 @@ export default function ImprinkAppBar() { {user.name} - e.stopPropagation()}> - - Theme - - - - - Logout @@ -184,12 +175,6 @@ export default function ImprinkAppBar() { Sign Up - - - Theme - {isDarkMode ? '🌙' : '☀️'} - - )} @@ -230,6 +215,12 @@ export default function ImprinkAppBar() { )} )} + {/* Add theme toggle button to the right side of the toolbar on mobile */} + {isMobile && ( + + + + )} {renderAdminBar()} diff --git a/ui/src/app/components/gallery/CategorySidebar.tsx b/ui/src/app/components/gallery/CategorySidebar.tsx index f3d9b26..eead932 100644 --- a/ui/src/app/components/gallery/CategorySidebar.tsx +++ b/ui/src/app/components/gallery/CategorySidebar.tsx @@ -46,7 +46,6 @@ export default function CategorySidebar({ return ( Categories @@ -90,7 +87,7 @@ export default function CategorySidebar({ onFilterChange('categoryId', category.id)} + onClick={() => onToggleCategoryExpansion(category.id)} sx={{ borderRadius: 1, mb: 0.5 }} > @@ -151,7 +148,7 @@ export default function CategorySidebar({ onChangeCommitted={onPriceRangeCommitted} valueLabelDisplay="auto" min={0} - max={1000} + max={100} step={5} valueLabelFormat={(value) => `$${value}`} /> diff --git a/ui/src/app/components/gallery/MobileFilterDrawer.tsx b/ui/src/app/components/gallery/MobileFilterDrawer.tsx index af4b3f4..b59a049 100644 --- a/ui/src/app/components/gallery/MobileFilterDrawer.tsx +++ b/ui/src/app/components/gallery/MobileFilterDrawer.tsx @@ -44,13 +44,21 @@ export default function MobileFilterDrawer({ ModalProps={{ keepMounted: true }} PaperProps={{ sx: { - width: 280, + width: '100vw', display: 'flex', - flexDirection: 'column' + flexDirection: 'column', + overflow: 'hidden' } }} > - + Filters @@ -63,16 +71,22 @@ export default function MobileFilterDrawer({ ) : ( - + + + )} ); diff --git a/ui/src/app/components/gallery/ProductCard.tsx b/ui/src/app/components/gallery/ProductCard.tsx index 81f1e4b..a9af034 100644 --- a/ui/src/app/components/gallery/ProductCard.tsx +++ b/ui/src/app/components/gallery/ProductCard.tsx @@ -27,10 +27,6 @@ export default function ProductCard({ product }: ProductCardProps) { router.push(`/products/${product.id}`); }; - const handleLoginRedirect = () => { - router.push('/auth/login'); - }; - const handleBuild = () => { router.push(`/builder/${product.id}`); }; @@ -147,69 +143,33 @@ export default function ProductCard({ product }: ProductCardProps) { gap: { xs: 0.5, sm: 0.75 }, flexDirection: { xs: 'column', sm: user ? 'row' : 'column' } }}> - {user ? ( - <> - - - - ) : ( - <> - - - Login to customize - - + + {user && ( + )} )} diff --git a/ui/src/app/components/gallery/SearchFilters.tsx b/ui/src/app/components/gallery/SearchFilters.tsx index 764918d..a71e56f 100644 --- a/ui/src/app/components/gallery/SearchFilters.tsx +++ b/ui/src/app/components/gallery/SearchFilters.tsx @@ -12,7 +12,8 @@ import { useMediaQuery, useTheme, SelectChangeEvent, - Box + Box, + Button } from '@mui/material'; import { Search, @@ -52,28 +53,144 @@ export default function SearchFilters({ onFilterChange('sortDirection', sortDirection); }; + if (isMobile) { + return ( + + + ) => setSearchInput(e.target.value)} + onKeyPress={(e: KeyboardEvent) => e.key === 'Enter' && handleSearch()} + size="small" + sx={{ + '& .MuiInputBase-input': { + fontSize: '0.85rem', + py: 1.25 + } + }} + InputProps={{ + startAdornment: ( + + + + ), + endAdornment: searchInput && ( + + + + + + ) + }} + /> + + + + + + + + Sort + + + + + + + Per + + + + + + + + {productsCount} of {totalCount} products + + + + ); + } + return ( - {isMobile && ( - - - - - - )} - - + - + Product Gallery Explore our complete collection of customizable products diff --git a/ui/src/app/page.tsx b/ui/src/app/page.tsx index e80f9c0..4b3a205 100644 --- a/ui/src/app/page.tsx +++ b/ui/src/app/page.tsx @@ -17,6 +17,27 @@ import {useState, useEffect, JSX} from 'react'; import { ShoppingCart, Palette, ImageOutlined, CreditCard, LocalShipping, CheckCircle } from '@mui/icons-material'; import clientApi from "@/lib/clientApi"; +interface Product { + id: string; + name: string; + description: string; + imageUrl?: string; + basePrice: number; + isCustomizable: boolean; +} + +interface ApiResponse { + items: Product[]; +} + +interface Step { + number: number; + label: string; + description: string; + icon: JSX.Element; + details: string; +} + export default function HomePage(): JSX.Element { const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true);