GNXSOFT.COM

This commit is contained in:
Iliyan Angelov
2025-09-26 00:15:37 +03:00
commit fe26b7cca4
16323 changed files with 2011881 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
"use client";
import dynamic from "next/dynamic";
const SmoothScroll = dynamic(() => import("../../shared/layout/animations/SmoothScroll"), {
ssr: false,
});
const ParallaxImage = dynamic(() => import("../../shared/layout/animations/ParallaxImage"), {
ssr: false,
});
const FadeImageBottom = dynamic(() => import("../../shared/layout/animations/FadeImageBottom"), {
ssr: false,
});
const ButtonHoverAnimation = dynamic(
() => import("../../shared/layout/animations/ButtonHoverAnimation"),
{
ssr: false,
}
);
const VanillaTiltHover = dynamic(
() => import("../../shared/layout/animations/VanillaTiltHover"),
{
ssr: false,
}
);
const SplitTextAnimations = dynamic(
() => import("../../shared/layout/animations/SplitTextAnimations"),
{
ssr: false,
}
);
const ScrollToElement = dynamic(() => import("../../shared/layout/animations/ScrollToElement"), {
ssr: false,
});
const AppearDown = dynamic(() => import("../../shared/layout/animations/AppearDown"), {
ssr: false,
});
const FadeAnimations = dynamic(() => import("../../shared/layout/animations/FadeAnimations"), {
ssr: false,
});
const BlogInitAnimations = () => {
return (
<>
<SmoothScroll />
<ParallaxImage />
<FadeImageBottom />
<ButtonHoverAnimation />
<VanillaTiltHover />
<SplitTextAnimations />
<ScrollToElement />
<AppearDown />
<FadeAnimations />
</>
);
};
export default BlogInitAnimations;

View File

@@ -0,0 +1,68 @@
import Link from "next/link";
import PostFilterItems from "./post-filter/PostFilterItems";
const BlogItems = () => {
return (
<section className="fix-top pb-120 blog-m">
<div className="container">
<div className="row align-items-center vertical-column-gap">
<div className="col-12 col-lg-7">
<h2 className="mt-8 fw-7 text-secondary title-anim">Blog</h2>
</div>
<div className="col-12 col-lg-5">
<form action="#" method="post" autoComplete="off">
<div className="search-form">
<input
type="search"
name="search-post"
id="searchPost"
placeholder="Search"
required
/>
<button
type="submit"
aria-label="search post"
title="search post"
>
<i className="fa-solid fa-magnifying-glass"></i>
</button>
</div>
</form>
</div>
</div>
<PostFilterItems />
<div className="row mt-60">
<div className="col-12">
<div className="section__cta">
<ul className="pagination">
<li>
<button>
<i className="fa-solid fa-angle-left"></i>
</button>
</li>
<li>
<Link href="blog">1</Link>
</li>
<li>
<Link href="blog" className="active">
2
</Link>
</li>
<li>
<Link href="blog">3</Link>
</li>
<li>
<button>
<i className="fa-solid fa-angle-right"></i>
</button>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
);
};
export default BlogItems;

View File

@@ -0,0 +1,67 @@
"use client";
import { useState, useEffect, useRef } from "react";
const BlogScrollProgressButton = () => {
useEffect(() => {
window.scroll(0, 0);
}, []);
const [scrollProgress, setScrollProgress] = useState(0);
const [isActive, setIsActive] = useState(false);
const scrollRef = useRef<HTMLButtonElement>(null);
const handleScroll = () => {
const totalHeight = document.body.scrollHeight - window.innerHeight;
const progress = (window.scrollY / totalHeight) * 100;
setScrollProgress(progress);
setIsActive(window.scrollY > 50);
};
const handleProgressClick = () => {
window.scrollTo({
top: 0,
behavior: "smooth",
});
};
useEffect(() => {
window.scrollTo(0, 0);
window.addEventListener("scroll", handleScroll);
handleScroll();
return () => {
window.removeEventListener("scroll", handleScroll);
};
}, []);
return (
<button
ref={scrollRef}
className={`progress-wrap ${isActive ? " active-progress" : " "}`}
onClick={handleProgressClick}
title="Go To Top"
>
<span></span>
<svg
className="progress-circle svg-content"
width="100%"
height="100%"
viewBox="-1 -1 102 102"
>
<path
d="M50,1 a49,49 0 0,1 0,98 a49,49 0 0,1 0,-98"
stroke="#3887FE"
strokeWidth="4"
fill="none"
style={{
strokeDasharray: "308.66px",
strokeDashoffset: `${308.66 - scrollProgress * 3.0866}px`,
}}
/>
</svg>
</button>
);
};
export default BlogScrollProgressButton;

