Add an explanatory tier legend row below the package cards

Matches the reference mockups' bottom legend: one entry per category
(Einstieg/Upgrade/.../Referenz) with an icon, a label colored to match
that tier's accent, and a short description of what the category means.
Colors are sampled from the same material-theme system driving the cards
above, so it stays in sync with whichever card theme is selected.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Maaxxs 2026-07-08 10:44:34 +02:00
parent 411ee8a241
commit d9cf9516c1
3 changed files with 43 additions and 0 deletions

View file

@ -156,6 +156,15 @@ export default {
requestContact: 'Kontakt anfragen',
featuredBadge: 'Empfohlen',
tierLabels: ['Einstieg', 'Upgrade', 'Performance', 'Premium', 'High-End', 'Signature', 'Referenz'],
tierDescriptions: [
'Solider Sound und spürbare Verbesserung für jeden Tag.',
'Mehr Klarheit und Dynamik für ein intensiveres Hörerlebnis.',
'Spürbar mehr Leistung und Kontrolle für echte Fahrfreude.',
'Premium-Komponenten perfekt abgestimmt für höchste Ansprüche.',
'High-End Performance und individuelle Abstimmung auf höchstem Niveau.',
'Maßgeschneiderte Lösungen und einzigartige Integration für Kenner.',
'Außergewöhnliche Projekte. Grenzenlos in Technik und Design.',
],
tiersHeading: (count) => `${count} Stufen. Ein Ziel: perfekter Klang.`,
tiersSubheading: 'Von der soliden Basis bis zum kompromisslosen Meisterwerk finde dein Paket.',
},

View file

@ -156,6 +156,15 @@ export default {
requestContact: 'Request contact',
featuredBadge: 'Recommended',
tierLabels: ['Entry', 'Upgrade', 'Performance', 'Premium', 'High-End', 'Signature', 'Reference'],
tierDescriptions: [
'Solid sound and a noticeable improvement for every day.',
'More clarity and dynamics for a richer listening experience.',
'Noticeably more power and control for real driving enjoyment.',
'Premium components perfectly tuned for the highest demands.',
'High-end performance and individual tuning at the highest level.',
'Tailored solutions and unique integration for connoisseurs.',
'Exceptional projects. Limitless in technology and design.',
],
tiersHeading: (count) => `${count} tiers. One goal: perfect sound.`,
tiersSubheading: 'From a solid foundation to an uncompromising masterpiece find your package.',
},

View file

@ -48,6 +48,10 @@ const PACKAGE_THEMES = {
],
};
// Ein Icon je Kategorie-Stufe (nicht pro Paket - siehe tierLabels), fuer die erklaerende
// Legende unter der Kachel-Reihe. Reihenfolge muss zu modelPage.tierLabels passen.
const TIER_ICONS = ['route', 'activity', 'gauge', 'shield-check', 'gem', 'crown', 'star'];
const hslToRgb = (h, s, l) => {
s /= 100;
l /= 100;
@ -126,6 +130,15 @@ export default function ModelPage() {
// oben. Das braucht keine zusaetzliche Admin-Einstellung und passt sich automatisch
// an jede Paketanzahl an.
const tierLabels = t('modelPage.tierLabels');
const tierDescriptions = t('modelPage.tierDescriptions');
// Erklaerende Legende unter den Karten: ein Eintrag je Kategorie-Stufe (nicht je Paket),
// Akzentfarbe an einem repraesentativen Punkt der jeweiligen Kategorie-Spanne entnommen,
// damit die Legende farblich zu den Karten oben passt.
const tierLegend = tierLabels.map((label, i) => {
const legendT = (i + 0.5) / tierLabels.length;
const accentRgb = materialRgbAt(MATERIALS, legendT, 'accent').map(Math.round);
return { label, description: tierDescriptions[i], icon: TIER_ICONS[i], color: `rgb(${accentRgb.join(', ')})` };
});
const rankById = new Map(
[...packages].sort((a, b) => a.total_price - b.total_price).map((p, i) => [p.id, i])
);
@ -312,6 +325,18 @@ export default function ModelPage() {
);
})}
</div>
<div className="mt-14 grid grid-cols-2 gap-x-6 gap-y-8 border-t border-white/10 pt-10 sm:grid-cols-4 lg:grid-cols-7">
{tierLegend.map((item) => (
<div key={item.label}>
<DynamicIcon name={item.icon} className="mb-2 h-6 w-6" style={{ color: item.color }} />
<p style={{ color: item.color }} className="text-xs font-semibold uppercase tracking-wider">
{item.label}
</p>
<p className="mt-1 text-xs text-neutral-400">{item.description}</p>
</div>
))}
</div>
</div>
</section>
)}