Initial commit with essential code files only

This commit is contained in:
2025-07-18 16:13:09 +02:00
commit 8e9b0ef8a8
33 changed files with 1703 additions and 0 deletions

35
.gitignore vendored Normal file
View File

@@ -0,0 +1,35 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# vercel
.vercel
.env

34
README.md Normal file
View File

@@ -0,0 +1,34 @@
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.

View File

@@ -0,0 +1,135 @@
export default function About() {
return (
<section id="onas" className="py-20 bg-white">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid lg:grid-cols-2 gap-16 items-center">
{/* Content */}
<div>
<h2 className="text-4xl font-bold text-gray-900 mb-6">
O firmie Wastpol
</h2>
<div className="space-y-6 text-gray-600">
<p className="text-lg leading-relaxed">
Jesteśmy firmą oferującą kompleksowe usługi elektryczne z ponad 20-letnim
doświadczeniem. Realizujemy pełen zakres prac - od projektowania przez
wykonawstwo po nadzory i pomiary instalacji elektrycznych.
</p>
<p className="text-lg leading-relaxed">
Przez lata naszej działalności zaprojektowaliśmy i zrealizowaliśmy ponad 4000
projektów dla klientów w całej Polsce. Nasze doświadczenie obejmuje zarówno
instalacje domowe, jak i złożone projekty przemysłowe i infrastrukturalne.
</p>
</div>
{/* Key Features */}
<div className="mt-10 grid md:grid-cols-2 gap-6">
<div className="flex items-start space-x-3">
<div className="flex-shrink-0 w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center">
<svg className="w-4 h-4 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900">Doświadczenie</h4>
<p className="text-gray-600">Ponad 20 lat na rynku</p>
</div>
</div>
<div className="flex items-start space-x-3">
<div className="flex-shrink-0 w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center">
<svg className="w-4 h-4 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900">Kompleksowość</h4>
<p className="text-gray-600">Od projektu do realizacji</p>
</div>
</div>
<div className="flex items-start space-x-3">
<div className="flex-shrink-0 w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center">
<svg className="w-4 h-4 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900">Terminowość</h4>
<p className="text-gray-600">Dotrzymujemy ustalonych terminów</p>
</div>
</div>
<div className="flex items-start space-x-3">
<div className="flex-shrink-0 w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center">
<svg className="w-4 h-4 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900">Zespół</h4>
<p className="text-gray-600">Wykwalifikowani specjaliści</p>
</div>
</div>
</div>
{/* CTA */}
<div className="mt-10">
<button
onClick={() => {
const element = document.getElementById("kontakt");
if (element) element.scrollIntoView({ behavior: "smooth" });
}}
className="bg-blue-600 hover:bg-blue-700 text-white px-8 py-3 rounded-lg font-semibold transition-all duration-300 transform hover:scale-105"
>
Skontaktuj się z nami
</button>
</div>
</div>
{/* Stats & Image */}
<div className="space-y-8">
{/* Main Image */}
<div className="relative rounded-2xl overflow-hidden shadow-xl">
<img
src="/images/0.jpg"
alt="Wastpol - realizacje projektów"
className="w-full h-96 object-cover"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black via-transparent to-transparent"></div>
<div className="absolute bottom-6 left-6 text-white">
<h3 className="text-xl font-semibold">Kompleksowe realizacje</h3>
<p className="text-blue-200">Projektowanie i wykonawstwo od 2002 roku</p>
</div>
</div>
{/* Achievement Stats */}
<div className="bg-gradient-to-br from-blue-600 to-blue-800 rounded-2xl p-8 text-white">
<h3 className="text-2xl font-bold mb-6 text-center">Nasze osiągnięcia</h3>
<div className="grid grid-cols-2 gap-6">
<div className="text-center">
<div className="text-3xl font-bold text-blue-200 mb-2">4000+</div>
<div className="text-sm text-blue-100">Zrealizowanych projektów</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold text-blue-200 mb-2">20+</div>
<div className="text-sm text-blue-100">Lat doświadczenia</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold text-blue-200 mb-2">500+</div>
<div className="text-sm text-blue-100">Zadowolonych klientów</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold text-blue-200 mb-2">100%</div>
<div className="text-sm text-blue-100">Terminowych realizacji</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,217 @@
import { useState } from "react";
export default function Contact() {
const [formData, setFormData] = useState({
name: "",
email: "",
phone: "",
message: ""
});
const handleChange = (e) => {
setFormData({
...formData,
[e.target.name]: e.target.value
});
};
const handleSubmit = (e) => {
e.preventDefault();
// Here you would typically send the form data to your backend
console.log("Form submitted:", formData);
alert("Dziękujemy za wiadomość! Skontaktujemy się z Państwem wkrótce.");
setFormData({ name: "", email: "", phone: "", message: "" });
};
return (
<section id="kontakt" className="py-20 bg-gray-50">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{/* Header */}
<div className="text-center mb-16">
<h2 className="text-4xl font-bold text-gray-900 mb-4">
Skontaktuj się z nami
</h2>
<p className="text-xl text-gray-600 max-w-3xl mx-auto">
Masz pytania o nasze usługi? Potrzebujesz wyceny?
Skontaktuj się z nami - chętnie pomożemy!
</p>
</div>
<div className="grid lg:grid-cols-2 gap-16">
{/* Contact Information */}
<div>
<div className="bg-white rounded-2xl shadow-xl p-8 mb-8">
<h3 className="text-2xl font-bold text-gray-900 mb-6">
Nasze Biuro
</h3>
<div className="space-y-6">
<div className="flex items-start space-x-4">
<div className="flex-shrink-0 w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center">
<svg className="w-6 h-6 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Adres</h4>
<p className="text-gray-600">
Aleje Wolności 6<br />
II piętro<br />
33-300 Nowy Sącz
</p>
</div>
</div>
<div className="flex items-start space-x-4">
<div className="flex-shrink-0 w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center">
<svg className="w-6 h-6 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Telefon</h4>
<p className="text-gray-600 space-y-1">
<a href="tel:504066513" className="block hover:text-blue-600 transition-colors">
504 066 513
</a>
<a href="tel:18442022044" className="block hover:text-blue-600 transition-colors">
18 442 02 44
</a>
</p>
</div>
</div>
<div className="flex items-start space-x-4">
<div className="flex-shrink-0 w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center">
<svg className="w-6 h-6 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Email</h4>
<a
href="mailto:biuro@wastpol.pl"
className="text-gray-600 hover:text-blue-600 transition-colors"
>
biuro@wastpol.pl
</a>
</div>
</div>
<div className="flex items-start space-x-4">
<div className="flex-shrink-0 w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center">
<svg className="w-6 h-6 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Godziny pracy</h4>
<p className="text-gray-600">
Pon - Pt: 8:00 - 16:00<br />
Sob - Nd: Zamknięte
</p>
</div>
</div>
</div>
</div>
{/* Map */}
<div className="bg-white rounded-2xl shadow-xl overflow-hidden">
<img
src="/map.png"
alt="Mapa lokalizacji Wastpol"
className="w-full h-64 object-cover"
/>
</div>
</div>
{/* Contact Form */}
<div className="bg-white rounded-2xl shadow-xl p-8">
<h3 className="text-2xl font-bold text-gray-900 mb-6">
Wyślij wiadomość
</h3>
<form onSubmit={handleSubmit} className="space-y-6">
<div>
<label htmlFor="name" className="block text-sm font-medium text-gray-700 mb-2">
Imię i nazwisko *
</label>
<input
type="text"
id="name"
name="name"
required
value={formData.name}
onChange={handleChange}
className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
placeholder="Wpisz swoje imię i nazwisko"
/>
</div>
<div>
<label htmlFor="email" className="block text-sm font-medium text-gray-700 mb-2">
Email *
</label>
<input
type="email"
id="email"
name="email"
required
value={formData.email}
onChange={handleChange}
className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
placeholder="twoj@email.com"
/>
</div>
<div>
<label htmlFor="phone" className="block text-sm font-medium text-gray-700 mb-2">
Telefon
</label>
<input
type="tel"
id="phone"
name="phone"
value={formData.phone}
onChange={handleChange}
className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
placeholder="123 456 789"
/>
</div>
<div>
<label htmlFor="message" className="block text-sm font-medium text-gray-700 mb-2">
Wiadomość *
</label>
<textarea
id="message"
name="message"
required
rows={6}
value={formData.message}
onChange={handleChange}
className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors"
placeholder="Opisz swoje potrzeby lub zadaj pytanie..."
></textarea>
</div>
<button
type="submit"
className="w-full bg-blue-600 hover:bg-blue-700 text-white py-3 px-6 rounded-lg font-semibold transition-all duration-300 transform hover:scale-105"
>
Wyślij wiadomość
</button>
</form>
<div className="mt-6 pt-6 border-t border-gray-200">
<p className="text-sm text-gray-500 text-center">
* Pola wymagane. Twoje dane bezpieczne i nie będą przekazywane osobom trzecim.
</p>
</div>
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,112 @@
export default function Footer() {
const currentYear = new Date().getFullYear();
return (
<footer className="bg-gray-900 text-white">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
<div className="grid md:grid-cols-4 gap-8">
{/* Company Info */}
<div className="md:col-span-2">
<img
src="./logo.png"
alt="Wastpol Logo"
className="h-12 mb-6 brightness-0 invert"
/>
<p className="text-gray-300 mb-6 leading-relaxed">
Wastpol to kompleksowa firma elektryczna z ponad 20-letnim doświadczeniem
w projektowaniu i realizacji instalacji elektrycznych. Zaufało nam już ponad 4000 klientów.
</p>
<div className="flex space-x-4">
<a
href="tel:18442022044"
className="bg-blue-600 hover:bg-blue-700 text-white px-6 py-2 rounded-lg font-semibold transition-colors"
>
Zadzwoń teraz
</a>
<a
href="mailto:biuro@wastpol.pl"
className="border border-gray-600 hover:border-gray-500 text-gray-300 hover:text-white px-6 py-2 rounded-lg font-semibold transition-colors"
>
Napisz email
</a>
</div>
</div>
{/* Services */}
<div>
<h4 className="text-lg font-semibold mb-6">Nasze Usługi</h4>
<ul className="space-y-3 text-gray-300">
<li>
<a href="#uslugi" className="hover:text-white transition-colors">
Projektowanie i Realizacja Sieci
</a>
</li>
<li>
<a href="#uslugi" className="hover:text-white transition-colors">
Instalacje Elektryczne
</a>
</li>
<li>
<a href="#uslugi" className="hover:text-white transition-colors">
Nadzory Inwestorskie
</a>
</li>
<li>
<a href="#uslugi" className="hover:text-white transition-colors">
Pomiary i Ekspertyzy
</a>
</li>
</ul>
</div>
{/* Contact Info */}
<div>
<h4 className="text-lg font-semibold mb-6">Kontakt</h4>
<div className="space-y-3 text-gray-300">
<div>
<p className="font-medium text-white">Adres:</p>
<p>Aleje Wolności 6, II piętro</p>
<p>33-300 Nowy Sącz</p>
</div>
<div>
<p className="font-medium text-white">Telefon:</p>
<a href="tel:504066513" className="block hover:text-white transition-colors">
504 066 513
</a>
<a href="tel:18442022044" className="block hover:text-white transition-colors">
18 442 02 44
</a>
</div>
<div>
<p className="font-medium text-white">Email:</p>
<a href="mailto:biuro@wastpol.pl" className="hover:text-white transition-colors">
biuro@wastpol.pl
</a>
</div>
</div>
</div>
</div>
{/* Bottom Bar */}
<div className="border-t border-gray-800 mt-12 pt-8">
<div className="flex flex-col md:flex-row justify-between items-center">
<p className="text-gray-400 text-sm">
© {currentYear} Wastpol. Wszystkie prawa zastrzeżone.
</p>
<div className="flex space-x-6 mt-4 md:mt-0">
<a href="/rodo" className="text-gray-400 hover:text-white text-sm transition-colors">
Polityka Prywatności
</a>
<a href="/rodo" className="text-gray-400 hover:text-white text-sm transition-colors">
RODO
</a>
<a href="#kontakt" className="text-gray-400 hover:text-white text-sm transition-colors">
Kontakt
</a>
</div>
</div>
</div>
</div>
</footer>
);
}

View File

@@ -0,0 +1,81 @@
export default function Hero() {
const scrollToSection = (sectionId) => {
const element = document.getElementById(sectionId);
if (element) {
element.scrollIntoView({ behavior: "smooth" });
}
};
return (
<div className="relative h-screen flex items-center justify-center overflow-hidden">
{/* Background Image */}
<div
className="absolute inset-0 bg-cover bg-center bg-no-repeat"
style={{ backgroundImage: "url('./main.jpg')" }}
>
<div className="absolute inset-0 bg-black bg-opacity-50"></div>
</div>
{/* Content */}
<div className="relative z-10 text-center text-white max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<h1 className="text-4xl md:text-6xl font-bold mb-6 leading-tight">
Projektowanie
<span className="block text-blue-400">i Realizacja</span>
<span className="block text-2xl md:text-4xl font-medium mt-2">Instalacji Elektrycznych</span>
</h1>
<p className="text-xl md:text-2xl mb-8 text-gray-200 max-w-3xl mx-auto">
Kompleksowe usługi elektryczne - od projektu po pełną realizację.
Ponad 20 lat doświadczenia, zaufało nam już ponad 4000 klientów.
</p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-12">
<button
onClick={() => scrollToSection("uslugi")}
className="bg-blue-600 hover:bg-blue-700 text-white px-8 py-4 rounded-lg font-semibold text-lg transition-all duration-300 transform hover:scale-105 shadow-lg"
>
Nasze Usługi
</button>
<button
onClick={() => scrollToSection("kontakt")}
className="border-2 border-white text-white hover:bg-white hover:text-gray-900 px-8 py-4 rounded-lg font-semibold text-lg transition-all duration-300"
>
Skontaktuj się
</button>
</div>
{/* Stats */}
<div className="grid grid-cols-2 md:grid-cols-4 gap-8 text-center">
<div className="bg-white bg-opacity-10 backdrop-blur-sm rounded-lg p-4">
<div className="text-3xl font-bold text-blue-400">20+</div>
<div className="text-sm text-gray-300">Lat doświadczenia</div>
</div>
<div className="bg-white bg-opacity-10 backdrop-blur-sm rounded-lg p-4">
<div className="text-3xl font-bold text-blue-400">4000+</div>
<div className="text-sm text-gray-300">Projektów</div>
</div>
<div className="bg-white bg-opacity-10 backdrop-blur-sm rounded-lg p-4">
<div className="text-3xl font-bold text-blue-400">100%</div>
<div className="text-sm text-gray-300">Zadowolenia</div>
</div>
<div className="bg-white bg-opacity-10 backdrop-blur-sm rounded-lg p-4">
<div className="text-3xl font-bold text-blue-400">24/7</div>
<div className="text-sm text-gray-300">Wsparcie</div>
</div>
</div>
</div>
{/* Scroll indicator */}
<div className="absolute bottom-8 left-1/2 transform -translate-x-1/2 animate-bounce">
<button
onClick={() => scrollToSection("uslugi")}
className="text-white hover:text-blue-400 transition-colors duration-300"
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 14l-7 7m0 0l-7-7m7 7V3" />
</svg>
</button>
</div>
</div>
);
}

View File

@@ -0,0 +1,37 @@
export default function Contact() {
return (
<div className="flex py-12" id="kontakt">
<div className="w-3/5">
<img src="/map.png" className="w-fit"></img>
</div>
<div className="w-3/5 px-8 my-auto text-right">
<h2 className="text-4xl py-4">Nasze Biuro</h2>
<ul className="list-none">
<p className="text-2xl py-2">Aleje Wolności 6</p>
<p className="text-2xl py-2">II piętro</p>
<p className="text-2xl py-2">33-300 Nowy Sącz</p>
</ul>
<br></br>
<h3 className="text-4xl py-4">Kontakt</h3>
<ul className="list-none">
<li className="text-2xl py-2">
<a href="tel:504066513" >
504 066 513
</a>
</li>
<li className="text-2xl py-2">
<a href="tel:18 442 02 44">
18 442 02 44
</a>
</li>
<li className="text-2xl py-2">
<a href="mailto:biuro@wastpol.pl">
biuro@wastpol.pl
</a>
</li>
</ul>
</div>
<div className="grow bg-slate-600 w-48 opacity-40"></div>
</div>
);
}

View File

@@ -0,0 +1,26 @@
export default function Main() {
return (
<div className="h-screen w-full bg-main bg-cover bg-center text-white mb-12">
<div className="flex justify-between px-36 py-8 items-center">
<img src="./logo.png" alt="logo" className="h-16"></img>
<div className="flex items-center">
<a href="#onas">
<h2 className="text-2xl ml-8 bg-gray-900 bg-opacity-20 px-3 py-2 hover:bg-opacity-10 border-white border-opacity-0 border-b-2 hover:border-opacity-100 transition-all">
O nas
</h2>
</a>
<a href="#kontakt">
<h2 className="text-2xl ml-8 bg-gray-900 bg-opacity-20 px-3 py-2 hover:bg-opacity-10 border-white border-opacity-0 border-b-2 hover:border-opacity-100 transition-all">
Kontakt
</h2>
</a>
<a href="tel:184420244">
<h2 className="text-2xl ml-8 bg-gray-900 bg-opacity-20 px-3 py-2 hover:bg-opacity-10 border-white border-opacity-0 border-b-2 hover:border-opacity-100 transition-all">
18 442 02 44
</h2>
</a>
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,130 @@
import { useState, useEffect } from "react";
export default function Navigation() {
const [isScrolled, setIsScrolled] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 10);
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
const scrollToSection = (sectionId) => {
const element = document.getElementById(sectionId);
if (element) {
element.scrollIntoView({ behavior: "smooth" });
}
setIsMobileMenuOpen(false);
};
return (
<nav className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
isScrolled ? "bg-white shadow-lg" : "bg-transparent"
}`}>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex justify-between items-center py-4">
{/* Logo */}
<div className="flex-shrink-0">
<img
src="./logo.png"
alt="Wastpol Logo"
className={`h-12 transition-all duration-300 ${
isScrolled ? "filter-none" : "brightness-0 invert"
}`}
/>
</div>
{/* Desktop Menu */}
<div className="hidden md:flex items-center space-x-8">
<button
onClick={() => scrollToSection("uslugi")}
className={`font-medium transition-colors duration-300 hover:text-blue-600 ${
isScrolled ? "text-gray-700" : "text-white"
}`}
>
Usługi
</button>
<button
onClick={() => scrollToSection("onas")}
className={`font-medium transition-colors duration-300 hover:text-blue-600 ${
isScrolled ? "text-gray-700" : "text-white"
}`}
>
O nas
</button>
<button
onClick={() => scrollToSection("kontakt")}
className={`font-medium transition-colors duration-300 hover:text-blue-600 ${
isScrolled ? "text-gray-700" : "text-white"
}`}
>
Kontakt
</button>
<a
href="tel:18442022044"
className={`font-semibold px-4 py-2 rounded-md transition-all duration-300 ${
isScrolled
? "bg-blue-600 text-white hover:bg-blue-700"
: "bg-white text-blue-600 hover:bg-gray-100"
}`}
>
18 442 02 44
</a>
</div>
{/* Mobile menu button */}
<div className="md:hidden">
<button
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className={`inline-flex items-center justify-center p-2 rounded-md transition-colors duration-300 ${
isScrolled ? "text-gray-700 hover:bg-gray-100" : "text-white hover:bg-white hover:bg-opacity-10"
}`}
>
<svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
{isMobileMenuOpen ? (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
) : (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
)}
</svg>
</button>
</div>
</div>
{/* Mobile menu */}
{isMobileMenuOpen && (
<div className="md:hidden bg-white shadow-lg rounded-lg mt-2 py-2">
<button
onClick={() => scrollToSection("uslugi")}
className="block w-full text-left px-4 py-2 text-gray-700 hover:bg-gray-100"
>
Usługi
</button>
<button
onClick={() => scrollToSection("onas")}
className="block w-full text-left px-4 py-2 text-gray-700 hover:bg-gray-100"
>
O nas
</button>
<button
onClick={() => scrollToSection("kontakt")}
className="block w-full text-left px-4 py-2 text-gray-700 hover:bg-gray-100"
>
Kontakt
</button>
<a
href="tel:18442022044"
className="block px-4 py-2 text-blue-600 font-semibold hover:bg-gray-100"
>
18 442 02 44
</a>
</div>
)}
</div>
</nav>
);
}

View File

@@ -0,0 +1,131 @@
import { useState, useEffect } from "react";
export default function Second() {
const [photo, setPhoto] = useState(0);
useEffect(() => {
document.getElementById("jobPhoto");
jobPhoto.style.opacity = 0;
setTimeout(() => {
jobPhoto.src = `/images/${photo}.jpg`;
setTimeout(() => {
jobPhoto.style.opacity = 1;
}, 100);
}, 150);
console.log(jobPhoto);
}, [photo]);
return (
<>
<div className="reative px-8 py-12 h-[26rem]" id="onas">
<img
src={`/images/0.jpg`}
alt="Prąd"
className="absolute right-0 object-cover h-80 w-2/3 transition-all duration-700 opacity-25"
id="jobPhoto"
></img>
<h2 className="absolute text-6xl border-l-4 border-red-500">
&nbsp; Ponad 4000 zrealizowanych projektów
<br />
&nbsp; 20 lat doświadczenia
</h2>
</div>
<div className="list-none flex px-8 py-12 justify-around text-3xl">
<li
onMouseEnter={() => {
setPhoto(1);
}}
className="p-8 transition-all duration-700 hover:text-slate-500 border-b-2 border-white hover:border-red-500"
>
<svg
className="w-16 h-16 m-auto"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M13 10V3L4 14h7v7l9-11h-7z"
/>
</svg>
<h3 className="">Sieci</h3>
</li>
<li
onMouseEnter={() => {
setPhoto(2);
}}
className="p-8 transition-all duration-700 hover:text-slate-500 border-b-2 border-white hover:border-red-500"
>
<svg
className="w-16 h-16 m-auto"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"
/>
</svg>
<h3>Instalacje</h3>
</li>
<li
onMouseEnter={() => {
setPhoto(3);
}}
className="p-8 transition-all duration-700 hover:text-slate-500 border-b-2 border-white hover:border-red-500"
>
<svg
className="w-16 h-16 m-auto"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
/>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
/>
</svg>
<h3>Nadzory</h3>
</li>
<li
onMouseEnter={() => {
setPhoto(4);
}}
className="p-8 transition-all duration-700 hover:text-slate-500 border-b-2 border-white hover:border-red-500"
>
<svg
className="w-16 h-16 m-auto"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"
/>
</svg>
<h3>Pomiary</h3>
</li>
</div>
</>
);
}

View File

@@ -0,0 +1,166 @@
import { useState } from "react";
export default function Services() {
const [activeService, setActiveService] = useState(0);
const services = [
{
id: 0,
title: "Projektowanie i Realizacja Sieci",
description: "Kompleksowe usługi od projektu po wykonanie sieci elektroenergetycznych niskiego i średniego napięcia",
icon: (
<svg className="w-12 h-12" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
),
image: "/images/1.jpg",
features: [
"Projektowanie sieci napowietrznych i kablowych",
"Wykonawstwo sieci elektrycznych",
"Budowa stacji transformatorowych",
"Realizacja przyłączy elektroenergetycznych"
]
},
{
id: 1,
title: "Instalacje Elektryczne",
description: "Pełen zakres usług - projektowanie i montaż instalacji elektrycznych w obiektach mieszkalnych i przemysłowych",
icon: (
<svg className="w-12 h-12" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z" />
</svg>
),
image: "/images/2.jpg",
features: [
"Projektowanie i montaż oświetlenia",
"Instalacje gniazd wtykowych",
"Wykonanie systemów alarmowych",
"Realizacja automatyki budynkowej"
]
},
{
id: 2,
title: "Nadzory Inwestorskie",
description: "Profesjonalny nadzór nad realizacją inwestycji elektrycznych na każdym etapie wykonania",
icon: (
<svg className="w-12 h-12" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
</svg>
),
image: "/images/3.jpg",
features: [
"Nadzór autorski projektów",
"Nadzór inwestorski realizacji",
"Kontrola jakości wykonania",
"Odbiory techniczne i rozruch"
]
},
{
id: 3,
title: "Pomiary i Ekspertyzy",
description: "Kompleksowe pomiary elektryczne, ekspertyzy techniczne i certyfikacja instalacji",
icon: (
<svg className="w-12 h-12" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />
</svg>
),
image: "/images/4.jpg",
features: [
"Pomiary rezystancji uziemień",
"Pomiary ochronne instalacji",
"Ekspertyzy i audyty techniczne",
"Protokoły pomiarowe i certyfikaty"
]
}
];
return (
<section id="uslugi" className="py-20 bg-gray-50">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{/* Header */}
<div className="text-center mb-16">
<h2 className="text-4xl font-bold text-gray-900 mb-4">
Nasze Usługi
</h2>
<p className="text-xl text-gray-600 max-w-3xl mx-auto">
Oferujemy kompleksowe usługi elektryczne - od projektowania przez realizację
po nadzory i pomiary. Każdy projekt wykonujemy z najwyższą starannością od A do Z.
</p>
</div>
<div className="grid lg:grid-cols-2 gap-12 items-center">
{/* Services List */}
<div className="space-y-6">
{services.map((service, index) => (
<div
key={service.id}
className={`p-6 rounded-xl cursor-pointer transition-all duration-300 ${
activeService === index
? "bg-blue-600 text-white shadow-xl transform scale-105"
: "bg-white text-gray-700 hover:bg-gray-100"
}`}
onClick={() => setActiveService(index)}
>
<div className="flex items-start space-x-4">
<div className={`flex-shrink-0 ${
activeService === index ? "text-blue-200" : "text-blue-600"
}`}>
{service.icon}
</div>
<div className="flex-1">
<h3 className="text-xl font-semibold mb-2">
{service.title}
</h3>
<p className={`text-sm ${
activeService === index ? "text-blue-100" : "text-gray-600"
}`}>
{service.description}
</p>
</div>
</div>
</div>
))}
</div>
{/* Service Details */}
<div className="bg-white rounded-2xl shadow-xl overflow-hidden">
<div className="relative h-64">
<img
src={services[activeService].image}
alt={services[activeService].title}
className="w-full h-full object-cover"
/>
<div className="absolute inset-0 bg-black bg-opacity-40"></div>
<div className="absolute bottom-6 left-6 text-white">
<h3 className="text-2xl font-bold mb-2">
{services[activeService].title}
</h3>
</div>
</div>
<div className="p-8">
<p className="text-gray-600 mb-6">
{services[activeService].description}
</p>
<h4 className="font-semibold text-gray-900 mb-4">
Zakres usług:
</h4>
<ul className="space-y-2">
{services[activeService].features.map((feature, index) => (
<li key={index} className="flex items-center text-gray-600">
<svg className="w-5 h-5 text-green-500 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
</svg>
{feature}
</li>
))}
</ul>
</div>
</div>
</div>
</div>
</section>
);
}

4
next.config.js Normal file
View File

@@ -0,0 +1,4 @@
module.exports = {
reactStrictMode: true,
}

26
package.json Normal file
View File

@@ -0,0 +1,26 @@
{
"name": "strona",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"export": "next build && next export",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@socialgouv/matomo-next": "^1.4.0",
"axios": "^0.26.1",
"next": "12.0.10",
"nodemailer": "^6.7.3",
"react": "17.0.2",
"react-dom": "17.0.2"
},
"devDependencies": {
"autoprefixer": "^10.4.2",
"eslint": "8.8.0",
"eslint-config-next": "12.0.10",
"postcss": "^8.4.6",
"tailwindcss": "^3.0.19"
}
}

15
pages/_app.js Normal file
View File

@@ -0,0 +1,15 @@
import '../styles/globals.css'
import { useEffect } from "react";
import { init } from "@socialgouv/matomo-next";
const MATOMO_URL = process.env.NEXT_PUBLIC_MATOMO_URL;
const MATOMO_SITE_ID = process.env.NEXT_PUBLIC_MATOMO_SITE_ID;
function MyApp({ Component, pageProps }) {
useEffect(() => {
init({ url: MATOMO_URL, siteId: MATOMO_SITE_ID });
}, []);
return <Component {...pageProps} />
}
export default MyApp

26
pages/api/hello.js Normal file
View File

@@ -0,0 +1,26 @@
import nodemailer from "nodemailer";
export default function handler(req, res) {
let transporter = nodemailer.createTransport({
host: "mail.wastpol.pl",
port: 465,
secure: true,
auth: {
user: "kontakt@wastpol.pl",
pass: "jHP4oCaELy0EOhz5",
},
});
let info = transporter.sendMail({
from: `"${req.body.name} 🤡" <foo@example.com>`, // sender address
to: "kontakt@wastpol.pl", // list of receivers
subject: `Wiadomość od ${req.body.name}`, // Subject line
html: `<b>Treść:</b> ${req.body.msg}<br/>
<b>Dane do kontaktu:</b><br/>
<b>nr tel: </b>${req.body.tel}<br/>
<b>mail: </b>${req.body.mail}<br/><br/>
<i>Wiadomość wygenerowana automatycznie na stronie wastpol.pl</i>`, // html body
});
res.status(200).json({ msg: "Message Sent" });
}

7
pages/elements/banner.js Normal file
View File

@@ -0,0 +1,7 @@
export default function Banner() {
return (
<div>
<img src="/logo.png"></img>
</div>
);
}

10
pages/elements/links.js Normal file
View File

@@ -0,0 +1,10 @@
export default function Links() {
return (
<div className="flex items-center">
<p className="text-2xl pl-4 underline underline-offset-1 cursor-pointer">
Lorem
</p>
<p className="text-2xl pl-4 cursor-pointer">Dolor</p>
</div>
);
}

32
pages/elements/main.js Normal file
View File

@@ -0,0 +1,32 @@
// import Image from "next/image";
export default function Main() {
return (
<div className="flex px-48 py-12 ">
<div className="relative ">
<div className="absolute rounded-l-3xl h-full w-1/2 bg-slate-800 opacity-50 "></div>
<div className="absolute rounded-l-3xl h-full w-1/2 text-white p-12">
<h1 className="text-6xl py-4">Lorem Ipsum</h1>
<p className="text-2xl py-4">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
</p>
</div>
<div
className="absolute rounded-xl bg-slate-300 right-20 bottom-20 px-3 py-2 cursor-pointer"
onClick={(e) => {
console.log(e.target.innerHTML);
}}
>
Więcej
</div>
<img src="/main.png" alt="Prąd" className="rounded-3xl"></img>
</div>
</div>
);
}

22
pages/elements/second.js Normal file
View File

@@ -0,0 +1,22 @@
export default function Second() {
return (
<div className="flex py-12">
<div className="w-2/5">
<img src="/map.png" className="w-fit"></img>
</div>
<div className="w-3/5 px-8 text-right">
<h1 className="text-6xl py-4">Lorem Ipsum</h1>
<p className="text-2xl py-2">Lorem ipsum dolor sit amet,</p>
<p className="text-2xl py-2">consectetur adipiscing elit,</p>
<p className="text-2xl py-2">
eiusmod tempor incididunt ut labore et dolore magna aliqua.
</p>
<p className="text-2xl py-2">
quis nostrud exercitation ullamco laboris nisi ut
</p>
<p className="text-2xl py-2">aliquip ex ea commodo consequat.</p>
</div>
<div className="grow bg-slate-600 w-48 opacity-40"></div>
</div>
);
}

31
pages/elements/third.js Normal file
View File

@@ -0,0 +1,31 @@
export default function Third() {
return (
<div className="flex px-48 py-12">
<div className="w-1/2 border-t-2 border-l-2 p-4">
<div className="flex justify-evenly">
<div className="">Lorem</div>
<div className="">Dolorem</div>
</div>
Sunt eiusmod voluptate anim sint minim id aliqua elit ipsum culpa.
Consectetur laborum duis duis laboris do aute aliquip adipisicing ut
tempor irure non nisi tempor. Cillum deserunt eu ea ipsum nostrud.
Nostrud adipisicing et quis mollit et culpa ea irure incididunt eiusmod
reprehenderit veniam eiusmod sint. Nisi ex exercitation velit sit ea ex.
Ullamco eu ea esse nulla commodo commodo irure. Aliqua nostrud eiusmod
et velit esse voluptate voluptate ipsum nisi laborum exercitation.
</div>
<div className="w-1/2 border-b-2 border-r-2 p-4">
<h2>20 Lat Doświadczenia</h2>
<p>
Głównym profilem działalności firmy jest projektowanie instalacji
elektrycznych oraz nadzór. Świadczymy również usługi w zakresie
audytów instalacji elektrycznych, umożliwiających wskazanie
konkretnych rozwiązań technicznych. Jako projektanci posiadający
wieloletnie doświadczenie, potwierdzone odpowiednimi uprawnieniami,
możemy Państwu zapewnić wykonywanie projektów na najwyższym poziomie
technicznym i w zadowalających terminach realizacji.
</p>
</div>
</div>
);
}

34
pages/index.js Normal file
View File

@@ -0,0 +1,34 @@
import Head from "next/head";
import Hero from "../components/templates/hero";
import Navigation from "../components/templates/navigation";
import Services from "../components/templates/services";
import About from "../components/templates/about";
import Contact from "../components/templates/contact";
import Footer from "../components/templates/footer";
export default function Home() {
return (
<div className="font-sans scroll-smooth antialiased">
<Head>
<title>Wastpol - Projektowanie i Realizacja | Instalacje Elektryczne Nowy Sącz</title>
<meta
name="description"
content="Wastpol - kompleksowe usługi elektryczne w Nowym Sączu. Projektowanie, realizacja, nadzory i pomiary instalacji elektrycznych. Ponad 20 lat doświadczenia, 4000+ zrealizowanych projektów."
/>
<meta name="keywords" content="projektowanie, realizacja instalacji elektrycznych, Nowy Sącz, Wastpol, sieci elektryczne, nadzory, pomiary, wykonawstwo elektryczne" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="true" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
</Head>
<Navigation />
<Hero />
<Services />
<About />
<Contact />
<Footer />
</div>
);
}

143
pages/rodo.js Normal file
View File

@@ -0,0 +1,143 @@
import Head from "next/head";
import Navigation from "../components/templates/navigation";
import Footer from "../components/templates/footer";
export default function Rodo() {
const downloadRodo = () => {
const fileUrl = "./rozporzadzenie-rodo.pdf";
const link = document.createElement("a");
link.href = fileUrl;
link.download = "rozporzadzenie-rodo.pdf";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
const downloadRodoWastpol = () => {
const fileUrl = "./rodo-wastpol.pdf";
const link = document.createElement("a");
link.href = fileUrl;
link.download = "rodo-wastpol.pdf";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
return (
<div className="font-sans scroll-smooth antialiased">
<Head>
<title>RODO - Ochrona Danych Osobowych | Wastpol</title>
<meta
name="description"
content="Informacje dotyczące ochrony danych osobowych w firmie Wastpol zgodnie z RODO"
/>
<link rel="icon" href="/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="true" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
</Head>
<Navigation />
{/* Hero Section for RODO */}
<div className="bg-gray-900 text-white py-20 mt-20">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h1 className="text-4xl font-bold mb-4">
Ochrona Danych Osobowych
</h1>
<p className="text-xl text-gray-300">
Informacje dotyczące przetwarzania danych osobowych zgodnie z RODO
</p>
</div>
</div>
{/* Main Content */}
<div className="py-16 bg-gray-50">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="bg-white rounded-lg shadow-lg p-8 md:p-12">
<section className="mb-12">
<h2 className="text-3xl font-bold text-gray-900 mb-6">
RODO
</h2>
<p className="text-lg text-gray-600 leading-relaxed mb-8">
RODO czyli Rozporządzenie Parlamentu Europejskiego i Rady (UE)
2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób
fizycznych w związku z przetwarzaniem danych osobowych i w sprawie
swobodnego przepływu takich danych oraz uchylenia dyrektywy
95/46/WE (ogólne rozporządzenie o ochronie danych).
</p>
<button
className="bg-blue-600 hover:bg-blue-700 text-white font-semibold py-3 px-6 rounded-lg transition-colors duration-300 inline-flex items-center"
onClick={downloadRodo}
>
<svg className="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
Pobierz rozporządzenie
</button>
</section>
<section className="mb-12">
<h2 className="text-3xl font-bold text-gray-900 mb-6">
Inspektor Ochrony Danych
</h2>
<div className="bg-blue-50 border-l-4 border-blue-400 p-6 mb-6">
<p className="text-lg text-gray-700 leading-relaxed">
Powołaliśmy Inspektora Ochrony Danych, z którym mogą się Państwo
skontaktować w sprawach dotyczących ochrony danych osobowych.
</p>
</div>
<div className="grid md:grid-cols-2 gap-6 mb-8">
<div className="flex items-start space-x-3">
<svg className="w-6 h-6 text-blue-600 mt-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg>
<div>
<h4 className="font-semibold text-gray-900">Email</h4>
<a href="mailto:biuro@wastpol.pl" className="text-blue-600 hover:text-blue-700 transition-colors">
biuro@wastpol.pl
</a>
</div>
</div>
<div className="flex items-start space-x-3">
<svg className="w-6 h-6 text-blue-600 mt-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
<div>
<h4 className="font-semibold text-gray-900">Adres korespondencyjny</h4>
<p className="text-gray-600">
IOD PPHU WASTPOL<br />
33-300 Nowy Sącz<br />
Aleje Wolności 6
</p>
</div>
</div>
</div>
</section>
<section>
<p className="text-lg text-gray-600 leading-relaxed mb-8">
Aby dowiedzieć się więcej na temat przetwarzania danych w firmie
WASTPOL zapoznaj się z poniższym dokumentem.
</p>
<button
className="bg-gray-600 hover:bg-gray-700 text-white font-semibold py-3 px-6 rounded-lg transition-colors duration-300 inline-flex items-center"
onClick={downloadRodoWastpol}
>
<svg className="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
Klauzula informacyjna firmy WASTPOL
</button>
</section>
</div>
</div>
</div>
<Footer />
</div>
);
}

View File

@@ -0,0 +1,13 @@
import Main from "../elements/main";
import Second from "../elements/second";
import Third from "../elements/third";
export default function Content() {
return (
<div>
<Main />
<Second />
<Third />
</div>
);
}

View File

@@ -0,0 +1,7 @@
export default function Footer() {
return (
<div className="flex justify-center py-4">
<p>© Wastpol 2022</p>
</div>
);
}

11
pages/templates/nav.js Normal file
View File

@@ -0,0 +1,11 @@
import Banner from "../elements/banner";
import Links from "../elements/links";
export default function Nav() {
return (
<div className="flex justify-between px-48 py-4">
<Banner />
<Links />
</div>
);
}

6
postcss.config.js Normal file
View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
public/logo_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

4
public/vercel.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg width="283" height="64" viewBox="0 0 283 64" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

117
styles/Home.module.css Normal file
View File

@@ -0,0 +1,117 @@
.container {
padding: 0 2rem;
}
.main {
min-height: 100vh;
padding: 4rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.footer {
display: flex;
flex: 1;
padding: 2rem 0;
border-top: 1px solid #eaeaea;
justify-content: center;
align-items: center;
}
.footer a {
display: flex;
justify-content: center;
align-items: center;
flex-grow: 1;
}
.title a {
color: #0070f3;
text-decoration: none;
}
.title a:hover,
.title a:focus,
.title a:active {
text-decoration: underline;
}
.title {
margin: 0;
line-height: 1.15;
font-size: 4rem;
}
.title,
.description {
text-align: center;
}
.description {
margin: 4rem 0;
line-height: 1.5;
font-size: 1.5rem;
}
.code {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
font-size: 1.1rem;
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
Bitstream Vera Sans Mono, Courier New, monospace;
}
.grid {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
max-width: 800px;
}
.card {
margin: 1rem;
padding: 1.5rem;
text-align: left;
color: inherit;
text-decoration: none;
border: 1px solid #eaeaea;
border-radius: 10px;
transition: color 0.15s ease, border-color 0.15s ease;
max-width: 300px;
}
.card:hover,
.card:focus,
.card:active {
color: #0070f3;
border-color: #0070f3;
}
.card h2 {
margin: 0 0 1rem 0;
font-size: 1.5rem;
}
.card p {
margin: 0;
font-size: 1.25rem;
line-height: 1.5;
}
.logo {
height: 1em;
margin-left: 0.5rem;
}
@media (max-width: 600px) {
.grid {
width: 100%;
flex-direction: column;
}
}

57
styles/globals.css Normal file
View File

@@ -0,0 +1,57 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
@tailwind base;
@tailwind components;
@tailwind utilities;
html {
scroll-behavior: smooth;
}
body {
padding: 0;
margin: 0;
font-family: "Inter", -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
line-height: 1.6;
}
a {
color: inherit;
text-decoration: none;
}
* {
box-sizing: border-box;
}
/* Custom scrollbar */
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
/* Smooth transitions for all interactive elements */
button, a, input, textarea {
transition: all 0.3s ease;
}
/* Focus styles for accessibility */
button:focus,
a:focus,
input:focus,
textarea:focus {
outline: 2px solid #3b82f6;
outline-offset: 2px;
}

34
tailwind.config.js Normal file
View File

@@ -0,0 +1,34 @@
module.exports = {
content: [
"./pages/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {
fontFamily: {
'sans': ['Inter', 'system-ui', 'sans-serif'],
},
backgroundImage: {
main: "url('/main.jpg')",
},
colors: {
blue: {
50: '#eff6ff',
100: '#dbeafe',
200: '#bfdbfe',
300: '#93c5fd',
400: '#60a5fa',
500: '#3b82f6',
600: '#2563eb',
700: '#1d4ed8',
800: '#1e40af',
900: '#1e3a8a',
}
},
animation: {
'bounce': 'bounce 1s infinite',
}
},
},
plugins: [],
};