persolog-Zertifikat als drittes Abzeichen

Anelias persolog-Zertifizierung (Persönlichkeits-Modell, abgeschlossen am
09.10.2026) steht in „Über Anelia“ zwischen Greator Persönlichkeitscoach
und Greator Speaker – nach Datum, das neueste oben. Gleicher Lorbeerkranz,
Hover und Vorschau-Overlay. Im Kranz steht das persolog-Emblem, aus dem
PDF freigestellt (Außenfläche per Floodfill, Kanten gegen Weiß entmischt,
® weggelassen), Farbe und Form unverändert.

Drei Abzeichen sind länger als Text, Werdegang und Marginalien zusammen.
Damit die Zeilen 1–3 nicht mitwachsen, reicht die Spalte ohne Foto über
eine vierte Zeile mit `1fr` (neues Section-Prop `gridClassName`) – der
Überhang landet unten, die Abstände links bleiben wie live.

Der Abzeichen-Titel bricht mit `text-wrap: balance` um, also
„persolog® / Persönlichkeits-Modell“ statt nach dem Bindestrich.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-22 13:10:45 +00:00
1 parent 1e7b84b27c
commit c3351c9a6d
9 files changed
+43 -8

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

+7 -2
View File
@@ -55,6 +55,11 @@ export function About({ photo, content: about = aboutDe, certificates = [] }: Ab
numeral={about.numeral} numeral={about.numeral}
label={about.eyebrow} label={about.eyebrow}
className="py-[clamp(4.5rem,10vh,8rem)] md:py-[clamp(7rem,16vh,14rem)]" className="py-[clamp(4.5rem,10vh,8rem)] md:py-[clamp(7rem,16vh,14rem)]"
/* Ohne Foto reicht die Zertifikatsspalte über eine vierte, sonst leere Zeile.
Weil die `1fr` ist, landet alles, was der Stapel länger ist als Text,
Werdegang und Marginalien, dort – Zeilen 1–3 behalten ihre Höhe, die
Abstände dazwischen wachsen nicht mit. */
gridClassName={cn(!hasPhoto && "lg:grid-rows-[auto_auto_auto_1fr]")}
> >
{hasPhoto && ( {hasPhoto && (
<div className="col-span-12 mb-14 lg:col-span-4 lg:col-start-3 lg:mb-0"> <div className="col-span-12 mb-14 lg:col-span-4 lg:col-start-3 lg:mb-0">
@@ -106,7 +111,7 @@ export function About({ photo, content: about = aboutDe, certificates = [] }: Ab
</Reveal> </Reveal>
{/* Ein einzelnes Zertifikat ist das Gegenstück zur klebenden „04“: gleiche {/* Ein einzelnes Zertifikat ist das Gegenstück zur klebenden „04“: gleiche
Höhe (`calc(50vh − .45em)`), gleiche Zeilen, nur am anderen Rand. Zwei Höhe (`calc(50vh − .45em)`), gleiche Zeilen, nur am anderen Rand. Mehrere
Abzeichen (je rund 24 rem) passen dort nicht mehr ins Bild – dann steht Abzeichen (je rund 24 rem) passen dort nicht mehr ins Bild – dann steht
der Stapel still und beginnt oben auf Höhe der Eyebrow, das neueste der Stapel still und beginnt oben auf Höhe der Eyebrow, das neueste
zuerst. Mit Foto reicht der Text bis Spalte 12 – dort gäbe es keine freie zuerst. Mit Foto reicht der Text bis Spalte 12 – dort gäbe es keine freie
@@ -117,7 +122,7 @@ export function About({ photo, content: about = aboutDe, certificates = [] }: Ab
"col-span-12 mt-14", "col-span-12 mt-14",
hasPhoto hasPhoto
? "lg:col-span-4 lg:col-start-7 lg:row-start-4" ? "lg:col-span-4 lg:col-start-7 lg:row-start-4"
: "lg:col-span-3 lg:col-start-10 lg:row-span-3 lg:row-start-1 lg:mt-0", : "lg:col-span-3 lg:col-start-10 lg:row-span-4 lg:row-start-1 lg:mt-0",
)} )}
> >
<div <div
+4 -1
View File
@@ -29,6 +29,8 @@ export interface SectionProps {
* ist `relative`, das Kind positioniert sich selbst. * ist `relative`, das Kind positioniert sich selbst.
*/ */
lead?: ReactNode; lead?: ReactNode;
/** Zusätzliche Klassen für das 12-Spalten-Raster selbst (z. B. eine Zeilenvorlage). */
gridClassName?: string;
children: ReactNode; children: ReactNode;
} }
@@ -58,6 +60,7 @@ export function Section({
className, className,
as = "section", as = "section",
lead, lead,
gridClassName,
children, children,
}: SectionProps) { }: SectionProps) {
const Tag = as; const Tag = as;
@@ -74,7 +77,7 @@ export function Section({
> >
{lead} {lead}
<Container className="relative"> <Container className="relative">
<div className={GRID}> <div className={cn(GRID, gridClassName)}>
{numeral && ( {numeral && (
<SectionGutter numeral={numeral} total={total} label={label ?? ""} mobileMeta={mobileMeta} /> <SectionGutter numeral={numeral} total={total} label={label ?? ""} mobileMeta={mobileMeta} />
)} )}
+3 -2
View File
@@ -66,8 +66,9 @@ export function Certificate({ content, asset, className }: CertificateProps) {
{/* Zeilenhöhe 1,4 statt 1, damit ein umbrechender Titel („Greator {/* Zeilenhöhe 1,4 statt 1, damit ein umbrechender Titel („Greator
Persönlichkeitscoach“) nicht zusammenklebt. Die Ränder davor und danach Persönlichkeitscoach“) nicht zusammenklebt. Die Ränder davor und danach
sind um den halben Durchschuss (0,15 rem) kürzer – einzeilig steht alles sind um den halben Durchschuss (0,15 rem) kürzer – einzeilig steht alles
wie zuvor mit `leading-none`, `mt-6` und `mt-5`. */} wie zuvor mit `leading-none`, `mt-6` und `mt-5`. `balance`, damit
<span className="mt-[1.35rem] block font-mono text-xs uppercase leading-[1.4] tracking-[0.18em] text-accent"> „persolog® / Persönlichkeits-Modell“ umbricht statt nach dem Bindestrich. */}
<span className="mt-[1.35rem] block font-mono text-xs uppercase leading-[1.4] tracking-[0.18em] text-accent [text-wrap:balance]">
{content.title} {content.title}
</span> </span>
+12
View File
@@ -151,6 +151,18 @@ export const homeEn: HomeContent = {
pdfLabel: "Open PDF", pdfLabel: "Open PDF",
close: "Close", close: "Close",
}, },
persolog: {
title: "persolog® Personality Model",
description: "Certified trainer for the persolog® Personality Model",
date: "October 2026",
cta: "View certificate",
eyebrow: "Certificate",
dialogMeta: "persolog · completed 9 October 2026",
imageAlt:
"Certificate: Anelia Wolf successfully completed the persolog® Personality Model certification on 9 October 2026 and is entitled to call herself a certified trainer for the persolog® Personality Model.",
pdfLabel: "Open PDF",
close: "Close",
},
speaker: { speaker: {
title: "Greator Speaker", title: "Greator Speaker",
description: "Certified graduate of the Greator Speaker programme", description: "Certified graduate of the Greator Speaker programme",
+13
View File
@@ -279,6 +279,19 @@ export const about = {
pdfLabel: "PDF öffnen", pdfLabel: "PDF öffnen",
close: "Schließen", close: "Schließen",
}, },
persolog: {
title: "persolog® Persönlichkeits-Modell",
description: "Zertifizierte Trainerin für das persolog® Persönlichkeits-Modell",
date: "Oktober 2026",
cta: "Zertifikat ansehen",
/* Overlay */
eyebrow: "Zertifikat",
dialogMeta: "persolog · Abschluss am 9. Oktober 2026",
imageAlt:
"Zertifikat: Anelia Wolf hat die Zertifizierung zum persolog® Persönlichkeits-Modell am 9. Oktober 2026 erfolgreich abgeschlossen und ist berechtigt, die Bezeichnung „Zertifizierte Trainerin für das persolog® Persönlichkeits-Modell“ zu führen.",
pdfLabel: "PDF öffnen",
close: "Schließen",
},
speaker: { speaker: {
title: "Greator Speaker", title: "Greator Speaker",
description: "Zertifizierte Absolventin der Greator Speaker Ausbildung", description: "Zertifizierte Absolventin der Greator Speaker Ausbildung",
+4 -3
View File
@@ -58,7 +58,7 @@ export function getSpeakerPdf(): string | null {
} }
/** Schlüssel in `about.certificates` (Texte) – Reihenfolge siehe `CERTIFICATES`. */ /** Schlüssel in `about.certificates` (Texte) – Reihenfolge siehe `CERTIFICATES`. */
export type CertificateKey = "persoenlichkeitscoach" | "speaker"; export type CertificateKey = "persoenlichkeitscoach" | "persolog" | "speaker";
export interface CertificateAsset { export interface CertificateAsset {
key: CertificateKey; key: CertificateKey;
@@ -68,7 +68,7 @@ export interface CertificateAsset {
image: string; image: string;
width: number; width: number;
height: number; height: number;
/** Das runde Greator-Siegel, freigestellt – es steht im Lorbeerkranz. */ /** Siegel bzw. Emblem des Ausstellers, freigestellt – es steht im Lorbeerkranz. */
seal: string; seal: string;
sealSize: number; sealSize: number;
} }
@@ -76,11 +76,12 @@ export interface CertificateAsset {
/** Oben steht das neueste Zertifikat. */ /** Oben steht das neueste Zertifikat. */
const CERTIFICATES = [ const CERTIFICATES = [
{ key: "persoenlichkeitscoach", file: "greator-persoenlichkeitscoach", seal: "greator-siegel-coach.webp", width: 989, height: 1398 }, { key: "persoenlichkeitscoach", file: "greator-persoenlichkeitscoach", seal: "greator-siegel-coach.webp", width: 989, height: 1398 },
{ key: "persolog", file: "persolog-persoenlichkeitsmodell", seal: "persolog-emblem.webp", width: 989, height: 1398 },
{ key: "speaker", file: "greator-speaker", seal: "greator-siegel.webp", width: 989, height: 1400 }, { key: "speaker", file: "greator-speaker", seal: "greator-siegel.webp", width: 989, height: 1400 },
] as const satisfies readonly { key: CertificateKey; file: string; seal: string; width: number; height: number }[]; ] as const satisfies readonly { key: CertificateKey; file: string; seal: string; width: number; height: number }[];
/** /**
* Greator-Zertifikate für die Sektion „Über Anelia“. Ein Zertifikat erscheint nur, * Zertifikate für die Sektion „Über Anelia“. Ein Zertifikat erscheint nur,
* wenn alle drei Dateien liegen – fehlen alle, rendert die Sektion wie vorher * wenn alle drei Dateien liegen – fehlen alle, rendert die Sektion wie vorher
* (Variante B, wie bei den Fotos). * (Variante B, wie bei den Fotos).
*/ */