Initial commit

This commit is contained in:
Nikolay Pecheniev
2026-02-06 10:59:33 +02:00
commit 53fe6543e2
646 changed files with 77784 additions and 0 deletions

92
src/app/blog/page.tsx Normal file
View File

@@ -0,0 +1,92 @@
"use client";
import ReactLenis from "lenis/react";
import BlogCardTwo from '@/components/sections/blog/BlogCardTwo';
import FooterMedia from '@/components/sections/footer/FooterMedia';
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleCentered from '@/components/navbar/NavbarStyleCentered/NavbarStyleCentered';
import { useBlogPosts } from "@/hooks/useBlogPosts";
export default function BlogPage() {
const { posts, isLoading } = useBlogPosts();
return (
<ThemeProvider
defaultButtonVariant="text-stagger"
defaultTextAnimation="background-highlight"
borderRadius="soft"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="none"
cardStyle="subtle-shadow"
primaryButtonStyle="gradient"
secondaryButtonStyle="solid"
headingFontWeight="bold"
>
<ReactLenis root>
<div className="min-h-screen bg-background">
<NavbarStyleCentered
brandName="Inia"
navItems={[
{ name: "Home", id: "/" },
{ name: "About", id: "about" },
{ name: "Menu", id: "menu" },
{ name: "Testimonials", id: "testimonials" },
{ name: "Contact", id: "contact" }
]}
button={{ text: "Reserve Table", href: "contact" }}
/>
{isLoading ? (
<div className="w-content-width mx-auto py-20 text-center">
<p className="text-foreground">Loading posts...</p>
</div>
) : (
<BlogCardTwo
blogs={posts}
title="Coffee Culture Blog"
description="Discover the art of coffee making, brewing tips, and stories from our passionate team at Inia"
textboxLayout="default"
useInvertedBackground="noInvert"
carouselMode="buttons"
animationType="slide-up"
/>
)}
<FooterMedia
imageSrc="https://img.b2bpic.net/free-photo/top-view-coffee-beans_23-2148173325.jpg"
imageAlt="Premium coffee beans"
logoText="Inia Coffee Shop"
copyrightText="© 2025 Inia Coffee Shop. All rights reserved."
columns={[
{
title: "Menu", items: [
{ label: "Espresso Drinks", href: "#" },
{ label: "Cold Beverages", href: "#" },
{ label: "Pastries & Snacks", href: "#" },
{ label: "Limited Editions", href: "#" }
]
},
{
title: "Visit Us", items: [
{ label: "Hours", href: "#" },
{ label: "Location", href: "#" },
{ label: "Reservations", href: "#" },
{ label: "Contact", href: "#" }
]
},
{
title: "More", items: [
{ label: "About Inia", href: "#" },
{ label: "Our Story", href: "#" },
{ label: "Sustainability", href: "#" },
{ label: "Press Kit", href: "#" }
]
}
]}
/>
</div>
</ReactLenis>
</ThemeProvider>
);
}

BIN
src/app/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

600
src/app/globals.css Normal file
View File

