Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 84 additions & 6 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,99 @@ import Navbar from "@/components/ui/Navbar";
import Footer from "@/components/ui/Footer";
import { Toaster } from 'sonner';
import { RibbonsBg } from '@/components/Ribbons';
import OrphansFixer from "@/components/utils/OrphansFixer"; // Import automatu
import OrphansFixer from "@/components/utils/OrphansFixer";
import { GoogleAnalytics } from '@next/third-parties/google';

const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
const fredoka = Fredoka({ subsets: ["latin"], variable: "--font-fredoka" });

// --- 🚀 ROZBUDOWANE METADANE SEO 🚀 ---
export const metadata: Metadata = {
title: "Sklep Urwis | Zabawki, Balony i Artykuły Szkolne Białobrzegi",
description: "Największy wybór zabawek, gier i artykułów imprezowych w Białobrzegach. Prawdziwy sklep stacjonarny dla dzieci!",
metadataBase: new URL('https://www.sklep-urwis.pl'),
title: "Sklep z zabawkami Białobrzegi | Urwis - Art. Szkolne i Biurowe",
description: "Najlepszy sklep z zabawkami w Białobrzegach! Największy wybór zabawek, gier planszowych, LEGO, balonów z helem i artykułów szkolnych. Zapraszamy na ul. Reymonta 38A.",
keywords: [
"sklep z zabawkami Białobrzegi",
"zabawki Białobrzegi",
"balony z helem Białobrzegi",
"artykuły szkolne Białobrzegi",
"gry planszowe Białobrzegi",
"sklep Urwis"
],
alternates: {
canonical: '/',
},
openGraph: {
title: "Sklep z zabawkami Białobrzegi | Urwis",
description: "Największy wybór zabawek, gier planszowych, balonów z helem i artykułów szkolnych w Białobrzegach. Sprawdź naszą ofertę stacjonarnie!",
url: 'https://www.sklep-urwis.pl',
siteName: 'Sklep Urwis Białobrzegi',
locale: 'pl_PL',
type: 'website',
},
robots: {
index: true,
follow: true,
}
};

export default function RootLayout({ children }: { children: React.ReactNode }) {

// --- 🤖 DANE STRUKTURALNE JSON-LD DLA GOOGLE LOKALNEGO 🤖 ---
const jsonLd = {
"@context": "https://schema.org",
"@type": "ToyStore",
"name": "Sklep Urwis",
"image": "https://www.sklep-urwis.pl/logo.png",
"@id": "https://www.sklep-urwis.pl",
"url": "https://www.sklep-urwis.pl",
"telephone": "+48604208183",
"address": {
"@type": "PostalAddress",
"streetAddress": "ul. Reymonta 38A",
"addressLocality": "Białobrzegi",
"postalCode": "26-800",
"addressCountry": "PL"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.644767922296516,
"longitude": 20.950334289637663
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "15:00"
}
],
"sameAs": [
"https://facebook.com/sklepurwis.bialobrzegi",
"https://instagram.com/sklepurwis.bialobrzegi"
]
};

return (
<html lang="pl" className={`${inter.variable} ${fredoka.variable}`}>
<head>
{/* Tu wstrzykujemy kod JSON-LD zdefiniowany wyżej */}
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
</head>
<body className="antialiased bg-transparent text-zinc-900 selection:bg-blue-500 selection:text-white">

{/* AUTOMATYCZNA NAPRAWA SPÓJNIKÓW */}
<OrphansFixer />



{/* WARSTWA 1: SZKŁO (Musi być pod treścią, ale nad tłem) */}
<div
className="fixed inset-0 z-[10] bg-white/40 backdrop-blur-[100px] pointer-events-none"
Expand All @@ -35,6 +108,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
<div className="relative z-[20] flex flex-col min-h-screen bg-transparent">
<Navbar />
<RibbonsBg />

<main className="flex-grow bg-transparent">
{children}
</main>
Expand All @@ -43,6 +117,10 @@ export default function RootLayout({ children }: { children: React.ReactNode })
</div>

<Toaster position="bottom-right" richColors />

{/* 👇 GOOGLE ANALYTICS */}
<GoogleAnalytics gaId="G-FE44ZTQ7GT" />

</body>
</html>
);
Expand Down
36 changes: 36 additions & 0 deletions app/not-found.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import Link from 'next/link'
import Image from 'next/image'

