nextworks 0.2.0-alpha.13 → 0.2.0-alpha.14

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 (42) hide show
  1. package/README.md +3 -1
  2. package/dist/kits/blocks/.nextworks/docs/BLOCKS_QUICKSTART.md +2 -0
  3. package/dist/kits/blocks/.nextworks/docs/BLOCKS_README.md +2 -0
  4. package/dist/kits/blocks/app/templates/aiworkflow/PresetThemeVars.tsx +1 -58
  5. package/dist/kits/blocks/app/templates/aiworkflow/README.md +2 -0
  6. package/dist/kits/blocks/app/templates/aiworkflow/components/CTA.tsx +9 -9
  7. package/dist/kits/blocks/app/templates/aiworkflow/components/Contact.tsx +12 -13
  8. package/dist/kits/blocks/app/templates/aiworkflow/components/FAQ.tsx +22 -19
  9. package/dist/kits/blocks/app/templates/aiworkflow/components/FeatureMockups.tsx +562 -0
  10. package/dist/kits/blocks/app/templates/aiworkflow/components/Features.tsx +18 -16
  11. package/dist/kits/blocks/app/templates/aiworkflow/components/Footer.tsx +13 -9
  12. package/dist/kits/blocks/app/templates/aiworkflow/components/Hero.tsx +883 -636
  13. package/dist/kits/blocks/app/templates/aiworkflow/components/Navbar.tsx +14 -15
  14. package/dist/kits/blocks/app/templates/aiworkflow/components/Pricing.tsx +27 -22
  15. package/dist/kits/blocks/app/templates/aiworkflow/components/ProcessTimeline.tsx +20 -21
  16. package/dist/kits/blocks/app/templates/aiworkflow/components/Testimonials.tsx +17 -13
  17. package/dist/kits/blocks/app/templates/aiworkflow/components/TrustBadges.tsx +15 -12
  18. package/dist/kits/blocks/app/templates/aiworkflow/themes/animation.tsx +151 -0
  19. package/dist/kits/blocks/app/templates/aiworkflow/themes/default.tsx +158 -0
  20. package/dist/kits/blocks/app/templates/aiworkflow/themes/test.tsx +163 -0
  21. package/dist/kits/blocks/app/templates/gallery/PresetThemeVars.tsx +46 -0
  22. package/dist/kits/blocks/app/templates/gallery/page.tsx +550 -161
  23. package/dist/kits/blocks/components/sections/HeroProductDemo.tsx +74 -64
  24. package/dist/kits/blocks/components/sections/Navbar.tsx +2 -0
  25. package/dist/kits/blocks/components/sections/product-demo/ApprovalInboxPanel.tsx +16 -13
  26. package/dist/kits/blocks/components/sections/product-demo/DemoStage.tsx +283 -162
  27. package/dist/kits/blocks/components/sections/product-demo/DemoWindow.tsx +65 -53
  28. package/dist/kits/blocks/components/sections/product-demo/KnowledgePanel.tsx +20 -17
  29. package/dist/kits/blocks/components/sections/product-demo/RunConsolePanel.tsx +208 -127
  30. package/dist/kits/blocks/components/sections/product-demo/TaskListPanel.tsx +95 -0
  31. package/dist/kits/blocks/components/sections/product-demo/WorkflowStudioPanel.tsx +714 -161
  32. package/dist/kits/blocks/components/sections/product-demo/types.ts +69 -0
  33. package/dist/kits/blocks/components/ui/theme-selector.tsx +1 -1
  34. package/dist/kits/blocks/package-deps.json +3 -3
  35. package/dist/kits/blocks/public/placeholders/aiworkflow/live.svg +92 -0
  36. package/dist/kits/blocks/public/placeholders/aiworkflow/review.svg +80 -0
  37. package/dist/kits/blocks/public/placeholders/aiworkflow/task.svg +71 -0
  38. package/dist/kits/blocks/tsconfig.json +13 -0
  39. package/dist/utils/file-operations.d.ts.map +1 -1
  40. package/dist/utils/file-operations.js +6 -1
  41. package/dist/utils/file-operations.js.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,562 @@
