feat: add animation and adjust ui

This commit is contained in:
sabdayagra 2024-12-17 21:27:48 +07:00
parent 349128c335
commit 542c8515a0
19 changed files with 957 additions and 711 deletions

View File

@ -1,6 +1,5 @@
"use client"; "use client";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from "@/components/ui/pagination";
import { Checkbox } from "@/components/ui/checkbox"; import { Checkbox } from "@/components/ui/checkbox";
import { Icon } from "@iconify/react/dist/iconify.js"; import { Icon } from "@iconify/react/dist/iconify.js";
import { getListContent } from "@/service/landing/landing"; import { getListContent } from "@/service/landing/landing";
@ -8,6 +7,7 @@ import { formatDateToIndonesian } from "@/utils/globals";
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation"; import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation";
import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table"; import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table";
import LandingPagination from "@/components/landing-page/pagination"; import LandingPagination from "@/components/landing-page/pagination";
import { Reveal } from "@/components/landing-page/Reveal";
const columns: ColumnDef<any>[] = [ const columns: ColumnDef<any>[] = [
{ {
@ -110,6 +110,7 @@ const FilterPage = () => {
</div> </div>
{/* Left */} {/* Left */}
<div className="flex flex-col lg:flex-row gap-6 p-4"> <div className="flex flex-col lg:flex-row gap-6 p-4">
<Reveal>
{/* Sidebar Kiri */} {/* Sidebar Kiri */}
<div className="lg:w-1/4 w-full bg-white p-4 rounded-lg shadow-md"> <div className="lg:w-1/4 w-full bg-white p-4 rounded-lg shadow-md">
<h2 className="text-lg font-semibold mb-4">Filter</h2> <h2 className="text-lg font-semibold mb-4">Filter</h2>
@ -170,8 +171,10 @@ const FilterPage = () => {
</div> </div>
</div> </div>
</div> </div>
</Reveal>
{/* Konten Kanan */} {/* Konten Kanan */}
<Reveal>
<div className="flex-1"> <div className="flex-1">
<div className="flex flex-col items-end mb-4"> <div className="flex flex-col items-end mb-4">
<h2 className="text-lg font-semibold tetx-red-300">Urutkan berdasarkan</h2> <h2 className="text-lg font-semibold tetx-red-300">Urutkan berdasarkan</h2>
@ -216,6 +219,7 @@ const FilterPage = () => {
</div> </div>
<LandingPagination table={table} totalData={totalData} totalPage={totalPage} /> <LandingPagination table={table} totalData={totalData} totalPage={totalPage} />
</div> </div>
</Reveal>
</div> </div>
</div> </div>
); );

View File

@ -1,8 +1,11 @@
"use client";
import { Reveal } from "@/components/landing-page/Reveal";
import React from "react"; import React from "react";
const ContactForm = () => { const ContactForm = () => {
return ( return (
<div className="max-w-2xl mx-auto bg-white p-6"> <div className="max-w-2xl mx-auto bg-white p-6">
<Reveal>
{/* Header */} {/* Header */}
<div className="flex items-center justify-center mb-6"> <div className="flex items-center justify-center mb-6">
<img src="/assets/icons-contact.png" alt="contact" /> <img src="/assets/icons-contact.png" alt="contact" />
@ -49,6 +52,7 @@ const ContactForm = () => {
Kirim Kirim
</button> </button>
</form> </form>
</Reveal>
</div> </div>
); );
}; };

View File

@ -8,6 +8,7 @@ import { formatDateToIndonesian } from "@/utils/globals";
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation"; import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation";
import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table"; import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table";
import LandingPagination from "@/components/landing-page/pagination"; import LandingPagination from "@/components/landing-page/pagination";
import { Reveal } from "@/components/landing-page/Reveal";
const columns: ColumnDef<any>[] = [ const columns: ColumnDef<any>[] = [
{ {
@ -175,7 +176,9 @@ const DocumentPage = () => {
</div> </div>
{/* Konten Kanan */} {/* Konten Kanan */}
<div className="flex-1"> <div className="flex-1">
<Reveal>
<div className="flex flex-col items-end mb-4"> <div className="flex flex-col items-end mb-4">
<h2 className="text-lg font-semibold tetx-red-300">Urutkan berdasarkan</h2> <h2 className="text-lg font-semibold tetx-red-300">Urutkan berdasarkan</h2>
<select className="border rounded-md py-2 px-3 focus:ring-red-500 focus:border-red-500"> <select className="border rounded-md py-2 px-3 focus:ring-red-500 focus:border-red-500">
@ -183,8 +186,10 @@ const DocumentPage = () => {
<option value="terlama">Terpopuler</option> <option value="terlama">Terpopuler</option>
</select> </select>
</div> </div>
</Reveal>
{/* Card */} {/* Card */}
<Reveal>
<div className=" grid grid-cols-1 md:grid-cols-2 gap-6"> <div className=" grid grid-cols-1 md:grid-cols-2 gap-6">
{documentData?.map((document: any) => ( {documentData?.map((document: any) => (
<a href="#" key={document?.id} className="flex flex-col bg-yellow-500 sm:flex-row items-center dark:bg-gray-800 cursor-pointer shadow-md rounded-lg p-4 gap-4 w-full"> <a href="#" key={document?.id} className="flex flex-col bg-yellow-500 sm:flex-row items-center dark:bg-gray-800 cursor-pointer shadow-md rounded-lg p-4 gap-4 w-full">
@ -213,6 +218,7 @@ const DocumentPage = () => {
))} ))}
</div> </div>
<LandingPagination table={table} totalData={totalData} totalPage={totalPage} /> <LandingPagination table={table} totalData={totalData} totalPage={totalPage} />
</Reveal>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,4 +1,5 @@
"use client"; "use client";
import { Reveal } from "@/components/landing-page/Reveal";
import React, { useState } from "react"; import React, { useState } from "react";
interface FAQItem { interface FAQItem {
@ -33,8 +34,9 @@ const FAQS: React.FC = () => {
}; };
return ( return (
<div className="max-w-3xl mx-auto h-screen p-6"> <div className="max-w-3xl mx-auto h-screen p-6 mt-20">
{/* Header */} {/* Header */}
<Reveal>
<div className="flex items-center justify-center mb-6"> <div className="flex items-center justify-center mb-6">
<img src="/assets/icons-faqs.png" alt="Faqs" /> <img src="/assets/icons-faqs.png" alt="Faqs" />
<h2 className="ml-4 text-lg lg:text-2xl font-bold text-gray-800">Frequently Asked Questions</h2> <h2 className="ml-4 text-lg lg:text-2xl font-bold text-gray-800">Frequently Asked Questions</h2>
@ -52,6 +54,7 @@ const FAQS: React.FC = () => {
</div> </div>
))} ))}
</div> </div>
</Reveal>
</div> </div>
); );
}; };

View File

@ -1,5 +1,6 @@
"use client"; "use client";
import { Reveal } from "@/components/landing-page/Reveal";
import React, { useState } from "react"; import React, { useState } from "react";
interface RatingProps { interface RatingProps {
@ -46,6 +47,7 @@ const FeedbackForm: React.FC = () => {
}; };
return ( return (
<Reveal>
<div className="max-w-6xl flex flex-col mx-auto p-4 lg:p-40 gap-5"> <div className="max-w-6xl flex flex-col mx-auto p-4 lg:p-40 gap-5">
<div className="flex items-center justify-center mb-6"> <div className="flex items-center justify-center mb-6">
<img src="/assets/icons-feedback.png" alt="Feedback" /> <img src="/assets/icons-feedback.png" alt="Feedback" />
@ -60,6 +62,7 @@ const FeedbackForm: React.FC = () => {
</button> </button>
</div> </div>
</div> </div>
</Reveal>
); );
}; };

View File

@ -10,6 +10,7 @@ import { Icon } from "@iconify/react/dist/iconify.js";
import { textEllipsis } from "@/utils/globals"; import { textEllipsis } from "@/utils/globals";
import { getDetail } from "@/service/landing/landing"; import { getDetail } from "@/service/landing/landing";
import NewContent from "@/components/landing-page/new-content"; import NewContent from "@/components/landing-page/new-content";
import { Reveal } from "@/components/landing-page/Reveal";
const dummyImage = [ const dummyImage = [
{ id: 1, thumbnail: "/assets/banner-sample.png" }, { id: 1, thumbnail: "/assets/banner-sample.png" },
@ -81,11 +82,11 @@ const DetailInfo = () => {
return ( return (
<div className="min-h-screen px-4 md:px-24 py-4"> <div className="min-h-screen px-4 md:px-24 py-4">
{/* Container Utama */}
<div className="rounded-md overflow-hidden md:flex"> <div className="rounded-md overflow-hidden md:flex">
{/* Bagian Kiri */} {/* Bagian Kiri */}
<Reveal>
<div className="md:w-3/4"> <div className="md:w-3/4">
{/* Gambar Utama */} {/* Gambar Besar */}
<div className="relative"> <div className="relative">
<img src={detailDataImage?.files[selectedImage]?.url} alt="Main" className="w-full rounded-lg" /> <img src={detailDataImage?.files[selectedImage]?.url} alt="Main" className="w-full rounded-lg" />
<div className="absolute top-4 left-4"></div> <div className="absolute top-4 left-4"></div>
@ -100,8 +101,10 @@ const DetailInfo = () => {
))} ))}
</div> </div>
</div> </div>
</Reveal>
{/* Bagian Kanan */} {/* Bagian Kanan */}
<Reveal>
<div className="md:w-1/4 p-4 bg-gray-300 rounded-lg mx-4"> <div className="md:w-1/4 p-4 bg-gray-300 rounded-lg mx-4">
<div className="flex flex-col mb-3 items-center justify-center cursor-pointer"> <div className="flex flex-col mb-3 items-center justify-center cursor-pointer">
<svg xmlns="http://www.w3.org/2000/svg" width="2.5em" height="2.5em" viewBox="0 0 24 24"> <svg xmlns="http://www.w3.org/2000/svg" width="2.5em" height="2.5em" viewBox="0 0 24 24">
@ -156,9 +159,11 @@ const DetailInfo = () => {
Download Download
</button> </button>
</div> </div>
</Reveal>
</div> </div>
{/* Footer Informasi */} {/* Footer Informasi */}
<Reveal>
<div className="p-4 text-sm text-gray-500 flex justify-between items-center border-t mt-4"> <div className="p-4 text-sm text-gray-500 flex justify-between items-center border-t mt-4">
<div className="flex flex-row items-center"> <div className="flex flex-row items-center">
oleh&nbsp;<span className="font-semibold text-black">{detailDataImage?.uploadedBy?.userLevel?.name}</span>&nbsp; | &nbsp;Diupdate pada {detailDataImage?.updatedAt} WIB &nbsp;|&nbsp; oleh&nbsp;<span className="font-semibold text-black">{detailDataImage?.uploadedBy?.userLevel?.name}</span>&nbsp; | &nbsp;Diupdate pada {detailDataImage?.updatedAt} WIB &nbsp;|&nbsp;
@ -185,6 +190,7 @@ const DetailInfo = () => {
<div className="px-4"> <div className="px-4">
<NewContent type={"similar"} /> <NewContent type={"similar"} />
</div> </div>
</Reveal>
</div> </div>
); );
}; };

View File

@ -8,6 +8,7 @@ import { useParams, usePathname, useRouter, useSearchParams } from "next/navigat
import { getListContent } from "@/service/landing/landing"; import { getListContent } from "@/service/landing/landing";
import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table"; import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table";
import LandingPagination from "@/components/landing-page/pagination"; import LandingPagination from "@/components/landing-page/pagination";
import { Reveal } from "@/components/landing-page/Reveal";
const columns: ColumnDef<any>[] = [ const columns: ColumnDef<any>[] = [
{ {
@ -55,9 +56,8 @@ const FilterPage = () => {
}); });
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
React.useEffect(() => { React.useEffect(() => {
const pageFromUrl = searchParams?.get('page'); const pageFromUrl = searchParams?.get("page");
if (pageFromUrl) { if (pageFromUrl) {
setPage(Number(pageFromUrl)); setPage(Number(pageFromUrl));
} }
@ -102,6 +102,7 @@ const FilterPage = () => {
return ( return (
<div className="flex flex-col"> <div className="flex flex-col">
{/* Header */} {/* Header */}
<div className="flex flex-col md:flex-row items-start gap-5 p-10 bg-gray-200"> <div className="flex flex-col md:flex-row items-start gap-5 p-10 bg-gray-200">
<p> <p>
{" "} {" "}
@ -110,7 +111,9 @@ const FilterPage = () => {
<p className="font-bold">|</p> <p className="font-bold">|</p>
<p>Terdapat 324911 artikel berisi Audio Visual yang dapat diunduh </p> <p>Terdapat 324911 artikel berisi Audio Visual yang dapat diunduh </p>
</div> </div>
{/* Left */} {/* Left */}
<div className="flex flex-col lg:flex-row gap-6 p-4"> <div className="flex flex-col lg:flex-row gap-6 p-4">
<div className="lg:w-1/4 w-full bg-white p-4 rounded-lg shadow-md"> <div className="lg:w-1/4 w-full bg-white p-4 rounded-lg shadow-md">
<h2 className="text-lg font-semibold mb-4">Filter</h2> <h2 className="text-lg font-semibold mb-4">Filter</h2>
@ -169,6 +172,7 @@ const FilterPage = () => {
</div> </div>
{/* Konten Kanan */} {/* Konten Kanan */}
<Reveal>
<div className="flex-1"> <div className="flex-1">
<div className="flex flex-col items-end mb-4"> <div className="flex flex-col items-end mb-4">
<h2 className="text-lg font-semibold">Urutkan berdasarkan</h2> <h2 className="text-lg font-semibold">Urutkan berdasarkan</h2>
@ -195,8 +199,9 @@ const FilterPage = () => {
</Card> </Card>
))} ))}
</div> </div>
<LandingPagination table={table} totalData={totalData} totalPage={totalPage}/> <LandingPagination table={table} totalData={totalData} totalPage={totalPage} />
</div> </div>
</Reveal>
</div> </div>
</div> </div>
); );

View File

@ -266,7 +266,7 @@ const Schedule = () => {
if (itemFound?.length == 1) { if (itemFound?.length == 1) {
return ( return (
<a <a
className={`cursor-pointer ${Number(itemFound[0]?.uploaderLevelNumber) == 1 ? "bg-yellow-300" : Number(itemFound[0]?.uploaderLevelNumber) == 2 ? "bg-blue-400" : "bg-gray-500"}`} className={`cursor-pointer text-center ${Number(itemFound[0]?.uploaderLevelNumber) == 1 ? "bg-yellow-300" : Number(itemFound[0]?.uploaderLevelNumber) == 2 ? "bg-blue-400" : "bg-gray-500"}`}
onClick={() => { onClick={() => {
getItem(itemFound[0]); getItem(itemFound[0]);
}} }}
@ -485,25 +485,46 @@ const Schedule = () => {
</svg> </svg>
</span> </span>
</div> </div>
<div className="card border border-slate-400 p-2 rounded-lg">
<div className="card-header"> {/* jadwal hari ini */}
<a className="accordion-icon"> <Collapsible className="border border-slate-400 p-2 rounded-lg" open={isOpen} onOpenChange={setIsOpen}>
<h5 className="py-2 theme-text text-left"> <CollapsibleTrigger>
<h5 className="py-2 flex justify-between items-center">
Jadwal Hari Ini Jadwal Hari Ini
<span className="float-right"> <span className="flex items-end">
<Icon icon="fa:angle-down" className="ml-1" /> <Icon icon="fa:angle-down" className="ml-1" />
</span> </span>
</h5> </h5>
</a> </CollapsibleTrigger>
{todayList?.map((list: any) => (
<CollapsibleContent className={`flex flex-row gap-3 ${isOpen ? "border-b-2 border-black my-3" : ""}`}>
<div className="border-l-4 border-red-700 pl-1 h-fit font-bold text-lg">{new Date(list.startDate).getDate()}</div>
<div className="flex flex-col">
<h3 className="font-bold">{list?.title}</h3>
<p className="flex flex-row items-center gap-2">
<Icon icon="iconamoon:clock-thin" />
{list?.startTime} - {list?.endTime} WIB
</p>
<p className="flex flex-row items-start gap-2 ">
<Icon icon="bxs:map" width={40} />
{list?.address}
</p>
<p>Pembicara :</p>
<p className="flex flex-row items-center gap-2">
<Icon icon="ic:round-person" />
{list?.speakerTitle}&nbsp;{list?.speakerName}
</p>
</div> </div>
</div> </CollapsibleContent>
{/* jadwal sebelumnya */} ))}
</Collapsible>
{/* jadwal sebelumnya */}
<Collapsible className="border border-slate-400 p-2 rounded-lg" open={isOpen} onOpenChange={setIsOpen}> <Collapsible className="border border-slate-400 p-2 rounded-lg" open={isOpen} onOpenChange={setIsOpen}>
<CollapsibleTrigger> <CollapsibleTrigger>
<h5 className="py-2 flex justify-between items-center"> <h5 className="py-2 flex justify-between items-center">
Jadwal Sebelumnya Jadwal Sebelumnya
<span className="float-right"> <span className="flex items-end">
<Icon icon="fa:angle-down" className="ml-1" /> <Icon icon="fa:angle-down" className="ml-1" />
</span> </span>
</h5> </h5>
@ -529,48 +550,66 @@ const Schedule = () => {
</div> </div>
</CollapsibleContent> </CollapsibleContent>
))} ))}
</Collapsible>
{/* jadwal selanjutnya */}
<Collapsible className="border border-slate-400 p-2 rounded-lg" open={isOpen} onOpenChange={setIsOpen}>
<CollapsibleTrigger>
<h5 className="py-2 flex justify-end items-center">
Jadwal Selanjutnya
<span className="flex items-end">
<Icon icon="fa:angle-down" className="ml-1 flex" />
</span>
</h5>
</CollapsibleTrigger>
{nextdayList?.map((list: any) => (
<CollapsibleContent className={`flex flex-row gap-3 ${isOpen ? "border-b-2 border-black my-3" : ""}`}> <CollapsibleContent className={`flex flex-row gap-3 ${isOpen ? "border-b-2 border-black my-3" : ""}`}>
<div className="border-l-4 border-red-700 pl-1 h-fit font-bold text-lg">6</div> <div className="border-l-4 border-red-700 pl-1 h-fit font-bold text-lg">{new Date(list.startDate).getDate()}</div>
<div className="flex flex-col"> <div className="flex flex-col">
<h3 className="font-bold">Test Event</h3> <h3 className="font-bold">{list?.title}</h3>
<p className="flex flex-row items-center gap-2"> <p className="flex flex-row items-center gap-2">
<Icon icon="iconamoon:clock-thin" /> <Icon icon="iconamoon:clock-thin" />
08.00 - 12.00 WIB {list?.startTime} - {list?.endTime} WIB
</p> </p>
<p className="flex flex-row items-start gap-2 "> <p className="flex flex-row items-start gap-2 ">
<Icon icon="bxs:map" width={40} /> <Icon icon="bxs:map" width={40} />
Jl. Trunojoyo No.3 2, RT.2/RW.1, Selong, Kec. Kby. Baru, Kota Jakarta Selatan, Daerah Khusus Ibukota Jakarta 12110, Indonesia. {list?.address}
</p> </p>
<p>Pembicara :</p> <p>Pembicara :</p>
<p className="flex flex-row items-center gap-2"> <p className="flex flex-row items-center gap-2">
<Icon icon="ic:round-person" /> <Icon icon="ic:round-person" />
Hanif Salafi {list?.speakerTitle}&nbsp;{list?.speakerName}
</p> </p>
</div> </div>
</CollapsibleContent> </CollapsibleContent>
))}
</Collapsible> </Collapsible>
</div>
</div>
</div>
<div className="card border border-slate-400 p-2 rounded-lg">
<div className="card-header">
<a className="accordion-icon">
<h5 className="py-2 theme-text text-left">
Jadwal Selanjutnya
<span className="float-right">
<Icon icon="fa:angle-down" className="ml-1" />
</span>
</h5>
</a>
</div>
</div>
</div>
</div>
</div>
<AlertDialog open={openDialog} onOpenChange={setOpenDialog}> <AlertDialog open={openDialog} onOpenChange={setOpenDialog}>
<AlertDialogContent> <AlertDialogContent>
<AlertDialogHeader> <AlertDialogHeader>
<AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle> <AlertDialogTitle>Test Event</AlertDialogTitle>
<AlertDialogDescription>This action cannot be undone. This will permanently delete your account and remove your data from our servers.</AlertDialogDescription> <AlertDialogDescription>
<p className="flex flex-row items-center gap-2">
<Icon icon="iconamoon:clock-thin" />
08.00 - 12.00 WIB
</p>
</AlertDialogDescription>
<AlertDialogDescription>
<p className="flex flex-row items-start gap-2 ">
<Icon icon="bxs:map" width={30} />
Jl. Trunojoyo No.3 2, RT.2/RW.1, Selong, Kec. Kby. Baru, Kota Jakarta Selatan, Daerah Khusus Ibukota Jakarta 12110, Indonesia.
</p>
</AlertDialogDescription>
<AlertDialogDescription>
<p className="flex flex-row items-center gap-2">
<Icon icon="ic:round-person" />
Hanif Salafi
</p>
</AlertDialogDescription>
</AlertDialogHeader> </AlertDialogHeader>
<AlertDialogFooter> <AlertDialogFooter>
<AlertDialogCancel>Cancel</AlertDialogCancel> <AlertDialogCancel>Cancel</AlertDialogCancel>

View File

@ -8,6 +8,7 @@ import { formatDateToIndonesian } from "@/utils/globals";
import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation"; import { useParams, usePathname, useRouter, useSearchParams } from "next/navigation";
import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table"; import { ColumnDef, ColumnFiltersState, PaginationState, SortingState, VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table";
import LandingPagination from "@/components/landing-page/pagination"; import LandingPagination from "@/components/landing-page/pagination";
import { Reveal } from "@/components/landing-page/Reveal";
const columns: ColumnDef<any>[] = [ const columns: ColumnDef<any>[] = [
{ {
@ -114,6 +115,7 @@ const FilterPage = () => {
{/* Left */} {/* Left */}
<div className="flex flex-col lg:flex-row gap-6 p-4"> <div className="flex flex-col lg:flex-row gap-6 p-4">
<div className="lg:w-1/4 w-full bg-white p-4 rounded-lg shadow-md"> <div className="lg:w-1/4 w-full bg-white p-4 rounded-lg shadow-md">
<Reveal>
<h2 className="text-lg font-semibold mb-4">Filter</h2> <h2 className="text-lg font-semibold mb-4">Filter</h2>
<div className="space-y-6"> <div className="space-y-6">
<div> <div>
@ -167,10 +169,12 @@ const FilterPage = () => {
</ul> </ul>
</div> </div>
</div> </div>
</Reveal>
</div> </div>
{/* Konten Kanan */} {/* Konten Kanan */}
<div className="flex-1"> <div className="flex-1">
<Reveal>
<div className="flex flex-col items-end mb-4"> <div className="flex flex-col items-end mb-4">
<h2 className="text-lg font-semibold">Urutkan berdasarkan</h2> <h2 className="text-lg font-semibold">Urutkan berdasarkan</h2>
<select className="border rounded-md py-2 px-3 focus:ring-red-500 focus:border-red-500"> <select className="border rounded-md py-2 px-3 focus:ring-red-500 focus:border-red-500">
@ -197,6 +201,7 @@ const FilterPage = () => {
))} ))}
</div> </div>
<LandingPagination table={table} totalData={totalData} totalPage={totalPage} /> <LandingPagination table={table} totalData={totalData} totalPage={totalPage} />
</Reveal>
</div> </div>
</div> </div>
</div> </div>

View File

@ -9,10 +9,12 @@ import Hero from "@/components/landing-page/hero";
import Footer from "@/components/landing-page/footer"; import Footer from "@/components/landing-page/footer";
import Division from "@/components/landing-page/division"; import Division from "@/components/landing-page/division";
import Navbar from "@/components/landing-page/navbar"; import Navbar from "@/components/landing-page/navbar";
import { ReactLenis } from "@studio-freight/react-lenis";
const Home = ({ params: { locale } }: { params: { locale: string } }) => { const Home = ({ params: { locale } }: { params: { locale: string } }) => {
return ( return (
<> <>
<ReactLenis root>
<Navbar /> <Navbar />
<Hero /> <Hero />
<SearchSection /> <SearchSection />
@ -23,6 +25,7 @@ const Home = ({ params: { locale } }: { params: { locale: string } }) => {
<Coverage /> <Coverage />
<Division /> <Division />
<Footer /> <Footer />
</ReactLenis>
</> </>
); );
}; };

View File

@ -0,0 +1,58 @@
import React, { useRef, useEffect } from "react";
import { motion, useInView, useAnimation } from "framer-motion";
interface Props {
children: React.ReactNode;
}
export const Reveal = ({ children }: Props) => {
const ref = useRef(null);
const isInView = useInView(ref, { once: false });
const mainControls = useAnimation();
const slideControls = useAnimation();
useEffect(() => {
if (isInView) {
mainControls.start("visible");
slideControls.start("visible");
} else mainControls.start("hidden");
}, [isInView]);
return (
<div ref={ref}>
<motion.div
variants={{
hidden: { opacity: 0, y: 75 },
visible: { opacity: 1, y: 0 },
}}
initial="hidden"
animate={mainControls}
transition={{
duration: 1,
delay: 0.1,
}}
>
{children}
</motion.div>
{/* TODO green slide thingy */}
{/* <motion.div
variants={{
hidden: { left: 0 },
visible: { left: "100%" },
}}
initial="hidden"
animate={slideControls}
transition={{ duration: 0.5, ease: "easeIn" }}
style={{
position: "absolute",
top: 4,
bottom: 4,
left: 0,
right: 0,
background: "#5e84ff",
zIndex: 20,
}}
/> */}
</div>
);
};

View File

@ -2,6 +2,7 @@ import { getCategoryData } from "@/service/landing/landing";
import Link from "next/link"; import Link from "next/link";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Button } from "../ui/button"; import { Button } from "../ui/button";
import { Reveal } from "./Reveal";
const ContentCategory = () => { const ContentCategory = () => {
const [categories, setCategories] = useState<any>(); const [categories, setCategories] = useState<any>();
@ -19,6 +20,7 @@ const ContentCategory = () => {
return ( return (
<div className="mx-auto px-4 lg:px-20 py-10 max-w-screen-2xl "> <div className="mx-auto px-4 lg:px-20 py-10 max-w-screen-2xl ">
<Reveal>
<h2 className="text-center text-xl lg:text-2xl font-bold text-[#bb3523] mb-4"> <h2 className="text-center text-xl lg:text-2xl font-bold text-[#bb3523] mb-4">
Kategori <span className="text-black dark:text-white">Konten</span> Kategori <span className="text-black dark:text-white">Konten</span>
</h2> </h2>
@ -52,6 +54,7 @@ const ContentCategory = () => {
Lihat Lebih {seeAllValue ? "Sedikit" : "Banyak"} Lihat Lebih {seeAllValue ? "Sedikit" : "Banyak"}
</Button> </Button>
</div> </div>
</Reveal>
</div> </div>
); );
}; };

View File

@ -1,5 +1,6 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { Button } from "../ui/button"; import { Button } from "../ui/button";
import { Reveal } from "./Reveal";
const Coverage: React.FC = () => { const Coverage: React.FC = () => {
const [searchTerm, setSearchTerm] = useState(""); const [searchTerm, setSearchTerm] = useState("");
@ -46,6 +47,7 @@ const Coverage: React.FC = () => {
return ( return (
<div className="max-w-screen-xl mx-auto px-4 lg:px-12 py-6"> <div className="max-w-screen-xl mx-auto px-4 lg:px-12 py-6">
<Reveal>
{/* Header */} {/* Header */}
<h2 className="text-center text-2xl font-bold text-gray-800 dark:text-white mb-4"> <h2 className="text-center text-2xl font-bold text-gray-800 dark:text-white mb-4">
Liputan <span className="text-[#bb3523]">Wilayah</span> Liputan <span className="text-[#bb3523]">Wilayah</span>
@ -93,6 +95,7 @@ const Coverage: React.FC = () => {
Lihat Lebih {seeAllValue ? "Sedikit" : "Banyak"} Lihat Lebih {seeAllValue ? "Sedikit" : "Banyak"}
</Button> </Button>
</div> </div>
</Reveal>
</div> </div>
); );
}; };

View File

@ -1,5 +1,6 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { Button } from "../ui/button"; import { Button } from "../ui/button";
import { Reveal } from "./Reveal";
const Division = () => { const Division = () => {
const [searchTerm, setSearchTerm] = useState(""); const [searchTerm, setSearchTerm] = useState("");
@ -49,6 +50,7 @@ const Division = () => {
return ( return (
<div className="max-w-screen-xl mx-auto px-4 lg:px-12 py-6"> <div className="max-w-screen-xl mx-auto px-4 lg:px-12 py-6">
{/* Header */} {/* Header */}
<Reveal>
<h2 className="text-center text-2xl font-bold text-gray-800 dark:text-white mb-4"> <h2 className="text-center text-2xl font-bold text-gray-800 dark:text-white mb-4">
Liputan <span className="text-[#bb3523]">Satker</span> Liputan <span className="text-[#bb3523]">Satker</span>
</h2> </h2>
@ -95,6 +97,7 @@ const Division = () => {
Lihat Lebih {seeAllValue ? "Sedikit" : "Banyak"} Lihat Lebih {seeAllValue ? "Sedikit" : "Banyak"}
</Button> </Button>
</div> </div>
</Reveal>
</div> </div>
); );
}; };

View File

@ -30,7 +30,7 @@ const Hero: React.FC = () => {
{heroData?.map((list: any) => ( {heroData?.map((list: any) => (
<CarouselItem key={list?.id}> <CarouselItem key={list?.id}>
<div className="relative h-[310px] lg:h-[420px]"> <div className="relative h-[310px] lg:h-[420px]">
<img src={list?.thumbnailLink} alt="Gambar Utama" className="w-auto h-[310px] lg:h-[420px] rounded-lg" /> <img src={list?.thumbnailLink} alt="Gambar Utama" className="w-full h-[310px] lg:h-[420px] rounded-lg" />
<div className="absolute bottom-0 left-0 right-0 bg-transparent backdrop-blur-sm text-black dark:text-white p-4 rounded-b-lg"> <div className="absolute bottom-0 left-0 right-0 bg-transparent backdrop-blur-sm text-black dark:text-white p-4 rounded-b-lg">
<span className="text-white bg-[#bb3523] rounded-md w-full h-full font-semibold uppercase text-sm px-4 py-1">{list?.categoryName}</span> <span className="text-white bg-[#bb3523] rounded-md w-full h-full font-semibold uppercase text-sm px-4 py-1">{list?.categoryName}</span>
<Link href={`${locale}/image/detail/${list?.slug}`}> <Link href={`${locale}/image/detail/${list?.slug}`}>

View File

@ -107,28 +107,28 @@ const Navbar = () => {
</NavigationMenuTrigger> </NavigationMenuTrigger>
<NavigationMenuContent className="p-0 rounded-md overflow-hidden w-full"> <NavigationMenuContent className="p-0 rounded-md overflow-hidden w-full">
<NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/video/filter", String(locale)))} className="flex items-start gap-1.5 p-2 hover:bg-white"> <NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/video/filter", String(locale)))} className="flex items-start gap-1.5 p-2 hover:bg-white">
<span className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2"> <p className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2 cursor-pointer">
<FiYoutube className="mr-2" /> <FiYoutube className="mr-2" />
Video Video
</span> </p>
</NavigationMenuLink> </NavigationMenuLink>
<NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/audio/filter", String(locale)))} className="flex place-items-start gap-1.5 p-2 hover:bg-white"> <NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/audio/filter", String(locale)))} className="flex place-items-start gap-1.5 p-2 hover:bg-white">
<span className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2"> <p className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2 cursor-pointer">
<FiMusic className="mr-2" /> <FiMusic className="mr-2" />
Audio Audio
</span> </p>
</NavigationMenuLink> </NavigationMenuLink>
<NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/image/filter", String(locale)))} className="flex place-items-start gap-1.5 p-2 hover:bg-white"> <NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/image/filter", String(locale)))} className="flex place-items-start gap-1.5 p-2 hover:bg-white">
<span className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2"> <p className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2 cursor-pointer">
<FiImage className="mr-2" /> <FiImage className="mr-2" />
Foto Foto
</span> </p>
</NavigationMenuLink> </NavigationMenuLink>
<NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/document/filter", String(locale)))} className="flex place-items-start gap-1.5 p-2 hover:bg-white"> <NavigationMenuLink onClick={() => router.push(generateLocalizedPath("/document/filter", String(locale)))} className="flex place-items-start gap-1.5 p-2 hover:bg-white">
<span className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2"> <p className="text-slate-600 hover:text-[#bb3523] flex flex-row justify-center items-center px-5 py-2 cursor-pointer">
<FiFile className="mr-2" /> <FiFile className="mr-2" />
Teks Teks
</span> </p>
</NavigationMenuLink> </NavigationMenuLink>
</NavigationMenuContent> </NavigationMenuContent>
</NavigationMenuItem> </NavigationMenuItem>

View File

@ -1,12 +1,14 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from "@/components/ui/carousel"; import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from "@/components/ui/carousel";
import Link from "next/link";
import { useParams, usePathname, useRouter } from "next/navigation"; import { useParams, usePathname, useRouter } from "next/navigation";
import { Icon } from "@iconify/react/dist/iconify.js"; import { Icon } from "@iconify/react/dist/iconify.js";
import { formatDateToIndonesian, textEllipsis } from "@/utils/globals"; import { formatDateToIndonesian, textEllipsis } from "@/utils/globals";
import { generateLocalizedPath } from "@/utils/globals"; import { generateLocalizedPath } from "@/utils/globals";
import { getListContent } from "@/service/landing/landing"; import { getListContent } from "@/service/landing/landing";
import { Link } from "@/i18n/routing";
import { motion } from "framer-motion";
import { Reveal } from "./Reveal";
const NewContent = (props: { type: string }) => { const NewContent = (props: { type: string }) => {
const [newContent, setNewContent] = useState<any>(); const [newContent, setNewContent] = useState<any>();
@ -33,6 +35,7 @@ const NewContent = (props: { type: string }) => {
return ( return (
<div className="px-4 lg:px-16"> <div className="px-4 lg:px-16">
<Reveal>
<div className="flex flex-col p-4"> <div className="flex flex-col p-4">
<div className="mx-auto w-full max-w-7xl justify-start flex px-5 flex-col lg:flex-row gap-5 mb-4"> <div className="mx-auto w-full max-w-7xl justify-start flex px-5 flex-col lg:flex-row gap-5 mb-4">
<h2 className="flex items-center text-sm lg:text-xl w-fit font-bold bg-[#bb3523] px-4 py-1 rounded-lg text-white"> <h2 className="flex items-center text-sm lg:text-xl w-fit font-bold bg-[#bb3523] px-4 py-1 rounded-lg text-white">
@ -47,18 +50,21 @@ const NewContent = (props: { type: string }) => {
> >
Audio Visual Audio Visual
</TabsTrigger> </TabsTrigger>
<div className="text-[#bb3523] text-lg">|</div>
<TabsTrigger <TabsTrigger
value="audio" value="audio"
className="relative text-sm md:text-xl font-bold text-black dark:text-white dark:bg-transparent before:absolute before:top-full before:left-0 before:h-px before:w-full data-[state=active]:before:bg-primary" className="relative text-sm md:text-xl font-bold text-black dark:text-white dark:bg-transparent before:absolute before:top-full before:left-0 before:h-px before:w-full data-[state=active]:before:bg-primary"
> >
Audio Audio
</TabsTrigger> </TabsTrigger>
<div className="text-[#bb3523] text-lg">|</div>
<TabsTrigger <TabsTrigger
value="image" value="image"
className="relative text-sm md:text-xl font-bold text-black dark:text-white dark:bg-transparent before:absolute before:top-full before:left-0 before:h-px before:w-full data-[state=active]:before:bg-primary" className="relative text-sm md:text-xl font-bold text-black dark:text-white dark:bg-transparent before:absolute before:top-full before:left-0 before:h-px before:w-full data-[state=active]:before:bg-primary"
> >
Foto Foto
</TabsTrigger> </TabsTrigger>
<div className="text-[#bb3523] text-lg">|</div>
<TabsTrigger <TabsTrigger
value="text" value="text"
className="relative text-sm md:text-xl font-bold text-black dark:text-white dark:bg-transparent before:absolute before:top-full before:left-0 before:h-px before:w-full data-[state=active]:before:bg-primary" className="relative text-sm md:text-xl font-bold text-black dark:text-white dark:bg-transparent before:absolute before:top-full before:left-0 before:h-px before:w-full data-[state=active]:before:bg-primary"
@ -193,10 +199,11 @@ const NewContent = (props: { type: string }) => {
</div> </div>
</div> </div>
<div className="flex items-center flex-row justify-center"> <div className="flex items-center flex-row justify-center">
<Link href="#" className="border text-[#bb3523] text-sm lg:text-md px-4 py-1 border-[#bb3523]"> <Link href="/video/filter" className="border text-[#bb3523] text-sm lg:text-md px-4 py-1 border-[#bb3523]">
LIHAT SEMUA LIHAT SEMUA
</Link> </Link>
</div> </div>
</Reveal>
</div> </div>
); );
}; };

121
package-lock.json generated
View File

@ -52,6 +52,7 @@
"@reach/combobox": "^0.18.0", "@reach/combobox": "^0.18.0",
"@react-google-maps/api": "^2.20.3", "@react-google-maps/api": "^2.20.3",
"@south-paw/react-vector-maps": "^3.2.0", "@south-paw/react-vector-maps": "^3.2.0",
"@studio-freight/react-lenis": "^0.0.47",
"@tanstack/react-table": "^8.19.2", "@tanstack/react-table": "^8.19.2",
"@types/cleave.js": "^1.4.12", "@types/cleave.js": "^1.4.12",
"@types/crypto-js": "^4.2.2", "@types/crypto-js": "^4.2.2",
@ -75,7 +76,7 @@
"embla-carousel-autoplay": "^8.1.3", "embla-carousel-autoplay": "^8.1.3",
"embla-carousel-react": "^8.1.3", "embla-carousel-react": "^8.1.3",
"emoji-mart": "^5.6.0", "emoji-mart": "^5.6.0",
"framer-motion": "^11.12.0", "framer-motion": "^11.15.0",
"geojson": "^0.5.0", "geojson": "^0.5.0",
"google-map-react": "^2.2.1", "google-map-react": "^2.2.1",
"html-react-parser": "^5.2.0", "html-react-parser": "^5.2.0",
@ -3340,6 +3341,50 @@
"react": ">=16.8.0" "react": ">=16.8.0"
} }
}, },
"node_modules/@studio-freight/hamo": {
"version": "0.6.33",
"resolved": "https://registry.npmjs.org/@studio-freight/hamo/-/hamo-0.6.33.tgz",
"integrity": "sha512-U3Nvw5wDvB/jps2/ZbGL2TFL+CcZvJF/tkjL7S7ajuzDi9T5VkqCguws6tuWHttZ74Z6DfXxV1b8F1EB30AyJg==",
"deprecated": "Please use @darkroom.engineering/hamo instead",
"dependencies": {
"@studio-freight/tempus": "^0.0.38",
"just-debounce-it": "^3.2.0",
"nanoevents": "^9.0.0"
},
"peerDependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
},
"node_modules/@studio-freight/lenis": {
"version": "1.0.42",
"resolved": "https://registry.npmjs.org/@studio-freight/lenis/-/lenis-1.0.42.tgz",
"integrity": "sha512-HJAGf2DeM+BTvKzHv752z6Z7zy6bA643nZM7W88Ft9tnw2GsJSp6iJ+3cekjyMIWH+cloL2U9X82dKXgdU8kPg==",
"deprecated": "'@studio-freight/lenis' has been renamed to just 'lenis', run 'npx @darkroom.engineering/codemods' to update your dependecies accordingly."
},
"node_modules/@studio-freight/react-lenis": {
"version": "0.0.47",
"resolved": "https://registry.npmjs.org/@studio-freight/react-lenis/-/react-lenis-0.0.47.tgz",
"integrity": "sha512-h+IAqiyiNo8mRo/CA3/sHCqX2IV0tTLyzZRWsdRaLPtM2aBaRqK0+ISYWTUmktQfcf3qvp4hsn0Oeyt9uXwLTQ==",
"dependencies": {
"@studio-freight/hamo": "^0.6.28",
"@studio-freight/lenis": "^1.0.40",
"@types/react": "^18.0.0",
"clsx": "^2.0.0",
"react": "^18.0.0",
"zustand": "^4.4.7"
},
"peerDependencies": {
"react": "^17 || ^18",
"react-dom": "^17 || ^18"
}
},
"node_modules/@studio-freight/tempus": {
"version": "0.0.38",
"resolved": "https://registry.npmjs.org/@studio-freight/tempus/-/tempus-0.0.38.tgz",
"integrity": "sha512-AO1O2fEmfUqWGjEofmPNMQRlwgZ96eB5OFsVJjeH8/RKd1/Yf4zbPnXO+r2TD4aueA6X9JRCJU2GUprI9+m8uQ==",
"deprecated": "Please use @darkroom.engineering/tempus instead"
},
"node_modules/@swc/counter": { "node_modules/@swc/counter": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
@ -6655,18 +6700,18 @@
} }
}, },
"node_modules/framer-motion": { "node_modules/framer-motion": {
"version": "11.13.3", "version": "11.15.0",
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.13.3.tgz", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.15.0.tgz",
"integrity": "sha512-3ZSNuYpDFeNxqVKUyYipOm5A1fXSbMje1XIfEWxKTJ4ughl5FEjvkp6gKmFHLjzwijCVU/PjsMNlTMVCmi+Twg==", "integrity": "sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==",
"dependencies": { "dependencies": {
"motion-dom": "^11.13.0", "motion-dom": "^11.14.3",
"motion-utils": "^11.13.0", "motion-utils": "^11.14.3",
"tslib": "^2.4.0" "tslib": "^2.4.0"
}, },
"peerDependencies": { "peerDependencies": {
"@emotion/is-prop-valid": "*", "@emotion/is-prop-valid": "*",
"react": "^18.0.0", "react": "^18.0.0 || ^19.0.0",
"react-dom": "^18.0.0" "react-dom": "^18.0.0 || ^19.0.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@emotion/is-prop-valid": { "@emotion/is-prop-valid": {
@ -8493,6 +8538,11 @@
"node": ">=4.0" "node": ">=4.0"
} }
}, },
"node_modules/just-debounce-it": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-3.2.0.tgz",
"integrity": "sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ=="
},
"node_modules/katex": { "node_modules/katex": {
"version": "0.16.15", "version": "0.16.15",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.16.15.tgz", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.15.tgz",
@ -10278,14 +10328,14 @@
} }
}, },
"node_modules/motion-dom": { "node_modules/motion-dom": {
"version": "11.13.0", "version": "11.14.3",
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.13.0.tgz", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.14.3.tgz",
"integrity": "sha512-Oc1MLGJQ6nrvXccXA89lXtOqFyBmvHtaDcTRGT66o8Czl7nuA8BeHAd9MQV1pQKX0d2RHFBFaw5g3k23hQJt0w==" "integrity": "sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA=="
}, },
"node_modules/motion-utils": { "node_modules/motion-utils": {
"version": "11.13.0", "version": "11.14.3",
"resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.13.0.tgz", "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.14.3.tgz",
"integrity": "sha512-lq6TzXkH5c/ysJQBxgLXgM01qwBH1b4goTPh57VvZWJbVJZF/0SB31UWEn4EIqbVPf3au88n2rvK17SpDTja1A==" "integrity": "sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ=="
}, },
"node_modules/mri": { "node_modules/mri": {
"version": "1.2.0", "version": "1.2.0",
@ -10319,6 +10369,14 @@
"thenify-all": "^1.0.0" "thenify-all": "^1.0.0"
} }
}, },
"node_modules/nanoevents": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/nanoevents/-/nanoevents-9.1.0.tgz",
"integrity": "sha512-Jd0fILWG44a9luj8v5kED4WI+zfkkgwKyRQKItTtlPfEsh7Lznfi1kr8/iZ+XAIss4Qq5GqRB0qtWbaz9ceO/A==",
"engines": {
"node": "^18.0.0 || >=20.0.0"
}
},
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.8", "version": "3.3.8",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
@ -14392,6 +14450,41 @@
"url": "https://github.com/sponsors/colinhacks" "url": "https://github.com/sponsors/colinhacks"
} }
}, },
"node_modules/zustand": {
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz",
"integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==",
"dependencies": {
"use-sync-external-store": "1.2.2"
},
"engines": {
"node": ">=12.7.0"
},
"peerDependencies": {
"@types/react": ">=16.8",
"immer": ">=9.0.6",
"react": ">=16.8"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"immer": {
"optional": true
},
"react": {
"optional": true
}
}
},
"node_modules/zustand/node_modules/use-sync-external-store": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz",
"integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/zwitch": { "node_modules/zwitch": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",

View File

@ -53,6 +53,7 @@
"@reach/combobox": "^0.18.0", "@reach/combobox": "^0.18.0",
"@react-google-maps/api": "^2.20.3", "@react-google-maps/api": "^2.20.3",
"@south-paw/react-vector-maps": "^3.2.0", "@south-paw/react-vector-maps": "^3.2.0",
"@studio-freight/react-lenis": "^0.0.47",
"@tanstack/react-table": "^8.19.2", "@tanstack/react-table": "^8.19.2",
"@types/cleave.js": "^1.4.12", "@types/cleave.js": "^1.4.12",
"@types/crypto-js": "^4.2.2", "@types/crypto-js": "^4.2.2",
@ -76,7 +77,7 @@
"embla-carousel-autoplay": "^8.1.3", "embla-carousel-autoplay": "^8.1.3",
"embla-carousel-react": "^8.1.3", "embla-carousel-react": "^8.1.3",
"emoji-mart": "^5.6.0", "emoji-mart": "^5.6.0",
"framer-motion": "^11.12.0", "framer-motion": "^11.15.0",
"geojson": "^0.5.0", "geojson": "^0.5.0",
"google-map-react": "^2.2.1", "google-map-react": "^2.2.1",
"html-react-parser": "^5.2.0", "html-react-parser": "^5.2.0",