feat: partners section on the homepage (logo + URL, CMS upload)
CI Pipeline with Test Management / 🧪 Run Tests & Generate Reports (push) Waiting to run
CI Pipeline with Test Management / 🐳 Docker Integration Tests (push) Blocked by required conditions
CI Pipeline with Test Management / 🏗️ Build Docker Image (push) Blocked by required conditions
CI Pipeline with Test Management / 📊 Generate Test Summary (push) Blocked by required conditions
Test Reporting & Gherkin Analysis / 🧪 Run Tests & Generate Reports (push) Waiting to run
Test Reporting & Gherkin Analysis / 📊 Analyze Test Coverage (push) Blocked by required conditions
Test Reporting & Gherkin Analysis / 🔄 Sync with Linear (push) Blocked by required conditions
Test Reporting & Gherkin Analysis / ⚡ Performance Monitoring (push) Blocked by required conditions

- home.json gains a partners block (title/subtitle/items: name, url, logo),
  rendered on the homepage under the services section (next/image logos
  linking out with rel=noopener)
- CMS: partner logos uploadable from the 🎨 Logó page via POST /partner-logo
  (PNG, 1 MiB cap, filename sanitized to a slug, written to public/partners/)
- schema + types extended; guide updated

Closes MITHOME-83
This commit is contained in:
Do Siki
2026-08-23 10:22:22 +02:00
parent 410b4a2e2f
commit f65c22987f
9 changed files with 215 additions and 1 deletions
+40
View File
@@ -1,4 +1,5 @@
import { content } from '@/content'
import Image from 'next/image'
const { home: pageContent } = content.pages
@@ -210,6 +211,45 @@ export default function Home() {
</div>
</section>
{/* Partners Section */}
{pageContent.partners.items.length > 0 && (
<section className="py-16">
<div className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-3xl font-bold text-center mb-3" style={{ color: 'var(--color-foreground)' }}>
{pageContent.partners.title}
</h2>
<p className="text-center mb-10" style={{ color: 'var(--color-foreground-muted)' }}>
{pageContent.partners.subtitle}
</p>
<div className="flex flex-wrap justify-center items-center gap-10">
{pageContent.partners.items.map((partner) => (
<a
key={partner.name}
href={partner.url}
target="_blank"
rel="noopener noreferrer"
className="group flex flex-col items-center gap-3 opacity-80 hover:opacity-100 transition-opacity duration-200"
title={partner.name}
>
<span className="relative h-12 w-40">
<Image
src={partner.logo}
alt={partner.name}
fill
sizes="160px"
className="object-contain"
/>
</span>
<span className="text-sm" style={{ color: 'var(--color-foreground-muted)' }}>
{partner.name}
</span>
</a>
))}
</div>
</div>
</section>
)}
{/* CTA Section */}
<section
className="py-20 relative overflow-hidden"
+5
View File
@@ -94,6 +94,11 @@
}
]
},
"partners": {
"title": "Partnereink",
"subtitle": "Akikkel együtt dolgozunk",
"items": []
},
"cta": {
"title": "Kérjen személyre szabott ajánlatot",
"subtitle": "Írja meg röviden, mire van szüksége; segítünk kiválasztani a vállalkozásához illő tárhely-, levelezési vagy domainmegoldást.",
+1
View File
@@ -22,6 +22,7 @@ const schemas = {
hero: object({ title: string, subtitle: string, description: string, trustBullets: array(string), cta: object({ primary: ctaLink, secondary: ctaLink }) }),
about: object({ title: string, usps: array(object({ id: string, title: string, description: string, icon: string })) }),
services: object({ title: string, subtitle: string, items: array(object({ id: string, title: string, description: string, icon: string, features: array(string), ctaText: string })) }),
partners: object({ title: string, subtitle: string, items: array(object({ name: string, url: string, logo: string })) }),
cta: object({ title: string, subtitle: string, button: string }),
serviceFeatures: object({ title: string }),
}),
+9
View File
@@ -54,6 +54,15 @@ export interface HomePageContent {
ctaText: string
}>
}
partners: {
title: string
subtitle: string
items: Array<{
name: string
url: string
logo: string
}>
}
cta: {
title: string
subtitle: string