@medalsocial/meda 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,19 @@
1
+ export { MarketingAnnouncementBar } from './marketing-announcement-bar.js';
1
2
  export { MarketingBentoCard } from './marketing-bento-card.js';
2
3
  export { MarketingBentoGrid } from './marketing-bento-grid.js';
3
4
  export { MarketingCallout } from './marketing-callout.js';
4
5
  export { MarketingContact } from './marketing-contact.js';
6
+ export { MarketingCTA } from './marketing-cta.js';
5
7
  export { MarketingCtaList } from './marketing-cta-list.js';
6
8
  export { MarketingFAQ } from './marketing-faq.js';
7
9
  export { MarketingFooter } from './marketing-footer.js';
8
10
  export { MarketingHeader } from './marketing-header.js';
9
11
  export { MarketingHeaderLogo } from './marketing-header-logo.js';
12
+ export { MarketingHero } from './marketing-hero.js';
10
13
  export { MarketingLeadMagnet } from './marketing-lead-magnet.js';
14
+ export { MarketingMegaMenu } from './marketing-mega-menu.js';
11
15
  export { MarketingNavItem } from './marketing-nav-item.js';
16
+ export { MarketingNumberedFeatures } from './marketing-numbered-features.js';
12
17
  export { MarketingShell } from './marketing-shell.js';
13
18
  export { MarketingTrustBar } from './marketing-trust-bar.js';
14
- export type { MarketingAlign, MarketingBentoCardProps, MarketingBentoGridProps, MarketingCalloutProps, MarketingCalloutVariant, MarketingContactPerson, MarketingContactProps, MarketingCta, MarketingCtaListProps, MarketingCtaVariant, MarketingFAQItem, MarketingFAQProps, MarketingFooterColumn, MarketingFooterProps, MarketingHeaderProps, MarketingHeaderUser, MarketingLeadMagnetProps, MarketingLeadMagnetVariant, MarketingNavItemDescriptor, MarketingOffice, MarketingShellProps, MarketingTrustBarProps, MarketingTrustStat, } from './types.js';
19
+ export type { MarketingAlign, MarketingAnnouncementBarProps, MarketingBentoCardProps, MarketingBentoGridProps, MarketingCalloutProps, MarketingCalloutVariant, MarketingContactPerson, MarketingContactProps, MarketingCTAProps, MarketingCta, MarketingCtaListProps, MarketingCtaVariant, MarketingFAQItem, MarketingFAQProps, MarketingFooterColumn, MarketingFooterProps, MarketingHeaderProps, MarketingHeaderUser, MarketingHeroProps, MarketingLeadMagnetProps, MarketingLeadMagnetVariant, MarketingMegaMenuFeature, MarketingMegaMenuProps, MarketingNavItemDescriptor, MarketingNumberedFeature, MarketingNumberedFeaturesProps, MarketingOffice, MarketingShellProps, MarketingTrustBarProps, MarketingTrustStat, } from './types.js';
@@ -1,13 +1,18 @@
1
+ export { MarketingAnnouncementBar } from './marketing-announcement-bar.js';
1
2
  export { MarketingBentoCard } from './marketing-bento-card.js';
2
3
  export { MarketingBentoGrid } from './marketing-bento-grid.js';
3
4
  export { MarketingCallout } from './marketing-callout.js';
4
5
  export { MarketingContact } from './marketing-contact.js';
6
+ export { MarketingCTA } from './marketing-cta.js';
5
7
  export { MarketingCtaList } from './marketing-cta-list.js';
6
8
  export { MarketingFAQ } from './marketing-faq.js';
7
9
  export { MarketingFooter } from './marketing-footer.js';
8
10
  export { MarketingHeader } from './marketing-header.js';
9
11
  export { MarketingHeaderLogo } from './marketing-header-logo.js';
12
+ export { MarketingHero } from './marketing-hero.js';
10
13
  export { MarketingLeadMagnet } from './marketing-lead-magnet.js';
14
+ export { MarketingMegaMenu } from './marketing-mega-menu.js';
11
15
  export { MarketingNavItem } from './marketing-nav-item.js';
16
+ export { MarketingNumberedFeatures } from './marketing-numbered-features.js';
12
17
  export { MarketingShell } from './marketing-shell.js';
13
18
  export { MarketingTrustBar } from './marketing-trust-bar.js';
