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
@@ -1,636 +1,883 @@
1
- "use client";
2
-
3
- import { HeroProductDemo } from "@/components/sections/HeroProductDemo";
4
- import type { ProductDemoScenario } from "@/components/sections/product-demo/types";
5
-
6
- const scenarios: ProductDemoScenario[] = [
7
- {
8
- key: "intake-triage",
9
- label: "Intake & triage",
10
- description:
11
- "AI turns (test ) revenue operations request into a routed workflow with approvals and live context.",
12
- activeWindow: "workflowStudio",
13
- workflowStudio: {
14
- window: {
15
- key: "workflowStudio",
16
- title: "Workflow Studio",
17
- subtitle: "Request intake",
18
- status: { label: "Drafting", tone: "info" },
19
- badge: "Scenario 01",
20
- layoutHint: {
21
- x: 0,
22
- y: 0,
23
- width: 62,
24
- height: 72,
25
- zIndex: 40,
26
- rotateDeg: -2,
27
- },
28
- },
29
- title: "New request → launch expansion campaign",
30
- subtitle:
31
- "AI maps triggers, owners, systems, and approval checkpoints before launch.",
32
- activeNodeId: "route-approval",
33
- activeRegionId: "handoffs",
34
- highlights: [
35
- { id: "route-approval", label: "Approval routing", tone: "accent" },
36
- { id: "crm-sync", label: "CRM sync", tone: "info" },
37
- ],
38
- nodes: [
39
- {
40
- id: "request-intake",
41
- label: "Parse request",
42
- description: "Extract goal, audience, budget, and timing from Slack.",
43
- type: "AI",
44
- status: "success",
45
- metadata: "Slack → structured brief",
46
- },
47
- {
48
- id: "policy-check",
49
- label: "Check playbooks",
50
- description: "Validate budget thresholds and required approvers.",
51
- type: "Guardrail",
52
- status: "success",
53
- metadata: "Policy set v3.2",
54
- },
55
- {
56
- id: "route-approval",
57
- label: "Route approval",
58
- description:
59
- "Send legal + finance review in parallel with due dates.",
60
- type: "Approval",
61
- status: "warning",
62
- active: true,
63
- emphasized: true,
64
- metadata: "2 approvers pending",
65
- },
66
- {
67
- id: "crm-sync",
68
- label: "Update CRM",
69
- description: "Create campaign and account tasks once approved.",
70
- type: "Action",
71
- status: "neutral",
72
- metadata: "HubSpot + Salesforce",
73
- },
74
- ],
75
- branches: [
76
- {
77
- id: "b1",
78
- fromNodeId: "request-intake",
79
- toNodeId: "policy-check",
80
- status: "success",
81
- active: true,
82
- },
83
- {
84
- id: "b2",
85
- fromNodeId: "policy-check",
86
- toNodeId: "route-approval",
87
- label: "Budget > $25k",
88
- status: "warning",
89
- active: true,
90
- },
91
- {
92
- id: "b3",
93
- fromNodeId: "route-approval",
94
- toNodeId: "crm-sync",
95
- label: "On approval",
96
- status: "neutral",
97
- },
98
- ],
99
- regions: [
100
- {
101
- id: "intake",
102
- label: "Intake",
103
- description: "AI request parsing and enrichment",
104
- status: "success",
105
- nodeIds: ["request-intake", "policy-check"],
106
- },
107
- {
108
- id: "handoffs",
109
- label: "Handoffs",
110
- description: "Approval routing and downstream actions",
111
- status: "warning",
112
- nodeIds: ["route-approval", "crm-sync"],
113
- active: true,
114
- highlighted: true,
115
- },
116
- ],
117
- },
118
- runConsole: {
119
- window: {
120
- key: "runConsole",
121
- title: "Live Run",
122
- subtitle: "Execution feed",
123
- status: { label: "Streaming", tone: "info" },
124
- badge: "24 events",
125
- layoutHint: {
126
- x: 50,
127
- y: 12,
128
- width: 44,
129
- height: 52,
130
- zIndex: 30,
131
- rotateDeg: 2,
132
- },
133
- },
134
- title: "AI orchestration log",
135
- subtitle: "Every step is visible, timed, and recoverable.",
136
- statusLabel: "Awaiting approvals",
137
- progressLabel: "3 of 5 steps complete",
138
- progressPercent: 64,
139
- activeEntryId: "log-3",
140
- entries: [
141
- {
142
- id: "log-1",
143
- message: "Parsed inbound request from #revops-priority",
144
- timestamp: "09:14",
145
- source: "Slack",
146
- status: "success",
147
- },
148
- {
149
- id: "log-2",
150
- message: "Matched campaign launch playbook and risk policy",
151
- timestamp: "09:14",
152
- source: "Policy Engine",
153
- status: "success",
154
- },
155
- {
156
- id: "log-3",
157
- message: "Opened approval tasks for finance and legal",
158
- timestamp: "09:15",
159
- source: "Approval Router",
160
- status: "warning",
161
- highlighted: true,
162
- detail: "Due in 2h • fallback escalation enabled",
163
- },
164
- {
165
- id: "log-4",
166
- message: "Prepared CRM updates and downstream notifications",
167
- timestamp: "09:15",
168
- source: "Workflow Engine",
169
- status: "info",
170
- },
171
- ],
172
- metrics: [
173
- { id: "m1", label: "Latency", value: "1.8s", tone: "success" },
174
- { id: "m2", label: "Systems", value: "6", tone: "info" },
175
- { id: "m3", label: "Fallbacks", value: "0", tone: "success" },
176
- ],
177
- highlights: [{ id: "log-3", label: "Approval handoff", tone: "warning" }],
178
- },
179
- approvalInbox: {
180
- window: {
181
- key: "approvalInbox",
182
- title: "Approval Inbox",
183
- subtitle: "Decisions",
184
- status: { label: "Needs review", tone: "warning" },
185
- badge: "2 pending",
186
- layoutHint: {
187
- x: 8,
188
- y: 56,
189
- width: 38,
190
- height: 38,
191
- zIndex: 20,
192
- rotateDeg: 1,
193
- },
194
- },
195
- title: "High-confidence approvals",
196
- subtitle: "Review only where policy requires human sign-off.",
197
- activeItemId: "approval-1",
198
- counts: [
199
- { id: "c1", label: "Pending", value: "2", tone: "warning" },
200
- { id: "c2", label: "Auto-approved", value: "14", tone: "success" },
201
- { id: "c3", label: "Escalated", value: "0", tone: "info" },
202
- ],
203
- items: [
204
- {
205
- id: "approval-1",
206
- title: "Budget increase for EMEA launch",
207
- description:
208
- "AI recommends +18% budget based on forecasted pipeline lift.",
209
- requester: "Growth workflow",
210
- status: "warning",
211
- priorityLabel: "High impact",
212
- dueLabel: "Due in 2h",
213
- highlighted: true,
214
- actions: [
215
- { id: "a1", label: "Approve", tone: "success" },
216
- { id: "a2", label: "Request change", tone: "warning" },
217
- ],
218
- },
219
- {
220
- id: "approval-2",
221
- title: "Legal review for new vendor terms",
222
- description:
223
- "Generated summary attached with highlighted clause changes.",
224
- requester: "Procurement workflow",
225
- status: "info",
226
- priorityLabel: "Standard",
227
- dueLabel: "Today",
228
- },
229
- ],
230
- highlights: [
231
- { id: "approval-1", label: "Priority approval", tone: "accent" },
232
- ],
233
- },
234
- knowledgePanel: {
235
- window: {
236
- key: "knowledgePanel",
237
- title: "Knowledge",
238
- subtitle: "Grounding",
239
- status: { label: "Synced", tone: "success" },
240
- badge: "12 sources",
241
- layoutHint: {
242
- x: 58,
243
- y: 56,
244
- width: 36,
245
- height: 36,
246
- zIndex: 10,
247
- rotateDeg: -1,
248
- },
249
- },
250
- title: "Context behind every action",
251
- subtitle:
252
- "AI cites policies, customer context, and prior outcomes before it acts.",
253
- query:
254
- "Which approvals are required for a regional budget expansion over $25k?",
255
- summary:
256
- "Finance and legal approval are required when forecasted spend exceeds threshold and vendor terms change.",
257
- sources: [
258
- { id: "s1", label: "Budget Policy", kind: "Policy", status: "success" },
259
- { id: "s2", label: "Vendor Terms", kind: "Contract", status: "info" },
260
- {
261
- id: "s3",
262
- label: "Campaign Playbook",
263
- kind: "Runbook",
264
- status: "success",
265
- },
266
- ],
267
- activeSnippetId: "snippet-1",
268
- snippets: [
269
- {
270
- id: "snippet-1",
271
- title: "Budget threshold rule",
272
- content:
273
- "Campaigns above $25k require finance approval. Add legal review when vendor commitments or contractual language change.",
274
- sourceId: "s1",
275
- confidence: "98% match",
276
- excerptLabel: "Recommended policy",
277
- tags: ["finance", "approval routing"],
278
- highlighted: true,
279
- },
280
- {
281
- id: "snippet-2",
282
- title: "Previous launch outcome",
283
- content:
284
- "Similar EMEA launch workflows reduced manual routing time by 72% while keeping audit logs intact.",
285
- sourceId: "s3",
286
- confidence: "Historical pattern",
287
- tags: ["benchmark", "ops efficiency"],
288
- },
289
- ],
290
- highlights: [
291
- { id: "snippet-1", label: "Policy citation", tone: "success" },
292
- ],
293
- },
294
- highlights: [
295
- { id: "route-approval", label: "Approval branch", tone: "accent" },
296
- { id: "approval-1", label: "Human checkpoint", tone: "warning" },
297
- ],
298
- },
299
- {
300
- key: "run-sync",
301
- label: "Live execution",
302
- description:
303
- "Once approved, AI updates systems, posts status, and keeps teams synced in real time.",
304
- activeWindow: "runConsole",
305
- workflowStudio: {
306
- window: {
307
- key: "workflowStudio",
308
- title: "Workflow Studio",
309
- subtitle: "Approved flow",
310
- status: { label: "Executing", tone: "success" },
311
- badge: "Scenario 02",
312
- layoutHint: {
313
- x: 0,
314
- y: 0,
315
- width: 62,
316
- height: 72,
317
- zIndex: 30,
318
- rotateDeg: -2,
319
- },
320
- },
321
- title: "Approved workflow in motion",
322
- subtitle:
323
- "The same flow now drives tool updates, notifications, and handoffs automatically.",
324
- activeNodeId: "notify-teams",
325
- nodes: [
326
- {
327
- id: "approval-complete",
328
- label: "Approvals cleared",
329
- description: "Finance and legal sign-off recorded.",
330
- type: "Checkpoint",
331
- status: "success",
332
- metadata: "2/2 approved",
333
- },
334
- {
335
- id: "update-crm",
336
- label: "Update CRM",
337
- description:
338
- "Sync campaign fields, account owners, and target lists.",
339
- type: "Action",
340
- status: "success",
341
- metadata: "HubSpot + Salesforce",
342
- },
343
- {
344
- id: "notify-teams",
345
- label: "Notify teams",
346
- description: "Post launch brief and tasks to GTM channels.",
347
- type: "Action",
348
- status: "info",
349
- active: true,
350
- emphasized: true,
351
- metadata: "Slack + Linear",
352
- },
353
- {
354
- id: "monitor-results",
355
- label: "Monitor rollout",
356
- description: "Track errors, latency, and downstream completion.",
357
- type: "Observe",
358
- status: "neutral",
359
- metadata: "Audit + telemetry",
360
- },
361
- ],
362
- branches: [
363
- {
364
- id: "rb1",
365
- fromNodeId: "approval-complete",
366
- toNodeId: "update-crm",
367
- status: "success",
368
- active: true,
369
- },
370
- {
371
- id: "rb2",
372
- fromNodeId: "update-crm",
373
- toNodeId: "notify-teams",
374
- status: "info",
375
- active: true,
376
- },
377
- {
378
- id: "rb3",
379
- fromNodeId: "notify-teams",
380
- toNodeId: "monitor-results",
381
- status: "neutral",
382
- },
383
- ],
384
- regions: [
385
- {
386
- id: "execution",
387
- label: "Execution lane",
388
- description: "System updates and notifications",
389
- status: "info",
390
- nodeIds: ["update-crm", "notify-teams", "monitor-results"],
391
- active: true,
392
- highlighted: true,
393
- },
394
- ],
395
- },
396
- runConsole: {
397
- window: {
398
- key: "runConsole",
399
- title: "Live Run",
400
- subtitle: "Execution feed",
401
- status: { label: "Healthy", tone: "success" },
402
- badge: "42 events",
403
- layoutHint: {
404
- x: 50,
405
- y: 10,
406
- width: 44,
407
- height: 54,
408
- zIndex: 40,
409
- rotateDeg: 2,
410
- },
411
- },
412
- title: "Everything updates in sequence",
413
- subtitle:
414
- "Users see the workflow advance without digging through logs or scripts.",
415
- statusLabel: "Running smoothly",
416
- progressLabel: "5 of 6 steps complete",
417
- progressPercent: 86,
418
- activeEntryId: "exec-4",
419
- entries: [
420
- {
421
- id: "exec-1",
422
- message: "Recorded finance and legal approval payloads",
423
- timestamp: "09:18",
424
- source: "Approval Router",
425
- status: "success",
426
- },
427
- {
428
- id: "exec-2",
429
- message: "Updated 38 CRM records and created launch tasks",
430
- timestamp: "09:18",
431
- source: "CRM Sync",
432
- status: "success",
433
- detail: "0 conflicts detected",
434
- },
435
- {
436
- id: "exec-3",
437
- message:
438
- "Published launch brief to #gtm-launch and created Linear checklist",
439
- timestamp: "09:19",
440
- source: "Notifier",
441
- status: "info",
442
- },
443
- {
444
- id: "exec-4",
445
- message: "Monitoring downstream task completion and SLA risk",
446
- timestamp: "09:19",
447
- source: "Observer",
448
- status: "success",
449
- highlighted: true,
450
- detail: "Auto-escalation armed if blockers appear",
451
- },
452
- ],
453
- metrics: [
454
- { id: "rm1", label: "Tasks created", value: "18", tone: "success" },
455
- { id: "rm2", label: "Records updated", value: "38", tone: "info" },
456
- { id: "rm3", label: "Errors", value: "0", tone: "success" },
457
- ],
458
- highlights: [{ id: "exec-4", label: "Live monitoring", tone: "success" }],
459
- },
460
- approvalInbox: {
461
- window: {
462
- key: "approvalInbox",
463
- title: "Approval Inbox",
464
- subtitle: "Audit trail",
465
- status: { label: "Clear", tone: "success" },
466
- badge: "0 pending",
467
- layoutHint: {
468
- x: 10,
469
- y: 58,
470
- width: 36,
471
- height: 34,
472
- zIndex: 20,
473
- rotateDeg: 1,
474
- },
475
- },
476
- title: "Approvals only when needed",
477
- subtitle:
478
- "Human review is targeted, auditable, and out of the critical path once complete.",
479
- counts: [
480
- { id: "rc1", label: "Pending", value: "0", tone: "success" },
481
- { id: "rc2", label: "Completed", value: "8", tone: "info" },
482
- { id: "rc3", label: "Auto-approved", value: "22", tone: "success" },
483
- ],
484
- items: [
485
- {
486
- id: "approval-done-1",
487
- title: "Finance approval recorded",
488
- description:
489
- "Budget threshold exception approved with full audit log.",
490
- requester: "Growth workflow",
491
- status: "success",
492
- priorityLabel: "Complete",
493
- dueLabel: "09:17",
494
- },
495
- {
496
- id: "approval-done-2",
497
- title: "Legal review completed",
498
- description:
499
- "Clause changes accepted and attached to workflow record.",
500
- requester: "Procurement workflow",
501
- status: "success",
502
- priorityLabel: "Complete",
503
- dueLabel: "09:18",
504
- },
505
- ],
506
- },
507
- knowledgePanel: {
508
- window: {
509
- key: "knowledgePanel",
510
- title: "Knowledge",
511
- subtitle: "Operational context",
512
- status: { label: "Fresh", tone: "success" },
513
- badge: "8 live docs",
514
- layoutHint: {
515
- x: 58,
516
- y: 56,
517
- width: 34,
518
- height: 34,
519
- zIndex: 10,
520
- rotateDeg: -1,
521
- },
522
- },
523
- title: "Grounded automation, not guesswork",
524
- subtitle:
525
- "Every downstream change is tied back to source context and prior operating rules.",
526
- query: "What should happen after launch approval is complete?",
527
- summary:
528
- "Sync CRM, notify GTM owners, create follow-up tasks, and monitor SLA risks until completion.",
529
- sources: [
530
- {
531
- id: "rs1",
532
- label: "Launch Runbook",
533
- kind: "Runbook",
534
- status: "success",
535
- },
536
- { id: "rs2", label: "Team SLA Policy", kind: "Policy", status: "info" },
537
- ],
538
- activeSnippetId: "runbook-snippet",
539
- snippets: [
540
- {
541
- id: "runbook-snippet",
542
- title: "Post-approval sequence",
543
- content:
544
- "After approvals clear, update CRM state, notify GTM channels, open implementation tasks, and start SLA monitoring for any dependencies.",
545
- sourceId: "rs1",
546
- confidence: "Runbook step 4",
547
- excerptLabel: "Execution guidance",
548
- tags: ["execution", "handoff"],
549
- highlighted: true,
550
- },
551
- ],
552
- },
553
- highlights: [
554
- { id: "notify-teams", label: "Live handoff", tone: "accent" },
555
- { id: "exec-4", label: "Observed completion", tone: "success" },
556
- ],
557
- },
558
- ];
559
-
560
- export function Hero() {
561
- return (
562
- <div className="relative overflow-hidden">
563
- <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_top_left,theme(colors.cyan.500/0.18),transparent_32%),radial-gradient(circle_at_bottom_right,theme(colors.violet.500/0.14),transparent_34%)]" />
564
-
565
- <HeroProductDemo
566
- className="bg-[linear-gradient(180deg,rgba(248,250,252,0.98)_0%,rgba(239,246,255,0.92)_46%,rgba(248,250,252,0.98)_100%)] dark:bg-[linear-gradient(180deg,rgba(2,6,23,0.98)_0%,rgba(8,47,73,0.96)_42%,rgba(15,23,42,0.98)_100%)]"
567
- heading={{
568
- text: "Let AI run the workflows your team still manages by hand.",
569
- className:
570
- "max-w-3xl text-left font-outfit text-4xl font-semibold leading-tight tracking-tight text-slate-950 sm:text-5xl lg:text-6xl dark:text-white",
571
- }}
572
- subheading={{
573
- text: "Turn requests into multi-step workflows that gather context, route approvals, update tools, and show live execution from one AI workflow automation platform.",
574
- className:
575
- "mt-6 max-w-2xl text-left font-inter text-base leading-7 text-slate-600 sm:text-lg dark:text-slate-300",
576
- }}
577
- cta1={{
578
- label: "Start automating",
579
- href: "#contact",
580
- variant: "default",
581
- size: "lg",
582
- className: [
583
- "px-8 py-3 text-base font-semibold shadow-lg shadow-cyan-500/20",
584
- "[--btn-bg:theme(colors.cyan.500)]",
585
- "hover:[--btn-hover-bg:theme(colors.cyan.400)]",
586
- "[--btn-fg:theme(colors.slate.950)]",
587
- "hover:[--btn-hover-fg:theme(colors.slate.950)]",
588
- ].join(" "),
589
- }}
590
- cta2={{
591
- label: "See how it works",
592
- href: "#features",
593
- variant: "outline",
594
- size: "lg",
595
- className: [
596
- "border px-8 py-3 text-base font-semibold shadow-sm",
597
- "[--btn-bg:transparent]",
598
- "[--btn-fg:theme(colors.cyan.700)]",
599
- "[--btn-border:theme(colors.cyan.300)]",
600
- "hover:[--btn-hover-bg:theme(colors.cyan.50)]",
601
- "hover:[--btn-hover-fg:theme(colors.cyan.800)]",
602
- "dark:[--btn-fg:theme(colors.cyan.300)]",
603
- "dark:[--btn-border:theme(colors.cyan.700)]",
604
- "dark:hover:[--btn-hover-bg:theme(colors.cyan.950)]",
605
- "dark:hover:[--btn-hover-fg:theme(colors.cyan.200)]",
606
- ].join(" "),
607
- }}
608
- stage={{
609
- scenarios,
610
- initialScenarioIndex: 0,
611
- autoCycle: true,
612
- cycleIntervalMs: 5200,
613
- className:
614
- "[--demo-stage-bg:linear-gradient(180deg,rgba(255,255,255,0.92)_0%,rgba(224,242,254,0.72)_100%)] dark:[--demo-stage-bg:linear-gradient(180deg,rgba(15,23,42,0.92)_0%,rgba(12,74,110,0.70)_100%)]",
615
- }}
616
- section={{
617
- className: "px-6 py-16 sm:px-8 lg:px-10 lg:py-24",
618
- }}
619
- container={{
620
- className:
621
- "relative z-10 items-start gap-14 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",
622
- }}
623
- textContainer={{
624
- className: "pt-4 lg:pt-10",
625
- }}
626
- demoContainer={{
627
- className: "relative min-h-[36rem] lg:min-h-[42rem]",
628
- }}
629
- buttonsContainer={{
630
- className: "mt-8 flex-col items-start sm:flex-row sm:items-center",
631
- }}
632
- ariaLabel="AI workflow automation hero section"
633
- />
634
- </div>
635
- );
636
- }
1
+ "use client";
2
+
3
+ import { HeroProductDemo } from "@/components/sections/HeroProductDemo";
4
+ import type { ProductDemoScenario } from "@/components/sections/product-demo/types";
5
+
6
+ const scenarios: ProductDemoScenario[] = [
7
+ {
8
+ key: "fix-auth-flow",
9
+ label: "Coding agent",
10
+ description:
11
+ "Choose a repo task and watch the agent inspect code, apply edits, and update the diff.",
12
+ activeWindow: "workflowStudio",
13
+ playback: {
14
+ workflowStudio: {
15
+ playbackStepDurationsMs: [780, 860, 1480, 1120, 940, 760, 1720],
16
+ playbackResetDelayMs: 2200,
17
+ },
18
+ runConsole: {
19
+ playbackStepDurationsMs: [1260, 1540, 980, 760, 680, 620, 1380],
20
+ playbackResetDelayMs: 2200,
21
+ playbackStepEntryIndices: [0, 0, 1, 1, 2, 2, 2, 2, 3],
22
+ playbackStepVisibleLineCounts: [2, 2, 3, 4, 6, 9, 12, 15, 16],
23
+ },
24
+ },
25
+ taskList: {
26
+ window: {
27
+ key: "taskList",
28
+ title: "Tasks",
29
+ subtitle: "Current workspace",
30
+ status: { label: "3 tasks", tone: "info" },
31
+ },
32
+ title: "Agent tasks",
33
+ subtitle: "Select a coding task to inspect and execute.",
34
+ activeItemId: "fix-auth-flow",
35
+ items: [
36
+ {
37
+ id: "fix-auth-flow",
38
+ title: "Fix auth flow",
39
+ description: "Fix the post-login redirect after the OAuth callback.",
40
+ meta: "apps/web · active",
41
+ },
42
+ {
43
+ id: "refactor-pricing-page",
44
+ title: "Refactor pricing page",
45
+ description:
46
+ "Extract repeated pricing sections into reusable components.",
47
+ meta: "marketing site · queued",
48
+ },
49
+ {
50
+ id: "ship-command-palette",
51
+ title: "Ship command palette",
52
+ description: "Add global search, shortcuts, and action routing.",
53
+ meta: "dashboard · ready",
54
+ },
55
+ ],
56
+ },
57
+ workflowStudio: {
58
+ window: {
59
+ key: "workflowStudio",
60
+ title: "Agent",
61
+ subtitle: "Active session",
62
+ status: { label: "Thinking", tone: "info" },
63
+ },
64
+ title: "Investigating redirect bug",
65
+ subtitle: "The agent inspects the callback and prepares a safe patch.",
66
+ activeNodeId: "edit-callback",
67
+ transcript: [
68
+ { id: "auth-title", kind: "title", text: "Fix auth flow" },
69
+ {
70
+ id: "auth-prompt",
71
+ kind: "prompt",
72
+ text: "Fix the OAuth callback redirect so the app preserves the intended destination after sign-in.",
73
+ },
74
+ {
75
+ id: "auth-read-1",
76
+ kind: "activity",
77
+ text: "Read app/auth/callback/page.tsx",
78
+ },
79
+ {
80
+ id: "auth-file-1",
81
+ kind: "file",
82
+ path: "app/auth/callback/page.tsx",
83
+ text: "app/auth/callback/page.tsx",
84
+ added: 14,
85
+ removed: 3,
86
+ },
87
+ {
88
+ id: "auth-file-2",
89
+ kind: "file",
90
+ path: "lib/auth/normalize-return-to.ts",
91
+ text: "lib/auth/normalize-return-to.ts",
92
+ added: 6,
93
+ removed: 1,
94
+ },
95
+ {
96
+ id: "auth-run-1",
97
+ kind: "activity",
98
+ text: "Run redirect scenarios for nested routes and invalid returnTo values",
99
+ },
100
+ {
101
+ id: "auth-thought-1",
102
+ kind: "thought",
103
+ text: "Preserve same-origin destinations, drop empty values, and avoid redirecting twice after the callback completes.",
104
+ },
105
+ {
106
+ id: "auth-message-1",
107
+ kind: "message",
108
+ text: "Patch keeps /dashboard/settings intact, falls back only when sanitize returns null, and records the redirect source for debugging.",
109
+ },
110
+ {
111
+ id: "auth-run-2",
112
+ kind: "activity",
113
+ text: "Prepare regression notes for auth loop and malformed path checks",
114
+ },
115
+ ],
116
+ composer: {
117
+ placeholder: "Plan, inspect, or patch the next issue...",
118
+ modeLabel: "Agent",
119
+ modelLabel: "Sonnet",
120
+ },
121
+ highlights: [
122
+ { id: "inspect-route", label: "Read files", tone: "info" },
123
+ { id: "edit-callback", label: "Write patch", tone: "accent" },
124
+ ],
125
+ nodes: [
126
+ {
127
+ id: "inspect-route",
128
+ label: "Inspect auth callback",
129
+ description: "Read callback handler and post-login redirect logic.",
130
+ type: "Read",
131
+ status: "success",
132
+ metadata: "app/auth/callback/page.tsx",
133
+ },
134
+ {
135
+ id: "trace-session",
136
+ label: "Trace session state",
137
+ description: "Verify redirect target after token exchange completes.",
138
+ type: "Analyze",
139
+ status: "success",
140
+ metadata: "session + router state",
141
+ },
142
+ {
143
+ id: "edit-callback",
144
+ label: "Patch redirect handling",
145
+ type: "Edit",
146
+ status: "info",
147
+ active: true,
148
+ emphasized: true,
149
+ metadata: "drafting change set",
150
+ },
151
+ {
152
+ id: "run-checks",
153
+ label: "Run validation",
154
+ description:
155
+ "Check for auth loop regression and invalid destination paths.",
156
+ type: "Verify",
157
+ status: "neutral",
158
+ metadata: "tests next",
159
+ },
160
+ ],
161
+ },
162
+ runConsole: {
163
+ window: {
164
+ key: "runConsole",
165
+ title: "Editor",
166
+ subtitle: "Live diff",
167
+ status: { label: "Updating", tone: "info" },
168
+ },
169
+ title: "app/auth/callback/page.tsx",
170
+ subtitle: "The diff updates as the agent writes the patch.",
171
+ statusLabel: "Applying patch",
172
+ progressLabel: "17 lines changed",
173
+ progressPercent: 68,
174
+ activeEntryId: "diff-3",
175
+ editorTabLabel: "page.tsx",
176
+ editorLanguage: "TypeScript",
177
+ editorSummary:
178
+ "Guard empty return paths and preserve intended destination.",
179
+ entries: [
180
+ {
181
+ id: "diff-1",
182
+ message: "Opened callback page and redirect helper",
183
+ timestamp: "11:02",
184
+ source: "agent",
185
+ status: "success",
186
+ },
187
+ {
188
+ id: "diff-2",
189
+ message: "Found empty redirect path after OAuth callback",
190
+ timestamp: "11:02",
191
+ source: "analysis",
192
+ status: "success",
193
+ detail:
194
+ "Fallback was defaulting too early and dropping intended destination.",
195
+ },
196
+ {
197
+ id: "diff-3",
198
+ message: "Writing guarded redirect with preserved returnTo",
199
+ timestamp: "11:03",
200
+ source: "editor",
201
+ status: "info",
202
+ highlighted: true,
203
+ lineNumber: "38",
204
+ code: [
205
+ " const safeReturnTo = normalizeReturnTo(searchParams.get('returnTo'))",
206
+ "+const shouldTrackRedirect = safeReturnTo !== null",
207
+ "+const fallbackDestination = '/dashboard'",
208
+ " const destination = safeReturnTo ?? '/dashboard'",
209
+ "+const nextPath = destination || fallbackDestination",
210
+ "+const redirectSource = safeReturnTo ? 'return_to' : 'fallback'",
211
+ " ",
212
+ "+if (!nextPath.startsWith('/')) {",
213
+ "+ router.replace(fallbackDestination)",
214
+ "+ return null",
215
+ "+}",
216
+ "-router.replace('/dashboard')",
217
+ "+router.replace(nextPath)",
218
+ "+if (shouldTrackRedirect) trackAuthRedirect(nextPath, redirectSource)",
219
+ "+logAuthNavigation('oauth_callback_redirect', { destination: nextPath })",
220
+ " return null",
221
+ ],
222
+ },
223
+ {
224
+ id: "diff-4",
225
+ message: "Validated redirect to /dashboard/settings",
226
+ timestamp: "11:03",
227
+ source: "preview",
228
+ status: "neutral",
229
+ },
230
+ ],
231
+ metrics: [
232
+ { id: "m1", label: "Files", value: "2", tone: "success" },
233
+ { id: "m2", label: "Edits", value: "12", tone: "info" },
234
+ { id: "m3", label: "Checks", value: "1/2", tone: "warning" },
235
+ ],
236
+ highlights: [],
237
+ },
238
+ approvalInbox: {
239
+ window: {
240
+ key: "approvalInbox",
241
+ title: "Hidden",
242
+ },
243
+ items: [],
244
+ },
245
+ knowledgePanel: {
246
+ window: {
247
+ key: "knowledgePanel",
248
+ title: "Knowledge",
249
+ subtitle: "Preview",
250
+ status: { label: "Ready", tone: "success" },
251
+ },
252
+ title: "Patch preview",
253
+ subtitle: "Show the code the agent is producing right now.",
254
+ query: "page.tsx",
255
+ summary:
256
+ "Redirects now preserve a sanitized returnTo destination and fall back only when needed.",
257
+ snippets: [
258
+ {
259
+ id: "snippet-1",
260
+ title: "Updated callback handler",
261
+ excerptLabel: "Live diff",
262
+ confidence: "12 changed lines",
263
+ highlighted: true,
264
+ content:
265
+ "const safeReturnTo = normalizeReturnTo(searchParams.get('returnTo'))\nconst destination = safeReturnTo ?? '/dashboard'\nrouter.replace(destination)",
266
+ tags: ["redirect", "auth", "callback"],
267
+ },
268
+ ],
269
+ highlights: [
270
+ { id: "snippet-1", label: "Generated code", tone: "success" },
271
+ ],
272
+ },
273
+ highlights: [
274
+ { id: "edit-callback", label: "Active edit", tone: "accent" },
275
+ { id: "diff-3", label: "Result updates", tone: "info" },
276
+ ],
277
+ },
278
+ {
279
+ key: "refactor-pricing-page",
280
+ label: "Coding agent",
281
+ description:
282
+ "Choose a repo task and watch the agent inspect code, apply edits, and update the diff.",
283
+ activeWindow: "workflowStudio",
284
+ playback: {
285
+ workflowStudio: {
286
+ playbackStepDurationsMs: [820, 920, 1380, 1180, 980, 840, 1640],
287
+ playbackResetDelayMs: 2200,
288
+ },
289
+ runConsole: {
290
+ playbackStepDurationsMs: [1320, 1480, 920, 760, 700, 660, 1320],
291
+ playbackResetDelayMs: 2200,
292
+ playbackStepEntryIndices: [0, 0, 1, 1, 2, 2, 2, 3, 3],
293
+ playbackStepVisibleLineCounts: [2, 2, 3, 4, 5, 7, 9, 11, 11],
294
+ },
295
+ },
296
+ taskList: {
297
+ window: {
298
+ key: "taskList",
299
+ title: "Tasks",
300
+ subtitle: "Current workspace",
301
+ status: { label: "3 tasks", tone: "info" },
302
+ },
303
+ title: "Agent tasks",
304
+ subtitle: "Select a coding task to inspect and execute.",
305
+ activeItemId: "refactor-pricing-page",
306
+ items: [
307
+ {
308
+ id: "fix-auth-flow",
309
+ title: "Fix auth flow",
310
+ description: "Fix the post-login redirect after the OAuth callback.",
311
+ meta: "apps/web · active",
312
+ },
313
+ {
314
+ id: "refactor-pricing-page",
315
+ title: "Refactor pricing page",
316
+ description:
317
+ "Extract repeated pricing sections into reusable components.",
318
+ meta: "marketing site · queued",
319
+ },
320
+ {
321
+ id: "ship-command-palette",
322
+ title: "Ship command palette",
323
+ description: "Add global search, shortcuts, and action routing.",
324
+ meta: "dashboard · ready",
325
+ },
326
+ ],
327
+ },
328
+ workflowStudio: {
329
+ window: {
330
+ key: "workflowStudio",
331
+ title: "Agent",
332
+ subtitle: "Active session",
333
+ status: { label: "Planning", tone: "info" },
334
+ },
335
+ title: "Extracting pricing sections",
336
+ subtitle: "The agent maps repeated UI and rewires the page composition.",
337
+ activeNodeId: "create-blocks",
338
+ transcript: [
339
+ { id: "pricing-title", kind: "title", text: "Refactor pricing page" },
340
+ {
341
+ id: "pricing-prompt",
342
+ kind: "prompt",
343
+ text: "Extract the pricing page into reusable sections without changing the visual output.",
344
+ },
345
+ {
346
+ id: "pricing-read-1",
347
+ kind: "activity",
348
+ text: "Read app/(marketing)/pricing/page.tsx",
349
+ },
350
+ {
351
+ id: "pricing-file-1",
352
+ kind: "file",
353
+ path: "components/pricing/PricingTiers.tsx",
354
+ text: "components/pricing/PricingTiers.tsx",
355
+ added: 52,
356
+ removed: 0,
357
+ },
358
+ {
359
+ id: "pricing-file-2",
360
+ kind: "file",
361
+ path: "app/(marketing)/pricing/page.tsx",
362
+ text: "app/(marketing)/pricing/page.tsx",
363
+ added: 18,
364
+ removed: 34,
365
+ },
366
+ {
367
+ id: "pricing-run-1",
368
+ kind: "activity",
369
+ text: "Move the tier grid wrapper into PricingTiers and normalize the plans prop shape",
370
+ },
371
+ {
372
+ id: "pricing-thought-1",
373
+ kind: "thought",
374
+ text: "Keep the visual output identical by preserving card order, CTA copy, and the existing spacing classes.",
375
+ },
376
+ {
377
+ id: "pricing-message-1",
378
+ kind: "message",
379
+ text: "The page entry now composes extracted sections while shared pricing data stays centralized and easier to extend.",
380
+ },
381
+ {
382
+ id: "pricing-run-2",
383
+ kind: "activity",
384
+ text: "Compare extracted markup against the original layout before final cleanup",
385
+ },
386
+ ],
387
+ composer: {
388
+ placeholder: "Plan, search, or restructure the page...",
389
+ modeLabel: "Agent",
390
+ modelLabel: "Sonnet",
391
+ },
392
+ highlights: [
393
+ { id: "scan-page", label: "Find repetition", tone: "info" },
394
+ { id: "create-blocks", label: "Extract components", tone: "accent" },
395
+ ],
396
+ nodes: [
397
+ {
398
+ id: "scan-page",
399
+ label: "Scan pricing page",
400
+ description: "Detect repeated tier, feature, and CTA structures.",
401
+ type: "Read",
402
+ status: "success",
403
+ metadata: "app/(marketing)/pricing/page.tsx",
404
+ },
405
+ {
406
+ id: "map-sections",
407
+ label: "Map component boundaries",
408
+ description: "Group hero, tiers, FAQ, and comparison table logic.",
409
+ type: "Analyze",
410
+ status: "success",
411
+ metadata: "4 extractable sections",
412
+ },
413
+ {
414
+ id: "create-blocks",
415
+ label: "Create reusable blocks",
416
+ type: "Edit",
417
+ status: "info",
418
+ active: true,
419
+ emphasized: true,
420
+ metadata: "components/pricing/*",
421
+ },
422
+ {
423
+ id: "trim-page",
424
+ label: "Simplify page entry",
425
+ description: "Reduce the page to composition and imported data.",
426
+ type: "Verify",
427
+ status: "neutral",
428
+ metadata: "cleanup pending",
429
+ },
430
+ ],
431
+ },
432
+ runConsole: {
433
+ window: {
434
+ key: "runConsole",
435
+ title: "Editor",
436
+ subtitle: "Component output",
437
+ status: { label: "Updating", tone: "info" },
438
+ },
439
+ title: "components/pricing/PricingTiers.tsx",
440
+ subtitle: "The diff updates as the extracted component takes shape.",
441
+ statusLabel: "Extracting components",
442
+ progressLabel: "3 files updated",
443
+ progressPercent: 59,
444
+ activeEntryId: "pricing-3",
445
+ editorTabLabel: "PricingTiers.tsx",
446
+ editorLanguage: "TSX",
447
+ editorSummary:
448
+ "Move repeated pricing JSX into a reusable tiers component.",
449
+ entries: [
450
+ {
451
+ id: "pricing-1",
452
+ message: "Found repeated tier markup and CTA footer",
453
+ timestamp: "11:11",
454
+ source: "agent",
455
+ status: "success",
456
+ },
457
+ {
458
+ id: "pricing-2",
459
+ message: "Created shared types for pricing data and features",
460
+ timestamp: "11:12",
461
+ source: "editor",
462
+ status: "success",
463
+ },
464
+ {
465
+ id: "pricing-3",
466
+ message: "Extracting PricingTiers component and props shape",
467
+ timestamp: "11:12",
468
+ source: "editor",
469
+ status: "info",
470
+ highlighted: true,
471
+ lineNumber: "18",
472
+ code: [
473
+ " export function PricingTiers({ plans }: PricingTiersProps) {",
474
+ "- return plans.map((plan) => (",
475
+ "+ return (",
476
+ "+ <div className='grid gap-6 lg:grid-cols-3'>",
477
+ "+ {plans.map((plan) => (",
478
+ " <PricingCard key={plan.name} plan={plan} />",
479
+ "+ ))}",
480
+ "+ </div>",
481
+ "- ))",
482
+ "+ )",
483
+ " }",
484
+ ],
485
+ },
486
+ {
487
+ id: "pricing-4",
488
+ message: "Updating page.tsx to compose extracted sections",
489
+ timestamp: "11:13",
490
+ source: "editor",
491
+ status: "neutral",
492
+ },
493
+ ],
494
+ metrics: [
495
+ { id: "pm1", label: "Files", value: "4", tone: "success" },
496
+ { id: "pm2", label: "Blocks", value: "3", tone: "info" },
497
+ { id: "pm3", label: "Dupes", value: "-38%", tone: "success" },
498
+ ],
499
+ highlights: [],
500
+ },
501
+ approvalInbox: {
502
+ window: {
503
+ key: "approvalInbox",
504
+ title: "Hidden",
505
+ },
506
+ items: [],
507
+ },
508
+ knowledgePanel: {
509
+ window: {
510
+ key: "knowledgePanel",
511
+ title: "Knowledge",
512
+ subtitle: "Preview",
513
+ status: { label: "Ready", tone: "success" },
514
+ },
515
+ title: "Component preview",
516
+ subtitle: "Show the extracted UI structure the agent is generating.",
517
+ query: "PricingTiers.tsx",
518
+ summary:
519
+ "The page is being reduced to reusable blocks with shared data and a slimmer entry point.",
520
+ snippets: [
521
+ {
522
+ id: "pricing-snippet",
523
+ title: "Extracted tier component",
524
+ excerptLabel: "Live component",
525
+ confidence: "3 components created",
526
+ highlighted: true,
527
+ content:
528
+ "export function PricingTiers({ plans }: PricingTiersProps) {\n return plans.map((plan) => <PricingCard key={plan.name} plan={plan} />)\n}",
529
+ tags: ["components", "refactor", "pricing"],
530
+ },
531
+ ],
532
+ highlights: [
533
+ { id: "pricing-snippet", label: "Generated UI", tone: "success" },
534
+ ],
535
+ },
536
+ highlights: [
537
+ { id: "create-blocks", label: "Active extraction", tone: "accent" },
538
+ { id: "pricing-3", label: "Result updates", tone: "info" },
539
+ ],
540
+ },
541
+ {
542
+ key: "ship-command-palette",
543
+ label: "Coding agent",
544
+ description:
545
+ "Choose a repo task and watch the agent inspect code, apply edits, and update the diff.",
546
+ activeWindow: "workflowStudio",
547
+ playback: {
548
+ workflowStudio: {
549
+ playbackStepDurationsMs: [760, 900, 1320, 1160, 920, 820, 1560],
550
+ playbackResetDelayMs: 2200,
551
+ },
552
+ runConsole: {
553
+ playbackStepDurationsMs: [1180, 1420, 940, 780, 700, 660, 1280],
554
+ playbackResetDelayMs: 2200,
555
+ playbackStepEntryIndices: [0, 0, 1, 1, 2, 2, 2, 3, 3],
556
+ playbackStepVisibleLineCounts: [2, 2, 3, 4, 6, 8, 10, 12, 12],
557
+ },
558
+ },
559
+ taskList: {
560
+ window: {
561
+ key: "taskList",
562
+ title: "Tasks",
563
+ subtitle: "Current workspace",
564
+ status: { label: "3 tasks", tone: "info" },
565
+ },
566
+ title: "Agent tasks",
567
+ subtitle: "Select a coding task to inspect and execute.",
568
+ activeItemId: "ship-command-palette",
569
+ items: [
570
+ {
571
+ id: "fix-auth-flow",
572
+ title: "Fix auth flow",
573
+ description: "Fix the post-login redirect after the OAuth callback.",
574
+ meta: "apps/web · active",
575
+ },
576
+ {
577
+ id: "refactor-pricing-page",
578
+ title: "Refactor pricing page",
579
+ description:
580
+ "Extract repeated pricing sections into reusable components.",
581
+ meta: "marketing site · queued",
582
+ },
583
+ {
584
+ id: "ship-command-palette",
585
+ title: "Ship command palette",
586
+ description: "Add global search, shortcuts, and action routing.",
587
+ meta: "dashboard · ready",
588
+ },
589
+ ],
590
+ },
591
+ workflowStudio: {
592
+ window: {
593
+ key: "workflowStudio",
594
+ title: "Agent",
595
+ subtitle: "Active session",
596
+ status: { label: "Building", tone: "info" },
597
+ },
598
+ title: "Adding command palette",
599
+ subtitle: "The agent wires shortcuts and fast navigation into one flow.",
600
+ activeNodeId: "wire-shortcuts",
601
+ transcript: [
602
+ { id: "cmd-title", kind: "title", text: "Ship command palette" },
603
+ {
604
+ id: "cmd-prompt",
605
+ kind: "prompt",
606
+ text: "Add a command palette with global shortcut support, grouped actions, and fast route switching.",
607
+ },
608
+ {
609
+ id: "cmd-read-1",
610
+ kind: "activity",
611
+ text: "Read app/dashboard/layout.tsx",
612
+ },
613
+ {
614
+ id: "cmd-file-1",
615
+ kind: "file",
616
+ path: "components/command-menu.tsx",
617
+ text: "components/command-menu.tsx",
618
+ added: 27,
619
+ removed: 4,
620
+ },
621
+ {
622
+ id: "cmd-file-2",
623
+ kind: "file",
624
+ path: "app/dashboard/layout.tsx",
625
+ text: "app/dashboard/layout.tsx",
626
+ added: 9,
627
+ removed: 1,
628
+ },
629
+ {
630
+ id: "cmd-run-1",
631
+ kind: "activity",
632
+ text: "Index route actions and quick commands so grouped search stays responsive",
633
+ },
634
+ {
635
+ id: "cmd-thought-1",
636
+ kind: "thought",
637
+ text: "The global shortcut should ignore focused text inputs and always remove its keydown listener on unmount.",
638
+ },
639
+ {
640
+ id: "cmd-message-1",
641
+ kind: "message",
642
+ text: "Palette now opens globally, keeps grouped actions discoverable, and routes immediately after a selection.",
643
+ },
644
+ {
645
+ id: "cmd-run-2",
646
+ kind: "activity",
647
+ text: "Validate keyboard open-close flow, route jumps, and the empty search state",
648
+ },
649
+ ],
650
+ composer: {
651
+ placeholder: "Ask the agent to search, wire, or ship...",
652
+ modeLabel: "Agent",
653
+ modelLabel: "Sonnet",
654
+ },
655
+ highlights: [
656
+ { id: "inspect-layout", label: "Inspect layout", tone: "info" },
657
+ { id: "wire-shortcuts", label: "Add shortcuts", tone: "accent" },
658
+ ],
659
+ nodes: [
660
+ {
661
+ id: "inspect-layout",
662
+ label: "Inspect app shell",
663
+ description:
664
+ "Find the dashboard layout, nav state, and modal primitives.",
665
+ type: "Read",
666
+ status: "success",
667
+ metadata: "dashboard shell",
668
+ },
669
+ {
670
+ id: "gather-actions",
671
+ label: "Collect command actions",
672
+ description: "Build a searchable list of routes and common actions.",
673
+ type: "Analyze",
674
+ status: "success",
675
+ metadata: "12 candidate commands",
676
+ },
677
+ {
678
+ id: "wire-shortcuts",
679
+ label: "Wire keyboard shortcuts",
680
+ type: "Edit",
681
+ status: "info",
682
+ active: true,
683
+ emphasized: true,
684
+ metadata: "keydown + dialog state",
685
+ },
686
+ {
687
+ id: "polish-results",
688
+ label: "Polish result list",
689
+ description:
690
+ "Add grouping, empty state, and active selection feedback.",
691
+ type: "Verify",
692
+ status: "neutral",
693
+ metadata: "UX pass next",
694
+ },
695
+ ],
696
+ },
697
+ runConsole: {
698
+ window: {
699
+ key: "runConsole",
700
+ title: "Editor",
701
+ subtitle: "UI output",
702
+ status: { label: "Updating", tone: "info" },
703
+ },
704
+ title: "components/command-menu.tsx",
705
+ subtitle:
706
+ "The diff updates as the command palette is wired into the app shell.",
707
+ statusLabel: "Wiring command palette",
708
+ progressLabel: "8 commands indexed",
709
+ progressPercent: 73,
710
+ activeEntryId: "cmd-3",
711
+ editorTabLabel: "command-menu.tsx",
712
+ editorLanguage: "TSX",
713
+ editorSummary:
714
+ "Wire a global shortcut and searchable action list into the dashboard shell.",
715
+ entries: [
716
+ {
717
+ id: "cmd-1",
718
+ message: "Opened dialog primitive and dashboard nav state",
719
+ timestamp: "11:21",
720
+ source: "agent",
721
+ status: "success",
722
+ },
723
+ {
724
+ id: "cmd-2",
725
+ message: "Generated grouped command list and action search",
726
+ timestamp: "11:22",
727
+ source: "editor",
728
+ status: "success",
729
+ },
730
+ {
731
+ id: "cmd-3",
732
+ message: "Binding Cmd+K to open the command menu globally",
733
+ timestamp: "11:22",
734
+ source: "editor",
735
+ status: "info",
736
+ highlighted: true,
737
+ lineNumber: "27",
738
+ code: [
739
+ " useEffect(() => {",
740
+ "+ const handleKeyDown = (event: KeyboardEvent) => {",
741
+ "+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {",
742
+ "+ event.preventDefault()",
743
+ "+ setOpen((current) => !current)",
744
+ "+ }",
745
+ "+ }",
746
+ "- window.addEventListener('keydown', onKeyDown)",
747
+ "+ window.addEventListener('keydown', handleKeyDown)",
748
+ "- return () => window.removeEventListener('keydown', onKeyDown)",
749
+ "+ return () => window.removeEventListener('keydown', handleKeyDown)",
750
+ " }, [])",
751
+ ],
752
+ },
753
+ {
754
+ id: "cmd-4",
755
+ message: "Validated route jump and quick action execution",
756
+ timestamp: "11:23",
757
+ source: "preview",
758
+ status: "neutral",
759
+ },
760
+ ],
761
+ metrics: [
762
+ { id: "cm1", label: "Commands", value: "8", tone: "info" },
763
+ { id: "cm2", label: "Routes", value: "5", tone: "success" },
764
+ { id: "cm3", label: "Shortcut", value: "Cmd+K", tone: "success" },
765
+ ],
766
+ highlights: [],
767
+ },
768
+ approvalInbox: {
769
+ window: {
770
+ key: "approvalInbox",
771
+ title: "Hidden",
772
+ },
773
+ items: [],
774
+ },
775
+ knowledgePanel: {
776
+ window: {
777
+ key: "knowledgePanel",
778
+ title: "Knowledge",
779
+ subtitle: "Preview",
780
+ status: { label: "Ready", tone: "success" },
781
+ },
782
+ title: "Palette preview",
783
+ subtitle: "Show the agent's latest UI output for the command menu.",
784
+ query: "command-menu.tsx",
785
+ summary:
786
+ "A global command palette is being added with grouped actions, shortcut support, and instant route changes.",
787
+ snippets: [
788
+ {
789
+ id: "command-snippet",
790
+ title: "Command menu",
791
+ excerptLabel: "Live UI",
792
+ confidence: "8 commands wired",
793
+ highlighted: true,
794
+ content:
795
+ '<CommandDialog open={open} onOpenChange={setOpen}>\n <CommandInput placeholder="Search commands" />\n <CommandList>{groups.map(renderGroup)}</CommandList>\n</CommandDialog>',
796
+ tags: ["command palette", "ux", "keyboard"],
797
+ },
798
+ ],
799
+ highlights: [
800
+ { id: "command-snippet", label: "Generated UI", tone: "success" },
801
+ ],
802
+ },
803
+ highlights: [
804
+ { id: "wire-shortcuts", label: "Active build", tone: "accent" },
805
+ { id: "cmd-3", label: "Result updates", tone: "info" },
806
+ ],
807
+ },
808
+ ];
809
+
810
+ export function Hero() {
811
+ return (
812
+ <div className="relative overflow-hidden">
813
+ <div className="pointer-events-none absolute inset-0 bg-[linear-gradient(180deg,#eef3f8_0%,#f6f8fb_48%,#eef3f8_100%)] dark:bg-[linear-gradient(180deg,#171717_0%,#121212_18%,#1d1d1d_46%,#131313_76%,#1b1b1b_100%)]" />
814
+ <div className="pointer-events-none absolute inset-0 bg-[linear-gradient(112deg,transparent_18%,rgba(255,255,255,0.18)_28%,rgba(255,255,255,0.05)_37%,transparent_50%),linear-gradient(248deg,transparent_22%,rgba(255,255,255,0.14)_31%,rgba(255,255,255,0.04)_41%,transparent_56%)] opacity-70 dark:opacity-100" />
815
+ <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.12),transparent_34%)] opacity-70 dark:opacity-100" />
816
+ <div className="pointer-events-none absolute left-1/2 top-[26rem] h-[32rem] w-[62rem] -translate-x-1/2 rounded-full bg-[radial-gradient(circle_at_center,rgba(255,255,255,0.22)_0%,rgba(255,255,255,0.12)_12%,rgba(255,255,255,0.06)_24%,transparent_66%)] blur-3xl opacity-85 dark:opacity-100" />
817
+
818
+ <HeroProductDemo
819
+ className="bg-transparent"
820
+ heading={{
821
+ text: "Code with agents.",
822
+ className:
823
+ "max-w-4xl text-left font-outfit text-3xl font-semibold leading-none tracking-tight text-[var(--heading-fg)] sm:text-4xl lg:text-5xl",
824
+ }}
825
+ subheading={{
826
+ text: "Watch the agent read, edit, and update the result in real time.",
827
+ className:
828
+ "mt-3 max-w-2xl text-left font-inter text-sm leading-6 text-[var(--subheading-fg)] sm:text-base",
829
+ }}
830
+ cta1={{
831
+ label: "Start building",
832
+ href: "#contact",
833
+ variant: "default",
834
+ size: "lg",
835
+ className: [
836
+ "px-7 py-3 text-sm font-semibold shadow-lg shadow-black/10 dark:shadow-black/30",
837
+ "[--btn-bg:var(--hero-cta-primary-bg)]",
838
+ "hover:[--btn-hover-bg:var(--hero-cta-primary-hover-bg)]",
839
+ "[--btn-fg:var(--hero-cta-primary-fg)]",
840
+ "hover:[--btn-hover-fg:var(--hero-cta-primary-hover-fg)]",
841
+ ].join(" "),
842
+ }}
843
+ cta2={{
844
+ label: "View features",
845
+ href: "#features",
846
+ variant: "outline",
847
+ size: "lg",
848
+ className: [
849
+ "border px-7 py-3 text-sm font-semibold shadow-sm dark:shadow-black/20",
850
+ "[--btn-bg:var(--hero-cta-secondary-bg)]",
851
+ "[--btn-fg:var(--hero-cta-secondary-fg)]",
852
+ "[--btn-border:var(--hero-cta-secondary-border)]",
853
+ "hover:[--btn-hover-bg:var(--hero-cta-secondary-hover-bg)]",
854
+ "hover:[--btn-hover-fg:var(--hero-cta-secondary-hover-fg)]",
855
+ ].join(" "),
856
+ }}
857
+ stage={{
858
+ scenarios,
859
+ initialScenarioIndex: 0,
860
+ className: "mt-0",
861
+ }}
862
+ section={{
863
+ className: "px-6 py-10 sm:px-8 lg:px-10 lg:py-12",
864
+ }}
865
+ container={{
866
+ className: "relative z-10 max-w-7xl",
867
+ }}
868
+ textContainer={{
869
+ className: "max-w-3xl pt-1 lg:pl-4 lg:pt-0",
870
+ }}
871
+ demoContainer={{
872
+ className:
873
+ "relative min-h-[32rem] w-full max-w-full lg:px-4 lg:h-[clamp(30rem,calc(100svh-7rem),42rem)] lg:min-h-0",
874
+ }}
875
+ buttonsContainer={{
876
+ className: "mt-4 flex-col items-start sm:flex-row sm:items-center",
877
+ }}
878
+ demoBelowText
879
+ ariaLabel="AI coding agent hero section"
880
+ />
881
+ </div>
882
+ );
883
+ }