@medalsocial/meda
Version:
Shared Meda UI shell and runtime package.
216 lines (215 loc) • 5.51 kB
TypeScript
import type { MouseEventHandler, ReactNode } from 'react';
export type MarketingCtaVariant = 'primary' | 'secondary';
export type MarketingAlign = 'start' | 'center';
export interface MarketingCta {
label: ReactNode;
href?: string;
onClick?: MouseEventHandler<HTMLButtonElement>;
variant?: MarketingCtaVariant;
ariaLabel?: string;
target?: string;
rel?: string;
}
export interface MarketingCtaListProps {
ctas?: MarketingCta[];
align?: MarketingAlign;
className?: string;
}
export type MarketingCalloutVariant = 'band' | 'card';
export interface MarketingCalloutProps {
eyebrow?: ReactNode;
title: ReactNode;
description?: ReactNode;
children?: ReactNode;
ctas?: MarketingCta[];
variant?: MarketingCalloutVariant;
align?: MarketingAlign;
className?: string;
}
export interface MarketingOffice {
title?: ReactNode;
address?: ReactNode;
email?: string;
phone?: string;
hours?: ReactNode;
}
export interface MarketingContactPerson {
title?: ReactNode;
name: ReactNode;
role?: ReactNode;
description?: ReactNode;
image?: ReactNode;
email?: string;
phone?: string;
}
export interface MarketingContactProps {
intro?: ReactNode;
form: ReactNode;
office?: MarketingOffice;
contactPerson?: MarketingContactPerson;
compact?: boolean;
className?: string;
}
export type MarketingLeadMagnetVariant = 'featured' | 'sidebar';
export interface MarketingLeadMagnetProps {
title: ReactNode;
description?: ReactNode;
benefits?: ReactNode[];
image?: ReactNode;
buttonText?: ReactNode;
formTitle?: ReactNode;
form?: ReactNode;
variant?: MarketingLeadMagnetVariant;
open?: boolean;
defaultOpen?: boolean;
onOpenChange?: (open: boolean) => void;
className?: string;
}
export interface MarketingHeaderUser {
name: string;
email?: string;
image?: string;
workspaceSlug?: string;
}
interface MarketingNavItemBase {
id: string;
label: ReactNode;
}
export interface MarketingNavLinkItem extends MarketingNavItemBase {
href: string;
hasMenu?: false;
panel?: never;
}
export interface MarketingNavMenuItem extends MarketingNavItemBase {
hasMenu: true;
href?: string;
panel?: ReactNode;
}
export type MarketingNavItemDescriptor = MarketingNavLinkItem | MarketingNavMenuItem;
export interface MarketingHeaderProps {
logo?: ReactNode;
navItems?: MarketingNavItemDescriptor[];
user?: MarketingHeaderUser | null;
signInHref?: string;
signUpHref?: string;
appHref?: string;
rightSlot?: ReactNode;
toggles?: ReactNode;
renderLoggedOut?: (defaults: {
signInHref: string;
signUpHref: string;
}) => ReactNode;
renderLoggedIn?: (user: MarketingHeaderUser, defaults: {
appHref: string;
}) => ReactNode;
className?: string;
}
export interface MarketingShellProps {
header?: ReactNode;
footer?: ReactNode;
children?: ReactNode;
className?: string;
}
export interface MarketingFooterColumn {
title: ReactNode;
links: Array<{
label: ReactNode;
href: string;
}>;
}
export interface MarketingFooterProps {
brand?: ReactNode;
tagline?: ReactNode;
columns?: MarketingFooterColumn[];
bottomSlot?: ReactNode;
className?: string;
}
export interface MarketingTrustStat {
value: ReactNode;
label: ReactNode;
caption?: ReactNode;
}
export interface MarketingTrustBarProps {
eyebrow?: ReactNode;
title?: ReactNode;
stats: MarketingTrustStat[];
className?: string;
}
export interface MarketingBentoGridProps {
cols?: 2 | 3 | 4 | 6 | 12;
children?: ReactNode;
className?: string;
}
export interface MarketingBentoCardProps {
colSpan?: 1 | 2 | 3 | 4 | 6 | 12;
rowSpan?: 1 | 2 | 3;
variant?: 'default' | 'feature' | 'compact';
icon?: ReactNode;
title?: ReactNode;
description?: ReactNode;
children?: ReactNode;
href?: string;
className?: string;
}
export interface MarketingFAQItem {
id: string;
question: ReactNode;
answer: ReactNode;
}
export interface MarketingFAQProps {
eyebrow?: ReactNode;
title?: ReactNode;
items: MarketingFAQItem[];
defaultOpenId?: string;
className?: string;
}
export interface MarketingMegaMenuFeature {
id: string;
icon?: ReactNode;
title: ReactNode;
description?: ReactNode;
href: string;
}
export interface MarketingMegaMenuProps {
triggerId: string;
open: boolean;
onOpenChange: (open: boolean) => void;
features?: MarketingMegaMenuFeature[];
children?: ReactNode;
className?: string;
}
export interface MarketingAnnouncementBarProps {
href?: string;
icon?: ReactNode;
children: ReactNode;
className?: string;
}
export interface MarketingHeroProps {
eyebrow?: ReactNode;
headline: ReactNode;
subtitle?: ReactNode;
ctas?: ReactNode;
meta?: ReactNode;
productMockup?: ReactNode;
className?: string;
}
export interface MarketingNumberedFeature {
id: string;
index: ReactNode;
title: ReactNode;
description: ReactNode;
}
export interface MarketingNumberedFeaturesProps {
eyebrow?: ReactNode;
title?: ReactNode;
features: MarketingNumberedFeature[];
className?: string;
}
export interface MarketingCTAProps {
eyebrow?: ReactNode;
title: ReactNode;
subtitle?: ReactNode;
ctas?: ReactNode;
className?: string;
}
export {};