@zoyth/simple-site-framework 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/LICENSE +21 -0
- package/README.md +572 -0
- package/bin/create-simple-site.js +390 -0
- package/bin/simple-site.js +664 -0
- package/dist/client.js +135 -0
- package/dist/client.js.map +1 -0
- package/dist/client.mjs +107 -0
- package/dist/client.mjs.map +1 -0
- package/dist/components/index.d.mts +3936 -0
- package/dist/components/index.d.ts +3936 -0
- package/dist/components/index.js +38265 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +38173 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/config/index.d.mts +298 -0
- package/dist/config/index.d.ts +298 -0
- package/dist/config/index.js +19 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +1 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/index.d.mts +2184 -0
- package/dist/index.d.ts +2184 -0
- package/dist/index.js +1713 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1605 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/i18n/index.js +665 -0
- package/dist/lib/i18n/index.js.map +1 -0
- package/dist/lib/i18n/index.mjs +621 -0
- package/dist/lib/i18n/index.mjs.map +1 -0
- package/docs/DOCUMENTATION-STRUCTURE.md +1156 -0
- package/docs/EXPORTS.md +125 -0
- package/docs/PERFORMANCE.md +757 -0
- package/docs/POLICY-PAGES.md +867 -0
- package/docs/ROADMAP.md +334 -0
- package/docs/SEO.md +455 -0
- package/docs/SITEMAP.md +708 -0
- package/docs/STRUCTURED-DATA.md +671 -0
- package/docs/accessibility/common-patterns.md +529 -0
- package/docs/accessibility/keyboard-navigation.md +263 -0
- package/docs/accessibility/overview.md +122 -0
- package/docs/accessibility/screen-readers.md +311 -0
- package/docs/accessibility/wcag-compliance.md +159 -0
- package/docs/api/README.md +164 -0
- package/docs/api/components/Accessibility.md +356 -0
- package/docs/api/components/Button.md +240 -0
- package/docs/api/components/HeroSection.md +306 -0
- package/docs/architecture/decisions.md +449 -0
- package/docs/components/AnalyticsTracker.md +58 -0
- package/docs/components/AnimatedCounter.md +48 -0
- package/docs/components/AnimatedSection.md +56 -0
- package/docs/components/BlogCard.md +42 -0
- package/docs/components/Checkbox.md +56 -0
- package/docs/components/CodeBlock.md +52 -0
- package/docs/components/ComparisonTable.md +40 -0
- package/docs/components/ComponentDemo.md +38 -0
- package/docs/components/CountdownTimer.md +51 -0
- package/docs/components/ExitIntentModal.md +56 -0
- package/docs/components/FAQAccordion.md +66 -0
- package/docs/components/FeaturesGrid.md +55 -0
- package/docs/components/FileUpload.md +54 -0
- package/docs/components/I18nMetaTags.md +55 -0
- package/docs/components/Icon.md +53 -0
- package/docs/components/LazySection.md +46 -0
- package/docs/components/LiveProof.md +53 -0
- package/docs/components/LoadingSpinner.md +46 -0
- package/docs/components/MultiStepForm.md +48 -0
- package/docs/components/PolicyLayout.md +55 -0
- package/docs/components/PricingTable.md +49 -0
- package/docs/components/Radio.md +59 -0
- package/docs/components/SEOMetaTags.md +58 -0
- package/docs/components/ScriptInjector.md +50 -0
- package/docs/components/Select.md +72 -0
- package/docs/components/Skeleton.md +47 -0
- package/docs/components/StatsSection.md +48 -0
- package/docs/components/StickyBar.md +62 -0
- package/docs/components/StructuredData.md +99 -0
- package/docs/components/StyleGuide.md +46 -0
- package/docs/components/TableOfContents.md +47 -0
- package/docs/components/TestimonialCarousel.md +42 -0
- package/docs/components/Timeline.md +51 -0
- package/docs/components/Toast.md +59 -0
- package/docs/components/TrackedLink.md +62 -0
- package/docs/components/TrustBadges.md +44 -0
- package/docs/components/conversion/MobileCTA.md +363 -0
- package/docs/components/forms/ContactForm.md +75 -0
- package/docs/components/forms/FormField.md +74 -0
- package/docs/components/layout/Footer.md +601 -0
- package/docs/components/layout/Header.md +549 -0
- package/docs/components/layout/LanguageSelector.md +54 -0
- package/docs/components/layout/LanguageSwitcher.md +24 -0
- package/docs/components/overview.md +447 -0
- package/docs/components/sections/AboutSection.md +48 -0
- package/docs/components/sections/CTASection.md +596 -0
- package/docs/components/sections/CaseStudySection.md +47 -0
- package/docs/components/sections/ContactSection.md +599 -0
- package/docs/components/sections/FeatureSection.md +44 -0
- package/docs/components/sections/HeroSection.md +404 -0
- package/docs/components/sections/LogosSection.md +47 -0
- package/docs/components/sections/PersonalTaxesSection.md +23 -0
- package/docs/components/sections/RecruitingSection.md +23 -0
- package/docs/components/sections/SecurePortalSection.md +23 -0
- package/docs/components/sections/ServicePageLayout.md +52 -0
- package/docs/components/sections/ServicesSection.md +49 -0
- package/docs/components/sections/TestimonialSection.md +44 -0
- package/docs/components/sections/WhyChooseUsSection.md +54 -0
- package/docs/components/ui/Breadcrumb.md +70 -0
- package/docs/components/ui/Button.md +514 -0
- package/docs/components/ui/Card.md +501 -0
- package/docs/components/ui/Input.md +54 -0
- package/docs/components/ui/MobileLinks.md +43 -0
- package/docs/components/ui/Modal.md +60 -0
- package/docs/components/ui/Tabs.md +62 -0
- package/docs/components/ui/Textarea.md +52 -0
- package/docs/core-concepts/configuration-driven.md +552 -0
- package/docs/core-concepts/overview.md +351 -0
- package/docs/features/accessibility/README.md +73 -0
- package/docs/features/accessibility/aria-support.md +177 -0
- package/docs/features/accessibility/color-contrast.md +155 -0
- package/docs/features/accessibility/focus-management.md +187 -0
- package/docs/features/accessibility/testing.md +196 -0
- package/docs/features/analytics/README.md +51 -0
- package/docs/features/analytics/ab-testing.md +171 -0
- package/docs/features/analytics/conversion-tracking.md +207 -0
- package/docs/features/analytics/custom-events.md +219 -0
- package/docs/features/analytics/privacy.md +198 -0
- package/docs/features/analytics/setup.md +114 -0
- package/docs/features/analytics/tracking-events.md +224 -0
- package/docs/features/i18n/README.md +51 -0
- package/docs/features/i18n/best-practices.md +273 -0
- package/docs/features/i18n/configuration.md +84 -0
- package/docs/features/i18n/formatting.md +133 -0
- package/docs/features/i18n/locale-detection.md +122 -0
- package/docs/features/i18n/routing.md +99 -0
- package/docs/features/i18n/rtl-support.md +191 -0
- package/docs/features/i18n/translations.md +129 -0
- package/docs/features/internationalization.md +595 -0
- package/docs/features/performance/README.md +77 -0
- package/docs/features/performance/bundle-size.md +134 -0
- package/docs/features/performance/caching.md +131 -0
- package/docs/features/performance/code-splitting.md +121 -0
- package/docs/features/performance/image-optimization.md +110 -0
- package/docs/features/performance/lazy-loading.md +92 -0
- package/docs/features/performance/monitoring.md +148 -0
- package/docs/features/seo/README.md +51 -0
- package/docs/features/seo/best-practices.md +184 -0
- package/docs/features/seo/canonical-urls.md +182 -0
- package/docs/features/seo/meta-tags.md +126 -0
- package/docs/features/seo/open-graph.md +166 -0
- package/docs/features/seo/robots-txt.md +146 -0
- package/docs/features/seo/sitemaps.md +162 -0
- package/docs/features/seo/structured-data.md +166 -0
- package/docs/getting-started/installation.md +292 -0
- package/docs/getting-started/introduction.md +195 -0
- package/docs/getting-started/quick-start.md +460 -0
- package/docs/guides/analytics-setup.md +616 -0
- package/docs/i18n/CONFIGURATION.md +353 -0
- package/docs/i18n/EXAMPLES.md +402 -0
- package/docs/i18n/MIGRATION.md +260 -0
- package/docs/i18n/SEO.md +392 -0
- package/docs/i18n/STATIC-GENERATION-FIX.md +71 -0
- package/docs/migration/changelog.md +136 -0
- package/docs/migration/overview.md +233 -0
- package/docs/recipes/adding-animations.md +475 -0
- package/docs/recipes/forms-with-validation.md +393 -0
- package/package.json +152 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# MultiStepForm
|
|
2
|
+
|
|
3
|
+
Multi-step form wizard component.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { MultiStepForm } from '@zoyth/simple-site-framework/client';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Client Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<MultiStepForm
|
|
17
|
+
steps={[
|
|
18
|
+
{
|
|
19
|
+
title: 'Personal Info',
|
|
20
|
+
fields: [
|
|
21
|
+
{ name: 'name', type: 'text', label: 'Name', required: true },
|
|
22
|
+
{ name: 'email', type: 'email', label: 'Email', required: true },
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
title: 'Company Info',
|
|
27
|
+
fields: [
|
|
28
|
+
{ name: 'company', type: 'text', label: 'Company' },
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
]}
|
|
32
|
+
onSubmit={handleSubmit}
|
|
33
|
+
/>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Props
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Required | Description |
|
|
39
|
+
|------|------|----------|-------------|
|
|
40
|
+
| `steps` | `FormStep[]` | Yes | Form steps |
|
|
41
|
+
| `onSubmit` | `function` | Yes | Submit handler |
|
|
42
|
+
| `showProgress` | `boolean` | No | Show progress indicator |
|
|
43
|
+
| `className` | `string` | No | Custom classes |
|
|
44
|
+
|
|
45
|
+
## See Also
|
|
46
|
+
|
|
47
|
+
- [ContactForm](./forms/ContactForm.md)
|
|
48
|
+
- [FormField](./forms/FormField.md)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# PolicyLayout
|
|
2
|
+
|
|
3
|
+
Layout component for policy pages (Privacy, Terms, etc.).
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { PolicyLayout } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<PolicyLayout
|
|
17
|
+
title="Privacy Policy"
|
|
18
|
+
lastUpdated="January 15, 2024"
|
|
19
|
+
>
|
|
20
|
+
<h2>Introduction</h2>
|
|
21
|
+
<p>This privacy policy...</p>
|
|
22
|
+
</PolicyLayout>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
| Prop | Type | Required | Description |
|
|
28
|
+
|------|------|----------|-------------|
|
|
29
|
+
| `title` | `string \| LocalizedString` | Yes | Policy title |
|
|
30
|
+
| `lastUpdated` | `string` | No | Last updated date |
|
|
31
|
+
| `children` | `ReactNode` | Yes | Policy content |
|
|
32
|
+
| `showTOC` | `boolean` | No | Show table of contents |
|
|
33
|
+
| `className` | `string` | No | Custom classes |
|
|
34
|
+
| `locale` | `string` | No | Current locale |
|
|
35
|
+
|
|
36
|
+
## Examples
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// With TOC
|
|
40
|
+
<PolicyLayout
|
|
41
|
+
title="Terms of Service"
|
|
42
|
+
lastUpdated="March 1, 2024"
|
|
43
|
+
showTOC
|
|
44
|
+
>
|
|
45
|
+
<h2>1. Agreement</h2>
|
|
46
|
+
<p>...</p>
|
|
47
|
+
<h2>2. Usage</h2>
|
|
48
|
+
<p>...</p>
|
|
49
|
+
</PolicyLayout>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## See Also
|
|
53
|
+
|
|
54
|
+
- [TableOfContents](./TableOfContents.md)
|
|
55
|
+
- [SEOMetaTags](./SEOMetaTags.md)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# PricingTable
|
|
2
|
+
|
|
3
|
+
Pricing comparison table component.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { PricingTable } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<PricingTable
|
|
17
|
+
plans={[
|
|
18
|
+
{
|
|
19
|
+
name: 'Basic',
|
|
20
|
+
price: '$9',
|
|
21
|
+
period: '/month',
|
|
22
|
+
features: ['Feature 1', 'Feature 2'],
|
|
23
|
+
cta: { text: 'Get Started', href: '/signup?plan=basic' },
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'Pro',
|
|
27
|
+
price: '$29',
|
|
28
|
+
period: '/month',
|
|
29
|
+
features: ['All Basic features', 'Feature 3', 'Feature 4'],
|
|
30
|
+
cta: { text: 'Get Started', href: '/signup?plan=pro' },
|
|
31
|
+
highlighted: true,
|
|
32
|
+
},
|
|
33
|
+
]}
|
|
34
|
+
/>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Props
|
|
38
|
+
|
|
39
|
+
| Prop | Type | Required | Description |
|
|
40
|
+
|------|------|----------|-------------|
|
|
41
|
+
| `plans` | `PricingPlan[]` | Yes | Pricing plans |
|
|
42
|
+
| `billingPeriod` | `'monthly' \| 'annual'` | No | Default billing period |
|
|
43
|
+
| `className` | `string` | No | Custom classes |
|
|
44
|
+
| `locale` | `string` | No | Current locale |
|
|
45
|
+
|
|
46
|
+
## See Also
|
|
47
|
+
|
|
48
|
+
- [CTASection](./sections/CTASection.md)
|
|
49
|
+
- [Card](./ui/Card.md)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Radio
|
|
2
|
+
|
|
3
|
+
Radio button input component.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { Radio } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<>
|
|
17
|
+
<Radio name="plan" value="basic" label="Basic Plan" />
|
|
18
|
+
<Radio name="plan" value="pro" label="Pro Plan" />
|
|
19
|
+
<Radio name="plan" value="enterprise" label="Enterprise Plan" />
|
|
20
|
+
</>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| Prop | Type | Required | Description |
|
|
26
|
+
|------|------|----------|-------------|
|
|
27
|
+
| `name` | `string` | Yes | Radio group name |
|
|
28
|
+
| `value` | `string` | Yes | Radio value |
|
|
29
|
+
| `label` | `string \| LocalizedString` | Yes | Radio label |
|
|
30
|
+
| `checked` | `boolean` | No | Checked state |
|
|
31
|
+
| `disabled` | `boolean` | No | Disable radio |
|
|
32
|
+
| `onChange` | `function` | No | Change handler |
|
|
33
|
+
| `className` | `string` | No | Custom classes |
|
|
34
|
+
|
|
35
|
+
## Examples
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Radio group
|
|
39
|
+
<fieldset>
|
|
40
|
+
<legend>Select a plan</legend>
|
|
41
|
+
<Radio name="plan" value="basic" label="Basic - $9/month" />
|
|
42
|
+
<Radio name="plan" value="pro" label="Pro - $29/month" />
|
|
43
|
+
<Radio name="plan" value="enterprise" label="Enterprise - Custom" />
|
|
44
|
+
</fieldset>
|
|
45
|
+
|
|
46
|
+
// Controlled radio
|
|
47
|
+
<Radio
|
|
48
|
+
name="option"
|
|
49
|
+
value="yes"
|
|
50
|
+
label="Yes"
|
|
51
|
+
checked={selected === 'yes'}
|
|
52
|
+
onChange={() => setSelected('yes')}
|
|
53
|
+
/>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## See Also
|
|
57
|
+
|
|
58
|
+
- [Checkbox](./Checkbox.md)
|
|
59
|
+
- [FormField](./forms/FormField.md)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# SEOMetaTags
|
|
2
|
+
|
|
3
|
+
SEO meta tags component for page metadata.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { SEOMetaTags } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<SEOMetaTags
|
|
17
|
+
title="Page Title"
|
|
18
|
+
description="Page description for search engines"
|
|
19
|
+
canonical="https://example.com/page"
|
|
20
|
+
/>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| Prop | Type | Required | Description |
|
|
26
|
+
|------|------|----------|-------------|
|
|
27
|
+
| `title` | `string` | Yes | Page title |
|
|
28
|
+
| `description` | `string` | Yes | Meta description |
|
|
29
|
+
| `canonical` | `string` | No | Canonical URL |
|
|
30
|
+
| `ogImage` | `string` | No | Open Graph image |
|
|
31
|
+
| `ogType` | `string` | No | Open Graph type |
|
|
32
|
+
| `noindex` | `boolean` | No | Prevent indexing |
|
|
33
|
+
|
|
34
|
+
## Examples
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// Blog post
|
|
38
|
+
<SEOMetaTags
|
|
39
|
+
title="How to Build Fast Websites"
|
|
40
|
+
description="Learn the best practices for building fast, performant websites"
|
|
41
|
+
canonical="https://example.com/blog/fast-websites"
|
|
42
|
+
ogImage="https://example.com/images/blog-og.jpg"
|
|
43
|
+
ogType="article"
|
|
44
|
+
/>
|
|
45
|
+
|
|
46
|
+
// No index
|
|
47
|
+
<SEOMetaTags
|
|
48
|
+
title="Admin Dashboard"
|
|
49
|
+
description="Internal dashboard"
|
|
50
|
+
noindex
|
|
51
|
+
/>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## See Also
|
|
55
|
+
|
|
56
|
+
- [I18nMetaTags](./I18nMetaTags.md)
|
|
57
|
+
- [StructuredData](./StructuredData.md)
|
|
58
|
+
- [SEO Guide](../guides/seo-optimization.md)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# ScriptInjector
|
|
2
|
+
|
|
3
|
+
Component for injecting third-party scripts.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { ScriptInjector } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Client Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<ScriptInjector
|
|
17
|
+
src="https://example.com/script.js"
|
|
18
|
+
strategy="afterInteractive"
|
|
19
|
+
/>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Required | Description |
|
|
25
|
+
|------|------|----------|-------------|
|
|
26
|
+
| `src` | `string` | Yes | Script URL |
|
|
27
|
+
| `strategy` | `'beforeInteractive' \| 'afterInteractive' \| 'lazyOnload'` | No | Load strategy |
|
|
28
|
+
| `onLoad` | `function` | No | Load callback |
|
|
29
|
+
| `onError` | `function` | No | Error callback |
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
// Analytics script
|
|
35
|
+
<ScriptInjector
|
|
36
|
+
src="https://analytics.example.com/script.js"
|
|
37
|
+
strategy="afterInteractive"
|
|
38
|
+
onLoad={() => console.log('Analytics loaded')}
|
|
39
|
+
/>
|
|
40
|
+
|
|
41
|
+
// Chat widget
|
|
42
|
+
<ScriptInjector
|
|
43
|
+
src="https://chat.example.com/widget.js"
|
|
44
|
+
strategy="lazyOnload"
|
|
45
|
+
/>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## See Also
|
|
49
|
+
|
|
50
|
+
- [AnalyticsTracker](./AnalyticsTracker.md)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Select
|
|
2
|
+
|
|
3
|
+
Dropdown select input component.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { Select } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<Select
|
|
17
|
+
name="country"
|
|
18
|
+
options={[
|
|
19
|
+
{ value: 'us', label: 'United States' },
|
|
20
|
+
{ value: 'ca', label: 'Canada' },
|
|
21
|
+
{ value: 'uk', label: 'United Kingdom' },
|
|
22
|
+
]}
|
|
23
|
+
/>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
| Prop | Type | Required | Description |
|
|
29
|
+
|------|------|----------|-------------|
|
|
30
|
+
| `name` | `string` | Yes | Select name |
|
|
31
|
+
| `options` | `SelectOption[]` | Yes | Select options |
|
|
32
|
+
| `value` | `string` | No | Selected value |
|
|
33
|
+
| `placeholder` | `string` | No | Placeholder text |
|
|
34
|
+
| `disabled` | `boolean` | No | Disable select |
|
|
35
|
+
| `required` | `boolean` | No | Required field |
|
|
36
|
+
| `onChange` | `function` | No | Change handler |
|
|
37
|
+
| `className` | `string` | No | Custom classes |
|
|
38
|
+
|
|
39
|
+
### SelectOption
|
|
40
|
+
|
|
41
|
+
| Prop | Type | Required | Description |
|
|
42
|
+
|------|------|----------|-------------|
|
|
43
|
+
| `value` | `string` | Yes | Option value |
|
|
44
|
+
| `label` | `string \| LocalizedString` | Yes | Option label |
|
|
45
|
+
|
|
46
|
+
## Examples
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// With placeholder
|
|
50
|
+
<Select
|
|
51
|
+
name="size"
|
|
52
|
+
placeholder="Select size"
|
|
53
|
+
options={[
|
|
54
|
+
{ value: 'sm', label: 'Small' },
|
|
55
|
+
{ value: 'md', label: 'Medium' },
|
|
56
|
+
{ value: 'lg', label: 'Large' },
|
|
57
|
+
]}
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
// Controlled select
|
|
61
|
+
<Select
|
|
62
|
+
name="category"
|
|
63
|
+
value={category}
|
|
64
|
+
options={categories}
|
|
65
|
+
onChange={(e) => setCategory(e.target.value)}
|
|
66
|
+
/>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## See Also
|
|
70
|
+
|
|
71
|
+
- [Input](./ui/Input.md)
|
|
72
|
+
- [FormField](./forms/FormField.md)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Skeleton
|
|
2
|
+
|
|
3
|
+
Loading skeleton placeholder component.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { Skeleton } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<Skeleton width="200px" height="20px" />
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Props
|
|
20
|
+
|
|
21
|
+
| Prop | Type | Required | Description |
|
|
22
|
+
|------|------|----------|-------------|
|
|
23
|
+
| `width` | `string \| number` | No | Skeleton width |
|
|
24
|
+
| `height` | `string \| number` | No | Skeleton height |
|
|
25
|
+
| `variant` | `'text' \| 'circular' \| 'rectangular'` | No | Shape variant |
|
|
26
|
+
| `className` | `string` | No | Custom classes |
|
|
27
|
+
|
|
28
|
+
## Examples
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// Text line
|
|
32
|
+
<Skeleton variant="text" width="100%" />
|
|
33
|
+
|
|
34
|
+
// Avatar
|
|
35
|
+
<Skeleton variant="circular" width={40} height={40} />
|
|
36
|
+
|
|
37
|
+
// Card placeholder
|
|
38
|
+
<div>
|
|
39
|
+
<Skeleton width="100%" height="200px" />
|
|
40
|
+
<Skeleton variant="text" width="80%" className="mt-2" />
|
|
41
|
+
<Skeleton variant="text" width="60%" className="mt-2" />
|
|
42
|
+
</div>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## See Also
|
|
46
|
+
|
|
47
|
+
- [LoadingSpinner](./LoadingSpinner.md)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# StatsSection
|
|
2
|
+
|
|
3
|
+
Statistics display section with animated counters.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { StatsSection } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Client Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<StatsSection
|
|
17
|
+
heading="Our Impact"
|
|
18
|
+
stats={[
|
|
19
|
+
{ value: '10,000+', label: 'Customers' },
|
|
20
|
+
{ value: '99%', label: 'Satisfaction Rate' },
|
|
21
|
+
{ value: '24/7', label: 'Support' },
|
|
22
|
+
]}
|
|
23
|
+
/>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
| Prop | Type | Required | Description |
|
|
29
|
+
|------|------|----------|-------------|
|
|
30
|
+
| `heading` | `string \| LocalizedString` | No | Section heading |
|
|
31
|
+
| `stats` | `Stat[]` | Yes | Statistics items |
|
|
32
|
+
| `variant` | `'default' \| 'cards'` | No | Display variant |
|
|
33
|
+
| `animated` | `boolean` | No | Animate counters |
|
|
34
|
+
| `className` | `string` | No | Custom classes |
|
|
35
|
+
| `locale` | `string` | No | Current locale |
|
|
36
|
+
|
|
37
|
+
### Stat
|
|
38
|
+
|
|
39
|
+
| Prop | Type | Required | Description |
|
|
40
|
+
|------|------|----------|-------------|
|
|
41
|
+
| `value` | `string \| number` | Yes | Stat value |
|
|
42
|
+
| `label` | `string \| LocalizedString` | Yes | Stat label |
|
|
43
|
+
| `suffix` | `string` | No | Value suffix |
|
|
44
|
+
|
|
45
|
+
## See Also
|
|
46
|
+
|
|
47
|
+
- [AboutSection](./sections/AboutSection.md)
|
|
48
|
+
- [AnimatedCounter](./AnimatedCounter.md)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# StickyBar
|
|
2
|
+
|
|
3
|
+
Sticky banner/bar component (top or bottom).
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { StickyBar } from '@zoyth/simple-site-framework/client';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Client Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<StickyBar
|
|
17
|
+
position="top"
|
|
18
|
+
message="🎉 New feature released!"
|
|
19
|
+
cta={{
|
|
20
|
+
text: 'Learn More',
|
|
21
|
+
href: '/features/new'
|
|
22
|
+
}}
|
|
23
|
+
onDismiss={() => setShowBar(false)}
|
|
24
|
+
/>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Props
|
|
28
|
+
|
|
29
|
+
| Prop | Type | Required | Description |
|
|
30
|
+
|------|------|----------|-------------|
|
|
31
|
+
| `message` | `string \| LocalizedString` | Yes | Bar message |
|
|
32
|
+
| `position` | `'top' \| 'bottom'` | No | Position (default: 'top') |
|
|
33
|
+
| `cta` | `CTAConfig` | No | Call-to-action |
|
|
34
|
+
| `dismissible` | `boolean` | No | Show close button |
|
|
35
|
+
| `onDismiss` | `function` | No | Dismiss handler |
|
|
36
|
+
| `className` | `string` | No | Custom classes |
|
|
37
|
+
| `locale` | `string` | No | Current locale |
|
|
38
|
+
|
|
39
|
+
## Examples
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// Announcement bar
|
|
43
|
+
<StickyBar
|
|
44
|
+
position="top"
|
|
45
|
+
message="Limited time offer - 50% off all plans!"
|
|
46
|
+
cta={{ text: 'Get Started', href: '/pricing' }}
|
|
47
|
+
dismissible
|
|
48
|
+
/>
|
|
49
|
+
|
|
50
|
+
// Cookie notice
|
|
51
|
+
<StickyBar
|
|
52
|
+
position="bottom"
|
|
53
|
+
message="We use cookies to improve your experience."
|
|
54
|
+
cta={{ text: 'Learn More', href: '/privacy' }}
|
|
55
|
+
onDismiss={() => setCookieConsent(true)}
|
|
56
|
+
/>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## See Also
|
|
60
|
+
|
|
61
|
+
- [MobileCTA](./conversion/MobileCTA.md)
|
|
62
|
+
- [Toast](./Toast.md)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# StructuredData
|
|
2
|
+
|
|
3
|
+
JSON-LD structured data component for rich snippets.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { StructuredData } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<StructuredData
|
|
17
|
+
type="Organization"
|
|
18
|
+
data={{
|
|
19
|
+
name: "Acme Corp",
|
|
20
|
+
url: "https://acme.com",
|
|
21
|
+
logo: "https://acme.com/logo.png",
|
|
22
|
+
}}
|
|
23
|
+
/>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
| Prop | Type | Required | Description |
|
|
29
|
+
|------|------|----------|-------------|
|
|
30
|
+
| `type` | `string` | Yes | Schema.org type |
|
|
31
|
+
| `data` | `object` | Yes | Structured data object |
|
|
32
|
+
|
|
33
|
+
## Supported Types
|
|
34
|
+
|
|
35
|
+
- `Organization`
|
|
36
|
+
- `WebSite`
|
|
37
|
+
- `Article`
|
|
38
|
+
- `BreadcrumbList`
|
|
39
|
+
- `FAQPage`
|
|
40
|
+
- `Product`
|
|
41
|
+
- `Review`
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// Organization
|
|
47
|
+
<StructuredData
|
|
48
|
+
type="Organization"
|
|
49
|
+
data={{
|
|
50
|
+
"@context": "https://schema.org",
|
|
51
|
+
"@type": "Organization",
|
|
52
|
+
name: "Acme Corporation",
|
|
53
|
+
url: "https://acme.com",
|
|
54
|
+
logo: "https://acme.com/logo.png",
|
|
55
|
+
sameAs: [
|
|
56
|
+
"https://twitter.com/acmecorp",
|
|
57
|
+
"https://linkedin.com/company/acmecorp"
|
|
58
|
+
]
|
|
59
|
+
}}
|
|
60
|
+
/>
|
|
61
|
+
|
|
62
|
+
// Article
|
|
63
|
+
<StructuredData
|
|
64
|
+
type="Article"
|
|
65
|
+
data={{
|
|
66
|
+
"@context": "https://schema.org",
|
|
67
|
+
"@type": "Article",
|
|
68
|
+
headline: "How to Build Fast Websites",
|
|
69
|
+
author: {
|
|
70
|
+
"@type": "Person",
|
|
71
|
+
name: "John Doe"
|
|
72
|
+
},
|
|
73
|
+
datePublished: "2024-01-15"
|
|
74
|
+
}}
|
|
75
|
+
/>
|
|
76
|
+
|
|
77
|
+
// FAQ
|
|
78
|
+
<StructuredData
|
|
79
|
+
type="FAQPage"
|
|
80
|
+
data={{
|
|
81
|
+
"@context": "https://schema.org",
|
|
82
|
+
"@type": "FAQPage",
|
|
83
|
+
mainEntity: faqs.map(faq => ({
|
|
84
|
+
"@type": "Question",
|
|
85
|
+
name: faq.question,
|
|
86
|
+
acceptedAnswer: {
|
|
87
|
+
"@type": "Answer",
|
|
88
|
+
text: faq.answer
|
|
89
|
+
}
|
|
90
|
+
}))
|
|
91
|
+
}}
|
|
92
|
+
/>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## See Also
|
|
96
|
+
|
|
97
|
+
- [SEOMetaTags](./SEOMetaTags.md)
|
|
98
|
+
- [FAQAccordion](./FAQAccordion.md)
|
|
99
|
+
- [SEO Guide](../guides/seo-optimization.md)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# StyleGuide
|
|
2
|
+
|
|
3
|
+
Component library style guide/showcase.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { StyleGuide } from '@zoyth/simple-site-framework';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Type:** Server Component
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
<StyleGuide
|
|
17
|
+
title="Design System"
|
|
18
|
+
sections={[
|
|
19
|
+
'colors',
|
|
20
|
+
'typography',
|
|
21
|
+
'buttons',
|
|
22
|
+
'forms',
|
|
23
|
+
'icons'
|
|
24
|
+
]}
|
|
25
|
+
/>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Props
|
|
29
|
+
|
|
30
|
+
| Prop | Type | Required | Description |
|
|
31
|
+
|------|------|----------|-------------|
|
|
32
|
+
| `title` | `string` | No | Style guide title |
|
|
33
|
+
| `sections` | `string[]` | No | Sections to display |
|
|
34
|
+
| `className` | `string` | No | Custom classes |
|
|
35
|
+
|
|
36
|
+
## Displays
|
|
37
|
+
|
|
38
|
+
- Color palette
|
|
39
|
+
- Typography scale
|
|
40
|
+
- Component variants
|
|
41
|
+
- Spacing system
|
|
42
|
+
- Icon library
|
|
43
|
+
|
|
44
|
+
## See Also
|
|
45
|
+
|
|
46
|
+
- Internal development tool
|