TenantAtlas/apps/website/src/components/sections/FeaturePillars.astro
ahmido be314c577f Spec 400: rebuild Tenantial homepage visuals (#387)
## Summary
- rebuild the public Tenantial homepage around an evidence-first Microsoft tenant governance narrative
- replace the old hero visual with a new static dashboard preview and add dedicated Trust Bar and Feature Pillars sections
- update the shared public shell, navigation, footer, dark design tokens, assets, and homepage content to match the new brand direction
- align website smoke coverage and Spec 400 artifacts with the rebuilt homepage

## Testing
- not run in this pass
- updated website smoke specs under apps/website/tests/smoke

## Note
- `website-dev` was pushed to `origin` so the requested PR base exists remotely
- the remote `website-dev` branch is an ancestor of `origin/dev`, so this PR may also show upstream `dev` history relative to that base

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #387
2026-05-18 14:38:11 +00:00

71 lines
3.0 KiB
Plaintext

---
import { Icon } from 'astro-icon/components';
import Container from '@/components/primitives/Container.astro';
import Section from '@/components/primitives/Section.astro';
import SectionHeader from '@/components/primitives/SectionHeader.astro';
import type { FeatureItemContent } from '@/types/site';
interface Props {
items: FeatureItemContent[];
}
const { items } = Astro.props;
const lucideMap: Record<string, string> = {
archive: 'lucide:archive',
refresh: 'lucide:refresh-cw',
'git-branch': 'lucide:git-branch',
'file-check': 'lucide:file-check',
clipboard: 'lucide:clipboard-list',
shield: 'lucide:shield-check',
};
---
<Section data-section="feature-pillars">
<Container width="wide">
<div class="grid gap-8 lg:grid-cols-[0.78fr_1.22fr] lg:items-start">
<SectionHeader
eyebrow="Tenantial capabilities"
title="The operating loop buyers need to verify."
description="Each pillar stays tied to evidence, safety, and review context instead of unsupported proof claims."
/>
<div class="grid gap-4 sm:grid-cols-2">
{
items.map((item) => {
const iconName = item.icon ? lucideMap[item.icon] : undefined;
return (
<article
class="rounded-[var(--radius-lg)] border border-[color:var(--color-border)] bg-[var(--color-card)] p-5 shadow-[var(--shadow-soft)]"
data-surface="tenantial-pillar"
>
<div class="flex items-start gap-4">
{iconName && (
<div class="feature-icon" aria-hidden="true">
<Icon name={iconName} size={20} />
</div>
)}
<div class="min-w-0">
<h2 class="m-0 text-lg font-semibold text-[var(--color-foreground)]">
{item.title}
</h2>
<p class="mt-2 text-sm leading-6 text-[var(--color-copy)]">
{item.description}
</p>
{item.meta && (
<p class="mt-3 text-sm font-semibold text-[var(--color-primary)]">
{item.meta}
</p>
)}
</div>
</div>
</article>
);
})
}
</div>
</div>
</Container>
</Section>