1
+ "use client";
2
+
3
+ import type { ReactNode } from "react";
4
+
5
+ function WindowFrame({
6
+ title,
7
+ eyebrow,
8
+ rightLabel,
9
+ children,
10
+ }: {
11
+ title: string;
12
+ eyebrow?: string;
13
+ rightLabel?: string;
14
+ children: ReactNode;
15
+ }) {
16
+ return (
17
+ <div className="aspect-[16/10] w-full overflow-hidden rounded-[22px] border border-white/10 bg-[#050505] text-white shadow-[0_20px_60px_rgba(0,0,0,0.45)]">
18
+ <div className="flex h-full flex-col bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.06),transparent_34%),linear-gradient(180deg,#0a0a0a_0%,#050505_100%)]">
19
+ <div className="flex items-center justify-between border-b border-white/10 px-4 py-3">
20
+ <div className="flex items-center gap-3">
21
+ <div className="grid h-8 w-8 place-items-center rounded-lg border border-white/10 bg-white/5">
22
+ <div className="grid grid-cols-2 gap-[3px]">
23
+ <span className="h-1 w-1 rounded-full bg-white/90" />
24
+ <span className="h-1 w-1 rounded-full bg-white/35" />
25
+ <span className="h-1 w-1 rounded-full bg-white/35" />
26
+ <span className="h-1 w-1 rounded-full bg-white/90" />
27
+ </div>
28
+ </div>
29
+
30
+ <div>
31
+ <div className="flex items-center gap-2">
32
+ <p className="text-[12px] font-semibold tracking-wide text-white/95">
33
+ {title}
34
+ </p>
35
+ {eyebrow ? (
36
+ <span className="rounded-full border border-white/10 bg-white/5 px-2 py-0.5 text-[9px] uppercase tracking-[0.22em] text-white/45">
37
+ {eyebrow}
38
+ </span>
39
+ ) : null}
40
+ </div>
41
+ <p className="mt-0.5 text-[9px] uppercase tracking-[0.24em] text-white/35">
42
+ Session · live repo
43
+ </p>
44
+ </div>
45
+ </div>
46
+
47
+ {rightLabel ? (
48
+ <div className="flex items-center gap-2 text-[9px] uppercase tracking-[0.24em] text-white/40">
49
+ <span>{rightLabel}</span>
50
+ <span className="inline-flex items-center gap-1 rounded-full border border-white/10 bg-white/5 px-2 py-1 text-white/65">
51
+ <span className="h-1.5 w-1.5 rounded-full bg-cyan-300" />
52
+ active
53
+ </span>
54
+ </div>
55
+ ) : null}
56
+ </div>
57
+
58
+ <div className="flex-1">{children}</div>
59
+ </div>
60
+ </div>
61
+ );
62
+ }
63
+
64
+ function SectionLabel({ children }: { children: ReactNode }) {
65
+ return (
66
+ <p className="mb-3 text-[9px] font-medium uppercase tracking-[0.24em] text-white/30">
67
+ {children}
68
+ </p>
69
+ );
70
+ }
71
+
72
+ function CodeLine({
73
+ number,
74
+ text,
75
+ active = false,
76
+ }: {
77
+ number: string;
78
+ text: string;
79
+ active?: boolean;
80
+ }) {
81
+ return (
82
+ <div
83
+ className={`grid grid-cols-[22px_1fr] gap-3 px-4 py-1.5 text-[10px] ${
84
+ active ? "bg-cyan-300/10" : ""
85
+ }`}
86
+ >
87
+ <span className="text-right font-mono text-white/28">{number}</span>
88
+ <span className="font-mono text-white/78">{text}</span>
89
+ </div>
90
+ );
91
+ }
92
+
93
+ export function TaskToCodeMockup() {
94
+ return (
95
+ <WindowFrame
96
+ title="Agent workspace"
97
+ eyebrow="Session 03"
98
+ rightLabel="Repo apps/web"
99
+ >
100
+ <div className="grid h-full grid-cols-[1.1fr_1.4fr_1.8fr_72px]">
101
+ <div className="border-r border-white/10 p-3">
102
+ <SectionLabel>Task navigator</SectionLabel>
103
+
104
+ <div className="space-y-2.5">
105
+ {[
106
+ {
107
+ index: "1",
108
+ title: "Fix auth flow",
109
+ body: "Preserve intended destination after the OAuth callback.",
110
+ active: true,
111
+ },
112
+ {
113
+ index: "2",
114
+ title: "Refactor pricing page",
115
+ body: "Extract repeated pricing sections into reusable blocks.",
116
+ },
117
+ {
118
+ index: "3",
119
+ title: "Ship command palette",
120
+ body: "Add global search, shortcuts, and action routing.",
121
+ },
122
+ ].map((item) => (
123
+ <div
124
+ key={item.index}
125
+ className={`rounded-xl border p-3 ${
126
+ item.active
127
+ ? "border-cyan-300/50 bg-white/[0.04] shadow-[inset_2px_0_0_0_rgba(103,232,249,0.95)]"
128
+ : "border-white/8 bg-white/[0.025]"
129
+ }`}
130
+ >
131
+ <div className="mb-2 flex items-center justify-between">
132
+ <div className="flex items-center gap-2">
133
+ <span className="grid h-5 w-5 place-items-center rounded-full border border-white/10 text-[9px] text-white/65">
134
+ {item.index}
135
+ </span>
136
+ <p className="text-[11px] font-semibold text-white/90">
137
+ {item.title}
138
+ </p>
139
+ </div>
140
+ <span className="text-[8px] uppercase tracking-[0.22em] text-white/30">
141
+ {item.active ? "open" : "queued"}
142
+ </span>
143
+ </div>
144
+ <p className="text-[10px] leading-4 text-white/45">
145
+ {item.body}
146
+ </p>
147
+ </div>
148
+ ))}
149
+ </div>
150
+ </div>
151
+
152
+ <div className="border-r border-white/10 p-3">
153
+ <SectionLabel>Session focus · fix auth flow</SectionLabel>
154
+
155
+ <div className="space-y-2">
156
+ <div className="rounded-xl border border-white/10 bg-white/[0.03] p-3">
157
+ <div className="mb-2 flex items-center justify-between">
158
+ <span className="text-[8px] uppercase tracking-[0.22em] text-white/28">
159
+ edit
160
+ </span>
161
+ <span className="rounded-full border border-white/10 bg-white/5 px-2 py-0.5 text-[8px] uppercase tracking-[0.22em] text-white/45">
162
+ safe patch
163
+ </span>
164
+ </div>
165
+ <p className="text-[10px] leading-4 text-white/82">
166
+ Guard empty return paths and preserve intended destination.
167
+ </p>
168
+ </div>
169
+
170
+ <div className="rounded-xl border border-white/10 bg-white/[0.03] p-3">
171
+ <span className="text-[8px] uppercase tracking-[0.22em] text-white/28">
172
+ task
173
+ </span>
174
+ <p className="mt-2 text-[10px] leading-4 text-white/62">
175
+ Fix the OAuth callback redirect so the app preserves the
176
+ intended destination after sign-in.
177
+ </p>
178
+ </div>
179
+
180
+ <div className="space-y-1.5 pt-1 text-[10px] text-white/38">
181
+ <p>Read app/auth/callback/page.tsx</p>
182
+ <p>Read lib/auth/normalize-return.ts</p>
183
+ <p>Drafting change set</p>
184
+ <div className="mt-3 flex items-center gap-2 text-white/58">
185
+ <span className="h-1.5 w-1.5 rounded-full bg-cyan-300" />
186
+ Running
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+
192
+ <div className="border-r border-white/10 py-3">
193
+ <SectionLabel>
194
+ <span className="px-4">Patch preview</span>
195
+ </SectionLabel>
196
+
197
+ <div className="space-y-[1px]">
198
+ <CodeLine number="38" text="const safeReturnTo =" />
199
+ <CodeLine
200
+ number="39"
201
+ text="normalizeReturnTo(searchParams.get('returnTo'))"
202
+ />
203
+ <CodeLine
204
+ number="40"
205
+ text="const shouldTrackRedirect = safeReturnTo !== null"
206
+ active
207
+ />
208
+ <CodeLine
209
+ number="41"
210
+ text="const fallbackDestination = '/dashboard'"
211
+ active
212
+ />
213
+ <CodeLine
214
+ number="42"
215
+ text="const destination = safeReturnTo ?? '/dashboard'"
216
+ />
217
+ <div className="px-4 pt-3 text-[10px] text-white/32">
218
+ <span className="text-cyan-300">●</span> Applying change.
219
+ </div>
220
+ </div>
221
+ </div>
222
+
223
+ <div className="p-3">
224
+ <div className="space-y-2">
225
+ {[
226
+ ["Files", "2"],
227
+ ["Edits", "12"],
228
+ ["Checks", "3/2"],
229
+ ].map(([label, value]) => (
230
+ <div
231
+ key={label}
232
+ className="rounded-xl border border-white/10 bg-white/[0.035] px-3 py-3 text-center"
233
+ >
234
+ <p className="text-[8px] uppercase tracking-[0.22em] text-white/28">
235
+ {label}
236
+ </p>
237
+ <p className="mt-1 text-[13px] font-semibold text-white/88">
238
+ {value}
239
+ </p>
240
+ </div>
241
+ ))}
242
+ </div>
243
+ </div>
244
+ </div>
245
+ </WindowFrame>
246
+ );
247
+ }
248
+
249
+ export function TranscriptDiffMockup() {
250
+ return (
251
+ <WindowFrame
252
+ title="Live transcript"
253
+ eyebrow="Dual pane"
254
+ rightLabel="Diff linked"
255
+ >
256
+ <div className="grid h-full grid-cols-[1.05fr_1.4fr]">
257
+ <div className="border-r border-white/10 p-3">
258
+ <SectionLabel>Transcript</SectionLabel>
259
+
260
+ <div className="space-y-3">
261
+ {[
262
+ {
263
+ who: "U",
264
+ text: "Can you fix the callback so users return to the page they started from?",
265
+ },
266
+ {
267
+ who: "A",
268
+ text: "Reading the auth flow and tracing redirect handling now.",
269
+ },
270
+ {
271
+ who: "A",
272
+ text: "Found the issue: the fallback path replaces the intended return target when the param is missing or malformed.",
273
+ },
274
+ {
275
+ who: "A",
276
+ text: "Drafting a guarded patch and running checks.",
277
+ },
278
+ ].map((msg, i) => (
279
+ <div key={i} className="flex items-start gap-2.5">
280
+ <div
281
+ className={`grid h-6 w-6 shrink-0 place-items-center rounded-full text-[9px] font-semibold ${
282
+ msg.who === "A"
283
+ ? "bg-white/10 text-white/85"
284
+ : "bg-cyan-300/15 text-cyan-200"
285
+ }`}
286
+ >
287
+ {msg.who}
288
+ </div>
289
+ <div className="max-w-[92%] rounded-2xl border border-white/10 bg-white/[0.035] px-3 py-2">
290
+ <p className="text-[10px] leading-4 text-white/78">
291
+ {msg.text}
292
+ </p>
293
+ </div>
294
+ </div>
295
+ ))}
296
+
297
+ <div className="pt-1">
298
+ <div className="mb-1 flex items-center justify-between text-[8px] uppercase tracking-[0.22em] text-white/28">
299
+ <span>Agent activity</span>
300
+ <span>independent scroll</span>
301
+ </div>
302
+ <div className="h-1.5 overflow-hidden rounded-full bg-white/8">
303
+ <div className="h-full w-[62%] rounded-full bg-cyan-300/85" />
304
+ </div>
305
+ </div>
306
+ </div>
307
+ </div>
308
+
309
+ <div className="grid grid-rows-[auto_1fr]">
310
+ <div className="border-b border-white/10 px-4 py-3">
311
+ <div className="flex items-center justify-between">
312
+ <div>
313
+ <SectionLabel>Live diff</SectionLabel>
314
+ </div>
315
+ <div className="flex items-center gap-2 text-[8px] uppercase tracking-[0.22em] text-white/35">
316
+ <span>app/auth/callback/page.tsx</span>
317
+ <span className="rounded-full border border-white/10 bg-white/5 px-2 py-1 text-white/55">
318
+ +8 / -2
319
+ </span>
320
+ </div>
321
+ </div>
322
+ </div>
323
+
324
+ <div className="grid grid-cols-2">
325
+ <div className="border-r border-white/10 py-3">
326
+ <div className="px-4 pb-2 text-[9px] uppercase tracking-[0.22em] text-white/25">
327
+ Before
328
+ </div>
329
+ <div className="space-y-[1px]">
330
+ <CodeLine number="18" text="const destination = '/dashboard'" />
331
+ <CodeLine number="19" text="" />
332
+ <CodeLine number="20" text="if (user) {" />
333
+ <CodeLine number="21" text=" redirect(destination)" />
334
+ <CodeLine number="22" text="}" />
335
+ </div>
336
+ </div>
337
+
338
+ <div className="py-3">
339
+ <div className="px-4 pb-2 text-[9px] uppercase tracking-[0.22em] text-white/25">
340
+ After
341
+ </div>
342
+ <div className="space-y-[1px]">
343
+ <CodeLine
344
+ number="18"
345
+ text="const safeReturnTo = normalizeReturnTo(...)"
346
+ active
347
+ />
348
+ <CodeLine
349
+ number="19"
350
+ text="const destination = safeReturnTo ?? '/dashboard'"
351
+ active
352
+ />
353
+ <CodeLine number="20" text="" />
354
+ <CodeLine number="21" text="if (user) {" />
355
+ <CodeLine number="22" text=" redirect(destination)" />
356
+ </div>
357
+
358
+ <div className="px-4 pt-4">
359
+ <div className="rounded-2xl border border-white/10 bg-white/[0.03] p-3">
360
+ <div className="mb-2 flex items-center justify-between">
361
+ <p className="text-[10px] font-semibold text-white/82">
362
+ Checks running
363
+ </p>
364
+ <span className="text-[8px] uppercase tracking-[0.22em] text-white/35">
365
+ 2 passed · 1 in progress
366
+ </span>
367
+ </div>
368
+ <div className="grid grid-cols-3 gap-2">
369
+ {["Typecheck", "Lint", "Route test"].map((item, i) => (
370
+ <div
371
+ key={item}
372
+ className="rounded-xl border border-white/10 bg-black/20 px-2 py-2 text-center"
373
+ >
374
+ <p className="text-[9px] text-white/65">{item}</p>
375
+ <p className="mt-1 text-[9px] font-medium text-white/85">
376
+ {i < 2 ? "Passed" : "Running"}
377
+ </p>
378
+ </div>
379
+ ))}
380
+ </div>
381
+ </div>
382
+ </div>
383
+ </div>
384
+ </div>
385
+ </div>
386
+ </div>
387
+ </WindowFrame>
388
+ );
389
+ }
390
+
391
+ export function ReviewQueueMockup() {
392
+ return (
393
+ <WindowFrame
394
+ title="Review queue"
395
+ eyebrow="Human gate"
396
+ rightLabel="Patch summary"
397
+ >
398
+ <div className="grid h-full grid-cols-[1.1fr_1.35fr]">
399
+ <div className="border-r border-white/10 p-3">
400
+ <SectionLabel>Exceptions only</SectionLabel>
401
+
402
+ <div className="space-y-2.5">
403
+ {[
404
+ {
405
+ title: "Rename helper import",
406
+ status: "Auto-approved",
407
+ body: "No behavior change. Formatting only.",
408
+ },
409
+ {
410
+ title: "Guard malformed returnTo",
411
+ status: "Needs review",
412
+ body: "Redirect logic changed for invalid callback paths.",
413
+ active: true,
414
+ },
415
+ {
416
+ title: "Remove stale logger",
417
+ status: "Auto-approved",
418
+ body: "Unused debug output removed.",
419
+ },
420
+ ].map((item) => (
421
+ <div
422
+ key={item.title}
423
+ className={`rounded-2xl border p-3 ${
424
+ item.active
425
+ ? "border-cyan-300/45 bg-white/[0.045]"
426
+ : "border-white/10 bg-white/[0.025]"
427
+ }`}
428
+ >
429
+ <div className="flex items-start justify-between gap-3">
430
+ <div>
431
+ <p className="text-[11px] font-semibold text-white/88">
432
+ {item.title}
433
+ </p>
434
+ <p className="mt-1 text-[10px] leading-4 text-white/46">
435
+ {item.body}
436
+ </p>
437
+ </div>
438
+ <span
439
+ className={`shrink-0 rounded-full border px-2 py-1 text-[8px] uppercase tracking-[0.22em] ${
440
+ item.active
441
+ ? "border-cyan-300/30 bg-cyan-300/10 text-cyan-100"
442
+ : "border-white/10 bg-white/5 text-white/48"
443
+ }`}
444
+ >
445
+ {item.status}
446
+ </span>
447
+ </div>
448
+ </div>
449
+ ))}
450
+ </div>
451
+
452
+ <div className="mt-4 rounded-2xl border border-white/10 bg-white/[0.03] p-3">
453
+ <div className="mb-3 flex items-center justify-between">
454
+ <p className="text-[10px] font-semibold text-white/82">
455
+ Queue policy
456
+ </p>
457
+ <span className="text-[8px] uppercase tracking-[0.22em] text-white/32">
458
+ Active
459
+ </span>
460
+ </div>
461
+ <div className="space-y-2 text-[10px] text-white/55">
462
+ <div className="flex items-center justify-between">
463
+ <span>Routine edits auto-ship</span>
464
+ <span className="text-white/82">On</span>
465
+ </div>
466
+ <div className="flex items-center justify-between">
467
+ <span>Behavior changes require review</span>
468
+ <span className="text-white/82">On</span>
469
+ </div>
470
+ </div>
471
+ </div>
472
+ </div>
473
+
474
+ <div className="p-3">
475
+ <SectionLabel>Selected patch</SectionLabel>
476
+
477
+ <div className="rounded-[20px] border border-white/10 bg-white/[0.03] p-4">
478
+ <div className="flex items-center justify-between">
479
+ <div>
480
+ <p className="text-[12px] font-semibold text-white/92">
481
+ Redirect safety patch
482
+ </p>
483
+ <p className="mt-1 text-[10px] text-white/42">
484
+ auth callback · medium confidence impact
485
+ </p>
486
+ </div>
487
+ <span className="rounded-full border border-cyan-300/30 bg-cyan-300/10 px-2 py-1 text-[8px] uppercase tracking-[0.22em] text-cyan-100">
488
+ review required
489
+ </span>
490
+ </div>
491
+
492
+ <div className="mt-4 grid grid-cols-3 gap-2">
493
+ {[
494
+ ["Files touched", "2"],
495
+ ["Risk", "Medium"],
496
+ ["Checks", "Passed"],
497
+ ].map(([label, value]) => (
498
+ <div
499
+ key={label}
500
+ className="rounded-xl border border-white/10 bg-black/20 px-3 py-3"
501
+ >
502
+ <p className="text-[8px] uppercase tracking-[0.22em] text-white/28">
503
+ {label}
504
+ </p>
505
+ <p className="mt-1 text-[11px] font-semibold text-white/86">
506
+ {value}
507
+ </p>
508
+ </div>
509
+ ))}
510
+ </div>
511
+
512
+ <div className="mt-4 rounded-2xl border border-white/10 bg-black/20 p-3">
513
+ <p className="text-[9px] uppercase tracking-[0.22em] text-white/28">
514
+ Summary
515
+ </p>
516
+ <ul className="mt-2 space-y-2 text-[10px] leading-4 text-white/68">
517
+ <li>• Normalizes callback return targets before redirect.</li>
518
+ <li>
519
+ • Preserves intended destination when the value is valid.
520
+ </li>
521
+ <li>
522
+ • Falls back to /dashboard only when the param is unsafe.
523
+ </li>
524
+ </ul>
525
+ </div>
526
+
527
+ <div className="mt-4 grid grid-cols-[1fr_auto] gap-3">
528
+ <div className="rounded-2xl border border-white/10 bg-black/20 p-3">
529
+ <p className="text-[9px] uppercase tracking-[0.22em] text-white/28">
530
+ Reviewer note
531
+ </p>
532
+ <p className="mt-2 text-[10px] leading-4 text-white/74">
533
+ This changes navigation behavior for malformed callback
534
+ params. Requesting human confirmation before merge.
535
+ </p>
536
+ </div>
537
+
538
+ <div className="flex flex-col justify-end gap-2">
539
+ <button className="rounded-xl border border-white/12 bg-white/6 px-4 py-2 text-[10px] font-medium text-white/82">
540
+ Send back
541
+ </button>
542
+ <button className="rounded-xl border border-cyan-300/30 bg-cyan-300/12 px-4 py-2 text-[10px] font-medium text-cyan-100">
543
+ Approve patch
544
+ </button>
545
+ </div>
546
+ </div>
547
+ </div>
548
+ </div>
549
+ </div>
550
+ </WindowFrame>
551
+ );
552
+ }
553
+
554
+ export function FeatureMockupsPreview() {
555
+ return (
556
+ <div className="space-y-8 bg-black p-8">
557
+ <TaskToCodeMockup />
558
+ <TranscriptDiffMockup />
559
+ <ReviewQueueMockup />
560
+ </div>
561
+ );
562
+ }
@@ -4,35 +4,37 @@ import { Features as SharedFeatures } from "@/components/sections/Features";
4
4
 
