"use client"
import dynamic from "next/dynamic"
import type { ComponentType } from "react"
import { Icon } from "@iconify/react"
import { LandingReveal } from "@/components/landing/landing-reveal"
import { ProductSectionHeading } from "@/components/landing/product/product-section-heading"
import type { ProductShowcase, ProductShowcaseDemo } from "@/components/landing/product/product-data"
import { cn } from "@/lib/utils"
function DemoLoading() {
return (
Chargement de la démo…
)
}
// Code splitting : chaque démo est chargée à la demande, côté client uniquement,
// pour qu'une page produit n'embarque que ses propres aperçus (et leurs deps lourdes).
// `next/dynamic` exige un objet littéral pour les options (pas une variable partagée).
const DEMO_COMPONENTS: Record = {
"ultimail-inbox": dynamic(
() =>
import("@/components/landing/product/product-demos/ultimail-inbox-demo").then(
(m) => m.UltimailInboxDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultimail-compose": dynamic(
() =>
import("@/components/landing/product/product-demos/ultimail-compose-demo").then(
(m) => m.UltimailComposeDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultimail-automation": dynamic(
() =>
import("@/components/landing/product/product-demos/ultimail-automation-demo").then(
(m) => m.UltimailAutomationDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultidrive-browser": dynamic(
() =>
import("@/components/landing/product/product-demos/ultidrive-browser-demo").then(
(m) => m.UltidriveBrowserDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultidrive-docs": dynamic(
() =>
import("@/components/landing/product/product-demos/ultidrive-docs-demo").then(
(m) => m.UltidriveDocsDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultidrive-share": dynamic(
() =>
import("@/components/landing/product/product-demos/ultidrive-share-demo").then(
(m) => m.UltidriveShareDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultical-agenda": dynamic(
() =>
import("@/components/landing/product/product-demos/ultical-agenda-demo").then(
(m) => m.UlticalAgendaDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultical-invitations": dynamic(
() =>
import("@/components/landing/product/product-demos/ultical-invitation-demo").then(
(m) => m.UlticalInvitationDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultical-scheduling": dynamic(
() =>
import("@/components/landing/product/product-demos/ultical-scheduling-demo").then(
(m) => m.UlticalSchedulingDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultiai-chat": dynamic(
() =>
import("@/components/landing/product/product-demos/ultiai-chat-demo").then(
(m) => m.UltiaiChatDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultiai-tools": dynamic(
() =>
import("@/components/landing/product/product-demos/ultiai-tools-demo").then(
(m) => m.UltiaiToolsDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultiai-triage": dynamic(
() =>
import("@/components/landing/product/product-demos/ultiai-triage-demo").then(
(m) => m.UltiaiTriageDemo
),
{ loading: DemoLoading, ssr: false }
),
"ulticards-directory": dynamic(
() =>
import("@/components/landing/product/product-demos/ulticards-directory-demo").then(
(m) => m.UlticardsDirectoryDemo
),
{ loading: DemoLoading, ssr: false }
),
"ulticards-discovery": dynamic(
() =>
import("@/components/landing/product/product-demos/ulticards-discovery-demo").then(
(m) => m.UlticardsDiscoveryDemo
),
{ loading: DemoLoading, ssr: false }
),
"ulticards-merge": dynamic(
() =>
import("@/components/landing/product/product-demos/ulticards-merge-demo").then(
(m) => m.UlticardsMergeDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultimeet-room": dynamic(
() =>
import("@/components/landing/product/product-demos/ultimeet-room-demo").then(
(m) => m.UltimeetRoomDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultimeet-lobby": dynamic(
() =>
import("@/components/landing/product/product-demos/ultimeet-lobby-demo").then(
(m) => m.UltimeetLobbyDemo
),
{ loading: DemoLoading, ssr: false }
),
"ultimeet-collab": dynamic(
() =>
import("@/components/landing/product/product-demos/ultimeet-collab-demo").then(
(m) => m.UltimeetCollabDemo
),
{ loading: DemoLoading, ssr: false }
),
"admin-migration": dynamic(
() =>
import("@/components/landing/product/product-demos/admin-migration-demo").then(
(m) => m.AdminMigrationDemo
),
{ loading: DemoLoading, ssr: false }
),
"admin-identity": dynamic(
() =>
import("@/components/landing/product/product-demos/admin-identity-demo").then(
(m) => m.AdminIdentityDemo
),
{ loading: DemoLoading, ssr: false }
),
"admin-users": dynamic(
() =>
import("@/components/landing/product/product-demos/admin-users-demo").then(
(m) => m.AdminUsersDemo
),
{ loading: DemoLoading, ssr: false }
),
"admin-quotas": dynamic(
() =>
import("@/components/landing/product/product-demos/admin-quotas-demo").then(
(m) => m.AdminQuotasDemo
),
{ loading: DemoLoading, ssr: false }
),
"admin-policies": dynamic(
() =>
import("@/components/landing/product/product-demos/admin-policies-demo").then(
(m) => m.AdminPoliciesDemo
),
{ loading: DemoLoading, ssr: false }
),
}
export function ProductShowcases({
showcases,
accent,
}: {
showcases: ProductShowcase[]
accent: string
}) {
return (
<>
{showcases.map((showcase, index) => {
const Demo = DEMO_COMPONENTS[showcase.demo]
const reverse = showcase.reverse ?? index % 2 === 1
return (
*:first-child]:order-2 lg:[&>*:last-child]:order-1"
)}
>
{showcase.features.map((feature) => (
-
{feature.title}
{feature.description}
))}
)
})}
>
)
}