nextworks 0.2.0-alpha.13 → 0.2.0-alpha.15
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 +3 -1
- package/dist/cli_manifests/blocks_manifest.json +5 -0
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_QUICKSTART.md +2 -0
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_README.md +2 -0
- package/dist/kits/blocks/app/templates/aiworkflow/PresetThemeVars.tsx +1 -58
- package/dist/kits/blocks/app/templates/aiworkflow/README.md +2 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/CTA.tsx +9 -9
- package/dist/kits/blocks/app/templates/aiworkflow/components/Contact.tsx +12 -13
- package/dist/kits/blocks/app/templates/aiworkflow/components/FAQ.tsx +22 -19
- package/dist/kits/blocks/app/templates/aiworkflow/components/FeatureMockups.tsx +562 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Features.tsx +18 -16
- package/dist/kits/blocks/app/templates/aiworkflow/components/Footer.tsx +13 -9
- package/dist/kits/blocks/app/templates/aiworkflow/components/Hero.tsx +883 -636
- package/dist/kits/blocks/app/templates/aiworkflow/components/Navbar.tsx +14 -15
- package/dist/kits/blocks/app/templates/aiworkflow/components/Pricing.tsx +27 -22
- package/dist/kits/blocks/app/templates/aiworkflow/components/ProcessTimeline.tsx +20 -21
- package/dist/kits/blocks/app/templates/aiworkflow/components/Testimonials.tsx +17 -13
- package/dist/kits/blocks/app/templates/aiworkflow/components/TrustBadges.tsx +15 -12
- package/dist/kits/blocks/app/templates/aiworkflow/themes/animation.tsx +151 -0
- package/dist/kits/blocks/app/templates/aiworkflow/themes/default.tsx +158 -0
- package/dist/kits/blocks/app/templates/aiworkflow/themes/test.tsx +163 -0
- package/dist/kits/blocks/app/templates/gallery/PresetThemeVars.tsx +46 -0
- package/dist/kits/blocks/app/templates/gallery/page.tsx +550 -161
- package/dist/kits/blocks/components/sections/HeroProductDemo.tsx +74 -64
- package/dist/kits/blocks/components/sections/Navbar.tsx +2 -0
- package/dist/kits/blocks/components/sections/product-demo/ApprovalInboxPanel.tsx +16 -13
- package/dist/kits/blocks/components/sections/product-demo/DemoStage.tsx +283 -162
- package/dist/kits/blocks/components/sections/product-demo/DemoWindow.tsx +65 -53
- package/dist/kits/blocks/components/sections/product-demo/KnowledgePanel.tsx +20 -17
- package/dist/kits/blocks/components/sections/product-demo/RunConsolePanel.tsx +208 -127
- package/dist/kits/blocks/components/sections/product-demo/TaskListPanel.tsx +95 -0
- package/dist/kits/blocks/components/sections/product-demo/WorkflowStudioPanel.tsx +714 -161
- package/dist/kits/blocks/components/sections/product-demo/types.ts +69 -0
- package/dist/kits/blocks/components/ui/theme-selector.tsx +1 -1
- package/dist/kits/blocks/package-deps.json +3 -3
- package/dist/kits/blocks/public/placeholders/aiworkflow/live.svg +92 -0
- package/dist/kits/blocks/public/placeholders/aiworkflow/review.svg +80 -0
- package/dist/kits/blocks/public/placeholders/aiworkflow/task.svg +71 -0
- package/dist/kits/blocks/tsconfig.json +13 -0
- package/dist/utils/file-operations.d.ts.map +1 -1
- package/dist/utils/file-operations.js +6 -1
- package/dist/utils/file-operations.js.map +1 -1
- package/package.json +1 -1
|
@@ -43,6 +43,7 @@ export interface HeroProductDemoSlots {
|
|
|
43
43
|
textContainer?: { className?: string };
|
|
44
44
|
demoContainer?: { className?: string };
|
|
45
45
|
buttonsContainer?: { className?: string };
|
|
46
|
+
demoBelowText?: boolean;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
export interface HeroProductDemoProps extends HeroProductDemoSlots {
|
|
@@ -86,6 +87,7 @@ export function HeroProductDemo({
|
|
|
86
87
|
textContainer,
|
|
87
88
|
demoContainer,
|
|
88
89
|
buttonsContainer,
|
|
90
|
+
demoBelowText = false,
|
|
89
91
|
ariaLabel = "Product demo hero section",
|
|
90
92
|
enableMotion = true,
|
|
91
93
|
}: HeroProductDemoProps) {
|
|
@@ -98,7 +100,7 @@ export function HeroProductDemo({
|
|
|
98
100
|
const defaultSubheading = {
|
|
99
101
|
text: "Pair clear positioning with a layered product demo that makes the workflow feel real before anyone clicks.",
|
|
100
102
|
className:
|
|
101
|
-
"mt-
|
|
103
|
+
"mt-4 max-w-2xl text-sm text-muted-foreground sm:text-base lg:text-lg",
|
|
102
104
|
};
|
|
103
105
|
|
|
104
106
|
const normalizedHeading = normalizeTextContent(heading, defaultHeading);
|
|
@@ -141,11 +143,68 @@ export function HeroProductDemo({
|
|
|
141
143
|
}
|
|
142
144
|
: undefined;
|
|
143
145
|
|
|
146
|
+
const renderButtons = (
|
|
147
|
+
<div
|
|
148
|
+
className={cn(
|
|
149
|
+
"mt-4 flex flex-col items-start gap-4 sm:flex-row sm:items-center",
|
|
150
|
+
|
|
151
|
+
buttonsContainer?.className,
|
|
152
|
+
)}
|
|
153
|
+
>
|
|
154
|
+
{mergedCta1.label && (
|
|
155
|
+
<Button
|
|
156
|
+
asChild
|
|
157
|
+
variant={mergedCta1.variant}
|
|
158
|
+
size={mergedCta1.size}
|
|
159
|
+
className={mergedCta1.className}
|
|
160
|
+
unstyled={mergedCta1.unstyled}
|
|
161
|
+
style={mergedCta1.style}
|
|
162
|
+
>
|
|
163
|
+
<Link href={mergedCta1.href || "#"} aria-label={mergedCta1.label}>
|
|
164
|
+
{mergedCta1.label}
|
|
165
|
+
</Link>
|
|
166
|
+
</Button>
|
|
167
|
+
)}
|
|
168
|
+
|
|
169
|
+
{mergedCta2?.label && (
|
|
170
|
+
<Button
|
|
171
|
+
asChild
|
|
172
|
+
variant={mergedCta2.variant}
|
|
173
|
+
size={mergedCta2.size}
|
|
174
|
+
className={mergedCta2.className}
|
|
175
|
+
unstyled={mergedCta2.unstyled}
|
|
176
|
+
style={mergedCta2.style}
|
|
177
|
+
>
|
|
178
|
+
<Link href={mergedCta2.href || "#"} aria-label={mergedCta2.label}>
|
|
179
|
+
{mergedCta2.label}
|
|
180
|
+
</Link>
|
|
181
|
+
</Button>
|
|
182
|
+
)}
|
|
183
|
+
</div>
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
const renderDemo = (
|
|
187
|
+
<div className={cn("relative", demoContainer?.className)}>
|
|
188
|
+
{demo ?? (
|
|
189
|
+
<DemoStage
|
|
190
|
+
scenarios={stage?.scenarios}
|
|
191
|
+
initialScenarioIndex={stage?.initialScenarioIndex}
|
|
192
|
+
activeScenarioKey={stage?.activeScenarioKey}
|
|
193
|
+
autoCycle={stage?.autoCycle}
|
|
194
|
+
cycleIntervalMs={stage?.cycleIntervalMs}
|
|
195
|
+
className={stage?.className}
|
|
196
|
+
enableMotion={enableMotion}
|
|
197
|
+
ariaLabel="Layered product demo"
|
|
198
|
+
/>
|
|
199
|
+
)}
|
|
200
|
+
</div>
|
|
201
|
+
);
|
|
202
|
+
|
|
144
203
|
return (
|
|
145
204
|
<section
|
|
146
205
|
id={id}
|
|
147
206
|
className={cn(
|
|
148
|
-
"relative overflow-hidden px-6 py-
|
|
207
|
+
"relative overflow-hidden px-6 py-12 sm:px-8 lg:px-10 lg:py-18",
|
|
149
208
|
section?.className,
|
|
150
209
|
className,
|
|
151
210
|
)}
|
|
@@ -153,8 +212,9 @@ export function HeroProductDemo({
|
|
|
153
212
|
>
|
|
154
213
|
<div
|
|
155
214
|
className={cn(
|
|
156
|
-
|
|
157
|
-
|
|
215
|
+
demoBelowText
|
|
216
|
+
? "mx-auto flex max-w-7xl flex-col gap-6"
|
|
217
|
+
: "mx-auto grid max-w-7xl items-center gap-12 lg:grid-cols-[minmax(0,0.84fr)_minmax(0,1.16fr)] lg:gap-12 xl:grid-cols-[minmax(0,0.8fr)_minmax(0,1.2fr)]",
|
|
158
218
|
container?.className,
|
|
159
219
|
)}
|
|
160
220
|
>
|
|
@@ -168,68 +228,18 @@ export function HeroProductDemo({
|
|
|
168
228
|
{normalizedHeading.text}
|
|
169
229
|
</h1>
|
|
170
230
|
|
|
171
|
-
|
|
172
|
-
{normalizedSubheading.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
className={cn(
|
|
177
|
-
"mt-8 flex flex-col items-start gap-4 sm:flex-row sm:items-center",
|
|
178
|
-
buttonsContainer?.className,
|
|
179
|
-
)}
|
|
180
|
-
>
|
|
181
|
-
{mergedCta1.label && (
|
|
182
|
-
<Button
|
|
183
|
-
asChild
|
|
184
|
-
variant={mergedCta1.variant}
|
|
185
|
-
size={mergedCta1.size}
|
|
186
|
-
className={mergedCta1.className}
|
|
187
|
-
unstyled={mergedCta1.unstyled}
|
|
188
|
-
style={mergedCta1.style}
|
|
189
|
-
>
|
|
190
|
-
<Link
|
|
191
|
-
href={mergedCta1.href || "#"}
|
|
192
|
-
aria-label={mergedCta1.label}
|
|
193
|
-
>
|
|
194
|
-
{mergedCta1.label}
|
|
195
|
-
</Link>
|
|
196
|
-
</Button>
|
|
197
|
-
)}
|
|
198
|
-
|
|
199
|
-
{mergedCta2?.label && (
|
|
200
|
-
<Button
|
|
201
|
-
asChild
|
|
202
|
-
variant={mergedCta2.variant}
|
|
203
|
-
size={mergedCta2.size}
|
|
204
|
-
className={mergedCta2.className}
|
|
205
|
-
unstyled={mergedCta2.unstyled}
|
|
206
|
-
style={mergedCta2.style}
|
|
207
|
-
>
|
|
208
|
-
<Link
|
|
209
|
-
href={mergedCta2.href || "#"}
|
|
210
|
-
aria-label={mergedCta2.label}
|
|
211
|
-
>
|
|
212
|
-
{mergedCta2.label}
|
|
213
|
-
</Link>
|
|
214
|
-
</Button>
|
|
215
|
-
)}
|
|
216
|
-
</div>
|
|
217
|
-
</div>
|
|
231
|
+
{normalizedSubheading.text ? (
|
|
232
|
+
<p className={cn(normalizedSubheading.className)}>
|
|
233
|
+
{normalizedSubheading.text}
|
|
234
|
+
</p>
|
|
235
|
+
) : null}
|
|
218
236
|
|
|
219
|
-
|
|
220
|
-
{demo ?? (
|
|
221
|
-
<DemoStage
|
|
222
|
-
scenarios={stage?.scenarios}
|
|
223
|
-
initialScenarioIndex={stage?.initialScenarioIndex}
|
|
224
|
-
activeScenarioKey={stage?.activeScenarioKey}
|
|
225
|
-
autoCycle={stage?.autoCycle}
|
|
226
|
-
cycleIntervalMs={stage?.cycleIntervalMs}
|
|
227
|
-
className={stage?.className}
|
|
228
|
-
enableMotion={enableMotion}
|
|
229
|
-
ariaLabel="Layered product demo"
|
|
230
|
-
/>
|
|
231
|
-
)}
|
|
237
|
+
{!demoBelowText ? renderButtons : null}
|
|
232
238
|
</div>
|
|
239
|
+
|
|
240
|
+
{renderDemo}
|
|
241
|
+
|
|
242
|
+
{demoBelowText ? renderButtons : null}
|
|
233
243
|
</div>
|
|
234
244
|
</section>
|
|
235
245
|
);
|
|
@@ -255,6 +255,7 @@ export function Navbar({
|
|
|
255
255
|
"rounded-md px-2 py-2 transition-colors duration-200 lg:px-4",
|
|
256
256
|
"focus:ring-ring focus:ring-2 focus:ring-offset-2 focus:outline-none",
|
|
257
257
|
"focus-visible:ring-[var(--navbar-ring)]",
|
|
258
|
+
|
|
258
259
|
links.className,
|
|
259
260
|
)}
|
|
260
261
|
>
|
|
@@ -312,6 +313,7 @@ export function Navbar({
|
|
|
312
313
|
mobileLinks.className,
|
|
313
314
|
"focus:ring-ring focus:ring-2 focus:ring-offset-2 focus:outline-none",
|
|
314
315
|
"focus-visible:ring-[var(--navbar-ring)]",
|
|
316
|
+
|
|
315
317
|
links.className,
|
|
316
318
|
)}
|
|
317
319
|
onClick={() => setIsMobileMenuOpen(false)}
|
|
@@ -10,13 +10,15 @@ export interface ApprovalInboxPanelProps {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
const STATUS_TONE_CLASSES: Record<ProductDemoStatusTone, string> = {
|
|
13
|
-
neutral:
|
|
14
|
-
|
|
13
|
+
neutral:
|
|
14
|
+
"border-[var(--demo-border)] bg-[var(--demo-panel-bg)] text-[var(--demo-muted-fg)]",
|
|
15
|
+
info: "border-[var(--demo-info-border)] bg-[var(--demo-info-soft-bg)] text-[var(--demo-info)]",
|
|
15
16
|
success:
|
|
16
|
-
"border-
|
|
17
|
+
"border-[var(--demo-success-border)] bg-[var(--demo-success-soft-bg)] text-[var(--demo-success)]",
|
|
17
18
|
warning:
|
|
18
|
-
"border-
|
|
19
|
-
danger:
|
|
19
|
+
"border-[var(--demo-warning-border)] bg-[var(--demo-warning-soft-bg)] text-[var(--demo-warning)]",
|
|
20
|
+
danger:
|
|
21
|
+
"border-[var(--demo-danger-border)] bg-[var(--demo-danger-soft-bg)] text-[var(--demo-danger)]",
|
|
20
22
|
};
|
|
21
23
|
|
|
22
24
|
function getStatusClass(tone: ProductDemoStatusTone = "neutral") {
|
|
@@ -25,15 +27,15 @@ function getStatusClass(tone: ProductDemoStatusTone = "neutral") {
|
|
|
25
27
|
|
|
26
28
|
export function ApprovalInboxPanel({ state }: ApprovalInboxPanelProps) {
|
|
27
29
|
return (
|
|
28
|
-
<div className="flex h-full flex-col gap-4">
|
|
30
|
+
<div className="flex h-full flex-col gap-4 text-[var(--demo-fg)]">
|
|
29
31
|
<div className="space-y-1.5">
|
|
30
32
|
{state.title && (
|
|
31
|
-
<h4 className="text-sm font-semibold text-
|
|
33
|
+
<h4 className="text-sm font-semibold text-[var(--demo-fg)]">
|
|
32
34
|
{state.title}
|
|
33
35
|
</h4>
|
|
34
36
|
)}
|
|
35
37
|
{state.subtitle && (
|
|
36
|
-
<p className="text-xs leading-relaxed text-muted-
|
|
38
|
+
<p className="text-xs leading-relaxed text-[var(--demo-muted-fg)]">
|
|
37
39
|
{state.subtitle}
|
|
38
40
|
</p>
|
|
39
41
|
)}
|
|
@@ -66,17 +68,18 @@ export function ApprovalInboxPanel({ state }: ApprovalInboxPanelProps) {
|
|
|
66
68
|
<div
|
|
67
69
|
key={item.id}
|
|
68
70
|
className={cn(
|
|
69
|
-
"rounded-2xl border border-border
|
|
70
|
-
isActive &&
|
|
71
|
+
"rounded-2xl border border-[var(--demo-border)] bg-[var(--demo-panel-bg)] p-3",
|
|
72
|
+
isActive &&
|
|
73
|
+
"border-[var(--demo-info-border)] bg-[var(--demo-info-soft-bg)] shadow-sm",
|
|
71
74
|
)}
|
|
72
75
|
>
|
|
73
76
|
<div className="flex items-start justify-between gap-3">
|
|
74
77
|
<div>
|
|
75
|
-
<div className="text-sm font-semibold text-
|
|
78
|
+
<div className="text-sm font-semibold text-[var(--demo-fg)]">
|
|
76
79
|
{item.title}
|
|
77
80
|
</div>
|
|
78
81
|
{item.description && (
|
|
79
|
-
<p className="mt-1 text-xs leading-relaxed text-muted-
|
|
82
|
+
<p className="mt-1 text-xs leading-relaxed text-[var(--demo-muted-fg)]">
|
|
80
83
|
{item.description}
|
|
81
84
|
</p>
|
|
82
85
|
)}
|
|
@@ -94,7 +97,7 @@ export function ApprovalInboxPanel({ state }: ApprovalInboxPanelProps) {
|
|
|
94
97
|
</div>
|
|
95
98
|
|
|
96
99
|
{(item.requester || item.priorityLabel || item.dueLabel) && (
|
|
97
|
-
<div className="mt-3 flex flex-wrap gap-2 text-[11px] text-muted-
|
|
100
|
+
<div className="mt-3 flex flex-wrap gap-2 text-[11px] text-[var(--demo-muted-fg)]">
|
|
98
101
|
{item.requester && <span>By {item.requester}</span>}
|
|
99
102
|
{item.priorityLabel && <span>{item.priorityLabel}</span>}
|
|
100
103
|
{item.dueLabel && <span>{item.dueLabel}</span>}
|