5
5
  const featuresData = [
6
6
  {
7
- imageSrc: "/placeholders/saas_dashboard/projectBoard.png",
8
- imageAlt: "Workflow builder and orchestration canvas",
9
- headingText: "Design workflows from plain-language requests",
7
+ imageSrc: "/placeholders/aiworkflow/task.svg",
8
+ imageAlt: "Task navigator and repo context view",
9
+ headingText: "Turn plain-language tasks into code changes",
10
10
  subheadingText:
11
- "AI turns a request into a structured workflow with triggers, conditions, tool actions, and approval checkpoints.",
11
+ "The agent reads the repo, traces the issue, and shapes a safe patch with clear context.",
12
12
  },
13
13
  {
14
- imageSrc: "/placeholders/saas_dashboard/analytics.png",
15
- imageAlt: "Live execution feed and analytics dashboard",
16
- headingText: "See every step as it runs",
14
+ imageSrc: "/placeholders/aiworkflow/live.svg",
15
+ imageAlt: "Transcript, live diff, and editor output",
16
+ headingText: "Watch the transcript and diff move independently",
17
17
  subheadingText:
18
- "Track execution state, latency, retries, and downstream updates in a live run feed your team can actually follow.",
18
+ "The agent can keep reading, edit the file, and land a result without forcing both panes to move in lockstep.",
19
19
  },
20
20
  {
21
- imageSrc: "/placeholders/saas_dashboard/chat.png",
22
- imageAlt: "Approval inbox and team collaboration interface",
23
- headingText: "Route approvals only where they matter",
21
+ imageSrc: "/placeholders/aiworkflow/review.svg",
22
+ imageAlt: "Review queue and patch summary panel",
23
+ headingText: "Review only the changes that matter",
24
24
  subheadingText:
25
- "Let policy decide when humans need to review while routine decisions stay automated and fully auditable.",
25
+ "Keep the agent moving on routine edits while exceptions surface only when a human needs to step in.",
26
26
  },
27
27
  ];