@@ -0,0 +1,600 @@
@import "tailwindcss";
:root {
/* Base units */
/* --vw is set by ThemeProvider */
/* --background: #f7f6f7;;
--card: #ffffff;;
--foreground: #251a0c;;
--primary-cta: #f4c408;;
--secondary-cta: #ffffff;;
--accent: #f4ca26;;
--background-accent: #e8daa8;; */
--background: #f7f6f7;;
--card: #ffffff;;
--foreground: #251a0c;;
--primary-cta: #f4c408;;
--secondary-cta: #ffffff;;
--accent: #f4ca26;;
--background-accent: #e8daa8;;
/* text sizing - set by ThemeProvider */
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);
--text-xs: clamp(0.54rem, 0.72vw, 0.72rem);
--text-sm: clamp(0.615rem, 0.82vw, 0.82rem);
--text-base: clamp(0.69rem, 0.92vw, 0.92rem);
--text-lg: clamp(0.75rem, 1vw, 1rem);
--text-xl: clamp(0.825rem, 1.1vw, 1.1rem);
--text-2xl: clamp(0.975rem, 1.3vw, 1.3rem);
--text-3xl: clamp(1.2rem, 1.6vw, 1.6rem);
--text-4xl: clamp(1.5rem, 2vw, 2rem);
--text-5xl: clamp(2.025rem, 2.75vw, 2.75rem);
--text-6xl: clamp(2.475rem, 3.3vw, 3.3rem);
--text-7xl: clamp(3rem, 4vw, 4rem);
--text-8xl: clamp(3.5rem, 4.5vw, 4.5rem);
--text-9xl: clamp(5.25rem, 7vw, 7rem); */
/* Base spacing units */
--vw-0_25: calc(var(--vw) * 0.25);
--vw-0_5: calc(var(--vw) * 0.5);
--vw-0_625: calc(var(--vw) * 0.625);
--vw-0_75: calc(var(--vw) * 0.75);
--vw-1: calc(var(--vw) * 1);
--vw-1_25: calc(var(--vw) * 1.25);
--vw-1_5: calc(var(--vw) * 1.5);
--vw-1_75: calc(var(--vw) * 1.75);
--vw-2: calc(var(--vw) * 2);
--vw-2_25: calc(var(--vw) * 2.25);
--vw-2_5: calc(var(--vw) * 2.5);
--vw-2_75: calc(var(--vw) * 2.75);
--vw-3: calc(var(--vw) * 3);
/* width */
--width-5: clamp(4rem, 5vw, 6rem);
--width-7_5: clamp(5.625rem, 7.5vw, 7.5rem);
--width-10: clamp(7.5rem, 10vw, 10rem);
--width-12_5: clamp(9.375rem, 12.5vw, 12.5rem);
--width-15: clamp(11.25rem, 15vw, 15rem);
--width-17: clamp(12.75rem, 17vw, 17rem);
--width-17_5: clamp(13.125rem, 17.5vw, 17.5rem);
--width-20: clamp(15rem, 20vw, 20rem);
--width-21: clamp(15.75rem, 21vw, 21rem);
--width-22_5: clamp(16.875rem, 22.5vw, 22.5rem);
--width-25: clamp(18.75rem, 25vw, 25rem);
--width-26: clamp(19.5rem, 26vw, 26rem);
--width-27_5: clamp(20.625rem, 27.5vw, 27.5rem);
--width-30: clamp(22.5rem, 30vw, 30rem);
--width-32_5: clamp(24.375rem, 32.5vw, 32.5rem);
--width-35: clamp(26.25rem, 35vw, 35rem);
--width-37_5: clamp(28.125rem, 37.5vw, 37.5rem);
--width-40: clamp(30rem, 40vw, 40rem);
--width-42_5: clamp(31.875rem, 42.5vw, 42.5rem);
--width-45: clamp(33.75rem, 45vw, 45rem);
--width-47_5: clamp(35.625rem, 47.5vw, 47.5rem);
--width-50: clamp(37.5rem, 50vw, 50rem);
--width-52_5: clamp(39.375rem, 52.5vw, 52.5rem);
--width-55: clamp(41.25rem, 55vw, 55rem);
--width-57_5: clamp(43.125rem, 57.5vw, 57.5rem);
--width-60: clamp(45rem, 60vw, 60rem);
--width-62_5: clamp(46.875rem, 62.5vw, 62.5rem);
--width-65: clamp(48.75rem, 65vw, 65rem);
--width-67_5: clamp(50.625rem, 67.5vw, 67.5rem);
--width-70: clamp(52.5rem, 70vw, 70rem);
--width-72_5: clamp(54.375rem, 72.5vw, 72.5rem);
--width-75: clamp(56.25rem, 75vw, 75rem);
--width-77_5: clamp(58.125rem, 77.5vw, 77.5rem);
--width-80: clamp(60rem, 80vw, 80rem);
--width-82_5: clamp(61.875rem, 82.5vw, 82.5rem);
--width-85: clamp(63.75rem, 85vw, 85rem);
--width-87_5: clamp(65.625rem, 87.5vw, 87.5rem);
--width-90: clamp(67.5rem, 90vw, 90rem);
--width-92_5: clamp(69.375rem, 92.5vw, 92.5rem);
--width-95: clamp(71.25rem, 95vw, 95rem);
--width-97_5: clamp(73.125rem, 97.5vw, 97.5rem);
--width-100: clamp(75rem, 100vw, 100rem);
/* --width-content-width and --width-content-width-expanded are set by ThemeProvider */
--width-carousel-padding: calc((100vw - var(--width-content-width)) / 2 + 1px - var(--vw-1_5));
--width-carousel-padding-controls: calc((100vw - var(--width-content-width)) / 2 + 1px);
--width-carousel-padding-expanded: calc((var(--width-content-width-expanded) - var(--width-content-width)) / 2 + 1px - var(--vw-1_5));
--width-carousel-padding-controls-expanded: calc((var(--width-content-width-expanded) - var(--width-content-width)) / 2 + 1px);
--width-carousel-item-3: calc(var(--width-content-width) / 3 - var(--vw-1_5) / 3 * 2);
--width-carousel-item-4: calc(var(--width-content-width) / 4 - var(--vw-1_5) / 4 * 3);
--width-x-padding-mask-fade: clamp(1.5rem, 4vw, 4rem);
--height-4: 1rem;
--height-5: 1.25rem;
--height-6: 1.5rem;
--height-7: 1.75rem;
--height-8: 2rem;
--height-9: 2.25rem;
--height-10: 2.5rem;
--height-11: 2.75rem;
--height-12: 3rem;
--height-30: 7.5rem;
--height-90: 22.5rem;
--height-100: 25rem;
--height-110: 27.5rem;
--height-120: 30rem;
--height-130: 32.5rem;
--height-140: 35rem;
--height-150: 37.5rem;
/* hero page padding */
--padding-hero-page-padding-half: calc((var(--height-10) + var(--vw-1_5) + var(--vw-1_5) + var(--height-10)) / 2);
--padding-hero-page-padding: calc(var(--height-10) + var(--vw-1_5) + var(--vw-1_5) + var(--height-10));
--padding-hero-page-padding-1_5: calc(1.5 * (var(--height-10) + var(--vw-1_5) + var(--vw-1_5) + var(--height-10)));
--padding-hero-page-padding-double: calc(2 * (var(--height-10) + var(--vw-1_5) + var(--vw-1_5) + var(--height-10)));
}
@media (max-width: 767px) {
:root {
/* --vw and text sizing are set by ThemeProvider */
/* --vw: 3vw;
--text-2xs: 2.5vw;
--text-xs: 2.75vw;
--text-sm: 3vw;
--text-base: 3.25vw;
--text-lg: 3.5vw;
--text-xl: 4.25vw;
--text-2xl: 5vw;
--text-3xl: 6vw;
--text-4xl: 7vw;
--text-5xl: 7.5vw;
--text-6xl: 8.5vw;
--text-7xl: 10vw;
--text-8xl: 12vw;
--text-9xl: 14vw; */
--width-5: 5vw;
--width-7_5: 7.5vw;
--width-10: 10vw;
--width-12_5: 12.5vw;
--width-15: 15vw;
--width-17_5: 17.5vw;
--width-20: 20vw;
--width-22_5: 22.5vw;
--width-25: 25vw;
--width-27_5: 27.5vw;
--width-30: 30vw;
--width-32_5: 32.5vw;
--width-35: 35vw;
--width-37_5: 37.5vw;
--width-40: 40vw;
--width-42_5: 42.5vw;
--width-45: 45vw;
--width-47_5: 47.5vw;
--width-50: 50vw;
--width-52_5: 52.5vw;
--width-55: 55vw;
--width-57_5: 57.5vw;
--width-60: 60vw;
--width-62_5: 62.5vw;
--width-65: 65vw;
--width-67_5: 67.5vw;
--width-70: 70vw;
--width-72_5: 72.5vw;
--width-75: 75vw;
--width-77_5: 77.5vw;
--width-80: 80vw;
--width-82_5: 82.5vw;
--width-85: 85vw;
--width-87_5: 87.5vw;
--width-90: 90vw;
--width-92_5: 92.5vw;
--width-95: 95vw;
--width-97_5: 97.5vw;
--width-100: 100vw;
/* --width-content-width and --width-content-width-expanded are set by ThemeProvider */
--width-carousel-padding: calc((100vw - var(--width-content-width)) / 2 + 1px - var(--vw-1_5));
--width-carousel-padding-controls: calc((100vw - var(--width-content-width)) / 2 + 1px);
--width-carousel-padding-expanded: calc((var(--width-content-width-expanded) - var(--width-content-width)) / 2 + 1px - var(--vw-1_5));
--width-carousel-padding-controls-expanded: calc((var(--width-content-width-expanded) - var(--width-content-width)) / 2 + 1px);
--width-carousel-item-3: var(--width-content-width);
--width-carousel-item-4: var(--width-content-width);
--width-x-padding-mask-fade: 10vw;
--height-4: 3.5vw;
--height-5: 4.5vw;
--height-6: 5.5vw;
--height-7: 6.5vw;
--height-8: 7.5vw;
--height-9: 8.5vw;
--height-10: 9vw;
--height-11: 10vw;
--height-12: 11vw;
--height-30: 25vw;
--height-90: 81vw;
--height-100: 90vw;
--height-110: 99vw;
--height-120: 108vw;
--height-130: 117vw;
--height-140: 126vw;
--height-150: 135vw;
}
}
@theme inline {
--color-background: var(--background);
--color-card: var(--card);
--color-foreground: var(--foreground);
--color-primary-cta: var(--primary-cta);
--color-secondary-cta: var(--secondary-cta);
--color-accent: var(--accent);
--color-background-accent: var(--background-accent);
/* theme border radius */
--radius-theme: var(--theme-border-radius);
--radius-theme-capped: var(--theme-border-radius-capped);
/* text */
--text-2xs: var(--text-2xs);
--text-xs: var(--text-xs);
--text-sm: var(--text-sm);
--text-base: var(--text-base);
--text-lg: var(--text-lg);
--text-xl: var(--text-xl);
--text-2xl: var(--text-2xl);
--text-3xl: var(--text-3xl);
--text-4xl: var(--text-4xl);
--text-5xl: var(--text-5xl);
--text-6xl: var(--text-6xl);
--text-7xl: var(--text-7xl);
--text-8xl: var(--text-8xl);
--text-9xl: var(--text-9xl);
/* height */
--height-4: var(--height-4);
--height-5: var(--height-5);
--height-6: var(--height-6);
--height-7: var(--height-7);
--height-8: var(--height-8);
--height-9: var(--height-9);
--height-11: var(--height-11);
--height-12: var(--height-12);
--height-10: var(--height-10);
--height-30: var(--height-30);
--height-90: var(--height-90);
--height-100: var(--height-100);
--height-110: var(--height-110);
--height-120: var(--height-120);
--height-130: var(--height-130);
--height-140: var(--height-140);
--height-150: var(--height-150);
--height-page-padding: calc(2.25rem+var(--vw-1_5)+var(--vw-1_5));
/* width */
--width-5: var(--width-5);
--width-7_5: var(--width-7_5);
--width-10: var(--width-10);
--width-12_5: var(--width-12_5);
--width-15: var(--width-15);
--width-17: var(--width-17);
--width-17_5: var(--width-17_5);
--width-20: var(--width-20);
--width-21: var(--width-21);
--width-22_5: var(--width-22_5);
--width-25: var(--width-25);
--width-26: var(--width-26);
--width-27_5: var(--width-27_5);
--width-30: var(--width-30);
--width-32_5: var(--width-32_5);
--width-35: var(--width-35);
--width-37_5: var(--width-37_5);
--width-40: var(--width-40);
--width-42_5: var(--width-42_5);
--width-45: var(--width-45);
--width-47_5: var(--width-47_5);
--width-50: var(--width-50);
--width-52_5: var(--width-52_5);
--width-55: var(--width-55);
--width-57_5: var(--width-57_5);
--width-60: var(--width-60);
--width-62_5: var(--width-62_5);
--width-65: var(--width-65);
--width-67_5: var(--width-67_5);
--width-70: var(--width-70);
--width-72_5: var(--width-72_5);
--width-75: var(--width-75);
--width-77_5: var(--width-77_5);
--width-80: var(--width-80);
--width-82_5: var(--width-82_5);
--width-85: var(--width-85);
--width-87_5: var(--width-87_5);
--width-90: var(--width-90);
--width-92_5: var(--width-92_5);
--width-95: var(--width-95);
--width-97_5: var(--width-97_5);
--width-100: var(--width-100);
--width-content-width: var(--width-content-width);
--width-carousel-padding: var(--width-carousel-padding);
--width-carousel-padding-controls: var(--width-carousel-padding-controls);
--width-carousel-padding-expanded: var(--width-carousel-padding-expanded);
--width-carousel-padding-controls-expanded: var(--width-carousel-padding-controls-expanded);
--width-carousel-item-3: var(--width-carousel-item-3);
--width-carousel-item-4: var(--width-carousel-item-4);
--width-x-padding-mask-fade: var(--width-x-padding-mask-fade);
--width-content-width-expanded: var(--width-content-width-expanded);
/* gap */
--spacing-1: var(--vw-0_25);
--spacing-2: var(--vw-0_5);
--spacing-3: var(--vw-0_75);
--spacing-4: var(--vw-1);
--spacing-5: var(--vw-1_25);
--spacing-6: var(--vw-1_5);
--spacing-7: var(--vw-1_75);
--spacing-8: var(--vw-2);
--spacing-x-1: var(--vw-0_25);
--spacing-x-2: var(--vw-0_5);
--spacing-x-3: var(--vw-0_75);
--spacing-x-4: var(--vw-1);
--spacing-x-5: var(--vw-1_25);
--spacing-x-6: var(--vw-1_5);
/* border radius */
--radius-none: 0;
--radius-sm: var(--vw-0_5);
--radius: var(--vw-0_75);
--radius-md: var(--vw-1);
--radius-lg: var(--vw-1_25);
--radius-xl: var(--vw-1_75);
--radius-full: 999px;
/* padding */
--padding-1: var(--vw-0_25);
--padding-2: var(--vw-0_5);
--padding-2.5: var(--vw-0_625);
--padding-3: var(--vw-0_75);
--padding-4: var(--vw-1);
--padding-5: var(--vw-1_25);
--padding-6: var(--vw-1_5);
--padding-7: var(--vw-1_75);
--padding-8: var(--vw-2);
--padding-x-1: var(--vw-0_25);
--padding-x-2: var(--vw-0_5);
--padding-x-3: var(--vw-0_75);
--padding-x-4: var(--vw-1);
--padding-x-5: var(--vw-1_25);
--padding-x-6: var(--vw-1_5);
--padding-x-7: var(--vw-1_75);
--padding-x-8: var(--vw-2);
--padding-hero-page-padding-half: var(--padding-hero-page-padding-half);
--padding-hero-page-padding: var(--padding-hero-page-padding);
--padding-hero-page-padding-1_5: var(--padding-hero-page-padding-1_5);
--padding-hero-page-padding-double: var(--padding-hero-page-padding-double);
/* margin */
--margin-1: var(--vw-0_25);
--margin-2: var(--vw-0_5);
--margin-3: var(--vw-0_75);
--margin-4: var(--vw-1);
--margin-5: var(--vw-1_25);
--margin-6: var(--vw-1_5);
--margin-7: var(--vw-1_75);
--margin-8: var(--vw-2);
--margin-x-1: var(--vw-0_25);
--margin-x-2: var(--vw-0_5);
--margin-x-3: var(--vw-0_75);
--margin-x-4: var(--vw-1);
--margin-x-5: var(--vw-1_25);
--margin-x-6: var(--vw-1_5);
--margin-x-7: var(--vw-1_75);
--margin-x-8: var(--vw-2);
}
@layer components {}
@layer utilities {
/* Card, primary-button, and secondary-button styles are now dynamically injected via ThemeProvider */
/* .card {
@apply backdrop-blur-sm bg-gradient-to-br from-card/80 to-card/40 shadow-sm border border-card;
}
.primary-button {
@apply bg-gradient-to-b from-primary-cta/83 to-primary-cta;
box-shadow:
color-mix(in srgb, var(--color-background) 25%, transparent) 0px 1px 1px 0px inset,
color-mix(in srgb, var(--color-primary-cta) 15%, transparent) 3px 3px 3px 0px;
}
.secondary-button {
@apply backdrop-blur-sm bg-gradient-to-br from-secondary-cta/80 to-secondary-cta shadow-sm border border-secondary-cta;
} */
.tag-card {
@apply backdrop-blur-sm bg-gradient-to-br from-card/80 to-card/40 shadow-sm border border-card;
}
.mask-fade-x {
-webkit-mask-image: linear-gradient(to right, transparent 0%, transparent calc((100vw - var(--width-content-width)) / 4), black calc((100vw - var(--width-content-width)) / 2 + 5vw), black calc(100% - (100vw - var(--width-content-width)) / 2 - 5vw), transparent calc(100% - (100vw - var(--width-content-width)) / 4), transparent 100%);
mask-image: linear-gradient(to right, transparent 0%, transparent calc((100vw - var(--width-content-width)) / 4), black calc((100vw - var(--width-content-width)) / 2 + 5vw), black calc(100% - (100vw - var(--width-content-width)) / 2 - 5vw), transparent calc(100% - (100vw - var(--width-content-width)) / 4), transparent 100%);
}
.mask-padding-x {
-webkit-mask-image: linear-gradient(to right, transparent 0%, black var(--width-x-padding-mask-fade), black calc(100% - var(--width-x-padding-mask-fade)), transparent 100%);
mask-image: linear-gradient(to right, transparent 0%, black var(--width-x-padding-mask-fade), black calc(100% - var(--width-x-padding-mask-fade)), transparent 100%);
}
.mask-fade-bottom {
-webkit-mask-image: linear-gradient(to bottom, black 0%, black 50%, transparent 100%);
mask-image: linear-gradient(to bottom, black 0%, black 50%, transparent 100%);
}
.mask-fade-y {
mask-image: linear-gradient(to bottom,
transparent 0%,
black var(--vw-1_5),
black calc(100% - var(--vw-1_5)),
transparent 100%);
}
.mask-fade-bottom-large {
-webkit-mask-image: linear-gradient(to bottom, black 0%, black 50%, transparent 75%, transparent 100%);
mask-image: linear-gradient(to bottom, black 0%, black 50%, transparent 75%, transparent 100%);
}
.mask-fade-bottom-long {
-webkit-mask-image: linear-gradient(to bottom, black 0%, black 5%, transparent 100%);
mask-image: linear-gradient(to bottom, black 0%, black 5%, transparent 100%);
}
.mask-fade-top-long {
-webkit-mask-image: linear-gradient(to top, black 0%, black 5%, transparent 100%);
mask-image: linear-gradient(to top, black 0%, black 5%, transparent 100%);
}
.mask-fade-xy {
-webkit-mask-image:
linear-gradient(to right, transparent 0%, black 20%, black 80%, transparent 100%),
linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%);
mask-image:
linear-gradient(to right, transparent 0%, black 20%, black 80%, transparent 100%),
linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%);
-webkit-mask-composite: source-in;
mask-composite: intersect;
}
/* ANIMATION */
.animation-container {
animation:
fadeInOpacity 0.8s ease-in-out forwards,
fadeInTranslate 0.6s forwards;
}
.animation-container-fade {
animation: fadeInOpacity 0.8s ease-in-out forwards;
}
@keyframes fadeInOpacity {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadeInTranslate {
from {
transform: translateY(0.75vh);
}
to {
transform: translateY(0vh);
}
}
@keyframes aurora {
from {
background-position: 50% 50%, 50% 50%;
}
to {
background-position: 350% 50%, 350% 50%;
}
}
@keyframes spin-slow {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes spin-reverse {
from {
transform: rotate(0deg);
}
to {
transform: rotate(-360deg);
}
}
.animate-spin-slow {
animation: spin-slow 15s linear infinite;
}
.animate-spin-reverse {
animation: spin-reverse 10s linear infinite;
}
@keyframes marquee-vertical {
from {
transform: translateY(0);
}
to {
transform: translateY(-50%);
}
}
.animate-marquee-vertical {
animation: marquee-vertical 20s linear infinite;
}
@keyframes orbit {
from {
transform: rotate(var(--initial-position, 0deg)) translateX(var(--translate-position, 120px)) rotate(calc(-1 * var(--initial-position, 0deg)));
}
to {
transform: rotate(calc(var(--initial-position, 0deg) + 360deg)) translateX(var(--translate-position, 120px)) rotate(calc(-1 * (var(--initial-position, 0deg) + 360deg)));
}
}
@keyframes map-dot-pulse {
0%, 100% {
transform: scale(0.4);
opacity: 0.6;
}
50% {
transform: scale(1.4);
opacity: 1;
}
}
}
* {
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 1) rgba(255, 255, 255, 0);
}
html {
overscroll-behavior: none;
overscroll-behavior-y: none;
}
body {
background-color: var(--background);
color: var(--foreground);
font-family: var(--font-lato), sans-serif;
position: relative;
min-height: 100vh;
overscroll-behavior: none;
overscroll-behavior-y: none;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: var(--font-lato), sans-serif;
}

