@mdxui/services 0.1.0
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 +58 -0
- package/dist/components/index.d.ts +74 -0
- package/dist/components/index.js +615 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index-D2nWoFGI.d.ts +1973 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +1322 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/index.d.ts +4 -0
- package/dist/schemas/index.js +591 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/shared/index.d.ts +54 -0
- package/dist/shared/index.js +63 -0
- package/dist/shared/index.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
// src/schemas/index.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
TextInputPropsSchema,
|
|
5
|
+
SelectInputPropsSchema,
|
|
6
|
+
RadioGroupInputPropsSchema,
|
|
7
|
+
FileInputPropsSchema
|
|
8
|
+
} from "mdxui";
|
|
9
|
+
var CatalogHeroSchema = z.object({
|
|
10
|
+
/** Main landing-page headline. Falls back to `service.name` when unset. */
|
|
11
|
+
headline: z.string().optional(),
|
|
12
|
+
/** Sub-headline. Falls back to `service.promise` when unset. */
|
|
13
|
+
subheadline: z.string().optional(),
|
|
14
|
+
/** Asset reference for a visual element resolved by the renderer.
|
|
15
|
+
* Today Carriage uses per-product HeroGlyph SVGs keyed by slug. */
|
|
16
|
+
visual: z.string().optional()
|
|
17
|
+
});
|
|
18
|
+
var PricingSummarySchema = z.enum([
|
|
19
|
+
"starting-at",
|
|
20
|
+
"per-call",
|
|
21
|
+
"tier-comparison",
|
|
22
|
+
"contact-us"
|
|
23
|
+
]);
|
|
24
|
+
var CatalogShapeSchema = z.object({
|
|
25
|
+
hero: CatalogHeroSchema.optional(),
|
|
26
|
+
pricingSummary: PricingSummarySchema
|
|
27
|
+
});
|
|
28
|
+
var TextInputSchema = TextInputPropsSchema.extend({
|
|
29
|
+
source: z.string().optional()
|
|
30
|
+
});
|
|
31
|
+
var SelectInputSchema = SelectInputPropsSchema.extend({
|
|
32
|
+
source: z.string().optional()
|
|
33
|
+
});
|
|
34
|
+
var RadioGroupInputSchema = RadioGroupInputPropsSchema.extend({
|
|
35
|
+
source: z.string().optional()
|
|
36
|
+
});
|
|
37
|
+
var FileInputSchema = FileInputPropsSchema.extend({
|
|
38
|
+
source: z.string().optional()
|
|
39
|
+
});
|
|
40
|
+
var OrderFlowSchema = z.enum([
|
|
41
|
+
"instant",
|
|
42
|
+
"guided",
|
|
43
|
+
"consultation-first"
|
|
44
|
+
]);
|
|
45
|
+
var OrderFieldSchema = z.object({
|
|
46
|
+
name: z.string(),
|
|
47
|
+
type: z.enum(["string", "number", "integer", "boolean"]),
|
|
48
|
+
required: z.boolean(),
|
|
49
|
+
title: z.string().optional(),
|
|
50
|
+
description: z.string().optional(),
|
|
51
|
+
enum: z.array(z.union([z.string(), z.number(), z.boolean()])).readonly().optional(),
|
|
52
|
+
pattern: z.string().optional(),
|
|
53
|
+
format: z.enum(["date", "date-time", "email", "uri"]).optional(),
|
|
54
|
+
minimum: z.number().optional(),
|
|
55
|
+
maximum: z.number().optional(),
|
|
56
|
+
widget: z.enum(["vin-decoder", "image-upload"]).optional(),
|
|
57
|
+
row: z.number().optional(),
|
|
58
|
+
placeholder: z.string().optional(),
|
|
59
|
+
autocomplete: z.string().optional(),
|
|
60
|
+
options: z.array(z.object({
|
|
61
|
+
value: z.union([z.string(), z.number(), z.boolean()]),
|
|
62
|
+
label: z.string().optional(),
|
|
63
|
+
sub: z.string().optional()
|
|
64
|
+
})).readonly().optional(),
|
|
65
|
+
tiers: z.array(z.string()).readonly().optional(),
|
|
66
|
+
/** Phase 1b multi-substrate (Carriage Iter / master 2026-05-26):
|
|
67
|
+
* forwarded from JSON Schema's `x-connect` vendor annotation. When
|
|
68
|
+
* set, the chassis form renders `<ConnectFlow>` instead of a
|
|
69
|
+
* TextField. upstream-proposal: §PR11-theme + §x-connect. */
|
|
70
|
+
xConnect: z.object({
|
|
71
|
+
providerId: z.string(),
|
|
72
|
+
resourceType: z.enum([
|
|
73
|
+
"channel",
|
|
74
|
+
"crm-record",
|
|
75
|
+
"sequence",
|
|
76
|
+
"phone-number",
|
|
77
|
+
"voice-line",
|
|
78
|
+
"webhook-event",
|
|
79
|
+
"database-table",
|
|
80
|
+
"folder",
|
|
81
|
+
"mailbox",
|
|
82
|
+
"account"
|
|
83
|
+
])
|
|
84
|
+
}).optional(),
|
|
85
|
+
/** Phase 1b multi-substrate: forwarded from JSON Schema's
|
|
86
|
+
* `x-derived-from` vendor annotation. When set, the chassis form
|
|
87
|
+
* suppresses input UI and auto-populates from connection metadata.
|
|
88
|
+
* upstream-proposal: §PR11-theme + §x-derived-from. */
|
|
89
|
+
xDerivedFrom: z.object({
|
|
90
|
+
providerId: z.string(),
|
|
91
|
+
metadataKey: z.string()
|
|
92
|
+
}).optional()
|
|
93
|
+
});
|
|
94
|
+
var OrderGroupSchema = z.object({
|
|
95
|
+
id: z.string(),
|
|
96
|
+
title: z.string(),
|
|
97
|
+
description: z.string().optional(),
|
|
98
|
+
fields: z.array(OrderFieldSchema).readonly()
|
|
99
|
+
});
|
|
100
|
+
var OrderStepSchema = z.object({
|
|
101
|
+
id: z.string(),
|
|
102
|
+
title: z.string().optional(),
|
|
103
|
+
fields: z.array(OrderFieldSchema).readonly(),
|
|
104
|
+
groups: z.array(OrderGroupSchema).readonly()
|
|
105
|
+
});
|
|
106
|
+
var OrderLegalSchema = z.object({
|
|
107
|
+
termsRequired: z.boolean(),
|
|
108
|
+
privacyRequired: z.boolean()
|
|
109
|
+
});
|
|
110
|
+
var OrderShapeSchema = z.object({
|
|
111
|
+
flow: OrderFlowSchema,
|
|
112
|
+
steps: z.array(OrderStepSchema).readonly().optional(),
|
|
113
|
+
legal: OrderLegalSchema.optional()
|
|
114
|
+
});
|
|
115
|
+
var DeliveryUxSchema = z.enum([
|
|
116
|
+
"sync-result-card",
|
|
117
|
+
"document-download",
|
|
118
|
+
"async-batch-status"
|
|
119
|
+
]);
|
|
120
|
+
var PreviewModeSchema = z.enum([
|
|
121
|
+
"first-page",
|
|
122
|
+
"first-row",
|
|
123
|
+
"inline-summary",
|
|
124
|
+
"none"
|
|
125
|
+
]);
|
|
126
|
+
var DeliveryShapeSchema = z.object({
|
|
127
|
+
ux: DeliveryUxSchema,
|
|
128
|
+
previewMode: PreviewModeSchema,
|
|
129
|
+
/** Whether to show a step-by-step progress timeline while the cascade runs. */
|
|
130
|
+
progressTimeline: z.boolean(),
|
|
131
|
+
/** Optional SLA echo — ISO 8601 duration (e.g. "PT2M"). */
|
|
132
|
+
estimatedDelivery: z.string().optional(),
|
|
133
|
+
/** Optional outcome predicate lifted from outcomeContract. */
|
|
134
|
+
outcomePredicate: z.string().optional()
|
|
135
|
+
});
|
|
136
|
+
var PortalColumnTypeSchema = z.enum([
|
|
137
|
+
"identifier",
|
|
138
|
+
"timestamp",
|
|
139
|
+
"currency",
|
|
140
|
+
"duration",
|
|
141
|
+
"status",
|
|
142
|
+
"text",
|
|
143
|
+
"evaluator"
|
|
144
|
+
]);
|
|
145
|
+
var PortalColumnSchema = z.object({
|
|
146
|
+
id: z.string(),
|
|
147
|
+
label: z.string(),
|
|
148
|
+
type: PortalColumnTypeSchema
|
|
149
|
+
});
|
|
150
|
+
var PortalActionKindSchema = z.enum([
|
|
151
|
+
"view-deliverable",
|
|
152
|
+
"reissue",
|
|
153
|
+
"refund",
|
|
154
|
+
"flag-for-review"
|
|
155
|
+
]);
|
|
156
|
+
var PortalActionSchema = z.object({
|
|
157
|
+
id: z.string(),
|
|
158
|
+
label: z.string(),
|
|
159
|
+
kind: PortalActionKindSchema
|
|
160
|
+
});
|
|
161
|
+
var PortalFilterSchema = z.object({
|
|
162
|
+
id: z.string(),
|
|
163
|
+
field: z.string(),
|
|
164
|
+
label: z.string()
|
|
165
|
+
});
|
|
166
|
+
var PortalShapeSchema = z.object({
|
|
167
|
+
columns: z.array(PortalColumnSchema),
|
|
168
|
+
filters: z.array(PortalFilterSchema).optional(),
|
|
169
|
+
actions: z.array(PortalActionSchema).optional()
|
|
170
|
+
});
|
|
171
|
+
var SiteActionSchema = z.object({
|
|
172
|
+
label: z.string(),
|
|
173
|
+
href: z.string(),
|
|
174
|
+
external: z.boolean().optional()
|
|
175
|
+
});
|
|
176
|
+
var HeroVariantSchema = z.enum([
|
|
177
|
+
"split-illustration-right",
|
|
178
|
+
"stacked-illustration-below"
|
|
179
|
+
]);
|
|
180
|
+
var HeroPropsExtendedSchema = z.object({
|
|
181
|
+
eyebrow: z.string(),
|
|
182
|
+
headline: z.string(),
|
|
183
|
+
body: z.string(),
|
|
184
|
+
primary: SiteActionSchema,
|
|
185
|
+
secondary: SiteActionSchema.optional(),
|
|
186
|
+
showGlyph: z.boolean().optional(),
|
|
187
|
+
/** When true, the glyph also renders below `lg` (stacked beneath
|
|
188
|
+
* the hero text on mobile). When false (default), the glyph is
|
|
189
|
+
* hidden below `lg`. Services opt in via `publicCopy.hero.glyphOnMobile`.
|
|
190
|
+
* upstream-proposal: docs/patterns/upstream-proposals.md §PR11-theme */
|
|
191
|
+
glyphOnMobile: z.boolean().optional(),
|
|
192
|
+
illustration: z.any().optional(),
|
|
193
|
+
/** Hero composition variant. Routes the `<Hero>` dispatcher to
|
|
194
|
+
* `HeroSplit` (default) or `HeroStacked`. Sourced from
|
|
195
|
+
* `ServiceDefinition.branding.heroVariant`.
|
|
196
|
+
* upstream-proposal: docs/patterns/upstream-proposals.md §PR12-hero-variant */
|
|
197
|
+
variant: HeroVariantSchema.optional()
|
|
198
|
+
});
|
|
199
|
+
var PriceTierSchema = z.object({
|
|
200
|
+
tierKey: z.string(),
|
|
201
|
+
tier: z.string(),
|
|
202
|
+
price: z.string(),
|
|
203
|
+
audience: z.string(),
|
|
204
|
+
features: z.array(z.string()),
|
|
205
|
+
featured: z.boolean().optional(),
|
|
206
|
+
cta: z.object({ label: z.string(), href: z.string() }),
|
|
207
|
+
sku: z.string(),
|
|
208
|
+
amountCents: z.number(),
|
|
209
|
+
currency: z.enum(["usd", "eur", "gbp"]),
|
|
210
|
+
stripeName: z.string(),
|
|
211
|
+
minimumAmountCents: z.number().optional(),
|
|
212
|
+
priceSuffix: z.string().optional()
|
|
213
|
+
});
|
|
214
|
+
var PricingPropsExtendedSchema = z.object({
|
|
215
|
+
eyebrow: z.string(),
|
|
216
|
+
heading: z.string(),
|
|
217
|
+
tiers: z.array(PriceTierSchema).readonly(),
|
|
218
|
+
footnote: z.string().optional()
|
|
219
|
+
});
|
|
220
|
+
var FaqItemSchema = z.object({
|
|
221
|
+
q: z.string(),
|
|
222
|
+
a: z.string()
|
|
223
|
+
});
|
|
224
|
+
var FaqPropsExtendedSchema = z.object({
|
|
225
|
+
eyebrow: z.string(),
|
|
226
|
+
heading: z.string(),
|
|
227
|
+
items: z.array(FaqItemSchema)
|
|
228
|
+
});
|
|
229
|
+
var HowItWorksStepSchema = z.object({
|
|
230
|
+
n: z.string(),
|
|
231
|
+
title: z.string(),
|
|
232
|
+
body: z.string()
|
|
233
|
+
});
|
|
234
|
+
var HowItWorksPropsSchema = z.object({
|
|
235
|
+
eyebrow: z.string(),
|
|
236
|
+
heading: z.string(),
|
|
237
|
+
steps: z.array(HowItWorksStepSchema),
|
|
238
|
+
/** Optional mini-illustration per step. When provided and length
|
|
239
|
+
* matches `steps.length`, each step renders its illustration in
|
|
240
|
+
* a row above the number. All-or-none — if length doesn't match,
|
|
241
|
+
* the prop is silently ignored and the text-only layout renders
|
|
242
|
+
* (per opt-in-only semantics in illustrations.md §2).
|
|
243
|
+
*
|
|
244
|
+
* Sourced from the per-service illustration manifest at
|
|
245
|
+
* `src/services/<slug>/illustration.tsx`.
|
|
246
|
+
*
|
|
247
|
+
* Each element is a React `ComponentType` (zero-arg renderer).
|
|
248
|
+
* Zod can't validate component identity at runtime; type-level
|
|
249
|
+
* contract carries via `z.custom`.
|
|
250
|
+
*
|
|
251
|
+
* upstream-proposal: docs/patterns/upstream-proposals.md §PR12-step-illustrations
|
|
252
|
+
* (master 2026-05-26 — illustration abstraction Phase 4). */
|
|
253
|
+
stepIllustrations: z.array(z.custom()).optional()
|
|
254
|
+
});
|
|
255
|
+
var WhatYouGetItemSchema = z.object({
|
|
256
|
+
n: z.string(),
|
|
257
|
+
title: z.string(),
|
|
258
|
+
body: z.string()
|
|
259
|
+
});
|
|
260
|
+
var WhatYouGetPropsSchema = z.object({
|
|
261
|
+
eyebrow: z.string(),
|
|
262
|
+
heading: z.string(),
|
|
263
|
+
sections: z.array(WhatYouGetItemSchema)
|
|
264
|
+
});
|
|
265
|
+
var FinalCtaPropsSchema = z.object({
|
|
266
|
+
eyebrow: z.string(),
|
|
267
|
+
headline: z.string(),
|
|
268
|
+
primary: SiteActionSchema,
|
|
269
|
+
secondary: SiteActionSchema.optional()
|
|
270
|
+
});
|
|
271
|
+
var MastheadPropsSchema = z.object({
|
|
272
|
+
brand: z.object({
|
|
273
|
+
primary: z.string(),
|
|
274
|
+
secondary: z.string().optional(),
|
|
275
|
+
href: z.string()
|
|
276
|
+
}),
|
|
277
|
+
cta: z.object({ label: z.string(), href: z.string() }).optional(),
|
|
278
|
+
eyebrow: z.string().optional(),
|
|
279
|
+
narrow: z.boolean().optional()
|
|
280
|
+
});
|
|
281
|
+
var SiteFooterLinkSchema = z.object({
|
|
282
|
+
label: z.string(),
|
|
283
|
+
href: z.string()
|
|
284
|
+
});
|
|
285
|
+
var SiteFooterPropsSchema = z.object({
|
|
286
|
+
text: z.string(),
|
|
287
|
+
links: z.array(SiteFooterLinkSchema).optional()
|
|
288
|
+
});
|
|
289
|
+
var TextFieldPropsSchema = z.object({
|
|
290
|
+
label: z.string(),
|
|
291
|
+
value: z.string(),
|
|
292
|
+
onChange: z.custom(),
|
|
293
|
+
placeholder: z.string().optional(),
|
|
294
|
+
/** Helper text shown below the field. `invalid=true` renders it in error colour. */
|
|
295
|
+
hint: z.string().optional(),
|
|
296
|
+
type: z.enum(["text", "date", "number", "email"]).optional(),
|
|
297
|
+
/** Right-edge suffix label (e.g. "miles", "%"). */
|
|
298
|
+
suffix: z.string().optional(),
|
|
299
|
+
/** Renders the input in a monospace typeface (e.g. VIN, code). */
|
|
300
|
+
mono: z.boolean().optional(),
|
|
301
|
+
/** Renders the field in error state (red border + hint text). */
|
|
302
|
+
invalid: z.boolean().optional(),
|
|
303
|
+
inputRef: z.custom().optional(),
|
|
304
|
+
/** HTML `autocomplete` attribute for browser autofill. */
|
|
305
|
+
autoComplete: z.string().optional()
|
|
306
|
+
});
|
|
307
|
+
var SelectFieldPropsSchema = z.object({
|
|
308
|
+
label: z.string(),
|
|
309
|
+
value: z.string(),
|
|
310
|
+
onChange: z.custom(),
|
|
311
|
+
options: z.array(z.object({ value: z.string(), label: z.string() })),
|
|
312
|
+
/** HTML `autocomplete` attribute for browser autofill. */
|
|
313
|
+
autoComplete: z.string().optional()
|
|
314
|
+
});
|
|
315
|
+
var RadioGroupOptionSchema = z.object({
|
|
316
|
+
value: z.string(),
|
|
317
|
+
label: z.string(),
|
|
318
|
+
/** Optional secondary descriptor line rendered inside the card. */
|
|
319
|
+
sub: z.string().optional()
|
|
320
|
+
});
|
|
321
|
+
var RadioGroupPropsSchema = z.object({
|
|
322
|
+
label: z.string(),
|
|
323
|
+
name: z.string(),
|
|
324
|
+
value: z.string(),
|
|
325
|
+
onChange: z.custom(),
|
|
326
|
+
options: z.array(RadioGroupOptionSchema)
|
|
327
|
+
});
|
|
328
|
+
var FieldRowPropsSchema = z.object({
|
|
329
|
+
children: z.custom()
|
|
330
|
+
});
|
|
331
|
+
var StepHeadingPropsSchema = z.object({
|
|
332
|
+
/** Numeric step indicator, e.g. "01", "02". Rendered in tabular mono. */
|
|
333
|
+
index: z.string(),
|
|
334
|
+
/** Short action-verb eyebrow label. e.g. "Connect", "Compose". */
|
|
335
|
+
eyebrow: z.string(),
|
|
336
|
+
/** Primary section heading. */
|
|
337
|
+
title: z.string(),
|
|
338
|
+
/** Supporting body copy below the heading. */
|
|
339
|
+
body: z.string(),
|
|
340
|
+
className: z.string().optional()
|
|
341
|
+
});
|
|
342
|
+
var LogoUploadPropsSchema = z.object({
|
|
343
|
+
/** Resolved Vercel-Blob URL, or null when no logo is set. */
|
|
344
|
+
value: z.string().nullable(),
|
|
345
|
+
/** True while the upload network call is in-flight. */
|
|
346
|
+
uploading: z.boolean(),
|
|
347
|
+
/** Error message from the last failed upload attempt, or null. */
|
|
348
|
+
error: z.string().nullable(),
|
|
349
|
+
onChange: z.custom(),
|
|
350
|
+
onClear: z.custom(),
|
|
351
|
+
/** Widget label override (default: "Firm logo (optional)"). */
|
|
352
|
+
label: z.string().optional(),
|
|
353
|
+
/** Body copy override below the preview thumbnail. */
|
|
354
|
+
bodyText: z.string().optional()
|
|
355
|
+
});
|
|
356
|
+
var ImageUploadFieldPropsSchema = z.object({
|
|
357
|
+
/** Renderer label — sourced from `OrderField.title`. */
|
|
358
|
+
label: z.string(),
|
|
359
|
+
/** Helper text — sourced from `OrderField.description`. */
|
|
360
|
+
description: z.string().optional(),
|
|
361
|
+
/** Current value (resolved Vercel-Blob URL, or null). */
|
|
362
|
+
value: z.string().nullable(),
|
|
363
|
+
/** Called with the new URL after a successful upload, or null on clear. */
|
|
364
|
+
onChange: z.custom()
|
|
365
|
+
});
|
|
366
|
+
var PricingSectionChromeSchema = z.object({
|
|
367
|
+
eyebrow: z.string(),
|
|
368
|
+
heading: z.string(),
|
|
369
|
+
footnote: z.string().optional(),
|
|
370
|
+
currency: z.enum(["usd", "eur", "gbp"])
|
|
371
|
+
});
|
|
372
|
+
var PricingTieredSchema = PricingSectionChromeSchema.extend({
|
|
373
|
+
kind: z.literal("tiered"),
|
|
374
|
+
tiers: z.array(PriceTierSchema).readonly()
|
|
375
|
+
});
|
|
376
|
+
var PricingUnitSchema = PricingSectionChromeSchema.extend({
|
|
377
|
+
kind: z.literal("unit"),
|
|
378
|
+
perUnit: z.number(),
|
|
379
|
+
billingCadence: z.string()
|
|
380
|
+
});
|
|
381
|
+
var PricingSchema = z.union([PricingTieredSchema, PricingUnitSchema]);
|
|
382
|
+
var ServiceFormPropsSchema = z.object({
|
|
383
|
+
/** Service slug — used in the `/api/checkout` body + return-URL construction. */
|
|
384
|
+
slug: z.string(),
|
|
385
|
+
/** Derived order shape from `deriveOrder(svc)`. */
|
|
386
|
+
order: OrderShapeSchema,
|
|
387
|
+
/** Service pricing — from `ServiceDefinition.pricing`. Mirrors the `Pricing` union. */
|
|
388
|
+
pricing: PricingSchema,
|
|
389
|
+
/** Form-phase headline (h1 above the fields). Optional — omit in unit tests. */
|
|
390
|
+
formHeadline: z.string().optional(),
|
|
391
|
+
/** Form-phase intro paragraph. Optional. */
|
|
392
|
+
formIntro: z.string().optional(),
|
|
393
|
+
/** Product-name eyebrow (e.g. "Carriage Donation") rendered above the h1. */
|
|
394
|
+
productName: z.string().optional(),
|
|
395
|
+
/** Payment-phase h1. Defaults to "Generate your report" when unset. */
|
|
396
|
+
paymentHeadline: z.string().optional()
|
|
397
|
+
});
|
|
398
|
+
var CheckoutPanelPropsSchema = z.object({
|
|
399
|
+
/** Stripe PaymentIntent client secret from /api/checkout. */
|
|
400
|
+
clientSecret: z.string(),
|
|
401
|
+
/** Payment amount in cents — displayed as "Pay $X.XX & {ctaSuffix}". */
|
|
402
|
+
amountCents: z.number(),
|
|
403
|
+
/** Email pre-fill passed to Stripe as receipt email. */
|
|
404
|
+
email: z.string().optional(),
|
|
405
|
+
/** Where Stripe redirects after a successful payment (redirect flow). */
|
|
406
|
+
returnUrl: z.string().optional(),
|
|
407
|
+
/** Optional inline-confirmation callback (inline flow — bulk products). */
|
|
408
|
+
onSuccess: z.custom().optional(),
|
|
409
|
+
/** Custom CTA suffix on the Pay button. Default: "generate report". */
|
|
410
|
+
ctaSuffix: z.string().optional(),
|
|
411
|
+
/** "Edit details" callback — re-shows the form. */
|
|
412
|
+
onCancel: z.custom()
|
|
413
|
+
});
|
|
414
|
+
var DefensibilityColumnSchema = z.object({
|
|
415
|
+
heading: z.string(),
|
|
416
|
+
/** Array of bullet content. Each bullet is a ReactNode — strings in
|
|
417
|
+
* practice today; rich content possible in future JSON upgrades. */
|
|
418
|
+
bullets: z.array(z.custom())
|
|
419
|
+
});
|
|
420
|
+
var DefensibilityPropsSchema = z.object({
|
|
421
|
+
eyebrow: z.string(),
|
|
422
|
+
heading: z.string(),
|
|
423
|
+
/** Tuple of exactly two columns (left = "what it is", right = "what it isn't"). */
|
|
424
|
+
columns: z.tuple([DefensibilityColumnSchema, DefensibilityColumnSchema]),
|
|
425
|
+
/** Optional closing caveat paragraph. */
|
|
426
|
+
caveat: z.custom().optional()
|
|
427
|
+
});
|
|
428
|
+
var UpsellBannerPropsSchema = z.object({
|
|
429
|
+
/** Display-serif hook line. Often phrased as a question. */
|
|
430
|
+
headline: z.string(),
|
|
431
|
+
/** Optional one-line explanation below the headline. */
|
|
432
|
+
body: z.string().optional(),
|
|
433
|
+
/** Activation pill content — ReactNode for inline price transitions. */
|
|
434
|
+
cta: z.custom(),
|
|
435
|
+
onActivate: z.custom()
|
|
436
|
+
});
|
|
437
|
+
var UpsellCardPropsSchema = z.object({
|
|
438
|
+
eyebrow: z.string(),
|
|
439
|
+
/** Card body — ReactNode for future rich-text upgrades. */
|
|
440
|
+
body: z.custom(),
|
|
441
|
+
ctaLabel: z.string(),
|
|
442
|
+
onActivate: z.custom()
|
|
443
|
+
});
|
|
444
|
+
var CtaSchema = z.object({
|
|
445
|
+
label: z.string(),
|
|
446
|
+
href: z.string()
|
|
447
|
+
});
|
|
448
|
+
var BreadcrumbSchema = z.object({
|
|
449
|
+
name: z.string(),
|
|
450
|
+
href: z.string()
|
|
451
|
+
});
|
|
452
|
+
var ServiceSchemaSpecSchema = z.object({
|
|
453
|
+
name: z.string(),
|
|
454
|
+
serviceType: z.string(),
|
|
455
|
+
url: z.string(),
|
|
456
|
+
areaServed: z.string()
|
|
457
|
+
});
|
|
458
|
+
var ProblemItemSchema = z.object({
|
|
459
|
+
label: z.string(),
|
|
460
|
+
cost: z.string(),
|
|
461
|
+
outcome: z.string(),
|
|
462
|
+
body: z.string()
|
|
463
|
+
});
|
|
464
|
+
var ProblemPropsSchema = z.object({
|
|
465
|
+
eyebrow: z.string(),
|
|
466
|
+
heading: z.string(),
|
|
467
|
+
items: z.array(ProblemItemSchema)
|
|
468
|
+
});
|
|
469
|
+
var ServiceBrandingSchema = z.object({
|
|
470
|
+
primary: z.string(),
|
|
471
|
+
secondary: z.string().optional(),
|
|
472
|
+
productName: z.string(),
|
|
473
|
+
/** SERP title default for the landing page. */
|
|
474
|
+
defaultTitle: z.string(),
|
|
475
|
+
/** OG/SERP description default. */
|
|
476
|
+
defaultDescription: z.string(),
|
|
477
|
+
heroGlyph: z.string().optional(),
|
|
478
|
+
showHeroGlyph: z.boolean().optional(),
|
|
479
|
+
og: z.object({ headline: z.string() })
|
|
480
|
+
});
|
|
481
|
+
var LandingPublicCopySchema = z.object({
|
|
482
|
+
pageTitle: z.string(),
|
|
483
|
+
pageDescription: z.string(),
|
|
484
|
+
headerCta: CtaSchema,
|
|
485
|
+
hero: HeroPropsExtendedSchema,
|
|
486
|
+
problem: ProblemPropsSchema,
|
|
487
|
+
whatYouGet: WhatYouGetPropsSchema,
|
|
488
|
+
howItWorks: HowItWorksPropsSchema,
|
|
489
|
+
defensibility: DefensibilityPropsSchema,
|
|
490
|
+
faq: FaqPropsExtendedSchema,
|
|
491
|
+
finalCta: FinalCtaPropsSchema,
|
|
492
|
+
footerText: z.string(),
|
|
493
|
+
serviceSchema: ServiceSchemaSpecSchema,
|
|
494
|
+
breadcrumbs: z.array(BreadcrumbSchema).optional()
|
|
495
|
+
});
|
|
496
|
+
var LandingPricingSchema = z.object({
|
|
497
|
+
kind: z.enum(["tiered", "unit"]),
|
|
498
|
+
eyebrow: z.string(),
|
|
499
|
+
heading: z.string(),
|
|
500
|
+
footnote: z.string().optional(),
|
|
501
|
+
currency: z.enum(["usd", "eur", "gbp"]).optional(),
|
|
502
|
+
tiers: z.array(PriceTierSchema).readonly().optional(),
|
|
503
|
+
/** unit pricing fields — optional; only present when kind='unit' */
|
|
504
|
+
perUnit: z.number().optional(),
|
|
505
|
+
billingCadence: z.string().optional()
|
|
506
|
+
});
|
|
507
|
+
var ServiceArchetypeIdSchema = z.enum([
|
|
508
|
+
"service-archetype-document-extraction",
|
|
509
|
+
"service-archetype-data-enrichment",
|
|
510
|
+
"service-archetype-transactional-action",
|
|
511
|
+
"service-archetype-sourced-comparative-analysis",
|
|
512
|
+
"service-archetype-form-preparation",
|
|
513
|
+
"service-archetype-compliance-check",
|
|
514
|
+
"service-archetype-market-intelligence",
|
|
515
|
+
"service-archetype-communication-automation"
|
|
516
|
+
]);
|
|
517
|
+
var CatalogShapeFullSchema = CatalogShapeSchema.extend({
|
|
518
|
+
/** Full landing-page section copy. Present for all fully-absorbed services. */
|
|
519
|
+
publicCopy: LandingPublicCopySchema.optional(),
|
|
520
|
+
/** Product branding (wordmark + heroGlyph + og headline). */
|
|
521
|
+
branding: ServiceBrandingSchema.optional(),
|
|
522
|
+
/** Commercial pricing — section chrome + tiers. */
|
|
523
|
+
pricing: LandingPricingSchema.optional(),
|
|
524
|
+
/** Service archetype id — drives MIME/totalTime defaults at render time. */
|
|
525
|
+
archetype: ServiceArchetypeIdSchema.optional()
|
|
526
|
+
});
|
|
527
|
+
export {
|
|
528
|
+
BreadcrumbSchema,
|
|
529
|
+
CatalogHeroSchema,
|
|
530
|
+
CatalogShapeFullSchema,
|
|
531
|
+
CatalogShapeSchema,
|
|
532
|
+
CheckoutPanelPropsSchema,
|
|
533
|
+
CtaSchema,
|
|
534
|
+
DefensibilityColumnSchema,
|
|
535
|
+
DefensibilityPropsSchema,
|
|
536
|
+
DeliveryShapeSchema,
|
|
537
|
+
DeliveryUxSchema,
|
|
538
|
+
FaqItemSchema,
|
|
539
|
+
FaqPropsExtendedSchema,
|
|
540
|
+
FieldRowPropsSchema,
|
|
541
|
+
FileInputSchema,
|
|
542
|
+
FinalCtaPropsSchema,
|
|
543
|
+
HeroPropsExtendedSchema,
|
|
544
|
+
HeroVariantSchema,
|
|
545
|
+
HowItWorksPropsSchema,
|
|
546
|
+
HowItWorksStepSchema,
|
|
547
|
+
ImageUploadFieldPropsSchema,
|
|
548
|
+
LandingPricingSchema,
|
|
549
|
+
LandingPublicCopySchema,
|
|
550
|
+
LogoUploadPropsSchema,
|
|
551
|
+
MastheadPropsSchema,
|
|
552
|
+
OrderFieldSchema,
|
|
553
|
+
OrderFlowSchema,
|
|
554
|
+
OrderGroupSchema,
|
|
555
|
+
OrderLegalSchema,
|
|
556
|
+
OrderShapeSchema,
|
|
557
|
+
OrderStepSchema,
|
|
558
|
+
PortalActionKindSchema,
|
|
559
|
+
PortalActionSchema,
|
|
560
|
+
PortalColumnSchema,
|
|
561
|
+
PortalColumnTypeSchema,
|
|
562
|
+
PortalFilterSchema,
|
|
563
|
+
PortalShapeSchema,
|
|
564
|
+
PreviewModeSchema,
|
|
565
|
+
PriceTierSchema,
|
|
566
|
+
PricingPropsExtendedSchema,
|
|
567
|
+
PricingSchema,
|
|
568
|
+
PricingSummarySchema,
|
|
569
|
+
ProblemItemSchema,
|
|
570
|
+
ProblemPropsSchema,
|
|
571
|
+
RadioGroupInputSchema,
|
|
572
|
+
RadioGroupOptionSchema,
|
|
573
|
+
RadioGroupPropsSchema,
|
|
574
|
+
SelectFieldPropsSchema,
|
|
575
|
+
SelectInputSchema,
|
|
576
|
+
ServiceArchetypeIdSchema,
|
|
577
|
+
ServiceBrandingSchema,
|
|
578
|
+
ServiceFormPropsSchema,
|
|
579
|
+
ServiceSchemaSpecSchema,
|
|
580
|
+
SiteActionSchema,
|
|
581
|
+
SiteFooterLinkSchema,
|
|
582
|
+
SiteFooterPropsSchema,
|
|
583
|
+
StepHeadingPropsSchema,
|
|
584
|
+
TextFieldPropsSchema,
|
|
585
|
+
TextInputSchema,
|
|
586
|
+
UpsellBannerPropsSchema,
|
|
587
|
+
UpsellCardPropsSchema,
|
|
588
|
+
WhatYouGetItemSchema,
|
|
589
|
+
WhatYouGetPropsSchema
|
|
590
|
+
};
|
|
591
|
+
//# sourceMappingURL=index.js.map
|