28
28
 
29
29
  export function Features() {
30
30
  return (
31
31
  <SharedFeatures
32
- sectionHeading="One system for requests, approvals, execution, and visibility"
33
- sectionSubheading="Compose AI-assisted workflows that pull in context, coordinate teams, and keep every system in sync."
32
+ sectionHeading="One system for requests, code, execution, and visibility"
33
+ sectionSubheading="Turn a task into context, a patch, and a live result without losing the thread."
34
34
  featuresData={featuresData}
35
- section={{ className: "bg-background py-18 md:py-22 lg:py-24" }}
35
+ section={{
36
+ className: "bg-[var(--section-bg)] py-18 md:py-22 lg:py-24",
37
+ }}
36
38
  container={{ className: "max-w-7xl mx-auto px-6 md:px-8 lg:px-10" }}
37
39
  header={{ className: "mb-12 text-center md:mb-14" }}
38
40
  heading={{
@@ -59,7 +61,7 @@ export function Features() {
59
61
  className:
60
62
  "font-inter text-sm leading-6 text-[var(--card-muted-fg)] md:text-base",
61
63
  }}
62
- ariaLabel="AI workflow features"
64
+ ariaLabel="AI coding agent features"
63
65
  />
64
66
  );
65
67
  }
@@ -10,7 +10,7 @@ export function Footer() {
10
10
  footerBrandName="FlowPilot AI"
11
11
  footerNavLinks={[
12
12
  {
13
- heading: "Platform",
13
+ heading: "Product",
14
14
  links: [
15
15
  { name: "Features", href: "#features" },
16
16
  { name: "Pricing", href: "#pricing" },
@@ -21,14 +21,14 @@ export function Footer() {
21
21
  {
22
22
  heading: "Use cases",
23
23
  links: [
24
- { name: "Revenue operations", href: "#features" },
25
- { name: "Launch workflows", href: "#features" },
26
- { name: "Approvals", href: "#faq" },
27
- { name: "Integrations", href: "#features" },
24
+ { name: "Bug fixes", href: "#features" },
25
+ { name: "Refactors", href: "#features" },
26
+ { name: "Reviews", href: "#faq" },
27
+ { name: "Tooling", href: "#features" },
28
28
  ],
29
29
  },
30
30
  {
31
- heading: "Company",
31
+ heading: "Resources",
32
32
  links: [
33
33
  { name: "About", href: "#home" },
34
34
  { name: "Security", href: "#faq" },
@@ -76,12 +76,16 @@ export function Footer() {
76
76
  className:
77
77
  "font-outfit text-xl font-semibold text-[var(--footer-heading-fg)] md:text-2xl",
78
78
  }}
79
- brandWrapper={{ className: "flex flex-col items-start text-left lg:pr-8" }}
79
+ brandWrapper={{
80
+ className: "flex flex-col items-start text-left lg:pr-8",
81
+ }}
80
82
  navSection={{
81
83
  className:
82
84
  "flex flex-col items-start justify-between gap-8 pt-10 pb-12 lg:flex-row",
83
85
  }}
84
- navGroup={{ className: "flex min-w-[150px] flex-col items-start text-left" }}
86
+ navGroup={{
87
+ className: "flex min-w-[150px] flex-col items-start text-left",
88
+ }}
85
89
  navHeading={{
86
90
  className:
87
91
  "mb-4 font-inter text-sm font-semibold uppercase tracking-wider text-[var(--footer-heading-fg)]",
@@ -103,7 +107,7 @@ export function Footer() {
103
107
  className:
104
108
  "border-t border-[var(--footer-border)] py-6 text-center font-inter text-sm text-[var(--footer-muted-fg)]",
105
109
  }}
106
- ariaLabel="AI workflow footer"
110
+ ariaLabel="AI coding agent footer"
107
111
  />
108
112
  );
109
113
  }