export default function NotFound() {
return (
<div className="min-h-screen flex flex-col items-center justify-center bg-white p-4 text-center">
<div className="relative w-64 h-64 mb-8">
<Image
src="/Urwis-Register.webp"
alt="Zagubiony Urwis"
fill
className="object-contain opacity-00"
/>
</div>

<h1 className="text-6xl font-black text-blue-600 mb-4 z-100 tracking-tighter">
404
</h1>

<h2 className="text-2xl font-bold text-zinc-800 z-100 mb-4">
Ojej! Urwis gdzieś schował tę stronę...
</h2>

<p className="text-zinc-500 mb-8 z-100 max-w-md">
Wygląda na to, że link, którego szukasz, nie istnieje.
</p>

<Link
href="/"
className="px-8 py-3 bg-blue-600 text-white font-bold rounded-full hover:bg-blue-700 transition-colors z-100 shadow-lg"
>
Wróć do bazy
</Link>
</div>
)
}
2 changes: 1 addition & 1 deletion app/oferta/gry/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export default function GryPage() {
</p>
</div>
<Link
href="tel:+48604208193"
href="tel:+48604208183"
className="md:ml-auto px-12 py-5 bg-zinc-900 text-white rounded-[2rem] font-black uppercase tracking-widest shadow-2xl hover:scale-105 transition-all italic text-xs"
>
Zadzwoń i zapytaj
Expand Down
2 changes: 1 addition & 1 deletion app/oferta/imprezy/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ export default function ImprezyPage() {
</div>
<div className="md:ml-auto flex flex-col gap-2">
<Link
href="tel:+48604208193"
href="tel:+48604208183"
className="px-12 py-5 bg-zinc-900 text-white rounded-[2rem] font-black uppercase tracking-widest shadow-2xl hover:scale-105 transition-all italic text-xs text-center"
>
Zadzwoń i zapytaj
Expand Down
2 changes: 1 addition & 1 deletion app/oferta/szkola/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export default function SzkolaPage() {
</p>
</div>
<Link
href="tel:+48604208193"
href="tel:+48604208183"
className="md:ml-auto px-12 py-5 bg-zinc-900 text-white rounded-[2rem] font-black uppercase tracking-widest shadow-2xl hover:scale-105 transition-all italic text-xs"
>
Zadzwoń do Sklepu
Expand Down
2 changes: 1 addition & 1 deletion app/oferta/zabawki/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ export default function ZabawkiPage() {
</p>
</div>
<Link
href="tel:+48604208193"
href="tel:+48604208183"
className="md:ml-auto px-12 py-5 bg-zinc-900 text-white rounded-[2rem] font-black uppercase tracking-widest shadow-2xl hover:scale-105 transition-all italic text-xs"
>
Zadzwoń teraz
Expand Down
13 changes: 2 additions & 11 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,12 @@ export default function StoreFrontPage() {
{/* Sekcja powitalna */}
<Hero />
<LoyaltySection/>
<PoznajUrwisa />
<div className="container mx-auto px-4 py-12">
{/* Banner kierujący do nowej domeny akademiaurwisa.pl */}
<AcademyPromo />

{/* Sekcja informacyjna o sali zabaw i sklepie */}
<section id="oferta" className="my-20">
<h2 className="text-4xl font-black text-center mb-4 tracking-tighter italic">
ŚWIAT PEŁEN PRZYGÓD
</h2>
<p className="text-center text-zinc-500 mb-12 max-w-2xl mx-auto">
Zapraszamy do naszej sali zabaw w Białobrzegach. Sprawdź co przygotowaliśmy dla Twojego Urwisa!
</p>
</section>
<PoznajUrwisa />
<AboutSection />

</div>
</div>
</UrwisIntro>
Expand Down
25 changes: 25 additions & 0 deletions app/sitemap.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { MetadataRoute } from 'next'

export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = 'https://sklep-urwis.pl'

// Definiujemy główne ścieżki
const routes = [
'',
'/o-nas',
'/oferta',
'/oferta/zabawki',
'/oferta/szkola',
'/oferta/imprezy',
'/oferta/gry',
'/kontakt',
'/salazabaw',
]

return routes.map((route) => ({
url: `${baseUrl}${route}`,
lastModified: new Date(),
changeFrequency: route === '' ? 'weekly' : 'monthly',
priority: route === '' ? 1.0 : route.startsWith('/oferta/') ? 0.8 : 0.5,
}))
}
2 changes: 1 addition & 1 deletion components/AboutSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ export default function AboutSection() {
</motion.a>

<motion.a
href="tel:+48604208193"
href="tel:+48604208183"
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="px-10 py-6 bg-white/60 border-2 border-white text-zinc-900 rounded-3xl font-black text-center hover:bg-white transition-all flex items-center justify-center gap-3 backdrop-blur-md shadow-xl text-sm uppercase tracking-widest italic"
Expand Down
4 changes: 2 additions & 2 deletions components/ContactSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ export default function ContactSection() {
{
icon: <Phone className="text-blue-500" size={32} />,
title: 'Zadzwoń do nas',
value: '604 208 193',
link: 'tel:+48604208193',
value: '604 208 183',
link: 'tel:+48604208183',
glowColor: '59, 130, 246',
gridClass: 'md:col-span-1 md:row-span-1'
},
Expand Down
76 changes: 36 additions & 40 deletions components/Hero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,48 +48,41 @@ export default function HeroSection() {
</motion.div>
))}

{/* ZMIANA: opacity jest nadal animowane przy scrollowaniu (useTransform),
ale bazowy kontener NIE MA 'opacity: 0' na start.
*/}
<motion.div style={{ y, opacity }} className="relative z-10 container mx-auto px-6 text-center">

{/* NAGŁÓWEK W JEDNEJ LINII - Poprawka ucinania litery S */}
<div className="mb-8 overflow-visible">
<motion.h1
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
className="text-5xl md:text-7xl lg:text-[6.5vw] font-black tracking-tighter leading-none flex items-center justify-center flex-wrap md:flex-nowrap"
>
<span className="text-zinc-900">SKLEP</span>

{/* ZMIANA:
- dodany pr-[0.05em] (padding-right) w jednostce em, aby skalował się z fontem
- dodany inline-block i overflow-visible
*/}
<span className="relative inline-block text-transparent bg-clip-text bg-linear-to-r from-[#BF2024] to-[#0055ff] ml-4 md:ml-8 pr-[0.05em] overflow-visible">
URWIS
</span>
</motion.h1>

<motion.p
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.3 }}
className="text-xl md:text-3xl lg:text-4xl font-medium text-zinc-500 mt-4 tracking-tight"
>
Nie tylko dla grzecznych dzieci
</motion.p>
</div>
{/* NAGŁÓWEK W JEDNEJ LINII - Poprawka ucinania litery S */}
<div className="mb-8 overflow-visible">
{/* 🚀 FIX LCP (Largest Contentful Paint):
Zmieniono <motion.h1 initial={{opacity:0}}> na czyste <h1> z CSS'em.
Dzięki temu tekst renderuje się błyskawicznie bez czekania na JavaScript.
Używamy klasy 'animate-fade-in-up' (jeśli masz ją w tailwind.config) lub po prostu pojawia się od razu.
*/}
<h1 className="text-5xl md:text-7xl lg:text-[6.5vw] font-black tracking-tighter leading-none flex items-center justify-center flex-wrap md:flex-nowrap">
<span className="text-zinc-900">SKLEP</span>

<span className="relative inline-block text-transparent bg-clip-text bg-linear-to-r from-[#BF2024] to-[#0055ff] ml-4 md:ml-8 pr-[0.05em] overflow-visible">
URWIS
</span>
</h1>

{/* Usunięto framer-motion z tego tekstu dla LCP */}
<p className="text-xl md:text-3xl lg:text-4xl font-medium text-zinc-500 mt-4 tracking-tight">
Nie tylko dla grzecznych dzieci
</p>
</div>

{/* NOWY, TRAFNY OPIS - Z FIXEM NA SPÓJNIKI */}
<motion.p
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.4 }}
className="text-lg md:text-2xl text-zinc-600 max-w-4xl mx-auto mb-16 font-bold leading-relaxed"
>
Największy wybór gier i{"\u00A0"}zabawek, akcesoriów imprezowych,
art. szkolnych i{"\u00A0"}biurowych przy{"\u00A0"}<span className="text-[#BF2024]">ul. Reymonta 38A</span>.

