From 3e6cfcbe351cb192871b4814b6dffaeafb757f7a Mon Sep 17 00:00:00 2001 From: Felix Klement Date: Sun, 4 Oct 2026 20:58:21 +0200 Subject: [PATCH] asdf --- src/components/home/Quote.astro | 264 ++++++++++++++++++++++++++++---- src/i18n/ui.ts | 50 ++++-- 2 files changed, 274 insertions(+), 40 deletions(-) diff --git a/src/components/home/Quote.astro b/src/components/home/Quote.astro index d1614d2..8513f94 100644 --- a/src/components/home/Quote.astro +++ b/src/components/home/Quote.astro @@ -1,44 +1,87 @@ --- import { Picture } from 'astro:assets'; import felix from '../../assets/images/people/felix.png'; +import florian from '../../assets/images/people/florian.png'; import { localePath, t, type Lang } from '../../i18n/ui'; interface Props { lang: Lang } const { lang } = Astro.props; const ui = t(lang); -const essay = localePath(lang, '/insights/xg-aloe-user-forum'); +// Where each statement's eyebrow leads, and whose portrait sits beside it. Same order as ui.quote.items. +const sources = [ + { href: localePath(lang, '/insights/xg-aloe-user-forum'), portrait: felix }, + { href: `${localePath(lang, '/team')}#research-title`, portrait: florian }, +]; +const items = ui.quote.items.map((item, i) => ({ ...item, ...sources[i] })); +const quoted = (text: string) => (lang === 'de' ? `„${text}“` : `“${text}”`); --- -
+
-
+
-

{ui.quote.eyebrow} “From Open Interfaces to Open Risks”

-
-

{lang === 'de' ? `„${ui.quote.text}“` : `“${ui.quote.text}”`}

-
-
-

{ui.quote.name}
{ui.quote.role}

-
+
+ {items.map((item, i) => ( +
+

{item.eyebrow}

+
+

{quoted(item.text)}

+
+
+ {item.name}
{item.role} +
+
+ ))} +
+
-
- +
+ {items.map((item, i) => ( +
+ +
+ ))}
-
+
+ + diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index 291e5df..5de6026 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -100,12 +100,25 @@ const en = { partnerRoles: { incubator: 'Incubator', aloe: 'Alliance for open enterprise networks', passau: 'Research partner' }, }, quote: { - eyebrow: 'From the essay', - text: 'Standard-compliant is not the same as secure.', - name: 'Dr. Felix Klement', - role: 'Founder and CEO', - link: 'Read the essay', - portraitAlt: 'Portrait of Dr. Felix Klement, founder and CEO of CipherCell.', + label: 'Statements from the founders', + show: (name: string) => `Show the statement by ${name}`, + slide: (i: number, n: number) => `${i} of ${n}`, + items: [ + { + eyebrow: 'From the essay “From Open Interfaces to Open Risks”', + text: 'Standard-compliant is not the same as secure.', + name: 'Dr. Felix Klement', + role: 'Founder and CEO', + portraitAlt: 'Portrait of Dr. Felix Klement, founder and CEO of CipherCell.', + }, + { + eyebrow: 'On hardware roots of trust', + text: 'Software is only as trustworthy as the hardware it runs on.', + name: 'Dr. Florian Frank', + role: 'Founder and CTO', + portraitAlt: 'Portrait of Dr. Florian Frank, founder and CTO of CipherCell.', + }, + ], }, insights: { title: 'Insights', @@ -394,12 +407,25 @@ const de: typeof en = { partnerRoles: { incubator: 'Inkubator', aloe: 'Allianz für offene Unternehmensnetze', passau: 'Forschungspartner' }, }, quote: { - eyebrow: 'Aus dem Essay', - text: 'Standardkonform ist nicht dasselbe wie sicher.', - name: 'Dr. Felix Klement', - role: 'Gründer und CEO', - link: 'Essay lesen', - portraitAlt: 'Porträt von Dr. Felix Klement, Gründer und CEO von CipherCell.', + label: 'Aussagen der Gründer', + show: (name: string) => `Aussage von ${name} zeigen`, + slide: (i: number, n: number) => `${i} von ${n}`, + items: [ + { + eyebrow: 'Aus dem Essay „From Open Interfaces to Open Risks“', + text: 'Standardkonform ist nicht dasselbe wie sicher.', + name: 'Dr. Felix Klement', + role: 'Gründer und CEO', + portraitAlt: 'Porträt von Dr. Felix Klement, Gründer und CEO von CipherCell.', + }, + { + eyebrow: 'Über Vertrauensanker in der Hardware', + text: 'Software ist nur so vertrauenswürdig wie die Hardware, auf der sie läuft.', + name: 'Dr. Florian Frank', + role: 'Gründer und CTO', + portraitAlt: 'Porträt von Dr. Florian Frank, Gründer und CTO von CipherCell.', + }, + ], }, insights: { title: 'Einblicke',