nextworks 0.2.0-alpha.19 → 0.2.0-alpha.20
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 +2 -3
- package/dist/cli_manifests/blocks_manifest.json +2 -20
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_QUICKSTART.md +0 -2
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_README.md +0 -2
- package/dist/kits/blocks/app/templates/gallery/page.tsx +1 -333
- package/dist/kits/blocks/package-deps.json +3 -3
- package/package.json +1 -1
- package/dist/kits/blocks/app/templates/aiworkflow/PresetThemeVars.tsx +0 -1
- package/dist/kits/blocks/app/templates/aiworkflow/README.md +0 -48
- package/dist/kits/blocks/app/templates/aiworkflow/components/CTA.tsx +0 -44
- package/dist/kits/blocks/app/templates/aiworkflow/components/Contact.tsx +0 -104
- package/dist/kits/blocks/app/templates/aiworkflow/components/FAQ.tsx +0 -67
- package/dist/kits/blocks/app/templates/aiworkflow/components/FeatureMockups.tsx +0 -562
- package/dist/kits/blocks/app/templates/aiworkflow/components/Features.tsx +0 -67
- package/dist/kits/blocks/app/templates/aiworkflow/components/Footer.tsx +0 -118
- package/dist/kits/blocks/app/templates/aiworkflow/components/Hero.tsx +0 -883
- package/dist/kits/blocks/app/templates/aiworkflow/components/Navbar.tsx +0 -91
- package/dist/kits/blocks/app/templates/aiworkflow/components/Pricing.tsx +0 -91
- package/dist/kits/blocks/app/templates/aiworkflow/components/ProcessTimeline.tsx +0 -102
- package/dist/kits/blocks/app/templates/aiworkflow/components/Testimonials.tsx +0 -60
- package/dist/kits/blocks/app/templates/aiworkflow/components/TrustBadges.tsx +0 -62
- package/dist/kits/blocks/app/templates/aiworkflow/page.tsx +0 -43
- package/dist/kits/blocks/app/templates/aiworkflow/themes/animation.tsx +0 -151
- package/dist/kits/blocks/app/templates/aiworkflow/themes/default.tsx +0 -158
- package/dist/kits/blocks/app/templates/aiworkflow/themes/test.tsx +0 -163
- package/dist/kits/blocks/public/placeholders/aiworkflow/live.svg +0 -92
- package/dist/kits/blocks/public/placeholders/aiworkflow/review.svg +0 -80
- package/dist/kits/blocks/public/placeholders/aiworkflow/task.svg +0 -71
package/README.md
CHANGED
|
@@ -200,9 +200,8 @@ This copies:
|
|
|
200
200
|
After this step you should be able to start your dev server and visit:
|
|
201
201
|
|
|
202
202
|
- `/` (if wired as the home page), or
|
|
203
|
-
- `/templates/productlaunch`, `/templates/saasdashboard`, `/templates/digitalagency`, `/templates/
|
|
203
|
+
- `/templates/productlaunch`, `/templates/saasdashboard`, `/templates/digitalagency`, `/templates/gallery`
|
|
204
204
|
|
|
205
|
-
The current **AI Workflow** template ships with an **AI coding agent** story. It is intended to be adapted for other AI workflow/product stories as more variants are added.
|
|
206
205
|
|
|
207
206
|
---
|
|
208
207
|
|
|
@@ -251,9 +250,9 @@ You can add a short “Nextworks setup” section to your app README:
|
|
|
251
250
|
- `/templates/productlaunch`
|
|
252
251
|
- `/templates/saasdashboard`
|
|
253
252
|
- `/templates/digitalagency`
|
|
254
|
-
- `/templates/aiworkflow`
|
|
255
253
|
- `/templates/gallery`
|
|
256
254
|
|
|
255
|
+
|
|
257
256
|
Template files live at:
|
|
258
257
|
- App Router: `app/templates/<template>/**`
|
|
259
258
|
- Pages Router:
|
|
@@ -136,28 +136,10 @@
|
|
|
136
136
|
"app/templates/digitalagency/components/Team.tsx",
|
|
137
137
|
"app/templates/digitalagency/components/Testimonials.tsx",
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
"app/templates/gallery/page.tsx",
|
|
140
140
|
"app/templates/gallery/PresetThemeVars.tsx",
|
|
141
|
-
|
|
142
|
-
"app/templates/aiworkflow/page.tsx",
|
|
143
|
-
"app/templates/aiworkflow/PresetThemeVars.tsx",
|
|
144
|
-
"app/templates/aiworkflow/README.md",
|
|
145
|
-
"app/templates/aiworkflow/components/Contact.tsx",
|
|
146
|
-
"app/templates/aiworkflow/components/CTA.tsx",
|
|
147
|
-
"app/templates/aiworkflow/components/FAQ.tsx",
|
|
148
|
-
"app/templates/aiworkflow/components/Features.tsx",
|
|
149
|
-
"app/templates/aiworkflow/components/Footer.tsx",
|
|
150
|
-
"app/templates/aiworkflow/components/Hero.tsx",
|
|
151
|
-
"app/templates/aiworkflow/components/Navbar.tsx",
|
|
152
|
-
"app/templates/aiworkflow/components/Pricing.tsx",
|
|
153
|
-
"app/templates/aiworkflow/components/ProcessTimeline.tsx",
|
|
154
|
-
"app/templates/aiworkflow/components/Testimonials.tsx",
|
|
155
|
-
"app/templates/aiworkflow/components/TrustBadges.tsx",
|
|
156
|
-
"app/templates/aiworkflow/themes/default.tsx",
|
|
157
|
-
"public/placeholders/aiworkflow/live.svg",
|
|
158
|
-
"public/placeholders/aiworkflow/review.svg",
|
|
159
|
-
"public/placeholders/aiworkflow/task.svg",
|
|
160
141
|
"public/placeholders/gallery/hero-pexels-broken-9945014.avif",
|
|
142
|
+
|
|
161
143
|
"public/placeholders/gallery/pexels-googledeepmind-25626431.jpg",
|
|
162
144
|
"public/placeholders/gallery/pexels-googledeepmind-25626432.jpg",
|
|
163
145
|
"public/placeholders/gallery/pexels-googledeepmind-25626434.jpg",
|
|
@@ -35,10 +35,8 @@ Then visit:
|
|
|
35
35
|
- `http://localhost:3000/templates/productlaunch`
|
|
36
36
|
- `http://localhost:3000/templates/saasdashboard`
|
|
37
37
|
- `http://localhost:3000/templates/digitalagency`
|
|
38
|
-
- `http://localhost:3000/templates/aiworkflow`
|
|
39
38
|
- `http://localhost:3000/templates/gallery`
|
|
40
39
|
|
|
41
|
-
The current **AI Workflow** template ships with an **AI coding agent** story, but you can adapt it for other AI workflow/product stories.
|
|
42
40
|
|
|
43
41
|
If those load and look styled, you’re in good shape.
|
|
44
42
|
|
|
@@ -56,10 +56,8 @@ Blocks supports these install shapes:
|
|
|
56
56
|
- `/templates/productlaunch`
|
|
57
57
|
- `/templates/saasdashboard`
|
|
58
58
|
- `/templates/digitalagency`
|
|
59
|
-
- `/templates/aiworkflow`
|
|
60
59
|
- `/templates/gallery`
|
|
61
60
|
|
|
62
|
-
The current **AI Workflow** template ships with an **AI coding agent** story, but the structure is intended to be reusable for other AI workflow/product stories too.
|
|
63
61
|
|
|
64
62
|
---
|
|
65
63
|
|
|
@@ -6,7 +6,6 @@ import { CTA } from "@/components/sections/CTA";
|
|
|
6
6
|
import { FAQ } from "@/components/sections/FAQ";
|
|
7
7
|
import { Features } from "@/components/sections/Features";
|
|
8
8
|
import { Footer } from "@/components/sections/Footer";
|
|
9
|
-
import { HeroProductDemo } from "@/components/sections/HeroProductDemo";
|
|
10
9
|
import { HeroMotion } from "@/components/sections/HeroMotion";
|
|
11
10
|
import { HeroOverlay } from "@/components/sections/HeroOverlay";
|
|
12
11
|
import { HeroSplit } from "@/components/sections/HeroSplit";
|
|
@@ -56,255 +55,7 @@ export default function Gallery() {
|
|
|
56
55
|
},
|
|
57
56
|
];
|
|
58
57
|
|
|
59
|
-
|
|
60
|
-
HeroProductDemoProps["stage"]
|
|
61
|
-
>["scenarios"] = [
|
|
62
|
-
{
|
|
63
|
-
key: "gallery-product-demo",
|
|
64
|
-
label: "Workflow overview",
|
|
65
|
-
description:
|
|
66
|
-
"An AI-powered coding agent that plans, edits, and verifies changes across your entire codebase — without breaking your flow.",
|
|
67
|
-
activeWindow: "workflowStudio",
|
|
68
|
-
playback: {
|
|
69
|
-
workflowStudio: {
|
|
70
|
-
playbackStepDurationsMs: [820, 920, 1240, 1100, 960, 840, 1560],
|
|
71
|
-
playbackResetDelayMs: 2200,
|
|
72
|
-
},
|
|
73
|
-
runConsole: {
|
|
74
|
-
playbackStepDurationsMs: [1080, 1320, 920, 780, 700, 620, 1240],
|
|
75
|
-
playbackResetDelayMs: 2200,
|
|
76
|
-
playbackStepEntryIndices: [0, 0, 1, 1, 2, 2, 2, 3, 3],
|
|
77
|
-
playbackStepVisibleLineCounts: [2, 2, 3, 4, 6, 8, 10, 12, 12],
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
taskList: {
|
|
81
|
-
window: {
|
|
82
|
-
key: "taskList",
|
|
83
|
-
title: "Queues",
|
|
84
|
-
subtitle: "Active tasks",
|
|
85
|
-
status: { label: "Ready", tone: "info" },
|
|
86
|
-
},
|
|
87
|
-
title: "Task queues",
|
|
88
|
-
subtitle: "Switch between in-progress agent runs.",
|
|
89
|
-
activeItemId: "gallery-product-demo",
|
|
90
|
-
items: [
|
|
91
|
-
{
|
|
92
|
-
id: "gallery-product-demo",
|
|
93
|
-
title: "Refactor auth module",
|
|
94
|
-
description:
|
|
95
|
-
"Extract token logic into a dedicated service, add refresh handling, and update all call sites.",
|
|
96
|
-
meta: "in progress · 4 files",
|
|
97
|
-
},
|
|
98
|
-
],
|
|
99
|
-
},
|
|
100
|
-
workflowStudio: {
|
|
101
|
-
window: {
|
|
102
|
-
key: "workflowStudio",
|
|
103
|
-
title: "Agent console",
|
|
104
|
-
subtitle: "Live run",
|
|
105
|
-
status: { label: "Running", tone: "info" },
|
|
106
|
-
},
|
|
107
|
-
title: "Refactoring auth module",
|
|
108
|
-
subtitle:
|
|
109
|
-
"The agent reads existing logic, plans the extraction, and applies changes across all affected files.",
|
|
110
|
-
activeNodeId: "polish-layout",
|
|
111
|
-
transcript: [
|
|
112
|
-
{ id: "gallery-title", kind: "title", text: "Refactor auth module" },
|
|
113
|
-
{
|
|
114
|
-
id: "gallery-prompt",
|
|
115
|
-
kind: "prompt",
|
|
116
|
-
text: "Extract token handling into an AuthService class, add silent refresh on 401, and update every call site.",
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
id: "gallery-read-1",
|
|
120
|
-
kind: "activity",
|
|
121
|
-
text: "Read auth/session.ts and api/client.ts",
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
id: "gallery-read-2",
|
|
125
|
-
kind: "activity",
|
|
126
|
-
text: "Scan for token usage across 12 files",
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
id: "gallery-file-1",
|
|
130
|
-
kind: "file",
|
|
131
|
-
path: "src/services/auth-service.ts",
|
|
132
|
-
text: "src/services/auth-service.ts",
|
|
133
|
-
added: 74,
|
|
134
|
-
removed: 0,
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
id: "gallery-summary",
|
|
138
|
-
kind: "message",
|
|
139
|
-
text: "Done. Token logic is centralised in AuthService and silent refresh is active on every API call.",
|
|
140
|
-
},
|
|
141
|
-
],
|
|
142
|
-
composer: {
|
|
143
|
-
placeholder: "Describe your next change...",
|
|
144
|
-
modeLabel: "Agent",
|
|
145
|
-
modelLabel: "Sonnet",
|
|
146
|
-
},
|
|
147
|
-
highlights: [
|
|
148
|
-
{ id: "read-copy", label: "Read codebase", tone: "info" },
|
|
149
|
-
{ id: "polish-layout", label: "Apply changes", tone: "accent" },
|
|
150
|
-
],
|
|
151
|
-
nodes: [
|
|
152
|
-
{
|
|
153
|
-
id: "read-copy",
|
|
154
|
-
label: "Read existing auth logic",
|
|
155
|
-
description:
|
|
156
|
-
"Parse session handling and identify all token read/write paths.",
|
|
157
|
-
type: "Read",
|
|
158
|
-
status: "success",
|
|
159
|
-
metadata: "auth/session.ts · api/client.ts",
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
id: "layout-shell",
|
|
163
|
-
label: "Plan the extraction",
|
|
164
|
-
description:
|
|
165
|
-
"Decide class boundaries and map which call sites need updating.",
|
|
166
|
-
type: "Analyze",
|
|
167
|
-
status: "success",
|
|
168
|
-
metadata: "12 files affected",
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
id: "polish-layout",
|
|
172
|
-
label: "Write AuthService",
|
|
173
|
-
description:
|
|
174
|
-
"Create the service class, move token storage, and add the 401 refresh interceptor.",
|
|
175
|
-
type: "Edit",
|
|
176
|
-
status: "info",
|
|
177
|
-
active: true,
|
|
178
|
-
emphasized: true,
|
|
179
|
-
metadata: "src/services/auth-service.ts",
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
id: "review-story",
|
|
183
|
-
label: "Update call sites",
|
|
184
|
-
description:
|
|
185
|
-
"Replace direct token access with AuthService across all affected files and verify types.",
|
|
186
|
-
type: "Verify",
|
|
187
|
-
status: "neutral",
|
|
188
|
-
metadata: "final pass",
|
|
189
|
-
},
|
|
190
|
-
],
|
|
191
|
-
},
|
|
192
|
-
runConsole: {
|
|
193
|
-
window: {
|
|
194
|
-
key: "runConsole",
|
|
195
|
-
title: "Console",
|
|
196
|
-
subtitle: "Live output",
|
|
197
|
-
status: { label: "Writing", tone: "info" },
|
|
198
|
-
},
|
|
199
|
-
title: "src/services/auth-service.ts",
|
|
200
|
-
subtitle:
|
|
201
|
-
"New file — token logic extracted from session.ts and api/client.ts.",
|
|
202
|
-
statusLabel: "Writing AuthService",
|
|
203
|
-
progressLabel: "74 lines added",
|
|
204
|
-
progressPercent: 64,
|
|
205
|
-
activeEntryId: "gallery-diff-3",
|
|
206
|
-
editorTabLabel: "auth-service.ts",
|
|
207
|
-
editorLanguage: "TypeScript",
|
|
208
|
-
editorSummary:
|
|
209
|
-
"Create AuthService with token storage, silent refresh, and a fetch interceptor.",
|
|
210
|
-
entries: [
|
|
211
|
-
{
|
|
212
|
-
id: "gallery-diff-1",
|
|
213
|
-
message: "Read auth/session.ts and mapped token access patterns",
|
|
214
|
-
timestamp: "10:48",
|
|
215
|
-
source: "agent",
|
|
216
|
-
status: "success",
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
id: "gallery-diff-2",
|
|
220
|
-
message: "Identified 12 call sites that reference tokens directly",
|
|
221
|
-
timestamp: "10:49",
|
|
222
|
-
source: "analysis",
|
|
223
|
-
status: "success",
|
|
224
|
-
detail:
|
|
225
|
-
"Centralising access in AuthService will eliminate all direct imports.",
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
id: "gallery-diff-3",
|
|
229
|
-
message: "Created AuthService with refresh interceptor",
|
|
230
|
-
timestamp: "10:49",
|
|
231
|
-
source: "editor",
|
|
232
|
-
status: "info",
|
|
233
|
-
highlighted: true,
|
|
234
|
-
lineNumber: "34",
|
|
235
|
-
code: [
|
|
236
|
-
" export class AuthService {",
|
|
237
|
-
" private static token: string | null = null;",
|
|
238
|
-
" ",
|
|
239
|
-
"+ static async getToken(): Promise<string | null> {",
|
|
240
|
-
"+ if (!this.token) this.token = await storage.get('auth_token');",
|
|
241
|
-
"+ return this.token;",
|
|
242
|
-
"+ }",
|
|
243
|
-
"+ ",
|
|
244
|
-
"+ static async refreshIfExpired(): Promise<void> {",
|
|
245
|
-
"+ const exp = parseExpiry(this.token);",
|
|
246
|
-
"+ if (exp && exp < Date.now() + 60_000) {",
|
|
247
|
-
"+ this.token = await api.post('/auth/refresh');",
|
|
248
|
-
"+ }",
|
|
249
|
-
"+ }",
|
|
250
|
-
],
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
id: "gallery-diff-4",
|
|
254
|
-
message: "Queued call-site updates across 12 files",
|
|
255
|
-
timestamp: "10:50",
|
|
256
|
-
source: "preview",
|
|
257
|
-
status: "neutral",
|
|
258
|
-
},
|
|
259
|
-
],
|
|
260
|
-
metrics: [
|
|
261
|
-
{ id: "gm1", label: "Files", value: "1", tone: "success" },
|
|
262
|
-
{ id: "gm2", label: "Lines added", value: "74", tone: "info" },
|
|
263
|
-
{ id: "gm3", label: "Type errors", value: "0", tone: "success" },
|
|
264
|
-
],
|
|
265
|
-
highlights: [],
|
|
266
|
-
},
|
|
267
|
-
approvalInbox: {
|
|
268
|
-
window: {
|
|
269
|
-
key: "approvalInbox",
|
|
270
|
-
title: "Hidden",
|
|
271
|
-
},
|
|
272
|
-
items: [],
|
|
273
|
-
},
|
|
274
|
-
knowledgePanel: {
|
|
275
|
-
window: {
|
|
276
|
-
key: "knowledgePanel",
|
|
277
|
-
title: "Knowledge",
|
|
278
|
-
subtitle: "Context",
|
|
279
|
-
status: { label: "Ready", tone: "success" },
|
|
280
|
-
},
|
|
281
|
-
title: "Auth codebase context",
|
|
282
|
-
subtitle: "Relevant files and patterns surfaced for this task.",
|
|
283
|
-
query: "AuthService token refresh",
|
|
284
|
-
summary:
|
|
285
|
-
"Token storage is currently split between session.ts and api/client.ts. Centralising in AuthService removes 3 duplicate patterns and enables a single refresh intercept point.",
|
|
286
|
-
snippets: [
|
|
287
|
-
{
|
|
288
|
-
id: "gallery-snippet",
|
|
289
|
-
title: "auth/session.ts — token storage",
|
|
290
|
-
excerptLabel: "Current implementation",
|
|
291
|
-
confidence: "12 call sites",
|
|
292
|
-
highlighted: true,
|
|
293
|
-
content:
|
|
294
|
-
"getToken(): string | null { return localStorage.getItem('auth_token'); }\nsetToken(t: string): void { localStorage.setItem('auth_token', t); }\nclearToken(): void { localStorage.removeItem('auth_token'); }",
|
|
295
|
-
tags: ["auth", "token", "session"],
|
|
296
|
-
},
|
|
297
|
-
],
|
|
298
|
-
highlights: [
|
|
299
|
-
{ id: "gallery-snippet", label: "Token pattern", tone: "success" },
|
|
300
|
-
],
|
|
301
|
-
},
|
|
302
|
-
highlights: [
|
|
303
|
-
{ id: "polish-layout", label: "AuthService created", tone: "accent" },
|
|
304
|
-
{ id: "gallery-diff-3", label: "Refresh interceptor", tone: "info" },
|
|
305
|
-
],
|
|
306
|
-
},
|
|
307
|
-
];
|
|
58
|
+
|
|
308
59
|
|
|
309
60
|
const BrandNode = (
|
|
310
61
|
<>
|
|
@@ -354,89 +105,6 @@ export default function Gallery() {
|
|
|
354
105
|
/>
|
|
355
106
|
{/* Hero Sections */}
|
|
356
107
|
<div id="hero-sections" className="scroll-mt-16">
|
|
357
|
-
<div id="hero-product-demo" className="scroll-mt-16">
|
|
358
|
-
<div className="relative pt-0">
|
|
359
|
-
<HeroProductDemo
|
|
360
|
-
className="bg-transparent"
|
|
361
|
-
heading={{
|
|
362
|
-
text: "Ship faster with an agent that knows your codebase.",
|
|
363
|
-
className:
|
|
364
|
-
"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",
|
|
365
|
-
}}
|
|
366
|
-
subheading={{
|
|
367
|
-
text: "Describe the change you need. The agent reads, plans, edits, and verifies — across every affected file, in one run.",
|
|
368
|
-
className:
|
|
369
|
-
"mt-3 max-w-2xl text-left font-inter text-sm leading-6 text-[var(--subheading-fg)] sm:text-base",
|
|
370
|
-
}}
|
|
371
|
-
cta1={{
|
|
372
|
-
label: "Start for free",
|
|
373
|
-
href: "#features",
|
|
374
|
-
variant: "default",
|
|
375
|
-
size: "lg",
|
|
376
|
-
className:
|
|
377
|
-
// "ml-4 px-7 py-3 text-sm font-semibold shadow-lg shadow-black/10 dark:shadow-black/30 " +
|
|
378
|
-
// "!bg-[var(--hero-cta-primary-bg)] !text-[var(--hero-cta-primary-fg)] " +
|
|
379
|
-
// "hover:!bg-[var(--hero-cta-primary-hover-bg)] hover:!text-[var(--hero-cta-primary-hover-fg)] " +
|
|
380
|
-
// "active:!bg-[var(--hero-cta-primary-bg)] active:!text-[var(--hero-cta-primary-fg)] " +
|
|
381
|
-
// "visited:!bg-[var(--hero-cta-primary-bg)] visited:!text-[var(--hero-cta-primary-fg)] " +
|
|
382
|
-
// "dark:!bg-[var(--hero-cta-primary-bg)] dark:!text-[var(--hero-cta-primary-fg)] " +
|
|
383
|
-
// "dark:hover:!bg-[var(--hero-cta-secondary-hover-bg)] dark:hover:!text-[var(--hero-cta-primary-hover-fg)] " +
|
|
384
|
-
// "dark:active:!bg-[var(--hero-cta-primary-bg)] dark:active:!text-[var(--hero-cta-primary-fg)] " +
|
|
385
|
-
// "dark:visited:!bg-[var(--hero-cta-primary-bg)] dark:visited:!text-[var(--hero-cta-primary-fg)]",
|
|
386
|
-
"ml-4 border border-transparent px-7 py-3 text-sm font-semibold shadow-lg shadow-black/10 dark:shadow-black/30 " +
|
|
387
|
-
"!bg-[var(--hero-cta-primary-bg)] !text-[var(--hero-cta-primary-fg)] " +
|
|
388
|
-
"hover:!bg-[var(--hero-cta-primary-hover-bg)] hover:!text-[var(--hero-cta-primary-hover-fg)] " +
|
|
389
|
-
"active:!bg-[var(--hero-cta-primary-bg)] active:!text-[var(--hero-cta-primary-fg)] " +
|
|
390
|
-
"visited:!bg-[var(--hero-cta-primary-bg)] visited:!text-[var(--hero-cta-primary-fg)] " +
|
|
391
|
-
"dark:!bg-[var(--hero-cta-primary-bg)] dark:!text-[var(--hero-cta-primary-fg)] " +
|
|
392
|
-
"dark:hover:!bg-[var(--hero-cta-secondary-hover-bg)] dark:hover:!text-[var(--hero-cta-primary-hover-fg)] " +
|
|
393
|
-
"dark:hover:!border-white " +
|
|
394
|
-
"dark:active:!bg-[var(--hero-cta-primary-bg)] dark:active:!text-[var(--hero-cta-primary-fg)] " +
|
|
395
|
-
"dark:visited:!bg-[var(--hero-cta-primary-bg)] dark:visited:!text-[var(--hero-cta-primary-fg)]",
|
|
396
|
-
}}
|
|
397
|
-
cta2={{
|
|
398
|
-
label: "See it in action",
|
|
399
|
-
href: "#trust",
|
|
400
|
-
variant: "outline",
|
|
401
|
-
size: "lg",
|
|
402
|
-
className:
|
|
403
|
-
"border px-7 py-3 text-sm font-semibold shadow-sm dark:shadow-black/20 " +
|
|
404
|
-
"[--btn-bg:var(--hero-cta-secondary-bg)] " +
|
|
405
|
-
"[--btn-fg:var(--hero-cta-secondary-fg)] " +
|
|
406
|
-
"[--btn-border:var(--hero-cta-secondary-border)] " +
|
|
407
|
-
"hover:[--btn-hover-bg:var(--hero-cta-secondary-hover-bg)] " +
|
|
408
|
-
"hover:[--btn-hover-fg:var(--hero-cta-secondary-hover-fg)]",
|
|
409
|
-
}}
|
|
410
|
-
stage={{
|
|
411
|
-
scenarios: heroProductDemoScenarios,
|
|
412
|
-
initialScenarioIndex: 0,
|
|
413
|
-
className: "mt-0",
|
|
414
|
-
}}
|
|
415
|
-
section={{
|
|
416
|
-
className:
|
|
417
|
-
"px-6 pt-10 pb-6 sm:px-8 lg:px-10 lg:pt-12 lg:pb-8",
|
|
418
|
-
}}
|
|
419
|
-
container={{
|
|
420
|
-
className: "relative z-10 max-w-7xl gap-8",
|
|
421
|
-
}}
|
|
422
|
-
textContainer={{
|
|
423
|
-
className: "max-w-3xl pt-6 lg:pl-4 lg:pt-8",
|
|
424
|
-
}}
|
|
425
|
-
demoContainer={{
|
|
426
|
-
className:
|
|
427
|
-
"relative mt-2 min-h-[34rem] w-full max-w-full overflow-hidden rounded-[0.5rem] border border-border/0 bg-background/90 p-3 shadow-[0_24px_80px_-44px_rgba(15,23,42,0.24)] backdrop-blur-sm lg:h-[clamp(34rem,calc(100svh-8rem),46rem)] lg:min-h-0 lg:px-4",
|
|
428
|
-
// "relative mt-2 min-h-[34rem] w-full max-w-full overflow-hidden rounded-[2rem] border border-border/70 bg-background/90 p-3 shadow-[0_24px_80px_-44px_rgba(15,23,42,0.24)] backdrop-blur-sm lg:h-[clamp(34rem,calc(100svh-8rem),46rem)] lg:min-h-0 lg:px-4",
|
|
429
|
-
}}
|
|
430
|
-
buttonsContainer={{
|
|
431
|
-
className:
|
|
432
|
-
"mt-6 flex flex-col items-start gap-3 sm:flex-row sm:items-center [--btn-ring:var(--ring)]",
|
|
433
|
-
}}
|
|
434
|
-
demoBelowText
|
|
435
|
-
ariaLabel="Gallery product demo hero section"
|
|
436
|
-
/>
|
|
437
|
-
</div>
|
|
438
|
-
</div>
|
|
439
|
-
|
|
440
108
|
<div className="relative pt-4 sm:pt-5 mb-10">
|
|
441
109
|
<HeroOverlay
|
|
442
110
|
heading="Forecast The Next Move"
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
"next-themes": "^0.4.6",
|
|
14
14
|
"motion": "^12.24.10",
|
|
15
15
|
"sonner": "^2.0.7",
|
|
16
|
-
"@nextworks/blocks-core": "0.2.0-alpha.
|
|
17
|
-
"@nextworks/blocks-sections": "0.2.0-alpha.
|
|
18
|
-
"@nextworks/blocks-templates": "0.2.0-alpha.
|
|
16
|
+
"@nextworks/blocks-core": "0.2.0-alpha.20",
|
|
17
|
+
"@nextworks/blocks-sections": "0.2.0-alpha.20",
|
|
18
|
+
"@nextworks/blocks-templates": "0.2.0-alpha.20"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"tailwindcss": "^4.1.12"
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { PresetThemeVars } from "./themes/default";
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# AIWorkflow Template Theming
|
|
2
|
-
|
|
3
|
-
This template is preset-first. It wraps the page with `PresetThemeVars` and composes the route from template-local wrappers around shared Nextworks sections.
|
|
4
|
-
|
|
5
|
-
The current shipped story is an **AI coding agent**, but the template structure is intended to be reusable for other AI workflow/product stories as more variants are added.
|
|
6
|
-
|
|
7
|
-
## Where it’s wired
|
|
8
|
-
|
|
9
|
-
Template paths depend on your router:
|
|
10
|
-
|
|
11
|
-
- App Router:
|
|
12
|
-
- Wrapper: `app/templates/aiworkflow/PresetThemeVars.tsx`
|
|
13
|
-
- Page: `app/templates/aiworkflow/page.tsx`
|
|
14
|
-
- Pages Router:
|
|
15
|
-
- Wrapper: `components/templates/aiworkflow/PresetThemeVars.tsx`
|
|
16
|
-
- Page: `pages/templates/aiworkflow/index.tsx`
|
|
17
|
-
|
|
18
|
-
## Composition pattern
|
|
19
|
-
|
|
20
|
-
The page is composed from local wrappers such as:
|
|
21
|
-
|
|
22
|
-
- `components/Navbar.tsx`
|
|
23
|
-
- `components/Hero.tsx`
|
|
24
|
-
- `components/Features.tsx`
|
|
25
|
-
- `components/ProcessTimeline.tsx`
|
|
26
|
-
- `components/Testimonials.tsx`
|
|
27
|
-
- `components/Pricing.tsx`
|
|
28
|
-
- `components/FAQ.tsx`
|
|
29
|
-
- `components/CTA.tsx`
|
|
30
|
-
- `components/Contact.tsx`
|
|
31
|
-
- `components/Footer.tsx`
|
|
32
|
-
- `components/TrustBadges.tsx`
|
|
33
|
-
|
|
34
|
-
The local `Hero.tsx` wraps the shared `HeroProductDemo` section with AI workflow-specific copy, scenarios, CTAs, and styling.
|
|
35
|
-
|
|
36
|
-
## Core variables
|
|
37
|
-
|
|
38
|
-
- Buttons: `--btn-bg`, `--btn-fg`, `--btn-hover-bg`, `--btn-hover-fg`, `--btn-border`, `--btn-ring`
|
|
39
|
-
- Inputs/Textareas: `--input-bg`, `--input-fg`, `--input-placeholder`, `--input-border`, `--input-focus-ring`, `--input-ring-offset`
|
|
40
|
-
- Cards: `--card-bg`, `--card-fg`, `--card-title-fg`, `--card-muted-fg`, `--card-border`, `--card-shadow`
|
|
41
|
-
- Badges/Chips: `--badge-bg`, `--badge-fg`, `--badge-border`, active: `--badge-active-*`
|
|
42
|
-
- Headings: `--heading-fg`, `--subheading-fg`, `--description-fg`
|
|
43
|
-
- Footer: `--footer-bg`, `--footer-fg`, `--footer-heading-fg`, `--footer-link-fg`, `--footer-link-hover-fg`, `--footer-link-hover-bg`, `--footer-muted-fg`, `--footer-border`
|
|
44
|
-
- Table: `--table-fg`, `--table-muted-fg`, `--table-head-fg`, `--table-border`, `--table-row-hover-bg`
|
|
45
|
-
|
|
46
|
-
## Per-section overrides
|
|
47
|
-
|
|
48
|
-
Prefer the shared preset variables first. Only add local overrides when a section needs a distinct accent or contrast treatment.
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { CTA as SharedCTA } from "@/components/sections/CTA";
|
|
4
|
-
|
|
5
|
-
export function CTA() {
|
|
6
|
-
return (
|
|
7
|
-
<SharedCTA
|
|
8
|
-
section={{
|
|
9
|
-
className:
|
|
10
|
-
"bg-[var(--cta-section-bg)] px-6 py-16 [--cta-heading-fg:theme(colors.slate.950)] dark:[--cta-heading-fg:theme(colors.white)] [--cta-subheading-fg:theme(colors.slate.600)] dark:[--cta-subheading-fg:rgba(255,255,255,0.82)] [--cta-description-fg:theme(colors.slate.700)] dark:[--cta-description-fg:rgba(255,255,255,0.74)]",
|
|
11
|
-
}}
|
|
12
|
-
container={{
|
|
13
|
-
className:
|
|
14
|
-
"flex min-h-[22rem] w-full flex-col items-center justify-center px-6 py-16 text-center",
|
|
15
|
-
}}
|
|
16
|
-
headingText={{
|
|
17
|
-
text: "Ship code changes with an agent in the loop.",
|
|
18
|
-
className:
|
|
19
|
-
"font-outfit text-3xl font-semibold leading-tight text-[var(--cta-heading-fg)] md:text-4xl lg:text-5xl",
|
|
20
|
-
}}
|
|
21
|
-
subheadingText={{
|
|
22
|
-
text: "Move from issue to patch to preview without leaving one workspace.",
|
|
23
|
-
className:
|
|
24
|
-
"mx-auto mt-4 max-w-2xl font-inter text-base leading-7 text-[var(--cta-subheading-fg)] md:text-lg",
|
|
25
|
-
}}
|
|
26
|
-
actionsWrapper={{ className: "mt-8 flex flex-col gap-3 sm:flex-row" }}
|
|
27
|
-
ctaButton={{ label: "Book a coding demo", href: "#contact" }}
|
|
28
|
-
ctaButtonStyle={{
|
|
29
|
-
variant: "default",
|
|
30
|
-
size: "lg",
|
|
31
|
-
className:
|
|
32
|
-
"font-inter font-semibold [--btn-bg:var(--cta-primary-bg)] [--btn-fg:var(--cta-primary-fg)] [--btn-border:var(--cta-primary-border)] hover:[--btn-hover-bg:var(--cta-primary-hover-bg)] hover:[--btn-hover-fg:var(--cta-primary-hover-fg)]",
|
|
33
|
-
}}
|
|
34
|
-
secondaryButton={{ label: "Review pricing", href: "#pricing" }}
|
|
35
|
-
secondaryButtonStyle={{
|
|
36
|
-
variant: "outline",
|
|
37
|
-
size: "lg",
|
|
38
|
-
className:
|
|
39
|
-
"border [--btn-bg:var(--cta-secondary-bg)] [--btn-fg:var(--cta-secondary-fg)] [--btn-border:var(--cta-secondary-border)] hover:[--btn-hover-bg:var(--cta-secondary-hover-bg)] hover:[--btn-hover-fg:var(--cta-secondary-hover-fg)]",
|
|
40
|
-
}}
|
|
41
|
-
ariaLabel="AI coding agent call to action"
|
|
42
|
-
/>
|
|
43
|
-
);
|
|
44
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import React from "react";
|
|
4
|
-
import {
|
|
5
|
-
Contact as SharedContact,
|
|
6
|
-
ContactField,
|
|
7
|
-
} from "@/components/sections/Contact";
|
|
8
|
-
|
|
9
|
-
const contactFields: ContactField[] = [
|
|
10
|
-
{
|
|
11
|
-
id: "name",
|
|
12
|
-
label: "Full name",
|
|
13
|
-
placeholder: "Avery Chen",
|
|
14
|
-
required: true,
|
|
15
|
-
type: "text",
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
id: "email",
|
|
19
|
-
label: "Work email",
|
|
20
|
-
placeholder: "avery@company.com",
|
|
21
|
-
required: true,
|
|
22
|
-
type: "email",
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
id: "company",
|
|
26
|
-
label: "Company",
|
|
27
|
-
placeholder: "Northstar Labs",
|
|
28
|
-
required: true,
|
|
29
|
-
type: "text",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: "workflow",
|
|
33
|
-
label: "Workflow to automate",
|
|
34
|
-
placeholder: "Bug fixes, refactors, releases, or repo cleanup…",
|
|
35
|
-
required: true,
|
|
36
|
-
type: "text",
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
id: "message",
|
|
40
|
-
label: "What should the workflow coordinate?",
|
|
41
|
-
placeholder:
|
|
42
|
-
"Tell us which files, checks, or handoffs are slowing the team down.",
|
|
43
|
-
required: true,
|
|
44
|
-
type: "textarea",
|
|
45
|
-
},
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
export function Contact() {
|
|
49
|
-
const handleFormSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
|
50
|
-
e.preventDefault();
|
|
51
|
-
const data = Object.fromEntries(new FormData(e.currentTarget).entries());
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
return (
|
|
55
|
-
<SharedContact
|
|
56
|
-
id="contact"
|
|
57
|
-
ariaLabel="AI coding agent contact section"
|
|
58
|
-
fields={contactFields}
|
|
59
|
-
contactHeaderText="Bring your messiest codebase issue."
|
|
60
|
-
contactSubHeaderText="We’ll map the reads, edits, checks, and reviews the agent should handle first."
|
|
61
|
-
className="w-full"
|
|
62
|
-
section={{
|
|
63
|
-
className: "bg-[var(--contact-section-bg)] px-6 py-16",
|
|
64
|
-
}}
|
|
65
|
-
container={{ className: "mx-auto max-w-4xl" }}
|
|
66
|
-
headerWrapper={{ className: "mb-8 text-center" }}
|
|
67
|
-
headerText={{
|
|
68
|
-
className:
|
|
69
|
-
"font-outfit text-3xl font-semibold !text-[var(--heading-fg)] md:text-4xl",
|
|
70
|
-
}}
|
|
71
|
-
subheaderText={{
|
|
72
|
-
className:
|
|
73
|
-
"mx-auto mt-3 max-w-2xl font-inter text-base leading-7 text-[var(--subheading-fg)]",
|
|
74
|
-
}}
|
|
75
|
-
form={{
|
|
76
|
-
className:
|
|
77
|
-
"rounded-2xl border border-[var(--card-border)] bg-[var(--card-bg)] p-6 shadow-[var(--card-shadow)] md:p-8",
|
|
78
|
-
}}
|
|
79
|
-
fieldsWrapper={{ className: "space-y-5" }}
|
|
80
|
-
field={{ className: "space-y-2" }}
|
|
81
|
-
label={{
|
|
82
|
-
className:
|
|
83
|
-
"block font-inter text-sm font-medium text-[var(--card-title-fg)]",
|
|
84
|
-
}}
|
|
85
|
-
input={{
|
|
86
|
-
className:
|
|
87
|
-
"w-full rounded-md border-[var(--input-border)] bg-[var(--input-bg)] p-3 font-inter text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-2 focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
|
|
88
|
-
}}
|
|
89
|
-
textarea={{
|
|
90
|
-
className:
|
|
91
|
-
"min-h-[130px] w-full resize-vertical rounded-md border-[var(--input-border)] bg-[var(--input-bg)] p-3 font-inter text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-2 focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
|
|
92
|
-
}}
|
|
93
|
-
submitButtonWrapper={{ className: "pt-2" }}
|
|
94
|
-
submitButtonStyle={{
|
|
95
|
-
variant: "default",
|
|
96
|
-
size: "lg",
|
|
97
|
-
className:
|
|
98
|
-
"w-full font-inter font-semibold [--btn-bg:var(--contact-submit-bg)] [--btn-fg:var(--contact-submit-fg)] [--btn-border:var(--contact-submit-border)] hover:[--btn-hover-bg:var(--contact-submit-hover-bg)] hover:[--btn-hover-fg:var(--contact-submit-hover-fg)]",
|
|
99
|
-
}}
|
|
100
|
-
submitButtonText="Book an agent demo"
|
|
101
|
-
onSubmit={handleFormSubmit}
|
|
102
|
-
/>
|
|
103
|
-
);
|
|
104
|
-
}
|