diff --git a/next.config.ts b/next.config.ts
index a8d2bf3..63b7117 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -37,6 +37,9 @@ const nextConfig: NextConfig = {
];
},
images: {
+ formats: ["image/avif", "image/webp"],
+ deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048],
+ imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
remotePatterns: [
{
protocol: "https",
@@ -58,8 +61,16 @@ const nextConfig: NextConfig = {
hostname: "**.saleor.cloud",
pathname: "/**",
},
+ {
+ protocol: "https",
+ hostname: "images.unsplash.com",
+ pathname: "/**",
+ },
],
},
+ experimental: {
+ optimizePackageImports: ["lucide-react", "framer-motion"],
+ },
};
export default withNextIntl(nextConfig);
diff --git a/src/app/[locale]/about/page.tsx b/src/app/[locale]/about/page.tsx
index 7a6b977..14f4f84 100644
--- a/src/app/[locale]/about/page.tsx
+++ b/src/app/[locale]/about/page.tsx
@@ -5,6 +5,7 @@ import { getPageMetadata } from "@/lib/i18n/pageMetadata";
import { isValidLocale, DEFAULT_LOCALE, type Locale } from "@/lib/i18n/locales";
import { getPageKeywords } from "@/lib/seo/keywords";
import { Metadata } from "next";
+import Image from "next/image";
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://manoonoils.com";
@@ -67,10 +68,13 @@ export default async function AboutPage({ params }: AboutPageProps) {
-
diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx
index 1cb230a..fdd8c66 100644
--- a/src/app/[locale]/layout.tsx
+++ b/src/app/[locale]/layout.tsx
@@ -60,7 +60,7 @@ export default async function LocaleLayout({
{children}
diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx
index 4905fb9..b75da9a 100644
--- a/src/app/[locale]/page.tsx
+++ b/src/app/[locale]/page.tsx
@@ -14,6 +14,7 @@ import { getPageMetadata } from "@/lib/i18n/pageMetadata";
import { isValidLocale, DEFAULT_LOCALE, getSaleorLocale, type Locale } from "@/lib/i18n/locales";
import { getPageKeywords, getBrandKeywords } from "@/lib/seo/keywords";
import { Metadata } from "next";
+import Image from "next/image";
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://manoonoils.com";
@@ -157,10 +158,12 @@ export default async function Homepage({ params }: { params: Promise<{ locale: s
-
diff --git a/src/app/globals.css b/src/app/globals.css
index 389ff88..bd956ba 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -53,8 +53,7 @@
--color-cta-hover: #333333;
--color-overlay: rgba(0, 0, 0, 0.4);
- --font-display: 'DM Sans', sans-serif;
- --font-body: 'Inter', sans-serif;
+ /* Font variables will be set by next/font in layout.tsx */
--transition-fast: 150ms ease;
--transition-base: 250ms ease;
@@ -66,26 +65,9 @@
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
}
-/* ============================================
- FONT IMPORTS
- ============================================ */
-
-@font-face {
- font-family: 'DM Sans';
- src: url('https://fonts.gstatic.com/s/dmsans/v15/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxhS2f3ZGMZpg.woff2') format('woff2');
- font-weight: 400 700;
- font-display: swap;
-}
-
-@font-face {
- font-family: 'Inter';
- src: url('https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfAZ9hjp-Ek-_EeA.woff2') format('woff2');
- font-weight: 400 700;
- font-display: swap;
-}
-
/* ============================================
BASE STYLES (in Tailwind base layer)
+ Fonts loaded via next/font in layout.tsx
============================================ */
@layer base {
@@ -266,6 +248,38 @@
}
}
+/* ============================================
+ SCROLL INDICATOR ANIMATION
+ ============================================ */
+
+@keyframes scrollBounce {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(8px); }
+}
+
+.scroll-indicator {
+ animation: scrollBounce 1.5s ease-in-out infinite;
+}
+
+/* ============================================
+ FADE SLIDE UP ANIMATION
+ ============================================ */
+
+@keyframes fadeSlideUp {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-fadeSlideUp {
+ animation: fadeSlideUp 0.6s ease-out both;
+}
+
/* ============================================
UTILITIES
============================================ */
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 712a4af..867fead 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,9 +1,22 @@
import "./globals.css";
import type { Metadata, Viewport } from "next";
+import { DM_Sans, Inter } from "next/font/google";
import ErrorBoundary from "@/components/providers/ErrorBoundary";
import { SUPPORTED_LOCALES } from "@/lib/i18n/locales";
import { OrganizationSchema } from "@/components/seo";
+const dmSans = DM_Sans({
+ subsets: ["latin"],
+ variable: "--font-display",
+ display: "swap",
+});
+
+const inter = Inter({
+ subsets: ["latin"],
+ variable: "--font-body",
+ display: "swap",
+});
+
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://manoonoils.com";
export const metadata: Metadata = {
@@ -39,7 +52,7 @@ export default async function RootLayout({
children: React.ReactNode;
}) {
return (
-
+
{children}
diff --git a/src/components/home/HeroVideo.tsx b/src/components/home/HeroVideo.tsx
index ea3ee40..a0654e1 100644
--- a/src/components/home/HeroVideo.tsx
+++ b/src/components/home/HeroVideo.tsx
@@ -1,7 +1,7 @@
"use client";
-import { motion } from "framer-motion";
import Link from "next/link";
+import Image from "next/image";
import { useTranslations } from "next-intl";
import { ChevronDown } from "lucide-react";
@@ -23,30 +23,23 @@ export default function HeroVideo({ locale = "sr" }: HeroVideoProps) {
return (
{/* Background Image with Overlay */}
-
+
- {/* Content */}
+ {/* Content - Visible immediately, animations are enhancements */}
-
+
{/* Social Proof Micro */}
-
+
{[1, 2, 3, 4, 5].map((star) => (
- {/* Main Heading - Outcome Focused */}
-
{t("transformHeadline")}
{t("withNaturalOils")}
-
+
- {/* Subtitle - Expands on how */}
-
{t("subtitleText")}
-
+
- {/* CTA Button - Action verb + value */}
-
{t("learnStory")}
-
+
{/* Trust Indicators */}
-
{t("crueltyFree")}
-
-
+
+
{/* Scroll Indicator */}
-
-
+
-
-
+
+
);
-}
+}
\ No newline at end of file
diff --git a/src/components/product/ProductCard.tsx b/src/components/product/ProductCard.tsx
index c49b3e2..4561f2d 100644
--- a/src/components/product/ProductCard.tsx
+++ b/src/components/product/ProductCard.tsx
@@ -32,11 +32,12 @@ export default function ProductCard({ product, index = 0, locale = "sr" }: Produ
{image ? (
-

) : (
@@ -52,7 +53,7 @@ export default function ProductCard({ product, index = 0, locale = "sr" }: Produ
)}
-
+
))}
@@ -256,10 +258,13 @@ export default function ProductDetail({ product, relatedProducts, bundleProducts
)}
-
![{images[selectedImage].alt]({images[selectedImage].url})
{images.length > 1 && (
@@ -307,17 +312,15 @@ export default function ProductDetail({ product, relatedProducts, bundleProducts
transition={{ duration: 0.6, delay: 0.2 }}
className="lg:pl-8"
>
-
- {urgencyMessages[urgencyIndex].icon}
- {urgencyMessages[urgencyIndex].text}
-
+
+
+ {urgencyMessages[urgencyIndex].icon}
+ {urgencyMessages[urgencyIndex].text}
+
+
{localized.name}