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.
Files changed (43) hide show
  1. package/README.md +3 -1
  2. package/dist/cli_manifests/blocks_manifest.json +5 -0
  3. package/dist/kits/blocks/.nextworks/docs/BLOCKS_QUICKSTART.md +2 -0
  4. package/dist/kits/blocks/.nextworks/docs/BLOCKS_README.md +2 -0
  5. package/dist/kits/blocks/app/templates/aiworkflow/PresetThemeVars.tsx +1 -58
  6. package/dist/kits/blocks/app/templates/aiworkflow/README.md +2 -0
  7. package/dist/kits/blocks/app/templates/aiworkflow/components/CTA.tsx +9 -9
  8. package/dist/kits/blocks/app/templates/aiworkflow/components/Contact.tsx +12 -13
  9. package/dist/kits/blocks/app/templates/aiworkflow/components/FAQ.tsx +22 -19
  10. package/dist/kits/blocks/app/templates/aiworkflow/components/FeatureMockups.tsx +562 -0
  11. package/dist/kits/blocks/app/templates/aiworkflow/components/Features.tsx +18 -16
  12. package/dist/kits/blocks/app/templates/aiworkflow/components/Footer.tsx +13 -9
  13. package/dist/kits/blocks/app/templates/aiworkflow/components/Hero.tsx +883 -636
  14. package/dist/kits/blocks/app/templates/aiworkflow/components/Navbar.tsx +14 -15
  15. package/dist/kits/blocks/app/templates/aiworkflow/components/Pricing.tsx +27 -22
  16. package/dist/kits/blocks/app/templates/aiworkflow/components/ProcessTimeline.tsx +20 -21
  17. package/dist/kits/blocks/app/templates/aiworkflow/components/Testimonials.tsx +17 -13
  18. package/dist/kits/blocks/app/templates/aiworkflow/components/TrustBadges.tsx +15 -12
  19. package/dist/kits/blocks/app/templates/aiworkflow/themes/animation.tsx +151 -0
  20. package/dist/kits/blocks/app/templates/aiworkflow/themes/default.tsx +158 -0
  21. package/dist/kits/blocks/app/templates/aiworkflow/themes/test.tsx +163 -0
  22. package/dist/kits/blocks/app/templates/gallery/PresetThemeVars.tsx +46 -0
  23. package/dist/kits/blocks/app/templates/gallery/page.tsx +550 -161
  24. package/dist/kits/blocks/components/sections/HeroProductDemo.tsx +74 -64
  25. package/dist/kits/blocks/components/sections/Navbar.tsx +2 -0
  26. package/dist/kits/blocks/components/sections/product-demo/ApprovalInboxPanel.tsx +16 -13
  27. package/dist/kits/blocks/components/sections/product-demo/DemoStage.tsx +283 -162
  28. package/dist/kits/blocks/components/sections/product-demo/DemoWindow.tsx +65 -53
  29. package/dist/kits/blocks/components/sections/product-demo/KnowledgePanel.tsx +20 -17
  30. package/dist/kits/blocks/components/sections/product-demo/RunConsolePanel.tsx +208 -127
  31. package/dist/kits/blocks/components/sections/product-demo/TaskListPanel.tsx +95 -0
  32. package/dist/kits/blocks/components/sections/product-demo/WorkflowStudioPanel.tsx +714 -161
  33. package/dist/kits/blocks/components/sections/product-demo/types.ts +69 -0
  34. package/dist/kits/blocks/components/ui/theme-selector.tsx +1 -1
  35. package/dist/kits/blocks/package-deps.json +3 -3
  36. package/dist/kits/blocks/public/placeholders/aiworkflow/live.svg +92 -0
  37. package/dist/kits/blocks/public/placeholders/aiworkflow/review.svg +80 -0
  38. package/dist/kits/blocks/public/placeholders/aiworkflow/task.svg +71 -0
  39. package/dist/kits/blocks/tsconfig.json +13 -0
  40. package/dist/utils/file-operations.d.ts.map +1 -1
  41. package/dist/utils/file-operations.js +6 -1
  42. package/dist/utils/file-operations.js.map +1 -1
  43. 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-6 max-w-2xl text-base text-muted-foreground sm:text-lg lg:text-xl",
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-16 sm:px-8 lg:px-10 lg:py-24",
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
- "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)]",
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
- <p className={cn(normalizedSubheading.className)}>
172
- {normalizedSubheading.text}
173
- </p>
174
-
175
- <div
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
- <div className={cn("relative", demoContainer?.className)}>
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: "border-border/60 bg-muted/55 text-muted-foreground",
14
- info: "border-sky-500/30 bg-sky-500/10 text-sky-600 dark:text-sky-300",
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-emerald-500/30 bg-emerald-500/10 text-emerald-600 dark:text-emerald-300",
17
+ "border-[var(--demo-success-border)] bg-[var(--demo-success-soft-bg)] text-[var(--demo-success)]",
17
18
  warning:
18
- "border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300",
19
- danger: "border-rose-500/30 bg-rose-500/10 text-rose-600 dark:text-rose-300",
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-card-foreground">
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-foreground">
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/60 bg-background/80 p-3",
70
- isActive && "border-primary/45 bg-primary/6 shadow-sm",
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-card-foreground">
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-foreground">
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-foreground">
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>}