@caqophony/ui 0.3.0 → 0.4.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.
- package/README.md +58 -5
- package/dist/chunk-BAW3RIMF.js +229 -0
- package/dist/chunk-DP5WQAPO.js +23 -0
- package/dist/{chunk-4YA6BZDJ.js → chunk-ODRGJV46.js} +3 -10
- package/dist/chunk-PKP3ZIRB.js +379 -0
- package/dist/chunk-Y6LCXEXZ.js +126 -0
- package/dist/icon.d-DQqyySj2.d.mts +82 -0
- package/dist/index.d.mts +28 -85
- package/dist/index.js +881 -1321
- package/dist/markdown.js +2 -1
- package/dist/marketing.d.mts +437 -0
- package/dist/marketing.js +1422 -0
- package/dist/material-art.d.mts +125 -0
- package/dist/material-art.js +204 -0
- package/dist/material-tones.d.mts +23 -0
- package/dist/material-tones.js +66 -0
- package/dist/material.d.mts +279 -0
- package/dist/material.js +711 -0
- package/package.json +19 -2
- package/styles.css +393 -0
package/dist/markdown.js
CHANGED
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ReactNode, AnchorHTMLAttributes } from 'react';
|
|
4
|
+
|
|
5
|
+
interface MarketingNavItem {
|
|
6
|
+
label: string;
|
|
7
|
+
href: string;
|
|
8
|
+
active?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface MarketingHeaderProps {
|
|
11
|
+
/** Brand name displayed next to logo mark */
|
|
12
|
+
brandName: string;
|
|
13
|
+
/** Brand initials shown in the logo badge */
|
|
14
|
+
brandInitials: string;
|
|
15
|
+
/** Navigation items */
|
|
16
|
+
navItems?: MarketingNavItem[];
|
|
17
|
+
/** Optional right-side actions (buttons, links) */
|
|
18
|
+
actions?: ReactNode;
|
|
19
|
+
/** Additional className */
|
|
20
|
+
className?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Visual variant:
|
|
23
|
+
* - "light" (default): white card bg, dark text
|
|
24
|
+
* - "dark": dark glassmorphic bg, light text (v4 marketing pages)
|
|
25
|
+
*/
|
|
26
|
+
variant?: 'light' | 'dark';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Marketing site header with logo, navigation, and CTA actions.
|
|
30
|
+
* Sticky top navigation bar for product landing pages.
|
|
31
|
+
*
|
|
32
|
+
* Two variants:
|
|
33
|
+
* light — standard white bg for app pages
|
|
34
|
+
* dark — glassmorphic dark bg for the v4 marketing landing
|
|
35
|
+
*
|
|
36
|
+
* #5948: below `md` the links and actions fold into the library's one phone
|
|
37
|
+
* drawer (`NavbarMenu`), in both variants. The drawer stands on the card
|
|
38
|
+
* surface whichever the variant, so its links are drawn for that surface.
|
|
39
|
+
*
|
|
40
|
+
* #5952: the row has a limit, and past it the bar folds into the same drawer at
|
|
41
|
+
* any width (`useFold`), so a brand is never squeezed to make room for links.
|
|
42
|
+
* Before hydration the links give way (the nav has no basis of its own and
|
|
43
|
+
* clips them), so a server render keeps the brand and never scrolls the page.
|
|
44
|
+
*
|
|
45
|
+
* `actions` are one instance. They render into one node, and the node moves
|
|
46
|
+
* between the bar and the open drawer, so an action keeps its state and any
|
|
47
|
+
* modal it owns when the drawer closes around it. A server render has no
|
|
48
|
+
* portal, so they start inline and enter the node on mount.
|
|
49
|
+
*
|
|
50
|
+
* Authored by Caqophony
|
|
51
|
+
*/
|
|
52
|
+
declare function MarketingHeader({ brandName, brandInitials, navItems, actions, className, variant, }: MarketingHeaderProps): react_jsx_runtime.JSX.Element;
|
|
53
|
+
|
|
54
|
+
interface MarketingHeroProps {
|
|
55
|
+
/** Main headline text */
|
|
56
|
+
headline: string;
|
|
57
|
+
/** Subtitle/description text */
|
|
58
|
+
subtitle: string;
|
|
59
|
+
/** Action buttons rendered in a horizontal row */
|
|
60
|
+
actions?: ReactNode;
|
|
61
|
+
/** Optional visual element for split-layout heroes (e.g., a product mock) */
|
|
62
|
+
visual?: ReactNode;
|
|
63
|
+
/** Layout variant: centered (default) or split (text left, visual right) */
|
|
64
|
+
layout?: 'centered' | 'split';
|
|
65
|
+
/** Additional className */
|
|
66
|
+
className?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Marketing hero section on the brand's solid ground.
|
|
70
|
+
* Supports centered layout (most pages) or split layout (copy beside a visual).
|
|
71
|
+
*
|
|
72
|
+
* CSS values traced from HTML mockups:
|
|
73
|
+
* padding: 96px 48px 80px (centered), 80px 48px (split)
|
|
74
|
+
* headline: the type scale, 900, line-height 1.1, max-width 800px
|
|
75
|
+
* subtitle: 20px/400 line-height 1.6, max-width 640px
|
|
76
|
+
* actions gap: 16px
|
|
77
|
+
*
|
|
78
|
+
* Authored by Caqophony
|
|
79
|
+
*/
|
|
80
|
+
declare function MarketingHero({ headline, subtitle, actions, visual, layout, className, }: MarketingHeroProps): react_jsx_runtime.JSX.Element;
|
|
81
|
+
|
|
82
|
+
interface FeatureCardProps {
|
|
83
|
+
/** Icon element rendered in the 48x48 icon container */
|
|
84
|
+
icon: ReactNode;
|
|
85
|
+
/** Feature title */
|
|
86
|
+
title: string;
|
|
87
|
+
/** Feature description */
|
|
88
|
+
description: string;
|
|
89
|
+
/** Additional className */
|
|
90
|
+
className?: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Feature card used in marketing feature grids.
|
|
94
|
+
* Displays an icon, title, and description in a bordered card.
|
|
95
|
+
*
|
|
96
|
+
* CSS values traced from HTML mockups:
|
|
97
|
+
* card: bg card, border 1px border, border-radius 12px, padding 24px, shadow-sm
|
|
98
|
+
* icon container: 48x48, bg primary/10, border-radius 8px
|
|
99
|
+
* icon: 24x24, color primary
|
|
100
|
+
* title: 16px/700, margin-bottom 8px
|
|
101
|
+
* description: the type scale's sm, muted-fg, line-height 1.6
|
|
102
|
+
*
|
|
103
|
+
* Authored by Caqophony
|
|
104
|
+
*/
|
|
105
|
+
declare function FeatureCard({ icon, title, description, className, }: FeatureCardProps): react_jsx_runtime.JSX.Element;
|
|
106
|
+
|
|
107
|
+
interface PricingTierProps {
|
|
108
|
+
/** Tier name (e.g., "Free Tier", "Pro") */
|
|
109
|
+
name: string;
|
|
110
|
+
/** Price display (e.g., "$0", "$29", "Usage-based") */
|
|
111
|
+
price: string;
|
|
112
|
+
/** Period text (e.g., "forever", "per AI agent/month") */
|
|
113
|
+
period: string;
|
|
114
|
+
/** List of feature strings */
|
|
115
|
+
features: string[];
|
|
116
|
+
/** Whether this tier is highlighted/recommended */
|
|
117
|
+
highlighted?: boolean;
|
|
118
|
+
/** Action button */
|
|
119
|
+
action?: ReactNode;
|
|
120
|
+
/** Additional className */
|
|
121
|
+
className?: string;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Pricing tier card for marketing pricing sections.
|
|
125
|
+
* Supports a highlighted variant for the recommended plan.
|
|
126
|
+
*
|
|
127
|
+
* CSS values traced from HTML mockups:
|
|
128
|
+
* card: bg card, border 1px border, border-radius 12px, padding 32px, text-align center
|
|
129
|
+
* highlighted: border-color primary, shadow ring 2px primary/10 + shadow-lg
|
|
130
|
+
* name: 18px/700
|
|
131
|
+
* price: the type scale's 4xl, 900, primary-text
|
|
132
|
+
* period: the type scale's sm, muted-fg, margin-bottom 24px
|
|
133
|
+
* features: list-style none, text-align left, 14px, padding 6px 0, green dots 8px
|
|
134
|
+
*
|
|
135
|
+
* Authored by Caqophony
|
|
136
|
+
*/
|
|
137
|
+
declare function PricingTier({ name, price, period, features, highlighted, action, className, }: PricingTierProps): react_jsx_runtime.JSX.Element;
|
|
138
|
+
|
|
139
|
+
interface MarketingFAQItemProps {
|
|
140
|
+
/** The question */
|
|
141
|
+
question: string;
|
|
142
|
+
/** The answer */
|
|
143
|
+
answer: string;
|
|
144
|
+
/** Whether this is displayed on a dark background */
|
|
145
|
+
dark?: boolean;
|
|
146
|
+
/** Additional className */
|
|
147
|
+
className?: string;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Individual FAQ item for marketing FAQ sections.
|
|
151
|
+
* Displays a question and answer with a bottom border separator.
|
|
152
|
+
*
|
|
153
|
+
* CSS values traced from HTML mockups:
|
|
154
|
+
* container: border-bottom 1px dark-border, padding 24px 0
|
|
155
|
+
* question: 16px/600 (dark: dark-fg color)
|
|
156
|
+
* answer: 14px, line-height 1.7, color dark-muted
|
|
157
|
+
*
|
|
158
|
+
* Authored by Caqophony
|
|
159
|
+
*/
|
|
160
|
+
declare function MarketingFAQItem({ question, answer, dark, className, }: MarketingFAQItemProps): react_jsx_runtime.JSX.Element;
|
|
161
|
+
|
|
162
|
+
interface CTABannerProps {
|
|
163
|
+
/** Main headline */
|
|
164
|
+
headline: string;
|
|
165
|
+
/** Description text */
|
|
166
|
+
description: string;
|
|
167
|
+
/** Action buttons */
|
|
168
|
+
actions?: ReactNode;
|
|
169
|
+
/** Additional className */
|
|
170
|
+
className?: string;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Full-width CTA banner section for marketing pages.
|
|
174
|
+
* The brand's solid ground with centered text and actions.
|
|
175
|
+
*
|
|
176
|
+
* CSS values traced from HTML mockups:
|
|
177
|
+
* padding 80px 48px, text-align center
|
|
178
|
+
* headline: 36px/800, margin-bottom 16px
|
|
179
|
+
* description: 18px, margin-bottom 32px
|
|
180
|
+
* actions: flex, gap 16px, justify-content center
|
|
181
|
+
*
|
|
182
|
+
* Authored by Caqophony
|
|
183
|
+
*/
|
|
184
|
+
declare function CTABanner({ headline, description, actions, className, }: CTABannerProps): react_jsx_runtime.JSX.Element;
|
|
185
|
+
|
|
186
|
+
type MarketingCtaGround = 'light' | 'brand' | 'dark' | 'image';
|
|
187
|
+
type MarketingCtaEmphasis = 'primary' | 'secondary';
|
|
188
|
+
interface MarketingCtaProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'children'> {
|
|
189
|
+
/** Where it goes. */
|
|
190
|
+
href: string;
|
|
191
|
+
/** What it stands on: `brand` is the primary colour, `dark` a night band, `image` a picture. */
|
|
192
|
+
ground: MarketingCtaGround;
|
|
193
|
+
/** `primary` is the one action a section asks for; `secondary` the quieter one beside it. */
|
|
194
|
+
emphasis: MarketingCtaEmphasis;
|
|
195
|
+
children: ReactNode;
|
|
196
|
+
}
|
|
197
|
+
/** A marketing call to action, drawn for the ground it stands on. */
|
|
198
|
+
declare function MarketingCta({ href, ground, emphasis, className, children, ...anchor }: MarketingCtaProps): react_jsx_runtime.JSX.Element;
|
|
199
|
+
|
|
200
|
+
interface HowItWorksStepProps {
|
|
201
|
+
/** Step number (1, 2, 3, 4) */
|
|
202
|
+
stepNumber: number;
|
|
203
|
+
/** Step title */
|
|
204
|
+
title: string;
|
|
205
|
+
/** Step description */
|
|
206
|
+
description: string;
|
|
207
|
+
/** Additional className */
|
|
208
|
+
className?: string;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Individual step card for "How It Works" sections.
|
|
212
|
+
* Centered layout with numbered circle, title, and description.
|
|
213
|
+
*
|
|
214
|
+
* CSS values traced from HTML mockups:
|
|
215
|
+
* container: text-align center
|
|
216
|
+
* number circle: 48x48, border-radius 50%, bg primary-solid,
|
|
217
|
+
* font-size 20px/700, margin 0 auto 16px
|
|
218
|
+
* title: the type scale's base, 700, margin-bottom 8px
|
|
219
|
+
* description: the type scale's sm, muted-fg, line-height 1.6
|
|
220
|
+
*
|
|
221
|
+
* Authored by Caqophony
|
|
222
|
+
*/
|
|
223
|
+
declare function HowItWorksStep({ stepNumber, title, description, className, }: HowItWorksStepProps): react_jsx_runtime.JSX.Element;
|
|
224
|
+
|
|
225
|
+
interface UseCaseCardProps {
|
|
226
|
+
/** Persona/audience name (e.g., "Development Teams", "Solo Founders") */
|
|
227
|
+
persona: string;
|
|
228
|
+
/** Scenario description */
|
|
229
|
+
scenario: string;
|
|
230
|
+
/** Outcome/result text (displayed in success color) */
|
|
231
|
+
outcome: string;
|
|
232
|
+
/** Additional className */
|
|
233
|
+
className?: string;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Use case card for marketing persona/audience sections.
|
|
237
|
+
* Bordered card with persona, scenario description, and outcome.
|
|
238
|
+
*
|
|
239
|
+
* CSS values traced from HTML mockups:
|
|
240
|
+
* card: bg card, border 1px border, border-radius 12px, padding 32px
|
|
241
|
+
* persona: 18px/700, margin-bottom 12px
|
|
242
|
+
* scenario: 14px muted-fg, line-height 1.6, margin-bottom 16px
|
|
243
|
+
* outcome: 14px/500 success color, line-height 1.5
|
|
244
|
+
*
|
|
245
|
+
* Authored by Caqophony
|
|
246
|
+
*/
|
|
247
|
+
declare function UseCaseCard({ persona, scenario, outcome, className, }: UseCaseCardProps): react_jsx_runtime.JSX.Element;
|
|
248
|
+
|
|
249
|
+
interface BlogPost {
|
|
250
|
+
id: string;
|
|
251
|
+
title: string;
|
|
252
|
+
excerpt?: string;
|
|
253
|
+
date: string;
|
|
254
|
+
author?: string;
|
|
255
|
+
authorAvatar?: string;
|
|
256
|
+
thumbnail?: string;
|
|
257
|
+
category?: string;
|
|
258
|
+
href?: string;
|
|
259
|
+
}
|
|
260
|
+
interface BlogGridProps extends React.HTMLAttributes<HTMLElement> {
|
|
261
|
+
/** Layout variant */
|
|
262
|
+
variant?: 'threeColumn' | 'featured' | 'list';
|
|
263
|
+
/** Blog posts */
|
|
264
|
+
posts: BlogPost[];
|
|
265
|
+
/** Section heading */
|
|
266
|
+
heading?: string;
|
|
267
|
+
/** Section description */
|
|
268
|
+
description?: string;
|
|
269
|
+
}
|
|
270
|
+
declare function BlogGrid({ variant, posts, heading, description, className, ...props }: BlogGridProps): react_jsx_runtime.JSX.Element;
|
|
271
|
+
|
|
272
|
+
interface ComparisonPlan {
|
|
273
|
+
id: string;
|
|
274
|
+
name: string;
|
|
275
|
+
description?: string;
|
|
276
|
+
featured?: boolean;
|
|
277
|
+
/** The label over a featured plan's column (`featured` variant) */
|
|
278
|
+
badge?: string;
|
|
279
|
+
}
|
|
280
|
+
interface ComparisonFeature {
|
|
281
|
+
key: string;
|
|
282
|
+
label: string;
|
|
283
|
+
values: Record<string, boolean | string>;
|
|
284
|
+
}
|
|
285
|
+
interface ComparisonTableProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
286
|
+
/** Layout variant */
|
|
287
|
+
variant?: 'simple' | 'featured';
|
|
288
|
+
/** Plans to compare */
|
|
289
|
+
plans: ComparisonPlan[];
|
|
290
|
+
/** Feature rows */
|
|
291
|
+
features: ComparisonFeature[];
|
|
292
|
+
/** Section heading */
|
|
293
|
+
heading?: string;
|
|
294
|
+
}
|
|
295
|
+
declare function ComparisonTable({ variant, plans, features, heading, className, ...props }: ComparisonTableProps): react_jsx_runtime.JSX.Element;
|
|
296
|
+
|
|
297
|
+
interface LogoItem {
|
|
298
|
+
name: string;
|
|
299
|
+
src?: string;
|
|
300
|
+
icon?: React.ReactNode;
|
|
301
|
+
}
|
|
302
|
+
interface LogoCloudProps extends React.HTMLAttributes<HTMLElement> {
|
|
303
|
+
/** Layout variant */
|
|
304
|
+
variant?: 'simple' | 'branded' | 'scrolling';
|
|
305
|
+
/** Logo items */
|
|
306
|
+
logos: LogoItem[];
|
|
307
|
+
/** Section heading */
|
|
308
|
+
heading?: string;
|
|
309
|
+
}
|
|
310
|
+
declare function LogoCloud({ variant, logos, heading, className, ...props }: LogoCloudProps): react_jsx_runtime.JSX.Element;
|
|
311
|
+
|
|
312
|
+
interface TeamMember {
|
|
313
|
+
id: string;
|
|
314
|
+
name: string;
|
|
315
|
+
role: string;
|
|
316
|
+
bio?: string;
|
|
317
|
+
avatar?: string;
|
|
318
|
+
socialLinks?: {
|
|
319
|
+
label: string;
|
|
320
|
+
href: string;
|
|
321
|
+
icon?: React.ReactNode;
|
|
322
|
+
}[];
|
|
323
|
+
}
|
|
324
|
+
interface TeamSectionProps extends React.HTMLAttributes<HTMLElement> {
|
|
325
|
+
/** Layout variant */
|
|
326
|
+
variant?: 'grid' | 'list' | 'cards';
|
|
327
|
+
/** Team members */
|
|
328
|
+
members: TeamMember[];
|
|
329
|
+
/** Section heading */
|
|
330
|
+
heading?: string;
|
|
331
|
+
/** Section description */
|
|
332
|
+
description?: string;
|
|
333
|
+
/** Grid columns (grid/cards variant) */
|
|
334
|
+
columns?: 2 | 3 | 4;
|
|
335
|
+
}
|
|
336
|
+
declare function TeamSection({ variant, members, heading, description, columns, className, ...props }: TeamSectionProps): react_jsx_runtime.JSX.Element;
|
|
337
|
+
|
|
338
|
+
interface NewsletterSectionProps extends React.HTMLAttributes<HTMLElement> {
|
|
339
|
+
/** Layout variant */
|
|
340
|
+
variant?: 'centered' | 'split' | 'inline';
|
|
341
|
+
/** Section heading */
|
|
342
|
+
heading?: string;
|
|
343
|
+
/** Section description */
|
|
344
|
+
description?: string;
|
|
345
|
+
/** CTA button label */
|
|
346
|
+
ctaLabel?: string;
|
|
347
|
+
/** Placeholder for email input */
|
|
348
|
+
placeholder?: string;
|
|
349
|
+
/** Called with the email value on submit */
|
|
350
|
+
onSubscribe?: (email: string) => void;
|
|
351
|
+
}
|
|
352
|
+
declare function NewsletterSection({ variant, heading, description, ctaLabel, placeholder, onSubscribe, className, ...props }: NewsletterSectionProps): react_jsx_runtime.JSX.Element;
|
|
353
|
+
|
|
354
|
+
interface ContactFormData {
|
|
355
|
+
name: string;
|
|
356
|
+
email: string;
|
|
357
|
+
message: string;
|
|
358
|
+
}
|
|
359
|
+
interface ContactSectionProps extends React.HTMLAttributes<HTMLElement> {
|
|
360
|
+
/** Layout variant */
|
|
361
|
+
variant?: 'splitForm' | 'centered' | 'withMap';
|
|
362
|
+
/** Section heading */
|
|
363
|
+
heading?: string;
|
|
364
|
+
/** Section description */
|
|
365
|
+
description?: string;
|
|
366
|
+
/** Submit button label */
|
|
367
|
+
submitLabel?: string;
|
|
368
|
+
/** Called with form data on submit */
|
|
369
|
+
onSubmitForm?: (data: ContactFormData) => void;
|
|
370
|
+
/** Map slot (withMap variant) */
|
|
371
|
+
mapSlot?: React.ReactNode;
|
|
372
|
+
}
|
|
373
|
+
declare function ContactSection({ variant, heading, description, submitLabel, onSubmitForm, mapSlot, className, ...props }: ContactSectionProps): react_jsx_runtime.JSX.Element;
|
|
374
|
+
|
|
375
|
+
interface FooterLink {
|
|
376
|
+
label: string;
|
|
377
|
+
href: string;
|
|
378
|
+
}
|
|
379
|
+
interface FooterLinkGroup {
|
|
380
|
+
title: string;
|
|
381
|
+
links: FooterLink[];
|
|
382
|
+
}
|
|
383
|
+
interface SocialLink {
|
|
384
|
+
label: string;
|
|
385
|
+
href: string;
|
|
386
|
+
icon: React.ReactNode;
|
|
387
|
+
}
|
|
388
|
+
interface MarketingFooterProps extends React.HTMLAttributes<HTMLElement> {
|
|
389
|
+
/** Layout variant */
|
|
390
|
+
variant?: 'simple' | 'multiColumn' | 'withNewsletter';
|
|
391
|
+
/** Company/product name */
|
|
392
|
+
brandName: string;
|
|
393
|
+
/** The product's mark: drawn in a 24px box, in the `primary-text` colour */
|
|
394
|
+
logo?: React.ReactNode;
|
|
395
|
+
/** Link groups (multiColumn variant) */
|
|
396
|
+
linkGroups?: FooterLinkGroup[];
|
|
397
|
+
/** Flat links (simple variant) */
|
|
398
|
+
links?: FooterLink[];
|
|
399
|
+
/** Social media links */
|
|
400
|
+
socialLinks?: SocialLink[];
|
|
401
|
+
/** Legal/copyright text */
|
|
402
|
+
legalText?: string;
|
|
403
|
+
/** Newsletter heading (withNewsletter variant) */
|
|
404
|
+
newsletterHeading?: string;
|
|
405
|
+
/** Newsletter description */
|
|
406
|
+
newsletterDescription?: string;
|
|
407
|
+
/** Called with email on newsletter subscribe */
|
|
408
|
+
onSubscribe?: (email: string) => void;
|
|
409
|
+
}
|
|
410
|
+
declare function MarketingFooter({ variant, brandName, logo, linkGroups, links, socialLinks, legalText, newsletterHeading, newsletterDescription, onSubscribe, className, ...props }: MarketingFooterProps): react_jsx_runtime.JSX.Element;
|
|
411
|
+
|
|
412
|
+
interface Testimonial {
|
|
413
|
+
id: string;
|
|
414
|
+
quote: string;
|
|
415
|
+
name: string;
|
|
416
|
+
role?: string;
|
|
417
|
+
company?: string;
|
|
418
|
+
avatar?: string;
|
|
419
|
+
logo?: string;
|
|
420
|
+
}
|
|
421
|
+
interface TestimonialSectionProps extends React.HTMLAttributes<HTMLElement> {
|
|
422
|
+
/** Layout variant */
|
|
423
|
+
variant?: 'grid' | 'carousel' | 'singleQuote' | 'wallOfLove';
|
|
424
|
+
/** Testimonial data */
|
|
425
|
+
testimonials: Testimonial[];
|
|
426
|
+
/** Section heading */
|
|
427
|
+
heading?: string;
|
|
428
|
+
/** Section subheading */
|
|
429
|
+
subheading?: string;
|
|
430
|
+
/** Grid columns (grid variant) */
|
|
431
|
+
columns?: 2 | 3;
|
|
432
|
+
/** Auto-advance interval in ms (carousel variant, 0 to disable) */
|
|
433
|
+
autoPlayInterval?: number;
|
|
434
|
+
}
|
|
435
|
+
declare function TestimonialSection({ variant, testimonials, heading, subheading, columns, autoPlayInterval, className, ...props }: TestimonialSectionProps): react_jsx_runtime.JSX.Element;
|
|
436
|
+
|
|
437
|
+
export { BlogGrid, type BlogGridProps, type BlogPost, CTABanner, type CTABannerProps, type ComparisonFeature, type ComparisonPlan, ComparisonTable, type ComparisonTableProps, type ContactFormData, ContactSection, type ContactSectionProps, FeatureCard, type FeatureCardProps, type FooterLink, type FooterLinkGroup, LogoCloud, type LogoCloudProps, type LogoItem, MarketingCta, type MarketingCtaEmphasis, type MarketingCtaGround, type MarketingCtaProps, MarketingFAQItem, type MarketingFAQItemProps, MarketingFooter, type MarketingFooterProps, MarketingHeader, type MarketingHeaderProps, MarketingHero, type MarketingHeroProps, HowItWorksStep as MarketingHowItWorksStep, type HowItWorksStepProps as MarketingHowItWorksStepProps, type MarketingNavItem, PricingTier as MarketingPricingTier, type PricingTierProps as MarketingPricingTierProps, NewsletterSection, type NewsletterSectionProps, type SocialLink, type TeamMember, TeamSection, type TeamSectionProps, type Testimonial, TestimonialSection, type TestimonialSectionProps, UseCaseCard, type UseCaseCardProps };
|