1266
src/app/layout.tsx Normal file

File diff suppressed because it is too large Load Diff

198
src/app/page.tsx Normal file
View File

@@ -0,0 +1,198 @@
"use client"
import NavbarStyleCentered from '@/components/navbar/NavbarStyleCentered/NavbarStyleCentered';
import HeroBillboardScroll from '@/components/sections/hero/HeroBillboardScroll';
import AboutMetric from '@/components/sections/about/AboutMetric';
import ProductCardTwo from '@/components/sections/product/ProductCardTwo';
import FeatureCardSixteen from '@/components/sections/feature/FeatureCardSixteen';
import TestimonialCardTen from '@/components/sections/testimonial/TestimonialCardTen';
import ContactCenter from '@/components/sections/contact/ContactCenter';
import FooterMedia from '@/components/sections/footer/FooterMedia';
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import { Coffee, Heart, Award, Users, Clock, Sparkles, MessageCircle } from "lucide-react";
export default function LandingPage() {
return (
<ThemeProvider
defaultButtonVariant="text-stagger"
defaultTextAnimation="background-highlight"
borderRadius="soft"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="none"
cardStyle="subtle-shadow"
primaryButtonStyle="gradient"
secondaryButtonStyle="solid"
headingFontWeight="bold"
>
<div id="nav" data-section="nav">
<NavbarStyleCentered
brandName="Inia"
navItems={[
{ name: "Home", id: "home" },
{ name: "About", id: "about" },
{ name: "Menu", id: "menu" },
{ name: "Testimonials", id: "testimonials" },
{ name: "Contact", id: "contact" }
]}
button={{
text: "Reserve Table", href: "contact"
}}
/>
</div>
<div id="hero" data-section="hero">
<HeroBillboardScroll
title="Welcome to Inia Coffee Shop"
description="Discover the perfect blend of premium coffee, cozy ambiance, and exceptional service. Experience every sip of our carefully crafted beverages made with passion and the finest ingredients."
tag="Artisan Coffee Roastery"
tagIcon={Coffee}
background={{ variant: "radial-gradient" }}
imageSrc="https://img.b2bpic.net/free-photo/multilayer-coffee-glass-with-cookie-saucer_23-2147908388.jpg"
imageAlt="Inia Coffee Shop Hero"
buttons={[
{ text: "Explore Menu", href: "menu" },
{ text: "Make a Reservation", href: "contact" }
]}
/>
</div>
<div id="about" data-section="about">
<AboutMetric
title="Inia: Where Passion Meets Perfection in Every Cup"
useInvertedBackground="invertDefault"
metrics={[
{ icon: Heart, label: "Coffee Lovers Served", value: "50K+" },
{ icon: Award, label: "Premium Beans Selected", value: "12" },
{ icon: Users, label: "Expert Baristas", value: "15" },
{ icon: Clock, label: "Years of Excellence", value: "8" }
]}
/>
</div>
<div id="menu" data-section="menu">
<ProductCardTwo
title="Our Signature Drinks"
description="Handcrafted beverages made with premium beans and attention to detail. Each drink is a masterpiece created by our expert baristas."
tag="Featured Menu"
tagIcon={Sparkles}
textboxLayout="default"
useInvertedBackground="noInvert"
products={[
{
id: "1", brand: "Inia Classic", name: "Latte Art Perfection", price: "$5.50", rating: 5,
reviewCount: "234", imageSrc: "https://img.b2bpic.net/free-photo/artsy-girl-having-cup-coffee_53876-99962.jpg", imageAlt: "Latte with beautiful latte art"
},
{
id: "2", brand: "Inia Premium", name: "Cappuccino Elegante", price: "$6.00", rating: 5,
reviewCount: "189", imageSrc: "https://img.b2bpic.net/free-photo/white-ceramic-mug-with-coffee_209848-35.jpg", imageAlt: "Rich cappuccino with perfect foam"
},
{
id: "3", brand: "Inia Refresh", name: "Cold Brew Delight", price: "$5.00", rating: 5,
reviewCount: "156", imageSrc: "https://img.b2bpic.net/free-photo/people-serve-beautiful-fresh-relax-morning-coffee-cup-set_1150-7058.jpg", imageAlt: "Iced cold brew on a hot day"
}
]}
gridVariant="three-columns-all-equal-width"
animationType="slide-up"
buttons={[
{ text: "View Full Menu", href: "#" }
]}
/>
</div>
<div id="features" data-section="features">
<FeatureCardSixteen
title="Why Choose Inia Coffee"
description="We believe exceptional coffee deserves exceptional care. Here's what sets us apart from other coffee shops."
tag="Our Promise"
textboxLayout="default"
useInvertedBackground="invertDefault"
negativeCard={{
items: [
"Mass-produced beans", "Rushed preparation", "Inconsistent quality", "Limited customization", "Impersonal service"
]
}}
positiveCard={{
items: [
"Ethically sourced premium beans", "Hand-crafted with precision", "Consistent excellence every time", "Personalized drink creation", "Expert barista guidance"
]
}}
animationType="slide-up"
/>
</div>
<div id="testimonials" data-section="testimonials">
<TestimonialCardTen
title="Loved by Coffee Enthusiasts"
description="See what our valued customers have to say about their Inia experience"
tag="Customer Stories"
textboxLayout="default"
useInvertedBackground="noInvert"
testimonials={[
{
id: "1", title: "My New Favorite Morning Ritual", quote: "The moment I walked into Inia, I knew I'd found my new favorite spot. The baristas really know their craft, and every drink tastes like it's been made with love. I can't start my day without their espresso now!", name: "Sarah Mitchell", role: "Regular Customer", imageSrc: "https://img.b2bpic.net/free-photo/closeup-shot-handsome-male-smiling_181624-41237.jpg", imageAlt: "Sarah Mitchell"
},
{
id: "2", title: "Quality Beyond Expectation", quote: "What impressed me most is the attention to detail. From bean selection to the final presentation, everything at Inia screams quality. The cold brew is absolutely divine, and the staff treats you like family.", name: "James Rodriguez", role: "Coffee Connoisseur", imageSrc: "https://img.b2bpic.net/free-photo/smiling-african-american-man-posing-library_74855-1619.jpg", imageAlt: "James Rodriguez"
},
{
id: "3", title: "Perfect Place to Work and Relax", quote: "I've been working from Inia for months now, and I love everything about it. The wifi is reliable, the seating is comfortable, and the atmosphere is inspiring. Plus, the cappuccinos keep me energized all day!", name: "Emily Chen", role: "Remote Professional", imageSrc: "https://img.b2bpic.net/free-photo/front-view-cute-girl-looking-away_23-2148436134.jpg", imageAlt: "Emily Chen"
},
{
id: "4", title: "Best Coffee Experience Ever", quote: "Inia has completely changed how I appreciate coffee. The baristas took time to explain the origins of each bean and helped me discover new flavors. This is more than just coffee; it's an experience.", name: "Michael Thompson", role: "Business Owner", imageSrc: "https://img.b2bpic.net/free-photo/medium-shot-man-correcting-grammar-mistakes_23-2150171372.jpg", imageAlt: "Michael Thompson"
}
]}
/>
</div>
<div id="contact" data-section="contact">
<ContactCenter
tag="Get In Touch"
tagIcon={MessageCircle}
title="Visit Inia Coffee Shop Today"
description="Join us for an unforgettable coffee experience. Reserve your table or subscribe to our newsletter for exclusive offers and new menu announcements."
background={{ variant: "sparkles-gradient" }}
useInvertedBackground="invertDefault"
inputPlaceholder="Your email address"
buttonText="Subscribe Now"
termsText="We respect your privacy. Unsubscribe anytime. Check out our privacy policy for more info."
/>
</div>
<div id="footer" data-section="footer">
<FooterMedia
imageSrc="https://img.b2bpic.net/free-photo/top-view-coffee-beans_23-2148173325.jpg"
imageAlt="Premium coffee beans"
logoText="Inia Coffee Shop"
copyrightText="© 2025 Inia Coffee Shop. All rights reserved."
columns={[
{
title: "Menu", items: [
{ label: "Espresso Drinks", href: "#" },
{ label: "Cold Beverages", href: "#" },
{ label: "Pastries & Snacks", href: "#" },
{ label: "Limited Editions", href: "#" }
]
},
{
title: "Visit Us", items: [
{ label: "Hours", href: "#" },
{ label: "Location", href: "#" },
{ label: "Reservations", href: "#" },
{ label: "Contact", href: "#" }
]
},
{
title: "More", items: [
{ label: "About Inia", href: "#" },
{ label: "Our Story", href: "#" },
{ label: "Sustainability", href: "#" },
{ label: "Press Kit", href: "#" }
]
}
]}
/>
</div>
</ThemeProvider>
);
}

