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}
-
@@ -184,12 +175,6 @@ export default function ImprinkAppBar() {
-
>
)}
>
@@ -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 && (
+
+
+
+
+
+ )
+ }}
+ />
+
+
+
+ }
+ size="small"
+ sx={{
+ fontSize: '0.8rem',
+ px: 1.5,
+ py: 0.75,
+ flexShrink: 0,
+ minWidth: 'fit-content'
+ }}
+ >
+ Filters
+
+
+
+
+ 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);