nextworks 0.2.0-alpha.11 → 0.2.0-alpha.13
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 +283 -282
- package/dist/cli_manifests/blocks_manifest.json +198 -175
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_QUICKSTART.md +101 -100
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_README.md +105 -104
- package/dist/kits/blocks/.nextworks/docs/THEME_GUIDE.md +1 -1
- package/dist/kits/blocks/app/templates/aiworkflow/PresetThemeVars.tsx +58 -0
- package/dist/kits/blocks/app/templates/aiworkflow/README.md +46 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/CTA.tsx +44 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Contact.tsx +105 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/FAQ.tsx +63 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Features.tsx +65 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Footer.tsx +109 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Hero.tsx +636 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Navbar.tsx +90 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Pricing.tsx +86 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/ProcessTimeline.tsx +103 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Testimonials.tsx +56 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/TrustBadges.tsx +59 -0
- package/dist/kits/blocks/app/templates/aiworkflow/page.tsx +43 -0
- package/dist/kits/blocks/app/templates/digitalagency/PresetThemeVars.tsx +80 -80
- package/dist/kits/blocks/app/templates/digitalagency/README.md +42 -42
- package/dist/kits/blocks/app/templates/digitalagency/components/Pricing.tsx +114 -114
- package/dist/kits/blocks/app/templates/digitalagency/components/Process.tsx +59 -59
- package/dist/kits/blocks/app/templates/digitalagency/components/Services.tsx +55 -55
- package/dist/kits/blocks/app/templates/digitalagency/components/Team.tsx +28 -28
- package/dist/kits/blocks/app/templates/digitalagency/components/Testimonials.tsx +65 -65
- package/dist/kits/blocks/app/templates/digitalagency/page.tsx +38 -38
- package/dist/kits/blocks/app/templates/gallery/PresetThemeVars.tsx +84 -84
- package/dist/kits/blocks/app/templates/productlaunch/PresetThemeVars.tsx +75 -75
- package/dist/kits/blocks/app/templates/productlaunch/README.md +62 -62
- package/dist/kits/blocks/app/templates/productlaunch/components/About.tsx +84 -84
- package/dist/kits/blocks/app/templates/productlaunch/components/CTA.tsx +50 -50
- package/dist/kits/blocks/app/templates/productlaunch/components/Contact.tsx +231 -231
- package/dist/kits/blocks/app/templates/productlaunch/components/FAQ.tsx +86 -86
- package/dist/kits/blocks/app/templates/productlaunch/components/Features.tsx +83 -83
- package/dist/kits/blocks/app/templates/productlaunch/components/Footer.tsx +132 -132
- package/dist/kits/blocks/app/templates/productlaunch/components/Hero.tsx +88 -88
- package/dist/kits/blocks/app/templates/productlaunch/components/Navbar.tsx +116 -116
- package/dist/kits/blocks/app/templates/productlaunch/components/Pricing.tsx +106 -106
- package/dist/kits/blocks/app/templates/productlaunch/components/ProcessTimeline.tsx +110 -110
- package/dist/kits/blocks/app/templates/productlaunch/components/ServicesGrid.tsx +68 -68
- package/dist/kits/blocks/app/templates/productlaunch/components/Team.tsx +104 -104
- package/dist/kits/blocks/app/templates/productlaunch/components/Testimonials.tsx +90 -90
- package/dist/kits/blocks/app/templates/productlaunch/components/TrustBadges.tsx +76 -76
- package/dist/kits/blocks/app/templates/productlaunch/page.tsx +43 -43
- package/dist/kits/blocks/app/templates/saasdashboard/PresetThemeVars.tsx +80 -80
- package/dist/kits/blocks/app/templates/saasdashboard/README.md +44 -44
- package/dist/kits/blocks/app/templates/saasdashboard/components/Contact.tsx +129 -129
- package/dist/kits/blocks/app/templates/saasdashboard/components/Dashboard.tsx +293 -293
- package/dist/kits/blocks/app/templates/saasdashboard/components/FAQ.tsx +55 -55
- package/dist/kits/blocks/app/templates/saasdashboard/components/Features.tsx +90 -90
- package/dist/kits/blocks/app/templates/saasdashboard/components/Footer.tsx +77 -77
- package/dist/kits/blocks/app/templates/saasdashboard/components/Hero.tsx +104 -104
- package/dist/kits/blocks/app/templates/saasdashboard/components/Hero_mask.tsx +126 -126
- package/dist/kits/blocks/app/templates/saasdashboard/components/Navbar.tsx +117 -117
- package/dist/kits/blocks/app/templates/saasdashboard/components/Pricing.tsx +90 -90
- package/dist/kits/blocks/app/templates/saasdashboard/components/SmoothScroll.tsx +96 -96
- package/dist/kits/blocks/app/templates/saasdashboard/components/Testimonials.tsx +72 -72
- package/dist/kits/blocks/app/templates/saasdashboard/components/TrustBadges.tsx +53 -53
- package/dist/kits/blocks/app/templates/saasdashboard/page.tsx +39 -39
- package/dist/kits/blocks/components/enhanced-theme-provider.tsx +195 -195
- package/dist/kits/blocks/components/providers/BlocksAppProviders.tsx +27 -27
- package/dist/kits/blocks/components/sections/About.tsx +291 -291
- package/dist/kits/blocks/components/sections/CTA.tsx +257 -257
- package/dist/kits/blocks/components/sections/Contact.tsx +267 -267
- package/dist/kits/blocks/components/sections/FAQ.tsx +214 -214
- package/dist/kits/blocks/components/sections/Features.tsx +268 -268
- package/dist/kits/blocks/components/sections/Footer.tsx +302 -302
- package/dist/kits/blocks/components/sections/HeroMotion.tsx +308 -308
- package/dist/kits/blocks/components/sections/HeroOverlay.tsx +358 -358
- package/dist/kits/blocks/components/sections/HeroProductDemo.tsx +236 -0
- package/dist/kits/blocks/components/sections/HeroSplit.tsx +352 -352
- package/dist/kits/blocks/components/sections/Navbar.tsx +350 -350
- package/dist/kits/blocks/components/sections/PortfolioSimple.tsx +549 -549
- package/dist/kits/blocks/components/sections/Pricing.tsx +264 -264
- package/dist/kits/blocks/components/sections/ProcessTimeline.tsx +325 -325
- package/dist/kits/blocks/components/sections/ServicesGrid.tsx +210 -210
- package/dist/kits/blocks/components/sections/Team.tsx +309 -309
- package/dist/kits/blocks/components/sections/Testimonials.tsx +158 -158
- package/dist/kits/blocks/components/sections/TrustBadges.tsx +162 -162
- package/dist/kits/blocks/components/sections/product-demo/ApprovalInboxPanel.tsx +125 -0
- package/dist/kits/blocks/components/sections/product-demo/DemoStage.tsx +397 -0
- package/dist/kits/blocks/components/sections/product-demo/DemoWindow.tsx +128 -0
- package/dist/kits/blocks/components/sections/product-demo/KnowledgePanel.tsx +127 -0
- package/dist/kits/blocks/components/sections/product-demo/RunConsolePanel.tsx +150 -0
- package/dist/kits/blocks/components/sections/product-demo/WorkflowStudioPanel.tsx +191 -0
- package/dist/kits/blocks/components/sections/product-demo/types.ts +193 -0
- package/dist/kits/blocks/components/theme-provider.tsx +1 -1
- package/dist/kits/blocks/components/ui/alert-dialog.tsx +134 -134
- package/dist/kits/blocks/components/ui/brand-node.tsx +121 -121
- package/dist/kits/blocks/components/ui/button.tsx +122 -122
- package/dist/kits/blocks/components/ui/card.tsx +95 -95
- package/dist/kits/blocks/components/ui/checkbox.tsx +30 -30
- package/dist/kits/blocks/components/ui/cta-button.tsx +125 -125
- package/dist/kits/blocks/components/ui/dropdown-menu.tsx +201 -201
- package/dist/kits/blocks/components/ui/feature-card.tsx +91 -91
- package/dist/kits/blocks/components/ui/input.tsx +27 -27
- package/dist/kits/blocks/components/ui/label.tsx +29 -29
- package/dist/kits/blocks/components/ui/pricing-card.tsx +120 -120
- package/dist/kits/blocks/components/ui/select.tsx +25 -25
- package/dist/kits/blocks/components/ui/skeleton.tsx +13 -13
- package/dist/kits/blocks/components/ui/table.tsx +98 -98
- package/dist/kits/blocks/components/ui/testimonial-card.tsx +108 -108
- package/dist/kits/blocks/components/ui/textarea.tsx +26 -26
- package/dist/kits/blocks/components/ui/theme-selector.tsx +243 -243
- package/dist/kits/blocks/components/ui/theme-toggle.tsx +74 -74
- package/dist/kits/blocks/components/ui/toaster.tsx +7 -7
- package/dist/kits/blocks/lib/themes.ts +400 -400
- package/dist/kits/blocks/lib/utils.ts +6 -6
- package/dist/kits/blocks/package-deps.json +3 -3
- package/package.json +1 -1
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
# SaaSDashboard Template Theming
|
|
2
|
-
|
|
3
|
-
This template is preset-first. It’s wrapped with `PresetThemeVars` to apply a sky/blue palette across shared components.
|
|
4
|
-
|
|
5
|
-
## Where it’s wired
|
|
6
|
-
|
|
7
|
-
Template paths depend on your router:
|
|
8
|
-
|
|
9
|
-
- App Router:
|
|
10
|
-
- Wrapper: `app/templates/saasdashboard/PresetThemeVars.tsx`
|
|
11
|
-
- Page: `app/templates/saasdashboard/page.tsx`
|
|
12
|
-
- Pages Router:
|
|
13
|
-
- Wrapper: `components/templates/saasdashboard/PresetThemeVars.tsx`
|
|
14
|
-
- Page: `pages/templates/saasdashboard/index.tsx`
|
|
15
|
-
|
|
16
|
-
## Core variables
|
|
17
|
-
|
|
18
|
-
- Buttons: `--btn-bg`, `--btn-fg`, `--btn-hover-bg`, `--btn-hover-fg`, `--btn-border`, `--btn-ring`
|
|
19
|
-
- Inputs/Textareas: `--input-bg`, `--input-fg`, `--input-placeholder`, `--input-border`, `--input-focus-ring`, `--input-ring-offset`
|
|
20
|
-
- Cards: `--card-bg`, `--card-fg`, `--card-title-fg`, `--card-muted-fg`, `--card-border`, `--card-shadow`
|
|
21
|
-
- Badges/Chips: `--badge-bg`, `--badge-fg`, `--badge-border`, active: `--badge-active-*`
|
|
22
|
-
- Headings: `--heading-fg`, `--subheading-fg`, `--description-fg`
|
|
23
|
-
- Footer: `--footer-bg`, `--footer-fg`, `--footer-heading-fg`, `--footer-link-fg`, `--footer-link-hover-fg`, `--footer-link-hover-bg`, `--footer-muted-fg`, `--footer-border`
|
|
24
|
-
- Table: `--table-fg`, `--table-muted-fg`, `--table-head-fg`, `--table-border`, `--table-row-hover-bg`
|
|
25
|
-
|
|
26
|
-
## Per-section overrides
|
|
27
|
-
|
|
28
|
-
This template should be styled primarily by PresetThemeVars. When a section needs to deviate, set overrides locally and keep them minimal.
|
|
29
|
-
|
|
30
|
-
Example to emphasize button rings inside Pricing only:
|
|
31
|
-
|
|
32
|
-
```tsx
|
|
33
|
-
<section className="[--btn-ring:theme(colors.sky.600)]">
|
|
34
|
-
<Pricing />
|
|
35
|
-
</section>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Outline buttons
|
|
39
|
-
|
|
40
|
-
For outline variants: set `--btn-bg:transparent` and keep a border width class.
|
|
41
|
-
|
|
42
|
-
## Should preset components be refactored?
|
|
43
|
-
|
|
44
|
-
Not required. Over time, simplify presets by removing redundant color classes in favor of the variables. Structure/motion classes should remain.
|
|
1
|
+
# SaaSDashboard Template Theming
|
|
2
|
+
|
|
3
|
+
This template is preset-first. It’s wrapped with `PresetThemeVars` to apply a sky/blue palette across shared components.
|
|
4
|
+
|
|
5
|
+
## Where it’s wired
|
|
6
|
+
|
|
7
|
+
Template paths depend on your router:
|
|
8
|
+
|
|
9
|
+
- App Router:
|
|
10
|
+
- Wrapper: `app/templates/saasdashboard/PresetThemeVars.tsx`
|
|
11
|
+
- Page: `app/templates/saasdashboard/page.tsx`
|
|
12
|
+
- Pages Router:
|
|
13
|
+
- Wrapper: `components/templates/saasdashboard/PresetThemeVars.tsx`
|
|
14
|
+
- Page: `pages/templates/saasdashboard/index.tsx`
|
|
15
|
+
|
|
16
|
+
## Core variables
|
|
17
|
+
|
|
18
|
+
- Buttons: `--btn-bg`, `--btn-fg`, `--btn-hover-bg`, `--btn-hover-fg`, `--btn-border`, `--btn-ring`
|
|
19
|
+
- Inputs/Textareas: `--input-bg`, `--input-fg`, `--input-placeholder`, `--input-border`, `--input-focus-ring`, `--input-ring-offset`
|
|
20
|
+
- Cards: `--card-bg`, `--card-fg`, `--card-title-fg`, `--card-muted-fg`, `--card-border`, `--card-shadow`
|
|
21
|
+
- Badges/Chips: `--badge-bg`, `--badge-fg`, `--badge-border`, active: `--badge-active-*`
|
|
22
|
+
- Headings: `--heading-fg`, `--subheading-fg`, `--description-fg`
|
|
23
|
+
- Footer: `--footer-bg`, `--footer-fg`, `--footer-heading-fg`, `--footer-link-fg`, `--footer-link-hover-fg`, `--footer-link-hover-bg`, `--footer-muted-fg`, `--footer-border`
|
|
24
|
+
- Table: `--table-fg`, `--table-muted-fg`, `--table-head-fg`, `--table-border`, `--table-row-hover-bg`
|
|
25
|
+
|
|
26
|
+
## Per-section overrides
|
|
27
|
+
|
|
28
|
+
This template should be styled primarily by PresetThemeVars. When a section needs to deviate, set overrides locally and keep them minimal.
|
|
29
|
+
|
|
30
|
+
Example to emphasize button rings inside Pricing only:
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
<section className="[--btn-ring:theme(colors.sky.600)]">
|
|
34
|
+
<Pricing />
|
|
35
|
+
</section>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Outline buttons
|
|
39
|
+
|
|
40
|
+
For outline variants: set `--btn-bg:transparent` and keep a border width class.
|
|
41
|
+
|
|
42
|
+
## Should preset components be refactored?
|
|
43
|
+
|
|
44
|
+
Not required. Over time, simplify presets by removing redundant color classes in favor of the variables. Structure/motion classes should remain.
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import React from "react";
|
|
4
|
-
import {
|
|
5
|
-
Contact as SharedContact,
|
|
6
|
-
ContactField,
|
|
7
|
-
} from "@/components/sections/Contact";
|
|
8
|
-
|
|
9
|
-
const saasContactFormData: ContactField[] = [
|
|
10
|
-
{
|
|
11
|
-
id: "name",
|
|
12
|
-
label: "Full Name",
|
|
13
|
-
placeholder: "Jane Doe",
|
|
14
|
-
required: true,
|
|
15
|
-
type: "text",
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
id: "email",
|
|
19
|
-
label: "Work Email",
|
|
20
|
-
placeholder: "jane@company.com",
|
|
21
|
-
required: true,
|
|
22
|
-
type: "email",
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
id: "company",
|
|
26
|
-
label: "Company",
|
|
27
|
-
placeholder: "Acme Inc.",
|
|
28
|
-
required: false,
|
|
29
|
-
type: "text",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: "teamSize",
|
|
33
|
-
label: "Team Size",
|
|
34
|
-
placeholder: "e.g. 10–50",
|
|
35
|
-
required: false,
|
|
36
|
-
type: "text",
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
id: "useCase",
|
|
40
|
-
label: "Primary Use Case",
|
|
41
|
-
placeholder: "e.g. Product analytics, Ops dashboards",
|
|
42
|
-
required: false,
|
|
43
|
-
type: "text",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
id: "message",
|
|
47
|
-
label: "What would you like to see in the demo?",
|
|
48
|
-
placeholder: "Share goals, data sources, timeline…",
|
|
49
|
-
required: true,
|
|
50
|
-
type: "textarea",
|
|
51
|
-
},
|
|
52
|
-
];
|
|
53
|
-
|
|
54
|
-
export function Contact() {
|
|
55
|
-
const handleFormSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
|
56
|
-
e.preventDefault();
|
|
57
|
-
const data = Object.fromEntries(new FormData(e.currentTarget).entries());
|
|
58
|
-
console.log("Contact form submitted:", data);
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
return (
|
|
62
|
-
<div className="relative">
|
|
63
|
-
{/* Gradient mesh overlay */}
|
|
64
|
-
<div
|
|
65
|
-
aria-hidden
|
|
66
|
-
className="pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(60rem_60rem_at_0%_0%,rgba(59,130,246,0.08),transparent_40%),radial-gradient(50rem_50rem_at_100%_100%,rgba(168,85,247,0.06),transparent_40%)] opacity-20"
|
|
67
|
-
/>
|
|
68
|
-
{/* Fine noise/dots texture */}
|
|
69
|
-
<div
|
|
70
|
-
aria-hidden
|
|
71
|
-
className="pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(rgba(255,255,255,0.07)_1px,transparent_1px)] [background-size:14px_14px] opacity-[0.05]"
|
|
72
|
-
/>
|
|
73
|
-
|
|
74
|
-
<SharedContact
|
|
75
|
-
id="contact"
|
|
76
|
-
ariaLabel="SaaS dashboard contact section"
|
|
77
|
-
fields={saasContactFormData}
|
|
78
|
-
contactHeaderText="Ready to See DashFlow in Action?"
|
|
79
|
-
contactSubHeaderText="Tell us a bit about your team and we'll reach out with a tailored demo."
|
|
80
|
-
// Root and section
|
|
81
|
-
className="w-full"
|
|
82
|
-
section={{
|
|
83
|
-
className:
|
|
84
|
-
"py-16 px-6 bg-gradient-to-b from-slate-900/95 via-slate-950 to-slate-900/95 dark:from-slate-950 dark:via-slate-900 dark:to-slate-950",
|
|
85
|
-
}}
|
|
86
|
-
container={{ className: "mx-auto max-w-4xl" }}
|
|
87
|
-
// Header slots
|
|
88
|
-
headerWrapper={{ className: "mb-10 text-center" }}
|
|
89
|
-
headerText={{
|
|
90
|
-
className: "text-3xl font-bold font-inter text-white",
|
|
91
|
-
}}
|
|
92
|
-
subheaderText={{
|
|
93
|
-
className:
|
|
94
|
-
"mt-3 text-base text-white/90 max-w-2xl mx-auto font-inter",
|
|
95
|
-
}}
|
|
96
|
-
// Form container
|
|
97
|
-
form={{
|
|
98
|
-
className:
|
|
99
|
-
"bg-card p-8 rounded-xl shadow-xl border border-border bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)]",
|
|
100
|
-
}}
|
|
101
|
-
// Fields and inputs
|
|
102
|
-
fieldsWrapper={{ className: "space-y-4" }}
|
|
103
|
-
field={{ className: "space-y-2" }}
|
|
104
|
-
label={{
|
|
105
|
-
className:
|
|
106
|
-
"text-card-foreground text-sm font-medium font-poppins block",
|
|
107
|
-
}}
|
|
108
|
-
input={{
|
|
109
|
-
className:
|
|
110
|
-
"w-full p-3 rounded-md font-inter border-[var(--input-border)] bg-[var(--input-bg)] text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-2 focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
|
|
111
|
-
}}
|
|
112
|
-
textarea={{
|
|
113
|
-
className:
|
|
114
|
-
"w-full p-3 rounded-md resize-vertical min-h-[120px] font-inter border-[var(--input-border)] bg-[var(--input-bg)] text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-2 focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
|
|
115
|
-
}}
|
|
116
|
-
// Submit button (wrapper/style/text split)
|
|
117
|
-
submitButtonWrapper={{ className: "pt-2" }}
|
|
118
|
-
submitButtonStyle={{
|
|
119
|
-
variant: "default",
|
|
120
|
-
size: "lg",
|
|
121
|
-
className:
|
|
122
|
-
"w-full bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-400 text-white font-semibold font-inter shadow-lg hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5",
|
|
123
|
-
}}
|
|
124
|
-
submitButtonText="Send Request"
|
|
125
|
-
onSubmit={handleFormSubmit}
|
|
126
|
-
/>
|
|
127
|
-
</div>
|
|
128
|
-
);
|
|
129
|
-
}
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import {
|
|
5
|
+
Contact as SharedContact,
|
|
6
|
+
ContactField,
|
|
7
|
+
} from "@/components/sections/Contact";
|
|
8
|
+
|
|
9
|
+
const saasContactFormData: ContactField[] = [
|
|
10
|
+
{
|
|
11
|
+
id: "name",
|
|
12
|
+
label: "Full Name",
|
|
13
|
+
placeholder: "Jane Doe",
|
|
14
|
+
required: true,
|
|
15
|
+
type: "text",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "email",
|
|
19
|
+
label: "Work Email",
|
|
20
|
+
placeholder: "jane@company.com",
|
|
21
|
+
required: true,
|
|
22
|
+
type: "email",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "company",
|
|
26
|
+
label: "Company",
|
|
27
|
+
placeholder: "Acme Inc.",
|
|
28
|
+
required: false,
|
|
29
|
+
type: "text",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "teamSize",
|
|
33
|
+
label: "Team Size",
|
|
34
|
+
placeholder: "e.g. 10–50",
|
|
35
|
+
required: false,
|
|
36
|
+
type: "text",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "useCase",
|
|
40
|
+
label: "Primary Use Case",
|
|
41
|
+
placeholder: "e.g. Product analytics, Ops dashboards",
|
|
42
|
+
required: false,
|
|
43
|
+
type: "text",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "message",
|
|
47
|
+
label: "What would you like to see in the demo?",
|
|
48
|
+
placeholder: "Share goals, data sources, timeline…",
|
|
49
|
+
required: true,
|
|
50
|
+
type: "textarea",
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
export function Contact() {
|
|
55
|
+
const handleFormSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
const data = Object.fromEntries(new FormData(e.currentTarget).entries());
|
|
58
|
+
console.log("Contact form submitted:", data);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<div className="relative">
|
|
63
|
+
{/* Gradient mesh overlay */}
|
|
64
|
+
<div
|
|
65
|
+
aria-hidden
|
|
66
|
+
className="pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(60rem_60rem_at_0%_0%,rgba(59,130,246,0.08),transparent_40%),radial-gradient(50rem_50rem_at_100%_100%,rgba(168,85,247,0.06),transparent_40%)] opacity-20"
|
|
67
|
+
/>
|
|
68
|
+
{/* Fine noise/dots texture */}
|
|
69
|
+
<div
|
|
70
|
+
aria-hidden
|
|
71
|
+
className="pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(rgba(255,255,255,0.07)_1px,transparent_1px)] [background-size:14px_14px] opacity-[0.05]"
|
|
72
|
+
/>
|
|
73
|
+
|
|
74
|
+
<SharedContact
|
|
75
|
+
id="contact"
|
|
76
|
+
ariaLabel="SaaS dashboard contact section"
|
|
77
|
+
fields={saasContactFormData}
|
|
78
|
+
contactHeaderText="Ready to See DashFlow in Action?"
|
|
79
|
+
contactSubHeaderText="Tell us a bit about your team and we'll reach out with a tailored demo."
|
|
80
|
+
// Root and section
|
|
81
|
+
className="w-full"
|
|
82
|
+
section={{
|
|
83
|
+
className:
|
|
84
|
+
"py-16 px-6 bg-gradient-to-b from-slate-900/95 via-slate-950 to-slate-900/95 dark:from-slate-950 dark:via-slate-900 dark:to-slate-950",
|
|
85
|
+
}}
|
|
86
|
+
container={{ className: "mx-auto max-w-4xl" }}
|
|
87
|
+
// Header slots
|
|
88
|
+
headerWrapper={{ className: "mb-10 text-center" }}
|
|
89
|
+
headerText={{
|
|
90
|
+
className: "text-3xl font-bold font-inter text-white",
|
|
91
|
+
}}
|
|
92
|
+
subheaderText={{
|
|
93
|
+
className:
|
|
94
|
+
"mt-3 text-base text-white/90 max-w-2xl mx-auto font-inter",
|
|
95
|
+
}}
|
|
96
|
+
// Form container
|
|
97
|
+
form={{
|
|
98
|
+
className:
|
|
99
|
+
"bg-card p-8 rounded-xl shadow-xl border border-border bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)]",
|
|
100
|
+
}}
|
|
101
|
+
// Fields and inputs
|
|
102
|
+
fieldsWrapper={{ className: "space-y-4" }}
|
|
103
|
+
field={{ className: "space-y-2" }}
|
|
104
|
+
label={{
|
|
105
|
+
className:
|
|
106
|
+
"text-card-foreground text-sm font-medium font-poppins block",
|
|
107
|
+
}}
|
|
108
|
+
input={{
|
|
109
|
+
className:
|
|
110
|
+
"w-full p-3 rounded-md font-inter border-[var(--input-border)] bg-[var(--input-bg)] text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-2 focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
|
|
111
|
+
}}
|
|
112
|
+
textarea={{
|
|
113
|
+
className:
|
|
114
|
+
"w-full p-3 rounded-md resize-vertical min-h-[120px] font-inter border-[var(--input-border)] bg-[var(--input-bg)] text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-2 focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
|
|
115
|
+
}}
|
|
116
|
+
// Submit button (wrapper/style/text split)
|
|
117
|
+
submitButtonWrapper={{ className: "pt-2" }}
|
|
118
|
+
submitButtonStyle={{
|
|
119
|
+
variant: "default",
|
|
120
|
+
size: "lg",
|
|
121
|
+
className:
|
|
122
|
+
"w-full bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-400 text-white font-semibold font-inter shadow-lg hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5",
|
|
123
|
+
}}
|
|
124
|
+
submitButtonText="Send Request"
|
|
125
|
+
onSubmit={handleFormSubmit}
|
|
126
|
+
/>
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
}
|