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.
- package/README.md +295 -0
- package/dist/components/ArticleDetailsPage/ArticleDetails.d.ts +10 -0
- package/dist/components/ArticleDetailsPage/index.d.ts +1 -0
- package/dist/components/ArticleListingPage/ArticleListing.d.ts +26 -0
- package/dist/components/ArticleListingPage/index.d.ts +1 -0
- package/dist/components/Auth/AuthSplitScreen.d.ts +73 -0
- package/dist/components/Auth/index.d.ts +2 -0
- package/dist/components/Awards/AwardsSection.d.ts +53 -0
- package/dist/components/Awards/index.d.ts +2 -0
- package/dist/components/Banner/Banner.d.ts +32 -0
- package/dist/components/Banner/BannerCallout.d.ts +19 -0
- package/dist/components/Banner/BannerFullWidth.d.ts +22 -0
- package/dist/components/Banner/BannerLight.d.ts +31 -0
- package/dist/components/Banner/CommunityBanner.d.ts +33 -0
- package/dist/components/Banner/CookieConsentBanner.d.ts +40 -0
- package/dist/components/Banner/CountdownBanner.d.ts +27 -0
- package/dist/components/Banner/PromoBanner.d.ts +50 -0
- package/dist/components/Banner/index.d.ts +14 -0
- package/dist/components/Button/PrimaryButton.d.ts +32 -0
- package/dist/components/Button/ToggleSwitch.d.ts +24 -0
- package/dist/components/Button/index.d.ts +3 -0
- package/dist/components/Cards/CardAccordion.d.ts +38 -0
- package/dist/components/Cards/FeatureCard.d.ts +11 -0
- package/dist/components/Cards/FlipCard.d.ts +37 -0
- package/dist/components/Cards/ProfileCard.d.ts +39 -0
- package/dist/components/Cards/ResourceCard.d.ts +29 -0
- package/dist/components/Cards/index.d.ts +9 -0
- package/dist/components/Carousels/CircleImageCarousel.d.ts +19 -0
- package/dist/components/Carousels/GalleryCarousel.d.ts +75 -0
- package/dist/components/Carousels/ImageVideoCarousel.d.ts +24 -0
- package/dist/components/Carousels/VerticalProductCarousel.d.ts +40 -0
- package/dist/components/Carousels/index.d.ts +7 -0
- package/dist/components/EmptyState/EmptyState.d.ts +21 -0
- package/dist/components/EmptyState/index.d.ts +2 -0
- package/dist/components/FAQ/FAQ.d.ts +23 -0
- package/dist/components/FAQ/FaqCategorized.d.ts +35 -0
- package/dist/components/FAQ/index.d.ts +4 -0
- package/dist/components/FeatureBenefit/FeatureBenefit.d.ts +20 -0
- package/dist/components/FeatureBenefit/FeatureBenefitDark.d.ts +18 -0
- package/dist/components/FeatureBenefit/FeatureBenefitRenderer.d.ts +26 -0
- package/dist/components/FeatureBenefit/FeatureBenefitStrip.d.ts +15 -0
- package/dist/components/FeatureBenefit/FeatureBenefitWithImage.d.ts +27 -0
- package/dist/components/FeatureBenefit/StandardBenefit.d.ts +29 -0
- package/dist/components/FeatureBenefit/index.d.ts +12 -0
- package/dist/components/FeatureComparison/FeatureComparisonCards.d.ts +27 -0
- package/dist/components/FeatureComparison/FeatureComparisonTable.d.ts +35 -0
- package/dist/components/FeatureComparison/FeatureComparisonVs.d.ts +35 -0
- package/dist/components/FeatureComparison/index.d.ts +6 -0
- package/dist/components/FeatureShowcase/StickyCardStack.d.ts +36 -0
- package/dist/components/FeatureShowcase/StickyScrollFeature.d.ts +27 -0
- package/dist/components/FeatureShowcase/index.d.ts +2 -0
- package/dist/components/Footers/FooterMultiColumn.d.ts +23 -0
- package/dist/components/Footers/FooterSimple.d.ts +18 -0
- package/dist/components/Footers/index.d.ts +2 -0
- package/dist/components/Forms/ContactForm.d.ts +8 -0
- package/dist/components/Forms/ContactFormSplit.d.ts +53 -0
- package/dist/components/Forms/NewsletterSignup.d.ts +35 -0
- package/dist/components/Forms/index.d.ts +4 -0
- package/dist/components/Grids/BentoGrid.d.ts +34 -0
- package/dist/components/Grids/CategoryGrid.d.ts +53 -0
- package/dist/components/Grids/FlipCardGrid.d.ts +64 -0
- package/dist/components/Grids/HexTileGrid.d.ts +39 -0
- package/dist/components/Grids/IndexSection.d.ts +37 -0
- package/dist/components/Grids/index.d.ts +10 -0
- package/dist/components/HeroBanners/HeroBanner.d.ts +35 -0
- package/dist/components/HeroBanners/HeroBannerClassic.d.ts +79 -0
- package/dist/components/HeroBanners/SplitHeroBanner.d.ts +29 -0
- package/dist/components/HeroBanners/SpotlightHero.d.ts +30 -0
- package/dist/components/HeroBanners/VideoDemoHero.d.ts +33 -0
- package/dist/components/HeroBanners/index.d.ts +8 -0
- package/dist/components/ImageGrid/ImageGrid.d.ts +25 -0
- package/dist/components/ImageGrid/ImageGridDynamic.d.ts +18 -0
- package/dist/components/ImageGrid/index.d.ts +2 -0
- package/dist/components/LogoCloud/LogoCloud.d.ts +33 -0
- package/dist/components/LogoCloud/index.d.ts +2 -0
- package/dist/components/Navigation/BreadcrumbNavigation.d.ts +34 -0
- package/dist/components/Navigation/ExtendedNavigation.d.ts +31 -0
- package/dist/components/Navigation/FloatingDock.d.ts +45 -0
- package/dist/components/Navigation/NavigationBar.d.ts +13 -0
- package/dist/components/Navigation/Sidebar.d.ts +29 -0
- package/dist/components/Navigation/index.d.ts +8 -0
- package/dist/components/PDP/ProductDetails.d.ts +43 -0
- package/dist/components/PDP/index.d.ts +1 -0
- package/dist/components/PLP/ProductListing.d.ts +15 -0
- package/dist/components/PLP/index.d.ts +1 -0
- package/dist/components/Pricing/Pricing.d.ts +48 -0
- package/dist/components/Pricing/PricingSpreadCard.d.ts +32 -0
- package/dist/components/Pricing/index.d.ts +4 -0
- package/dist/components/Process/ProcessStep.d.ts +51 -0
- package/dist/components/Process/index.d.ts +2 -0
- package/dist/components/ProductCard/DarkCard.d.ts +31 -0
- package/dist/components/ProductCard/LargeCard.d.ts +11 -0
- package/dist/components/ProductCard/ProductBanner.d.ts +28 -0
- package/dist/components/ProductCard/index.d.ts +61 -0
- package/dist/components/SectionIntroduction/SectionIntroduction.d.ts +27 -0
- package/dist/components/SectionIntroduction/SectionIntroductionTwoColumn.d.ts +18 -0
- package/dist/components/SectionIntroduction/index.d.ts +4 -0
- package/dist/components/Sidebar/Sidebar.d.ts +26 -0
- package/dist/components/Sidebar/index.d.ts +2 -0
- package/dist/components/Sliders/ProductSlider.d.ts +23 -0
- package/dist/components/Sliders/index.d.ts +2 -0
- package/dist/components/Social/SocialLinks.d.ts +36 -0
- package/dist/components/Social/SocialPostEmbed.d.ts +34 -0
- package/dist/components/Social/index.d.ts +4 -0
- package/dist/components/Statistics/StatCounterRow.d.ts +34 -0
- package/dist/components/Statistics/index.d.ts +2 -0
- package/dist/components/Tabs/Tabs.d.ts +35 -0
- package/dist/components/Tabs/index.d.ts +2 -0
- package/dist/components/Team/TeamBanner.d.ts +32 -0
- package/dist/components/Team/index.d.ts +2 -0
- package/dist/components/Testimonial/CardStack.d.ts +31 -0
- package/dist/components/Testimonial/RatingSummary.d.ts +20 -0
- package/dist/components/Testimonial/Reviews.d.ts +55 -0
- package/dist/components/Testimonial/Testimonial.d.ts +29 -0
- package/dist/components/Testimonial/index.d.ts +8 -0
- package/dist/components/TextCTASection/JustifiedTextCTA.d.ts +11 -0
- package/dist/components/TextCTASection/TextCTA.d.ts +25 -0
- package/dist/components/TextCTASection/index.d.ts +1 -0
- package/dist/components/Timeline/TimelineColumn.d.ts +23 -0
- package/dist/components/Timeline/TimelineHorizontal.d.ts +28 -0
- package/dist/components/Timeline/TimelineYearBlocks.d.ts +55 -0
- package/dist/components/Timeline/VerticalTimeline.d.ts +21 -0
- package/dist/components/Timeline/index.d.ts +8 -0
- package/dist/components/Typography/Typography.d.ts +14 -0
- package/dist/components/Typography/index.d.ts +2 -0
- package/dist/components/VideoSection/VideoSection.d.ts +38 -0
- package/dist/components/VideoSection/index.d.ts +2 -0
- package/dist/index.d.ts +153 -0
- package/dist/index.esm.js +14074 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +14168 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +5901 -0
- package/dist/theme/ThemeProvider.d.ts +13 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/themeConfig.d.ts +8 -0
- package/dist/types.d.ts +60 -0
- package/dist/utils/index.d.ts +10 -0
- 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,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,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;
|