View File

@@ -0,0 +1,210 @@
import Image from "next/legacy/image";
import Link from "next/link";
import poster from "@/public/images/blog/blog-poster.png";
import info from "@/public/images/blog/blog-info.png";
const BlogSingle = () => {
return (
<section className="tp-post-details fix-top pb-120 fade-wrapper">
<div className="container">
<div className="row">
<div className="col-12">
<div className="tp-post-intro">
<h2 className="title-anim text-xxl fw-7 text-secondary mt-8">
Tackling data of annotation problems in healthcare
</h2>
<div className="mt-60 mb-24 d-flex align-items-center justify-content-between tppr">
<div className="d-flex align-items-center tp-post-tags-container mt-8">
<p className="text-xs">Scope:</p>
<div className="d-flex align-items-center tp-post-tags">
<Link href="blog">AI</Link>
<span></span>
<Link href="blog">Artificial Intelligence</Link>
<span></span>
<Link href="blog">Data Science</Link>
<span></span>
<Link href="blog">Machine Learning</Link>
</div>
</div>
<div className="tp-post-meta mt-8">
<p className="author text-xs text-tertiary">Denial Lio</p>
<span></span>
<p className="date text-xs text-tertiary">18 Dec 2022</p>
</div>
</div>
<div className="tp-post-poster fade-top">
<div className="parallax-image-wrap">
<div className="parallax-image-inner">
<Image
src={poster}
className="w-100 mh-300 parallax-image"
alt="Image"
/>
</div>
</div>
</div>
<div className="group mt-60">
<p className="cur-lg mb-24">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
nec tortor id erat faucibus tempor id eget turpis. Donec
lobortis et neque eget congue. Mauris laoreet orci ac dictum
interdum. Sed dapibus convallis arcu, a aliquam purus sodales
nec. Integer consequat et magna sit amet porta. Maecenas
consectetur eros sed risus porta convallis eget et massa.
Integer auctor convallis ligula, sit amet sollicitudin justo
tincidunt a. Sed tellus diam.
</p>
<p className="cur-lg mb-24 fw-6">
Bibendum tincidunt orci vel, sollicitudin bibendum ligula.
Pellentesque sollicitudin nulla felis, a ornare tellus
tristique ac. Proin ultricies a turpis sit amet lacinia. Ut
laoreet nunc leo, ac congue enim laoreet in. Aenean suscipit
arcu at ligula tempor porta.
</p>
<p className="cur-lg">
Quisque et fringilla lacus, quis luctus elit. Curabitur eu dui
mattis turpis commodo eleifend. Sed porta ornare nunc et
tristique. Curabitur vel eros a ante cursus lacinia. Nam nisl
leo, aliquet a placerat at, porttitor quis augue. Proin quis
aliquet libero. Pellentesque habitant morbi tristique senectus
et netus et malesuada fames ac turpis egestas. Vestibulum
varius a ipsum ornare blandit. Integer vitae eleifend risus,
id tincidunt elit. Integer tincidunt ipsum vitae sagittis
porta. Aenean ut facilisis dui. Praesent at ultricies purus.
Nam a arcu vel diam ullamcorper tincidunt. Curabitur
vestibulum commodo erat non laoreet. Proin nibh nibh,
scelerisque a nibh nec, scelerisque convallis leo. Nunc eget
elit nunc.
</p>
</div>
<div className="group-info mt-60">
<div className="row align-items-center vertical-column-gap">
<div className="col-12 col-lg-6">
<div className="fade-top">
<div className="parallax-image-wrap">
<div className="parallax-image-inner">
<Image
src={info}
className="w-100 mh-300 parallax-image"
alt="Image"
/>
</div>
</div>
</div>
</div>
<div className="col-12 col-lg-6">
<p className="cur-lg mb-24">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Donec nec tortor id erat faucibus tempor id eget turpis.
Donec lobortis et neque eget congue. Mauris laoreet orci
ac dictum interdum. Sed dapibus convallis arcu, a aliquam
purus sodales nec.
</p>
<p className="cur-lg">
Quisque et fringilla lacus, quis luctus elit. Curabitur eu
dui mattis turpis commodo eleifend. Sed porta ornare nunc
et tristique. Curabitur vel eros a ante cursus lacinia.
Nam nisl leo, aliquet a placerat at, porttitor quis augue.
Proin quis aliquet libero. Pellentesque habitant morbi
tristique senectus et netus et malesuada fames ac turpis
egestas. Vestibulum varius a ipsum ornare blandit.
</p>
</div>
</div>
</div>
<div className="group mt-60">
<h4 className="mt-8 fw-7 text-secondary title-anim mb-24">
The Hidden Markov Model&apos;s Limitations
</h4>
<p className="cur-lg mb-24">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
nec tortor id erat faucibus tempor id eget turpis. Donec
lobortis et neque eget congue. Mauris laoreet orci ac dictum
interdum. Sed dapibus convallis arcu, a aliquam purus sodales
nec.
</p>
<p className="cur-lg">
Quisque et fringilla lacus, quis luctus elit. Curabitur eu dui
mattis turpis commodo eleifend. Sed porta ornare nunc et
tristique. Curabitur vel eros a ante cursus lacinia. Nam nisl
leo, aliquet a placerat at, porttitor quis augue. Proin quis
aliquet libero. Pellentesque habitant morbi tristique senectus
et netus et malesuada fames ac turpis egestas. Vestibulum
varius a ipsum ornare blandit.
</p>
</div>
<div className="group mt-60">
<h4 className="mt-8 fw-7 text-secondary title-anim mb-24">
The Effect
</h4>
<p className="cur-lg mb-24">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
nec tortor id erat faucibus tempor id eget turpis. Donec
lobortis et neque eget congue. Mauris laoreet orci ac dictum
interdum. Sed dapibus convallis arcu, a aliquam purus sodales
nec.
</p>
<p className="cur-lg">
Quisque et fringilla lacus, quis luctus elit. Curabitur eu dui
mattis turpis commodo eleifend. Sed porta ornare nunc et
tristique. Curabitur vel eros a ante cursus lacinia. Nam nisl
leo, aliquet a placerat at, porttitor quis augue. Proin quis
aliquet libero. Pellentesque habitant morbi tristique senectus
et netus et malesuada fames ac turpis egestas. Vestibulum
varius a ipsum ornare blandit.
</p>
</div>
</div>
</div>
</div>
<div className="row mt-80">
<div className="col-12">
<div className="bd-social">
<p className="fw-5 text-uppercase">Share :</p>
<ul className=" social">
<li>
<Link
href="https://www.facebook.com/"
target="_blank"
aria-label="share us on facebook"
>
<i className="fa-brands fa-facebook-f"></i>
</Link>
</li>
<li>
<Link
href="https://www.twitter.com/"
target="_blank"
aria-label="share us on twitter"
>
<i className="fa-brands fa-twitter"></i>
</Link>
</li>
<li>
<Link
href="https://www.pinterest.com/"
target="_blank"
aria-label="share us on pinterest"
>
<i className="fa-brands fa-linkedin-in"></i>
</Link>
</li>
<li>
<Link
href="https://www.instagram.com/"
target="_blank"
aria-label="share us on instagram"
>
<i className="fa-brands fa-instagram"></i>
</Link>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
);
};
export default BlogSingle;

