chore: drobne poprawki UI i naprawa builda

This commit is contained in:
AI Assistant
2026-07-05 13:16:59 +02:00
parent 41ed8876b4
commit a0eb555e22
11 changed files with 71 additions and 59 deletions
-2
View File
@@ -47,8 +47,6 @@ export default function RegulaminPage() {
<h2 id="platnosci">§ 4. Płatności i ceny</h2>
<p>
1. Wszystkie ceny na stronie są cenami brutto (zawierają podatek VAT).
<br />
2. Podatek VAT na urządzenia sprzedawane z usługą montażu dla osób fizycznych w budynkach mieszkalnych o powierzchni do 300 m² rozliczany jest zgodnie z odpowiednimi przepisami podatkowymi (np. stawką 8%).
</p>
<h2 id="odstapienie">§ 5. Odstąpienie od umowy</h2>
+2 -2
View File
@@ -144,7 +144,7 @@ export default function Home() {
{/* Serwis LG */}
<section className="py-16 bg-white">
<div className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="bg-primary rounded-2xl p-8 md:p-10 flex flex-col md:flex-row items-start md:items-center gap-6">
<div className="flex-1">
<div className="inline-flex items-center gap-2 px-3 py-1 bg-white/10 rounded-full text-white text-xs font-semibold mb-4">
@@ -182,7 +182,7 @@ export default function Home() {
{/* Cennik usług */}
<section className="bg-white py-16 px-4">
<div className="bg-slate-50 max-w-7xl mx-auto rounded-[2.5rem] p-6 sm:p-10 lg:p-14">
<div className="max-w-6xl mx-auto flex flex-col gap-8">
<div className="max-w-7xl mx-auto flex flex-col gap-8">
{/* Header (Sekcja hero nad kartami) */}
<div className="mb-2">
+5 -14
View File
@@ -12,8 +12,7 @@ export const PricingTable = () => {
<tr key={item.id} className="border-b border-gray-100 last:border-0 hover:bg-gray-50/50 transition-colors">
<td className="py-4 px-4 text-gray-800 font-medium">{item.name}</td>
<td className="py-4 px-4 text-center whitespace-nowrap text-gray-600">{item.priceNet} zł</td>
<td className="py-4 px-4 text-center whitespace-nowrap font-semibold text-primary">{item.priceGrossPrivate} zł</td>
<td className="py-4 px-4 text-center whitespace-nowrap text-gray-600 hidden sm:table-cell">{item.priceGrossCompany} zł</td>
<td className="py-4 px-4 text-center whitespace-nowrap font-semibold text-primary">{item.priceGrossCompany} zł</td>
</tr>
));
};
@@ -34,14 +33,13 @@ export const PricingTable = () => {
<tr className="bg-gray-50 border-b border-gray-200 text-sm uppercase text-gray-500">
<th className="py-4 px-4 font-semibold w-1/2">Usługa</th>
<th className="py-4 px-4 font-semibold text-center">Cena netto</th>
<th className="py-4 px-4 font-semibold text-center">Brutto (8% VAT)*</th>
<th className="py-4 px-4 font-semibold text-center hidden sm:table-cell">Brutto (23% VAT)</th>
<th className="py-4 px-4 font-semibold text-center">Brutto</th>
</tr>
</thead>
<tbody>
{/* Split */}
<tr>
<td colSpan={4} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
<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>
@@ -49,7 +47,7 @@ export const PricingTable = () => {
{/* Multisplit */}
<tr>
<td colSpan={4} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
<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>
@@ -57,7 +55,7 @@ export const PricingTable = () => {
{/* Usługi dodatkowe */}
<tr>
<td colSpan={4} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
<td colSpan={3} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
Usługi dodatkowe i serwis
</td>
</tr>
@@ -87,13 +85,6 @@ export const PricingTable = () => {
Pobierz cennik PDF
<Download className="w-4 h-4 ml-2 group-hover:-translate-y-1 transition-transform" />
</button>
<div className="text-xs text-gray-500 flex items-start gap-2 bg-white p-3 rounded-lg border border-gray-100">
<Info className="w-4 h-4 shrink-0 text-accent mt-0.5" />
<p>
*Stawka 8% VAT obowiązuje przy montażu w obiektach mieszkalnych (domy do 300m², mieszkania do 150m²).
</p>
</div>
</div>
</div>
</div>
+46 -28
View File
@@ -342,38 +342,56 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
{/* Głośność */}
<Accordion title={`Głośność wewnętrzna (dB) — ${halasMin}–${halasMax} dB`}>
<div className="flex flex-col gap-2">
<div className="flex items-center gap-2">
<span className="text-xs text-text-muted w-8">od</span>
<input
type="range"
min={15}
max={50}
value={halasMin}
onChange={e => {
const val = Number(e.target.value);
setHalasMin(Math.min(val, halasMax - 1));
setPage(1);
}}
className="flex-1 accent-accent cursor-pointer"
/>
<span className="text-xs text-primary font-medium w-10 text-right">{halasMin} dB</span>
<div className="flex flex-col gap-4 px-1">
{/* od */}
<div className="flex flex-col gap-1.5">
<div className="flex items-center justify-between">
<span className="text-xs text-text-muted">od</span>
<span className="text-xs font-bold text-primary bg-accent/10 px-2 py-0.5 rounded-md">{halasMin} dB</span>
</div>
<div className="flex items-center gap-2">
<span className="text-xs text-text-muted w-8">do</span>
<div className="relative h-5 flex items-center">
<div className="absolute w-full h-1.5 bg-slate-200 rounded-full" />
<div
className="absolute h-1.5 bg-accent rounded-full"
style={{ left: `${((halasMin - 15) / 35) * 100}%`, right: `${100 - ((halasMax - 15) / 35) * 100}%` }}
/>
<input
type="range"
min={15}
max={50}
value={halasMax}
onChange={e => {
const val = Number(e.target.value);
setHalasMax(Math.max(val, halasMin + 1));
setPage(1);
}}
className="flex-1 accent-accent cursor-pointer"
min={15} max={50}
value={halasMin}
onChange={e => { setHalasMin(Math.min(Number(e.target.value), halasMax - 1)); setPage(1); }}
className="absolute w-full h-1.5 opacity-0 cursor-pointer z-10"
/>
<span className="text-xs text-primary font-medium w-10 text-right">{halasMax} dB</span>
<div
className="absolute size-4 bg-white border-2 border-accent rounded-full shadow-md pointer-events-none"
style={{ left: `calc(${((halasMin - 15) / 35) * 100}% - 8px)` }}
/>
</div>
</div>
{/* do */}
<div className="flex flex-col gap-1.5">
<div className="flex items-center justify-between">
<span className="text-xs text-text-muted">do</span>
<span className="text-xs font-bold text-primary bg-accent/10 px-2 py-0.5 rounded-md">{halasMax} dB</span>
</div>
<div className="relative h-5 flex items-center">
<div className="absolute w-full h-1.5 bg-slate-200 rounded-full" />
<div
className="absolute h-1.5 bg-accent rounded-full"
style={{ left: `${((halasMin - 15) / 35) * 100}%`, right: `${100 - ((halasMax - 15) / 35) * 100}%` }}
/>
<input
type="range"
min={15} max={50}
value={halasMax}
onChange={e => { setHalasMax(Math.max(Number(e.target.value), halasMin + 1)); setPage(1); }}
className="absolute w-full h-1.5 opacity-0 cursor-pointer z-10"
/>
<div
className="absolute size-4 bg-white border-2 border-accent rounded-full shadow-md pointer-events-none"
style={{ left: `calc(${((halasMax - 15) / 35) * 100}% - 8px)` }}
/>
</div>
</div>
</div>
</Accordion>
+12
View File
@@ -19,4 +19,16 @@ export const companyDetails = {
instagram: "https://instagram.com",
google: "https://google.com/maps",
},
stats: [
{ label: "Lat doświadczenia", value: "15+", number: 15 },
{ label: "Ukończonych realizacji", value: "3500+", number: 3500 },
{ label: "Zadowolonych klientów", value: "99%", number: 99 },
{ label: "Obsługiwanych miast", value: "12+", number: 12 },
],
certificates: [
{ name: "Certyfikat F-Gaz dla przedsiębiorcy", image: "/placeholder-fgaz.png" },
{ name: "Autoryzowany Instalator Daikin", image: "/placeholder-daikin.png" },
{ name: "Autoryzowany Instalator Mitsubishi Electric", image: "/placeholder-mitsubishi.png" },
{ name: "Certyfikat Rzetelna Firma", image: "/placeholder-rzetelna.png" },
],
};
-6
View File
@@ -25,12 +25,6 @@ export const faqData: FaqItem[] = [
answer: 'Tak, montaż jednostki zewnętrznej na elewacji budynku (części wspólnej) wymaga uzyskania zgody administratora, spółdzielni lub wspólnoty. W przypadku montażu na posadzce balkonu, który jest przypisany do mieszkania, często zgoda nie jest wymagana, jednak warto to potwierdzić w regulaminie.',
category: 'klimatyzacja',
},
{
id: 'klimatyzacja-vat',
question: 'Kiedy obowiązuje stawka VAT 8%, a kiedy 23%?',
answer: 'Stawka VAT 8% dotyczy usługi montażu wraz z urządzeniem w obiektach budowlanych zaliczanych do budownictwa objętego społecznym programem mieszkaniowym (np. domy jednorodzinne do 300 m², mieszkania do 150 m²). Dla firm oraz w obiektach o większym metrażu obowiązuje stawka VAT 23%.',
category: 'klimatyzacja',
},
{
id: 'klimatyzacja-przeglad',
question: 'Jak często należy wykonywać przegląd i odgrzybianie klimatyzacji?',
+1 -1
View File
@@ -53,7 +53,7 @@ export const posts: Post[] = [
<li>Sprawdzenie szczelności i uruchomienie systemu.</li>
</ul>
<h3>Ukryte koszty, o których warto pamiętać</h3>
<p>Często zdarza się, że instalacja wymaga dłuższego prowadzenia rur, kucia bruzd w ścianach czy użycia podnośnika koszowego, jeśli mieszkasz na wyższym piętrze. Należy także pamiętać, że instalacja w budownictwie mieszkaniowym objęta jest stawką VAT 8%, a w lokalach usługowych 23%.</p>
<p>Często zdarza się, że instalacja wymaga dłuższego prowadzenia rur, kucia bruzd w ścianach czy użycia podnośnika koszowego, jeśli mieszkasz na wyższym piętrze.</p>
<p>Chcesz poznać dokładną wycenę dla Twojego domu? Zadzwoń do nas, przygotujemy ofertę bez ukrytych kosztów.</p>
`
},
-1
View File
@@ -32,7 +32,6 @@ Wzorzec: rozbudowana strona montażu z konkurencji (proces + cennik + FAQ).
- Tabela z `content/pricing.ts`: kolumny — usługa / cena netto / brutto os. prywatna / brutto firma.
- Sekcje tabeli: split, multisplit, usługi dodatkowe.
- Pod tabelą: „Co obejmuje montaż podstawowy" (lista) + przycisk „Pobierz cennik PDF" (placeholder).
- Adnotacja o stawkach VAT 8%/23%.
### 7. Producenci (`BrandsGrid`)
- Siatka logotypów marek (placeholdery), które firma montuje.
+1 -1
View File
@@ -29,7 +29,7 @@ Z `content/products.ts` przez `getProducts()`. Filtrowanie/sortowanie po stronie
### Układ
1. **Górna część — dwie kolumny:**
- Lewa (`ProductGallery`, Client) — duże zdjęcie + miniatury.
- Prawa (`ProductInfo`) — marka, nazwa (H1), cena, cena z montażem (VAT 8%),
- Prawa (`ProductInfo`) — marka, nazwa (H1), cena, cena z montażem,
wybór wariantu mocy (jeśli są warianty), przyciski „Dodaj do koszyka" i „Kup z montażem",
ikony: lista życzeń, porównanie. Atuty: dostawa, gwarancja, raty.
2. **Zakładki** (`Tabs`, Client) — Opis / Dane techniczne (tabela ze `specs`) / Opinie.
+1 -1
View File
@@ -15,7 +15,7 @@ type Product = {
category: "scienne" | "multisplit" | "przenosne" | "kasetonowe" | "konsolowe";
power: number; // kW
price: number; // cena urządzenia (brutto)
priceWithInstall: number; // cena z montażem (8% VAT)
priceWithInstall: number; // cena z montażem
variants?: { label: string; power: number; price: number }[];
image: string; // placeholder na razie
features: string[]; // np. ["Wi-Fi", "jonizacja", "grzanie"]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB