stackable-components 1.0.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.
Files changed (139) hide show
  1. package/README.md +295 -0
  2. package/dist/components/ArticleDetailsPage/ArticleDetails.d.ts +10 -0
  3. package/dist/components/ArticleDetailsPage/index.d.ts +1 -0
  4. package/dist/components/ArticleListingPage/ArticleListing.d.ts +26 -0
  5. package/dist/components/ArticleListingPage/index.d.ts +1 -0
  6. package/dist/components/Auth/AuthSplitScreen.d.ts +73 -0
  7. package/dist/components/Auth/index.d.ts +2 -0
  8. package/dist/components/Awards/AwardsSection.d.ts +53 -0
  9. package/dist/components/Awards/index.d.ts +2 -0
  10. package/dist/components/Banner/Banner.d.ts +32 -0
  11. package/dist/components/Banner/BannerCallout.d.ts +19 -0
  12. package/dist/components/Banner/BannerFullWidth.d.ts +22 -0
  13. package/dist/components/Banner/BannerLight.d.ts +31 -0
  14. package/dist/components/Banner/CommunityBanner.d.ts +33 -0
  15. package/dist/components/Banner/CookieConsentBanner.d.ts +40 -0
  16. package/dist/components/Banner/CountdownBanner.d.ts +27 -0
  17. package/dist/components/Banner/PromoBanner.d.ts +50 -0
  18. package/dist/components/Banner/index.d.ts +14 -0
  19. package/dist/components/Button/PrimaryButton.d.ts +32 -0
  20. package/dist/components/Button/ToggleSwitch.d.ts +24 -0
  21. package/dist/components/Button/index.d.ts +3 -0
  22. package/dist/components/Cards/CardAccordion.d.ts +38 -0
  23. package/dist/components/Cards/FeatureCard.d.ts +11 -0
  24. package/dist/components/Cards/FlipCard.d.ts +37 -0
  25. package/dist/components/Cards/ProfileCard.d.ts +39 -0
  26. package/dist/components/Cards/ResourceCard.d.ts +29 -0
  27. package/dist/components/Cards/index.d.ts +9 -0
  28. package/dist/components/Carousels/CircleImageCarousel.d.ts +19 -0
  29. package/dist/components/Carousels/GalleryCarousel.d.ts +75 -0
  30. package/dist/components/Carousels/ImageVideoCarousel.d.ts +24 -0
  31. package/dist/components/Carousels/VerticalProductCarousel.d.ts +40 -0
  32. package/dist/components/Carousels/index.d.ts +7 -0
  33. package/dist/components/EmptyState/EmptyState.d.ts +21 -0
  34. package/dist/components/EmptyState/index.d.ts +2 -0
  35. package/dist/components/FAQ/FAQ.d.ts +23 -0
  36. package/dist/components/FAQ/FaqCategorized.d.ts +35 -0
  37. package/dist/components/FAQ/index.d.ts +4 -0
  38. package/dist/components/FeatureBenefit/FeatureBenefit.d.ts +20 -0
  39. package/dist/components/FeatureBenefit/FeatureBenefitDark.d.ts +18 -0
  40. package/dist/components/FeatureBenefit/FeatureBenefitRenderer.d.ts +26 -0
  41. package/dist/components/FeatureBenefit/FeatureBenefitStrip.d.ts +15 -0
  42. package/dist/components/FeatureBenefit/FeatureBenefitWithImage.d.ts +27 -0
  43. package/dist/components/FeatureBenefit/StandardBenefit.d.ts +29 -0
  44. package/dist/components/FeatureBenefit/index.d.ts +12 -0
  45. package/dist/components/FeatureComparison/FeatureComparisonCards.d.ts +27 -0
  46. package/dist/components/FeatureComparison/FeatureComparisonTable.d.ts +35 -0
  47. package/dist/components/FeatureComparison/FeatureComparisonVs.d.ts +35 -0
  48. package/dist/components/FeatureComparison/index.d.ts +6 -0
  49. package/dist/components/FeatureShowcase/StickyCardStack.d.ts +36 -0
  50. package/dist/components/FeatureShowcase/StickyScrollFeature.d.ts +27 -0
  51. package/dist/components/FeatureShowcase/index.d.ts +2 -0
  52. package/dist/components/Footers/FooterMultiColumn.d.ts +23 -0
  53. package/dist/components/Footers/FooterSimple.d.ts +18 -0
  54. package/dist/components/Footers/index.d.ts +2 -0
  55. package/dist/components/Forms/ContactForm.d.ts +8 -0
  56. package/dist/components/Forms/ContactFormSplit.d.ts +53 -0
  57. package/dist/components/Forms/NewsletterSignup.d.ts +35 -0
  58. package/dist/components/Forms/index.d.ts +4 -0
  59. package/dist/components/Grids/BentoGrid.d.ts +34 -0
  60. package/dist/components/Grids/CategoryGrid.d.ts +53 -0
  61. package/dist/components/Grids/FlipCardGrid.d.ts +64 -0
  62. package/dist/components/Grids/HexTileGrid.d.ts +39 -0
  63. package/dist/components/Grids/IndexSection.d.ts +37 -0
  64. package/dist/components/Grids/index.d.ts +10 -0
  65. package/dist/components/HeroBanners/HeroBanner.d.ts +35 -0
  66. package/dist/components/HeroBanners/HeroBannerClassic.d.ts +79 -0
  67. package/dist/components/HeroBanners/SplitHeroBanner.d.ts +29 -0
  68. package/dist/components/HeroBanners/SpotlightHero.d.ts +30 -0
  69. package/dist/components/HeroBanners/VideoDemoHero.d.ts +33 -0
  70. package/dist/components/HeroBanners/index.d.ts +8 -0
  71. package/dist/components/ImageGrid/ImageGrid.d.ts +25 -0
  72. package/dist/components/ImageGrid/ImageGridDynamic.d.ts +18 -0
  73. package/dist/components/ImageGrid/index.d.ts +2 -0
  74. package/dist/components/LogoCloud/LogoCloud.d.ts +33 -0
  75. package/dist/components/LogoCloud/index.d.ts +2 -0
  76. package/dist/components/Navigation/BreadcrumbNavigation.d.ts +34 -0
  77. package/dist/components/Navigation/ExtendedNavigation.d.ts +31 -0
  78. package/dist/components/Navigation/FloatingDock.d.ts +45 -0
  79. package/dist/components/Navigation/NavigationBar.d.ts +13 -0
  80. package/dist/components/Navigation/Sidebar.d.ts +29 -0
  81. package/dist/components/Navigation/index.d.ts +8 -0
  82. package/dist/components/PDP/ProductDetails.d.ts +43 -0
  83. package/dist/components/PDP/index.d.ts +1 -0
  84. package/dist/components/PLP/ProductListing.d.ts +15 -0
  85. package/dist/components/PLP/index.d.ts +1 -0
  86. package/dist/components/Pricing/Pricing.d.ts +48 -0
  87. package/dist/components/Pricing/PricingSpreadCard.d.ts +32 -0
  88. package/dist/components/Pricing/index.d.ts +4 -0
  89. package/dist/components/Process/ProcessStep.d.ts +51 -0
  90. package/dist/components/Process/index.d.ts +2 -0
  91. package/dist/components/ProductCard/DarkCard.d.ts +31 -0
  92. package/dist/components/ProductCard/LargeCard.d.ts +11 -0
  93. package/dist/components/ProductCard/ProductBanner.d.ts +28 -0
  94. package/dist/components/ProductCard/index.d.ts +61 -0
  95. package/dist/components/SectionIntroduction/SectionIntroduction.d.ts +27 -0
  96. package/dist/components/SectionIntroduction/SectionIntroductionTwoColumn.d.ts +18 -0
  97. package/dist/components/SectionIntroduction/index.d.ts +4 -0
  98. package/dist/components/Sidebar/Sidebar.d.ts +26 -0
  99. package/dist/components/Sidebar/index.d.ts +2 -0
  100. package/dist/components/Sliders/ProductSlider.d.ts +23 -0
  101. package/dist/components/Sliders/index.d.ts +2 -0
  102. package/dist/components/Social/SocialLinks.d.ts +36 -0
  103. package/dist/components/Social/SocialPostEmbed.d.ts +34 -0
  104. package/dist/components/Social/index.d.ts +4 -0
  105. package/dist/components/Statistics/StatCounterRow.d.ts +34 -0
  106. package/dist/components/Statistics/index.d.ts +2 -0
  107. package/dist/components/Tabs/Tabs.d.ts +35 -0
  108. package/dist/components/Tabs/index.d.ts +2 -0
  109. package/dist/components/Team/TeamBanner.d.ts +32 -0
  110. package/dist/components/Team/index.d.ts +2 -0
  111. package/dist/components/Testimonial/CardStack.d.ts +31 -0
  112. package/dist/components/Testimonial/RatingSummary.d.ts +20 -0
  113. package/dist/components/Testimonial/Reviews.d.ts +55 -0
  114. package/dist/components/Testimonial/Testimonial.d.ts +29 -0
  115. package/dist/components/Testimonial/index.d.ts +8 -0
  116. package/dist/components/TextCTASection/JustifiedTextCTA.d.ts +11 -0
  117. package/dist/components/TextCTASection/TextCTA.d.ts +25 -0
  118. package/dist/components/TextCTASection/index.d.ts +1 -0
  119. package/dist/components/Timeline/TimelineColumn.d.ts +23 -0
  120. package/dist/components/Timeline/TimelineHorizontal.d.ts +28 -0
  121. package/dist/components/Timeline/TimelineYearBlocks.d.ts +55 -0
  122. package/dist/components/Timeline/VerticalTimeline.d.ts +21 -0
  123. package/dist/components/Timeline/index.d.ts +8 -0
  124. package/dist/components/Typography/Typography.d.ts +14 -0
  125. package/dist/components/Typography/index.d.ts +2 -0
  126. package/dist/components/VideoSection/VideoSection.d.ts +38 -0
  127. package/dist/components/VideoSection/index.d.ts +2 -0
  128. package/dist/index.d.ts +153 -0
  129. package/dist/index.esm.js +14074 -0
  130. package/dist/index.esm.js.map +1 -0
  131. package/dist/index.js +14168 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/styles.css +5901 -0
  134. package/dist/theme/ThemeProvider.d.ts +13 -0
  135. package/dist/theme/index.d.ts +2 -0
  136. package/dist/theme/themeConfig.d.ts +8 -0
  137. package/dist/types.d.ts +60 -0
  138. package/dist/utils/index.d.ts +10 -0
  139. package/package.json +62 -0
