Retour au catalogue

Team Advisory

Board et advisors avec photos, titres prestigieux et affiliations. Style investisseur.

teamsimple Both Responsive a11y
corporateelegantelegantsaasuniversalgrid
Theme
"use client";

import { motion } from "framer-motion";
import { ExternalLink } from "lucide-react";

interface Advisor {
  name: string;
  title: string;
  affiliation: string;
  linkedinUrl?: string;
}

interface TeamAdvisoryProps {
  title?: string;
  subtitle?: string;
  description?: string;
  advisors?: Advisor[];
}

const EASE = [0.16, 1, 0.3, 1] as const;

export default function TeamAdvisory({
  title = "Board & Advisors",
  subtitle = "Conseil",
  description = "Des leaders reconnus qui guident notre strategie.",
  advisors = [],
}: TeamAdvisoryProps) {
  return (
    <section
      style={{
        paddingTop: "var(--section-padding-y)",
        paddingBottom: "var(--section-padding-y)",
        background: "var(--color-background-alt)",
      }}
    >
      <div
        style={{
          maxWidth: "var(--container-max-width)",
          margin: "0 auto",
          paddingLeft: "var(--container-padding-x)",
          paddingRight: "var(--container-padding-x)",
        }}
      >
        <motion.div
          initial={{ opacity: 0, y: 16 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true }}
          transition={{ duration: 0.5, ease: EASE }}
          style={{ textAlign: "center", marginBottom: "3rem" }}
        >
          <p
            style={{
              fontSize: "0.75rem",
              fontWeight: 600,
              textTransform: "uppercase",
              letterSpacing: "0.1em",
              color: "var(--color-accent)",
              marginBottom: "0.5rem",
            }}
          >
            {subtitle}
          </p>
          <h2
            style={{
              fontFamily: "var(--font-sans)",
              fontSize: "clamp(1.5rem, 3vw, 2.25rem)",
              fontWeight: 700,
              letterSpacing: "-0.02em",
              color: "var(--color-foreground)",
              marginBottom: "0.75rem",
            }}
          >
            {title}
          </h2>
          <p
            style={{
              fontSize: "1rem",
              color: "var(--color-foreground-muted)",
              maxWidth: "480px",
              margin: "0 auto",
            }}
          >
            {description}
          </p>
        </motion.div>

        <div
          style={{
            display: "grid",
            gridTemplateColumns: "repeat(auto-fit, minmax(260px, 1fr))",
            gap: "1rem",
            maxWidth: "900px",
            margin: "0 auto",
          }}
        >
          {advisors.map((advisor, i) => (
            <motion.div
              key={advisor.name}
              initial={{ opacity: 0, y: 16 }}
              whileInView={{ opacity: 1, y: 0 }}
              viewport={{ once: true }}
              transition={{ duration: 0.4, delay: i * 0.08, ease: EASE }}
              style={{
                display: "flex",
                alignItems: "flex-start",
                gap: "1rem",
                padding: "1.5rem",
                borderRadius: "var(--radius-xl)",
                background: "var(--color-background-card)",
                border: "1px solid var(--color-border)",
              }}
            >
              <div
                style={{
                  width: "56px",
                  height: "56px",
                  borderRadius: "var(--radius-full)",
                  background: "var(--color-accent-subtle)",
                  display: "flex",
                  alignItems: "center",
                  justifyContent: "center",
                  flexShrink: 0,
                }}
              >
                <span
                  style={{
                    fontSize: "1.125rem",
                    fontWeight: 700,
                    color: "var(--color-accent)",
                    fontFamily: "var(--font-serif)",
                  }}
                >
                  {advisor.name.charAt(0)}
                </span>
              </div>
              <div style={{ flex: 1 }}>
                <div style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}>
                  <h3
                    style={{
                      fontSize: "0.9375rem",
                      fontWeight: 600,
                      color: "var(--color-foreground)",
                    }}
                  >
                    {advisor.name}
                  </h3>
                  {advisor.linkedinUrl && (
                    <a
                      href={advisor.linkedinUrl}
                      aria-label={`Profil de ${advisor.name}`}
                      style={{ color: "var(--color-foreground-muted)", flexShrink: 0 }}
                    >
                      <ExternalLink style={{ width: 14, height: 14 }} />
                    </a>
                  )}
                </div>
                <p
                  style={{
                    fontSize: "0.8125rem",
                    fontWeight: 500,
                    color: "var(--color-accent)",
                    marginTop: "0.125rem",
                  }}
                >
                  {advisor.title}
                </p>
                <p
                  style={{
                    fontSize: "0.75rem",
                    color: "var(--color-foreground-muted)",
                    marginTop: "0.25rem",
                  }}
                >
                  {advisor.affiliation}
                </p>
              </div>
            </motion.div>
          ))}
        </div>
      </div>
    </section>
  );
}

Avis

Team Advisory — React Team Section — Incubator