Initial commit with essential code files only
This commit is contained in:
35
.gitignore
vendored
Normal file
35
.gitignore
vendored
Normal 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
34
README.md
Normal 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.
|
||||||
135
components/templates/about.js
Normal file
135
components/templates/about.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
217
components/templates/contact.js
Normal file
217
components/templates/contact.js
Normal 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 są bezpieczne i nie będą przekazywane osobom trzecim.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
112
components/templates/footer.js
Normal file
112
components/templates/footer.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
81
components/templates/hero.js
Normal file
81
components/templates/hero.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
37
components/templates/location.js
Normal file
37
components/templates/location.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
26
components/templates/main.js
Normal file
26
components/templates/main.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
130
components/templates/navigation.js
Normal file
130
components/templates/navigation.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
131
components/templates/second.js
Normal file
131
components/templates/second.js
Normal 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">
|
||||||
|
Ponad 4000 zrealizowanych projektów
|
||||||
|
<br />
|
||||||
|
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>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
166
components/templates/services.js
Normal file
166
components/templates/services.js
Normal 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
4
next.config.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
module.exports = {
|
||||||
|
reactStrictMode: true,
|
||||||
|
|
||||||
|
}
|
||||||
26
package.json
Normal file
26
package.json
Normal 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
15
pages/_app.js
Normal 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
26
pages/api/hello.js
Normal 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
7
pages/elements/banner.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export default function Banner() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<img src="/logo.png"></img>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
10
pages/elements/links.js
Normal file
10
pages/elements/links.js
Normal 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
32
pages/elements/main.js
Normal 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
22
pages/elements/second.js
Normal 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
31
pages/elements/third.js
Normal 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
34
pages/index.js
Normal 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
143
pages/rodo.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
13
pages/templates/content.js
Normal file
13
pages/templates/content.js
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
7
pages/templates/footer.js
Normal file
7
pages/templates/footer.js
Normal 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
11
pages/templates/nav.js
Normal 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
6
postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 101 KiB |
BIN
public/logo.png
Normal file
BIN
public/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
BIN
public/logo_2.png
Normal file
BIN
public/logo_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.7 KiB |
4
public/vercel.svg
Normal file
4
public/vercel.svg
Normal 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
117
styles/Home.module.css
Normal 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
57
styles/globals.css
Normal 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
34
tailwind.config.js
Normal 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: [],
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user