package/README.md ADDED
@@ -0,0 +1,295 @@
1
+ # Stackables Components
2
+
3
+ A collection of reusable React components designed for use with Contentstack projects. These components are built with Tailwind CSS and designed to work seamlessly with Contentstack's content modeling capabilities.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install stackables-components
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```jsx
14
+ import { HeroBanner, ProductCard } from 'stackables-components';
15
+
16
+ // Import the required styles
17
+ import 'stackables-components/styles/globals.css';
18
+
19
+ function MyPage() {
20
+ return (
21
+ <div>
22
+ <HeroBanner
23
+ heading="Welcome to Our Site"
24
+ subheading="Discover amazing products"
25
+ cta_button={{ text: "Get Started", link: "/products" }}
26
+ />
27
+ <ProductCard
28
+ product_name="Amazing Product"
29
+ description="This product will change your life"
30
+ price={99.99}
31
+ />
32
+ </div>
33
+ );
34
+ }
35
+ ```
36
+
37
+ ## Available Components
38
+
39
+ ### Typography
40
+ - **Typography**: Themed text primitive for headings/body copy
41
+
42
+ ### Hero Banners
43
+ - **HeroBanner**: Full-width gradient hero with CTA button
44
+ - **SplitHeroBanner**: Split layout hero with content and image placeholder
45
+ - **HeroBannerClassic**: Classic hero with heading lines, avatars, and footer stats
46
+ - **SpotlightHero**: Hero with a spotlighted CTA list
47
+ - **VideoDemoHero**: Hero with an animated video/thumbnail demo
48
+
49
+ ### Banners
50
+ - **Banner** / **BannerLight**: Full-width promo banners (dark/light)
51
+ - **BannerCallout**: Inline callout banner
52
+ - **PromoBanner**: Rotating multi-slide promo banner
53
+ - **CommunityBanner**: Banner with avatar stack and CTA
54
+ - **CountdownBanner**: Banner with a countdown timer
55
+ - **CookieConsentBanner**: Cookie consent bar
56
+
57
+ ### Carousels & Sliders
58
+ - **ImageVideoCarousel**: Interactive image/video carousel with navigation
59
+ - **CircleImageCarousel**: Circular image carousel
60
+ - **VerticalProductCarousel**: Vertical scrolling product carousel
61
+ - **GalleryCarousel**: Gallery-style slide carousel
62
+ - **ProductSlider**: Product slide carousel with CTA
63
+
64
+ ### Product Components
65
+ - **ProductCard** / **ProductCardRegular** / **ProductCardLarge**: Product display cards
66
+ - **ProductBanner**: Banner-style product highlight
67
+ - **ProductListing**: Grid layout for multiple products (PLP)
68
+ - **ProductDetails**: Product detail page layout (PDP)
69
+
70
+ ### Cards
71
+ - **FeatureCard**: Feature highlight card with icon
72
+ - **ResourceCard**: Resource/article card list
73
+ - **ProfileCard**: Profile card with stats
74
+ - **FlipCard**: Card with a flip animation
75
+ - **CardAccordion**: Expandable accordion card
76
+
77
+ ### Grids
78
+ - **BentoGrid**: Bento-style mixed grid layout
79
+ - **IndexSection**: Indexed list/grid section
80
+ - **HexTileGrid**: Hexagonal tile grid
81
+ - **CategoryGrid**: Category tile grid
82
+ - **FlipCardGrid**: Grid of flip cards
83
+ - **ImageGrid** / **ImageGridDynamic**: Static and dynamic image grids
84
+
85
+ ### Testimonials & Reviews
86
+ - **Testimonial**: Testimonial quote block
87
+ - **RatingSummary**: Aggregate rating summary
88
+ - **CardStack**: Stacked testimonial cards
89
+ - **Reviews**: Review list section
90
+
91
+ ### Logo Cloud
92
+ - **LogoCloud**: Scrolling/static logo strip
93
+
94
+ ### FAQ
95
+ - **FAQ**: Standard FAQ accordion
96
+ - **FaqCategorized**: FAQ grouped by category
97
+
98
+ ### Empty State
99
+ - **EmptyState**: Empty/placeholder state block
100
+
101
+ ### Pricing
102
+ - **Pricing**: Pricing tier comparison
103
+ - **PricingSpreadCard**: Single spread pricing card
104
+
105
+ ### Statistics
106
+ - **StatCounterRow**: Row of animated stat counters
107
+
108
+ ### Forms
109
+ - **ContactForm**: Customizable contact form
110
+ - **ContactFormSplit**: Split-layout contact form
111
+ - **NewsletterSignup**: Newsletter signup form
112
+
113
+ ### Navigation
114
+ - **NavigationBar**: Responsive navigation with mobile menu
115
+ - **ExtendedNavigation**: Multi-level navigation menu
116
+ - **BreadcrumbNavigation**: Breadcrumb trail
117
+ - **Sidebar**: Sidebar navigation
118
+ - **FloatingDock**: Floating dock/quick-links nav
119
+
120
+ ### Footers
121
+ - **FooterSimple**: Minimal single-row footer
122
+ - **FooterMultiColumn**: Multi-column footer with links
123
+
124
+ ### CTAs
125
+ - **TextCTA**: Text-led call-to-action section
126
+ - **JustifiedTextCTA**: Justified-text call-to-action section
127
+
128
+ ### Buttons
129
+ - **PrimaryButton**: Primary action button
130
+ - **ToggleSwitch**: On/off toggle control
131
+
132
+ ### Article Pages
133
+ - **ArticleDetails**: Article detail page layout
134
+ - **ArticleListing**: Article listing page layout
135
+
136
+ ### Tabs
137
+ - **Tabs**: Tabbed content section
138
+
139
+ ### Section Introduction
140
+ - **SectionIntroduction**: Section heading/intro block
141
+ - **SectionIntroductionTwoColumn**: Two-column section intro
142
+
143
+ ### Video
144
+ - **VideoSection**: Video showcase section
145
+
146
+ ### Feature Benefits
147
+ - **FeatureBenefitStrip**: Compact benefit strip
148
+ - **FeatureBenefit** / **FeatureBenefitDark**: Benefit list sections (light/dark)
149
+ - **FeatureBenefitWithImage**: Benefit section with supporting image
150
+ - **FeatureBenefitRenderer**: Variant-driven benefit renderer
151
+ - **StandardBenefit**: Configurable standard benefits section
152
+
153
+ ### Feature Showcase
154
+ - **StickyScrollFeature**: Sticky scroll-driven feature showcase
155
+
156
+ ### Timeline
157
+ - **VerticalTimeline** / **TimelineHorizontal** / **TimelineColumn**: Timeline layouts
158
+ - **TimelineYearBlocks**: Year-grouped timeline blocks
159
+
160
+ ### Feature Comparison
161
+ - **FeatureComparisonTable**: Tabular feature comparison
162
+ - **FeatureComparisonVs**: Head-to-head comparison
163
+ - **FeatureComparisonCards**: Card-based comparison
164
+
165
+ ### Team
166
+ - **TeamBanner**: Team member showcase banner
167
+
168
+ ### Social
169
+ - **SocialPostEmbed**: Embedded social post
170
+ - **SocialLinks**: Social media link list
171
+
172
+ ### Process
173
+ - **ProcessStep**: Step-by-step process section
174
+
175
+ ### Awards
176
+ - **AwardsSection**: Awards/recognition showcase
177
+
178
+ ### Auth
179
+ - **AuthSplitScreen**: Split-screen auth (sign in/up) layout
180
+
181
+
182
+ ## Container Width System
183
+
184
+ Components use a flexible container width system. You can control the maximum width using CSS custom properties:
185
+
186
+ ```css
187
+ /* Set global container width */
188
+ .component-container {
189
+ --container-width: 1200px;
190
+ }
191
+
192
+ /* Or use preset classes */
193
+ <div className="container-1440">
194
+ <HeroBanner />
195
+ </div>
196
+ ```
197
+
198
+ Available preset classes:
199
+ - `container-768` (768px)
200
+ - `container-1024` (1024px)
201
+ - `container-1280` (1280px)
202
+ - `container-1440` (1440px - default)
203
+ - `container-1600` (1600px)
204
+ - `container-1920` (1920px)
205
+
206
+ ## Component Schema (Supabase)
207
+
208
+ This package ships **components only** — no bundled component catalog or schema data. Schema, default content, previews, and versioning for each component live in Supabase and are fetched at runtime, so the catalog can change without a new npm release.
209
+
210
+ ### Where it lives
211
+
212
+ The `stackables_components` table holds one row per component **version**. The columns that matter for rendering:
213
+
214
+ | Column | Purpose |
215
+ | ----------------------- | --------------------------------------------------------------------------------------------- |
216
+ | `react_component` | Name of the export from this package (e.g.`"HeroBanner"`) — the key used to look it up in a `componentMap`. |
217
+ | `content_type_uid` | Contentstack content type / global field uid — identifies a component across versions. |
218
+ | `schema` | JSONB array of Contentstack field definitions. |
219
+ | `default_field_values` | Curated starter content, keyed by field uid. |
220
+ | `is_active` | `true` for the current live version of a component. |
221
+
222
+ Full column reference, versioning rules, and RLS policy: see [`stackables-data-model.md`](../stackables-data-model.md) at the project root.
223
+
224
+ ### Matching types
225
+
226
+ This package exports the TypeScript shapes that mirror that schema, so consuming apps don't have to redefine them:
227
+
228
+ ```ts
229
+ import type { ComponentMetadata, ContentModel, ContentModelField } from 'stackables-components';
230
+ ```
231
+
232
+ - **`ContentModelField`** — one Contentstack field definition (`uid`, `data_type`, `mandatory`, `enum`, nested `schema` for groups, …).
233
+ - **`ContentModel`** — a content type / global field (`title`, `uid`, `schema: ContentModelField[]`).
234
+ - **`ComponentMetadata`** — a catalog entry as consumed by an app: `{ id, name, category, description, component, contentModel }`.
235
+
236
+ ### Fetching it in your app
237
+
238
+ Read the active catalog (directly from Supabase, or via an API route such as this project's `GET /api/catalog`), map each row into the `ComponentMetadata` shape, then resolve `component` against the components this package actually exports:
239
+
240
+ ```ts
241
+ import { HeroBanner, ProductCard } from 'stackables-components';
242
+ import type { ComponentMetadata } from 'stackables-components';
243
+
244
+ const componentMap = { HeroBanner, ProductCard /* … */ };
245
+
246
+ const { data: rows } = await supabase
247
+ .from('stackables_components')
248
+ .select('*')
249
+ .eq('is_active', true);
250
+
251
+ const catalog: ComponentMetadata[] = (rows ?? []).map((row) => ({
252
+ id: row.slug ?? row.content_type_uid,
253
+ name: row.name,
254
+ category: row.category,
255
+ description: row.description ?? '',
256
+ component: row.react_component,
257
+ contentModel: {
258
+ title: row.content_type_title,
259
+ uid: row.content_type_uid,
260
+ schema: row.schema ?? [],
261
+ },
262
+ }));
263
+
264
+ catalog.forEach(({ component, contentModel }) => {
265
+ const Component = componentMap[component];
266
+ // contentModel.schema drives the editor controls/preview for this component
267
+ });
268
+ ```
269
+
270
+ > An earlier version of this package bundled a static `ComponentSchema` metadata array. That's been superseded by the Supabase catalog above — schema is now database-driven, not shipped in the npm package.
271
+
272
+ ## Styling
273
+
274
+ This library requires Tailwind CSS. Make sure your project has Tailwind CSS configured. The components use utility classes and should integrate seamlessly with your existing Tailwind setup.
275
+
276
+ ## TypeScript Support
277
+
278
+ Full TypeScript definitions are included. Import types for better development experience:
279
+
280
+ ```tsx
281
+ import { HeroBannerProps, ProductCardProps } from 'stackables-components';
282
+
283
+ const myHeroProps: HeroBannerProps = {
284
+ heading: "Welcome",
285
+ subheading: "Get started today"
286
+ };
287
+ ```
288
+
289
+ ## Contributing
290
+
291
+ This is a Contentstack Solutions project. For contributions or issues, please contact the Contentstack Solutions team.
292
+
293
+ ## License
294
+
295
+ MIT
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface ArticleDetailsProps {
3
+ article_title: string;
4
+ eyebrow_text: string;
5
+ subheading: string;
6
+ summary: string;
7
+ image: string;
8
+ }
9
+ export declare function ArticleDetails({ article_title: articleTitle, eyebrow_text: eyebrowText, subheading, summary, image, }: ArticleDetailsProps): React.JSX.Element;
10
+ export default ArticleDetails;
@@ -0,0 +1 @@
1
+ export { ArticleDetails } from './ArticleDetails';
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ export interface ArticleItem {
3
+ uid?: string;
4
+ category?: string;
5
+ title?: string;
6
+ article_title?: string;
7
+ eyebrow_text?: string;
8
+ summary?: string;
9
+ image?: {
10
+ url?: string;
11
+ title?: string;
12
+ } | string;
13
+ author_details?: {
14
+ author_name?: string;
15
+ author_image?: string;
16
+ company_designation?: string;
17
+ };
18
+ }
19
+ export interface ArticleListingProps {
20
+ article?: ArticleItem[];
21
+ list_type?: 'Grid' | 'Carousel' | string;
22
+ columns?: 1 | 2 | 3 | 4 | number;
23
+ className?: string;
24
+ }
25
+ export declare function ArticleListing({ article, list_type: listType, columns, }: ArticleListingProps): React.JSX.Element;
26
+ export default ArticleListing;
@@ -0,0 +1 @@
1
+ export { ArticleListing } from './ArticleListing';
@@ -0,0 +1,73 @@
1
+ import React from 'react';
2
+ import type { StackableColorValue } from '../../types';
3
+ export interface AuthSplitScreenLink {
4
+ title?: string;
5
+ href?: string;
6
+ }
7
+ export interface AuthSplitScreenSocialProvider {
8
+ /** Preset provider — ships a real brand mark. Ignored when `icon_image` is set. */
9
+ provider?: 'google' | 'facebook' | 'apple' | 'github' | 'microsoft' | string;
10
+ /** Uploaded asset URL, or a Contentstack asset object — overrides the preset mark. */
11
+ icon_image?: string | {
12
+ url?: string;
13
+ };
14
+ }
15
+ export interface AuthSplitScreenBadge {
16
+ label?: string;
17
+ }
18
+ export interface AuthSplitScreenLogo {
19
+ logo_image?: string | {
20
+ url?: string;
21
+ };
22
+ logo_text?: string;
23
+ }
24
+ export interface AuthSplitScreenTestimonial {
25
+ content?: string;
26
+ name?: string;
27
+ /** Rendered after the name, e.g. "Head of Product". `company` is bolded within it if both are set. */
28
+ designation?: string;
29
+ company?: string;
30
+ }
31
+ export interface AuthSplitScreenSubmitData {
32
+ mode: 'sign_in' | 'sign_up';
33
+ email: string;
34
+ password: string;
35
+ }
36
+ export interface AuthSplitScreenProps {
37
+ mode?: 'sign_in' | 'sign_up' | string;
38
+ logo?: AuthSplitScreenLogo;
39
+ heading?: string;
40
+ subheading?: string;
41
+ email_label?: string;
42
+ email_placeholder?: string;
43
+ password_label?: string;
44
+ password_placeholder?: string;
45
+ submit_button_text?: string;
46
+ divider_text?: string;
47
+ social_providers?: AuthSplitScreenSocialProvider[];
48
+ /** Shown before `footer_link`, e.g. "Already have an account?" */
49
+ footer_prompt?: string;
50
+ /** The toggle link between sign-in and sign-up — title + destination URL. */
51
+ footer_link?: AuthSplitScreenLink;
52
+ image?: string | {
53
+ url?: string;
54
+ };
55
+ image_alt?: string;
56
+ /** Small pills over the image, e.g. "Product Company". */
57
+ badges?: AuthSplitScreenBadge[];
58
+ testimonial?: AuthSplitScreenTestimonial;
59
+ background_color?: StackableColorValue;
60
+ text_color?: StackableColorValue;
61
+ button_color?: StackableColorValue;
62
+ button_text_color?: StackableColorValue;
63
+ accent_color?: StackableColorValue;
64
+ /** Fires on submit instead of a real network call — this component has no
65
+ * backend of its own. Wire it to whatever auth the host app actually uses. */
66
+ onSubmit?: (data: AuthSplitScreenSubmitData) => void;
67
+ /** Fires when a social button is clicked, with the same `provider` key set on
68
+ * that entry (or `'custom'` for an `icon_image` override with none set). */
69
+ onSocialSignIn?: (provider: string) => void;
70
+ className?: string;
71
+ }
72
+ export declare function AuthSplitScreen({ mode, logo, heading, subheading, email_label, email_placeholder, password_label, password_placeholder, submit_button_text, divider_text, social_providers, footer_prompt, footer_link, image, image_alt, badges, testimonial, background_color, text_color, button_color, button_text_color, accent_color, onSubmit, onSocialSignIn, className, }: AuthSplitScreenProps): React.JSX.Element;
73
+ export default AuthSplitScreen;
@@ -0,0 +1,2 @@
1
+ export { AuthSplitScreen } from './AuthSplitScreen';
2
+ export type { AuthSplitScreenProps, AuthSplitScreenLink, AuthSplitScreenSocialProvider, AuthSplitScreenTestimonial, AuthSplitScreenBadge, AuthSplitScreenLogo, AuthSplitScreenSubmitData, } from './AuthSplitScreen';
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import type { StackableColorValue } from '../../types';
3
+ /** Native Contentstack link field: `{ title, href }`. */
4
+ export interface AwardsSectionLink {
5
+ title?: string;
6
+ href?: string;
7
+ }
8
+ export interface AwardsSectionItem {
9
+ /** Small line above the award name, e.g. `Digital Marketing`. */
10
+ category?: string;
11
+ /** The award itself, e.g. `Digital Impact Award`. */
12
+ title?: string;
13
+ /**
14
+ * Shown in the accent colour after the name. Free text, never parsed — `2022`,
15
+ * `FY24` and `Q1 2025` all render as given.
16
+ */
17
+ year?: string;
18
+ link?: AwardsSectionLink;
19
+ }
20
+ export interface AwardsSectionProps {
21
+ eyebrow_text?: string;
22
+ /**
23
+ * Small mark beside the eyebrow. Asset URL or a Contentstack asset object.
24
+ * Without one, a built-in dot cluster is drawn in the accent colour.
25
+ */
26
+ eyebrow_icon?: string | {
27
+ url?: string;
28
+ };
29
+ heading?: string;
30
+ awards?: AwardsSectionItem[];
31
+ /**
32
+ * Large decorative emblem beside the list — a crest, wreath or medal. Without
33
+ * one, a ringed star is drawn instead.
34
+ */
35
+ emblem_image?: string | {
36
+ url?: string;
37
+ };
38
+ emblem_alt?: string;
39
+ emblem_position?: 'Left' | 'Right' | string;
40
+ /** Hairline between award rows. */
41
+ show_dividers?: boolean;
42
+ /** Circular arrow button on each row that has a link. */
43
+ show_row_arrows?: boolean;
44
+ /** Diagonal hatching along the top and bottom edges. */
45
+ show_hatch?: boolean;
46
+ background_color?: StackableColorValue;
47
+ text_color?: StackableColorValue;
48
+ /** The year, the eyebrow mark, and the emblem's tint. */
49
+ accent_color?: StackableColorValue;
50
+ className?: string;
51
+ }
52
+ export declare function AwardsSection({ eyebrow_text, eyebrow_icon, heading, awards, emblem_image, emblem_alt, emblem_position, show_dividers, show_row_arrows, show_hatch, background_color, text_color, accent_color, className, }: AwardsSectionProps): React.JSX.Element;
53
+ export default AwardsSection;
@@ -0,0 +1,2 @@
1
+ export { AwardsSection } from './AwardsSection';
2
+ export type { AwardsSectionProps, AwardsSectionItem, AwardsSectionLink } from './AwardsSection';
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import type { StackableColorValue } from '../../types';
3
+ export interface BannerReference {
4
+ title?: string;
5
+ summary?: string;
6
+ }
7
+ export interface BannerCtaButton {
8
+ text?: string;
9
+ link?: string;
10
+ }
11
+ export interface BannerProps {
12
+ label?: string;
13
+ heading?: string;
14
+ description?: string;
15
+ cta_button?: BannerCtaButton;
16
+ cta_secondary?: BannerCtaButton;
17
+ image?: string | {
18
+ url?: string;
19
+ };
20
+ /** When set, image renders as full-width background with this overlay darkness */
21
+ overlay?: 'light' | 'medium' | 'dark' | string;
22
+ /** Full-width alignment of the content block — only active when overlay is set */
23
+ text_alignment?: 'left' | 'center' | 'right' | string;
24
+ text_color?: StackableColorValue;
25
+ button_color?: StackableColorValue;
26
+ button_text_color?: StackableColorValue;
27
+ /** Resolved Contentstack reference entry */
28
+ reference?: BannerReference;
29
+ className?: string;
30
+ }
31
+ export declare function Banner({ label, heading, description, cta_button, cta_secondary, image, overlay, text_alignment, text_color, button_color, button_text_color, reference, className, }: BannerProps): React.JSX.Element;
32
+ export default Banner;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import type { StackableColorValue } from '../../types';
3
+ export interface BannerCalloutCtaButton {
4
+ text?: string;
5
+ link?: string;
6
+ }
7
+ export interface BannerCalloutProps {
8
+ heading?: string;
9
+ description?: string;
10
+ cta_button?: BannerCalloutCtaButton;
11
+ dismissible?: boolean;
12
+ background_color?: StackableColorValue;
13
+ text_color?: StackableColorValue;
14
+ button_color?: StackableColorValue;
15
+ button_text_color?: StackableColorValue;
16
+ className?: string;
17
+ }
18
+ export declare function BannerCallout({ heading, description, cta_button, dismissible, background_color, text_color, button_color, button_text_color, className, }: BannerCalloutProps): React.JSX.Element | null;
19
+ export default BannerCallout;
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ export interface BannerFullWidthCtaButton {
3
+ text?: string;
4
+ link?: string;
5
+ }
6
+ export interface BannerFullWidthProps {
7
+ label?: string;
8
+ heading?: string;
9
+ description?: string;
10
+ cta_primary?: BannerFullWidthCtaButton;
11
+ cta_secondary?: BannerFullWidthCtaButton;
12
+ background_image?: string | {
13
+ url?: string;
14
+ };
15
+ /** 'light' | 'medium' | 'dark' */
16
+ overlay?: 'light' | 'medium' | 'dark' | string;
17
+ /** 'left' | 'center' */
18
+ text_alignment?: 'left' | 'center' | string;
19
+ className?: string;
20
+ }
21
+ export declare function BannerFullWidth({ label, heading, description, cta_primary, cta_secondary, background_image, overlay, text_alignment, className, }: BannerFullWidthProps): React.JSX.Element;
22
+ export default BannerFullWidth;
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import type { StackableColorValue } from '../../types';
3
+ export interface BannerLightReference {
4
+ title?: string;
5
+ summary?: string;
6
+ }
7
+ export interface BannerLightCtaButton {
8
+ text?: string;
9
+ link?: string;
10
+ }
11
+ export interface BannerLightProps {
12
+ label?: string;
13
+ heading?: string;
14
+ description?: string;
15
+ cta_button?: BannerLightCtaButton;
16
+ image?: string | {
17
+ url?: string;
18
+ };
19
+ /** Resolved Contentstack reference entry */
20
+ reference?: BannerLightReference;
21
+ /** Which side the image sits on */
22
+ image_position?: 'left' | 'right' | string;
23
+ /** Alignment of text within the content block */
24
+ text_alignment?: 'left' | 'center' | 'right' | string;
25
+ text_color?: StackableColorValue;
26
+ button_color?: StackableColorValue;
27
+ button_text_color?: StackableColorValue;
28
+ className?: string;
29
+ }
30
+ export declare function BannerLight({ label, heading, description, cta_button, image, reference, image_position, text_alignment, text_color, button_color, button_text_color, className, }: BannerLightProps): React.JSX.Element;
31
+ export default BannerLight;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import type { StackableColorValue } from '../../types';
3
+ export interface CommunityBannerAvatar {
4
+ /** Asset URL, or a Contentstack asset object — both are accepted. */
5
+ image?: string | {
6
+ url?: string;
7
+ };
8
+ image_alt?: string;
9
+ }
10
+ export interface CommunityBannerCtaButton {
11
+ title?: string;
12
+ url?: string;
13
+ open_in_new_tab?: boolean;
14
+ }
15
+ export interface CommunityBannerProps {
16
+ logo?: string | {
17
+ url?: string;
18
+ };
19
+ logo_text?: string;
20
+ avatars?: CommunityBannerAvatar[];
21
+ avatar_size?: 'Small' | 'Medium' | 'Large' | string;
22
+ heading?: string;
23
+ description?: string;
24
+ heading_alignment?: 'left' | 'center' | 'right' | string;
25
+ cta_button?: CommunityBannerCtaButton;
26
+ background_color?: StackableColorValue;
27
+ text_color?: StackableColorValue;
28
+ button_color?: StackableColorValue;
29
+ button_text_color?: StackableColorValue;
30
+ className?: string;
31
+ }
32
+ export declare function CommunityBanner({ logo, logo_text, avatars, avatar_size, heading, description, heading_alignment, cta_button, background_color, text_color, button_color, button_text_color, className, }: CommunityBannerProps): React.JSX.Element;
33
+ export default CommunityBanner;
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import type { StackableColorValue } from '../../types';
3
+ export interface CookieConsentBannerLink {
4
+ title?: string;
5
+ href?: string;
6
+ }
7
+ export interface CookieConsentCategory {
8
+ /** Storage key — stable across edits, e.g. "analytics". Defaults to a slug of `category_title`. */
9
+ key?: string;
10
+ category_title?: string;
11
+ description?: string;
12
+ /** Always on, toggle locked — for strictly necessary cookies. */
13
+ required?: boolean;
14
+ }
15
+ export interface CookieConsentBannerProps {
16
+ heading?: string;
17
+ message?: string;
18
+ policy_link?: CookieConsentBannerLink;
19
+ /** Per-category opt-in toggles. Leave empty for a plain Yes/No card with no "Customise" step. */
20
+ categories?: CookieConsentCategory[];
21
+ accept_button_text?: string;
22
+ reject_button_text?: string;
23
+ customise_link_text?: string;
24
+ preferences_heading?: string;
25
+ save_button_text?: string;
26
+ expand_details_text?: string;
27
+ hide_details_text?: string;
28
+ position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right' | string;
29
+ /** Uploaded asset URL, or a Contentstack asset object — overrides the built-in cookie icon. */
30
+ icon_image?: string | {
31
+ url?: string;
32
+ };
33
+ background_color?: StackableColorValue;
34
+ text_color?: StackableColorValue;
35
+ button_color?: StackableColorValue;
36
+ button_text_color?: StackableColorValue;
37
+ className?: string;
38
+ }
39
+ export declare function CookieConsentBanner({ heading, message, policy_link, categories, accept_button_text, reject_button_text, customise_link_text, preferences_heading, save_button_text, expand_details_text, hide_details_text, position, icon_image, background_color, text_color, button_color, button_text_color, className, }: CookieConsentBannerProps): React.JSX.Element | null;
40
+ export default CookieConsentBanner;