6 Commits

Author SHA1 Message Date
7d9b42af4a Merge version_4_1782129763092 into main
Merge version_4_1782129763092 into main
2026-06-22 12:04:18 +00:00
kudinDmitriyUp
7f89e181ad Bob AI: Added volume selector to product cards in shop section 2026-06-22 12:03:33 +00:00
28de81dcec Merge version_3_1782129265911 into main
Merge version_3_1782129265911 into main
2026-06-22 11:57:02 +00:00
kudinDmitriyUp
1ddb677ab1 Bob AI: Populate src/pages/InventoryPage.tsx (snippet builder, 1 sections) 2026-06-22 11:56:26 +00:00
kudinDmitriyUp
47ef186991 Bob AI: Add inventory page 2026-06-22 11:55:21 +00:00
b5cb235306 Merge version_2_1782128502374 into main
Merge version_2_1782128502374 into main
2026-06-22 11:45:23 +00:00
5 changed files with 73 additions and 1 deletions

View File

@@ -2,11 +2,13 @@ import { Routes, Route } from 'react-router-dom';
import Layout from './components/Layout';
import HomePage from './pages/HomePage';
import InventoryPage from "@/pages/InventoryPage";
export default function App() {
return (
<Routes>
<Route element={<Layout />}>
<Route path="/" element={<HomePage />} />
<Route path="/inventory" element={<InventoryPage />} />
</Route>
</Routes>
);

View File

@@ -27,7 +27,9 @@ export default function Layout() {
},
{
"name": "Contact", "href": "#contact"
}
},
{ name: "Inventory", href: "/inventory" },
];
return (

View File

@@ -72,6 +72,58 @@ interface FeaturesRevealCardsBentoProps {
items: [FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem];
}
const ProductCard = ({ item, index, staggerDelays, gridClasses }: any) => {
const [volume, setVolume] = useState("5ml");
const volumeOptions = [
{ value: "5ml", label: "5ml" },
{ value: "10ml", label: "10ml" },
{ value: "30ml", label: "30ml" },
{ value: "full", label: "Full" },
];
return (
<ScrollReveal
variant="slide-up"
delay={staggerDelays[index]}
className={cls(
"card rounded-lg overflow-hidden flex flex-col group relative",
gridClasses[index]
)}
>
<div className="relative w-full aspect-video md:aspect-auto md:h-64 overflow-hidden">
<ImageOrVideo
imageSrc={item.imageSrc}
videoSrc={item.videoSrc}
className="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
/>
</div>
<div className="p-6 flex flex-col flex-grow gap-4">
<div>
<h3 className="text-xl font-semibold text-foreground mb-2">
{item.title}
</h3>
<p className="text-accent text-sm">
{item.description}
</p>
</div>
<div className="mt-auto flex flex-col gap-4">
<div className="flex flex-col gap-2">
<Label className="text-xs font-medium text-foreground">Select Volume</Label>
<SelectorButton
options={volumeOptions}
activeValue={volume}
onValueChange={setVolume}
className="w-full"
/>
</div>
<Button text={`Add to Cart`} variant="primary" className="w-full" />
</div>
</div>
</ScrollReveal>
);
};
const ShopInline = () => {
const gridClasses = [
"md:col-span-2",

View File

@@ -0,0 +1,15 @@
import { ArrowUpRight, Loader2 } from "lucide-react";
import Button from "@/components/ui/Button";
import TextAnimation from "@/components/ui/TextAnimation";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import GridOrCarousel from "@/components/ui/GridOrCarousel";
import ScrollReveal from "@/components/ui/ScrollReveal";
import useProducts from "@/hooks/useProducts";
export default function InventoryPage() {
return (
<>
<div data-webild-section="ProductVariantCards"><section aria-label="Products section" className="py-20"><div className="w-content-width mx-auto flex justify-center"><Loader2 className="size-8 animate-spin text-foreground" strokeWidth={1.5} /></div></section></div>
</>
);
}

View File

@@ -6,4 +6,5 @@ export interface Route {
export const routes: Route[] = [
{ path: '/', label: 'Home', pageFile: 'HomePage' },
{ path: '/inventory', label: 'Inventory', pageFile: 'InventoryPage' },
];