View File

@@ -0,0 +1,434 @@
"use client";
import Image from "next/legacy/image";
import Link from "next/link";
import { Swiper, SwiperSlide } from "swiper/react";
import { Autoplay } from "swiper/modules";
import "swiper/swiper-bundle.css";
import one from "@/public/images/blog/related-one.png";
import two from "@/public/images/blog/related-two.png";
import three from "@/public/images/blog/related-three.png";
import four from "@/public/images/blog/related-four.png";
const LatestPost = () => {
return (
<section className="tp-latest-post pt-120 pb-120 bg-quinary">
<div className="container">
<div className="row vertical-column-gap align-items-center">
<div className="col-12 col-lg-7">
<div className="tp-lp-title text-center text-lg-start">
<h2 className="mt-8 fw-7 text-secondary title-anim">
Related posts
</h2>
</div>
</div>
<div className="col-12 col-lg-5">
<div className="tp-lp-cta text-center text-lg-end">
<Link href="blog" className="btn-line text-uppercase">
See All Posts
</Link>
</div>
</div>
</div>
<div className="row">
<div className="col-12">
<div className="tp-lp-slider-wrapper mt-60">
<div className="tp-lp-slider-wrapper">
<Swiper
slidesPerView={"auto"}
spaceBetween={24}
slidesPerGroup={1}
freeMode={true}
speed={1200}
loop={true}
roundLengths={true}
modules={[Autoplay]}
autoplay={{
delay: 5000,
disableOnInteraction: false,
pauseOnMouseEnter: true,
}}
className="tp-lp-slider"
>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={one}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={two}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={three}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={four}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={one}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={two}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={three}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={four}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={one}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={two}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={three}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
<SwiperSlide>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link href="blog-single" className="w-100 overflow-hidden">
<Image
src={four}
width={400}
height={220}
className="w-100 mh-220"
alt="Image"
/>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
Denial Lio
</p>
<span></span>
<p className="date text-xs text-tertiary">
18 Dec 2022
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href="blog-single">
Tackling data of annotation problems in healthcare
</Link>
</h5>
</div>
</div>
</SwiperSlide>
</Swiper>
</div>
</div>
</div>
</div>
</div>
</section>
);
};
export default LatestPost;