Prawdziwy sklep stacjonarny, w{"\u00A0"}którym rządzisz Ty i{"\u00A0"}Twoja wyobraźnia!
</motion.p>
{/* NOWY, TRAFNY OPIS - Z FIXEM NA SPÓJNIKI
Usunięto framer-motion, bo ten element LCP zajmował w Lighthouse 26 sekund!
*/}
<p className="text-lg md:text-2xl text-zinc-600 max-w-4xl mx-auto mb-16 font-bold leading-relaxed">
Największy wybór gier i{"\u00A0"}zabawek, akcesoriów imprezowych,
art. szkolnych i{"\u00A0"}biurowych przy{"\u00A0"}<span className="text-[#BF2024]">ul. Reymonta 38A</span>.

Prawdziwy sklep stacjonarny, w{"\u00A0"}którym rządzisz Ty i{"\u00A0"}Twoja wyobraźnia!
</p>

{/* PRZYCISKI CTA */}
<div className="flex flex-col sm:flex-row justify-center items-center gap-6">
Expand Down Expand Up @@ -146,7 +139,10 @@ export default function HeroSection() {
</button>
</div>
<div className="aspect-video w-full rounded-[2rem] overflow-hidden border-4 border-white shadow-2xl bg-zinc-100">
<iframe width="100%" height="100%" frameBorder="0" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2475.826141170283!2d20.9502709!3d51.64470900000002!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x4718fdfaefa939bb%3A0x70c667b47a29301c!2sUrwis%20-%20Zabawki%20-%20Art.%20Szkolne%20i%20Biurowe!5e0!3m2!1spl!2spl!4v1771399578946!5m2!1spl!2spl" allowFullScreen />
{/* WAŻNE DLA WYDAJNOŚCI: iframe też bywa ciężki, ale jest w modalu, więc ładuje się po kliknięciu. */}
{isMapOpen && (
<iframe width="100%" height="100%" frameBorder="0" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2475.826141170283!2d20.9502709!3d51.64470900000002!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x4718fdfaefa939bb%3A0x70c667b47a29301c!2sUrwis%20-%20Zabawki%20-%20Art.%20Szkolne%20i%20Biurowe!5e0!3m2!1spl!2spl!4v1771399578946!5m2!1spl!2spl" allowFullScreen />
)}
</div>
</Modal>

Expand Down
Loading