292
src/app/shop/[id]/page.tsx Normal file
View File

@@ -0,0 +1,292 @@
"use client";
import { use, useCallback } from "react";
import { useRouter } from "next/navigation";
import ReactLenis from "lenis/react";
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleCentered from '@/components/navbar/NavbarStyleCentered/NavbarStyleCentered';
import FooterMedia from '@/components/sections/footer/FooterMedia';
import ProductDetailCard from "@/components/ecommerce/productDetail/ProductDetailCard";
import ProductCart from "@/components/ecommerce/cart/ProductCart";
import { useProductDetail } from "@/hooks/useProductDetail";
import { useCart } from "@/hooks/useCart";
import { useCheckout } from "@/hooks/useCheckout";
interface ProductPageProps {
params: Promise<{ id: string }>;
}
export default function ProductPage({ params }: ProductPageProps) {
const { id } = use(params);
const router = useRouter();
const {
product,
isLoading,
images,
meta,
variants,
quantityVariant,
selectedQuantity,
createCartItem,
} = useProductDetail(id);
const {
items: cartItems,
isOpen: cartOpen,
setIsOpen: setCartOpen,
addItem,
updateQuantity,
removeItem,
total: cartTotal,
getCheckoutItems,
} = useCart();
const { buyNow, checkout, isLoading: isCheckoutLoading } = useCheckout();
const handleAddToCart = useCallback(() => {
const item = createCartItem();
if (item) {
addItem(item);
}
}, [createCartItem, addItem]);
const handleBuyNow = useCallback(() => {
if (product) {
buyNow(product, selectedQuantity);
}
}, [product, selectedQuantity, buyNow]);
const handleCheckout = useCallback(async () => {
if (cartItems.length === 0) return;
const currentUrl = new URL(window.location.href);
currentUrl.searchParams.set("success", "true");
await checkout(getCheckoutItems(), { successUrl: currentUrl.toString() });
}, [cartItems, checkout, getCheckoutItems]);
if (isLoading) {
return (
<ThemeProvider
defaultButtonVariant="text-stagger"
defaultTextAnimation="background-highlight"
borderRadius="soft"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="none"
cardStyle="subtle-shadow"
primaryButtonStyle="gradient"
secondaryButtonStyle="solid"
headingFontWeight="bold"
>
<ReactLenis root>
<NavbarStyleCentered
brandName="Inia"
navItems={[
{ name: "Home", id: "/" },
{ name: "Shop", id: "/shop" }
]}
button={{ text: "Reserve Table", href: "contact" }}
/>
<main className="min-h-screen flex items-center justify-center pt-20">
<p className="text-foreground">Loading product...</p>
</main>
<FooterMedia
imageSrc="asset://footer-coffee-beans"
imageAlt="Premium coffee beans"
logoText="Inia Coffee Shop"
copyrightText="© 2025 Inia Coffee Shop. All rights reserved."
columns={[
{
title: "Menu", items: [
{ label: "Espresso Drinks", href: "#" },
{ label: "Cold Beverages", href: "#" },
{ label: "Pastries & Snacks", href: "#" },
{ label: "Limited Editions", href: "#" }
]
},
{
title: "Visit Us", items: [
{ label: "Hours", href: "#" },
{ label: "Location", href: "#" },
{ label: "Reservations", href: "#" },
{ label: "Contact", href: "#" }
]
},
{
title: "More", items: [
{ label: "About Inia", href: "#" },
{ label: "Our Story", href: "#" },
{ label: "Sustainability", href: "#" },
{ label: "Press Kit", href: "#" }
]
}
]}
/>
</ReactLenis>
</ThemeProvider>
);
}
if (!product) {
return (
<ThemeProvider
defaultButtonVariant="text-stagger"
defaultTextAnimation="background-highlight"
borderRadius="soft"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="none"
cardStyle="subtle-shadow"
primaryButtonStyle="gradient"
secondaryButtonStyle="solid"
headingFontWeight="bold"
>
<ReactLenis root>
<NavbarStyleCentered
brandName="Inia"
navItems={[
{ name: "Home", id: "/" },
{ name: "Shop", id: "/shop" }
]}
button={{ text: "Reserve Table", href: "contact" }}
/>
<main className="min-h-screen flex items-center justify-center pt-20">
<div className="text-center">
<p className="text-foreground mb-4">Product not found</p>
<button
onClick={() => router.push("/shop")}
className="primary-button px-6 py-2 rounded-theme"
>
Back to Shop
</button>
</div>
</main>
<FooterMedia
imageSrc="asset://footer-coffee-beans"
imageAlt="Premium coffee beans"
logoText="Inia Coffee Shop"
copyrightText="© 2025 Inia Coffee Shop. All rights reserved."
columns={[
{
title: "Menu", items: [
{ label: "Espresso Drinks", href: "#" },
{ label: "Cold Beverages", href: "#" },
{ label: "Pastries & Snacks", href: "#" },
{ label: "Limited Editions", href: "#" }
]
},
{
title: "Visit Us", items: [
{ label: "Hours", href: "#" },
{ label: "Location", href: "#" },
{ label: "Reservations", href: "#" },
{ label: "Contact", href: "#" }
]
},
{
title: "More", items: [
{ label: "About Inia", href: "#" },
{ label: "Our Story", href: "#" },
{ label: "Sustainability", href: "#" },
{ label: "Press Kit", href: "#" }
]
}
]}
/>
</ReactLenis>
</ThemeProvider>
);
}
return (
<ThemeProvider
defaultButtonVariant="text-stagger"
defaultTextAnimation="background-highlight"
borderRadius="soft"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="none"
cardStyle="subtle-shadow"
primaryButtonStyle="gradient"
secondaryButtonStyle="solid"
headingFontWeight="bold"
>
<ReactLenis root>
<NavbarStyleCentered
brandName="Inia"
navItems={[
{ name: "Home", id: "/" },
{ name: "Shop", id: "/shop" }
]}
button={{ text: "Reserve Table", href: "contact" }}
/>
<ProductDetailCard
layout="page"
name={product.name}
price={product.price}
salePrice={meta.salePrice}
rating={product.rating || 0}
description={product.description}
images={images}
variants={variants.length > 0 ? variants : undefined}
quantity={quantityVariant}
ribbon={meta.ribbon}
inventoryStatus={meta.inventoryStatus}
inventoryQuantity={meta.inventoryQuantity}
sku={meta.sku}
buttons={[
{ text: "Add To Cart", onClick: handleAddToCart },
{ text: "Buy Now", onClick: handleBuyNow },
]}
/>
<ProductCart
isOpen={cartOpen}
onClose={() => setCartOpen(false)}
items={cartItems}
onQuantityChange={updateQuantity}
onRemove={removeItem}
total={`$${cartTotal}`}
buttons={[
{
text: isCheckoutLoading ? "Processing..." : "Check Out", onClick: handleCheckout,
},
]}
/>
<FooterMedia
imageSrc="asset://footer-coffee-beans"
imageAlt="Premium coffee beans"
logoText="Inia Coffee Shop"
copyrightText="© 2025 Inia Coffee Shop. All rights reserved."
columns={[
{
title: "Menu", items: [
{ label: "Espresso Drinks", href: "#" },
{ label: "Cold Beverages", href: "#" },
{ label: "Pastries & Snacks", href: "#" },
{ label: "Limited Editions", href: "#" }
]
},
{
title: "Visit Us", items: [
{ label: "Hours", href: "#" },
{ label: "Location", href: "#" },
{ label: "Reservations", href: "#" },
{ label: "Contact", href: "#" }
]
},
{
title: "More", items: [
{ label: "About Inia", href: "#" },
{ label: "Our Story", href: "#" },
{ label: "Sustainability", href: "#" },
{ label: "Press Kit", href: "#" }
]
}
]}
/>
</ReactLenis>
</ThemeProvider>
);
}