@@ -0,0 +1,2 @@
1
+ import type { MarketingAnnouncementBarProps } from './types.js';
2
+ export declare function MarketingAnnouncementBar({ href, icon, children, className, }: MarketingAnnouncementBarProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from './utils.js';
3
+ export function MarketingAnnouncementBar({ href, icon, children, className, }) {
4
+ const Tag = href ? 'a' : 'span';
5
+ return (_jsxs(Tag, { ...(href ? { href } : {}), className: cx('inline-flex items-center gap-2 rounded-full border border-border/60 bg-card/50 px-4 py-1.5 text-xs font-medium text-foreground/80 backdrop-blur', className), children: [icon, children] }));
6
+ }
@@ -0,0 +1,2 @@
1
+ import type { MarketingCTAProps } from './types.js';
2
+ export declare function MarketingCTA({ eyebrow, title, subtitle, ctas, className }: MarketingCTAProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from './utils.js';
3
+ export function MarketingCTA({ eyebrow, title, subtitle, ctas, className }) {
4
+ return (_jsxs("section", { className: cx('mx-auto w-full max-w-4xl px-6 py-24 text-center', className), children: [eyebrow && _jsx("p", { className: "mb-3 text-sm font-semibold text-primary", children: eyebrow }), _jsx("h2", { className: "mx-auto max-w-3xl text-4xl font-semibold sm:text-5xl", children: title }), subtitle && (_jsx("p", { className: "mx-auto mt-4 max-w-xl text-base text-muted-foreground sm:text-lg", children: subtitle })), ctas && _jsx("div", { className: "mt-8 flex flex-wrap items-center justify-center gap-3", children: ctas })] }));
5
+ }
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
3
4
  import { MarketingNavItem } from './marketing-nav-item.js';
4
5
  import { cx } from './utils.js';
5
6
  const DEFAULT_SIGN_IN = '/sign-in';
@@ -12,6 +13,7 @@ function DefaultLoggedIn({ appHref }) {
12
13
  return (_jsx("a", { href: appHref, className: "inline-flex items-center rounded-full bg-primary px-4 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: "Open dashboard" }));
13
14
  }
14
15
  export function MarketingHeader({ logo, navItems = [], user, signInHref = DEFAULT_SIGN_IN, signUpHref = DEFAULT_SIGN_UP, appHref = DEFAULT_APP, rightSlot, toggles, renderLoggedOut, renderLoggedIn, className, }) {
16
+ const [openId, setOpenId] = useState(null);
15
17
  let right;
16
18
  if (rightSlot !== undefined) {
17
19
  right = rightSlot;
@@ -22,5 +24,7 @@ export function MarketingHeader({ logo, navItems = [], user, signInHref = DEFAUL
22
24
  else {
23
25
  right = renderLoggedOut ? (renderLoggedOut({ signInHref, signUpHref })) : (_jsx(DefaultLoggedOut, { signInHref: signInHref, signUpHref: signUpHref }));
24
26
  }
25
- return (_jsxs("nav", { "aria-label": "Primary", className: cx('mx-auto flex w-full max-w-6xl items-center justify-between rounded-full border border-border/60 bg-background/70 px-4 py-2 backdrop-blur supports-[backdrop-filter]:bg-background/50', className), children: [_jsxs("div", { className: "flex items-center gap-6", children: [logo, _jsx("ul", { className: "hidden items-center gap-1 md:flex", children: navItems.map((item) => (_jsx("li", { children: _jsx(MarketingNavItem, { ...item }) }, item.id))) })] }), _jsxs("div", { className: "flex items-center gap-3", children: [toggles, right] })] }));
27
+ const activeItem = navItems.find((i) => i.id === openId);
28
+ const activePanel = activeItem && 'panel' in activeItem ? activeItem.panel : undefined;
29
+ return (_jsxs("nav", { "aria-label": "Primary", className: "relative", onMouseLeave: () => setOpenId(null), children: [_jsxs("div", { className: cx('mx-auto flex w-full max-w-6xl items-center justify-between rounded-full border border-border/60 bg-background/70 px-4 py-2 backdrop-blur supports-[backdrop-filter]:bg-background/50', className), children: [_jsxs("div", { className: "flex items-center gap-6", children: [logo, _jsx("ul", { className: "hidden items-center gap-1 md:flex", children: navItems.map((item) => (_jsx("li", { children: _jsx(MarketingNavItem, { ...item, open: openId === item.id, onToggle: item.hasMenu ? () => setOpenId(openId === item.id ? null : item.id) : undefined }) }, item.id))) })] }), _jsxs("div", { className: "flex items-center gap-3", children: [toggles, right] })] }), activePanel] }));
26
30
  }
@@ -0,0 +1,2 @@
1
+ import type { MarketingHeroProps } from './types.js';
2
+ export declare function MarketingHero({ eyebrow, headline, subtitle, ctas, meta, productMockup, className, }: MarketingHeroProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from './utils.js';
3
+ export function MarketingHero({ eyebrow, headline, subtitle, ctas, meta, productMockup, className, }) {
4
+ return (_jsxs("section", { className: cx('mx-auto w-full max-w-6xl px-6 pt-16 pb-24', className), children: [_jsxs("div", { className: "flex flex-col items-center gap-6 text-center", children: [eyebrow, _jsx("h1", { className: "max-w-4xl text-5xl font-semibold leading-[1.05] tracking-tight sm:text-6xl md:text-7xl lg:text-[80px]", children: headline }), subtitle && (_jsx("p", { className: "max-w-2xl text-base text-muted-foreground sm:text-lg", children: subtitle })), ctas && (_jsx("div", { className: "mt-2 flex flex-wrap items-center justify-center gap-3", children: ctas })), meta && _jsx("p", { className: "text-xs text-muted-foreground", children: meta })] }), productMockup && (_jsx("div", { className: "mt-16 overflow-hidden rounded-3xl border border-border bg-card shadow-2xl", children: productMockup }))] }));
5
+ }
@@ -0,0 +1,2 @@
1
+ import type { MarketingMegaMenuProps } from './types.js';
2
+ export declare function MarketingMegaMenu({ triggerId, open, onOpenChange, features, children, className, }: MarketingMegaMenuProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cx } from './utils.js';
4
+ export function MarketingMegaMenu({ triggerId, open, onOpenChange, features, children, className, }) {
5
+ if (!open)
6
+ return null;
7
+ return (_jsx("div", { role: "dialog", "aria-labelledby": triggerId, onMouseLeave: () => onOpenChange(false), className: cx('absolute left-1/2 top-full mt-3 w-[min(960px,calc(100vw-32px))] -translate-x-1/2 rounded-3xl border border-border bg-card p-6 shadow-2xl backdrop-blur', className), children: children ?? (_jsx("ul", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: features?.map((f) => (_jsx("li", { children: _jsxs("a", { href: f.href, className: "flex items-start gap-3 rounded-xl p-3 hover:bg-muted/40", children: [f.icon && (_jsx("span", { className: "mt-0.5 inline-flex h-8 w-8 items-center justify-center rounded-lg bg-primary/10 text-primary", children: f.icon })), _jsxs("span", { children: [_jsx("span", { className: "block text-sm font-semibold", children: f.title }), f.description && (_jsx("span", { className: "mt-1 block text-xs text-muted-foreground", children: f.description }))] })] }) }, f.id))) })) }));
8
+ }
@@ -1,4 +1,6 @@
1
1
  import type { MarketingNavItemDescriptor } from './types.js';
2
- export declare function MarketingNavItem({ id, label, className, ...rest }: MarketingNavItemDescriptor & {
2
+ export declare function MarketingNavItem({ id, label, className, open, onToggle, ...rest }: MarketingNavItemDescriptor & {
3
3
  className?: string;
4
+ open?: boolean;
5
+ onToggle?: () => void;
4
6
  }): import("react/jsx-runtime").JSX.Element;
@@ -2,9 +2,9 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { ChevronDown } from 'lucide-react';
4
4
  import { cx } from './utils.js';
5
- export function MarketingNavItem({ id, label, className, ...rest }) {
5
+ export function MarketingNavItem({ id, label, className, open = false, onToggle, ...rest }) {
6
6
  if (rest.hasMenu) {
7
- return (_jsxs("button", { type: "button", "data-nav-id": id, "aria-expanded": false, "aria-haspopup": "menu", className: cx('inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-sm text-foreground/80 hover:text-foreground', className), children: [label, _jsx(ChevronDown, { "data-chevron": true, className: "h-3.5 w-3.5", "aria-hidden": true })] }));
7
+ return (_jsxs("button", { type: "button", "data-nav-id": id, id: id, "aria-expanded": open, "aria-haspopup": "menu", onClick: onToggle, className: cx('inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-sm text-foreground/80 hover:text-foreground', className), children: [label, _jsx(ChevronDown, { "data-chevron": true, className: cx('h-3.5 w-3.5 transition', open && 'rotate-180'), "aria-hidden": true })] }));
8
8
  }
9
9
  return (_jsx("a", { href: rest.href, "data-nav-id": id, className: cx('inline-flex items-center rounded-full px-3 py-1.5 text-sm text-foreground/80 hover:text-foreground', className), children: label }));
10
10
  }
@@ -0,0 +1,2 @@
1
+ import type { MarketingNumberedFeaturesProps } from './types.js';
2
+ export declare function MarketingNumberedFeatures({ eyebrow, title, features, className, }: MarketingNumberedFeaturesProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from './utils.js';
3
+ export function MarketingNumberedFeatures({ eyebrow, title, features, className, }) {
4
+ return (_jsxs("section", { className: cx('mx-auto w-full max-w-6xl px-6 py-16', className), children: [(eyebrow || title) && (_jsxs("div", { className: "mb-12 flex flex-col items-center gap-2 text-center", children: [eyebrow && _jsx("p", { className: "text-sm font-semibold text-primary", children: eyebrow }), title && _jsx("h2", { className: "max-w-3xl text-3xl font-semibold sm:text-4xl", children: title })] })), _jsx("ol", { className: "grid gap-6 md:grid-cols-3", children: features.map((f) => (_jsxs("li", { className: "rounded-2xl border border-border bg-card p-6", children: [_jsx("div", { className: "text-sm font-semibold text-primary", children: f.index }), _jsx("h3", { className: "mt-2 text-xl font-semibold", children: f.title }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: f.description })] }, f.id))) })] }));
5
+ }
@@ -1 +1 @@
1
- export type { MarketingBentoCardProps, MarketingBentoGridProps, MarketingCalloutProps, MarketingContactPerson, MarketingContactProps, MarketingCta, MarketingFAQItem, MarketingFAQProps, MarketingFooterColumn, MarketingFooterProps, MarketingHeaderProps, MarketingHeaderUser, MarketingLeadMagnetProps, MarketingNavItemDescriptor, MarketingOffice, MarketingShellProps, MarketingTrustBarProps, MarketingTrustStat, } from './types.js';
1
+ export type { MarketingAnnouncementBarProps, MarketingBentoCardProps, MarketingBentoGridProps, MarketingCalloutProps, MarketingContactPerson, MarketingContactProps, MarketingCTAProps, MarketingCta, MarketingFAQItem, MarketingFAQProps, MarketingFooterColumn, MarketingFooterProps, MarketingHeaderProps, MarketingHeaderUser, MarketingHeroProps, MarketingLeadMagnetProps, MarketingMegaMenuFeature, MarketingMegaMenuProps, MarketingNavItemDescriptor, MarketingNumberedFeature, MarketingNumberedFeaturesProps, MarketingOffice, MarketingShellProps, MarketingTrustBarProps, MarketingTrustStat, } from './types.js';
@@ -163,4 +163,53 @@ export interface MarketingFAQProps {
163
163
  defaultOpenId?: string;
164
164
  className?: string;
165
165
  }
166
+ export interface MarketingMegaMenuFeature {
167
+ id: string;
168
+ icon?: ReactNode;
169
+ title: ReactNode;
170
+ description?: ReactNode;
171
+ href: string;
172
+ }
173
+ export interface MarketingMegaMenuProps {
174
+ triggerId: string;
175
+ open: boolean;
176
+ onOpenChange: (open: boolean) => void;
177
+ features?: MarketingMegaMenuFeature[];
178
+ children?: ReactNode;
179
+ className?: string;
180
+ }
181
+ export interface MarketingAnnouncementBarProps {
182
+ href?: string;
183
+ icon?: ReactNode;
184
+ children: ReactNode;
185
+ className?: string;
186
+ }
187
+ export interface MarketingHeroProps {
188
+ eyebrow?: ReactNode;
189
+ headline: ReactNode;
190
+ subtitle?: ReactNode;
191
+ ctas?: ReactNode;
192
+ meta?: ReactNode;
193
+ productMockup?: ReactNode;
194
+ className?: string;
195
+ }
196
+ export interface MarketingNumberedFeature {
197
+ id: string;
198
+ index: ReactNode;
199
+ title: ReactNode;
200
+ description: ReactNode;
201
+ }
202
+ export interface MarketingNumberedFeaturesProps {
203
+ eyebrow?: ReactNode;
204
+ title?: ReactNode;
205
+ features: MarketingNumberedFeature[];
206
+ className?: string;
207
+ }
208
+ export interface MarketingCTAProps {
209
+ eyebrow?: ReactNode;
210
+ title: ReactNode;
211
+ subtitle?: ReactNode;
212
+ ctas?: ReactNode;
213
+ className?: string;
214
+ }
166
215
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medalsocial/meda",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Shared Meda UI shell and runtime package.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {