@vadimcomanescu/nadicode-design-system 2.0.9 → 4.0.1
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/.agents/skills/seed/SKILL.md +24 -14
- package/.agents/skills/seed/contract.md +19 -6
- package/.agents/skills/seed/recipes/agency-home.md +5 -5
- package/.agents/skills/seed/recipes/auth.md +3 -3
- package/.agents/skills/seed/recipes/blog-content.md +2 -2
- package/.agents/skills/seed/recipes/company-about.md +3 -3
- package/.agents/skills/seed/recipes/company-contact.md +3 -3
- package/.agents/skills/seed/recipes/digital-workers.md +3 -3
- package/.agents/skills/seed/recipes/marketing-landing.md +8 -8
- package/.agents/skills/seed/recipes/marketing-shell.md +4 -4
- package/.agents/skills/seed/recipes/navigation-shell.md +3 -2
- package/.agents/skills/seed/recipes/pricing.md +4 -4
- package/.agents/skills/seed/recipes/service-detail.md +3 -3
- package/.agents/skills/seed/references/blocks.md +5 -5
- package/.agents/skills/seed/references/components.md +2 -2
- package/.agents/skills/seed/references/nextjs.md +2 -2
- package/README.md +3 -3
- package/contracts/consumer-intent-map.json +1 -2
- package/contracts/release-governance-baseline.json +3 -37
- package/dist/catalog/catalog.d.ts +2220 -0
- package/dist/catalog/catalog.js +1913 -0
- package/dist/catalog/components.d.ts +201 -0
- package/dist/catalog/components.js +407 -0
- package/dist/catalog/types.d.ts +4 -0
- package/dist/catalog/types.js +1 -0
- package/dist/chunk-224KPIOG.js +60 -0
- package/dist/chunk-25BOZMXA.js +169 -0
- package/dist/chunk-32OLQ7FC.js +130 -0
- package/dist/chunk-3JJBJ4VR.js +47 -0
- package/dist/chunk-3U56FXYC.js +30 -0
- package/dist/chunk-4MWKE6F5.js +86 -0
- package/dist/chunk-6HGSU24S.js +94 -0
- package/dist/chunk-7IADIXDV.js +168 -0
- package/dist/chunk-7NS3VFD7.js +86 -0
- package/dist/chunk-ALA6OM7K.js +134 -0
- package/dist/chunk-AN5TW4AL.js +50 -0
- package/dist/chunk-AWZFQQGN.js +167 -0
- package/dist/chunk-BRCBJ3S4.js +42 -0
- package/dist/chunk-BRICSLHJ.js +30 -0
- package/dist/chunk-BYEHHZZN.js +115 -0
- package/dist/chunk-C33GUEDY.js +149 -0
- package/dist/chunk-CUDMDYKE.js +150 -0
- package/dist/chunk-CVTMWSNS.js +145 -0
- package/dist/chunk-DEZXWNYF.js +165 -0
- package/dist/chunk-DNJEVMDY.js +40 -0
- package/dist/chunk-DNJOBML6.js +66 -0
- package/dist/chunk-FTGFOK6T.js +69 -0
- package/dist/{chunk-7A2RXKGH.js → chunk-GJ557DGH.js} +1 -1
- package/dist/chunk-HFBJ6L6O.js +104 -0
- package/dist/chunk-HPTHS7SX.js +52 -0
- package/dist/chunk-K4U67BVG.js +175 -0
- package/dist/chunk-KNR3WB5C.js +147 -0
- package/dist/chunk-KQ7ZC6EM.js +66 -0
- package/dist/chunk-LGW7FVG5.js +83 -0
- package/dist/chunk-LK2L3C7D.js +72 -0
- package/dist/chunk-LP6ZZYOQ.js +36 -0
- package/dist/chunk-LV4P7WVM.js +54 -0
- package/dist/chunk-MGSGCARB.js +164 -0
- package/dist/chunk-N3YFYMNZ.js +73 -0
- package/dist/{chunk-DSMGCFMJ.js → chunk-POFFOUQW.js} +2 -5
- package/dist/chunk-Q5IYBNA7.js +56 -0
- package/dist/chunk-QJCE7NZF.js +85 -0
- package/dist/chunk-QW5II6YK.js +96 -0
- package/dist/chunk-RMGDDOCD.js +138 -0
- package/dist/chunk-RNCX4JIE.js +70 -0
- package/dist/chunk-RWCL5OPX.js +112 -0
- package/dist/chunk-S5OY2B63.js +28 -0
- package/dist/chunk-SIQNG72C.js +257 -0
- package/dist/chunk-SP7NIZFP.js +117 -0
- package/dist/chunk-SWRJWMGG.js +30 -0
- package/dist/chunk-TCQIJ3DO.js +85 -0
- package/dist/chunk-TPJ6JJ2F.js +290 -0
- package/dist/chunk-UR43ANYS.js +159 -0
- package/dist/chunk-VRGPG2YN.js +79 -0
- package/dist/chunk-WSBLCWY7.js +126 -0
- package/dist/chunk-XKKFSFYO.js +93 -0
- package/dist/chunk-XO7TBM47.js +32 -0
- package/dist/chunk-YDYDGG5K.js +132 -0
- package/dist/chunk-YMJOUYMT.js +171 -0
- package/dist/chunk-Z2WION42.js +32 -0
- package/dist/chunk-ZFKSVEYW.js +35 -0
- package/dist/components/blocks/AgentProfileGridBlock.js +8 -86
- package/dist/components/blocks/AgentRunOverviewBlock.js +8 -147
- package/dist/components/blocks/AgentWorkbenchBlock.js +15 -257
- package/dist/components/blocks/AudioVisualizerBlock.js +2 -50
- package/dist/components/blocks/AuthLayout.js +9 -73
- package/dist/components/blocks/BannerBlock.js +8 -66
- package/dist/components/blocks/BarChartBlock.js +5 -47
- package/dist/components/blocks/ChartBlock.js +7 -54
- package/dist/components/blocks/ChartCollectionBlock.js +11 -171
- package/dist/components/blocks/ChatLayout.js +12 -126
- package/dist/components/blocks/CreateBlock.js +9 -104
- package/dist/components/blocks/DataGridBlock.js +9 -117
- package/dist/components/blocks/DirectoryBlock.js +12 -85
- package/dist/components/blocks/FeatureGridBlock.js +6 -56
- package/dist/components/blocks/GalleryBlock.js +6 -69
- package/dist/components/blocks/HeroBlock.js +2 -2
- package/dist/components/blocks/HeroSectionBlock.js +10 -134
- package/dist/components/blocks/IntegrationsBlock.js +13 -94
- package/dist/components/blocks/InteractiveAreaChartBlock.js +5 -290
- package/dist/components/blocks/KanbanDemoBlock.js +8 -145
- package/dist/components/blocks/LogoCloud.js +4 -35
- package/dist/components/blocks/NavUser.js +5 -85
- package/dist/components/blocks/NotFoundBlock.js +8 -32
- package/dist/components/blocks/OnboardingBlock.js +7 -66
- package/dist/components/blocks/SettingsLayout.js +13 -86
- package/dist/components/blocks/SignUpBlock.js +8 -168
- package/dist/components/blocks/SolutionShowcaseBlock.js +11 -112
- package/dist/components/blocks/StatsBlock.js +6 -60
- package/dist/components/blocks/UsageDonutBlock.js +5 -79
- package/dist/components/blocks/WizardBlock.js +12 -93
- package/dist/components/blocks/user/InviteUserModal.js +10 -132
- package/dist/components/page-kits/AccountLockedPageKit.js +3 -40
- package/dist/components/page-kits/AgentsChatPageKit.js +11 -159
- package/dist/components/page-kits/AnalyticsPageKit.js +12 -150
- package/dist/components/page-kits/BlogContentPageKit.js +12 -167
- package/dist/components/page-kits/CheckoutPageKit.js +9 -83
- package/dist/components/page-kits/CompanySuitePageKit.js +9 -96
- package/dist/components/page-kits/DashboardPageKit.js +11 -149
- package/dist/components/page-kits/ErrorPageKit.js +5 -52
- package/dist/components/page-kits/KanbanBoardPageKit.js +7 -169
- package/dist/components/page-kits/LandingPageKit.js +12 -73
- package/dist/components/page-kits/LoginPageKit.js +3 -32
- package/dist/components/page-kits/OnboardingPageKit.js +6 -115
- package/dist/components/page-kits/PricingPageKit.js +12 -138
- package/dist/components/page-kits/ProfileSettingsPageKit.js +10 -164
- package/dist/components/page-kits/RecoveryPageKit.js +3 -42
- package/dist/components/page-kits/ResetPageKit.js +3 -36
- package/dist/components/page-kits/ServiceSuitePageKit.js +11 -176
- package/dist/components/page-kits/SignupPageKit.js +3 -30
- package/dist/components/page-kits/SuccessPageKit.js +4 -30
- package/dist/components/page-kits/TeamSettingsPageKit.js +9 -165
- package/dist/components/page-kits/TwoFactorPageKit.js +4 -28
- package/dist/components/page-kits/VerifyEmailPageKit.js +4 -30
- package/dist/components/page-kits/VoiceAgentsPageKit.js +13 -130
- package/dist/components/ui/AvatarUpload.js +1 -1
- package/dist/components/ui/CheckoutForm.js +5 -70
- package/dist/components/ui/MouseEffect.js +1 -1
- package/eslint-rules/nadicode/config.js +2 -0
- package/eslint-rules/nadicode/data/catalog-names.json +93 -0
- package/eslint-rules/nadicode/index.js +4 -0
- package/eslint-rules/nadicode/rules/__tests__/require-catalog-component.test.js +77 -0
- package/eslint-rules/nadicode/rules/__tests__/require-catalog-import.test.js +111 -0
- package/eslint-rules/nadicode/rules/require-catalog-component.js +79 -0
- package/eslint-rules/nadicode/rules/require-catalog-import.js +59 -0
- package/package.json +15 -358
- package/contracts/block-props-schemas.json +0 -2186
- package/contracts/component-props-schemas.json +0 -8322
- package/contracts/consumer-contract.json +0 -178
- package/contracts/page-kit-props-schemas.json +0 -1894
- package/contracts/public-surface-registry.json +0 -5822
- package/contracts/public-surface-registry.schema.json +0 -219
- package/contracts/spec-manifest.json +0 -46
- package/dist/catalog.json +0 -5221
|
@@ -0,0 +1,1913 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// src/catalog/catalog.ts
|
|
4
|
+
var validationCheckSchema = z.array(
|
|
5
|
+
z.object({
|
|
6
|
+
type: z.string(),
|
|
7
|
+
message: z.string(),
|
|
8
|
+
args: z.record(z.string(), z.unknown()).optional()
|
|
9
|
+
})
|
|
10
|
+
).nullable();
|
|
11
|
+
var validateOnSchema = z.enum(["change", "blur", "submit"]).nullable();
|
|
12
|
+
var navigationShellSchema = z.object({
|
|
13
|
+
workspaceName: z.string(),
|
|
14
|
+
navigationGroups: z.array(
|
|
15
|
+
z.object({
|
|
16
|
+
label: z.string(),
|
|
17
|
+
items: z.array(
|
|
18
|
+
z.object({
|
|
19
|
+
label: z.string(),
|
|
20
|
+
href: z.string(),
|
|
21
|
+
icon: z.string().nullable(),
|
|
22
|
+
badge: z.string().nullable()
|
|
23
|
+
})
|
|
24
|
+
)
|
|
25
|
+
})
|
|
26
|
+
),
|
|
27
|
+
activeHref: z.string().nullable(),
|
|
28
|
+
breadcrumbs: z.array(z.object({ label: z.string(), href: z.string().nullable() })).nullable()
|
|
29
|
+
});
|
|
30
|
+
var marketingShellSchema = z.object({
|
|
31
|
+
navigationItems: z.array(z.object({ name: z.string(), href: z.string() })),
|
|
32
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable(),
|
|
33
|
+
secondaryAction: z.object({ label: z.string(), href: z.string() }).nullable()
|
|
34
|
+
});
|
|
35
|
+
var chartConfigSchema = z.record(
|
|
36
|
+
z.string(),
|
|
37
|
+
z.object({
|
|
38
|
+
label: z.string(),
|
|
39
|
+
color: z.string().nullable()
|
|
40
|
+
})
|
|
41
|
+
).nullable();
|
|
42
|
+
var trendSchema = z.object({
|
|
43
|
+
value: z.number(),
|
|
44
|
+
direction: z.enum(["up", "down", "flat"]).nullable()
|
|
45
|
+
}).nullable();
|
|
46
|
+
var regionStateSchema = z.enum(["loading", "empty", "error", "has-data", "partial-data"]).nullable();
|
|
47
|
+
var seedComponentDefinitions = {
|
|
48
|
+
// =========================================================================
|
|
49
|
+
// Blocks (59 entries, alphabetical)
|
|
50
|
+
// =========================================================================
|
|
51
|
+
AccountLockedBlock: {
|
|
52
|
+
props: z.object({
|
|
53
|
+
reason: z.enum(["too_many_attempts", "suspicious_activity", "admin"]).nullable(),
|
|
54
|
+
unlockMinutes: z.number().nullable(),
|
|
55
|
+
title: z.string().nullable(),
|
|
56
|
+
description: z.string().nullable()
|
|
57
|
+
}),
|
|
58
|
+
events: ["contactSupport", "backToLogin"],
|
|
59
|
+
description: "Account locked notification with reason, countdown timer, and support/login actions."
|
|
60
|
+
},
|
|
61
|
+
ActivityFeedBlock: {
|
|
62
|
+
props: z.object({
|
|
63
|
+
title: z.string().nullable(),
|
|
64
|
+
activities: z.array(
|
|
65
|
+
z.object({
|
|
66
|
+
id: z.string(),
|
|
67
|
+
user: z.string(),
|
|
68
|
+
action: z.string(),
|
|
69
|
+
timestamp: z.string(),
|
|
70
|
+
avatar: z.string().nullable()
|
|
71
|
+
})
|
|
72
|
+
).nullable()
|
|
73
|
+
}),
|
|
74
|
+
description: "Chronological activity feed with user avatars, actions, and timestamps."
|
|
75
|
+
},
|
|
76
|
+
AgentConversationBlock: {
|
|
77
|
+
props: z.object({
|
|
78
|
+
messages: z.array(
|
|
79
|
+
z.object({
|
|
80
|
+
id: z.string(),
|
|
81
|
+
role: z.enum(["user", "assistant", "system"]),
|
|
82
|
+
content: z.string(),
|
|
83
|
+
timestamp: z.string().nullable(),
|
|
84
|
+
isThinking: z.boolean().nullable(),
|
|
85
|
+
reasoning: z.string().nullable(),
|
|
86
|
+
isStreaming: z.boolean().nullable(),
|
|
87
|
+
toolCalls: z.array(
|
|
88
|
+
z.object({
|
|
89
|
+
id: z.string(),
|
|
90
|
+
toolName: z.string(),
|
|
91
|
+
args: z.record(z.string(), z.unknown()).nullable(),
|
|
92
|
+
status: z.enum(["pending", "running", "complete", "error"]),
|
|
93
|
+
result: z.string().nullable(),
|
|
94
|
+
duration: z.number().nullable()
|
|
95
|
+
})
|
|
96
|
+
).nullable()
|
|
97
|
+
})
|
|
98
|
+
)
|
|
99
|
+
}),
|
|
100
|
+
description: "AI agent conversation thread with user/assistant messages, tool calls, thinking indicators, and streaming support."
|
|
101
|
+
},
|
|
102
|
+
AgentProfileGridBlock: {
|
|
103
|
+
props: z.object({
|
|
104
|
+
title: z.string().nullable(),
|
|
105
|
+
description: z.string().nullable(),
|
|
106
|
+
columns: z.union([z.literal(2), z.literal(3), z.literal(4)]).nullable(),
|
|
107
|
+
agents: z.array(
|
|
108
|
+
z.object({
|
|
109
|
+
name: z.string(),
|
|
110
|
+
role: z.string(),
|
|
111
|
+
description: z.string(),
|
|
112
|
+
capabilities: z.array(z.string()).nullable(),
|
|
113
|
+
status: z.enum(["active", "idle", "coming-soon"]).nullable(),
|
|
114
|
+
href: z.string().nullable(),
|
|
115
|
+
avatar: z.string()
|
|
116
|
+
})
|
|
117
|
+
).nullable()
|
|
118
|
+
}),
|
|
119
|
+
description: "Grid display of AI agent profiles with name, role, capabilities, and status indicators."
|
|
120
|
+
},
|
|
121
|
+
AgentRunOverviewBlock: {
|
|
122
|
+
props: z.object({
|
|
123
|
+
title: z.string().nullable(),
|
|
124
|
+
description: z.string().nullable(),
|
|
125
|
+
teamTitle: z.string().nullable(),
|
|
126
|
+
metricsTitle: z.string().nullable(),
|
|
127
|
+
contextTitle: z.string().nullable(),
|
|
128
|
+
workflow: z.object({
|
|
129
|
+
title: z.string().nullable(),
|
|
130
|
+
nodes: z.array(
|
|
131
|
+
z.object({
|
|
132
|
+
id: z.string(),
|
|
133
|
+
label: z.string(),
|
|
134
|
+
status: z.enum(["pending", "active", "done", "error"])
|
|
135
|
+
})
|
|
136
|
+
),
|
|
137
|
+
edges: z.array(
|
|
138
|
+
z.object({ from: z.string(), to: z.string(), label: z.string().nullable() })
|
|
139
|
+
)
|
|
140
|
+
}).nullable(),
|
|
141
|
+
agents: z.array(
|
|
142
|
+
z.object({
|
|
143
|
+
id: z.string(),
|
|
144
|
+
name: z.string(),
|
|
145
|
+
role: z.string(),
|
|
146
|
+
status: z.enum(["idle", "active", "complete", "error"]),
|
|
147
|
+
model: z.string().nullable(),
|
|
148
|
+
currentAction: z.string().nullable(),
|
|
149
|
+
tokenCount: z.number().nullable(),
|
|
150
|
+
cost: z.number().nullable(),
|
|
151
|
+
elapsedMs: z.number().nullable(),
|
|
152
|
+
stepsCompleted: z.number().nullable(),
|
|
153
|
+
stepsTotal: z.number().nullable()
|
|
154
|
+
})
|
|
155
|
+
).nullable(),
|
|
156
|
+
metrics: z.array(
|
|
157
|
+
z.object({
|
|
158
|
+
label: z.string(),
|
|
159
|
+
value: z.union([z.number(), z.string()]),
|
|
160
|
+
suffix: z.string().nullable()
|
|
161
|
+
})
|
|
162
|
+
).nullable(),
|
|
163
|
+
context: z.object({ used: z.number(), total: z.number() }).nullable()
|
|
164
|
+
}),
|
|
165
|
+
description: "Agent runtime overview with workflow graph, team panel, metrics, and context window usage."
|
|
166
|
+
},
|
|
167
|
+
AgentWorkbenchBlock: {
|
|
168
|
+
props: z.object({
|
|
169
|
+
title: z.string().nullable(),
|
|
170
|
+
description: z.string().nullable(),
|
|
171
|
+
threadTitle: z.string().nullable(),
|
|
172
|
+
workTitle: z.string().nullable(),
|
|
173
|
+
messages: z.array(
|
|
174
|
+
z.object({
|
|
175
|
+
id: z.string(),
|
|
176
|
+
role: z.enum(["user", "assistant"]),
|
|
177
|
+
content: z.string(),
|
|
178
|
+
timestamp: z.string().nullable(),
|
|
179
|
+
toolCalls: z.array(
|
|
180
|
+
z.object({
|
|
181
|
+
id: z.string(),
|
|
182
|
+
toolName: z.string(),
|
|
183
|
+
status: z.enum(["pending", "running", "complete", "error"])
|
|
184
|
+
})
|
|
185
|
+
).nullable()
|
|
186
|
+
})
|
|
187
|
+
).nullable(),
|
|
188
|
+
artifacts: z.array(
|
|
189
|
+
z.object({
|
|
190
|
+
id: z.string(),
|
|
191
|
+
type: z.enum(["code", "markdown", "table", "image"]),
|
|
192
|
+
title: z.string(),
|
|
193
|
+
content: z.string(),
|
|
194
|
+
language: z.string().nullable()
|
|
195
|
+
})
|
|
196
|
+
).nullable(),
|
|
197
|
+
diffs: z.array(
|
|
198
|
+
z.object({
|
|
199
|
+
id: z.string(),
|
|
200
|
+
filePath: z.string(),
|
|
201
|
+
language: z.string().nullable(),
|
|
202
|
+
hunks: z.array(
|
|
203
|
+
z.object({
|
|
204
|
+
changes: z.array(
|
|
205
|
+
z.object({
|
|
206
|
+
type: z.enum(["add", "remove", "context"]),
|
|
207
|
+
content: z.string(),
|
|
208
|
+
lineNumber: z.number().nullable()
|
|
209
|
+
})
|
|
210
|
+
)
|
|
211
|
+
})
|
|
212
|
+
)
|
|
213
|
+
})
|
|
214
|
+
).nullable(),
|
|
215
|
+
logs: z.array(
|
|
216
|
+
z.object({
|
|
217
|
+
text: z.string(),
|
|
218
|
+
type: z.enum(["stdin", "stdout", "stderr"]).nullable()
|
|
219
|
+
})
|
|
220
|
+
).nullable()
|
|
221
|
+
}),
|
|
222
|
+
events: ["composerChange", "composerSend"],
|
|
223
|
+
description: "Agent workbench with conversation thread, code artifacts, diffs, terminal logs, and composer input."
|
|
224
|
+
},
|
|
225
|
+
BannerBlock: {
|
|
226
|
+
props: z.object({
|
|
227
|
+
variant: z.enum(["info", "warning", "accent"]).nullable(),
|
|
228
|
+
dismissible: z.boolean().nullable()
|
|
229
|
+
}),
|
|
230
|
+
events: ["dismiss"],
|
|
231
|
+
slots: ["default"],
|
|
232
|
+
description: "Dismissible banner notification for info, warning, or accent messages.",
|
|
233
|
+
example: { variant: "info", dismissible: true }
|
|
234
|
+
},
|
|
235
|
+
BarChartBlock: {
|
|
236
|
+
props: z.object({
|
|
237
|
+
data: z.array(z.object({ name: z.string(), total: z.number(), prediction: z.number() })).nullable(),
|
|
238
|
+
config: chartConfigSchema,
|
|
239
|
+
title: z.string().nullable(),
|
|
240
|
+
description: z.string().nullable()
|
|
241
|
+
}),
|
|
242
|
+
description: "Vertical bar chart with configurable data series and chart configuration."
|
|
243
|
+
},
|
|
244
|
+
CallToActionBlock: {
|
|
245
|
+
props: z.object({
|
|
246
|
+
title: z.string().nullable(),
|
|
247
|
+
description: z.string().nullable(),
|
|
248
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable(),
|
|
249
|
+
secondaryAction: z.object({ label: z.string(), href: z.string() }).nullable()
|
|
250
|
+
}),
|
|
251
|
+
description: "Call-to-action section with headline, description, and primary/secondary action buttons.",
|
|
252
|
+
example: {
|
|
253
|
+
title: "Ready to get started?",
|
|
254
|
+
primaryAction: { label: "Start now", href: "/signup" }
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
ChangelogBlock: {
|
|
258
|
+
props: z.object({
|
|
259
|
+
title: z.string().nullable(),
|
|
260
|
+
entries: z.array(
|
|
261
|
+
z.object({
|
|
262
|
+
version: z.string(),
|
|
263
|
+
date: z.string(),
|
|
264
|
+
changes: z.array(
|
|
265
|
+
z.object({ type: z.enum(["added", "fixed", "changed"]), text: z.string() })
|
|
266
|
+
)
|
|
267
|
+
})
|
|
268
|
+
).nullable()
|
|
269
|
+
}),
|
|
270
|
+
description: "Changelog display with versioned entries and categorized changes."
|
|
271
|
+
},
|
|
272
|
+
ChartBlock: {
|
|
273
|
+
props: z.object({
|
|
274
|
+
data: z.array(
|
|
275
|
+
z.object({
|
|
276
|
+
month: z.string(),
|
|
277
|
+
desktop: z.number(),
|
|
278
|
+
mobile: z.number()
|
|
279
|
+
})
|
|
280
|
+
).nullable(),
|
|
281
|
+
config: chartConfigSchema,
|
|
282
|
+
title: z.string().nullable(),
|
|
283
|
+
description: z.string().nullable()
|
|
284
|
+
}),
|
|
285
|
+
description: "Line/area chart comparing desktop and mobile metrics over time."
|
|
286
|
+
},
|
|
287
|
+
ChartCollectionBlock: {
|
|
288
|
+
props: z.object({}),
|
|
289
|
+
description: "Pre-composed collection of multiple chart types displayed in a dashboard grid."
|
|
290
|
+
},
|
|
291
|
+
ComparisonBlock: {
|
|
292
|
+
props: z.object({
|
|
293
|
+
title: z.string().nullable(),
|
|
294
|
+
description: z.string().nullable(),
|
|
295
|
+
plans: z.array(
|
|
296
|
+
z.object({
|
|
297
|
+
name: z.string(),
|
|
298
|
+
featured: z.boolean().nullable(),
|
|
299
|
+
features: z.record(
|
|
300
|
+
z.string(),
|
|
301
|
+
z.union([z.boolean(), z.string()])
|
|
302
|
+
)
|
|
303
|
+
})
|
|
304
|
+
).nullable()
|
|
305
|
+
}),
|
|
306
|
+
description: "Feature comparison table across multiple plans with boolean and text feature values."
|
|
307
|
+
},
|
|
308
|
+
ContactBlock: {
|
|
309
|
+
props: z.object({
|
|
310
|
+
title: z.string().nullable(),
|
|
311
|
+
description: z.string().nullable(),
|
|
312
|
+
namePlaceholder: z.string().nullable(),
|
|
313
|
+
emailPlaceholder: z.string().nullable(),
|
|
314
|
+
messagePlaceholder: z.string().nullable(),
|
|
315
|
+
successTitle: z.string().nullable(),
|
|
316
|
+
submitLabel: z.string().nullable()
|
|
317
|
+
}),
|
|
318
|
+
events: ["submit"],
|
|
319
|
+
description: "Contact form with name, email, and message fields. Shows success state after submission.",
|
|
320
|
+
example: { title: "Get in touch", submitLabel: "Send message" }
|
|
321
|
+
},
|
|
322
|
+
CreateBlock: {
|
|
323
|
+
props: z.object({
|
|
324
|
+
title: z.string().nullable(),
|
|
325
|
+
description: z.string().nullable(),
|
|
326
|
+
submitLabel: z.string().nullable()
|
|
327
|
+
}),
|
|
328
|
+
events: ["submit"],
|
|
329
|
+
description: "Profile creation form with username, email, and bio fields."
|
|
330
|
+
},
|
|
331
|
+
DataGridBlock: {
|
|
332
|
+
props: z.object({
|
|
333
|
+
data: z.array(
|
|
334
|
+
z.object({
|
|
335
|
+
id: z.string(),
|
|
336
|
+
amount: z.number(),
|
|
337
|
+
status: z.enum([
|
|
338
|
+
"pending",
|
|
339
|
+
"processing",
|
|
340
|
+
"success",
|
|
341
|
+
"failed"
|
|
342
|
+
]),
|
|
343
|
+
email: z.string()
|
|
344
|
+
})
|
|
345
|
+
).nullable(),
|
|
346
|
+
title: z.string().nullable(),
|
|
347
|
+
description: z.string().nullable()
|
|
348
|
+
}),
|
|
349
|
+
description: "Data table with sortable columns, row selection, filtering, and pagination."
|
|
350
|
+
},
|
|
351
|
+
DirectoryBlock: {
|
|
352
|
+
props: z.object({
|
|
353
|
+
navItems: z.array(
|
|
354
|
+
z.object({
|
|
355
|
+
name: z.string(),
|
|
356
|
+
icon: z.string(),
|
|
357
|
+
isActive: z.boolean().nullable()
|
|
358
|
+
})
|
|
359
|
+
).nullable(),
|
|
360
|
+
projects: z.array(z.object({ name: z.string(), url: z.string() })).nullable()
|
|
361
|
+
}),
|
|
362
|
+
description: "Navigation directory with sidebar items and project listings."
|
|
363
|
+
},
|
|
364
|
+
FAQBlock: {
|
|
365
|
+
props: z.object({
|
|
366
|
+
title: z.string().nullable(),
|
|
367
|
+
description: z.string().nullable(),
|
|
368
|
+
items: z.array(
|
|
369
|
+
z.object({ question: z.string(), answer: z.string() })
|
|
370
|
+
).nullable()
|
|
371
|
+
}),
|
|
372
|
+
description: "Accordion-style FAQ section with expandable question/answer pairs.",
|
|
373
|
+
example: { title: "Frequently Asked Questions" }
|
|
374
|
+
},
|
|
375
|
+
FeatureBlock: {
|
|
376
|
+
props: z.object({
|
|
377
|
+
variant: z.enum(["grid", "list"]).nullable(),
|
|
378
|
+
badge: z.string().nullable(),
|
|
379
|
+
title: z.string().nullable(),
|
|
380
|
+
description: z.string().nullable(),
|
|
381
|
+
features: z.array(
|
|
382
|
+
z.object({
|
|
383
|
+
title: z.string(),
|
|
384
|
+
description: z.string(),
|
|
385
|
+
icon: z.string(),
|
|
386
|
+
badge: z.string().nullable(),
|
|
387
|
+
bullets: z.array(z.string()).nullable()
|
|
388
|
+
})
|
|
389
|
+
).nullable()
|
|
390
|
+
}),
|
|
391
|
+
description: "Feature showcase in grid or list layout with icons, descriptions, and optional badges."
|
|
392
|
+
},
|
|
393
|
+
FeatureGridBlock: {
|
|
394
|
+
props: z.object({
|
|
395
|
+
title: z.string().nullable(),
|
|
396
|
+
description: z.string().nullable(),
|
|
397
|
+
features: z.array(
|
|
398
|
+
z.object({
|
|
399
|
+
title: z.string(),
|
|
400
|
+
description: z.string(),
|
|
401
|
+
icon: z.string()
|
|
402
|
+
})
|
|
403
|
+
).nullable()
|
|
404
|
+
}),
|
|
405
|
+
description: "Simple feature grid with title and description per feature card."
|
|
406
|
+
},
|
|
407
|
+
FooterBlock: {
|
|
408
|
+
props: z.object({
|
|
409
|
+
brandDescription: z.string().nullable(),
|
|
410
|
+
newsletterPlaceholder: z.string().nullable(),
|
|
411
|
+
productLinks: z.array(z.object({ name: z.string(), href: z.string() })).nullable(),
|
|
412
|
+
companyLinks: z.array(z.object({ name: z.string(), href: z.string() })).nullable(),
|
|
413
|
+
legalLinks: z.array(z.object({ name: z.string(), href: z.string() })).nullable()
|
|
414
|
+
}),
|
|
415
|
+
description: "Site footer with brand description, navigation columns, newsletter signup, and social icons.",
|
|
416
|
+
example: { brandDescription: "The ultimate design system." }
|
|
417
|
+
},
|
|
418
|
+
GalleryBlock: {
|
|
419
|
+
props: z.object({
|
|
420
|
+
title: z.string().nullable(),
|
|
421
|
+
columns: z.number().nullable(),
|
|
422
|
+
images: z.array(
|
|
423
|
+
z.object({
|
|
424
|
+
src: z.string(),
|
|
425
|
+
alt: z.string(),
|
|
426
|
+
caption: z.string().nullable()
|
|
427
|
+
})
|
|
428
|
+
).nullable()
|
|
429
|
+
}),
|
|
430
|
+
description: "Image gallery grid with configurable columns and optional captions."
|
|
431
|
+
},
|
|
432
|
+
HeaderBlock: {
|
|
433
|
+
props: z.object({
|
|
434
|
+
menuItems: z.array(z.object({ name: z.string(), href: z.string() })).nullable(),
|
|
435
|
+
loginLabel: z.string().nullable(),
|
|
436
|
+
signUpLabel: z.string().nullable(),
|
|
437
|
+
loginHref: z.string().nullable(),
|
|
438
|
+
signUpHref: z.string().nullable()
|
|
439
|
+
}),
|
|
440
|
+
description: "Site header with logo, navigation menu, and auth action buttons. Responsive with mobile hamburger menu.",
|
|
441
|
+
example: {
|
|
442
|
+
menuItems: [{ name: "Features", href: "#features" }],
|
|
443
|
+
loginLabel: "Login"
|
|
444
|
+
}
|
|
445
|
+
},
|
|
446
|
+
HeatmapChartBlock: {
|
|
447
|
+
props: z.object({
|
|
448
|
+
data: z.array(
|
|
449
|
+
z.object({
|
|
450
|
+
x: z.string(),
|
|
451
|
+
y: z.string(),
|
|
452
|
+
value: z.number()
|
|
453
|
+
})
|
|
454
|
+
).nullable(),
|
|
455
|
+
config: chartConfigSchema,
|
|
456
|
+
title: z.string().nullable(),
|
|
457
|
+
description: z.string().nullable()
|
|
458
|
+
}),
|
|
459
|
+
description: "Heatmap chart with X/Y grid cells colored by value intensity."
|
|
460
|
+
},
|
|
461
|
+
HeroBlock: {
|
|
462
|
+
props: z.object({
|
|
463
|
+
variant: z.enum(["centered", "split"]).nullable(),
|
|
464
|
+
headline: z.string().nullable(),
|
|
465
|
+
subheadline: z.string().nullable(),
|
|
466
|
+
primaryAction: z.object({ label: z.string() }).nullable(),
|
|
467
|
+
secondaryAction: z.object({ label: z.string() }).nullable(),
|
|
468
|
+
announcement: z.object({
|
|
469
|
+
label: z.string(),
|
|
470
|
+
text: z.string(),
|
|
471
|
+
href: z.string().nullable()
|
|
472
|
+
}).nullable()
|
|
473
|
+
}),
|
|
474
|
+
events: ["primaryAction", "secondaryAction"],
|
|
475
|
+
description: "Hero section with headline, subheadline, and call-to-action buttons. Supports centered and split variants.",
|
|
476
|
+
example: {
|
|
477
|
+
variant: "centered",
|
|
478
|
+
headline: "Build faster",
|
|
479
|
+
primaryAction: { label: "Get Started" }
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
HeroSectionBlock: {
|
|
483
|
+
props: z.object({
|
|
484
|
+
headline: z.string().nullable(),
|
|
485
|
+
flipWords: z.array(z.string()).nullable(),
|
|
486
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable(),
|
|
487
|
+
secondaryAction: z.object({ label: z.string(), href: z.string() }).nullable(),
|
|
488
|
+
logos: z.array(
|
|
489
|
+
z.object({
|
|
490
|
+
src: z.string(),
|
|
491
|
+
alt: z.string(),
|
|
492
|
+
height: z.string()
|
|
493
|
+
})
|
|
494
|
+
).nullable()
|
|
495
|
+
}),
|
|
496
|
+
description: "Hero section with animated flip-word headline, dual CTAs, and logo slider."
|
|
497
|
+
},
|
|
498
|
+
IntegrationsBlock: {
|
|
499
|
+
props: z.object({
|
|
500
|
+
title: z.string().nullable(),
|
|
501
|
+
description: z.string().nullable(),
|
|
502
|
+
integrations: z.array(
|
|
503
|
+
z.object({
|
|
504
|
+
title: z.string(),
|
|
505
|
+
description: z.string(),
|
|
506
|
+
icon: z.string(),
|
|
507
|
+
link: z.string().nullable()
|
|
508
|
+
})
|
|
509
|
+
).nullable()
|
|
510
|
+
}),
|
|
511
|
+
description: "Grid of integration cards with title, description, and optional link."
|
|
512
|
+
},
|
|
513
|
+
InteractiveAreaChartBlock: {
|
|
514
|
+
props: z.object({
|
|
515
|
+
data: z.array(
|
|
516
|
+
z.object({
|
|
517
|
+
date: z.string(),
|
|
518
|
+
desktop: z.number(),
|
|
519
|
+
mobile: z.number()
|
|
520
|
+
})
|
|
521
|
+
).nullable(),
|
|
522
|
+
config: chartConfigSchema,
|
|
523
|
+
title: z.string().nullable(),
|
|
524
|
+
description: z.string().nullable(),
|
|
525
|
+
timeRanges: z.array(
|
|
526
|
+
z.object({
|
|
527
|
+
value: z.string(),
|
|
528
|
+
label: z.string(),
|
|
529
|
+
days: z.number()
|
|
530
|
+
})
|
|
531
|
+
).nullable()
|
|
532
|
+
}),
|
|
533
|
+
description: "Interactive area chart with time range selector and configurable data series."
|
|
534
|
+
},
|
|
535
|
+
LoginBlock: {
|
|
536
|
+
props: z.object({
|
|
537
|
+
type: z.enum(["login", "signup"]).nullable(),
|
|
538
|
+
showSocial: z.boolean().nullable(),
|
|
539
|
+
error: z.string().nullable(),
|
|
540
|
+
forgotPasswordHref: z.string().nullable(),
|
|
541
|
+
signUpHref: z.string().nullable(),
|
|
542
|
+
signInHref: z.string().nullable()
|
|
543
|
+
}),
|
|
544
|
+
events: ["submit", "socialLogin"],
|
|
545
|
+
description: "Authentication login form with email/password fields and optional social login buttons.",
|
|
546
|
+
example: { showSocial: true, forgotPasswordHref: "/reset-password" }
|
|
547
|
+
},
|
|
548
|
+
NewsletterBlock: {
|
|
549
|
+
props: z.object({
|
|
550
|
+
title: z.string().nullable(),
|
|
551
|
+
description: z.string().nullable()
|
|
552
|
+
}),
|
|
553
|
+
events: ["subscribe"],
|
|
554
|
+
description: "Newsletter signup form with email input and subscribe button."
|
|
555
|
+
},
|
|
556
|
+
OnboardingBlock: {
|
|
557
|
+
props: z.object({
|
|
558
|
+
title: z.string().nullable(),
|
|
559
|
+
steps: z.array(
|
|
560
|
+
z.object({
|
|
561
|
+
id: z.string(),
|
|
562
|
+
title: z.string(),
|
|
563
|
+
description: z.string(),
|
|
564
|
+
completed: z.boolean()
|
|
565
|
+
})
|
|
566
|
+
).nullable()
|
|
567
|
+
}),
|
|
568
|
+
events: ["toggle"],
|
|
569
|
+
description: "Onboarding checklist with toggleable step completion tracking."
|
|
570
|
+
},
|
|
571
|
+
PasswordRecoveryBlock: {
|
|
572
|
+
props: z.object({
|
|
573
|
+
mode: z.enum(["reset", "magic-link"]).nullable(),
|
|
574
|
+
title: z.string().nullable(),
|
|
575
|
+
description: z.string().nullable(),
|
|
576
|
+
buttonText: z.string().nullable(),
|
|
577
|
+
successTitle: z.string().nullable()
|
|
578
|
+
}),
|
|
579
|
+
events: ["submit", "backToLogin"],
|
|
580
|
+
description: "Password recovery form with email input. Supports reset and magic-link modes."
|
|
581
|
+
},
|
|
582
|
+
PricingBlock: {
|
|
583
|
+
props: z.object({
|
|
584
|
+
title: z.string().nullable(),
|
|
585
|
+
description: z.string().nullable(),
|
|
586
|
+
showBillingToggle: z.boolean().nullable(),
|
|
587
|
+
plans: z.array(
|
|
588
|
+
z.object({
|
|
589
|
+
name: z.string(),
|
|
590
|
+
description: z.string(),
|
|
591
|
+
price: z.string(),
|
|
592
|
+
period: z.string(),
|
|
593
|
+
features: z.array(z.string()),
|
|
594
|
+
action: z.string(),
|
|
595
|
+
variant: z.string(),
|
|
596
|
+
popular: z.boolean().nullable()
|
|
597
|
+
})
|
|
598
|
+
).nullable()
|
|
599
|
+
}),
|
|
600
|
+
description: "Pricing table with plan comparison, billing toggle, and feature lists.",
|
|
601
|
+
example: { title: "Simple, transparent pricing", showBillingToggle: true }
|
|
602
|
+
},
|
|
603
|
+
ProcessFlowBlock: {
|
|
604
|
+
props: z.object({
|
|
605
|
+
title: z.string().nullable(),
|
|
606
|
+
description: z.string().nullable(),
|
|
607
|
+
badge: z.string().nullable(),
|
|
608
|
+
steps: z.array(
|
|
609
|
+
z.object({
|
|
610
|
+
title: z.string(),
|
|
611
|
+
description: z.string()
|
|
612
|
+
})
|
|
613
|
+
).nullable()
|
|
614
|
+
}),
|
|
615
|
+
description: "Step-by-step process flow diagram with numbered steps and descriptions."
|
|
616
|
+
},
|
|
617
|
+
ResetPasswordBlock: {
|
|
618
|
+
props: z.object({
|
|
619
|
+
title: z.string().nullable(),
|
|
620
|
+
description: z.string().nullable()
|
|
621
|
+
}),
|
|
622
|
+
events: ["submit", "backToLogin"],
|
|
623
|
+
description: "New password form with password confirmation. Shown after recovery link click."
|
|
624
|
+
},
|
|
625
|
+
SignUpBlock: {
|
|
626
|
+
props: z.object({
|
|
627
|
+
title: z.string().nullable(),
|
|
628
|
+
description: z.string().nullable(),
|
|
629
|
+
showSocial: z.boolean().nullable(),
|
|
630
|
+
signInHref: z.string().nullable()
|
|
631
|
+
}),
|
|
632
|
+
events: ["submit"],
|
|
633
|
+
description: "Sign-up form with name, email, and password fields. Optional social login buttons.",
|
|
634
|
+
example: { title: "Create an Account", showSocial: true }
|
|
635
|
+
},
|
|
636
|
+
SocialProofBlock: {
|
|
637
|
+
props: z.object({
|
|
638
|
+
variant: z.enum(["logo-cloud", "testimonials"]).nullable(),
|
|
639
|
+
title: z.string().nullable(),
|
|
640
|
+
testimonials: z.array(
|
|
641
|
+
z.object({
|
|
642
|
+
quote: z.string(),
|
|
643
|
+
author: z.string(),
|
|
644
|
+
role: z.string(),
|
|
645
|
+
avatar: z.string()
|
|
646
|
+
})
|
|
647
|
+
).nullable()
|
|
648
|
+
}),
|
|
649
|
+
description: "Social proof section with logo cloud or customer testimonial carousel."
|
|
650
|
+
},
|
|
651
|
+
SolutionShowcaseBlock: {
|
|
652
|
+
props: z.object({
|
|
653
|
+
title: z.string().nullable(),
|
|
654
|
+
description: z.string().nullable(),
|
|
655
|
+
badge: z.string().nullable(),
|
|
656
|
+
sections: z.array(
|
|
657
|
+
z.object({
|
|
658
|
+
label: z.string(),
|
|
659
|
+
title: z.string(),
|
|
660
|
+
description: z.string(),
|
|
661
|
+
bullets: z.array(z.string())
|
|
662
|
+
})
|
|
663
|
+
).nullable(),
|
|
664
|
+
className: z.string().nullable()
|
|
665
|
+
}),
|
|
666
|
+
description: "Problem/solution/output showcase with three glass-panel cards and animated stagger entrance."
|
|
667
|
+
},
|
|
668
|
+
StatsBlock: {
|
|
669
|
+
props: z.object({
|
|
670
|
+
stats: z.array(
|
|
671
|
+
z.object({
|
|
672
|
+
title: z.string(),
|
|
673
|
+
value: z.union([z.number(), z.string()]),
|
|
674
|
+
trend: trendSchema,
|
|
675
|
+
sparklineData: z.array(z.number()).nullable(),
|
|
676
|
+
periodText: z.string().nullable(),
|
|
677
|
+
prefix: z.string().nullable(),
|
|
678
|
+
suffix: z.string().nullable()
|
|
679
|
+
})
|
|
680
|
+
).nullable()
|
|
681
|
+
}),
|
|
682
|
+
description: "Statistics display with trend indicators, sparklines, and formatted values.",
|
|
683
|
+
example: {
|
|
684
|
+
stats: [
|
|
685
|
+
{
|
|
686
|
+
title: "Revenue",
|
|
687
|
+
value: 45231,
|
|
688
|
+
prefix: "$",
|
|
689
|
+
trend: { value: 12, direction: "up" }
|
|
690
|
+
}
|
|
691
|
+
]
|
|
692
|
+
}
|
|
693
|
+
},
|
|
694
|
+
StatsMarketingBlock: {
|
|
695
|
+
props: z.object({
|
|
696
|
+
title: z.string().nullable(),
|
|
697
|
+
description: z.string().nullable(),
|
|
698
|
+
stats: z.array(
|
|
699
|
+
z.object({
|
|
700
|
+
value: z.number(),
|
|
701
|
+
label: z.string(),
|
|
702
|
+
suffix: z.string().nullable(),
|
|
703
|
+
prefix: z.string().nullable()
|
|
704
|
+
})
|
|
705
|
+
).nullable()
|
|
706
|
+
}),
|
|
707
|
+
description: "Marketing statistics section with animated counting numbers and labels."
|
|
708
|
+
},
|
|
709
|
+
TeamBlock: {
|
|
710
|
+
props: z.object({
|
|
711
|
+
title: z.string().nullable(),
|
|
712
|
+
sections: z.array(
|
|
713
|
+
z.object({
|
|
714
|
+
heading: z.string(),
|
|
715
|
+
members: z.array(
|
|
716
|
+
z.object({
|
|
717
|
+
name: z.string(),
|
|
718
|
+
role: z.string(),
|
|
719
|
+
avatar: z.string()
|
|
720
|
+
})
|
|
721
|
+
)
|
|
722
|
+
})
|
|
723
|
+
).nullable()
|
|
724
|
+
}),
|
|
725
|
+
description: "Team showcase with sectioned member grids showing avatars, names, and roles."
|
|
726
|
+
},
|
|
727
|
+
TestimonialsBlock: {
|
|
728
|
+
props: z.object({
|
|
729
|
+
title: z.string().nullable(),
|
|
730
|
+
description: z.string().nullable(),
|
|
731
|
+
testimonials: z.array(
|
|
732
|
+
z.object({
|
|
733
|
+
quote: z.string(),
|
|
734
|
+
author: z.string(),
|
|
735
|
+
role: z.string(),
|
|
736
|
+
avatar: z.string(),
|
|
737
|
+
featured: z.boolean().nullable()
|
|
738
|
+
})
|
|
739
|
+
).nullable()
|
|
740
|
+
}),
|
|
741
|
+
description: "Customer testimonials with quotes, author info, and optional featured highlighting."
|
|
742
|
+
},
|
|
743
|
+
TwoFactorChallengeBlock: {
|
|
744
|
+
props: z.object({
|
|
745
|
+
error: z.string().nullable(),
|
|
746
|
+
title: z.string().nullable(),
|
|
747
|
+
description: z.string().nullable(),
|
|
748
|
+
backupCodeLabel: z.string().nullable()
|
|
749
|
+
}),
|
|
750
|
+
events: ["verify", "useBackupCode", "backToLogin"],
|
|
751
|
+
description: "Two-factor authentication code entry with 6-digit OTP input and backup code option."
|
|
752
|
+
},
|
|
753
|
+
TwoFactorSetupBlock: {
|
|
754
|
+
props: z.object({
|
|
755
|
+
qrCodeUrl: z.string().nullable(),
|
|
756
|
+
secret: z.string().nullable(),
|
|
757
|
+
backupCodes: z.array(z.string()).nullable(),
|
|
758
|
+
title: z.string().nullable(),
|
|
759
|
+
description: z.string().nullable()
|
|
760
|
+
}),
|
|
761
|
+
events: ["verify", "complete"],
|
|
762
|
+
description: "Two-factor setup wizard with QR code, secret key display, backup codes, and verification."
|
|
763
|
+
},
|
|
764
|
+
UsageDonutBlock: {
|
|
765
|
+
props: z.object({
|
|
766
|
+
data: z.array(
|
|
767
|
+
z.object({
|
|
768
|
+
name: z.string(),
|
|
769
|
+
value: z.number(),
|
|
770
|
+
fill: z.string()
|
|
771
|
+
})
|
|
772
|
+
).nullable(),
|
|
773
|
+
config: chartConfigSchema,
|
|
774
|
+
title: z.string().nullable(),
|
|
775
|
+
description: z.string().nullable()
|
|
776
|
+
}),
|
|
777
|
+
description: "Donut chart showing usage breakdown by category with center label."
|
|
778
|
+
},
|
|
779
|
+
AudioVisualizerBlock: {
|
|
780
|
+
props: z.object({
|
|
781
|
+
bars: z.number().nullable(),
|
|
782
|
+
isPlaying: z.boolean().nullable(),
|
|
783
|
+
className: z.string().nullable()
|
|
784
|
+
}),
|
|
785
|
+
description: "Animated audio visualizer bar display. Use inside voice or audio playback UIs. Set isPlaying to animate bars; bars controls the count (default 20)."
|
|
786
|
+
},
|
|
787
|
+
AuthLayout: {
|
|
788
|
+
props: z.object({
|
|
789
|
+
mode: z.enum(["login", "signup"]).nullable(),
|
|
790
|
+
error: z.string().nullable(),
|
|
791
|
+
labels: z.object({
|
|
792
|
+
headline: z.string().nullable(),
|
|
793
|
+
quote: z.string().nullable(),
|
|
794
|
+
quoteAttribution: z.string().nullable()
|
|
795
|
+
}).nullable(),
|
|
796
|
+
className: z.string().nullable()
|
|
797
|
+
}),
|
|
798
|
+
slots: ["default"],
|
|
799
|
+
description: "Full-page split auth layout with animated visual side and form side. Renders a LoginBlock internally. Use as the shell for login and signup pages when you need the branded two-column layout."
|
|
800
|
+
},
|
|
801
|
+
AuthSuccessBlock: {
|
|
802
|
+
props: z.object({
|
|
803
|
+
title: z.string(),
|
|
804
|
+
description: z.string(),
|
|
805
|
+
buttonText: z.string().nullable(),
|
|
806
|
+
autoRedirectSeconds: z.number().nullable()
|
|
807
|
+
}),
|
|
808
|
+
slots: ["icon"],
|
|
809
|
+
events: ["continue"],
|
|
810
|
+
description: "Success confirmation card with icon slot, title, description, continue button, and optional auto-redirect countdown. Use after successful auth flows (email verified, password reset)."
|
|
811
|
+
},
|
|
812
|
+
ChatLayout: {
|
|
813
|
+
props: z.object({
|
|
814
|
+
assistantName: z.string().nullable(),
|
|
815
|
+
assistantStatus: z.string().nullable(),
|
|
816
|
+
placeholder: z.string().nullable(),
|
|
817
|
+
initialMessages: z.array(
|
|
818
|
+
z.object({
|
|
819
|
+
id: z.string(),
|
|
820
|
+
role: z.enum(["user", "assistant"]),
|
|
821
|
+
content: z.string()
|
|
822
|
+
})
|
|
823
|
+
).nullable(),
|
|
824
|
+
className: z.string().nullable()
|
|
825
|
+
}),
|
|
826
|
+
description: "Self-contained chat widget with message history, send form, and simulated assistant replies. Suitable for embedded chat demos and prototype UIs. For full-page agent chat use AgentsChatPageKit."
|
|
827
|
+
},
|
|
828
|
+
CheckoutForm: {
|
|
829
|
+
props: z.object({
|
|
830
|
+
amount: z.number().nullable(),
|
|
831
|
+
currency: z.string().nullable(),
|
|
832
|
+
returnUrl: z.string().nullable()
|
|
833
|
+
}),
|
|
834
|
+
description: "Stripe payment form card using Stripe.js PaymentElement. Must be rendered inside a Stripe Elements provider. Handles submission, loading, and error states. amount is in cents (default 2000)."
|
|
835
|
+
},
|
|
836
|
+
CodeBlock: {
|
|
837
|
+
props: z.object({
|
|
838
|
+
code: z.string(),
|
|
839
|
+
language: z.string().nullable(),
|
|
840
|
+
filename: z.string().nullable(),
|
|
841
|
+
className: z.string().nullable()
|
|
842
|
+
}),
|
|
843
|
+
description: "Syntax-highlighted code display with copy button and optional filename header. Uses Prism.js for highlighting. Wrap in ScrollFadeIn entrance animation automatically."
|
|
844
|
+
},
|
|
845
|
+
FormWizard: {
|
|
846
|
+
props: z.object({
|
|
847
|
+
activeStep: z.number().nullable(),
|
|
848
|
+
nextLabel: z.string().nullable(),
|
|
849
|
+
backLabel: z.string().nullable(),
|
|
850
|
+
completeLabel: z.string().nullable(),
|
|
851
|
+
variant: z.string().nullable(),
|
|
852
|
+
size: z.string().nullable(),
|
|
853
|
+
className: z.string().nullable()
|
|
854
|
+
}),
|
|
855
|
+
slots: ["steps"],
|
|
856
|
+
events: ["stepChange", "complete"],
|
|
857
|
+
description: "Multi-step wizard with animated step transitions, progress indicators, and back/next/complete navigation. Steps are passed as WizardStep objects with id, title, description, and content. Supports controlled (activeStep + onStepChange) and uncontrolled modes."
|
|
858
|
+
},
|
|
859
|
+
InviteUserModal: {
|
|
860
|
+
props: z.object({}),
|
|
861
|
+
events: ["invite", "invited"],
|
|
862
|
+
description: "Self-contained invite teammate modal triggered by a button. Renders a dialog with email and role (admin/member/guest) fields, Zod validation, and async submission. Use inside team management UIs."
|
|
863
|
+
},
|
|
864
|
+
KanbanBoard: {
|
|
865
|
+
props: z.object({
|
|
866
|
+
activationDistance: z.number().nullable(),
|
|
867
|
+
className: z.string().nullable()
|
|
868
|
+
}),
|
|
869
|
+
slots: ["default"],
|
|
870
|
+
events: ["valueChange"],
|
|
871
|
+
description: "Headless drag-and-drop Kanban board primitive. Compose with KanbanColumn, KanbanColumnHeader, KanbanItem, and KanbanHandle sub-components. Controlled via value + onValueChange. Use KanbanBoardPageKit for a full-page opinionated implementation."
|
|
872
|
+
},
|
|
873
|
+
KanbanDemoBlock: {
|
|
874
|
+
props: z.object({
|
|
875
|
+
className: z.string().nullable()
|
|
876
|
+
}),
|
|
877
|
+
description: "Pre-configured Kanban demo with sample task data across five columns (Backlog, Todo, In Progress, Review, Done). Wraps KanbanBoard with a complete task card layout including priority badges, assignee avatars, and tag pills."
|
|
878
|
+
},
|
|
879
|
+
LogoCloud: {
|
|
880
|
+
props: z.object({
|
|
881
|
+
title: z.string().nullable(),
|
|
882
|
+
logos: z.array(
|
|
883
|
+
z.object({
|
|
884
|
+
src: z.string(),
|
|
885
|
+
alt: z.string(),
|
|
886
|
+
height: z.number()
|
|
887
|
+
})
|
|
888
|
+
).nullable(),
|
|
889
|
+
className: z.string().nullable()
|
|
890
|
+
}),
|
|
891
|
+
description: "Partner/customer logo grid with title. Logos auto-invert in dark mode. Use as a social proof section on marketing pages."
|
|
892
|
+
},
|
|
893
|
+
NavUser: {
|
|
894
|
+
props: z.object({
|
|
895
|
+
user: z.object({
|
|
896
|
+
name: z.string(),
|
|
897
|
+
email: z.string(),
|
|
898
|
+
avatar: z.string().nullable()
|
|
899
|
+
}),
|
|
900
|
+
items: z.array(
|
|
901
|
+
z.object({
|
|
902
|
+
label: z.string(),
|
|
903
|
+
href: z.string().nullable()
|
|
904
|
+
})
|
|
905
|
+
).nullable()
|
|
906
|
+
}),
|
|
907
|
+
slots: ["footer"],
|
|
908
|
+
description: "Sidebar user menu button with avatar, name, email, and dropdown actions. Renders inside a SidebarMenu. Used in the sidebar footer of NavigationShellPageKit."
|
|
909
|
+
},
|
|
910
|
+
NotFoundBlock: {
|
|
911
|
+
props: z.object({
|
|
912
|
+
title: z.string().nullable(),
|
|
913
|
+
description: z.string().nullable(),
|
|
914
|
+
backHref: z.string().nullable(),
|
|
915
|
+
backLabel: z.string().nullable(),
|
|
916
|
+
className: z.string().nullable()
|
|
917
|
+
}),
|
|
918
|
+
description: "404 not-found section with animated gradient title, description, and back-home button. Embeds a MeteorShower background effect. Use on error and not-found pages."
|
|
919
|
+
},
|
|
920
|
+
SettingsLayout: {
|
|
921
|
+
props: z.object({
|
|
922
|
+
title: z.string().nullable(),
|
|
923
|
+
subtitle: z.string().nullable(),
|
|
924
|
+
defaultActive: z.string().nullable(),
|
|
925
|
+
links: z.array(
|
|
926
|
+
z.object({
|
|
927
|
+
label: z.string(),
|
|
928
|
+
badge: z.string().nullable()
|
|
929
|
+
})
|
|
930
|
+
).nullable(),
|
|
931
|
+
className: z.string().nullable()
|
|
932
|
+
}),
|
|
933
|
+
slots: ["sectionContent"],
|
|
934
|
+
events: ["activeChange"],
|
|
935
|
+
description: "Settings shell with collapsible sidebar navigation and animated content area. Provide renderContent to supply per-section content. For a full-page implementation with save/discard controls use SettingsPageKit."
|
|
936
|
+
},
|
|
937
|
+
VoiceAgentCard: {
|
|
938
|
+
props: z.object({
|
|
939
|
+
agent: z.object({
|
|
940
|
+
id: z.string(),
|
|
941
|
+
name: z.string(),
|
|
942
|
+
role: z.string(),
|
|
943
|
+
avatar: z.string()
|
|
944
|
+
}),
|
|
945
|
+
state: z.enum(["idle", "listening", "speaking"]),
|
|
946
|
+
selected: z.boolean().nullable(),
|
|
947
|
+
ariaLabel: z.string().nullable(),
|
|
948
|
+
className: z.string().nullable()
|
|
949
|
+
}),
|
|
950
|
+
events: ["select"],
|
|
951
|
+
description: "Voice agent selection card with 3D avatar, name, role, and state badge (idle/listening/speaking). Supports selected highlight and press animation. Use in a grid inside VoiceAgentsPageKit or standalone voice agent UIs."
|
|
952
|
+
},
|
|
953
|
+
WizardBlock: {
|
|
954
|
+
props: z.object({
|
|
955
|
+
title: z.string().nullable(),
|
|
956
|
+
description: z.string().nullable(),
|
|
957
|
+
steps: z.array(
|
|
958
|
+
z.object({
|
|
959
|
+
title: z.string(),
|
|
960
|
+
description: z.string()
|
|
961
|
+
})
|
|
962
|
+
).nullable(),
|
|
963
|
+
className: z.string().nullable()
|
|
964
|
+
}),
|
|
965
|
+
events: ["finish"],
|
|
966
|
+
description: "Opinionated multi-step wizard card with Stepper progress indicator and built-in step content slots. Handles account, profile, plan, and launch steps by default. Use for onboarding and setup flows."
|
|
967
|
+
},
|
|
968
|
+
// =========================================================================
|
|
969
|
+
// Page Kits (28 entries, alphabetical)
|
|
970
|
+
// =========================================================================
|
|
971
|
+
AccountLockedPageKit: {
|
|
972
|
+
props: z.object({
|
|
973
|
+
reason: z.enum(["too_many_attempts", "suspicious_activity", "admin"]).nullable(),
|
|
974
|
+
unlockMinutes: z.number().nullable(),
|
|
975
|
+
title: z.string().nullable(),
|
|
976
|
+
description: z.string().nullable()
|
|
977
|
+
}),
|
|
978
|
+
events: ["contactSupport", "backToLogin"],
|
|
979
|
+
description: "Full-page account locked screen with reason display and support/login actions."
|
|
980
|
+
},
|
|
981
|
+
AgentsChatPageKit: {
|
|
982
|
+
props: z.object({
|
|
983
|
+
shell: navigationShellSchema,
|
|
984
|
+
state: z.enum([
|
|
985
|
+
"empty",
|
|
986
|
+
"loading",
|
|
987
|
+
"thinking",
|
|
988
|
+
"blocked-approval",
|
|
989
|
+
"failed",
|
|
990
|
+
"running",
|
|
991
|
+
"complete"
|
|
992
|
+
]).nullable(),
|
|
993
|
+
messages: z.array(
|
|
994
|
+
z.object({
|
|
995
|
+
id: z.string(),
|
|
996
|
+
role: z.enum(["user", "assistant", "system"]),
|
|
997
|
+
content: z.string(),
|
|
998
|
+
timestamp: z.string().nullable()
|
|
999
|
+
})
|
|
1000
|
+
).nullable(),
|
|
1001
|
+
toolCalls: z.array(
|
|
1002
|
+
z.object({
|
|
1003
|
+
id: z.string(),
|
|
1004
|
+
toolName: z.string(),
|
|
1005
|
+
status: z.enum(["pending", "running", "complete", "error"]),
|
|
1006
|
+
result: z.string().nullable(),
|
|
1007
|
+
durationMs: z.number().nullable()
|
|
1008
|
+
})
|
|
1009
|
+
).nullable(),
|
|
1010
|
+
artifacts: z.array(
|
|
1011
|
+
z.object({
|
|
1012
|
+
id: z.string(),
|
|
1013
|
+
title: z.string(),
|
|
1014
|
+
kind: z.enum(["diff", "file", "log", "report"]),
|
|
1015
|
+
summary: z.string()
|
|
1016
|
+
})
|
|
1017
|
+
).nullable(),
|
|
1018
|
+
traceEvents: z.array(
|
|
1019
|
+
z.object({
|
|
1020
|
+
id: z.string(),
|
|
1021
|
+
label: z.string(),
|
|
1022
|
+
detail: z.string()
|
|
1023
|
+
})
|
|
1024
|
+
).nullable(),
|
|
1025
|
+
errorMessage: z.string().nullable(),
|
|
1026
|
+
composer: z.object({
|
|
1027
|
+
value: z.string().nullable(),
|
|
1028
|
+
placeholder: z.string().nullable(),
|
|
1029
|
+
disabled: z.boolean().nullable()
|
|
1030
|
+
}).nullable(),
|
|
1031
|
+
approval: z.object({ pendingReason: z.string() }).nullable()
|
|
1032
|
+
}),
|
|
1033
|
+
events: ["approve", "reject", "composerChange", "composerSend"],
|
|
1034
|
+
description: "Full-page AI agent chat interface with conversation, tool calls, artifacts, trace events, and approval workflow."
|
|
1035
|
+
},
|
|
1036
|
+
AnalyticsPageKit: {
|
|
1037
|
+
props: z.object({
|
|
1038
|
+
shell: navigationShellSchema,
|
|
1039
|
+
title: z.string().nullable(),
|
|
1040
|
+
description: z.string().nullable(),
|
|
1041
|
+
comparisonLabel: z.string().nullable(),
|
|
1042
|
+
filters: z.array(
|
|
1043
|
+
z.object({
|
|
1044
|
+
id: z.string(),
|
|
1045
|
+
label: z.string(),
|
|
1046
|
+
value: z.string(),
|
|
1047
|
+
options: z.array(
|
|
1048
|
+
z.object({ value: z.string(), label: z.string() })
|
|
1049
|
+
)
|
|
1050
|
+
})
|
|
1051
|
+
).nullable()
|
|
1052
|
+
}),
|
|
1053
|
+
events: ["resetFilters", "filterChange"],
|
|
1054
|
+
slots: ["chartRegions"],
|
|
1055
|
+
description: "Analytics dashboard with filter controls, chart regions, and data grid regions."
|
|
1056
|
+
},
|
|
1057
|
+
BlogContentPageKit: {
|
|
1058
|
+
props: z.object({
|
|
1059
|
+
shell: marketingShellSchema,
|
|
1060
|
+
state: z.enum([
|
|
1061
|
+
"loading",
|
|
1062
|
+
"empty",
|
|
1063
|
+
"filtered",
|
|
1064
|
+
"has-data",
|
|
1065
|
+
"paginated"
|
|
1066
|
+
]).nullable(),
|
|
1067
|
+
variant: z.enum(["content-index", "content-detail", "changelog"]).nullable(),
|
|
1068
|
+
categories: z.array(
|
|
1069
|
+
z.object({ id: z.string(), label: z.string() })
|
|
1070
|
+
).nullable(),
|
|
1071
|
+
activeCategoryId: z.string().nullable(),
|
|
1072
|
+
articles: z.array(
|
|
1073
|
+
z.object({
|
|
1074
|
+
id: z.string(),
|
|
1075
|
+
title: z.string(),
|
|
1076
|
+
excerpt: z.string(),
|
|
1077
|
+
category: z.string(),
|
|
1078
|
+
authorName: z.string(),
|
|
1079
|
+
authorFallback: z.string().nullable(),
|
|
1080
|
+
readTimeLabel: z.string().nullable(),
|
|
1081
|
+
publishedAt: z.string()
|
|
1082
|
+
})
|
|
1083
|
+
).nullable(),
|
|
1084
|
+
detail: z.object({
|
|
1085
|
+
title: z.string(),
|
|
1086
|
+
content: z.string(),
|
|
1087
|
+
authorName: z.string(),
|
|
1088
|
+
authorFallback: z.string().nullable(),
|
|
1089
|
+
publishedAt: z.string(),
|
|
1090
|
+
readTimeLabel: z.string().nullable(),
|
|
1091
|
+
excerpt: z.string().nullable()
|
|
1092
|
+
}).nullable(),
|
|
1093
|
+
loadingMessage: z.string().nullable()
|
|
1094
|
+
}),
|
|
1095
|
+
events: ["categoryChange", "pageChange", "articleOpen"],
|
|
1096
|
+
description: "Blog/content management page with article index, detail view, and changelog variants."
|
|
1097
|
+
},
|
|
1098
|
+
CheckoutPageKit: {
|
|
1099
|
+
props: z.object({
|
|
1100
|
+
shell: marketingShellSchema,
|
|
1101
|
+
state: z.enum([
|
|
1102
|
+
"default",
|
|
1103
|
+
"submitting",
|
|
1104
|
+
"processing",
|
|
1105
|
+
"error",
|
|
1106
|
+
"success"
|
|
1107
|
+
]).nullable(),
|
|
1108
|
+
summary: z.object({
|
|
1109
|
+
title: z.string(),
|
|
1110
|
+
amountLabel: z.string(),
|
|
1111
|
+
lineItems: z.array(
|
|
1112
|
+
z.object({
|
|
1113
|
+
id: z.string(),
|
|
1114
|
+
label: z.string(),
|
|
1115
|
+
value: z.string()
|
|
1116
|
+
})
|
|
1117
|
+
)
|
|
1118
|
+
}),
|
|
1119
|
+
billingFields: z.array(
|
|
1120
|
+
z.object({
|
|
1121
|
+
id: z.string(),
|
|
1122
|
+
label: z.string(),
|
|
1123
|
+
value: z.string(),
|
|
1124
|
+
placeholder: z.string().nullable(),
|
|
1125
|
+
type: z.enum(["text", "email", "tel"]).nullable(),
|
|
1126
|
+
required: z.boolean().nullable(),
|
|
1127
|
+
description: z.string().nullable()
|
|
1128
|
+
})
|
|
1129
|
+
),
|
|
1130
|
+
errorMessage: z.string().nullable(),
|
|
1131
|
+
successMessage: z.string().nullable(),
|
|
1132
|
+
processingMessage: z.string().nullable()
|
|
1133
|
+
}),
|
|
1134
|
+
events: ["billingFieldChange", "submit", "retry", "continue"],
|
|
1135
|
+
description: "Checkout page with order summary, billing fields, and multi-state submission flow."
|
|
1136
|
+
},
|
|
1137
|
+
CompanySuitePageKit: {
|
|
1138
|
+
props: z.object({
|
|
1139
|
+
shell: marketingShellSchema,
|
|
1140
|
+
variant: z.enum(["company-about", "company-contact"]).nullable(),
|
|
1141
|
+
sectionOrder: z.array(z.enum(["narrative", "team", "contact", "faq", "cta"])).nullable(),
|
|
1142
|
+
narrative: z.object({
|
|
1143
|
+
title: z.string(),
|
|
1144
|
+
description: z.string().nullable()
|
|
1145
|
+
}).nullable(),
|
|
1146
|
+
team: z.object({
|
|
1147
|
+
title: z.string().nullable(),
|
|
1148
|
+
sections: z.array(
|
|
1149
|
+
z.object({
|
|
1150
|
+
heading: z.string(),
|
|
1151
|
+
members: z.array(
|
|
1152
|
+
z.object({
|
|
1153
|
+
name: z.string(),
|
|
1154
|
+
role: z.string(),
|
|
1155
|
+
avatar: z.string()
|
|
1156
|
+
})
|
|
1157
|
+
)
|
|
1158
|
+
})
|
|
1159
|
+
).nullable()
|
|
1160
|
+
}).nullable(),
|
|
1161
|
+
contact: z.object({ title: z.string().nullable() }).nullable(),
|
|
1162
|
+
faq: z.object({
|
|
1163
|
+
title: z.string().nullable(),
|
|
1164
|
+
items: z.array(
|
|
1165
|
+
z.object({
|
|
1166
|
+
question: z.string(),
|
|
1167
|
+
answer: z.string()
|
|
1168
|
+
})
|
|
1169
|
+
).nullable()
|
|
1170
|
+
}).nullable(),
|
|
1171
|
+
cta: z.object({
|
|
1172
|
+
title: z.string().nullable(),
|
|
1173
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable()
|
|
1174
|
+
}).nullable()
|
|
1175
|
+
}),
|
|
1176
|
+
events: ["contactSubmit"],
|
|
1177
|
+
description: "Company pages with configurable sections: about narrative, team, contact form, FAQ, and CTA."
|
|
1178
|
+
},
|
|
1179
|
+
CrudFormPageKit: {
|
|
1180
|
+
props: z.object({
|
|
1181
|
+
shell: navigationShellSchema,
|
|
1182
|
+
title: z.string().nullable(),
|
|
1183
|
+
description: z.string().nullable(),
|
|
1184
|
+
state: z.enum([
|
|
1185
|
+
"pristine",
|
|
1186
|
+
"dirty",
|
|
1187
|
+
"validating",
|
|
1188
|
+
"validation-error",
|
|
1189
|
+
"submitting",
|
|
1190
|
+
"saved",
|
|
1191
|
+
"fatal-error"
|
|
1192
|
+
]).nullable(),
|
|
1193
|
+
sections: z.array(
|
|
1194
|
+
z.object({
|
|
1195
|
+
id: z.string(),
|
|
1196
|
+
title: z.string(),
|
|
1197
|
+
description: z.string().nullable(),
|
|
1198
|
+
optional: z.boolean().nullable(),
|
|
1199
|
+
fields: z.array(
|
|
1200
|
+
z.object({
|
|
1201
|
+
id: z.string(),
|
|
1202
|
+
label: z.string(),
|
|
1203
|
+
value: z.string(),
|
|
1204
|
+
type: z.enum(["text", "email", "number", "textarea", "select"]).nullable(),
|
|
1205
|
+
placeholder: z.string().nullable(),
|
|
1206
|
+
required: z.boolean().nullable(),
|
|
1207
|
+
readOnly: z.boolean().nullable(),
|
|
1208
|
+
errorMessage: z.string().nullable(),
|
|
1209
|
+
options: z.array(
|
|
1210
|
+
z.object({
|
|
1211
|
+
value: z.string(),
|
|
1212
|
+
label: z.string()
|
|
1213
|
+
})
|
|
1214
|
+
).nullable()
|
|
1215
|
+
})
|
|
1216
|
+
).nullable()
|
|
1217
|
+
})
|
|
1218
|
+
).nullable(),
|
|
1219
|
+
validationMessage: z.string().nullable(),
|
|
1220
|
+
fatalErrorMessage: z.string().nullable(),
|
|
1221
|
+
savedMessage: z.string().nullable()
|
|
1222
|
+
}),
|
|
1223
|
+
events: [
|
|
1224
|
+
"fieldChange",
|
|
1225
|
+
"primaryAction",
|
|
1226
|
+
"secondaryAction",
|
|
1227
|
+
"tertiaryAction",
|
|
1228
|
+
"destructiveAction"
|
|
1229
|
+
],
|
|
1230
|
+
description: "Generic CRUD form page with sectioned fields, validation states, and configurable actions."
|
|
1231
|
+
},
|
|
1232
|
+
CrudListDetailPageKit: {
|
|
1233
|
+
props: z.object({
|
|
1234
|
+
shell: navigationShellSchema,
|
|
1235
|
+
title: z.string().nullable(),
|
|
1236
|
+
description: z.string().nullable(),
|
|
1237
|
+
state: z.enum([
|
|
1238
|
+
"loading",
|
|
1239
|
+
"empty",
|
|
1240
|
+
"filtered",
|
|
1241
|
+
"selected-row",
|
|
1242
|
+
"error",
|
|
1243
|
+
"has-data"
|
|
1244
|
+
]).nullable(),
|
|
1245
|
+
columns: z.array(
|
|
1246
|
+
z.object({
|
|
1247
|
+
id: z.string(),
|
|
1248
|
+
header: z.string()
|
|
1249
|
+
})
|
|
1250
|
+
).nullable(),
|
|
1251
|
+
rows: z.array(
|
|
1252
|
+
z.object({
|
|
1253
|
+
id: z.string(),
|
|
1254
|
+
cells: z.record(z.string(), z.string())
|
|
1255
|
+
})
|
|
1256
|
+
).nullable(),
|
|
1257
|
+
selectedRowId: z.string().nullable(),
|
|
1258
|
+
filterControls: z.array(
|
|
1259
|
+
z.object({
|
|
1260
|
+
id: z.string(),
|
|
1261
|
+
label: z.string(),
|
|
1262
|
+
value: z.string(),
|
|
1263
|
+
placeholder: z.string().nullable()
|
|
1264
|
+
})
|
|
1265
|
+
).nullable(),
|
|
1266
|
+
pagination: z.object({
|
|
1267
|
+
page: z.number(),
|
|
1268
|
+
totalPages: z.number()
|
|
1269
|
+
}),
|
|
1270
|
+
errorMessage: z.string().nullable()
|
|
1271
|
+
}),
|
|
1272
|
+
events: ["rowSelect", "pageChange", "filterChange"],
|
|
1273
|
+
description: "Master-detail list page with data table, filters, pagination, and detail panel."
|
|
1274
|
+
},
|
|
1275
|
+
DashboardPageKit: {
|
|
1276
|
+
props: z.object({
|
|
1277
|
+
title: z.string().nullable(),
|
|
1278
|
+
description: z.string().nullable(),
|
|
1279
|
+
kpis: z.array(
|
|
1280
|
+
z.object({
|
|
1281
|
+
label: z.string(),
|
|
1282
|
+
value: z.union([z.number(), z.string()]),
|
|
1283
|
+
trend: trendSchema,
|
|
1284
|
+
sparklineData: z.array(z.number()).nullable(),
|
|
1285
|
+
prefix: z.string().nullable(),
|
|
1286
|
+
suffix: z.string().nullable(),
|
|
1287
|
+
loading: z.boolean().nullable()
|
|
1288
|
+
})
|
|
1289
|
+
).nullable(),
|
|
1290
|
+
kpiState: regionStateSchema,
|
|
1291
|
+
lastUpdated: z.string().nullable(),
|
|
1292
|
+
shell: navigationShellSchema
|
|
1293
|
+
}),
|
|
1294
|
+
events: ["sidebarOpenChange"],
|
|
1295
|
+
slots: ["chartRegions"],
|
|
1296
|
+
description: "Full dashboard page with navigation shell, KPI cards, chart regions, and activity feed. Requires shell configuration for sidebar navigation.",
|
|
1297
|
+
example: {
|
|
1298
|
+
title: "Dashboard",
|
|
1299
|
+
shell: {
|
|
1300
|
+
workspaceName: "Acme Corp",
|
|
1301
|
+
navigationGroups: [],
|
|
1302
|
+
activeHref: "/dashboard"
|
|
1303
|
+
},
|
|
1304
|
+
kpis: [
|
|
1305
|
+
{
|
|
1306
|
+
label: "Revenue",
|
|
1307
|
+
value: "$45,231",
|
|
1308
|
+
trend: { value: 12, direction: "up" }
|
|
1309
|
+
}
|
|
1310
|
+
]
|
|
1311
|
+
}
|
|
1312
|
+
},
|
|
1313
|
+
ErrorPageKit: {
|
|
1314
|
+
props: z.object({
|
|
1315
|
+
variant: z.enum(["not-found", "server-error", "generic-fallback"]),
|
|
1316
|
+
title: z.string(),
|
|
1317
|
+
description: z.string(),
|
|
1318
|
+
metadata: z.object({
|
|
1319
|
+
statusCode: z.number().nullable(),
|
|
1320
|
+
errorCode: z.string().nullable(),
|
|
1321
|
+
incidentId: z.string().nullable()
|
|
1322
|
+
}).nullable(),
|
|
1323
|
+
primaryAction: z.object({ label: z.string() }).nullable(),
|
|
1324
|
+
secondaryAction: z.object({ label: z.string() }).nullable()
|
|
1325
|
+
}),
|
|
1326
|
+
events: ["primaryAction", "secondaryAction"],
|
|
1327
|
+
slots: ["supportContent"],
|
|
1328
|
+
description: "Error page with status display, action buttons, and optional support content."
|
|
1329
|
+
},
|
|
1330
|
+
KanbanBoardPageKit: {
|
|
1331
|
+
props: z.object({
|
|
1332
|
+
shell: navigationShellSchema,
|
|
1333
|
+
state: z.enum([
|
|
1334
|
+
"loading",
|
|
1335
|
+
"empty",
|
|
1336
|
+
"dragging",
|
|
1337
|
+
"move-failed",
|
|
1338
|
+
"has-data"
|
|
1339
|
+
]).nullable(),
|
|
1340
|
+
title: z.string().nullable(),
|
|
1341
|
+
description: z.string().nullable(),
|
|
1342
|
+
columns: z.array(
|
|
1343
|
+
z.object({
|
|
1344
|
+
id: z.string(),
|
|
1345
|
+
title: z.string(),
|
|
1346
|
+
items: z.array(
|
|
1347
|
+
z.object({
|
|
1348
|
+
id: z.string(),
|
|
1349
|
+
title: z.string(),
|
|
1350
|
+
description: z.string().nullable(),
|
|
1351
|
+
badgeLabel: z.string().nullable(),
|
|
1352
|
+
assigneeLabel: z.string().nullable()
|
|
1353
|
+
})
|
|
1354
|
+
),
|
|
1355
|
+
disabled: z.boolean().nullable()
|
|
1356
|
+
})
|
|
1357
|
+
).nullable(),
|
|
1358
|
+
readOnly: z.boolean().nullable(),
|
|
1359
|
+
moveErrorMessage: z.string().nullable()
|
|
1360
|
+
}),
|
|
1361
|
+
events: ["move"],
|
|
1362
|
+
slots: ["activityRegion"],
|
|
1363
|
+
description: "Kanban board page with draggable card columns, move tracking, and activity region."
|
|
1364
|
+
},
|
|
1365
|
+
LandingPageKit: {
|
|
1366
|
+
props: z.object({
|
|
1367
|
+
shell: marketingShellSchema,
|
|
1368
|
+
sectionOrder: z.array(
|
|
1369
|
+
z.enum([
|
|
1370
|
+
"hero",
|
|
1371
|
+
"features",
|
|
1372
|
+
"proof",
|
|
1373
|
+
"pricing-teaser",
|
|
1374
|
+
"faq",
|
|
1375
|
+
"cta",
|
|
1376
|
+
"newsletter"
|
|
1377
|
+
])
|
|
1378
|
+
).nullable(),
|
|
1379
|
+
hero: z.object({
|
|
1380
|
+
variant: z.enum(["centered", "split"]).nullable(),
|
|
1381
|
+
headline: z.string().nullable(),
|
|
1382
|
+
subheadline: z.string().nullable(),
|
|
1383
|
+
primaryAction: z.object({ label: z.string() }).nullable(),
|
|
1384
|
+
secondaryAction: z.object({ label: z.string() }).nullable()
|
|
1385
|
+
}).nullable(),
|
|
1386
|
+
features: z.object({
|
|
1387
|
+
variant: z.enum(["grid", "list"]).nullable(),
|
|
1388
|
+
badge: z.string().nullable(),
|
|
1389
|
+
title: z.string().nullable(),
|
|
1390
|
+
description: z.string().nullable(),
|
|
1391
|
+
features: z.array(
|
|
1392
|
+
z.object({
|
|
1393
|
+
title: z.string(),
|
|
1394
|
+
description: z.string(),
|
|
1395
|
+
icon: z.string()
|
|
1396
|
+
})
|
|
1397
|
+
).nullable()
|
|
1398
|
+
}).nullable(),
|
|
1399
|
+
proof: z.object({
|
|
1400
|
+
testimonials: z.object({
|
|
1401
|
+
title: z.string().nullable(),
|
|
1402
|
+
testimonials: z.array(
|
|
1403
|
+
z.object({
|
|
1404
|
+
quote: z.string(),
|
|
1405
|
+
author: z.string(),
|
|
1406
|
+
role: z.string(),
|
|
1407
|
+
avatar: z.string()
|
|
1408
|
+
})
|
|
1409
|
+
).nullable()
|
|
1410
|
+
}).nullable()
|
|
1411
|
+
}).nullable(),
|
|
1412
|
+
pricingTeaser: z.object({
|
|
1413
|
+
title: z.string().nullable(),
|
|
1414
|
+
plans: z.array(
|
|
1415
|
+
z.object({
|
|
1416
|
+
name: z.string(),
|
|
1417
|
+
description: z.string(),
|
|
1418
|
+
price: z.string(),
|
|
1419
|
+
period: z.string(),
|
|
1420
|
+
features: z.array(z.string()),
|
|
1421
|
+
action: z.string(),
|
|
1422
|
+
variant: z.string(),
|
|
1423
|
+
popular: z.boolean().nullable()
|
|
1424
|
+
})
|
|
1425
|
+
).nullable()
|
|
1426
|
+
}).nullable(),
|
|
1427
|
+
faq: z.object({
|
|
1428
|
+
items: z.array(
|
|
1429
|
+
z.object({
|
|
1430
|
+
question: z.string(),
|
|
1431
|
+
answer: z.string()
|
|
1432
|
+
})
|
|
1433
|
+
).nullable()
|
|
1434
|
+
}).nullable(),
|
|
1435
|
+
cta: z.object({
|
|
1436
|
+
title: z.string().nullable(),
|
|
1437
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable()
|
|
1438
|
+
}).nullable(),
|
|
1439
|
+
newsletter: z.object({ title: z.string().nullable() }).nullable()
|
|
1440
|
+
}),
|
|
1441
|
+
events: [
|
|
1442
|
+
"heroPrimaryAction",
|
|
1443
|
+
"heroSecondaryAction",
|
|
1444
|
+
"newsletterSubscribe"
|
|
1445
|
+
],
|
|
1446
|
+
description: "Full landing page with configurable sections: hero, features, social proof, pricing teaser, FAQ, CTA, and newsletter."
|
|
1447
|
+
},
|
|
1448
|
+
LoginPageKit: {
|
|
1449
|
+
props: z.object({
|
|
1450
|
+
showSocial: z.boolean().nullable(),
|
|
1451
|
+
forgotPasswordHref: z.string().nullable(),
|
|
1452
|
+
signUpHref: z.string().nullable(),
|
|
1453
|
+
error: z.string().nullable(),
|
|
1454
|
+
cardClassName: z.string().nullable()
|
|
1455
|
+
}),
|
|
1456
|
+
events: ["submit", "socialLogin"],
|
|
1457
|
+
description: "Full-page login experience with centered card layout, social login options, and error display.",
|
|
1458
|
+
example: { showSocial: true, forgotPasswordHref: "/reset-password" }
|
|
1459
|
+
},
|
|
1460
|
+
MarketingShellPageKit: {
|
|
1461
|
+
props: z.object({
|
|
1462
|
+
navigationItems: z.array(
|
|
1463
|
+
z.object({ name: z.string(), href: z.string() })
|
|
1464
|
+
),
|
|
1465
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable(),
|
|
1466
|
+
secondaryAction: z.object({ label: z.string(), href: z.string() }).nullable(),
|
|
1467
|
+
contentClassName: z.string().nullable()
|
|
1468
|
+
}),
|
|
1469
|
+
slots: ["default", "announcement"],
|
|
1470
|
+
description: "Marketing page shell with top navigation, header actions, footer, and announcement slot."
|
|
1471
|
+
},
|
|
1472
|
+
NavigationShellPageKit: {
|
|
1473
|
+
props: z.object({
|
|
1474
|
+
workspaceName: z.string(),
|
|
1475
|
+
navigationGroups: z.array(
|
|
1476
|
+
z.object({
|
|
1477
|
+
label: z.string(),
|
|
1478
|
+
items: z.array(
|
|
1479
|
+
z.object({
|
|
1480
|
+
label: z.string(),
|
|
1481
|
+
href: z.string(),
|
|
1482
|
+
icon: z.string().nullable(),
|
|
1483
|
+
badge: z.string().nullable()
|
|
1484
|
+
})
|
|
1485
|
+
)
|
|
1486
|
+
})
|
|
1487
|
+
),
|
|
1488
|
+
activeHref: z.string().nullable(),
|
|
1489
|
+
breadcrumbs: z.array(
|
|
1490
|
+
z.object({
|
|
1491
|
+
label: z.string(),
|
|
1492
|
+
href: z.string().nullable()
|
|
1493
|
+
})
|
|
1494
|
+
).nullable(),
|
|
1495
|
+
emptyNavigationMessage: z.string().nullable(),
|
|
1496
|
+
user: z.object({
|
|
1497
|
+
name: z.string(),
|
|
1498
|
+
avatarSrc: z.string().nullable(),
|
|
1499
|
+
avatarFallback: z.string().nullable()
|
|
1500
|
+
}).nullable(),
|
|
1501
|
+
defaultSidebarOpen: z.boolean().nullable()
|
|
1502
|
+
}),
|
|
1503
|
+
events: ["sidebarOpenChange"],
|
|
1504
|
+
slots: ["default", "headerSearch", "headerNotifications", "headerActions"],
|
|
1505
|
+
description: "Application shell with collapsible sidebar navigation, breadcrumbs, header slots, and user menu."
|
|
1506
|
+
},
|
|
1507
|
+
OnboardingPageKit: {
|
|
1508
|
+
props: z.object({
|
|
1509
|
+
shell: navigationShellSchema,
|
|
1510
|
+
steps: z.array(
|
|
1511
|
+
z.object({
|
|
1512
|
+
id: z.string(),
|
|
1513
|
+
title: z.string(),
|
|
1514
|
+
description: z.string().nullable(),
|
|
1515
|
+
optional: z.boolean().nullable()
|
|
1516
|
+
})
|
|
1517
|
+
),
|
|
1518
|
+
activeStepIndex: z.number(),
|
|
1519
|
+
state: z.enum(["default", "saving", "active-step", "complete"]).nullable(),
|
|
1520
|
+
validationMessage: z.string().nullable(),
|
|
1521
|
+
canSkipOptionalStep: z.boolean().nullable(),
|
|
1522
|
+
completeTitle: z.string().nullable(),
|
|
1523
|
+
completeDescription: z.string().nullable()
|
|
1524
|
+
}),
|
|
1525
|
+
events: ["stepChange", "complete", "back", "continueFromComplete"],
|
|
1526
|
+
slots: ["stepContent"],
|
|
1527
|
+
description: "Multi-step onboarding wizard with progress tracking, step navigation, and completion screen."
|
|
1528
|
+
},
|
|
1529
|
+
PricingPageKit: {
|
|
1530
|
+
props: z.object({
|
|
1531
|
+
shell: marketingShellSchema,
|
|
1532
|
+
state: z.enum([
|
|
1533
|
+
"default",
|
|
1534
|
+
"billing-toggle",
|
|
1535
|
+
"loading-action",
|
|
1536
|
+
"empty-plan"
|
|
1537
|
+
]).nullable(),
|
|
1538
|
+
title: z.string().nullable(),
|
|
1539
|
+
description: z.string().nullable(),
|
|
1540
|
+
plans: z.array(
|
|
1541
|
+
z.object({
|
|
1542
|
+
name: z.string(),
|
|
1543
|
+
description: z.string(),
|
|
1544
|
+
price: z.string(),
|
|
1545
|
+
period: z.string(),
|
|
1546
|
+
features: z.array(z.string()),
|
|
1547
|
+
action: z.string(),
|
|
1548
|
+
variant: z.string(),
|
|
1549
|
+
popular: z.boolean().nullable()
|
|
1550
|
+
})
|
|
1551
|
+
).nullable(),
|
|
1552
|
+
billing: z.object({
|
|
1553
|
+
monthlyLabel: z.string().nullable(),
|
|
1554
|
+
yearlyLabel: z.string().nullable(),
|
|
1555
|
+
yearlyBadgeLabel: z.string().nullable(),
|
|
1556
|
+
supportsYearly: z.boolean().nullable()
|
|
1557
|
+
}).nullable(),
|
|
1558
|
+
comparison: z.object({
|
|
1559
|
+
title: z.string().nullable(),
|
|
1560
|
+
plans: z.array(
|
|
1561
|
+
z.object({
|
|
1562
|
+
name: z.string(),
|
|
1563
|
+
featured: z.boolean().nullable(),
|
|
1564
|
+
features: z.record(
|
|
1565
|
+
z.string(),
|
|
1566
|
+
z.union([z.boolean(), z.string()])
|
|
1567
|
+
)
|
|
1568
|
+
})
|
|
1569
|
+
).nullable()
|
|
1570
|
+
}).nullable(),
|
|
1571
|
+
faq: z.object({
|
|
1572
|
+
items: z.array(
|
|
1573
|
+
z.object({
|
|
1574
|
+
question: z.string(),
|
|
1575
|
+
answer: z.string()
|
|
1576
|
+
})
|
|
1577
|
+
).nullable()
|
|
1578
|
+
}).nullable(),
|
|
1579
|
+
cta: z.object({
|
|
1580
|
+
title: z.string().nullable(),
|
|
1581
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable()
|
|
1582
|
+
}).nullable(),
|
|
1583
|
+
planActions: z.array(
|
|
1584
|
+
z.object({
|
|
1585
|
+
id: z.string(),
|
|
1586
|
+
label: z.string(),
|
|
1587
|
+
href: z.string(),
|
|
1588
|
+
disabled: z.boolean().nullable()
|
|
1589
|
+
})
|
|
1590
|
+
).nullable(),
|
|
1591
|
+
loadingMessage: z.string().nullable()
|
|
1592
|
+
}),
|
|
1593
|
+
events: ["planAction"],
|
|
1594
|
+
description: "Full pricing page with plan cards, billing toggle, comparison table, FAQ, and CTA sections."
|
|
1595
|
+
},
|
|
1596
|
+
ProfileSettingsPageKit: {
|
|
1597
|
+
props: z.object({
|
|
1598
|
+
title: z.string().nullable(),
|
|
1599
|
+
description: z.string().nullable(),
|
|
1600
|
+
activeSectionId: z.string().nullable(),
|
|
1601
|
+
mode: z.enum(["edit", "view"]).nullable(),
|
|
1602
|
+
saveState: z.enum([
|
|
1603
|
+
"default",
|
|
1604
|
+
"dirty",
|
|
1605
|
+
"saving",
|
|
1606
|
+
"saved",
|
|
1607
|
+
"validation-error",
|
|
1608
|
+
"fatal-error",
|
|
1609
|
+
"loading"
|
|
1610
|
+
]).nullable(),
|
|
1611
|
+
profileFields: z.array(
|
|
1612
|
+
z.object({
|
|
1613
|
+
id: z.string(),
|
|
1614
|
+
label: z.string(),
|
|
1615
|
+
value: z.string(),
|
|
1616
|
+
type: z.enum(["text", "email", "url", "tel"]).nullable(),
|
|
1617
|
+
placeholder: z.string().nullable(),
|
|
1618
|
+
required: z.boolean().nullable(),
|
|
1619
|
+
readOnly: z.boolean().nullable(),
|
|
1620
|
+
helperText: z.string().nullable()
|
|
1621
|
+
})
|
|
1622
|
+
),
|
|
1623
|
+
notificationPreferences: z.array(
|
|
1624
|
+
z.object({
|
|
1625
|
+
id: z.string(),
|
|
1626
|
+
label: z.string(),
|
|
1627
|
+
description: z.string().nullable(),
|
|
1628
|
+
enabled: z.boolean(),
|
|
1629
|
+
disabled: z.boolean().nullable()
|
|
1630
|
+
})
|
|
1631
|
+
),
|
|
1632
|
+
avatar: z.object({
|
|
1633
|
+
src: z.string().nullable(),
|
|
1634
|
+
fallback: z.string().nullable(),
|
|
1635
|
+
status: z.enum(["idle", "uploading", "error"]).nullable(),
|
|
1636
|
+
errorMessage: z.string().nullable()
|
|
1637
|
+
}).nullable(),
|
|
1638
|
+
validationErrors: z.record(z.string(), z.string()).nullable(),
|
|
1639
|
+
validationMessage: z.string().nullable(),
|
|
1640
|
+
fatalErrorMessage: z.string().nullable()
|
|
1641
|
+
}),
|
|
1642
|
+
events: [
|
|
1643
|
+
"sectionChange",
|
|
1644
|
+
"fieldChange",
|
|
1645
|
+
"notificationChange",
|
|
1646
|
+
"save",
|
|
1647
|
+
"discard",
|
|
1648
|
+
"avatarUpload",
|
|
1649
|
+
"avatarRemove"
|
|
1650
|
+
],
|
|
1651
|
+
description: "Profile settings page with editable fields, notification preferences, avatar management, and save controls."
|
|
1652
|
+
},
|
|
1653
|
+
RecoveryPageKit: {
|
|
1654
|
+
props: z.object({
|
|
1655
|
+
mode: z.enum(["reset", "magic-link"]).nullable(),
|
|
1656
|
+
title: z.string().nullable(),
|
|
1657
|
+
description: z.string().nullable(),
|
|
1658
|
+
buttonText: z.string().nullable(),
|
|
1659
|
+
successTitle: z.string().nullable(),
|
|
1660
|
+
errorMessage: z.string().nullable()
|
|
1661
|
+
}),
|
|
1662
|
+
events: ["submit", "backToLogin"],
|
|
1663
|
+
description: "Full-page password recovery with email input and success confirmation."
|
|
1664
|
+
},
|
|
1665
|
+
ResetPageKit: {
|
|
1666
|
+
props: z.object({
|
|
1667
|
+
title: z.string().nullable(),
|
|
1668
|
+
description: z.string().nullable()
|
|
1669
|
+
}),
|
|
1670
|
+
events: ["submit", "backToLogin"],
|
|
1671
|
+
description: "Full-page password reset form with new password and confirmation fields."
|
|
1672
|
+
},
|
|
1673
|
+
ServiceSuitePageKit: {
|
|
1674
|
+
props: z.object({
|
|
1675
|
+
shell: marketingShellSchema,
|
|
1676
|
+
variant: z.enum(["agency-home", "digital-workers", "service-detail"]).nullable(),
|
|
1677
|
+
sectionOrder: z.array(
|
|
1678
|
+
z.enum([
|
|
1679
|
+
"hero",
|
|
1680
|
+
"features",
|
|
1681
|
+
"process",
|
|
1682
|
+
"team",
|
|
1683
|
+
"testimonials",
|
|
1684
|
+
"faq",
|
|
1685
|
+
"cta"
|
|
1686
|
+
])
|
|
1687
|
+
).nullable(),
|
|
1688
|
+
hero: z.object({
|
|
1689
|
+
headline: z.string().nullable(),
|
|
1690
|
+
subheadline: z.string().nullable(),
|
|
1691
|
+
primaryAction: z.object({ label: z.string() }).nullable()
|
|
1692
|
+
}).nullable(),
|
|
1693
|
+
features: z.object({
|
|
1694
|
+
variant: z.enum(["grid", "list"]).nullable(),
|
|
1695
|
+
badge: z.string().nullable(),
|
|
1696
|
+
title: z.string().nullable(),
|
|
1697
|
+
description: z.string().nullable(),
|
|
1698
|
+
features: z.array(
|
|
1699
|
+
z.object({
|
|
1700
|
+
title: z.string(),
|
|
1701
|
+
description: z.string(),
|
|
1702
|
+
icon: z.string()
|
|
1703
|
+
})
|
|
1704
|
+
).nullable()
|
|
1705
|
+
}).nullable(),
|
|
1706
|
+
process: z.object({
|
|
1707
|
+
title: z.string().nullable(),
|
|
1708
|
+
steps: z.array(
|
|
1709
|
+
z.object({
|
|
1710
|
+
title: z.string(),
|
|
1711
|
+
description: z.string()
|
|
1712
|
+
})
|
|
1713
|
+
).nullable()
|
|
1714
|
+
}).nullable(),
|
|
1715
|
+
team: z.object({ title: z.string().nullable() }).nullable(),
|
|
1716
|
+
testimonials: z.object({
|
|
1717
|
+
title: z.string().nullable(),
|
|
1718
|
+
testimonials: z.array(
|
|
1719
|
+
z.object({
|
|
1720
|
+
quote: z.string(),
|
|
1721
|
+
author: z.string(),
|
|
1722
|
+
role: z.string(),
|
|
1723
|
+
avatar: z.string()
|
|
1724
|
+
})
|
|
1725
|
+
).nullable()
|
|
1726
|
+
}).nullable(),
|
|
1727
|
+
faq: z.object({
|
|
1728
|
+
items: z.array(
|
|
1729
|
+
z.object({
|
|
1730
|
+
question: z.string(),
|
|
1731
|
+
answer: z.string()
|
|
1732
|
+
})
|
|
1733
|
+
).nullable()
|
|
1734
|
+
}).nullable(),
|
|
1735
|
+
cta: z.object({
|
|
1736
|
+
title: z.string().nullable(),
|
|
1737
|
+
primaryAction: z.object({ label: z.string(), href: z.string() }).nullable()
|
|
1738
|
+
}).nullable()
|
|
1739
|
+
}),
|
|
1740
|
+
description: "Service-oriented landing page with hero, features, process flow, team, testimonials, FAQ, and CTA sections."
|
|
1741
|
+
},
|
|
1742
|
+
SettingsPageKit: {
|
|
1743
|
+
props: z.object({
|
|
1744
|
+
title: z.string().nullable(),
|
|
1745
|
+
description: z.string().nullable(),
|
|
1746
|
+
sections: z.array(
|
|
1747
|
+
z.object({
|
|
1748
|
+
id: z.string(),
|
|
1749
|
+
label: z.string(),
|
|
1750
|
+
description: z.string().nullable(),
|
|
1751
|
+
isAvailable: z.boolean().nullable(),
|
|
1752
|
+
unavailableReason: z.string().nullable()
|
|
1753
|
+
})
|
|
1754
|
+
),
|
|
1755
|
+
activeSectionId: z.string(),
|
|
1756
|
+
saveState: z.enum([
|
|
1757
|
+
"default",
|
|
1758
|
+
"dirty",
|
|
1759
|
+
"saving",
|
|
1760
|
+
"saved",
|
|
1761
|
+
"validation-error",
|
|
1762
|
+
"fatal-error",
|
|
1763
|
+
"loading"
|
|
1764
|
+
]).nullable(),
|
|
1765
|
+
validationMessage: z.string().nullable(),
|
|
1766
|
+
fatalErrorMessage: z.string().nullable(),
|
|
1767
|
+
savedMessage: z.string().nullable(),
|
|
1768
|
+
saveLabel: z.string().nullable(),
|
|
1769
|
+
discardLabel: z.string().nullable()
|
|
1770
|
+
}),
|
|
1771
|
+
events: ["sectionChange", "save", "discard"],
|
|
1772
|
+
slots: ["sectionContent"],
|
|
1773
|
+
description: "Settings page with sidebar section navigation, save/discard controls, and customizable section content."
|
|
1774
|
+
},
|
|
1775
|
+
SignupPageKit: {
|
|
1776
|
+
props: z.object({
|
|
1777
|
+
showSocial: z.boolean().nullable(),
|
|
1778
|
+
signInHref: z.string().nullable(),
|
|
1779
|
+
error: z.string().nullable()
|
|
1780
|
+
}),
|
|
1781
|
+
events: ["submit", "socialLogin"],
|
|
1782
|
+
description: "Full-page sign-up experience with centered card, social login, and sign-in link."
|
|
1783
|
+
},
|
|
1784
|
+
SuccessPageKit: {
|
|
1785
|
+
props: z.object({
|
|
1786
|
+
title: z.string().nullable(),
|
|
1787
|
+
description: z.string().nullable(),
|
|
1788
|
+
buttonText: z.string().nullable(),
|
|
1789
|
+
autoRedirectSeconds: z.number().nullable()
|
|
1790
|
+
}),
|
|
1791
|
+
events: ["continue"],
|
|
1792
|
+
description: "Success confirmation page with icon, message, continue button, and optional auto-redirect."
|
|
1793
|
+
},
|
|
1794
|
+
TeamSettingsPageKit: {
|
|
1795
|
+
props: z.object({
|
|
1796
|
+
shell: navigationShellSchema,
|
|
1797
|
+
state: z.enum([
|
|
1798
|
+
"loading",
|
|
1799
|
+
"empty",
|
|
1800
|
+
"filtered",
|
|
1801
|
+
"invited-member",
|
|
1802
|
+
"active-member",
|
|
1803
|
+
"saving",
|
|
1804
|
+
"fatal-error"
|
|
1805
|
+
]).nullable(),
|
|
1806
|
+
members: z.array(
|
|
1807
|
+
z.object({
|
|
1808
|
+
id: z.string(),
|
|
1809
|
+
name: z.string(),
|
|
1810
|
+
email: z.string(),
|
|
1811
|
+
role: z.enum(["owner", "admin", "member", "guest"]),
|
|
1812
|
+
status: z.enum(["active", "invited", "suspended"]),
|
|
1813
|
+
joinedLabel: z.string().nullable(),
|
|
1814
|
+
avatarUrl: z.string().nullable()
|
|
1815
|
+
})
|
|
1816
|
+
),
|
|
1817
|
+
seatSummary: z.object({
|
|
1818
|
+
usedSeats: z.number(),
|
|
1819
|
+
totalSeats: z.number()
|
|
1820
|
+
}),
|
|
1821
|
+
search: z.object({
|
|
1822
|
+
value: z.string(),
|
|
1823
|
+
placeholder: z.string().nullable()
|
|
1824
|
+
}),
|
|
1825
|
+
inviteAction: z.object({
|
|
1826
|
+
label: z.string(),
|
|
1827
|
+
canInvite: z.boolean().nullable(),
|
|
1828
|
+
disabledReason: z.string().nullable()
|
|
1829
|
+
}),
|
|
1830
|
+
memberActions: z.array(
|
|
1831
|
+
z.object({
|
|
1832
|
+
id: z.string(),
|
|
1833
|
+
label: z.string(),
|
|
1834
|
+
tone: z.enum(["default", "destructive"]).nullable()
|
|
1835
|
+
})
|
|
1836
|
+
).nullable(),
|
|
1837
|
+
selectedMemberId: z.string().nullable(),
|
|
1838
|
+
errorMessage: z.string().nullable()
|
|
1839
|
+
}),
|
|
1840
|
+
events: [
|
|
1841
|
+
"memberAction",
|
|
1842
|
+
"selectedMemberChange",
|
|
1843
|
+
"searchChange",
|
|
1844
|
+
"invite"
|
|
1845
|
+
],
|
|
1846
|
+
description: "Team management page with member table, seat summary, invite controls, and member actions."
|
|
1847
|
+
},
|
|
1848
|
+
TwoFactorPageKit: {
|
|
1849
|
+
props: z.object({
|
|
1850
|
+
mode: z.enum(["challenge", "setup"]).nullable(),
|
|
1851
|
+
challenge: z.object({
|
|
1852
|
+
error: z.string().nullable(),
|
|
1853
|
+
title: z.string().nullable(),
|
|
1854
|
+
description: z.string().nullable()
|
|
1855
|
+
}).nullable(),
|
|
1856
|
+
setup: z.object({
|
|
1857
|
+
qrCodeUrl: z.string().nullable(),
|
|
1858
|
+
secret: z.string().nullable(),
|
|
1859
|
+
backupCodes: z.array(z.string()).nullable(),
|
|
1860
|
+
title: z.string().nullable()
|
|
1861
|
+
}).nullable()
|
|
1862
|
+
}),
|
|
1863
|
+
events: ["verify", "useBackupCode", "backToLogin", "setupComplete"],
|
|
1864
|
+
description: "Two-factor authentication page with challenge (OTP entry) and setup (QR code + verification) modes."
|
|
1865
|
+
},
|
|
1866
|
+
VerifyEmailPageKit: {
|
|
1867
|
+
props: z.object({
|
|
1868
|
+
title: z.string().nullable(),
|
|
1869
|
+
description: z.string().nullable(),
|
|
1870
|
+
buttonText: z.string().nullable(),
|
|
1871
|
+
autoRedirectSeconds: z.number().nullable()
|
|
1872
|
+
}),
|
|
1873
|
+
events: ["continue"],
|
|
1874
|
+
description: "Email verification success page with icon, confirmation message, and continue action."
|
|
1875
|
+
},
|
|
1876
|
+
VoiceAgentsPageKit: {
|
|
1877
|
+
props: z.object({
|
|
1878
|
+
state: z.enum(["agent-selection", "active-conversation"]).nullable(),
|
|
1879
|
+
agents: z.array(
|
|
1880
|
+
z.object({
|
|
1881
|
+
id: z.string(),
|
|
1882
|
+
name: z.string(),
|
|
1883
|
+
role: z.string(),
|
|
1884
|
+
avatar: z.string(),
|
|
1885
|
+
availability: z.enum(["online", "busy", "offline"]).nullable()
|
|
1886
|
+
})
|
|
1887
|
+
),
|
|
1888
|
+
selectedAgentId: z.string().nullable(),
|
|
1889
|
+
presenceState: z.enum(["idle", "listening", "speaking"]).nullable(),
|
|
1890
|
+
messages: z.array(
|
|
1891
|
+
z.object({
|
|
1892
|
+
id: z.string(),
|
|
1893
|
+
role: z.enum(["user", "assistant", "agent", "system"]),
|
|
1894
|
+
content: z.string(),
|
|
1895
|
+
timestamp: z.string().nullable()
|
|
1896
|
+
})
|
|
1897
|
+
).nullable(),
|
|
1898
|
+
streamingReply: z.string().nullable(),
|
|
1899
|
+
composerValue: z.string().nullable(),
|
|
1900
|
+
composerPlaceholder: z.string().nullable(),
|
|
1901
|
+
noAgentsMessage: z.string().nullable()
|
|
1902
|
+
}),
|
|
1903
|
+
events: [
|
|
1904
|
+
"composerChange",
|
|
1905
|
+
"sendMessage",
|
|
1906
|
+
"selectAgent",
|
|
1907
|
+
"backToSelection"
|
|
1908
|
+
],
|
|
1909
|
+
description: "Voice agent interface with agent selection, conversation view, presence states, and real-time streaming."
|
|
1910
|
+
}
|
|
1911
|
+
};
|
|
1912
|
+
|
|
1913
|
+
export { seedComponentDefinitions, validateOnSchema, validationCheckSchema };
|