feat: Flowbite redesign, real content and new assets (v0.9.1)

- Complete Flowbite layout redesign for HomePage, FeaturesIndexPage,
  AboutPage, ContactPage, BlogIndexPage
- HomePage: Flowbite hero split, feature section with armarium_image.jpg,
  blog preview section, register-only CTA
- AboutPage: founder profile with photo, i18n team/FAQ content in all 4
  locales (about.team.*, about.founder.*, about.faq.*)
- Footer: renamed App → Produkt, added LinkedIn icon, 2-column layout
- Renamed /projects → /features (DE), removed feature detail pages
- Added assets: header_img.jpg, armarium_image.jpg, content_image.jpg,
  about_photo.jpg, Icon.svg, Logo_vertikal.svg

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Daniel Krähenbühl
2026-05-21 12:53:48 +02:00
parent 724080b7c6
commit 59da5eee0b
40 changed files with 775 additions and 2371 deletions
+39 -108
View File
@@ -5,6 +5,8 @@ import Badge from '@/components/ui/data-display/Badge/Badge.astro';
import Card from '@/components/ui/data-display/Card/Card.astro';
import Button from '@/components/ui/form/Button/Button.astro';
import { Hero } from '@/components/hero';
import { Image } from 'astro:assets';
import aboutPhoto from '@/assets/about_photo.jpg';
import { useTranslations } from '@/i18n/utils';
import type { Locale } from '@/i18n/ui';
@@ -22,10 +24,6 @@ const t = useTranslations(locale);
locale={locale}
>
<Hero layout="centered" size="sm">
<Badge slot="badge" variant="brand" pill>
<Icon name="info" size="sm" />
{t('about.badge')}
</Badge>
<h1 slot="title">
<span class="text-foreground [-webkit-text-fill-color:currentColor]">{t('about.title.pre')}</span>
<span class="text-brand-500 [-webkit-text-fill-color:var(--color-brand-500)]">{t('about.title.accent')}</span>
@@ -33,117 +31,50 @@ const t = useTranslations(locale);
<p slot="description">{t('about.desc')}</p>
</Hero>
<!-- Mission -->
<section class="py-[var(--space-section-md)] bg-brand-500/8 dark:bg-background-secondary">
<div class="mx-auto max-w-6xl px-6">
<div class="grid gap-12 lg:grid-cols-2">
<div class="flex flex-col gap-4" data-reveal>
<div class="flex flex-col gap-6">
<Badge variant="brand" pill class="self-start">{t('about.mission.badge')}</Badge>
<h2 class="font-display text-3xl md:text-4xl font-bold text-foreground">
{t('about.mission.title')}
</h2>
<!-- Team -->
<section class="bg-white dark:bg-gray-900 border-t border-border">
<div class="grid gap-16 py-8 px-4 mx-auto max-w-screen-xl lg:grid-cols-2 lg:py-16 lg:px-6">
<div class="text-foreground-muted sm:text-lg">
<h2 class="mb-4 text-4xl tracking-tight font-extrabold text-foreground dark:text-white">{t('about.team.title')}</h2>
<p class="mb-2 md:text-lg">{t('about.team.desc1')}</p>
<p class="font-light md:text-lg">{t('about.team.desc2')}</p>
</div>
<div class="divide-y divide-gray-200 dark:divide-gray-700">
<div class="flex flex-col items-center pb-8 sm:flex-row">
<Image src={aboutPhoto} alt="Daniel Krähenbühl" class="mx-auto mb-4 w-36 h-36 rounded-full object-cover sm:ml-0 sm:mr-6" />
<div class="text-center sm:text-left">
<h3 class="text-xl font-bold tracking-tight text-foreground dark:text-white">Daniel Krähenbühl</h3>
<span class="text-foreground-muted dark:text-gray-400">{t('about.founder.role')}</span>
<p class="mt-3 mb-4 max-w-sm font-light text-foreground-muted dark:text-gray-400">{t('about.founder.bio')}</p>
<ul class="flex justify-center space-x-4 sm:justify-start">
<li>
<a href="https://www.linkedin.com/company/armarium-suite" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn" class="text-foreground-muted hover:text-foreground dark:hover:text-white">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/></svg>
</a>
</li>
</ul>
</div>
<p class="text-lg text-foreground-muted leading-relaxed">{t('about.mission.p1')}</p>
<p class="text-lg text-foreground-muted leading-relaxed">{t('about.mission.p2')}</p>
</div>
<div class="flex flex-col gap-4 h-full" data-reveal data-reveal-delay="1">
<Card variant="elevated" hover class="flex-1 flex flex-col justify-center">
<div class="flex items-start gap-4">
<div class="w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/20 to-brand-500/5 flex items-center justify-center text-brand-500 shrink-0">
<Icon name="wallet" size="md" />
</div>
<div class="flex-1 min-w-0">
<p class="text-xs font-bold tracking-wide text-foreground-muted mb-1">{t('about.app.label')}</p>
<h3 class="text-base font-semibold text-foreground">{t('about.app.title')}</h3>
<p class="text-sm text-foreground-muted leading-relaxed mt-1.5">{t('about.app.desc')}</p>
<div class="flex flex-wrap gap-1.5 mt-3">
<Badge size="sm" variant="brand">Angular</Badge>
<Badge size="sm" variant="brand">Budget</Badge>
<Badge size="sm" variant="brand">{t('about.privacy.label')}</Badge>
</div>
</div>
</div>
</Card>
<Card variant="elevated" hover class="flex-1 flex flex-col justify-center">
<div class="flex items-start gap-4">
<div class="w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/20 to-brand-500/5 flex items-center justify-center text-brand-500 shrink-0">
<Icon name="shield-check" size="md" />
</div>
<div class="flex-1 min-w-0">
<p class="text-xs font-bold tracking-wide text-foreground-muted mb-1">{t('about.privacy.label')}</p>
<h3 class="text-base font-semibold text-foreground">{t('about.privacy.title')}</h3>
<p class="text-sm text-foreground-muted leading-relaxed mt-1.5">{t('about.privacy.desc')}</p>
</div>
</div>
</Card>
</div>
</div>
</div>
</section>
<!-- Values -->
<section class="py-[var(--space-section-md)] border-t border-border">
<div class="mx-auto max-w-6xl px-6">
<div class="mb-8 text-center flex flex-col items-center gap-4" data-reveal>
<div class="flex flex-col items-center gap-6">
<Badge variant="brand" pill>{t('about.values.badge')}</Badge>
<h2 class="font-display text-4xl font-bold text-foreground">{t('about.values.title')}</h2>
</div>
</div>
<div class="grid gap-8 sm:grid-cols-2 lg:grid-cols-4" data-reveal data-reveal-delay="1">
<Card hover>
<div class="flex items-start gap-4">
<div class="w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/20 to-brand-500/5 flex items-center justify-center text-brand-500 shrink-0">
<Icon name="eye" size="md" />
<!-- FAQ -->
<section class="bg-white dark:bg-gray-900 border-t border-border">
<div class="py-8 px-4 mx-auto max-w-screen-xl sm:py-16 lg:px-6">
<h2 class="mb-6 lg:mb-8 text-3xl lg:text-4xl tracking-tight font-extrabold text-center text-foreground dark:text-white">{t('about.faq.title')}</h2>
<div class="mx-auto max-w-screen-md divide-y divide-gray-200 dark:divide-gray-700">
{([1,2,3,4] as const).map((n) => (
<details class="group">
<summary class="flex justify-between items-center py-5 w-full font-medium text-left text-foreground cursor-pointer list-none">
<span>{t(`about.faq.q${n}` as any)}</span>
<svg class="w-6 h-6 shrink-0 transition-transform group-open:rotate-180" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/></svg>
</summary>
<div class="py-5 border-b border-gray-200 dark:border-gray-700">
<p class="text-foreground-muted dark:text-gray-400">{t(`about.faq.a${n}` as any)}</p>
</div>
<div class="flex-1 min-w-0">
<h3 class="text-base font-semibold text-foreground">{t('about.v1.title')}</h3>
<p class="text-sm text-foreground-muted leading-relaxed mt-1.5">{t('about.v1.desc')}</p>
</div>
</div>
</Card>
<Card hover>
<div class="flex items-start gap-4">
<div class="w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/20 to-brand-500/5 flex items-center justify-center text-brand-500 shrink-0">
<Icon name="zap" size="md" />
</div>
<div class="flex-1 min-w-0">
<h3 class="text-base font-semibold text-foreground">{t('about.v2.title')}</h3>
<p class="text-sm text-foreground-muted leading-relaxed mt-1.5">{t('about.v2.desc')}</p>
</div>
</div>
</Card>
<Card hover>
<div class="flex items-start gap-4">
<div class="w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/20 to-brand-500/5 flex items-center justify-center text-brand-500 shrink-0">
<Icon name="lock" size="md" />
</div>
<div class="flex-1 min-w-0">
<h3 class="text-base font-semibold text-foreground">{t('about.v3.title')}</h3>
<p class="text-sm text-foreground-muted leading-relaxed mt-1.5">{t('about.v3.desc')}</p>
</div>
</div>
</Card>
<!-- Made in Zürich -->
<Card hover>
<div class="flex items-start gap-4">
<div class="w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/20 to-brand-500/5 flex items-center justify-center shrink-0">
<svg class="w-6 h-7" viewBox="0 0 32 36" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="Zürich" role="img">
<defs><clipPath id="zh-about"><path d="M16 1L1 7V23L6 30L16 34L26 30L31 23V7L16 1Z"/></clipPath></defs>
<path d="M16 1L1 7V23L6 30L16 34L26 30L31 23V7L16 1Z" fill="white"/>
<polygon points="1,7 16,1 31,7 1,34" fill="#003DA5" clip-path="url(#zh-about)"/>
<path d="M16 1L1 7V23L6 30L16 34L26 30L31 23V7L16 1Z" fill="none" stroke="#003DA5" stroke-width="1.5"/>
</svg>
</div>
<div class="flex-1 min-w-0">
<h3 class="text-base font-semibold text-foreground">{t('about.v4.title')}</h3>
<p class="text-sm text-foreground-muted leading-relaxed mt-1.5">{t('about.v4.desc')}</p>
</div>
</div>
</Card>
</details>
))}
</div>
</div>
</section>