mirror of
https://github.com/R0m1k3/Socialflow.git
synced 2026-10-23 23:18:12 +02:00
- Nouveaux tokens (indigo/corail, statuts, plateformes) et mode sombre - Logo et favicon Social Flow redessinés - AppShell partagé : sidebar groupée (desktop) + barre de navigation basse (mobile) - Suppression des pages mobiles dupliquées et des composants morts - Tableau de bord, connexion, 404, calendrier, médiathèque, IA, statistiques Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ADkrVcVFTT14hbB148HYS
53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import type { LucideIcon } from "lucide-react";
|
|
import type { ReactNode } from "react";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
interface PageHeaderProps {
|
|
title: ReactNode;
|
|
description?: ReactNode;
|
|
icon?: LucideIcon;
|
|
/** Boutons d'action affichés à droite (empilés sous le titre sur mobile). */
|
|
actions?: ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
/** En-tête standard de toutes les pages : icône, titre, description et actions. */
|
|
export function PageHeader({ title, description, icon: Icon, actions, className }: PageHeaderProps) {
|
|
return (
|
|
<header className={cn("mb-6 flex flex-col gap-4 sm:mb-8 sm:flex-row sm:items-start sm:justify-between", className)}>
|
|
<div className="flex min-w-0 items-start gap-3 sm:gap-4">
|
|
{Icon && (
|
|
<div className="hidden h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary sm:flex">
|
|
<Icon className="h-5 w-5" />
|
|
</div>
|
|
)}
|
|
<div className="min-w-0">
|
|
<h1 className="text-2xl font-semibold tracking-tight text-foreground sm:text-[28px] sm:leading-9">{title}</h1>
|
|
{description && <p className="mt-1 text-sm text-muted-foreground sm:text-[15px]">{description}</p>}
|
|
</div>
|
|
</div>
|
|
{actions && <div className="flex shrink-0 flex-wrap items-center gap-2">{actions}</div>}
|
|
</header>
|
|
);
|
|
}
|
|
|
|
interface SectionHeaderProps {
|
|
title: ReactNode;
|
|
description?: ReactNode;
|
|
actions?: ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
/** Titre de section à l'intérieur d'une page. */
|
|
export function SectionHeader({ title, description, actions, className }: SectionHeaderProps) {
|
|
return (
|
|
<div className={cn("mb-3 flex items-end justify-between gap-3", className)}>
|
|
<div className="min-w-0">
|
|
<h2 className="text-base font-semibold text-foreground">{title}</h2>
|
|
{description && <p className="text-sm text-muted-foreground">{description}</p>}
|
|
</div>
|
|
{actions}
|
|
</div>
|
|
);
|
|
}
|