diff --git a/src/App.jsx b/src/App.jsx
index 1151df6..c1c8242 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -54,6 +54,10 @@ const ImageGalleryPage = React.lazy(() => import("./Pages/Components/Surfaces/Im
const AccordingPage = React.lazy(() => import("./Pages/Components/Surfaces/AccordingPage"));
const AppbarPage = React.lazy(() => import("./Pages/Components/Surfaces/AppbarPage"));
+// e-commerce
+import ProductCardPage from "./Pages/Components/ECommerce/ProductCardPage.jsx";
+import AdsCardPage from "./Pages/Components/ECommerce/AdsCardPage.jsx";
+
// randoms
const CodeSnippetPage = React.lazy(() => import("./Pages/Components/Randoms/CodeSnippetPage"));
const SnippetPage = React.lazy(() => import("./Pages/Components/Randoms/SnippetPage"));
@@ -94,6 +98,12 @@ const MultipageFormPage = React.lazy(() => import("./Pages/Blocks/Forms/Multipag
const ResponsiveSidebarPage = React.lazy(() => import("./Pages/Blocks/Randoms/ResponsiveSidebarPage.jsx"));
const InputSliderPage = React.lazy(() => import("./Pages/Components/Inputs/InputSliderPage.jsx"));
+// e-commerce blocks
+import OfferGridPage from "./Pages/Blocks/E-Commerce/OfferGridPage.jsx";
+import ProductDetailsPage from "./Pages/Blocks/E-Commerce/ProductDetailsPages/Index.jsx";
+import ProductFilterPage from "./Pages/Blocks/E-Commerce/ProductFilterPage.jsx";
+import CheckoutPage from "./Pages/Blocks/E-Commerce/CheckoutPage.jsx";
+
// layout playground page
const LayoutPlaygroundPage = React.lazy(() => import("./Pages/LayoutPlaygroundPage.jsx"));
const TreeDropdownPage = React.lazy(() => import("./Pages/Components/Feedback/TreeDropdownPage.jsx"));
@@ -216,6 +226,10 @@ const App = () => {
}/>
}/>
+ {/* e-commerce */}
+ }/>
+ }/>
+
{/* randoms */}
}/>
}/>
@@ -235,6 +249,12 @@ const App = () => {
}/>
}/>
+ {/* e-commerce blocks */}
+ }/>
+ }/>
+ }/>
+ }/>
+
{/* icons */}
}/>
diff --git a/src/Components/Home/AboutUs.jsx b/src/Components/Home/AboutUs.jsx
index 4ee3dec..74865bd 100644
--- a/src/Components/Home/AboutUs.jsx
+++ b/src/Components/Home/AboutUs.jsx
@@ -48,7 +48,7 @@ const Hero = () => {
offering a comprehensive collection of pre-built UI components, website templates, and more.
-
+
Our mission is to empower developers to build beautiful, functional web applications without
the hassle of designing from scratch. At ZenUI, we believe that great design and seamless
functionality should be accessible to everyone. That's why we've meticulously crafted a
@@ -56,7 +56,7 @@ const Hero = () => {
and easy to integrate.
-
+
Each component is designed with a focus on user experience, ensuring that your applications
look great and perform flawlessly across all devices. Beyond our extensive library of UI
components and pre-built website templates, we also provide a rich collection of free icons
diff --git a/src/Components/Home/Hero.jsx b/src/Components/Home/Hero.jsx
index 2ec27f1..29558d6 100644
--- a/src/Components/Home/Hero.jsx
+++ b/src/Components/Home/Hero.jsx
@@ -1,4 +1,4 @@
-import React, {useEffect} from "react";
+import React, {useEffect, useState} from "react";
// react icons
import {CgTemplate} from "react-icons/cg";
@@ -22,7 +22,6 @@ import CountUp from "react-countup";
import {FaArrowRightLong} from "react-icons/fa6";
// components
-import AnimatedCard from "../HomePageComponents/AnimatedCard.jsx";
import SwitchCard from "../HomePageComponents/Switch.jsx";
import TabCard from "../HomePageComponents/Tab.jsx";
import SelectCard from "../HomePageComponents/Select.jsx";
@@ -34,6 +33,7 @@ import BadgeCard from "../HomePageComponents/Badge.jsx";
import AnimatedButtonCard from "../HomePageComponents/AnimatedButton.jsx";
import ChipCard from "../HomePageComponents/Chip.jsx";
import StrongPasswordCard from "../HomePageComponents/StrongPasswordCard.jsx";
+import AnimatedProductCard from "../HomePageComponents/AnimatedProductCard.jsx";
const Hero = () => {
@@ -50,6 +50,38 @@ const Hero = () => {
const navigate = useNavigate();
+ const [isAnimating, setIsAnimating] = useState(true);
+
+ useEffect(() => {
+ const animationCycle = () => {
+ setIsAnimating(true);
+
+ const stopTimeout = setTimeout(() => {
+ setIsAnimating(false);
+ }, 1200);
+
+ const restartTimeout = setTimeout(() => {
+ setIsAnimating(true);
+ }, 2000);
+
+ return () => {
+ clearTimeout(stopTimeout);
+ clearTimeout(restartTimeout);
+ };
+ };
+
+ const cleanupAnimation = animationCycle();
+
+ const interval = setInterval(animationCycle, 4000);
+
+ return () => {
+ clearInterval(interval);
+ if (typeof cleanupAnimation === 'function') {
+ cleanupAnimation();
+ }
+ };
+ }, []);
+
return (
@@ -69,10 +101,17 @@ const Hero = () => {
},
}}>
-
-
- Star us on Github
-
+
+
+
+ Star us on Github
+
+
{
diff --git a/src/Components/Home/MobileNavbar.jsx b/src/Components/Home/MobileNavbar.jsx
index 4f1c136..4320ee3 100644
--- a/src/Components/Home/MobileNavbar.jsx
+++ b/src/Components/Home/MobileNavbar.jsx
@@ -9,7 +9,7 @@ import {FiGithub} from "react-icons/fi";
// react router dom
import {Link, useNavigate} from "react-router-dom";
import Search from "./Search";
-import {motion} from "framer-motion";
+import {AnimatePresence, motion} from "framer-motion";
import NewBadge from "../../Shared/NewBadge.jsx";
const MobileNavbar = () => {
@@ -17,6 +17,9 @@ const MobileNavbar = () => {
const [sidebarOpen, setSidebarOpen] = useState(false);
const [developerKitDropdownOpen, setDeveloperKitDropdownOpen] = useState(false);
const [toolsDropdownOpen, setToolsDropdownOpen] = useState(false);
+ const [eCommerceDropdownOpen, setECommerceDropdownOpen] = useState(false)
+
+ const [searchPlaceholderText, setSearchPlaceholderText] = useState("search component");
const navigate = useNavigate();
@@ -44,6 +47,18 @@ const MobileNavbar = () => {
}
}, [])
+ useEffect(() => {
+ const placeholderTexts = ["Search components", "Search Blocks", "Explore templates", "Search E-commerce"];
+ let index = 0;
+
+ const interval = setInterval(() => {
+ setSearchPlaceholderText(placeholderTexts[index]);
+ index = (index + 1) % placeholderTexts.length;
+ }, 3000);
+
+ return () => clearInterval(interval);
+ }, []);
+
return (
<>
{
- v2.0
+ v2.2
{
+
+
+
+ {searchPlaceholderText}
+
+
+
{
)
}
+
+
+ setECommerceDropdownOpen(!eCommerceDropdownOpen)}
+ className='cursor-pointer relative flex items-center gap-[8px] mt-1.5'>
+ E-Commerce
+
+
+
+
+
+ {
+ eCommerceDropdownOpen && (
+
+
+
+
+ Product Card
+
+
Animated modern product cards.
+
+
+
+
+ Offer Grid
+
+
Grid layout for showing product offers.
+
+
+
+
+ Checkout Page
+
+
Checkout page with order summery.
+
+
+
+
+
+
+ Ads Card
+
+
Modern ads cards.
+
+
+
+
+ Product Details Page
+
+
Product Details with full functionality.
+
+
+
+
+ )
+ }
diff --git a/src/Components/Home/Navbar.jsx b/src/Components/Home/Navbar.jsx
index 9dbc535..9d556cd 100644
--- a/src/Components/Home/Navbar.jsx
+++ b/src/Components/Home/Navbar.jsx
@@ -9,7 +9,7 @@ import Search from "./Search";
import {FiGithub} from "react-icons/fi";
import {RxDiscordLogo} from "react-icons/rx";
-import {motion} from "framer-motion";
+import { motion, AnimatePresence } from "framer-motion";
import NewBadge from "../../Shared/NewBadge.jsx";
const Navbar = () => {
@@ -18,30 +18,17 @@ const Navbar = () => {
const navigate = useNavigate();
const [isDeveloperKitHover, setIsDeveloperKitHover] = useState(false);
const [isToolsHover, setIsToolsHover] = useState(false);
+ const [eCommerceHover, setECommerceHover] = useState(false)
+ const [isActiveToolsMenu, setIsActiveToolsMenu] = useState(false);
+ const [isActiveEcommcerMenu, setIsActiveEcommcerMenu] = useState(false);
+ const [isActiveDeveloperKitMenu, setIsActiveDeveloperKitMenu] = useState(false);
+
+ const [searchPlaceholderText, setSearchPlaceholderText] = useState("search component");
const handleSearchClick = () => {
setIsSearchOpen(true);
};
- // light and dark mood
- const [toggle, setToggle] = useState(
- JSON.parse(localStorage.getItem("theme"))
- ? JSON.parse(localStorage.getItem("theme"))
- : false
- );
-
- const element = document.documentElement;
-
- localStorage.setItem("theme", JSON.stringify(toggle));
-
- useEffect(() => {
- if (toggle) {
- element.classList.add("dark");
- } else {
- element.classList.remove("dark");
- }
- }, [toggle]);
-
const getTheRouteName = () => {
return window.location.pathname
}
@@ -89,6 +76,61 @@ const Navbar = () => {
};
}, []);
+ useEffect(() => {
+ const placeholderTexts = ["Search components", "Search Blocks", "Explore templates", "Search E-commerce"];
+ let index = 0;
+
+ const interval = setInterval(() => {
+ setSearchPlaceholderText(placeholderTexts[index]);
+ index = (index + 1) % placeholderTexts.length;
+ }, 3000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+
+ const handleActiveToolsMenu = () => {
+ setIsActiveToolsMenu(!isActiveToolsMenu)
+ setIsActiveEcommcerMenu(false)
+ setIsActiveDeveloperKitMenu(false)
+ }
+
+ const handleActiveDeveloperKitMenu = () => {
+ setIsActiveDeveloperKitMenu(!isActiveDeveloperKitMenu)
+ setIsActiveToolsMenu(false)
+ setIsActiveEcommcerMenu(false)
+ }
+
+ const handleActiveEcommerceMenu = () => {
+ setIsActiveEcommcerMenu(!isActiveEcommcerMenu)
+ setIsActiveToolsMenu(false)
+ setIsActiveDeveloperKitMenu(false)
+ }
+
+ const handleToolsMouseHover = () => {
+ setIsToolsHover(true)
+ setIsDeveloperKitHover(false)
+ setIsActiveEcommcerMenu(false)
+ setIsActiveDeveloperKitMenu(false)
+ setECommerceHover(false)
+ }
+
+ const handleDeveloperKitMouseHover = () => {
+ setIsToolsHover(false)
+ setIsDeveloperKitHover(true)
+ setIsActiveToolsMenu(false)
+ setIsActiveEcommcerMenu(false)
+ setECommerceHover(false)
+ }
+
+ const handleEcommerceMouseHover = () => {
+ setIsToolsHover(false)
+ setIsDeveloperKitHover(false)
+ setIsActiveToolsMenu(false)
+ setIsActiveDeveloperKitMenu(false)
+ setECommerceHover(true)
+ }
+
return (
<>
{
- v2.0
+ v2.2
{
About Us
setIsToolsHover(true)}
+ onMouseEnter={handleToolsMouseHover}
onMouseLeave={() => setIsToolsHover(false)}
- className='cursor-pointer relative py-[23px] hover:text-[#0FABCA] transition-all duration-200 flex items-center gap-[8px]'
+ onClick={handleActiveToolsMenu}
+ className={`${isActiveToolsMenu && 'text-[#0FABCA]'} cursor-pointer relative py-[23px] hover:text-[#0FABCA] transition-all duration-200 flex items-center gap-[8px]`}
>
Tools
-
+
- {isToolsHover && (
+ {(isToolsHover || isActiveToolsMenu) && (
{
setIsDeveloperKitHover(true)}
+ onMouseEnter={handleDeveloperKitMouseHover}
onMouseLeave={() => setIsDeveloperKitHover(false)}
- className='cursor-pointer relative py-[23px] hover:text-[#0FABCA] transition-all duration-200 flex items-center gap-[8px]'
+ onClick={handleActiveDeveloperKitMenu}
+ className={`${isActiveDeveloperKitMenu && 'text-[#0FABCA]'} cursor-pointer relative py-[23px] hover:text-[#0FABCA] transition-all duration-200 flex items-center gap-[8px]`}
>
Components
-
+
- {isDeveloperKitHover && (
+ {(isDeveloperKitHover || isActiveDeveloperKitMenu) && (
{
)}
+
+ setECommerceHover(false)}
+ onClick={handleActiveEcommerceMenu}
+ className={`${isActiveEcommcerMenu && 'text-[#0FABCA]'} cursor-pointer relative py-[23px] hover:text-[#0FABCA] transition-all duration-200 flex items-center gap-[8px]`}
+ >
+ E-Commerce
+
+
+
+
+ {(eCommerceHover||isActiveEcommcerMenu) && (
+ setECommerceHover(true)}
+ onMouseLeave={() => setECommerceHover(false)}
+ >
+
+
+
+ Product Card
+
+
Animated modern product cards.
+
+
+
+
+ Offer Grid
+
+
Grid layout for showing product offers.
+
+
+
+
+ Checkout Page
+
+
Checkout page with order summery.
+
+
+
+
+
+
+
+ Ads Card
+
+
Modern ads cards.
+
+
+
+
+ Product Details Page
+
+
Product Details with full functionality.
+
+
+
+
+ )}
+
@@ -227,21 +335,32 @@ const Navbar = () => {
-
+
diff --git a/src/Components/Home/PrivacyPolicy.jsx b/src/Components/Home/PrivacyPolicy.jsx
index a00d4af..ff04d3d 100644
--- a/src/Components/Home/PrivacyPolicy.jsx
+++ b/src/Components/Home/PrivacyPolicy.jsx
@@ -2,6 +2,8 @@ import React from 'react';
const PrivacyPolicy = () => {
+ const date = new Date();
+
return (
@@ -9,7 +11,7 @@ const PrivacyPolicy = () => {
Privacy Policy for Zenui Library
-
Effective Date: January 1, 2024
+
Effective Date: January 1, {date.getFullYear()}
Welcome to Zenui Library. Your privacy is important to us. This Privacy Policy outlines how we
diff --git a/src/Components/Home/SingleToolCard.jsx b/src/Components/Home/SingleToolCard.jsx
new file mode 100644
index 0000000..fa5b8e2
--- /dev/null
+++ b/src/Components/Home/SingleToolCard.jsx
@@ -0,0 +1,43 @@
+import React, {useRef, useState} from 'react';
+import {Link} from "react-router-dom";
+
+const SingleToolCard = ({data, duration}) => {
+
+ const [isHovering, setIsHovering] = useState(false);
+ const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
+ const cardRef = useRef(null);
+
+ const handleMouseMove = (e) => {
+ if (cardRef.current) {
+ const rect = cardRef.current.getBoundingClientRect();
+ setMousePosition({
+ x: e.clientX - rect.left,
+ y: e.clientY - rect.top,
+ });
+ }
+ };
+
+ return (
+ setIsHovering(true)}
+ onMouseLeave={() => setIsHovering(false)}
+ ref={cardRef}
+ data-aos="fade-up" data-aos-duration={duration}
+ className='p-[20px] relative overflow-hidden hover:border-[#0FABCA] transition-all duration-300 cursor-pointer rounded-md border-[2px] border-dashed flex-col border-gray-200 flex items-center'>
+
{data.title}
+
{data.description}
+
+ {isHovering && (
+
+ )}
+
+ );
+};
+
+export default SingleToolCard;
diff --git a/src/Components/Home/Sponsor.jsx b/src/Components/Home/Sponsor.jsx
index 54e0d16..9db84e8 100644
--- a/src/Components/Home/Sponsor.jsx
+++ b/src/Components/Home/Sponsor.jsx
@@ -10,7 +10,7 @@ const Sponsor = () => {
Become A
Sponsor
-
+
Be Our Sponsor
diff --git a/src/Components/Home/Team.jsx b/src/Components/Home/Team.jsx
index ff7b410..19d6e2f 100644
--- a/src/Components/Home/Team.jsx
+++ b/src/Components/Home/Team.jsx
@@ -14,7 +14,7 @@ const Team = () => {
Design Contributors
-
Our design
+
Our design
contributors provide the creative foundation for our components and blocks, helping us innovate
and expand ZenUIโs offerings with their unique insights and designs.
@@ -74,7 +74,7 @@ const Team = () => {
Dev Contributors
-
Our development contributors lay the technical groundwork for ZenUI, bringing our components and blocks to life with their expertise and innovation. Their work is essential to our platform's growth and stability.
+
Our development contributors lay the technical groundwork for ZenUI, bringing our components and blocks to life with their expertise and innovation. Their work is essential to our platform's growth and stability.
diff --git a/src/Components/Home/TemplatesSlider.jsx b/src/Components/Home/TemplatesSlider.jsx
index 9249b6c..d92f9cb 100644
--- a/src/Components/Home/TemplatesSlider.jsx
+++ b/src/Components/Home/TemplatesSlider.jsx
@@ -17,7 +17,7 @@ const TemplatesSlider = () => {
return (
-
+
diff --git a/src/Components/Home/ZenUITools.jsx b/src/Components/Home/ZenUITools.jsx
new file mode 100644
index 0000000..82febd5
--- /dev/null
+++ b/src/Components/Home/ZenUITools.jsx
@@ -0,0 +1,59 @@
+import React, {useEffect} from 'react';
+
+// import aos animation
+import "aos/dist/aos.css";
+import AOS from "aos";
+import SingleToolCard from "./SingleToolCard.jsx";
+
+const ZenUITools = () => {
+
+ useEffect(() => {
+ AOS.init({
+ duration: 1000,
+ });
+ }, []);
+
+ const cardData = [
+ {
+ title: "ShortKey",
+ duration: '700',
+ url: '/shortcut-generator',
+ description: "Type your custom shortcut to instantly generate a function with conditions, enabling specific logic execution when the shortcut keys are pressed. Make Simplify your workflow!"
+ },
+ {
+ title: "Icons",
+ duration: '1000',
+ url: '/icons',
+ description: "Explore and enjoy ZenUI Library's collection of free icons, designed for customization and easy integration. Download and use them to enhance your projects."
+ },
+ {
+ title: "Color Palette",
+ duration: '1300',
+ url: '/color-palette',
+ description: "Customize your color shades! Paste a color code to explore shades, view hex, RGB, and HSL codes, and copy them instantly for seamless integration into your projects."
+ }
+ ];
+
+ return (
+
+
+
Introduce
+ With ZenUI Tools
+
Streamline
+ your workflow with a versatile color palette, an extensive icon library, and a dynamic keyboard
+ shortcut generator.
+
+
+
+ {
+ cardData.map((card, index) => (
+
+ ))
+ }
+
+
+ );
+};
+
+export default ZenUITools;
diff --git a/src/Components/Home/feedback.jsx b/src/Components/Home/feedback.jsx
index f132772..ecf4922 100644
--- a/src/Components/Home/feedback.jsx
+++ b/src/Components/Home/feedback.jsx
@@ -21,7 +21,7 @@ const Feedback = () => {
return (
-
+
@@ -56,6 +56,9 @@ const Feedback = () => {
))}
+
+ {/* bottom shadow card */}
+
);
};
diff --git a/src/Components/HomePageComponents/AnimatedProductCard.jsx b/src/Components/HomePageComponents/AnimatedProductCard.jsx
new file mode 100644
index 0000000..4e89869
--- /dev/null
+++ b/src/Components/HomePageComponents/AnimatedProductCard.jsx
@@ -0,0 +1,95 @@
+import React, {useState} from 'react';
+import {IoIosHeart, IoMdHeartEmpty} from "react-icons/io";
+import {HiArrowsUpDown} from "react-icons/hi2";
+import {IoBagHandleOutline, IoCartOutline, IoEyeOutline} from "react-icons/io5";
+import {FiMinus, FiPlus} from "react-icons/fi";
+import {FaStar} from "react-icons/fa";
+
+const AnimatedProductCard = () => {
+
+ const [rating, setRating] = useState(5);
+ const [count, setCount] = useState(0);
+
+ const [isFavorite, setIsFavorite] = useState(false);
+
+ return (
+
+
+ {/* product image */}
+
+
+
+ {/* favorite icon */}
+
+ {
+ isFavorite ? (
+ setIsFavorite(false)}
+ className={`text-[#0FABCA] text-[1.2rem] cursor-pointer`}/>
+ ) : (
+ setIsFavorite(true)}
+ className={` text-white text-[1.2rem] cursor-pointer`}/>
+ )
+ }
+
+
+
+
+ {/* product details */}
+
+
Criphin - Contemporary
+ Business Keynote
+
+ {/* authors & reviews */}
+
+
by Criphin in Graphics
+
+ {/* review area */}
+
+
+ {[...Array(5)].map((_, index) => {
+ const starRating = index + 1;
+ return (
+ setRating(starRating)}
+ />
+ );
+ })}
+
+
(4.8)
+
+
+
+ {/* price and action btn */}
+
+
+
+
+
+
+
+
+
+ Preview
+
+
+
+
+
+ );
+};
+
+export default AnimatedProductCard;
diff --git a/src/Components/Overview/Sidebar/MobileSidebar.jsx b/src/Components/Overview/Sidebar/MobileSidebar.jsx
index e49961b..c06152a 100644
--- a/src/Components/Overview/Sidebar/MobileSidebar.jsx
+++ b/src/Components/Overview/Sidebar/MobileSidebar.jsx
@@ -36,7 +36,7 @@ const MobileSidebar = ({ startContent, setStartContent }) => {
return (
<>
-
+
setSidebarOpen(true)} />
@@ -377,8 +377,6 @@ const MobileSidebar = ({ startContent, setStartContent }) => {
onClick={() => setStartContent(55)}
>
Carousel
-
-
{/* navigation */}
@@ -396,7 +394,6 @@ const MobileSidebar = ({ startContent, setStartContent }) => {
onClick={() => setStartContent(22)}
>
Pagination
-
{
onClick={() => setStartContent(210)}
>
Timer
-
-
{
onClick={() => setStartContent(140)}
>
Pie Chart
-
-
{
+ {/* e-commerce */}
+
+ E-COMMERCE
+
+
+ setStartContent(39)}
+ >
+ Product Card
+
+
+
+
+ setStartContent(39)}
+ >
+ Ads Card
+
+
+
+
{/* Randoms */}
{
Empty Page
+ {/* e-commerce blocks */}
+
+ E-COMMERCE
+
+
+ setStartContent(200)}
+ >
+ Offer Grid
+
+
+ setStartContent(201)}
+ >
+ Product Details Page
+
+
+ {/* setStartContent(202)}*/}
+ {/*>*/}
+ {/* Product Filter Page*/}
+ {/* */}
+ {/**/}
+ setStartContent(203)}
+ >
+ Checkout Page
+
+
+
{/* Randoms */}
{
const [components, setComponents] = useState(true);
const [blocks, setBlocks] = useState(true);
const sidebarRef = useRef(null);
- // Automatically scrolls the active sidebar element into view when startContent changes
useEffect(() => {
if (sidebarRef.current) {
const activeElement = sidebarRef.current.querySelector('.border-primary');
if (activeElement) {
- activeElement.scrollIntoView({
+ activeElement.scrollIntoView({
behavior: 'instant',
block: 'center'
});
@@ -34,10 +33,10 @@ const index = ({ startContent, setStartContent }) => {
return (
+ className="py-6 px-10 pr-7 border-r h-[89vh] border-border flex-col gap-4 overflow-y-scroll sticky top-18 left-0 w-[320px] bg-secondary z-20 1024px:flex hidden">
{/* get starts */}
-
+
setStartContent(0)} to='/docs/overview' className={`${startContent === 0 && '!text-blue-600'} flex items-center group gap-[8px] hover:text-blue-600 text-[0.950rem] font-[500] cursor-pointer capitalize text-gray-600`}>
@@ -117,7 +116,7 @@ const index = ({ startContent, setStartContent }) => {
{/* inputs */}
FORM
@@ -256,7 +255,7 @@ const index = ({ startContent, setStartContent }) => {
{/* buttons */}
BUTTONS
@@ -308,7 +307,7 @@ const index = ({ startContent, setStartContent }) => {
{/* SURFACES */}
SURFACES
@@ -395,14 +394,12 @@ const index = ({ startContent, setStartContent }) => {
onClick={() => setStartContent(55)}
>
Carousel
-
-
{/* navigation */}
NAVIGATION
@@ -415,7 +412,6 @@ const index = ({ startContent, setStartContent }) => {
onClick={() => setStartContent(22)}
>
Pagination
-
{
onClick={() => setStartContent(210)}
>
Timer
-
-
{
{/* FEEDBACK */}
FEEDBACK
@@ -600,7 +594,7 @@ const index = ({ startContent, setStartContent }) => {
{/* data display */}
DATA DISPLAY
@@ -644,8 +638,6 @@ const index = ({ startContent, setStartContent }) => {
onClick={() => setStartContent(140)}
>
Pie Chart
-
-
{
+ {/* e-commerce */}
+
+ E-COMMERCE
+
+
+ setStartContent(108)}
+ >
+ Product Card
+
+
+
+
+ setStartContent(109)}
+ >
+ Ads Card
+
+
+
+
{/* Randoms */}
RANDOMS
@@ -730,7 +756,7 @@ const index = ({ startContent, setStartContent }) => {
{/* sections */}
SECTIONS
@@ -775,21 +801,9 @@ const index = ({ startContent, setStartContent }) => {
>
Responsive Footer
- {/* setStartContent(46)}*/}
- {/*>*/}
- {/* Testimonial Section*/}
- {/**/}
-
- {/* Forms */}
FORM
@@ -838,7 +852,7 @@ const index = ({ startContent, setStartContent }) => {
{/* empty pages */}
EMPTY PAGES
@@ -864,10 +878,59 @@ const index = ({ startContent, setStartContent }) => {
Empty Page
+ {/* e-commerce blocks */}
+
+ E-COMMERCE
+
+
+ setStartContent(200)}
+ >
+ Offer Grid
+
+
+ setStartContent(201)}
+ >
+ Product Details Page
+
+
+ {/* setStartContent(202)}*/}
+ {/*>*/}
+ {/* Product Filter Page*/}
+ {/* */}
+ {/**/}
+ setStartContent(203)}
+ >
+ Checkout Page
+
+
+
{/* Randoms */}
RANDOM
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/CheckoutPageExample1.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/CheckoutPageExample1.jsx
new file mode 100644
index 0000000..ec9d773
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/CheckoutPageExample1.jsx
@@ -0,0 +1,394 @@
+import React, {useState} from 'react';
+import {IoChevronDown} from "react-icons/io5";
+
+const CheckoutPageExample1 = () => {
+ const [selectedPayment, setSelectedPayment] = useState('credit-card')
+ const [differentAddress, setDifferentAddress] = useState(false)
+ const [isChecked, setIsChecked] = useState(false)
+
+ const handleCheckboxChange = (event) => {
+ if(event.target.checked){
+ setIsChecked(true)
+ }else {
+ setIsChecked(false)
+ }
+ }
+
+ const inputStyles = 'border border-gray-200 w-full py-2 px-4 rounded-md mt-1 outline-none focus:border-[#0FABCA]'
+ const labelStyles = 'text-[14px] font-[400] text-gray-700'
+
+ const countries = ["United States", "Canada", "India", "Australia", "United Kingdom"];
+ const regions = ["California", "Ontario", "Maharashtra", "New South Wales", "England"];
+ const cities = ["Los Angeles", "Toronto", "Mumbai", "Sydney", "London"];
+
+ return (
+
+
+ {/* Billing and Payment Form */}
+
+
+ {/* Billing Information */}
+
+
Billing Information
+
+
+
+
+
+ Company Name (Optional)
+
+
+
+
+
+ Address
+
+
+
+
+
+
+
+ Country
+
+
+
+
+
+ Region/State
+
+
+
+
+
+
+
+ City
+
+
+
+
+
+ Zip Code
+
+
+
+
+
+
+
+
+
+
+ {/* Payment Options */}
+
+
Payment Option
+
+ setSelectedPayment('cash')}
+ className={`flex flex-col items-center justify-center p-4 border rounded-lg ${
+ selectedPayment === 'cash' ? 'border-[#0FABCA]' : 'border-gray-200'
+ }`}
+ >
+ ๐ต
+ Cash on Delivery
+
+ setSelectedPayment('credit-card')}
+ className={`flex flex-col items-center justify-center p-4 border rounded-lg ${
+ selectedPayment === 'credit-card' ? 'border-[#0FABCA]' : 'border-gray-200'
+ }`}
+ >
+ ๐ณ
+ Debit/Credit Card
+
+
+
+ {selectedPayment === 'credit-card' && (
+
+
+
+ Name on Card
+
+
+
+
+
+ Card Number
+
+
+
+
+
+ )}
+
+
+ {/* Additional Information */}
+
+
Additional Information
+
+
+ Order Notes (Optional)
+
+
+
+
+
+
+ {/* Order Summary */}
+
+
+
Order Summary
+
+
+
+
+
+
+
Canon EOS 1500D DSLR Camera Body+ 18
+
+
+
+
+
+
+
+
+
Wired Over-Ear Gaming Headphones with U
+
+
+
+
+
+
+ Sub-total
+ $670
+
+
+ Shipping
+ Free
+
+
+ Discount
+ $20
+
+
+ Tax
+ $650
+
+
+
+
+
+ Total
+ $357.99 USD
+
+
+
+
+ PLACE ORDER
+
+
+
+
+
+ );
+};
+
+export default CheckoutPageExample1;
+
+const InputSelect = ({items}) => {
+ // close the dropdown is clicked outside
+ document.addEventListener("click", function (event) {
+ let target = event.target;
+
+ if (!target.closest(".dropdown")) {
+ setIsActive(false);
+ }
+ });
+
+ // actions
+ const [isActive, setIsActive] = useState(false);
+ const [content, setContent] = useState("Select Option");
+
+ return (
+ setIsActive(!isActive)}
+ >
+ {content}
+
+
+ {items?.map((option, index) => (
+
setContent(e.target.textContent)}
+ >
+ {option}
+
+ ))}
+
+
+ );
+};
+
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/CheckoutPageExample2.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/CheckoutPageExample2.jsx
new file mode 100644
index 0000000..6e60f07
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/CheckoutPageExample2.jsx
@@ -0,0 +1,212 @@
+import React from 'react';
+import {AiOutlinePlus} from "react-icons/ai";
+
+const CheckoutPageExample2 = () => {
+ return (
+
+
+ {/* Left Column - Order Summary */}
+
+
+ {/* order summery */}
+
+
Your order
+
+
+
+
+
+
1
+
+
+
Nike Air Zoom Pegasus 39
+
+
Size: XL
+
Color: Blue
+
+
+
+
$28.00
+
+
+
+
+
+
3
+
+
+
Nike Air Zoom Pegasus 39
+
+
Size: XL
+
Color: Blue
+
+
+
+
$28.00
+
+
+
+
Discount Code
+
+
+
+
Apply
+
+
+
+
+
+ Subtotal
+ $56.00
+
+
+ Shipping Cost
+ $8.00
+
+
+ Discount (10%)
+ -$13.00
+
+
+ Total
+ $51.00
+
+
+
+
+
+ {/* Right Column - Checkout Form */}
+
+
+ );
+};
+
+export default CheckoutPageExample2;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/Index.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/Index.jsx
new file mode 100644
index 0000000..dab54be
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/Index.jsx
@@ -0,0 +1,728 @@
+import React, {useEffect, useState} from "react";
+
+// components
+import ContentHeader from "../../../../../../Shared/ContentHeader";
+import {Helmet} from "react-helmet";
+import BlocksShowCode from "../../../../../../Shared/BlocksShowCode.jsx";
+
+// icons
+import BlocksFooter from "../../../../../../Shared/BlocksFooter.jsx";
+
+// toggle card view
+import {useToggleCardView} from "../../../../../../CustomHooks/ButtonToggle.js";
+import CheckoutPageExample1 from "./CheckoutPageExample1.jsx";
+import CheckoutPageExample2 from "./CheckoutPageExample2.jsx";
+
+const Index = () => {
+
+ const [checkoutPage1Preview, setCheckoutPage1Preview] = useState(true);
+ const [checkoutPage1Code, setCheckoutPage1Code] = useState(false);
+
+ const [checkoutPage2Preview, setCheckoutPage2Preview] = useState(true);
+ const [checkoutPage2Code, setCheckoutPage2Code] = useState(false);
+
+ const toggleCardView = useToggleCardView()
+
+ return (
+
+
+
+
+
+ The checkout page is where users review items, add shipping details, choose payment, and confirm their purchase securely.
+
+
+
+
+
+
toggleCardView(setCheckoutPage1Preview, setCheckoutPage1Code, true)}
+ >
+ Preview
+
+
toggleCardView(setCheckoutPage1Preview, setCheckoutPage1Code, false)}
+ >
+ Code
+
+
+ {checkoutPage1Preview && (
+
+
+
+ )}
+
+ {checkoutPage1Code &&
+ }
+
+
+
+
+
+
+
+ The checkout page is where users review items, add shipping details, choose payment, and confirm their purchase securely.
+
+
+
+
+
+
toggleCardView(setCheckoutPage2Preview, setCheckoutPage2Code, true)}
+ >
+ Preview
+
+
toggleCardView(setCheckoutPage2Preview, setCheckoutPage2Code, false)}
+ >
+ Code
+
+
+ {checkoutPage2Preview && (
+
+
+
+ )}
+
+ {checkoutPage2Code &&
+ }
+
+
+
+
+
+
+
+ Blocks - Checkout Page
+
+
+ );
+};
+
+export default Index;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/OfferGrid.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/OfferGrid.jsx
new file mode 100644
index 0000000..d85465e
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/OfferGrid.jsx
@@ -0,0 +1,881 @@
+import React, {useEffect, useState} from "react";
+
+// components
+import ContentHeader from "../../../../../Shared/ContentHeader";
+import {Helmet} from "react-helmet";
+import BlocksShowCode from "../../../../../Shared/BlocksShowCode.jsx";
+
+// icons
+import BlocksFooter from "../../../../../Shared/BlocksFooter.jsx";
+
+// toggle card view
+import {useToggleCardView} from "../../../../../CustomHooks/ButtonToggle.js";
+import {HiArrowRight} from "react-icons/hi";
+
+
+const OfferGrid = () => {
+
+ // toggle actions
+ const toggleCardView = useToggleCardView()
+
+ const [offerGrid1Preview, setOfferGrid1Preview] = useState(true);
+ const [offerGrid1Code, setOfferGrid1Code] = useState(false);
+
+ const [offerGrid2Preview, setOfferGrid2Preview] = useState(true);
+ const [offerGrid2Code, setOfferGrid2Code] = useState(false);
+
+ const [offerGrid3Preview, setOfferGrid3Preview] = useState(true);
+ const [offerGrid3Code, setOfferGrid3Code] = useState(false);
+
+ const [offerGrid4Preview, setOfferGrid4Preview] = useState(true);
+ const [offerGrid4Code, setOfferGrid4Code] = useState(false);
+
+ const [offerGrid5Preview, setOfferGrid5Preview] = useState(true);
+ const [offerGrid5Code, setOfferGrid5Code] = useState(false);
+
+ const [offerGrid6Preview, setOfferGrid6Preview] = useState(true);
+ const [offerGrid6Code, setOfferGrid6Code] = useState(false);
+
+ const [offerGrid7Preview, setOfferGrid7Preview] = useState(true);
+ const [offerGrid7Code, setOfferGrid7Code] = useState(false);
+
+ const [timeLeft, setTimeLeft] = useState({
+ days: 0,
+ hours: 0,
+ minutes: 0,
+ seconds: 0
+ });
+ const targetDate = '2024-12-31T23:59:59'
+
+ useEffect(() => {
+ const calculateTimeLeft = () => {
+ const difference = new Date(targetDate) - new Date();
+
+ if (difference > 0) {
+ setTimeLeft({
+ days: Math.floor(difference / (1000 * 60 * 60 * 24)),
+ hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
+ minutes: Math.floor((difference / 1000 / 60) % 60),
+ seconds: Math.floor((difference / 1000) % 60)
+ });
+ }
+ };
+
+ const timer = setInterval(calculateTimeLeft, 1000);
+ calculateTimeLeft(); // Initial call
+
+ return () => clearInterval(timer);
+ }, [targetDate]);
+
+ const formatNumber = (number) => number.toString().padStart(2, '0');
+
+ return (
+
+
+
+
+
+ Explore exclusive e-commerce offers in a sleek grid layoutโtop deals, big savings, and premium brands, all at your fingertips!
+
+
+
+
+
+
toggleCardView(setOfferGrid1Preview, setOfferGrid1Code, true)}
+ >
+ Preview
+
+
toggleCardView(setOfferGrid1Preview, setOfferGrid1Code, false)}
+ >
+ Code
+
+
+ {offerGrid1Preview && (
+
+
+
+
+
+
+
Living Room
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
Bedroom
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
Kitchen
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ {offerGrid1Code &&
+ }
+
+
+
+
+
+
+
+ Explore exclusive e-commerce offers in a sleek grid layoutโtop deals, big savings, and premium brands, all at your fingertips!
+
+
+
+
+
+
toggleCardView(setOfferGrid2Preview, setOfferGrid2Code, true)}
+ >
+ Preview
+
+
toggleCardView(setOfferGrid2Preview, setOfferGrid2Code, false)}
+ >
+ Code
+
+
+ {offerGrid2Preview && (
+
+
+
+
+
+
+
+
PlayStation 5
+
Black and White version of the PS5 coming out on sale.
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
Womenโs Collections
+
Featured woman collections that give you another vibe.
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
Speakers
+
Amazon wireless speakers
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
Perfume
+
GUCCI INTENSE OUD EDP
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ {offerGrid2Code &&
+ }
+
+
+
+
+
+
+
+ Explore exclusive e-commerce offers in a sleek grid layoutโtop deals, big savings, and premium brands, all at your fingertips!
+
+
+
+
+
+
toggleCardView(setOfferGrid3Preview, setOfferGrid3Code, true)}
+ >
+ Preview
+
+
toggleCardView(setOfferGrid3Preview, setOfferGrid3Code, false)}
+ >
+ Code
+
+
+ {offerGrid3Preview && (
+
+
+
+
+
+
+
+
PlayStation 5
+
Incredibly powerful CPUs, GPUs, and an SSD with integrated I/O will redefine your PlayStation experience.
+
+
+
+
+
+
+
+
+
Macbook Air
+
The new 15โinch MacBook Air makes room for more of what you love with a spacious Liquid Retina display.
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
Apple
+ AirPods Max
+
Computational audio. Listen, it's powerful
+
+
+
+
+
+
+
+
+
Apple
+ Vision Pro
+
An immersive way to experience entertainment
+
+
+
+
+
+
+
+
+ )}
+
+ {offerGrid3Code &&
+ }
+
+
+
+
+
+
+
+ Explore exclusive e-commerce offers in a sleek grid layoutโtop deals, big savings, and premium brands, all at your fingertips!
+
+
+
+
+
+
toggleCardView(setOfferGrid4Preview, setOfferGrid4Code, true)}
+ >
+ Preview
+
+
toggleCardView(setOfferGrid4Preview, setOfferGrid4Code, false)}
+ >
+ Code
+
+
+ {offerGrid4Preview && (
+
+
+
+
+
+
+
+
PROMOTION
+
Hurry up! 40% OFF
+
Thousands of high tech
+ are waiting for you
+
+
+
Offer expires in:
+
+
+
{formatNumber(timeLeft.days)}
+ Days
+
+
+
{formatNumber(timeLeft.hours)}
+ Hours
+
+
+
{formatNumber(timeLeft.minutes)}
+ Minutes
+
+
+
{formatNumber(timeLeft.seconds)}
+ Seconds
+
+
+
+
+
Shop Now
+
+
+
+
+
+ )}
+
+ {offerGrid4Code &&
+ }
+
+
+
+
+
+
+
+ Explore exclusive e-commerce offers in a sleek grid layoutโtop deals, big savings, and premium brands, all at your fingertips!
+
+
+
+
+
+
toggleCardView(setOfferGrid5Preview, setOfferGrid5Code, true)}
+ >
+ Preview
+
+
toggleCardView(setOfferGrid5Preview, setOfferGrid5Code, false)}
+ >
+ Code
+
+
+ {offerGrid5Preview && (
+
+
+
+
+
+
+
SAVE UP TO $200.00
+
+
Macbook Pro
+
+
Apple M1 Max Chip. 32GB Unified Memory, 1TB SSD Storage
+
+
+ Shop Now
+
+
+
+
+
+
+
$1999
+
+
+
+
+
+
+
+
+ )}
+
+ {offerGrid5Code &&
+ }
+
+
+
+
+
+
+
+ Blocks - Offer Grid
+
+
+ );
+};
+
+export default OfferGrid;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/Index.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/Index.jsx
new file mode 100644
index 0000000..ae8da05
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/Index.jsx
@@ -0,0 +1,811 @@
+import React, {useEffect, useState} from "react";
+
+// components
+import ContentHeader from "../../../../../../Shared/ContentHeader";
+import {Helmet} from "react-helmet";
+import BlocksShowCode from "../../../../../../Shared/BlocksShowCode.jsx";
+
+// icons
+import BlocksFooter from "../../../../../../Shared/BlocksFooter.jsx";
+
+// toggle card view
+import {useToggleCardView} from "../../../../../../CustomHooks/ButtonToggle.js";
+
+// product details examples components
+import ProductDetailsExample1 from "./ProductDetailsExample1.jsx";
+import ProductDetailsExample2 from "./ProductDetailsExample2.jsx";
+import ProductDetailsExample3 from "./ProductDetailsExample3.jsx";
+
+
+const Index = () => {
+
+ // toggle actions
+ const toggleCardView = useToggleCardView()
+
+ const [productDetails1Preview, setProductDetails1Preview] = useState(true);
+ const [productDetails1Code, setProductDetails1Code] = useState(false);
+
+ const [productDetails2Preview, setProductDetails2Preview] = useState(true);
+ const [productDetails2Code, setProductDetails2Code] = useState(false);
+
+ const [productDetails3Preview, setProductDetails3Preview] = useState(true);
+ const [productDetails3Code, setProductDetails3Code] = useState(false);
+
+ return (
+
+
+
+
+
+ View all product details in one place - images, specs, reviews, pricing, and more. Everything you need to make an informed purchase!
+
+
+
+
+
+
toggleCardView(setProductDetails1Preview, setProductDetails1Code, true)}
+ >
+ Preview
+
+
toggleCardView(setProductDetails1Preview, setProductDetails1Code, false)}
+ >
+ Code
+
+
+ {productDetails1Preview && (
+
+ )}
+
+ {productDetails1Code &&
+ }
+
+
+
+
+
+
+
+ View all product details in one place - images, specs, reviews, pricing, and more. Everything you need to make an informed purchase!
+
+
+
+
+
+
toggleCardView(setProductDetails2Preview, setProductDetails2Code, true)}
+ >
+ Preview
+
+
toggleCardView(setProductDetails2Preview, setProductDetails2Code, false)}
+ >
+ Code
+
+
+ {productDetails2Preview && (
+
+ )}
+
+ {productDetails2Code &&
+ }
+
+
+
+
+
+
+
+ View all product details in one place - images, specs, reviews, pricing, and more. Everything you need to make an informed purchase!
+
+
+
+
+
+
toggleCardView(setProductDetails3Preview, setProductDetails3Code, true)}
+ >
+ Preview
+
+
toggleCardView(setProductDetails3Preview, setProductDetails3Code, false)}
+ >
+ Code
+
+
+ {productDetails3Preview && (
+
+ )}
+
+ {productDetails3Code &&
+ }
+
+
+
+
+
+
+
+ Blocks - Product Details Page
+
+
+ );
+};
+
+export default Index;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample1.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample1.jsx
new file mode 100644
index 0000000..57152e0
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample1.jsx
@@ -0,0 +1,210 @@
+import React, {useState} from 'react';
+
+// react icons
+import {BsHeart, BsHeartFill} from 'react-icons/bs'
+import {FiCpu, FiSmartphone} from 'react-icons/fi'
+import {IoMdCamera} from 'react-icons/io'
+import {MdBatteryChargingFull} from 'react-icons/md'
+import {GoVerified} from "react-icons/go";
+import {IoStorefrontOutline} from "react-icons/io5";
+import {CiDeliveryTruck} from "react-icons/ci";
+
+const ProductDetailsExample1 = () => {
+
+ const [selectedImage, setSelectedImage] = useState(0)
+ const [selectedColor, setSelectedColor] = useState('black')
+ const [selectedStorage, setSelectedStorage] = useState('1TB')
+ const [isFavorite, setIsFavorite] = useState(false)
+
+ const images = [
+ 'https://i.ibb.co.com/GTGBw03/image-323.png',
+ 'https://i.ibb.co.com/thxkk1x/image-320.png',
+ 'https://i.ibb.co.com/MckV93r/image-320.png',
+ 'https://i.ibb.co.com/ZGWRGDT/image-320.png'
+ ]
+
+ const colors = [
+ {name: 'black', class: 'bg-black'},
+ {name: 'purple', class: 'bg-purple-600'},
+ {name: 'red', class: 'bg-red-600'},
+ {name: 'yellow', class: 'bg-yellow-500'},
+ {name: 'gray', class: 'bg-gray-200'}
+ ]
+
+ const storage = ['128GB', '256GB', '512GB', '1TB']
+
+ return (
+
+
+
+ {/* Left side - Image gallery */}
+
+
+ {/* Thumbnails */}
+
+ {images.map((image, index) => (
+
setSelectedImage(index)}
+ className={`relative w-36 1024px:w-20 h-[70px] 1024px:h-20 border-2 p-1 1024px:p-2 rounded-lg overflow-hidden ${
+ selectedImage === index ? 'border-[#0FABCA]' : 'border-transparent'
+ }`}
+ >
+
+
+ ))}
+
+
+ {/* Main image */}
+
+
+
+
+
+ {/* Right side - Product details */}
+
+
+
Apple iPhone 14 Pro Max
+
+ $1399
+ $1499
+
+
+
+ {/* Color selection */}
+
+
Select color:
+
+ {colors.map((color) => (
+ setSelectedColor(color.name)}
+ className={`w-8 h-8 rounded-full ${color.class} ${
+ selectedColor === color.name ? 'ring-2 ring-offset-2 ring-[#0FABCA]' : ''
+ }`}
+ aria-label={color.name}
+ />
+ ))}
+
+
+
+ {/* Storage selection */}
+
+
+ {storage.map((size) => (
+ setSelectedStorage(size)}
+ className={`py-2 px-4 rounded-lg border ${
+ selectedStorage === size
+ ? 'border-[#0FABCA] bg-[#0FABCA]/10 text-[#0FABCA]'
+ : 'border-gray-200'
+ }`}
+ >
+ {size}
+
+ ))}
+
+
+
+ {/* Specifications */}
+
+
+
+
+
+
CPU
+
Apple A16 Bionic
+
+
+
+
+
+
+
+ Enhanced capabilities thanks to an enlarged display of 6.7 inches and work without
+ recharging throughout the day. Incredible photos in weak, yes and in bright light using
+ the new system with two cameras...
+ more...
+
+
+ {/* Action buttons */}
+
+
setIsFavorite(!isFavorite)}
+ className="flex-1 py-3 px-4 rounded-lg border border-gray-200 text-gray-800 hover:bg-gray-50">
+
+ {
+ isFavorite ? (
+
+ )
+ : (
+
+ )
+ }
+ Add to Wishlist
+
+
+
+ Add to Card
+
+
+
+ {/* Delivery info */}
+
+
+
+
+
Free Delivery
+
1-2 day
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ProductDetailsExample1;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample2.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample2.jsx
new file mode 100644
index 0000000..24ef8f4
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample2.jsx
@@ -0,0 +1,242 @@
+import React, {useState, useEffect} from 'react';
+
+// react icons
+import {FaStar} from 'react-icons/fa6'
+import {FaHeart, FaRegHeart} from 'react-icons/fa'
+import {BiChevronLeft, BiChevronRight} from "react-icons/bi";
+
+const ProductDetailsExample2 = () => {
+
+ const [currentImageIndex, setCurrentImageIndex] = useState(0)
+ const [quantity, setQuantity] = useState(1)
+ const [selectedColor, setSelectedColor] = useState('black')
+ const [isFavorite, setIsFavorite] = useState(false)
+ const [timeLeft, setTimeLeft] = useState({
+ days: 2,
+ hours: 12,
+ minutes: 45,
+ seconds: 5
+ })
+
+ const images = [
+ 'https://i.ibb.co.com/8ck41d5/Paste-image.png',
+ 'https://i.ibb.co.com/0QhryRt/Paste-Image.png',
+ 'https://i.ibb.co.com/JsJcVYZ/Paste-Image.png',
+ 'https://i.ibb.co.com/n6sF5wz/Paste-Image.png',
+ ]
+
+ const colors = [
+ {name: 'black', value: 'bg-black'},
+ {name: 'beige', value: 'bg-[#D2C4B5]'},
+ {name: 'red', value: 'bg-red-500'},
+ {name: 'white', value: 'bg-white'},
+ ]
+
+ useEffect(() => {
+ const timer = setInterval(() => {
+ setTimeLeft(prev => {
+ if (prev.seconds > 0) {
+ return {...prev, seconds: prev.seconds - 1}
+ } else if (prev.minutes > 0) {
+ return {...prev, minutes: prev.minutes - 1, seconds: 59}
+ } else if (prev.hours > 0) {
+ return {...prev, hours: prev.hours - 1, minutes: 59, seconds: 59}
+ } else if (prev.days > 0) {
+ return {...prev, days: prev.days - 1, hours: 23, minutes: 59, seconds: 59}
+ }
+ return prev
+ })
+ }, 1000)
+
+ return () => clearInterval(timer)
+ }, [])
+
+ const nextImage = () => {
+ setCurrentImageIndex((prev) => (prev + 1) % images.length)
+ }
+
+ const previousImage = () => {
+ setCurrentImageIndex((prev) => (prev - 1 + images.length) % images.length)
+ }
+
+ const formatNumber = (number) => number.toString().padStart(2, '0');
+
+ return (
+
+
+
+ {/* Left side - Image gallery */}
+
+
+
+
+ {/* NEW and SALE tags */}
+
+
+ {/* Main image with navigation arrows */}
+
+
+
+
+
+
+
+
+
+
+
+ {/* Thumbnail images */}
+
+ {images.map((image, index) => (
+
setCurrentImageIndex(index)}
+ className={`relative transition-all duration-300 w-[8rem] aspect-square ${
+ currentImageIndex === index
+ ? 'ring-2 ring-[#0FABCA]'
+ : 'hover:ring-2 hover:ring-[#0FABCA]'
+ }`}
+ >
+
+
+ ))}
+
+
+
+ {/* Right side - Product details */}
+
+
+
+ {[...Array(5)].map((_, i) => (
+
+ ))}
+
+
11 Reviews
+
+
+
Tray Table
+
+
+ Buy one or buy a few and make every space where you sit more convenient. Light and easy to
+ move around with removable tray top, handy for serving snacks.
+
+
+
+ $199.00
+ $400.00
+
+
+
+
Offer expires in:
+
+
+
{formatNumber(timeLeft.days)}
+ Days
+
+
+
{formatNumber(timeLeft.hours)}
+ Hours
+
+
+
{formatNumber(timeLeft.minutes)}
+ Minutes
+
+
+
{formatNumber(timeLeft.seconds)}
+ Seconds
+
+
+
+
+
+
Measurements
+
17 1/2ร20 5/8 "
+
+
+
+
Choose Color
+
{selectedColor}
+
+ {colors.map((color) => (
+ setSelectedColor(color.name)}
+ aria-label={color.name}
+ key={color.name}
+ className={`w-8 h-8 rounded-full ${color.value} ${
+ selectedColor === color.name ? 'ring-2 ring-offset-2 ring-[#0FABCA]' : ''
+ }`}
+ >
+
+ ))}
+
+
+
+
+
+ setQuantity(Math.max(1, quantity - 1))}
+ className="px-4 py-[0.560rem] text-[1.3rem] font-[300] hover:bg-gray-100 rounded-l-md"
+ >
+ โ
+
+ setQuantity(Math.max(1, parseInt(e.target.value) || 1))}
+ className="w-10 font-medium text-[0.9rem] bg-transparent text-center"
+ />
+ setQuantity(quantity + 1)}
+ className="px-4 py-[0.560rem] text-[1.3rem] font-[300] hover:bg-gray-100 rounded-r-md"
+ >
+ +
+
+
+
setIsFavorite(!isFavorite)}
+ className="py-3 border border-gray-200 rounded-md flex items-center justify-center gap-[10px] grow hover:bg-gray-50">
+ {
+ isFavorite ? (
+
+ )
+ : (
+
+ )
+ }
+ Wishlist
+
+
+
+
+ Add to Cart
+
+
+
+
+ );
+};
+
+export default ProductDetailsExample2;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample3.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample3.jsx
new file mode 100644
index 0000000..5f09ad6
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/ProductDetailsExample3.jsx
@@ -0,0 +1,192 @@
+import React, {useState} from 'react';
+
+// react icons
+import {IoHeart, IoHeartOutline, IoShareSocialOutline, IoStar} from "react-icons/io5";
+import {BiChevronLeft, BiChevronRight, BiStar} from "react-icons/bi";
+
+const ProductDetailsExample1 = () => {
+
+ const [currentImageIndex, setCurrentImageIndex] = useState(0)
+ const [isFavorite, setIsFavorite] = useState(false)
+ const [selectedSize, setSelectedSize] = useState('8')
+ const [selectedColor, setSelectedColor] = useState('Royal Brown')
+
+ const images = [
+ 'https://i.ibb.co.com/LxyQVtG/image-19.png',
+ 'https://i.ibb.co.com/d6RXLM2/image-22.png',
+ 'https://i.ibb.co.com/17yKVQm/image-19.png',
+ 'https://i.ibb.co.com/NCQFGJr/image-21.png',
+ 'https://i.ibb.co.com/2tWVrdD/image-23.png'
+ ]
+
+ const sizes = ['6', '8', '10', '14', '18', '20']
+ const colors = [
+ { name: 'Royal Brown', class: 'bg-[#654321]' },
+ { name: 'Light Gray', class: 'bg-gray-200' },
+ { name: 'Steel Blue', class: 'bg-[#4682B4]' },
+ { name: 'Navy', class: 'bg-navy-900' }
+ ]
+
+ const nextImage = () => {
+ setCurrentImageIndex((prev) => (prev + 1) % images.length)
+ }
+
+ const prevImage = () => {
+ setCurrentImageIndex((prev) => (prev - 1 + images.length) % images.length)
+ }
+
+ const selectThumbnail = (index) => {
+ setCurrentImageIndex(index)
+ }
+
+ return (
+
+
+ {/* Image Section */}
+
+
+
+
+
+
+
+
+
+
+
+
+ setIsFavorite(!isFavorite)}
+ >
+ {
+ isFavorite ? (
+
+ ) : (
+
+ )
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {images.map((img, index) => (
+
selectThumbnail(index)}
+ className={`flex-shrink-0 bg-gray-100 w-20 transition-all duration-300 h-20 rounded-md overflow-hidden border-2 ${currentImageIndex === index ? "border-[#0FABCA]" : "border-transparent"
+ }`}
+ >
+
+
+ ))}
+
+
+
+ {/* Product Details Section */}
+
+
+
+
John Lewis ANYDAY
+
Long Sleeve Overshirt, Khaki, 6
+
+
+ ยฃ28.00
+ ยฃ40.00
+
+
+
+ 4.5
+ (1,238 Sold)
+
+
+
+
+
+
+
Description:
+
+ Boba etiam ut bulla tea est potus electus singulari compositione saporum et textuum, quae in
+ Taiwan annis 1980 orta sunt. Boba refert ad pitas marnicas tapiocas in fundo potus inventas,
+ quae typice lacte tea nigro sapiuntur.
+ See More...
+
+
+
+
+
+
Color: {selectedColor}
+
+
+ {colors.map((color) => (
+
setSelectedColor(color.name)}
+ className={` w-20 h-10 rounded-md border-2 transition-all duration-300 ${
+ selectedColor === color.name ? "border-[#0FABCA] p-1" : "border-transparent" } `}
+ aria-label={`Select ${color.name} color`}
+ >
+
+
+ ))}
+
+
+
+
+
+
Size: {selectedSize}
+ View Size Chart
+
+
+ {sizes.map((size) => (
+ setSelectedSize(size)}
+ className={
+ `px-4 py-2 max-w-[60px] grow rounded-md border ${selectedSize === size
+ ? "border-[#0FABCA] bg-[#0FABCA] text-white"
+ : "border-gray-200 hover:border-[#0FABCA]"}`}
+ >
+ {size}
+
+ ))}
+
+
+
+
+
+ Add To Cart
+
+
+ Checkout Now
+
+
+
+
+
+ );
+};
+
+export default ProductDetailsExample1;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductFilterComponent/Index.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductFilterComponent/Index.jsx
new file mode 100644
index 0000000..e4554a0
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductFilterComponent/Index.jsx
@@ -0,0 +1,77 @@
+import React, {useEffect, useState} from "react";
+
+// components
+import ContentHeader from "../../../../../../Shared/ContentHeader";
+import {Helmet} from "react-helmet";
+import BlocksShowCode from "../../../../../../Shared/BlocksShowCode.jsx";
+
+// icons
+import BlocksFooter from "../../../../../../Shared/BlocksFooter.jsx";
+
+// toggle card view
+import {useToggleCardView} from "../../../../../../CustomHooks/ButtonToggle.js";
+import ProductFilterExample1 from "./ProductFilterExample1.jsx";
+
+
+const Index = () => {
+
+ const [wrongRoute1Preview, setWrongRoute1Preview] = useState(true);
+ const [wrongRoute1Code, setWrongRoute1Code] = useState(false);
+
+ const toggleCardView = useToggleCardView()
+
+ return (
+
+
+
+
+
+ A 404 page is a custom error page that informs users the requested page is not found, often offering
+ navigation links to guide them back to the homepage or other sections.
+
+
+
+
+
+
toggleCardView(setWrongRoute1Preview, setWrongRoute1Code, true)}
+ >
+ Preview
+
+
toggleCardView(setWrongRoute1Preview, setWrongRoute1Code, false)}
+ >
+ Code
+
+
+ {wrongRoute1Preview && (
+
+ )}
+
+ {wrongRoute1Code &&
+ }
+
+
+
+
+
+
+
+ Blocks - Product Details Page
+
+
+ );
+};
+
+export default Index;
diff --git a/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductFilterComponent/ProductFilterExample1.jsx b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductFilterComponent/ProductFilterExample1.jsx
new file mode 100644
index 0000000..7243619
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Blocks/E-Commerce/ProductFilterComponent/ProductFilterExample1.jsx
@@ -0,0 +1,827 @@
+import React, {useEffect, useState} from 'react';
+import {IoEyeOutline, IoSearch} from "react-icons/io5";
+import {IoIosArrowDown, IoMdHeartEmpty} from "react-icons/io";
+import {HiArrowsUpDown} from "react-icons/hi2";
+import {FaStar} from "react-icons/fa";
+
+const ProductFilterExample1 = () => {
+
+ const products = [
+ {
+ id: "1",
+ name: "2020 M1 True Wireless Bluetooth Headphones",
+ price: 299.99,
+ rating: 4.5,
+ reviews: 128,
+ category: ["Electronics", "Audio", "Wireless Accessories"],
+ brand: "Apple",
+ image: "https://i.ibb.co.com/phjMmsG/Image-11.png",
+ labels: ["NEW"],
+ inStock: true,
+ specs: {
+ color: ["Black", "White"],
+ connectivity: ["Bluetooth 5.0"],
+ type: "In-ear"
+ }
+ },
+ {
+ id: "2",
+ name: "Samsung Electronics Ultrawide Gaming Monitor",
+ price: 499.99,
+ rating: 4.8,
+ reviews: 256,
+ category: ["Electronics", "Computer Accessories", "Monitors"],
+ brand: "Samsung",
+ image: "https://i.ibb.co.com/fdz6djB/Image-10.png",
+ labels: ["POPULAR"],
+ inStock: true,
+ specs: {
+ size: "34-inch",
+ type: "LED",
+ resolution: "3440x1440"
+ }
+ },
+ {
+ id: "3",
+ name: "Professional Gaming Mechanical Keyboard",
+ price: 159.99,
+ rating: 4.7,
+ reviews: 89,
+ category: ["Gaming", "Computer Accessories"],
+ brand: "Razer",
+ image: "https://i.ibb.co.com/Tk4kb93/Image-17.png",
+ labels: ["HOT"],
+ inStock: true,
+ specs: {
+ type: "Mechanical",
+ connectivity: ["Wired", "Wireless"]
+ }
+ },
+ {
+ id: "4",
+ name: "4K Ultra HD Smart TV",
+ price: 899.99,
+ rating: 4.6,
+ reviews: 312,
+ category: ["Electronics", "TV"],
+ brand: "LG",
+ image: "https://i.ibb.co.com/ZVsvWnM/Image-12.png",
+ inStock: true,
+ specs: {
+ size: "55-inch",
+ type: "OLED",
+ resolution: "3840x2160"
+ }
+ },
+ {
+ id: "5",
+ name: "Wireless Security Camera",
+ price: 79.99,
+ rating: 4.3,
+ reviews: 167,
+ category: ["Electronics", "Security"],
+ brand: "Xiaomi",
+ image: "https://i.ibb.co.com/nMgLvb1/Image-19.png",
+ labels: ["SALE"],
+ inStock: true,
+ specs: {
+ connectivity: ["Wi-Fi"],
+ type: "Indoor"
+ }
+ },
+ {
+ id: "6",
+ name: "Professional Noise-Cancelling Headphones",
+ price: 349.99,
+ rating: 4.9,
+ reviews: 423,
+ category: ["Electronics", "Audio"],
+ brand: "Sony",
+ image: "https://i.ibb.co.com/Nx6H5s3/Image-16.png",
+ inStock: true,
+ specs: {
+ color: ["Black", "Silver"],
+ connectivity: ["Bluetooth 5.0", "Wired"],
+ type: "Over-ear"
+ }
+ },
+ {
+ id: "7",
+ name: "High-Performance Gaming Laptop",
+ price: 1299.99,
+ rating: 4.7,
+ reviews: 89,
+ category: ["Electronics", "Computers", "Gaming"],
+ brand: "ASUS",
+ image: "https://i.ibb.co.com/H74t7f2/Image-21.png",
+ labels: ["NEW"],
+ inStock: true,
+ specs: {
+ processor: "Intel Core i7",
+ storage: "512GB SSD",
+ size: "15.6-inch"
+ }
+ },
+ {
+ id: "11",
+ name: "4K Action Camera",
+ price: 399.99,
+ rating: 4.8,
+ reviews: 178,
+ category: ["Electronics", "Cameras"],
+ brand: "GoPro",
+ image: "https://i.ibb.co.com/cgxVvgP/Image-20.png",
+ labels: ["HOT"],
+ inStock: true,
+ specs: {
+ resolution: "4K",
+ type: "Waterproof"
+ }
+ },
+ {
+ id: "14",
+ name: "Wireless Gaming Controller",
+ price: 59.99,
+ rating: 4.5,
+ reviews: 203,
+ category: ["Gaming", "Wireless Accessories"],
+ brand: "Microsoft",
+ image: "https://i.ibb.co.com/xS5hwjd/Image-22.png",
+ inStock: true,
+ specs: {
+ connectivity: ["Bluetooth"],
+ type: "Xbox-compatible"
+ }
+ },
+ {
+ id: "15",
+ name: "Smart Thermostat",
+ price: 249.99,
+ rating: 4.6,
+ reviews: 187,
+ category: ["Electronics", "Smart Home"],
+ brand: "Nest",
+ image: "https://i.ibb.co.com/b5c4Z7r/Image-23.png",
+ labels: ["POPULAR"],
+ inStock: true,
+ specs: {
+ connectivity: ["Wi-Fi"],
+ type: "Energy-saving"
+ }
+ }
+ ];
+
+ const [toggleId, setToggleId] = useState(null);
+ const [search, setSearch] = useState("");
+ const [isOpen, setIsOpen] = useState(false);
+ const [selectedOptions, setSelectedOptions] = useState(null);
+ const [activePriceRange, setActivePriceRange] = useState(null);
+ const [value, setValue] = useState(0);
+ const [activebrand, setActivebrand] = useState(null);
+ const [activeTag, setActiveTag] = useState(null);
+ const [rating, setRating] = useState(5);
+ const [wishlistVisible, setWishlistVisible] = useState(false);
+ const [compareVisible, setCompareVisible] = useState(false);
+ const [quickViewVisible, setQuickViewVisible] = useState(false);
+ const [allProducts, setAllProducts] = useState(products);
+
+ const [filters, setFilters] = useState({
+ search: '',
+ categories: [],
+ priceRange: { min: 0, max: Infinity },
+ brands: [],
+ tags: []
+ });
+
+ const handleChange = (event) => {
+ setValue(event.target.value);
+ };
+
+ const handleClick = (event) => {
+ const slider = event.target.getBoundingClientRect();
+ const newValue = ((event.clientX - slider.left) / slider.width) * 100;
+ setValue(Math.min(Math.max(newValue, 0), 5000));
+ };
+
+ const handleCheckboxChange = (event, data) => {
+ if(event.target.checked){
+ setActivebrand(data.id)
+ }
+ }
+
+ useEffect(() => {
+ let result = products.filter(product => {
+ // Search filter
+ const searchMatch = product.name.toLowerCase().includes(filters.search.toLowerCase());
+
+ // Category filter
+ const categoryMatch = filters.categories.length === 0 ||
+ filters.categories.some(cat => product.category.includes(cat));
+
+ // Price range filter
+ const priceMatch = product.price >= filters.priceRange.min &&
+ product.price <= filters.priceRange.max;
+
+ // Brand filter
+ const brandMatch = filters.brands.length === 0 ||
+ filters.brands.includes(product.brand);
+
+ // Tag filter
+ const tagMatch = filters.tags.length === 0 ||
+ filters.tags.some(tag => product.category.includes(tag));
+
+ return searchMatch && categoryMatch && priceMatch && brandMatch && tagMatch;
+ });
+
+ setAllProducts(result);
+ }, [filters, products]);
+
+ // Handler for updating filters
+ const updateFilter = (filterType, value) => {
+ setFilters(prev => ({
+ ...prev,
+ [filterType]: value
+ }));
+ };
+
+ // Toggle selection for multi-select filters
+ const toggleFilterSelection = (filterType, value) => {
+ setFilters(prev => {
+ const currentFilter = prev[filterType];
+ const isSelected = currentFilter.includes(value);
+
+ return {
+ ...prev,
+ [filterType]: isSelected
+ ? currentFilter.filter(item => item !== value)
+ : [...currentFilter, value]
+ };
+ });
+ };
+
+ const categories = [
+ {
+ id: 1,
+ name: 'Electronics Devices',
+ slug: 'electronics_devices'
+ },
+ {
+ id: 2,
+ name: 'Computer & Laptop',
+ slug: 'computer_&_laptop'
+ },
+ {
+ name: 'Computer Accessories',
+ slug: 'computer_accessories'
+ },
+ {
+ id: 3,
+ name: 'SmartPhone',
+ slug: 'smart_phone'
+ },
+ {
+ id: 4,
+ name: 'Headphone',
+ slug: 'headphone'
+ },
+ {
+ id: 5,
+ name: 'Mobile Accessories',
+ slug: 'mobile_accessories'
+ },
+ {
+ id: 6,
+ name: 'Gaming Console',
+ slug: 'gaming_console'
+ },
+ {
+ id: 7,
+ name: 'Camera & Photo',
+ slug: 'camera_&_photo'
+ },
+ {
+ id: 8,
+ name: 'TV & Homes Appliances',
+ slug: 'tv_&_homes_appliances'
+ },
+ {
+ id: 9,
+ name: 'Watchs & Accessories',
+ slug: 'watchs_&_accessories'
+ },
+ {
+ id: 10,
+ name: 'GPS & Navigation',
+ slug: 'gps_&_navigation'
+ },
+ ]
+
+ const items = [
+ { id: 1, name: "Option 1" },
+ { id: 2, name: "Option 2" },
+ { id: 3, name: "Option 3" },
+ { id: 4, name: "Option 4" },
+ { id: 5, name: "Option 5" },
+ ];
+
+ const priceRanges = [
+ {
+ id: 0,
+ name: 'All Price',
+ slug: 'all_price',
+ min: '',
+ max: ''
+ },
+ {
+ id: 1,
+ name: 'Under $20',
+ slug: 'under_20',
+ min: 0,
+ max: 20
+ },
+ {
+ id: 2,
+ name: '$25 to $100',
+ slug: '20_to_100',
+ min: 20,
+ max: 100
+ },
+ {
+ id: 3,
+ name: '$100 to $300',
+ slug: '100_to_300',
+ min: 100,
+ max: 300
+ },
+ {
+ id: 4,
+ name: '$300 to $500',
+ slug: '300_to_500',
+ min: 300,
+ max: 500
+ },
+ {
+ id: 5,
+ name: '$500 to $1,000',
+ slug: '500_to_1000',
+ min: 500,
+ max: 1000
+ },
+ {
+ id: 6,
+ name: '$1,000 to $10,000',
+ slug: '1000_to_10000',
+ min: 1000,
+ max: 10000
+ },
+ ]
+
+ const popularbrands = [
+ {
+ id: 0,
+ name: 'Apple',
+ slug: 'apple',
+ },
+ {
+ id: 1,
+ name: 'Microsoft',
+ slug: 'microsoft'
+ },
+ {
+ id: 2,
+ name: 'Google',
+ slug: 'google'
+ },
+ {
+ id: 3,
+ name: 'Samsung',
+ slug: 'samsung'
+ },
+ {
+ id: 4,
+ name: 'Dell',
+ slug: 'dell'
+ },
+ {
+ id: 5,
+ name: 'HP',
+ slug: 'hp'
+ },
+ {
+ id: 6,
+ name: 'Symphony',
+ slug: 'symphony'
+ },
+ {
+ id: 7,
+ name: 'Xiaomi',
+ slug: 'xiaomi'
+ },
+ {
+ id: 8,
+ name: 'Sony',
+ slug: 'sony'
+ },
+ {
+ id: 9,
+ name: 'Panasonic',
+ slug: 'panasonic'
+ },
+ {
+ id: 10,
+ name: 'LG',
+ slug: 'lg'
+ },
+ ]
+
+ const mostTags = [
+ {
+ name: 'Game',
+ slug: 'game'
+ },
+ {
+ name: 'iPhone',
+ slug: 'iPhone'
+ },
+ {
+ name: 'TV',
+ slug: 'tv'
+ },
+ {
+ name: 'Asus Laptops',
+ slug: 'asus_laptops'
+ },
+ {
+ name: 'Macbook ',
+ slug: 'macbook'
+ },
+ {
+ name: 'SSD',
+ slug: 'ssd'
+ },
+ {
+ name: 'Graphics Card',
+ slug: 'graphics_card'
+ },
+ {
+ name: 'Power Bank ',
+ slug: 'power_bank '
+ },
+ {
+ name: 'Smart TV',
+ slug: 'smart_tv'
+ },
+ {
+ name: 'Speaker',
+ slug: 'speaker'
+ },
+ {
+ name: 'Tablet',
+ slug: 'tablet'
+ },
+ ]
+
+ const filteredItems = items.filter(item =>
+ item.name.toLowerCase().includes(search.toLowerCase())
+ );
+
+ const isSelected = (item) => {
+ return selectedOptions?.id === item.id;
+ };
+
+ const toggleSelection = (item) => {
+ setSelectedOptions(item);
+ };
+
+ const handleBlur = () => {
+ setTimeout(() => {
+ setIsOpen(false);
+ }, 200);
+ };
+
+ useEffect(() => {
+ const handleClickOutside = (event) => {
+ if (event.target.closest(".custom-select")) return;
+ handleBlur();
+ };
+ document.addEventListener("mousedown", handleClickOutside);
+ return () => document.removeEventListener("mousedown", handleClickOutside);
+ }, []);
+
+ return (
+
+
+ {/* left side */}
+
+
+ {/* categories */}
+ Category
+
+ {categories.map(category => (
+
+ toggleFilterSelection('categories', category.name)}
+ />
+ {category.name}
+
+ ))}
+
+
+ {/* prices */}
+
+
Price Range
+
+
+
+
+ updateFilter('priceRange', {
+ ...filters.priceRange,
+ min: Number(e.target.value)
+ })}
+ />
+ updateFilter('priceRange', {
+ ...filters.priceRange,
+ max: e.target.value ? Number(e.target.value) : Infinity
+ })}
+ />
+
+
+ {/* price ranges */}
+
+
+
+ {/* popular brands */}
+
+
popular Brands
+
+
+ {popularbrands.map(brand => (
+
+ toggleFilterSelection('brands', brand.name)}
+ />
+ {brand.name}
+
+ ))}
+
+
+
+
+
Popular Tag
+
+
+ {mostTags.map(tag => (
+ toggleFilterSelection('tags', tag.name)}
+ className={`
+ m-1 px-3 py-1 rounded
+ ${filters.tags.includes(tag.name)
+ ? 'bg-[#0FABCA] text-white'
+ : 'bg-gray-200'
+ }
+ `}
+ >
+ {tag.name}
+
+ ))}
+
+
+
+
+ {/* right side */}
+
+
+ {/* topbar */}
+
+
+ updateFilter('search', e.target.value)}
+ className='border border-[#e5eaf2] py-2 pl-4 pr-[65px] outline-none w-full rounded-md'/>
+
+
+
+
+
+
Sort by:
+
+
+ {/* Input field with search functionality */}
+
setSearch(e.target.value)}
+ onFocus={() => setIsOpen(true)}
+ className={`w-full border border-gray-300 rounded-md px-3 py-2 focus:outline-none`}
+ />
+
+
+
+ {/* Dropdown menu */}
+ {isOpen && (
+
+
+ {filteredItems.map(item => (
+
toggleSelection(item)}
+ className="cursor-pointer px-3 py-2 flex items-center hover:bg-gray-200"
+ >
+
+ {item.name}
+
+ ))}
+
+ {
+ filteredItems?.length === 0 && (
+
No search found!
+ )
+ }
+
+
+ )}
+
+
+
+
+
+ {
+ allProducts?.map((product)=> (
+
+
+ {/* product image */}
+
+
+
+ {/* action buttons */}
+
+
+
+
setWishlistVisible(true)}
+ onMouseOut={() => setWishlistVisible(false)}
+ className='relative w-max group-hover:translate-y-0 translate-y-[50px] transition-all opacity-0 group-hover:opacity-100 duration-300'>
+
+
+
+
+ {/* tooltip */}
+
+ Wishlist
+
+ {/* arrow */}
+
+
+
+
+
setCompareVisible(true)}
+ onMouseOut={() => setCompareVisible(false)}
+ className='relative w-max group-hover:translate-y-0 transition-all duration-500 opacity-0 group-hover:opacity-100 translate-y-[80px]'>
+
+
+
+
+ {/* tooltip */}
+
+ Compare
+
+ {/* arrow */}
+
+
+
+
+
setQuickViewVisible(true)}
+ onMouseOut={() => setQuickViewVisible(false)}
+ className='relative w-max group-hover:translate-y-0 transition-all duration-700 opacity-0 group-hover:opacity-100 translate-y-[110px]'>
+
+
+
+
+ {/* tooltip */}
+
+ Quick View
+
+ {/* arrow */}
+
+
+
+
+
+
+
+ {/* product details */}
+
+
+ {/* review area */}
+
+
+ {[...Array(5)].map((_, index) => {
+ const starRating = index + 1;
+ return (
+ setRating(starRating)}
+ />
+ );
+ })}
+
+
({product.rating})
+
+
+
{product?.name}
+
${product?.price}
+
+
+
+ ))
+ }
+
+
+ {
+ !allProducts?.length && (
+ No product found!
+ )
+ }
+
+
+ );
+};
+
+export default ProductFilterExample1;
diff --git a/src/Components/Overview/SidebarContent/Blocks/EmptyPages/Empty.jsx b/src/Components/Overview/SidebarContent/Blocks/EmptyPages/Empty.jsx
index 587c22d..2b9be95 100644
--- a/src/Components/Overview/SidebarContent/Blocks/EmptyPages/Empty.jsx
+++ b/src/Components/Overview/SidebarContent/Blocks/EmptyPages/Empty.jsx
@@ -630,7 +630,7 @@ export default EmptyPage;
}
-
+
diff --git a/src/Components/Overview/SidebarContent/Blocks/Randoms/ResponsiveSearchbar.jsx b/src/Components/Overview/SidebarContent/Blocks/Randoms/ResponsiveSearchbar.jsx
index c9097ca..0f2d5d9 100644
--- a/src/Components/Overview/SidebarContent/Blocks/Randoms/ResponsiveSearchbar.jsx
+++ b/src/Components/Overview/SidebarContent/Blocks/Randoms/ResponsiveSearchbar.jsx
@@ -992,7 +992,7 @@ export default ResponsiveSearchbar;
}
-
+
diff --git a/src/Components/Overview/SidebarContent/Content/Data Display/Timeline.jsx b/src/Components/Overview/SidebarContent/Content/Data Display/Timeline.jsx
index 19359f1..8456592 100644
--- a/src/Components/Overview/SidebarContent/Content/Data Display/Timeline.jsx
+++ b/src/Components/Overview/SidebarContent/Content/Data Display/Timeline.jsx
@@ -418,8 +418,8 @@ export default Timeline;
diff --git a/src/Components/Overview/SidebarContent/Content/ECommerce/AdsCard.jsx b/src/Components/Overview/SidebarContent/Content/ECommerce/AdsCard.jsx
new file mode 100644
index 0000000..33afea8
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Content/ECommerce/AdsCard.jsx
@@ -0,0 +1,633 @@
+import React, { useState } from 'react';
+
+// components
+import OverviewFooter from '../../../../../Shared/OverviewFooter';
+import ContentHeader from '../../../../../Shared/ContentHeader';
+
+// contents for scrollspy
+import { useScrollSpy } from '../../../../../CustomHooks/useScrollSpy';
+
+// react helmet
+import { Helmet } from 'react-helmet';
+
+// showing the code
+import Showcode from '../../../../../Shared/ShowCode';
+import {BsArrowRight} from "react-icons/bs";
+import {MdKeyboardArrowRight} from "react-icons/md";
+import {HiArrowRight} from "react-icons/hi";
+
+// sidebar contents
+import {adsCardContents} from "../../../../../Utils/ContentsConfig/ECommerceContents.js";
+
+import {useToggleCardView} from "../../../../../CustomHooks/ButtonToggle.js";
+
+const AdsCard = () => {
+ // const [contentActiveTab, setContentActiveTab] = useState(0);
+ const sectionIds = adsCardContents.map((item) => item.href.slice(1));
+ const activeSection = useScrollSpy(sectionIds);
+
+ // toggle actions
+ const toggleCardView = useToggleCardView();
+
+ const[adsCard1Preview, setAdsCard1Preview] = useState(true);
+ const[adsCard1Code, setAdsCard1Code] = useState(false);
+
+ const[adsCard2Preview, setAdsCard2Preview] = useState(true);
+ const[adsCard2Code, setAdsCard2Code] = useState(false);
+
+ const[adsCard3Preview, setAdsCard3Preview] = useState(true);
+ const[adsCard3Code, setAdsCard3Code] = useState(false);
+
+ const[adsCard4Preview, setAdsCard4Preview] = useState(true);
+ const[adsCard4Code, setAdsCard4Code] = useState(false);
+
+ const[adsCard5Preview, setAdsCard5Preview] = useState(true);
+ const[adsCard5Code, setAdsCard5Code] = useState(false);
+
+ const[adsCard6Preview, setAdsCard6Preview] = useState(true);
+ const[adsCard6Code, setAdsCard6Code] = useState(false);
+
+ return (
+ <>
+
+
+
+
+
+ E-commerce ad cards highlight products with an image, price, discount, and a "Buy Now" button for easy shopping.
+
+
+
+
+
+
toggleCardView(setAdsCard1Preview, setAdsCard1Code, true)}
+ >
+ Preview
+
+
toggleCardView(setAdsCard1Preview, setAdsCard1Code, false)}
+ >
+ Code
+
+
+ {adsCard1Preview && (
+
+
+
+
Xiaomi True Wireless Earbuds
+
Escape the noise, Itโs time to hear the magic with Xiaomi Earbuds.
+
+
+ Shop now
+
+
+
+
+ )}
+
+ {adsCard1Code && (
+
+ )}
+
+
+
+
+
+
+
+ E-commerce ad cards highlight products with an image, price, discount, and a "Buy Now" button for easy shopping.
+
+
+
+
+
+
toggleCardView(setAdsCard2Preview, setAdsCard2Code, true)}
+ >
+ Preview
+
+
toggleCardView(setAdsCard2Preview, setAdsCard2Code, false)}
+ >
+ Code
+
+
+ {adsCard2Preview && (
+
+
+
+
INTRODUCING
+
New Apple Homepod Mini
+
Jam-packed with innovation, HomePod mini delivers unexpectedly.
+
+ Shop now
+
+
+
+
+
+
+
+
+ )}
+
+ {adsCard2Code && (
+
+ )}
+
+
+
+
+
+
+
+ E-commerce ad cards highlight products with an image, price, discount, and a "Buy Now" button for easy shopping.
+
+
+
+
+
+
toggleCardView(setAdsCard3Preview, setAdsCard3Code, true)}
+ >
+ Preview
+
+
toggleCardView(setAdsCard3Preview, setAdsCard3Code, false)}
+ >
+ Code
+
+
+ {adsCard3Preview && (
+
+
+
+ {/* offer details */}
+
+
Hot Deals!
+
Fruit & Vegetables
+
+
+
+
+ {/* action button */}
+
View Offer
+
+
+ )}
+
+ {adsCard3Code && (
+
+ )}
+
+
+
+
+
+
+
+ E-commerce ad cards highlight products with an image, price, discount, and a "Buy Now" button for easy shopping.
+
+
+
+
+
+
toggleCardView(setAdsCard4Preview, setAdsCard4Code, true)}
+ >
+ Preview
+
+
toggleCardView(setAdsCard4Preview, setAdsCard4Code, false)}
+ >
+ Code
+
+
+ {adsCard4Preview && (
+
+
+
+
Fresh & 100% Organic
+
farmer's market
+
+
Shop Now
+
+
+
+
+
+ )}
+
+ {adsCard4Code && (
+
+ )}
+
+
+
+
+
+
+
+ E-commerce ad cards highlight products with an image, price, discount, and a "Buy Now" button for easy shopping.
+
+
+
+
+
+
toggleCardView(setAdsCard5Preview, setAdsCard5Code, true)}
+ >
+ Preview
+
+
toggleCardView(setAdsCard5Preview, setAdsCard5Code, false)}
+ >
+ Code
+
+
+ {adsCard5Preview && (
+
+
+
+
+
+
+
Today Special
+
Fruits Juice
+ Series
+
+
+ Shop Now
+
+
+
+
+
+
+ )}
+
+ {adsCard5Code && (
+
+ )}
+
+
+
+
+
+
+
+ E-commerce ad cards highlight products with an image, price, discount, and a "Buy Now" button for easy shopping.
+
+
+
+
+
+
toggleCardView(setAdsCard6Preview, setAdsCard6Code, true)}
+ >
+ Preview
+
+
toggleCardView(setAdsCard6Preview, setAdsCard6Code, false)}
+ >
+ Code
+
+
+ {adsCard6Preview && (
+
+
+
+ {/* coupon */}
+
29% OFF
+
+ {/* offer details */}
+
+
Summer Sales
+
New Google Pixel 6 Pro
+
+
+ Shop Now
+
+
+
+
+ {/* product image */}
+
+
+
+
+ )}
+
+ {adsCard6Code && (
+
+ )}
+
+
+
+
+
+
+
+
+ E-Commerce - Ads Card
+
+ >
+ );
+};
+
+export default AdsCard;
diff --git a/src/Components/Overview/SidebarContent/Content/ECommerce/ProductCard.jsx b/src/Components/Overview/SidebarContent/Content/ECommerce/ProductCard.jsx
new file mode 100644
index 0000000..2158581
--- /dev/null
+++ b/src/Components/Overview/SidebarContent/Content/ECommerce/ProductCard.jsx
@@ -0,0 +1,1778 @@
+import React, {useState} from "react";
+
+// react helmet
+import {Helmet} from "react-helmet";
+
+// components
+import ContentHeader from "../../../../../Shared/ContentHeader";
+import Showcode from "../../../../../Shared/ShowCode";
+import OverviewFooter from "../../../../../Shared/OverviewFooter";
+
+// contents for scrollspy
+import {useScrollSpy} from '../../../../../CustomHooks/useScrollSpy';
+import {productCardsContents} from "../../../../../Utils/ContentsConfig/ECommerceContents.js";
+
+// icons
+import {FaPlus} from "react-icons/fa6";
+import {FaHeart, FaRegHeart, FaStar} from "react-icons/fa";
+import {RiHeartAddLine, RiHeartFill} from "react-icons/ri";
+import {FiArrowUpRight, FiMinus, FiPlus} from "react-icons/fi";
+import {IoBagHandleOutline, IoCartOutline, IoEyeOutline, IoGift} from "react-icons/io5";
+import {IoIosHeart, IoMdHeartEmpty} from "react-icons/io";
+import {MdLocalShipping} from "react-icons/md";
+import {HiArrowsUpDown} from "react-icons/hi2";
+
+import {useToggleCardView} from "../../../../../CustomHooks/ButtonToggle.js";
+
+const ProductCard = () => {
+ const sectionIds = productCardsContents.map(item => item.href.slice(1));
+ const activeSection = useScrollSpy(sectionIds);
+
+ // backgroundPreview
+ const [basicDialogPreview, setBasicDialogPreview] = useState(true);
+ const [basicDialogCode, setBasicDialogCode] = useState(false);
+
+ const handleBasicDialogPreview = () => {
+ setBasicDialogPreview(true);
+ setBasicDialogCode(false);
+ };
+
+ const handleBasicDialogCode = () => {
+ setBasicDialogCode(true);
+ setBasicDialogPreview(false);
+ };
+
+ // toggle actions
+ const toggleCardView = useToggleCardView();
+
+ const [productCard1Preview, setProductCard1Preview] = useState(true);
+ const [productCard1Code, setProductCard1Code] = useState(false);
+
+ const [productCard2Preview, setProductCard2Preview] = useState(true);
+ const [productCard2Code, setProductCard2Code] = useState(false);
+
+ const [productCard3Preview, setProductCard3Preview] = useState(true);
+ const [productCard3Code, setProductCard3Code] = useState(false);
+
+ const [productCard4Preview, setProductCard4Preview] = useState(true);
+ const [productCard4Code, setProductCard4Code] = useState(false);
+
+ const [productCard5Preview, setProductCard5Preview] = useState(true);
+ const [productCard5Code, setProductCard5Code] = useState(false);
+
+ const [productCard6Preview, setProductCard6Preview] = useState(true);
+ const [productCard6Code, setProductCard6Code] = useState(false);
+
+ const [productCard7Preview, setProductCard7Preview] = useState(true);
+ const [productCard7Code, setProductCard7Code] = useState(false);
+
+ const [productCard8Preview, setProductCard8Preview] = useState(true);
+ const [productCard8Code, setProductCard8Code] = useState(false);
+
+ const [productCard9Preview, setProductCard9Preview] = useState(true);
+ const [productCard9Code, setProductCard9Code] = useState(false);
+
+ // functionality actions
+ const [rating, setRating] = useState(5);
+ const [isFavorite, setIsFavorite] = useState(false);
+ const [count, setCount] = useState(0);
+
+ const [wishlistVisible, setWishlistVisible] = useState(false);
+ const [compareVisible, setCompareVisible] = useState(false);
+ const [quickViewVisible, setQuickViewVisible] = useState(false);
+
+ const [productCardHover, setProductCardHover] = useState(false);
+
+ const handleIncrement = () => {
+ setCount(prevValue => prevValue + 1);
+ }
+
+ const handleDecrement = () => {
+ setCount(prevValue => prevValue - 1);
+ }
+
+ const handleInputValueChange = (e) => {
+ setCount(Number(e.target.value));
+ }
+
+ return (
+ <>
+
+
+ E-Commerce - Product Card
+
+ >
+ );
+};
+
+export default ProductCard;
diff --git a/src/Components/Overview/SidebarContent/Content/Feedback/Notification.jsx b/src/Components/Overview/SidebarContent/Content/Feedback/Notification.jsx
index 8dde284..6d274b9 100644
--- a/src/Components/Overview/SidebarContent/Content/Feedback/Notification.jsx
+++ b/src/Components/Overview/SidebarContent/Content/Feedback/Notification.jsx
@@ -666,7 +666,7 @@ export default Notification;
@@ -682,7 +682,7 @@ export default Notification;
@@ -842,7 +842,7 @@ export default Notification;
diff --git a/src/Components/Overview/SidebarContent/Content/Randoms/Code.jsx b/src/Components/Overview/SidebarContent/Content/Randoms/Code.jsx
index 0bd4819..0f2ccba 100644
--- a/src/Components/Overview/SidebarContent/Content/Randoms/Code.jsx
+++ b/src/Components/Overview/SidebarContent/Content/Randoms/Code.jsx
@@ -89,8 +89,8 @@ const Code = () => {
diff --git a/src/Pages/Blocks/E-Commerce/CheckoutPage.jsx b/src/Pages/Blocks/E-Commerce/CheckoutPage.jsx
new file mode 100644
index 0000000..d50d93a
--- /dev/null
+++ b/src/Pages/Blocks/E-Commerce/CheckoutPage.jsx
@@ -0,0 +1,28 @@
+
+// components
+import Navbar from "../../../Components/Home/Navbar";
+import Sidebar from "../../../Components/Overview/Sidebar";
+import MobileNavbar from "../../../Components/Home/MobileNavbar.jsx";
+import MobileSidebar from "../../../Components/Overview/Sidebar/MobileSidebar.jsx";
+import CheckoutPages from "../../../Components/Overview/SidebarContent/Blocks/E-Commerce/CheckoutPages/Index.jsx";
+
+const CheckoutPage = () => {
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default CheckoutPage;
diff --git a/src/Pages/Blocks/E-Commerce/OfferGridPage.jsx b/src/Pages/Blocks/E-Commerce/OfferGridPage.jsx
new file mode 100644
index 0000000..2647088
--- /dev/null
+++ b/src/Pages/Blocks/E-Commerce/OfferGridPage.jsx
@@ -0,0 +1,28 @@
+
+// components
+import Navbar from "../../../Components/Home/Navbar";
+import Sidebar from "../../../Components/Overview/Sidebar";
+import MobileNavbar from "../../../Components/Home/MobileNavbar.jsx";
+import MobileSidebar from "../../../Components/Overview/Sidebar/MobileSidebar.jsx";
+import OfferGrid from "../../../Components/Overview/SidebarContent/Blocks/E-Commerce/OfferGrid.jsx";
+
+const OfferGridPage = () => {
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default OfferGridPage;
diff --git a/src/Pages/Blocks/E-Commerce/ProductDetailsPages/Index.jsx b/src/Pages/Blocks/E-Commerce/ProductDetailsPages/Index.jsx
new file mode 100644
index 0000000..f005881
--- /dev/null
+++ b/src/Pages/Blocks/E-Commerce/ProductDetailsPages/Index.jsx
@@ -0,0 +1,27 @@
+// components
+import Navbar from "../../../../Components/Home/Navbar";
+import Sidebar from "../../../../Components/Overview/Sidebar";
+import MobileNavbar from "../../../../Components/Home/MobileNavbar.jsx";
+import MobileSidebar from "../../../../Components/Overview/Sidebar/MobileSidebar.jsx";
+import ProductDetails from "../../../../Components/Overview/SidebarContent/Blocks/E-Commerce/ProductDetailsComponents/Index.jsx";
+
+const Index = () => {
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default Index;
diff --git a/src/Pages/Blocks/E-Commerce/ProductFilterPage.jsx b/src/Pages/Blocks/E-Commerce/ProductFilterPage.jsx
new file mode 100644
index 0000000..495925b
--- /dev/null
+++ b/src/Pages/Blocks/E-Commerce/ProductFilterPage.jsx
@@ -0,0 +1,28 @@
+
+// components
+import Navbar from "../../../Components/Home/Navbar";
+import Sidebar from "../../../Components/Overview/Sidebar";
+import MobileNavbar from "../../../Components/Home/MobileNavbar.jsx";
+import MobileSidebar from "../../../Components/Overview/Sidebar/MobileSidebar.jsx";
+import ProductFilter from "../../../Components/Overview/SidebarContent/Blocks/E-Commerce/ProductFilterComponent/Index.jsx";
+
+const ProductFilterPage = () => {
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default ProductFilterPage;
diff --git a/src/Pages/Components/ECommerce/AdsCardPage.jsx b/src/Pages/Components/ECommerce/AdsCardPage.jsx
new file mode 100644
index 0000000..c5669e4
--- /dev/null
+++ b/src/Pages/Components/ECommerce/AdsCardPage.jsx
@@ -0,0 +1,29 @@
+import React from "react";
+
+// components
+import Navbar from "../../../Components/Home/Navbar";
+import Sidebar from "../../../Components/Overview/Sidebar";
+import MobileNavbar from "../../../Components/Home/MobileNavbar.jsx";
+import MobileSidebar from "../../../Components/Overview/Sidebar/MobileSidebar.jsx";
+import AdsCard from "../../../Components/Overview/SidebarContent/Content/ECommerce/AdsCard.jsx";
+
+const AdsCardPage = () => {
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default AdsCardPage;
diff --git a/src/Pages/Components/ECommerce/ProductCardPage.jsx b/src/Pages/Components/ECommerce/ProductCardPage.jsx
new file mode 100644
index 0000000..6b810df
--- /dev/null
+++ b/src/Pages/Components/ECommerce/ProductCardPage.jsx
@@ -0,0 +1,29 @@
+import React from "react";
+
+// components
+import Navbar from "../../../Components/Home/Navbar";
+import Sidebar from "../../../Components/Overview/Sidebar";
+import MobileNavbar from "../../../Components/Home/MobileNavbar.jsx";
+import MobileSidebar from "../../../Components/Overview/Sidebar/MobileSidebar.jsx";
+import ProductCard from "../../../Components/Overview/SidebarContent/Content/ECommerce/ProductCard.jsx";
+
+const ProductCardPage = () => {
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default ProductCardPage;
diff --git a/src/Pages/HomePage.jsx b/src/Pages/HomePage.jsx
index eac3ace..a7fd574 100644
--- a/src/Pages/HomePage.jsx
+++ b/src/Pages/HomePage.jsx
@@ -10,17 +10,19 @@ import TemplatesSlider from "../Components/Home/TemplatesSlider.jsx";
import Sponsor from "../Components/Home/Sponsor.jsx";
import Faq from "../Components/Home/Faq.jsx";
import NewsBoard from "../Components/Home/NewsBoard.jsx";
+import ZenUITools from "../Components/Home/ZenUITools.jsx";
const HomePage = () => {
return (
<>
-
+ {/*
*/}
+
diff --git a/src/Shared/Demo.jsx b/src/Shared/Demo.jsx
index 6004856..79d39ec 100644
--- a/src/Shared/Demo.jsx
+++ b/src/Shared/Demo.jsx
@@ -1,128 +1,214 @@
-import React, {useState} from "react";
+import React from "react";
-const SmartPagination = () => {
- const [currentPagePagination, setCurrentPagePagination] = useState(1);
+// react icons
+import {AiOutlinePlus} from "react-icons/ai";
- const totalPageNumber = 50;
-
- const handlePreviousPagination = () => {
- if (currentPagePagination > 1) {
- setCurrentPagePagination((prev) => prev - 1);
- }
- };
-
- const handleNextPagination = () => {
- if (currentPagePagination < totalPageNumber) {
- setCurrentPagePagination((prev) => prev + 1);
- }
- };
-
- const handlePageClick = (pageNumber) => {
- setCurrentPagePagination(pageNumber);
- };
-
- const renderPageNumbersForPagination = () => {
- const pageNumbers = [];
- const startPage = Math.max(2, currentPagePagination - 1);
- const endPage = Math.min(
- totalPageNumber - 1,
- currentPagePagination + 1
- );
-
- pageNumbers.push(
-
- );
-
- if (startPage > 2) {
- pageNumbers.push(
-
- ...
-
- );
- }
-
- for (let i = startPage; i <= endPage; i++) {
- pageNumbers.push(
-
- );
- }
-
- if (endPage < totalPageNumber - 1) {
- pageNumbers.push(
-
- ...
-
- );
- }
-
- pageNumbers.push(
-
- );
-
- return pageNumbers;
- };
-
+const CheckoutPage = () => {
return (
-
-
-
- Previous
-
-
- {renderPageNumbersForPagination()}
+
+
+ {/* Left Column - Order Summary */}
+
+
+ {/* order summery */}
+
+
Your order
+
+
+
+
+
+
1
+
+
+
Nike Air Zoom Pegasus 39
+
+
Size: XL
+
Color: Blue
+
+
+
+
$28.00
+
+
+
+
+
+
3
+
+
+
Nike Air Zoom Pegasus 39
+
+
Size: XL
+
Color: Blue
+
+
+
+
$28.00
+
+
+
+
Discount Code
+
+
+
+
Apply
+
+
+
+
+
+ Subtotal
+ $56.00
+
+
+ Shipping Cost
+ $8.00
+
+
+ Discount (10%)
+ -$13.00
+
+
+ Total
+ $51.00
+
+
+
-
- Next
-
+ {/* Right Column - Checkout Form */}
+
);
};
-export default SmartPagination;
-
-// page button
-const PageButton = ({ pageNumber, isActive, onClick }) => (
-
onClick(pageNumber)}
- className={`px-4 py-2 rounded-lg font-medium transition-colors duration-300 ${
- isActive
- ? "bg-blue-600 text-white shadow-lg"
- : "bg-gray-100 text-gray-600 hover:bg-blue-500 hover:text-white"
- }`}
- >
- {pageNumber}
-
-);
+export default CheckoutPage;
diff --git a/src/ShortcutGenerator/Generator.jsx b/src/ShortcutGenerator/Generator.jsx
index a76c491..c1f4314 100644
--- a/src/ShortcutGenerator/Generator.jsx
+++ b/src/ShortcutGenerator/Generator.jsx
@@ -167,13 +167,14 @@ document.removeEventListener('keydown', ${functionName});
+ className='code_generate_btn bg-gradient-to-r from-[#0FABCA] hover:from-[#0FABCA]/80 to-[#CD00F1] hover:to-[#CD00F1]/80 flex items-center gap-[6px] text-white py-2.5 px-6 rounded-md'>
+
{isGenerating ? 'Generating...' : 'Generate Code'}
setCheatsheetOpen(true)}
- className='flex items-center gap-[8px] text-[1rem] py-2.5 px-4 hover:bg-gray-50 border border-gray-300 rounded-md text-gray-600'>
+ onClick={() => setCheatsheetOpen(true)}
+ className='flex items-center gap-[8px] text-[1rem] py-[10.5px] px-4 hover:bg-gray-50 border border-gray-300 rounded-md text-gray-600'>
Valid Shortcut Cheatsheet
diff --git a/src/Utils/ContentsConfig/ECommerceContents.js b/src/Utils/ContentsConfig/ECommerceContents.js
new file mode 100644
index 0000000..b0c8787
--- /dev/null
+++ b/src/Utils/ContentsConfig/ECommerceContents.js
@@ -0,0 +1,82 @@
+// productCardsContents
+export const productCardsContents = [
+ {
+ id: 1,
+ title: 'clothing product card',
+ href: '#clothing_product_card',
+ },
+ {
+ id: 2,
+ title: 'juice product card',
+ href: '#juice_product_card',
+ },
+ {
+ id: 3,
+ title: 'Grocery product card',
+ href: '#grocery_product_card',
+ },
+ {
+ id: 4,
+ title: 'digital product card',
+ href: '#digital_product_card',
+ },
+ {
+ id: 5,
+ title: 'book product card',
+ href: '#book_product_card',
+ },
+ {
+ id: 6,
+ title: 'gadget product card 1',
+ href: '#gadget_product_card_1',
+ },
+ {
+ id: 7,
+ title: 'gadget product card 2',
+ href: '#gadget_product_card_2',
+ },
+ {
+ id: 8,
+ title: 'product list card 1',
+ href: '#product_list_card_1',
+ },
+ {
+ id: 9,
+ title: 'product list card 2',
+ href: '#product_list_card_2',
+ },
+];
+
+// adsCardContents
+export const adsCardContents = [
+ {
+ id: 1,
+ title: 'ads card 1',
+ href: '#ads_card_1',
+ },
+ {
+ id: 2,
+ title: 'ads card 2',
+ href: '#ads_card_2',
+ },
+ {
+ id: 3,
+ title: 'ads card 3',
+ href: '#ads_card_3',
+ },
+ {
+ id: 4,
+ title: 'ads card 4',
+ href: '#ads_card_4',
+ },
+ {
+ id: 5,
+ title: 'ads card 5',
+ href: '#ads_card_5',
+ },
+ {
+ id: 6,
+ title: 'ads card 6',
+ href: '#ads_card_6',
+ },
+];
diff --git a/src/Utils/SearchData.js b/src/Utils/SearchData.js
index 51b7011..ea84654 100644
--- a/src/Utils/SearchData.js
+++ b/src/Utils/SearchData.js
@@ -292,6 +292,18 @@ export const componentSearchData = [
description: 'Chronological event or process visualization',
url: '/components/timeline',
tags: ['ui', 'display', 'chronology']
+ },
+ {
+ title: 'Product Card',
+ description: 'E-commerce product cards with animation and basic functionality.',
+ url: '/components/product-card',
+ tags: ['e-commerce', 'product', 'card', 'animation']
+ },
+ {
+ title: 'Ads Card',
+ description: 'Ads cards for showing ads in e-commerce website.',
+ url: '/components/ads-card',
+ tags: ['e-commerce', 'ads', 'card', 'animation']
}
];
@@ -361,5 +373,23 @@ export const blocksSearchData = [
description: 'Flexible side navigation that adapts to screen dimensions',
url: '/blocks/responsive-sidebar',
tags: ['navigation', 'layout', 'responsive']
+ },
+ {
+ title: 'Checkout Page',
+ description: 'Checkout page with selected products and payment options.',
+ url: '/blocks/checkout-page',
+ tags: ['e-commerce', 'checkout', 'payment']
+ },
+ {
+ title: 'Product Details Page',
+ description: 'Product details page with functionality and product view carousel.',
+ url: '/blocks/product-details-page',
+ tags: ['e-commerce', 'product details page', 'product', 'details']
+ },
+ {
+ title: 'Offer Grid',
+ description: 'Grid layouts for showing e-commerce product offers.',
+ url: '/blocks/offer-grid',
+ tags: ['e-commerce', 'offer', 'product', 'grid layout']
}
];
\ No newline at end of file
diff --git a/src/index.css b/src/index.css
index c3801d4..3c565c2 100644
--- a/src/index.css
+++ b/src/index.css
@@ -200,7 +200,7 @@ aside ul a:not(.getStarted a) {
text-transform: capitalize;
}
-aside ul a:not(.getStarted a):hover {
+aside ul a:not(.getStarted a, .sectionHeader):hover {
background-color: #e5eaf2;
font-weight: 500;
border-left: 1px solid #9caebc;
@@ -423,4 +423,33 @@ input[type="number"] {
.scrollbar::-webkit-scrollbar {
height: 4px;
+}
+
+@keyframes bounce-custom {
+ 0%, 100% {
+ transform: translateX(0);
+ }
+ 25% {
+ transform: translateX(-5px);
+ }
+ 75% {
+ transform: translateX(5px);
+ }
+}
+
+.animate-bounce-custom {
+ animation: bounce-custom 0.6s ease-in-out 2;
+}
+
+@keyframes beat {
+ 0%, 100% {
+ transform: scale(1);
+ }
+ 50% {
+ transform: scale(1.1);
+ }
+}
+
+.heart-beat-animation {
+ animation: beat 1.2s infinite;
}
\ No newline at end of file