View File

@@ -0,0 +1,44 @@
import { useState, useEffect } from "react";
import { BlogCategoryButtons } from "@/public/data/blog-category";
const PostFilterButtons = ({ handleClick, active }: any) => {
const [categories, setCategories] = useState(BlogCategoryButtons);
// TODO: Replace with API call to get blog categories
// useEffect(() => {
// const fetchCategories = async () => {
// try {
// const response = await blogCategoryAPI.getAll();
// if (response.success) {
// setCategories(response.data);
// }
// } catch (error) {
// console.error('Error fetching categories:', error);
// }
// };
// fetchCategories();
// }, []);
return (
<div className="row">
<div className="col-12">
<div className="post-filter__wrapper mt-80">
{categories.map((item) => {
return (
<button
aria-label="Filter Post"
key={item.id}
className={active === item.slug ? " active" : ""}
onClick={() => handleClick(item.slug)}
>
{item.title}
</button>
);
})}
</div>
</div>
</div>
);
};
export default PostFilterButtons;

View File

@@ -0,0 +1,161 @@
"use client";
import { useState, SetStateAction, useEffect } from "react";
import Image from "next/legacy/image";
import Link from "next/link";
import { AnimatePresence, motion } from "framer-motion";
import { getValidImageUrl, getValidImageAlt, FALLBACK_IMAGES } from "@/lib/imageUtils";
import PostFilterButtons from "./PostFilterButtons";
const PostFilterItems = () => {
const [active, setActive] = useState("all");
// Static blog posts data
const allPosts = [
{
id: 1,
title: "Enterprise Software Development Best Practices",
content: "Learn about the latest best practices in enterprise software development...",
slug: "enterprise-software-development-best-practices",
author_id: 1,
category_id: 1,
thumbnail: "/images/blog/one.png",
published: true,
category_title: "Development",
category_slug: "development",
author_name: "John Smith",
created_at: "2024-01-15T10:00:00Z",
updated_at: "2024-01-15T10:00:00Z"
},
{
id: 2,
title: "API Integration Strategies for Modern Enterprises",
content: "Discover effective strategies for API integration in enterprise environments...",
slug: "api-integration-strategies-modern-enterprises",
author_id: 1,
category_id: 2,
thumbnail: "/images/blog/two.png",
published: true,
category_title: "Integration",
category_slug: "integration",
author_name: "Jane Doe",
created_at: "2024-01-10T14:30:00Z",
updated_at: "2024-01-10T14:30:00Z"
},
{
id: 3,
title: "Cloud Migration: A Complete Guide",
content: "Everything you need to know about migrating your enterprise to the cloud...",
slug: "cloud-migration-complete-guide",
author_id: 1,
category_id: 3,
thumbnail: "/images/blog/three.png",
published: true,
category_title: "Cloud",
category_slug: "cloud",
author_name: "Mike Johnson",
created_at: "2024-01-05T09:15:00Z",
updated_at: "2024-01-05T09:15:00Z"
},
{
id: 4,
title: "Digital Transformation in Enterprise",
content: "How digital transformation is reshaping enterprise operations...",
slug: "digital-transformation-enterprise",
author_id: 1,
category_id: 1,
thumbnail: "/images/blog/four.png",
published: true,
category_title: "Development",
category_slug: "development",
author_name: "Sarah Wilson",
created_at: "2024-01-01T16:45:00Z",
updated_at: "2024-01-01T16:45:00Z"
}
];
const [displayData, setDisplayData] = useState(allPosts);
const handleCategoryClick = (category: SetStateAction<string>) => {
if (category === active) return;
setActive(category);
setDisplayData([]);
if (category === "all") {
setDisplayData(allPosts);
return;
}
const filteredData = allPosts.filter(
(item) => item.category_slug === category
);
setTimeout(() => {
setDisplayData(filteredData);
}, 600);
};
return (
<>
<PostFilterButtons active={active} handleClick={handleCategoryClick} />
<motion.div className="row mt-60 masonry-grid" layout>
<AnimatePresence>
{displayData.slice(0, 8).map((item) => {
return (
<motion.div
className="col-12 col-lg-6 grid-item-main"
key={item.id}
layout
initial={{ opacity: 0, scale: 0.6 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.6 }}
transition={{ duration: 0.6 }}
>
<div className="tp-lp-slider__single topy-tilt">
<div className="thumb mb-24">
<Link
href={`/blog/${item.slug}`}
className="w-100 overflow-hidden d-block"
>
<div className="parallax-image-wrap">
<div className="parallax-image-inner">
<Image
src={getValidImageUrl(item.thumbnail, FALLBACK_IMAGES.BLOG)}
className="w-100 mh-220 parallax-image"
alt={getValidImageAlt(item.title)}
width={400}
height={220}
/>
</div>
</div>
</Link>
</div>
<div className="content">
<div className="tp-lp-post__meta mb-24 mt-8">
<p className="author text-xs text-tertiary">
{item.author_name || 'Admin'}
</p>
<span></span>
<p className="date text-xs text-tertiary">
{new Date(item.created_at).toLocaleDateString('en-US', {
day: 'numeric',
month: 'short',
year: 'numeric'
})}
</p>
</div>
<h5 className="mt-8 fw-5 text-secondary">
<Link href={`/blog/${item.slug}`}>{item.title}</Link>
</h5>
</div>
</div>
</motion.div>
);
})}
</AnimatePresence>
</motion.div>
</>
);
};
export default PostFilterItems;