148
src/app/shop/page.tsx Normal file
View File

@@ -0,0 +1,148 @@
"use client";
import ReactLenis from "lenis/react";
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleCentered from '@/components/navbar/NavbarStyleCentered/NavbarStyleCentered';
import FooterMedia from '@/components/sections/footer/FooterMedia';
import ProductCatalog from "@/components/ecommerce/productCatalog/ProductCatalog";
import { useProductCatalog } from "@/hooks/useProductCatalog";
export default function ShopPage() {
const {
products,
isLoading,
search,
setSearch,
filters,
} = useProductCatalog({ basePath: "/shop" });
if (isLoading) {
return (
<ThemeProvider
defaultButtonVariant="text-stagger"
defaultTextAnimation="background-highlight"
borderRadius="soft"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="none"
cardStyle="subtle-shadow"
primaryButtonStyle="gradient"
secondaryButtonStyle="solid"
headingFontWeight="bold"
>
<ReactLenis root>
<NavbarStyleCentered
brandName="Inia"
navItems={[
{ name: "Home", id: "/" },
{ name: "Shop", id: "/shop" }
]}
button={{ text: "Reserve Table", href: "contact" }}
/>
<main className="min-h-screen flex items-center justify-center pt-20">
<p className="text-foreground">Loading products...</p>
</main>
<FooterMedia
imageSrc="asset://footer-coffee-beans"
imageAlt="Premium coffee beans"
logoText="Inia Coffee Shop"
copyrightText="© 2025 Inia Coffee Shop. All rights reserved."
columns={[
{
title: "Menu", items: [
{ label: "Espresso Drinks", href: "#" },
{ label: "Cold Beverages", href: "#" },
{ label: "Pastries & Snacks", href: "#" },
{ label: "Limited Editions", href: "#" }
]
},
{
title: "Visit Us", items: [
{ label: "Hours", href: "#" },
{ label: "Location", href: "#" },
{ label: "Reservations", href: "#" },
{ label: "Contact", href: "#" }
]
},
{
title: "More", items: [
{ label: "About Inia", href: "#" },
{ label: "Our Story", href: "#" },
{ label: "Sustainability", href: "#" },
{ label: "Press Kit", href: "#" }
]
}
]}
/>
</ReactLenis>
</ThemeProvider>
);
}
return (
<ThemeProvider
defaultButtonVariant="text-stagger"
defaultTextAnimation="background-highlight"
borderRadius="soft"
contentWidth="compact"
sizing="largeSmallSizeMediumTitles"
background="none"
cardStyle="subtle-shadow"
primaryButtonStyle="gradient"
secondaryButtonStyle="solid"
headingFontWeight="bold"
>
<ReactLenis root>
<NavbarStyleCentered
brandName="Inia"
navItems={[
{ name: "Home", id: "/" },
{ name: "Shop", id: "/shop" }
]}
button={{ text: "Reserve Table", href: "contact" }}
/>
<ProductCatalog
layout="page"
products={products}
searchValue={search}
onSearchChange={setSearch}
searchPlaceholder="Search products..."
filters={filters}
emptyMessage="No products found"
/>
<FooterMedia
imageSrc="asset://footer-coffee-beans"
imageAlt="Premium coffee beans"
logoText="Inia Coffee Shop"
copyrightText="© 2025 Inia Coffee Shop. All rights reserved."
columns={[
{
title: "Menu", items: [
{ label: "Espresso Drinks", href: "#" },
{ label: "Cold Beverages", href: "#" },
{ label: "Pastries & Snacks", href: "#" },
{ label: "Limited Editions", href: "#" }
]
},
{
title: "Visit Us", items: [
{ label: "Hours", href: "#" },
{ label: "Location", href: "#" },
{ label: "Reservations", href: "#" },
{ label: "Contact", href: "#" }
]
},
{
title: "More", items: [
{ label: "About Inia", href: "#" },
{ label: "Our Story", href: "#" },
{ label: "Sustainability", href: "#" },
{ label: "Press Kit", href: "#" }
]
}
]}
/>
</ReactLenis>
</ThemeProvider>
);
}