UI fixes (colors, favicon) and codebase comment cleanup

This commit is contained in:
MichalC
2026-08-11 09:46:19 +02:00
parent 2be143af0f
commit fa51241628
46 changed files with 13 additions and 290 deletions
-4
View File
@@ -8,7 +8,6 @@ export function AboutStory() {
return (
<section className="py-16 md:py-24 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-20 items-center">
{/* Lewa: Obraz */}
<div className="relative">
<div className="relative aspect-[4/5] rounded-3xl overflow-hidden shadow-2xl">
<Image
@@ -18,7 +17,6 @@ export function AboutStory() {
className="object-cover"
/>
</div>
{/* Ozdobny element zaufania */}
<div className="absolute -bottom-8 -right-8 bg-white p-6 rounded-2xl shadow-xl hidden md:block">
<div className="flex items-center gap-4">
<div className="flex-shrink-0 w-16 h-16 bg-accent/10 rounded-full flex items-center justify-center">
@@ -33,8 +31,6 @@ export function AboutStory() {
</div>
</div>
</div>
{/* Prawa: Tekst */}
<div>
<SectionHeading
eyebrow="Nasza Historia"
+1 -1
View File
@@ -12,7 +12,7 @@ export function AdvantagesBar() {
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-6">
{advantages.map((adv, idx) => (
<div key={idx} className="flex items-center justify-center md:justify-start gap-3">
<div key={idx} className="flex items-center justify-center gap-3">
<adv.icon className="size-5 text-accent shrink-0" />
<span className="text-sm font-medium leading-tight">
{adv.text}
-14
View File
@@ -34,8 +34,6 @@ export function BlogPreview() {
subtitle="Dzielimy się wiedzą i doświadczeniem. Zobacz nasze wpisy dotyczące klimatyzacji i pomp ciepła oraz oszczędzania energii."
align="center"
/>
{/* Blog Posts Grid */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{latestPosts.map((post) => (
<article
@@ -43,7 +41,6 @@ export function BlogPreview() {
className="group flex flex-col justify-between border border-border rounded-xl overflow-hidden hover:shadow-md transition-shadow h-full"
>
<div>
{/* Thumbnail */}
<div className="relative aspect-video bg-slate-50 border-b border-border">
<Image
src={post.image}
@@ -53,10 +50,7 @@ export function BlogPreview() {
sizes="(max-width: 768px) 100vw, 33vw"
/>
</div>
{/* Content */}
<div className="p-6">
{/* Category & Date */}
<div className="flex items-center gap-4 text-xs text-text-muted mb-3">
<span className="font-semibold uppercase tracking-wider text-accent">
{getCategoryLabel(post.category)}
@@ -66,20 +60,14 @@ export function BlogPreview() {
<span>{formatDate(post.date)}</span>
</span>
</div>
{/* Title */}
<h3 className="text-lg font-bold text-primary font-heading line-clamp-2 leading-snug group-hover:text-accent transition-colors">
<Link href={`/blog/${post.slug}`}>{post.title}</Link>
</h3>
{/* Excerpt */}
<p className="text-sm text-text-muted mt-3 line-clamp-2 leading-relaxed">
{post.excerpt}
</p>
</div>
</div>
{/* Read More Link */}
<div className="p-6 pt-0 mt-auto">
<Link
href={`/blog/${post.slug}`}
@@ -92,8 +80,6 @@ export function BlogPreview() {
</article>
))}
</div>
{/* Blog Catalog Button */}
<div className="flex justify-center mt-12">
<Link href="/blog" className="btn btn-outline btn-primary bg-white font-bold flex items-center gap-2 group">
-1
View File
@@ -30,7 +30,6 @@ export const BrandsGrid = () => {
href={`/sklep?brand=${encodeURIComponent(brand.name)}`}
className="group flex justify-center items-center h-16 bg-slate-50 rounded-xl p-3 border border-border hover:border-accent hover:bg-accent/5 hover:shadow-sm transition-all duration-300"
>
{/* Tutaj docelowo można dać tag Image */}
<span className="font-bold text-primary text-sm md:text-base tracking-tight opacity-70 group-hover:opacity-100 group-hover:text-accent transition-all">{brand.name}</span>
</Link>
))}
@@ -14,7 +14,6 @@ const steps = [
export const ConfiguratorTeaser = () => {
return (
<section className="py-20 bg-primary text-white relative overflow-hidden">
{/* Background decoration */}
<div className="absolute top-0 right-0 w-1/2 h-full bg-gradient-to-l from-accent/20 to-transparent pointer-events-none" />
<div className="absolute -bottom-24 -left-24 w-64 h-64 bg-accent rounded-full blur-[120px] opacity-20 pointer-events-none" />
@@ -39,7 +38,6 @@ export const ConfiguratorTeaser = () => {
</div>
<div className="relative">
{/* Visual representation of steps */}
<div className="bg-white/10 backdrop-blur-sm border border-white/20 rounded-2xl p-8">
<div className="space-y-6 relative before:absolute before:inset-0 before:ml-6 before:-translate-x-px md:before:mx-auto md:before:translate-x-0 before:h-full before:w-0.5 before:bg-gradient-to-b before:from-transparent before:via-white/30 before:to-transparent">
{steps.map((step, idx) => {
@@ -57,8 +55,6 @@ export const ConfiguratorTeaser = () => {
);
})}
</div>
{/* Pro tip card */}
<div className="mt-8 bg-accent/20 border border-accent/40 rounded-xl p-4 flex items-start">
<Lightbulb className="w-6 h-6 text-accent shrink-0 mr-3 mt-0.5" />
<div>
-11
View File
@@ -7,7 +7,6 @@ export function ContactSection() {
return (
<section className="py-16 md:py-24 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16 lg:gap-24">
{/* Lewa kolumna: Dane kontaktowe */}
<div className="flex flex-col">
<h2 className="text-3xl md:text-4xl font-extrabold text-primary font-heading mb-6">
Porozmawiajmy o Twoim projekcie
@@ -17,7 +16,6 @@ export function ContactSection() {
</p>
<div className="space-y-8 flex-grow">
{/* Telefon */}
<div className="flex items-start gap-4 group">
<div className="w-12 h-12 rounded-xl bg-accent/10 text-accent flex items-center justify-center shrink-0 group-hover:bg-accent group-hover:text-white transition-colors">
<Phone className="w-6 h-6" />
@@ -29,8 +27,6 @@ export function ContactSection() {
</a>
</div>
</div>
{/* Email */}
<div className="flex items-start gap-4 group">
<div className="w-12 h-12 rounded-xl bg-accent/10 text-accent flex items-center justify-center shrink-0 group-hover:bg-accent group-hover:text-white transition-colors">
<Mail className="w-6 h-6" />
@@ -42,8 +38,6 @@ export function ContactSection() {
</a>
</div>
</div>
{/* Adres */}
<div className="flex items-start gap-4 group">
<div className="w-12 h-12 rounded-xl bg-accent/10 text-accent flex items-center justify-center shrink-0 group-hover:bg-accent group-hover:text-white transition-colors">
<MapPin className="w-6 h-6" />
@@ -57,8 +51,6 @@ export function ContactSection() {
</div>
</div>
</div>
{/* Godziny i NIP */}
<div className="grid grid-cols-1 sm:grid-cols-2 gap-8 pt-8 border-t border-border">
<div className="flex items-start gap-3">
<Clock className="w-5 h-5 text-primary/60 mt-0.5 shrink-0" />
@@ -77,10 +69,7 @@ export function ContactSection() {
</div>
</div>
</div>
{/* Prawa kolumna: Formularz */}
<div className="relative">
{/* Tło dekoracyjne */}
<div className="absolute inset-0 bg-primary/5 rounded-[2.5rem] transform translate-x-4 translate-y-4 -z-10 hidden sm:block" />
<ContactForm />
</div>
-4
View File
@@ -22,7 +22,6 @@ export function CtaBanner({
return (
<section className="relative overflow-hidden py-16 md:py-20">
{/* Background and overlays */}
<div
className={cn(
"absolute inset-0 z-0",
@@ -38,7 +37,6 @@ export function CtaBanner({
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex flex-col lg:flex-row items-center justify-between gap-10">
{/* Text Area */}
<div className="max-w-2xl text-center lg:text-left flex flex-col gap-3">
<h2
className={cn(
@@ -57,8 +55,6 @@ export function CtaBanner({
{subtitle}
</p>
</div>
{/* Action buttons */}
<div className="flex flex-col sm:flex-row items-center gap-4 mt-8 w-full sm:w-auto shrink-0 justify-center">
<Link href={ctaLink} className="w-fit sm:w-auto btn btn-primary font-bold text-white px-6">
<span>{ctaText}</span>
-1
View File
@@ -5,7 +5,6 @@ import { companyDetails } from '@/content/company';
export const EmergencyBlock = () => {
return (
<section className="py-12 bg-cta text-white relative overflow-hidden">
{/* Dekoracyjne tło */}
<div className="absolute top-0 right-0 w-1/2 h-full bg-gradient-to-l from-white/10 to-transparent pointer-events-none" />
<div className="absolute -bottom-24 -left-24 w-64 h-64 bg-white/20 rounded-full blur-[100px] pointer-events-none" />
-3
View File
@@ -29,7 +29,6 @@ export function FeaturedPost({ post }: FeaturedPostProps) {
return (
<div className="group relative rounded-2xl overflow-hidden bg-white border border-border shadow-sm hover:shadow-lg transition-all duration-300">
<div className="flex flex-col md:flex-row">
{/* Obraz */}
<div className="relative w-full md:w-3/5 aspect-video md:aspect-auto md:min-h-[400px]">
<Image
src={post.image || '/images/hero/hero-section-image.webp'}
@@ -43,8 +42,6 @@ export function FeaturedPost({ post }: FeaturedPostProps) {
</span>
</div>
</div>
{/* Treść */}
<div className="p-8 md:p-12 flex flex-col justify-center w-full md:w-2/5">
<div className="flex items-center gap-4 text-text-muted text-sm font-medium mb-4">
<div className="flex items-center gap-1.5">
-4
View File
@@ -16,15 +16,11 @@ export function FeaturedProducts() {
subtitle="Poznaj wybrane modele urządzeń chłodzących i grzewczych od wiodących marek. Zapewniamy kompleksowy montaż."
align="center"
/>
{/* Products Grid */}
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 md:gap-8">
{featured.map((product) => (
<ProductCard key={product.slug} product={product} />
))}
</div>
{/* Catalog Link */}
<div className="flex justify-center mt-12">
<Link href="/sklep" className="btn btn-outline btn-primary bg-white font-bold flex items-center gap-2 group">
-3
View File
@@ -50,7 +50,6 @@ export const FundingSection = () => {
</div>
<div className="relative">
{/* Dekoracyjna karta */}
<div className="bg-white rounded-3xl p-8 shadow-xl relative z-10 border border-white/50">
<div className="flex justify-between items-start mb-8">
<div>
@@ -81,8 +80,6 @@ export const FundingSection = () => {
</div>
</div>
</div>
{/* Background elements */}
<div className="absolute -top-6 -right-6 w-full h-full bg-accent/20 rounded-3xl -z-10 blur-sm"></div>
<div className="absolute -bottom-8 -left-8 w-32 h-32 bg-white/40 rounded-full -z-10 blur-xl"></div>
</div>
-19
View File
@@ -4,7 +4,6 @@ import { ArrowRight, Star } from "lucide-react";
import { buttonClasses } from "@/components/ui/Button";
export interface HeroSectionProps {
eyebrow?: string;
title?: React.ReactNode;
subtitle?: string;
ctaText?: string;
@@ -16,7 +15,6 @@ export interface HeroSectionProps {
}
export function HeroSection({
eyebrow = "Wrocław i Dolny Śląsk",
title = (
<>
<span className="text-white">Klimatyzacja</span><br />
@@ -42,31 +40,16 @@ export function HeroSection({
sizes="100vw"
className="object-cover"
/>
{/* NAKŁADKA POD TEKST - jednolita, przyciemniająca */}
<div className="absolute inset-0 bg-black/50" />
<div className="relative z-10 w-full max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16 md:py-24">
<div className="flex flex-col items-start text-left max-w-3xl">
{/* Badge */}
{eyebrow && (
<div className="inline-flex items-center gap-1.5 px-3.5 py-1.5 rounded-full bg-accent/20 border border-accent/30 text-white text-xs font-semibold uppercase tracking-wider mb-6 font-heading">
<span className="size-2 rounded-full bg-accent" />
{eyebrow}
</div>
)}
{/* Heading */}
<h1 className="text-3xl md:text-5xl lg:text-6xl font-extrabold tracking-tight font-heading leading-[1.1] text-white">
{title}
</h1>
{/* Subtitle */}
<p className="mt-6 text-base md:text-lg lg:text-xl text-white/90 max-w-2xl leading-relaxed">
{subtitle}
</p>
{/* Optional Features List */}
{features && features.length > 0 && (
<ul className="mt-6 grid grid-cols-2 gap-3 text-white/90 font-medium">
{features.map((feature, idx) => (
@@ -77,8 +60,6 @@ export function HeroSection({
))}
</ul>
)}
{/* CTA Buttons */}
<div className="mt-10 flex flex-col sm:flex-row items-start sm:items-center gap-4 w-full sm:w-auto">
{ctaText && ctaLink && (
<Link href={ctaLink} className={buttonClasses({ variant: 'primary', size: 'md', className: 'w-fit sm:w-auto group' })}>
-12
View File
@@ -20,11 +20,7 @@ export function HomeServices() {
Profesjonalna obsługa, certyfikowani specjaliści i szybki czas reakcji na terenie całego Wrocławia. Zadbaj o czyste powietrze i wydajność swoich urządzeń.
</p>
</div>
{/* Cards Grid */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{/* Card 1: Montaż klimatyzacji */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -41,8 +37,6 @@ export function HomeServices() {
<p className="text-[10px] text-text-muted mt-1">* cena standardowego montażu do 5m</p>
</div>
</div>
{/* Card 2: Czyszczenie */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -58,8 +52,6 @@ export function HomeServices() {
<p className="text-xl font-extrabold text-primary">od 250 zł</p>
</div>
</div>
{/* Card 3: Przegląd techniczny */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -75,8 +67,6 @@ export function HomeServices() {
<p className="text-xl font-extrabold text-primary">od 150 zł</p>
</div>
</div>
{/* Card 4: Uzupełnienie czynnika */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -92,8 +82,6 @@ export function HomeServices() {
<p className="text-xl font-extrabold text-primary">od 180 zł</p>
</div>
</div>
{/* Card 5: Naprawa usterek */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
-2
View File
@@ -17,8 +17,6 @@ export function MapEmbed() {
className="absolute inset-0"
></iframe>
*/}
{/* Poniżej znajduje się Placeholder */}
<div className="absolute inset-0 flex items-center justify-center bg-slate-200 border-y border-border">
<div className="text-center p-6 bg-white/80 backdrop-blur-sm rounded-xl border border-white/50 shadow-sm max-w-sm mx-4">
<svg className="w-12 h-12 text-primary/40 mx-auto mb-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-5
View File
@@ -6,9 +6,7 @@ export function PillarsSection() {
<section className="py-16 md:py-24 bg-white">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{/* Pillar 1: Chłód i Ogrzewanie */}
<div className="group relative rounded-2xl border border-border p-8 md:p-12 bg-slate-50 hover:bg-white hover:border-accent hover:shadow-xl transition-all duration-300 flex flex-col justify-between overflow-hidden">
{/* Visual background gradient glow on hover */}
<div className="absolute right-0 top-0 size-48 rounded-full bg-accent/5 filter blur-3xl opacity-0 group-hover:opacity-100 transition-opacity" />
<div>
@@ -32,10 +30,7 @@ export function PillarsSection() {
</Link>
</div>
</div>
{/* Pillar 2: Twój Dom */}
<div className="group relative rounded-2xl border border-border p-8 md:p-12 bg-slate-50 hover:bg-white hover:border-cta hover:shadow-xl transition-all duration-300 flex flex-col justify-between overflow-hidden">
{/* Visual background gradient glow on hover */}
<div className="absolute right-0 top-0 size-48 rounded-full bg-cta/5 filter blur-3xl opacity-0 group-hover:opacity-100 transition-opacity" />
<div>
-7
View File
@@ -47,15 +47,12 @@ export function PostsGrid({ posts, featuredPost }: PostsGridProps) {
return (
<div className="py-12">
{/* Artykuł Wyróżniony (tylko na 1 stronie) */}
{featuredPost && currentPage === 1 && (
<div className="mb-16">
<h2 className="text-2xl font-bold text-primary font-heading mb-8">Artykuł wyróżniony</h2>
<FeaturedPost post={featuredPost} />
</div>
)}
{/* Filtry */}
<div className="flex flex-wrap items-center gap-3 mb-12">
{categories.map((category) => (
<button
@@ -72,8 +69,6 @@ export function PostsGrid({ posts, featuredPost }: PostsGridProps) {
</button>
))}
</div>
{/* Siatka Artykułów */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{visiblePosts.map((post) => {
const dateObj = new Date(post.date);
@@ -136,8 +131,6 @@ export function PostsGrid({ posts, featuredPost }: PostsGridProps) {
<p className="text-lg text-text-muted font-medium">Brak artykułów w tej kategorii.</p>
</div>
)}
{/* Paginacja */}
{totalPages > 1 && (
<div className="mt-12 flex flex-wrap justify-center items-center gap-2">
<button
-5
View File
@@ -37,23 +37,18 @@ export const PricingTable = () => {
</tr>
</thead>
<tbody>
{/* Split */}
<tr>
<td colSpan={3} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
Montaż układów SPLIT
</td>
</tr>
{renderTableRows(splitItems)}
{/* Multisplit */}
<tr>
<td colSpan={3} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
Montaż układów MULTISPLIT
</td>
</tr>
{renderTableRows(multisplitItems)}
{/* Usługi dodatkowe */}
<tr>
<td colSpan={3} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
Usługi dodatkowe i serwis
-6
View File
@@ -43,8 +43,6 @@ export function ProcessSteps({
subtitle={subtitle}
align="center"
/>
{/* Process Steps Timeline */}
<div className="relative mt-12">
{/* Desktop connecting line (only if few steps, otherwise wrap) */}
@@ -53,9 +51,7 @@ export function ProcessSteps({
const Icon = iconMap[step.icon || ""] || HelpCircle;
return (
<div key={idx} className="flex flex-col items-center text-center group">
{/* Circle Badge with Icon & Number */}
<div className="relative size-20 rounded-full bg-slate-50 border-2 border-slate-200 flex items-center justify-center text-primary group-hover:border-accent group-hover:bg-accent-light group-hover:text-accent transition-all duration-300 shadow-sm z-10">
{/* Step Number */}
{step.icon && iconMap[step.icon] && (
<span className="absolute -top-1.5 -right-1.5 size-6 rounded-full bg-accent text-white text-xs font-bold flex items-center justify-center font-heading border-2 border-white shadow-sm">
{step.number}
@@ -66,8 +62,6 @@ export function ProcessSteps({
: <span className="text-2xl font-extrabold font-heading text-accent">{step.number}</span>
}
</div>
{/* Title & Description */}
<h3 className="text-lg font-bold text-primary font-heading mt-6 mb-2">
{step.title}
</h3>
-5
View File
@@ -24,7 +24,6 @@ export function ProjectsGrid() {
return (
<section className="py-16 md:py-24 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{/* Filtry */}
<div className="flex flex-wrap items-center justify-center gap-3 mb-12">
{categories.map((category) => (
<button
@@ -41,8 +40,6 @@ export function ProjectsGrid() {
</button>
))}
</div>
{/* Siatka */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{filteredProjects.map((project) => (
<div
@@ -55,8 +52,6 @@ export function ProjectsGrid() {
fill
className="object-cover transition-transform duration-700 group-hover:scale-105"
/>
{/* Nakładka gradientowa */}
<div className="absolute inset-0 bg-gradient-to-t from-primary/90 via-primary/40 to-transparent opacity-80 group-hover:opacity-90 transition-opacity duration-300" />
{/* Treść (Zawsze widoczna lokalizacja i kategoria, pojawiający się opis) */}
-3
View File
@@ -30,7 +30,6 @@ export function WhyUs() {
<section className="py-16 md:py-24 bg-slate-50 border-t border-b border-border">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-12 gap-12 lg:gap-16 items-center">
{/* Left Column: Title, Intro and Statistics */}
<div className="lg:col-span-5 flex flex-col gap-6">
<div>
<span className="text-xs md:text-sm font-semibold uppercase tracking-wider text-accent font-heading">
@@ -54,8 +53,6 @@ export function WhyUs() {
</div>
{/* Right Column: Advantages Grid */}
<div className="lg:col-span-7 grid grid-cols-1 sm:grid-cols-2 gap-6">
{advantages.map((adv, idx) => {
const Icon = adv.icon;