Initial commit
This commit is contained in:
2
.env
Normal file
2
.env
Normal file
@@ -0,0 +1,2 @@
|
||||
NEXT_PUBLIC_API_URL=https://dev.api.webild.io
|
||||
NEXT_PUBLIC_PROJECT_ID=04e93b3d-d169-42b5-bb43-259600607b9c
|
||||
57
.gitea/workflows/build.yml
Normal file
57
.gitea/workflows/build.yml
Normal file
@@ -0,0 +1,57 @@
|
||||
name: Code Check
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: 'Branch to check'
|
||||
required: true
|
||||
default: 'main'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
|
||||
steps:
|
||||
- name: Checkout branch
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ gitea.event.inputs.branch }}
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 24
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
npm ci --prefer-offline --no-audit 2>&1 | tee install.log
|
||||
env:
|
||||
NODE_OPTIONS: '--max-old-space-size=4096'
|
||||
|
||||
- name: TypeScript check
|
||||
run: |
|
||||
set -euo pipefail
|
||||
npm run typecheck 2>&1 | tee build.log
|
||||
|
||||
- name: ESLint check
|
||||
run: |
|
||||
set -euo pipefail
|
||||
npm run lint 2>&1 | tee build.log
|
||||
|
||||
- name: Upload build log on failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: build-log
|
||||
path: build.log
|
||||
if-no-files-found: ignore
|
||||
|
||||
- name: Check completed
|
||||
if: success()
|
||||
run: echo "Typecheck and lint passed successfully"
|
||||
87
src/app/blog/page.tsx
Normal file
87
src/app/blog/page.tsx
Normal file
@@ -0,0 +1,87 @@
|
||||
"use client";
|
||||
|
||||
import ReactLenis from "lenis/react";
|
||||
import BlogCardThree from '@/components/sections/blog/BlogCardThree';
|
||||
import FooterLogoEmphasis from '@/components/sections/footer/FooterLogoEmphasis';
|
||||
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
|
||||
import NavbarLayoutFloatingOverlay from '@/components/navbar/NavbarLayoutFloatingOverlay/NavbarLayoutFloatingOverlay';
|
||||
import { useBlogPosts } from "@/hooks/useBlogPosts";
|
||||
|
||||
export default function BlogPage() {
|
||||
const { posts, isLoading } = useBlogPosts();
|
||||
|
||||
return (
|
||||
<ThemeProvider
|
||||
defaultButtonVariant="bounce-effect"
|
||||
defaultTextAnimation="entrance-slide"
|
||||
borderRadius="pill"
|
||||
contentWidth="smallMedium"
|
||||
sizing="mediumLargeSizeLargeTitles"
|
||||
background="circleGradient"
|
||||
cardStyle="subtle-shadow"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="radial-glow"
|
||||
headingFontWeight="light"
|
||||
>
|
||||
<ReactLenis root>
|
||||
<div className="min-h-screen bg-background">
|
||||
<NavbarLayoutFloatingOverlay
|
||||
brandName="BrewMoment"
|
||||
navItems={[
|
||||
{ name: "Home", id: "/" },
|
||||
{ name: "Products", id: "products" },
|
||||
{ name: "About", id: "about" },
|
||||
{ name: "Testimonials", id: "testimonials" },
|
||||
{ name: "Contact", id: "contact" }
|
||||
]}
|
||||
button={{ text: "Order Now", href: "contact" }}
|
||||
/>
|
||||
|
||||
{isLoading ? (
|
||||
<div className="w-content-width mx-auto py-20 text-center">
|
||||
<p className="text-foreground">Loading posts...</p>
|
||||
</div>
|
||||
) : (
|
||||
<BlogCardThree
|
||||
blogs={posts}
|
||||
title="Coffee Stories & Brewing Tips"
|
||||
description="Discover the art of coffee brewing with expert insights, seasonal blends, and behind-the-scenes stories from our coffee artisans"
|
||||
tag="Blog"
|
||||
textboxLayout="default"
|
||||
useInvertedBackground="noInvert"
|
||||
animationType="slide-up"
|
||||
carouselMode="buttons"
|
||||
/>
|
||||
)}
|
||||
|
||||
<FooterLogoEmphasis
|
||||
logoText="BrewMoment"
|
||||
columns={[
|
||||
{
|
||||
items: [
|
||||
{ label: "Home", href: "hero" },
|
||||
{ label: "Products", href: "products" },
|
||||
{ label: "About Us", href: "about" }
|
||||
]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
{ label: "Contact", href: "contact" },
|
||||
{ label: "Privacy Policy", href: "#" },
|
||||
{ label: "Terms of Service", href: "#" }
|
||||
]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
{ label: "Follow Us", href: "#" },
|
||||
{ label: "Instagram", href: "#" },
|
||||
{ label: "Facebook", href: "#" }
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
</ReactLenis>
|
||||
</ThemeProvider>
|
||||
);
|
||||
}
|
||||
5
src/app/globals.css
Normal file
5
src/app/globals.css
Normal file
@@ -0,0 +1,5 @@
|
||||
@import "tailwindcss";
|
||||
@import "./styles/variables.css";
|
||||
@import "./styles/theme.css";
|
||||
@import "./styles/utilities.css";
|
||||
@import "./styles/base.css";
|
||||
1268
src/app/layout.tsx
Normal file
1268
src/app/layout.tsx
Normal file
File diff suppressed because it is too large
Load Diff
232
src/app/page.tsx
Normal file
232
src/app/page.tsx
Normal file
@@ -0,0 +1,232 @@
|
||||
"use client"
|
||||
|
||||
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
|
||||
import NavbarLayoutFloatingOverlay from '@/components/navbar/NavbarLayoutFloatingOverlay/NavbarLayoutFloatingOverlay';
|
||||
import HeroBillboardRotatedCarousel from '@/components/sections/hero/HeroBillboardRotatedCarousel';
|
||||
import ProductCardOne from '@/components/sections/product/ProductCardOne';
|
||||
import MediaSplitTabsAbout from '@/components/sections/about/MediaSplitTabsAbout';
|
||||
import TestimonialCardFifteen from '@/components/sections/testimonial/TestimonialCardFifteen';
|
||||
import MetricCardOne from '@/components/sections/metrics/MetricCardOne';
|
||||
import ContactSplitForm from '@/components/sections/contact/ContactSplitForm';
|
||||
import FooterLogoEmphasis from '@/components/sections/footer/FooterLogoEmphasis';
|
||||
import { Coffee, Sparkles, Users, Globe, Award, Leaf } from "lucide-react";
|
||||
|
||||
export default function LandingPage() {
|
||||
return (
|
||||
<ThemeProvider
|
||||
defaultButtonVariant="bounce-effect"
|
||||
defaultTextAnimation="entrance-slide"
|
||||
borderRadius="pill"
|
||||
contentWidth="smallMedium"
|
||||
sizing="mediumLargeSizeLargeTitles"
|
||||
background="circleGradient"
|
||||
cardStyle="subtle-shadow"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="radial-glow"
|
||||
headingFontWeight="light"
|
||||
>
|
||||
<div id="nav" data-section="nav">
|
||||
<NavbarLayoutFloatingOverlay
|
||||
brandName="BrewMoment"
|
||||
navItems={[
|
||||
{ name: "Home", id: "hero" },
|
||||
{ name: "Products", id: "products" },
|
||||
{ name: "About", id: "about" },
|
||||
{ name: "Testimonials", id: "testimonials" },
|
||||
{ name: "Contact", id: "contact" }
|
||||
]}
|
||||
button={{
|
||||
text: "Order Now", href: "contact"
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="hero" data-section="hero">
|
||||
<HeroBillboardRotatedCarousel
|
||||
title="Craft Your Perfect Cup"
|
||||
description="Experience the finest specialty coffee made with passion, precision, and the highest quality beans from around the world."
|
||||
tag="Premium Coffee"
|
||||
tagIcon={Coffee}
|
||||
background={{ variant: "plain" }}
|
||||
buttons={[
|
||||
{ text: "Browse Menu", href: "products" },
|
||||
{ text: "Learn More", href: "about" }
|
||||
]}
|
||||
carouselItems={[
|
||||
{
|
||||
id: "1", imageSrc: "https://img.b2bpic.net/free-photo/leftover-coffee-black-cup-window-sill_23-2147898257.jpg", imageAlt: "Freshly pulled espresso shot"
|
||||
},
|
||||
{
|
||||
id: "2", imageSrc: "https://img.b2bpic.net/free-photo/close-up-aromatic-coffee-plate_23-2148349623.jpg", imageAlt: "Creamy cappuccino with latte art"
|
||||
},
|
||||
{
|
||||
id: "3", imageSrc: "https://img.b2bpic.net/free-photo/cup-hot-espresso-coffee-takeaway-paper-cup-stone-table-cafe-monotone-background-with-copy-space-coffee-break_166373-3732.jpg", imageAlt: "Refreshing cold brew coffee"
|
||||
},
|
||||
{
|
||||
id: "4", imageSrc: "https://img.b2bpic.net/free-photo/male-barista-preparing-coffee_23-2148824432.jpg", imageAlt: "Coffee shop ambiance"
|
||||
},
|
||||
{
|
||||
id: "5", imageSrc: "https://img.b2bpic.net/free-photo/leftover-coffee-black-cup-window-sill_23-2147898257.jpg", imageAlt: "Premium espresso blend"
|
||||
},
|
||||
{
|
||||
id: "6", imageSrc: "https://img.b2bpic.net/free-photo/close-up-aromatic-coffee-plate_23-2148349623.jpg", imageAlt: "Artisanal coffee creation"
|
||||
}
|
||||
]}
|
||||
autoPlay={true}
|
||||
autoPlayInterval={4000}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="products" data-section="products">
|
||||
<ProductCardOne
|
||||
title="Our Premium Selection"
|
||||
description="Handcrafted beverages made with meticulous attention to detail and the finest ingredients available."
|
||||
tag="Best Sellers"
|
||||
tagIcon={Sparkles}
|
||||
textboxLayout="default"
|
||||
animationType="slide-up"
|
||||
useInvertedBackground="noInvert"
|
||||
gridVariant="three-columns-all-equal-width"
|
||||
products={[
|
||||
{
|
||||
id: "1", name: "Single Origin Espresso", price: "$4.50", imageSrc: "https://img.b2bpic.net/free-photo/leftover-coffee-black-cup-window-sill_23-2147898257.jpg", imageAlt: "Single Origin Espresso"
|
||||
},
|
||||
{
|
||||
id: "2", name: "Signature Cappuccino", price: "$5.50", imageSrc: "https://img.b2bpic.net/free-photo/close-up-aromatic-coffee-plate_23-2148349623.jpg", imageAlt: "Signature Cappuccino"
|
||||
},
|
||||
{
|
||||
id: "3", name: "Iced Cold Brew", price: "$4.75", imageSrc: "https://img.b2bpic.net/free-photo/cup-hot-espresso-coffee-takeaway-paper-cup-stone-table-cafe-monotone-background-with-copy-space-coffee-break_166373-3732.jpg", imageAlt: "Iced Cold Brew"
|
||||
}
|
||||
]}
|
||||
carouselMode="buttons"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<MediaSplitTabsAbout
|
||||
title="Our Coffee Story"
|
||||
description="Discover the passion and craftsmanship behind every cup."
|
||||
tabs={[
|
||||
{
|
||||
id: "sourcing", label: "Ethical Sourcing", description: "We partner directly with sustainable coffee farms around the globe, ensuring fair wages and environmentally responsible practices. Every bean tells a story of dedication and quality."
|
||||
},
|
||||
{
|
||||
id: "roasting", label: "Expert Roasting", description: "Our in-house roastery uses traditional methods combined with precision technology to bring out the unique flavor profiles of each origin, creating the perfect roast every single time."
|
||||
},
|
||||
{
|
||||
id: "community", label: "Community Focus", description: "More than just coffee, we're building a community. Our space is designed for connection, collaboration, and celebrating the simple joy of a perfectly crafted beverage."
|
||||
}
|
||||
]}
|
||||
imageSrc="https://img.b2bpic.net/free-photo/empty-wood-chair-restaurant_1339-5949.jpg"
|
||||
imageAlt="Our cozy coffee shop interior with welcoming atmosphere"
|
||||
imagePosition="right"
|
||||
useInvertedBackground="invertDefault"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<TestimonialCardFifteen
|
||||
testimonial="BrewMoment has completely transformed my morning routine. The quality of the coffee is unmatched, and the atmosphere makes me want to stay all day. Highly recommended!"
|
||||
rating={5}
|
||||
author="Sarah Mitchell, Coffee Enthusiast"
|
||||
avatars={[
|
||||
{
|
||||
src: "https://img.b2bpic.net/free-photo/office-worker-using-cell-phone-work_329181-20159.jpg", alt: "Sarah Mitchell"
|
||||
},
|
||||
{
|
||||
src: "https://img.b2bpic.net/free-photo/smiling-woman_23-2147615403.jpg", alt: "Customer testimonial"
|
||||
},
|
||||
{
|
||||
src: "https://img.b2bpic.net/free-photo/young-businessman-happy-expression_1194-1563.jpg", alt: "Customer testimonial"
|
||||
},
|
||||
{
|
||||
src: "https://img.b2bpic.net/free-photo/smiling-young-professional-businesswoman-looking-upper-left-corner-with-hopeful-face-expression-standing-white_176420-41313.jpg", alt: "Customer testimonial"
|
||||
}
|
||||
]}
|
||||
useInvertedBackground="noInvert"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<MetricCardOne
|
||||
title="Our Impact"
|
||||
description="Join thousands of coffee lovers who have discovered their perfect brew."
|
||||
textboxLayout="default"
|
||||
animationType="slide-up"
|
||||
useInvertedBackground="invertDefault"
|
||||
gridVariant="uniform-all-items-equal"
|
||||
metrics={[
|
||||
{
|
||||
id: "1", value: "5K+", title: "Happy Customers", description: "Daily coffee enthusiasts enjoying our blends", icon: Users
|
||||
},
|
||||
{
|
||||
id: "2", value: "15", title: "Origins", description: "Premium coffee sources from around the world", icon: Globe
|
||||
},
|
||||
{
|
||||
id: "3", value: "8", title: "Years", description: "Of dedicated coffee craftsmanship", icon: Award
|
||||
},
|
||||
{
|
||||
id: "4", value: "100%", title: "Sustainable", description: "Ethically sourced and environmentally conscious", icon: Leaf
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<ContactSplitForm
|
||||
title="Get in Touch"
|
||||
description="Have questions about our coffee or want to place a special order? We'd love to hear from you. Reach out anytime and we'll respond within 24 hours."
|
||||
inputs={[
|
||||
{
|
||||
name: "name", type: "text", placeholder: "Your Name", required: true
|
||||
},
|
||||
{
|
||||
name: "email", type: "email", placeholder: "Your Email", required: true
|
||||
},
|
||||
{
|
||||
name: "phone", type: "tel", placeholder: "Phone Number", required: false
|
||||
}
|
||||
]}
|
||||
textarea={{
|
||||
name: "message", placeholder: "Tell us about your coffee preferences or questions...", rows: 5,
|
||||
required: true
|
||||
}}
|
||||
useInvertedBackground="noInvert"
|
||||
imageSrc="https://img.b2bpic.net/free-photo/different-office-stationery-arranged-white-table-co-working-office_285396-1793.jpg"
|
||||
imageAlt="Coffee shop setup and brewing equipment"
|
||||
mediaPosition="right"
|
||||
buttonText="Send Message"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="footer" data-section="footer">
|
||||
<FooterLogoEmphasis
|
||||
logoText="BrewMoment"
|
||||
columns={[
|
||||
{
|
||||
items: [
|
||||
{ label: "Home", href: "hero" },
|
||||
{ label: "Products", href: "products" },
|
||||
{ label: "About Us", href: "about" }
|
||||
]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
{ label: "Contact", href: "contact" },
|
||||
{ label: "Privacy Policy", href: "#" },
|
||||
{ label: "Terms of Service", href: "#" }
|
||||
]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
{ label: "Follow Us", href: "#" },
|
||||
{ label: "Instagram", href: "#" },
|
||||
{ label: "Facebook", href: "#" }
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
</ThemeProvider>
|
||||
);
|
||||
}
|
||||
115
src/app/shop/page.tsx
Normal file
115
src/app/shop/page.tsx
Normal file
@@ -0,0 +1,115 @@
|
||||
"use client";
|
||||
|
||||
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
|
||||
import NavbarLayoutFloatingOverlay from '@/components/navbar/NavbarLayoutFloatingOverlay/NavbarLayoutFloatingOverlay';
|
||||
import ProductCardFour from '@/components/sections/product/ProductCardFour';
|
||||
import FooterLogoEmphasis from '@/components/sections/footer/FooterLogoEmphasis';
|
||||
import { Package } from 'lucide-react';
|
||||
|
||||
export default function ShopPage() {
|
||||
const products = [
|
||||
{
|
||||
id: "1", name: "Premium Coffee Blend", price: "$24.99", variant: "Dark Roast • 3 Sizes", imageSrc: "https://images.unsplash.com/photo-1559056199-641a0ac8b55e?w=400&h=400&fit=crop", imageAlt: "Premium Coffee Blend", isFavorited: false,
|
||||
onFavorite: () => console.log("favorited"),
|
||||
onProductClick: () => console.log("product clicked")
|
||||
},
|
||||
{
|
||||
id: "2", name: "Espresso Machine Pro", price: "$299.99", variant: "Stainless Steel • 2 Colors", imageSrc: "https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=400&h=400&fit=crop", imageAlt: "Espresso Machine Pro", isFavorited: true,
|
||||
onFavorite: () => console.log("favorited"),
|
||||
onProductClick: () => console.log("product clicked")
|
||||
},
|
||||
{
|
||||
id: "3", name: "Coffee Grinder Deluxe", price: "$89.99", variant: "Ceramic Burr • 4 Settings", imageSrc: "https://images.unsplash.com/photo-1504627298434-2119d83b2e7a?w=400&h=400&fit=crop", imageAlt: "Coffee Grinder Deluxe", isFavorited: false,
|
||||
onFavorite: () => console.log("favorited"),
|
||||
onProductClick: () => console.log("product clicked")
|
||||
},
|
||||
{
|
||||
id: "4", name: "French Press Classic", price: "$39.99", variant: "Glass • 2 Sizes", imageSrc: "https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=400&h=400&fit=crop", imageAlt: "French Press Classic", isFavorited: false,
|
||||
onFavorite: () => console.log("favorited"),
|
||||
onProductClick: () => console.log("product clicked")
|
||||
},
|
||||
{
|
||||
id: "5", name: "Pour Over Set", price: "$59.99", variant: "Ceramic • 3 Colors", imageSrc: "https://images.unsplash.com/photo-1559056199-641a0ac8b55e?w=400&h=400&fit=crop", imageAlt: "Pour Over Set", isFavorited: true,
|
||||
onFavorite: () => console.log("favorited"),
|
||||
onProductClick: () => console.log("product clicked")
|
||||
},
|
||||
{
|
||||
id: "6", name: "Coffee Storage Canister", price: "$19.99", variant: "Airtight Seal • 4 Sizes", imageSrc: "https://images.unsplash.com/photo-1504627298434-2119d83b2e7a?w=400&h=400&fit=crop", imageAlt: "Coffee Storage Canister", isFavorited: false,
|
||||
onFavorite: () => console.log("favorited"),
|
||||
onProductClick: () => console.log("product clicked")
|
||||
}
|
||||
];
|
||||
|
||||
return (
|
||||
<ThemeProvider
|
||||
defaultButtonVariant="bounce-effect"
|
||||
defaultTextAnimation="entrance-slide"
|
||||
borderRadius="pill"
|
||||
contentWidth="smallMedium"
|
||||
sizing="mediumLargeSizeLargeTitles"
|
||||
background="circleGradient"
|
||||
cardStyle="subtle-shadow"
|
||||
primaryButtonStyle="shadow"
|
||||
secondaryButtonStyle="radial-glow"
|
||||
headingFontWeight="light"
|
||||
>
|
||||
<NavbarLayoutFloatingOverlay
|
||||
brandName="BrewMoment"
|
||||
navItems={[
|
||||
{ name: "Home", id: "/" },
|
||||
{ name: "Shop", id: "/shop" }
|
||||
]}
|
||||
button={{
|
||||
text: "Order Now", href: "contact"
|
||||
}}
|
||||
/>
|
||||
|
||||
<main className="min-h-screen pt-20">
|
||||
<ProductCardFour
|
||||
products={products}
|
||||
title="Our Coffee Collection"
|
||||
description="Discover our premium selection of coffee products, from beans to brewing equipment"
|
||||
tag="Shop Now"
|
||||
tagIcon={Package}
|
||||
textboxLayout="default"
|
||||
gridVariant="three-columns-all-equal-width"
|
||||
animationType="slide-up"
|
||||
useInvertedBackground="noInvert"
|
||||
buttons={[
|
||||
{
|
||||
text: "View All Products", href: "#"
|
||||
},
|
||||
{
|
||||
text: "Filter Products", onClick: () => console.log("filter clicked")
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</main>
|
||||
|
||||
<FooterLogoEmphasis
|
||||
logoText="BrewMoment"
|
||||
columns={[
|
||||
{
|
||||
items: [
|
||||
{ label: "Home", href: "/" },
|
||||
{ label: "Shop", href: "/shop" }
|
||||
]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
{ label: "Privacy Policy", href: "#" },
|
||||
{ label: "Terms of Service", href: "#" }
|
||||
]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
{ label: "Follow Us", href: "#" },
|
||||
{ label: "Instagram", href: "#" },
|
||||
{ label: "Facebook", href: "#" }
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</ThemeProvider>
|
||||
);
|
||||
}
|
||||
5
vercel.json
Normal file
5
vercel.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"installCommand": "npm ci",
|
||||
"buildCommand": "npm run build",
|
||||
"outputDirectory": ".next"
|
||||
}
|
||||
Reference in New Issue
Block a user