@bitbaum/sitekit 0.3.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.
@@ -0,0 +1,573 @@
1
+ /**
2
+ * The content model: a site is pages, a page is sections, and sections come
3
+ * from a small CLOSED set of shapes.
4
+ *
5
+ * The closed set is the design, not a limitation. A generator emitting data
6
+ * against this schema is a task with a machine-checkable result; a generator
7
+ * emitting components is not. Per-site quality becomes a property of the
8
+ * renderers — fixing one renderer improves every site ever generated.
9
+ *
10
+ * Zod is the single source of truth here: every TypeScript type is inferred
11
+ * from its schema, never written twice. Extracted from substrata's
12
+ * `config/site-content.ts` (2026-08-26), which remains the reference consumer.
13
+ */
14
+ import { z } from 'zod';
15
+ /** A stat worth putting at the top of a page. */
16
+ export declare const siteStatSchema: z.ZodObject<{
17
+ label: z.ZodString;
18
+ value: z.ZodString;
19
+ note: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strip>;
21
+ export type SiteStat = z.infer<typeof siteStatSchema>;
22
+ export declare const siteCardSchema: z.ZodObject<{
23
+ title: z.ZodString;
24
+ body: z.ZodString;
25
+ meta: z.ZodOptional<z.ZodString>;
26
+ icon: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>;
28
+ export type SiteCard = z.infer<typeof siteCardSchema>;
29
+ export declare const siteDefinitionSchema: z.ZodObject<{
30
+ term: z.ZodString;
31
+ detail: z.ZodString;
32
+ }, z.core.$strip>;
33
+ export type SiteDefinition = z.infer<typeof siteDefinitionSchema>;
34
+ export declare const siteIndexEntrySchema: z.ZodObject<{
35
+ label: z.ZodString;
36
+ meta: z.ZodOptional<z.ZodString>;
37
+ anchor: z.ZodString;
38
+ }, z.core.$strip>;
39
+ export type SiteIndexEntry = z.infer<typeof siteIndexEntrySchema>;
40
+ /** A call to action: what the button says and where it goes. */
41
+ export declare const siteActionSchema: z.ZodObject<{
42
+ label: z.ZodString;
43
+ href: z.ZodString;
44
+ }, z.core.$strip>;
45
+ export type SiteAction = z.infer<typeof siteActionSchema>;
46
+ export declare const siteImageSchema: z.ZodObject<{
47
+ src: z.ZodString;
48
+ alt: z.ZodString;
49
+ }, z.core.$strip>;
50
+ export type SiteImage = z.infer<typeof siteImageSchema>;
51
+ /**
52
+ * A physical place. These are exactly the fields the provenance rules exist
53
+ * to protect: a plausible-but-wrong address or opening time is the one detail
54
+ * that actively damages the business a site is about.
55
+ */
56
+ export declare const siteLocationSchema: z.ZodObject<{
57
+ name: z.ZodString;
58
+ note: z.ZodOptional<z.ZodString>;
59
+ address: z.ZodString;
60
+ phone: z.ZodOptional<z.ZodString>;
61
+ hours: z.ZodOptional<z.ZodArray<z.ZodString>>;
62
+ }, z.core.$strip>;
63
+ export type SiteLocation = z.infer<typeof siteLocationSchema>;
64
+ export declare const siteFaqItemSchema: z.ZodObject<{
65
+ question: z.ZodString;
66
+ answer: z.ZodString;
67
+ }, z.core.$strip>;
68
+ export type SiteFaqItem = z.infer<typeof siteFaqItemSchema>;
69
+ /**
70
+ * Opens a page in place of the standard title block. An eyebrow, one display
71
+ * statement, and the lead. Only ever the FIRST section of a page — the page
72
+ * schema enforces it, and the shell suppresses its own header when present so
73
+ * the two cannot both render.
74
+ */
75
+ export declare const heroSectionSchema: z.ZodObject<{
76
+ kind: z.ZodLiteral<"hero">;
77
+ eyebrow: z.ZodOptional<z.ZodString>;
78
+ statement: z.ZodString;
79
+ lead: z.ZodArray<z.ZodString>;
80
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
81
+ label: z.ZodString;
82
+ href: z.ZodString;
83
+ }, z.core.$strip>>>;
84
+ }, z.core.$strip>;
85
+ export declare const proseSectionSchema: z.ZodObject<{
86
+ kind: z.ZodLiteral<"prose">;
87
+ heading: z.ZodOptional<z.ZodString>;
88
+ anchor: z.ZodOptional<z.ZodString>;
89
+ paragraphs: z.ZodArray<z.ZodString>;
90
+ }, z.core.$strip>;
91
+ export declare const statsSectionSchema: z.ZodObject<{
92
+ kind: z.ZodLiteral<"stats">;
93
+ heading: z.ZodOptional<z.ZodString>;
94
+ anchor: z.ZodOptional<z.ZodString>;
95
+ stats: z.ZodArray<z.ZodObject<{
96
+ label: z.ZodString;
97
+ value: z.ZodString;
98
+ note: z.ZodOptional<z.ZodString>;
99
+ }, z.core.$strip>>;
100
+ }, z.core.$strip>;
101
+ /**
102
+ * One number that deserves a picture. The gap between `value` and `of` IS the
103
+ * message — an empty bar is the honest rendering of "nothing sourced yet",
104
+ * and it should look empty.
105
+ */
106
+ export declare const meterSectionSchema: z.ZodObject<{
107
+ kind: z.ZodLiteral<"meter">;
108
+ heading: z.ZodOptional<z.ZodString>;
109
+ anchor: z.ZodOptional<z.ZodString>;
110
+ label: z.ZodString;
111
+ value: z.ZodNumber;
112
+ of: z.ZodNumber;
113
+ caption: z.ZodOptional<z.ZodString>;
114
+ }, z.core.$strip>;
115
+ export declare const cardsSectionSchema: z.ZodObject<{
116
+ kind: z.ZodLiteral<"cards">;
117
+ heading: z.ZodOptional<z.ZodString>;
118
+ blurb: z.ZodOptional<z.ZodString>;
119
+ anchor: z.ZodOptional<z.ZodString>;
120
+ columns: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>>;
121
+ cards: z.ZodArray<z.ZodObject<{
122
+ title: z.ZodString;
123
+ body: z.ZodString;
124
+ meta: z.ZodOptional<z.ZodString>;
125
+ icon: z.ZodOptional<z.ZodString>;
126
+ }, z.core.$strip>>;
127
+ }, z.core.$strip>;
128
+ export declare const definitionsSectionSchema: z.ZodObject<{
129
+ kind: z.ZodLiteral<"definitions">;
130
+ heading: z.ZodOptional<z.ZodString>;
131
+ blurb: z.ZodOptional<z.ZodString>;
132
+ anchor: z.ZodOptional<z.ZodString>;
133
+ items: z.ZodArray<z.ZodObject<{
134
+ term: z.ZodString;
135
+ detail: z.ZodString;
136
+ }, z.core.$strip>>;
137
+ }, z.core.$strip>;
138
+ /**
139
+ * A split: a figure (or just space) beside a story. The founder, the
140
+ * workshop, the thing that makes this business this business. The one
141
+ * section on a small-business site that is allowed to be personal.
142
+ */
143
+ export declare const featureSectionSchema: z.ZodObject<{
144
+ kind: z.ZodLiteral<"feature">;
145
+ heading: z.ZodOptional<z.ZodString>;
146
+ anchor: z.ZodOptional<z.ZodString>;
147
+ paragraphs: z.ZodArray<z.ZodString>;
148
+ quote: z.ZodOptional<z.ZodString>;
149
+ cta: z.ZodOptional<z.ZodObject<{
150
+ label: z.ZodString;
151
+ href: z.ZodString;
152
+ }, z.core.$strip>>;
153
+ image: z.ZodOptional<z.ZodObject<{
154
+ src: z.ZodString;
155
+ alt: z.ZodString;
156
+ }, z.core.$strip>>;
157
+ }, z.core.$strip>;
158
+ /** Where the business actually is. See `siteLocationSchema` on why this exists. */
159
+ export declare const contactSectionSchema: z.ZodObject<{
160
+ kind: z.ZodLiteral<"contact">;
161
+ heading: z.ZodOptional<z.ZodString>;
162
+ blurb: z.ZodOptional<z.ZodString>;
163
+ anchor: z.ZodOptional<z.ZodString>;
164
+ locations: z.ZodArray<z.ZodObject<{
165
+ name: z.ZodString;
166
+ note: z.ZodOptional<z.ZodString>;
167
+ address: z.ZodString;
168
+ phone: z.ZodOptional<z.ZodString>;
169
+ hours: z.ZodOptional<z.ZodArray<z.ZodString>>;
170
+ }, z.core.$strip>>;
171
+ }, z.core.$strip>;
172
+ export declare const faqSectionSchema: z.ZodObject<{
173
+ kind: z.ZodLiteral<"faq">;
174
+ heading: z.ZodOptional<z.ZodString>;
175
+ anchor: z.ZodOptional<z.ZodString>;
176
+ items: z.ZodArray<z.ZodObject<{
177
+ question: z.ZodString;
178
+ answer: z.ZodString;
179
+ }, z.core.$strip>>;
180
+ }, z.core.$strip>;
181
+ /** Jump list for a long page. Without one, fifteen tables is a scroll, not a document. */
182
+ export declare const indexSectionSchema: z.ZodObject<{
183
+ kind: z.ZodLiteral<"index">;
184
+ heading: z.ZodOptional<z.ZodString>;
185
+ blurb: z.ZodOptional<z.ZodString>;
186
+ entries: z.ZodArray<z.ZodObject<{
187
+ label: z.ZodString;
188
+ meta: z.ZodOptional<z.ZodString>;
189
+ anchor: z.ZodString;
190
+ }, z.core.$strip>>;
191
+ }, z.core.$strip>;
192
+ export declare const tableSectionSchema: z.ZodObject<{
193
+ kind: z.ZodLiteral<"table">;
194
+ heading: z.ZodOptional<z.ZodString>;
195
+ blurb: z.ZodOptional<z.ZodString>;
196
+ anchor: z.ZodOptional<z.ZodString>;
197
+ columns: z.ZodArray<z.ZodString>;
198
+ rows: z.ZodArray<z.ZodArray<z.ZodString>>;
199
+ monoColumns: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
200
+ statusColumn: z.ZodOptional<z.ZodNumber>;
201
+ note: z.ZodOptional<z.ZodString>;
202
+ }, z.core.$strip>;
203
+ export declare const siteSectionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
204
+ kind: z.ZodLiteral<"hero">;
205
+ eyebrow: z.ZodOptional<z.ZodString>;
206
+ statement: z.ZodString;
207
+ lead: z.ZodArray<z.ZodString>;
208
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
209
+ label: z.ZodString;
210
+ href: z.ZodString;
211
+ }, z.core.$strip>>>;
212
+ }, z.core.$strip>, z.ZodObject<{
213
+ kind: z.ZodLiteral<"prose">;
214
+ heading: z.ZodOptional<z.ZodString>;
215
+ anchor: z.ZodOptional<z.ZodString>;
216
+ paragraphs: z.ZodArray<z.ZodString>;
217
+ }, z.core.$strip>, z.ZodObject<{
218
+ kind: z.ZodLiteral<"stats">;
219
+ heading: z.ZodOptional<z.ZodString>;
220
+ anchor: z.ZodOptional<z.ZodString>;
221
+ stats: z.ZodArray<z.ZodObject<{
222
+ label: z.ZodString;
223
+ value: z.ZodString;
224
+ note: z.ZodOptional<z.ZodString>;
225
+ }, z.core.$strip>>;
226
+ }, z.core.$strip>, z.ZodObject<{
227
+ kind: z.ZodLiteral<"meter">;
228
+ heading: z.ZodOptional<z.ZodString>;
229
+ anchor: z.ZodOptional<z.ZodString>;
230
+ label: z.ZodString;
231
+ value: z.ZodNumber;
232
+ of: z.ZodNumber;
233
+ caption: z.ZodOptional<z.ZodString>;
234
+ }, z.core.$strip>, z.ZodObject<{
235
+ kind: z.ZodLiteral<"cards">;
236
+ heading: z.ZodOptional<z.ZodString>;
237
+ blurb: z.ZodOptional<z.ZodString>;
238
+ anchor: z.ZodOptional<z.ZodString>;
239
+ columns: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>>;
240
+ cards: z.ZodArray<z.ZodObject<{
241
+ title: z.ZodString;
242
+ body: z.ZodString;
243
+ meta: z.ZodOptional<z.ZodString>;
244
+ icon: z.ZodOptional<z.ZodString>;
245
+ }, z.core.$strip>>;
246
+ }, z.core.$strip>, z.ZodObject<{
247
+ kind: z.ZodLiteral<"definitions">;
248
+ heading: z.ZodOptional<z.ZodString>;
249
+ blurb: z.ZodOptional<z.ZodString>;
250
+ anchor: z.ZodOptional<z.ZodString>;
251
+ items: z.ZodArray<z.ZodObject<{
252
+ term: z.ZodString;
253
+ detail: z.ZodString;
254
+ }, z.core.$strip>>;
255
+ }, z.core.$strip>, z.ZodObject<{
256
+ kind: z.ZodLiteral<"feature">;
257
+ heading: z.ZodOptional<z.ZodString>;
258
+ anchor: z.ZodOptional<z.ZodString>;
259
+ paragraphs: z.ZodArray<z.ZodString>;
260
+ quote: z.ZodOptional<z.ZodString>;
261
+ cta: z.ZodOptional<z.ZodObject<{
262
+ label: z.ZodString;
263
+ href: z.ZodString;
264
+ }, z.core.$strip>>;
265
+ image: z.ZodOptional<z.ZodObject<{
266
+ src: z.ZodString;
267
+ alt: z.ZodString;
268
+ }, z.core.$strip>>;
269
+ }, z.core.$strip>, z.ZodObject<{
270
+ kind: z.ZodLiteral<"contact">;
271
+ heading: z.ZodOptional<z.ZodString>;
272
+ blurb: z.ZodOptional<z.ZodString>;
273
+ anchor: z.ZodOptional<z.ZodString>;
274
+ locations: z.ZodArray<z.ZodObject<{
275
+ name: z.ZodString;
276
+ note: z.ZodOptional<z.ZodString>;
277
+ address: z.ZodString;
278
+ phone: z.ZodOptional<z.ZodString>;
279
+ hours: z.ZodOptional<z.ZodArray<z.ZodString>>;
280
+ }, z.core.$strip>>;
281
+ }, z.core.$strip>, z.ZodObject<{
282
+ kind: z.ZodLiteral<"faq">;
283
+ heading: z.ZodOptional<z.ZodString>;
284
+ anchor: z.ZodOptional<z.ZodString>;
285
+ items: z.ZodArray<z.ZodObject<{
286
+ question: z.ZodString;
287
+ answer: z.ZodString;
288
+ }, z.core.$strip>>;
289
+ }, z.core.$strip>, z.ZodObject<{
290
+ kind: z.ZodLiteral<"index">;
291
+ heading: z.ZodOptional<z.ZodString>;
292
+ blurb: z.ZodOptional<z.ZodString>;
293
+ entries: z.ZodArray<z.ZodObject<{
294
+ label: z.ZodString;
295
+ meta: z.ZodOptional<z.ZodString>;
296
+ anchor: z.ZodString;
297
+ }, z.core.$strip>>;
298
+ }, z.core.$strip>, z.ZodObject<{
299
+ kind: z.ZodLiteral<"table">;
300
+ heading: z.ZodOptional<z.ZodString>;
301
+ blurb: z.ZodOptional<z.ZodString>;
302
+ anchor: z.ZodOptional<z.ZodString>;
303
+ columns: z.ZodArray<z.ZodString>;
304
+ rows: z.ZodArray<z.ZodArray<z.ZodString>>;
305
+ monoColumns: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
306
+ statusColumn: z.ZodOptional<z.ZodNumber>;
307
+ note: z.ZodOptional<z.ZodString>;
308
+ }, z.core.$strip>], "kind">;
309
+ export type SiteSection = z.infer<typeof siteSectionSchema>;
310
+ export type SiteSectionKind = SiteSection['kind'];
311
+ export declare const sitePageSchema: z.ZodObject<{
312
+ path: z.ZodString;
313
+ navLabel: z.ZodOptional<z.ZodString>;
314
+ title: z.ZodString;
315
+ intro: z.ZodOptional<z.ZodString>;
316
+ sections: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
317
+ kind: z.ZodLiteral<"hero">;
318
+ eyebrow: z.ZodOptional<z.ZodString>;
319
+ statement: z.ZodString;
320
+ lead: z.ZodArray<z.ZodString>;
321
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
322
+ label: z.ZodString;
323
+ href: z.ZodString;
324
+ }, z.core.$strip>>>;
325
+ }, z.core.$strip>, z.ZodObject<{
326
+ kind: z.ZodLiteral<"prose">;
327
+ heading: z.ZodOptional<z.ZodString>;
328
+ anchor: z.ZodOptional<z.ZodString>;
329
+ paragraphs: z.ZodArray<z.ZodString>;
330
+ }, z.core.$strip>, z.ZodObject<{
331
+ kind: z.ZodLiteral<"stats">;
332
+ heading: z.ZodOptional<z.ZodString>;
333
+ anchor: z.ZodOptional<z.ZodString>;
334
+ stats: z.ZodArray<z.ZodObject<{
335
+ label: z.ZodString;
336
+ value: z.ZodString;
337
+ note: z.ZodOptional<z.ZodString>;
338
+ }, z.core.$strip>>;
339
+ }, z.core.$strip>, z.ZodObject<{
340
+ kind: z.ZodLiteral<"meter">;
341
+ heading: z.ZodOptional<z.ZodString>;
342
+ anchor: z.ZodOptional<z.ZodString>;
343
+ label: z.ZodString;
344
+ value: z.ZodNumber;
345
+ of: z.ZodNumber;
346
+ caption: z.ZodOptional<z.ZodString>;
347
+ }, z.core.$strip>, z.ZodObject<{
348
+ kind: z.ZodLiteral<"cards">;
349
+ heading: z.ZodOptional<z.ZodString>;
350
+ blurb: z.ZodOptional<z.ZodString>;
351
+ anchor: z.ZodOptional<z.ZodString>;
352
+ columns: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>>;
353
+ cards: z.ZodArray<z.ZodObject<{
354
+ title: z.ZodString;
355
+ body: z.ZodString;
356
+ meta: z.ZodOptional<z.ZodString>;
357
+ icon: z.ZodOptional<z.ZodString>;
358
+ }, z.core.$strip>>;
359
+ }, z.core.$strip>, z.ZodObject<{
360
+ kind: z.ZodLiteral<"definitions">;
361
+ heading: z.ZodOptional<z.ZodString>;
362
+ blurb: z.ZodOptional<z.ZodString>;
363
+ anchor: z.ZodOptional<z.ZodString>;
364
+ items: z.ZodArray<z.ZodObject<{
365
+ term: z.ZodString;
366
+ detail: z.ZodString;
367
+ }, z.core.$strip>>;
368
+ }, z.core.$strip>, z.ZodObject<{
369
+ kind: z.ZodLiteral<"feature">;
370
+ heading: z.ZodOptional<z.ZodString>;
371
+ anchor: z.ZodOptional<z.ZodString>;
372
+ paragraphs: z.ZodArray<z.ZodString>;
373
+ quote: z.ZodOptional<z.ZodString>;
374
+ cta: z.ZodOptional<z.ZodObject<{
375
+ label: z.ZodString;
376
+ href: z.ZodString;
377
+ }, z.core.$strip>>;
378
+ image: z.ZodOptional<z.ZodObject<{
379
+ src: z.ZodString;
380
+ alt: z.ZodString;
381
+ }, z.core.$strip>>;
382
+ }, z.core.$strip>, z.ZodObject<{
383
+ kind: z.ZodLiteral<"contact">;
384
+ heading: z.ZodOptional<z.ZodString>;
385
+ blurb: z.ZodOptional<z.ZodString>;
386
+ anchor: z.ZodOptional<z.ZodString>;
387
+ locations: z.ZodArray<z.ZodObject<{
388
+ name: z.ZodString;
389
+ note: z.ZodOptional<z.ZodString>;
390
+ address: z.ZodString;
391
+ phone: z.ZodOptional<z.ZodString>;
392
+ hours: z.ZodOptional<z.ZodArray<z.ZodString>>;
393
+ }, z.core.$strip>>;
394
+ }, z.core.$strip>, z.ZodObject<{
395
+ kind: z.ZodLiteral<"faq">;
396
+ heading: z.ZodOptional<z.ZodString>;
397
+ anchor: z.ZodOptional<z.ZodString>;
398
+ items: z.ZodArray<z.ZodObject<{
399
+ question: z.ZodString;
400
+ answer: z.ZodString;
401
+ }, z.core.$strip>>;
402
+ }, z.core.$strip>, z.ZodObject<{
403
+ kind: z.ZodLiteral<"index">;
404
+ heading: z.ZodOptional<z.ZodString>;
405
+ blurb: z.ZodOptional<z.ZodString>;
406
+ entries: z.ZodArray<z.ZodObject<{
407
+ label: z.ZodString;
408
+ meta: z.ZodOptional<z.ZodString>;
409
+ anchor: z.ZodString;
410
+ }, z.core.$strip>>;
411
+ }, z.core.$strip>, z.ZodObject<{
412
+ kind: z.ZodLiteral<"table">;
413
+ heading: z.ZodOptional<z.ZodString>;
414
+ blurb: z.ZodOptional<z.ZodString>;
415
+ anchor: z.ZodOptional<z.ZodString>;
416
+ columns: z.ZodArray<z.ZodString>;
417
+ rows: z.ZodArray<z.ZodArray<z.ZodString>>;
418
+ monoColumns: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
419
+ statusColumn: z.ZodOptional<z.ZodNumber>;
420
+ note: z.ZodOptional<z.ZodString>;
421
+ }, z.core.$strip>], "kind">>;
422
+ }, z.core.$strip>;
423
+ export type SitePage = z.infer<typeof sitePageSchema>;
424
+ /** Everything the site chrome needs: the masthead, the nav, the footer. */
425
+ export declare const siteChromeSchema: z.ZodObject<{
426
+ name: z.ZodString;
427
+ tagline: z.ZodString;
428
+ footerNote: z.ZodString;
429
+ host: z.ZodOptional<z.ZodString>;
430
+ }, z.core.$strip>;
431
+ export type SiteChrome = z.infer<typeof siteChromeSchema>;
432
+ /**
433
+ * One object a generator emits: the whole site, plus (optionally) where every
434
+ * field of it came from. This is the machine-checkable boundary between "a
435
+ * model wrote something" and "a site we can stand behind".
436
+ */
437
+ export declare const siteSpecSchema: z.ZodObject<{
438
+ chrome: z.ZodObject<{
439
+ name: z.ZodString;
440
+ tagline: z.ZodString;
441
+ footerNote: z.ZodString;
442
+ host: z.ZodOptional<z.ZodString>;
443
+ }, z.core.$strip>;
444
+ pages: z.ZodArray<z.ZodObject<{
445
+ path: z.ZodString;
446
+ navLabel: z.ZodOptional<z.ZodString>;
447
+ title: z.ZodString;
448
+ intro: z.ZodOptional<z.ZodString>;
449
+ sections: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
450
+ kind: z.ZodLiteral<"hero">;
451
+ eyebrow: z.ZodOptional<z.ZodString>;
452
+ statement: z.ZodString;
453
+ lead: z.ZodArray<z.ZodString>;
454
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
455
+ label: z.ZodString;
456
+ href: z.ZodString;
457
+ }, z.core.$strip>>>;
458
+ }, z.core.$strip>, z.ZodObject<{
459
+ kind: z.ZodLiteral<"prose">;
460
+ heading: z.ZodOptional<z.ZodString>;
461
+ anchor: z.ZodOptional<z.ZodString>;
462
+ paragraphs: z.ZodArray<z.ZodString>;
463
+ }, z.core.$strip>, z.ZodObject<{
464
+ kind: z.ZodLiteral<"stats">;
465
+ heading: z.ZodOptional<z.ZodString>;
466
+ anchor: z.ZodOptional<z.ZodString>;
467
+ stats: z.ZodArray<z.ZodObject<{
468
+ label: z.ZodString;
469
+ value: z.ZodString;
470
+ note: z.ZodOptional<z.ZodString>;
471
+ }, z.core.$strip>>;
472
+ }, z.core.$strip>, z.ZodObject<{
473
+ kind: z.ZodLiteral<"meter">;
474
+ heading: z.ZodOptional<z.ZodString>;
475
+ anchor: z.ZodOptional<z.ZodString>;
476
+ label: z.ZodString;
477
+ value: z.ZodNumber;
478
+ of: z.ZodNumber;
479
+ caption: z.ZodOptional<z.ZodString>;
480
+ }, z.core.$strip>, z.ZodObject<{
481
+ kind: z.ZodLiteral<"cards">;
482
+ heading: z.ZodOptional<z.ZodString>;
483
+ blurb: z.ZodOptional<z.ZodString>;
484
+ anchor: z.ZodOptional<z.ZodString>;
485
+ columns: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>>;
486
+ cards: z.ZodArray<z.ZodObject<{
487
+ title: z.ZodString;
488
+ body: z.ZodString;
489
+ meta: z.ZodOptional<z.ZodString>;
490
+ icon: z.ZodOptional<z.ZodString>;
491
+ }, z.core.$strip>>;
492
+ }, z.core.$strip>, z.ZodObject<{
493
+ kind: z.ZodLiteral<"definitions">;
494
+ heading: z.ZodOptional<z.ZodString>;
495
+ blurb: z.ZodOptional<z.ZodString>;
496
+ anchor: z.ZodOptional<z.ZodString>;
497
+ items: z.ZodArray<z.ZodObject<{
498
+ term: z.ZodString;
499
+ detail: z.ZodString;
500
+ }, z.core.$strip>>;
501
+ }, z.core.$strip>, z.ZodObject<{
502
+ kind: z.ZodLiteral<"feature">;
503
+ heading: z.ZodOptional<z.ZodString>;
504
+ anchor: z.ZodOptional<z.ZodString>;
505
+ paragraphs: z.ZodArray<z.ZodString>;
506
+ quote: z.ZodOptional<z.ZodString>;
507
+ cta: z.ZodOptional<z.ZodObject<{
508
+ label: z.ZodString;
509
+ href: z.ZodString;
510
+ }, z.core.$strip>>;
511
+ image: z.ZodOptional<z.ZodObject<{
512
+ src: z.ZodString;
513
+ alt: z.ZodString;
514
+ }, z.core.$strip>>;
515
+ }, z.core.$strip>, z.ZodObject<{
516
+ kind: z.ZodLiteral<"contact">;
517
+ heading: z.ZodOptional<z.ZodString>;
518
+ blurb: z.ZodOptional<z.ZodString>;
519
+ anchor: z.ZodOptional<z.ZodString>;
520
+ locations: z.ZodArray<z.ZodObject<{
521
+ name: z.ZodString;
522
+ note: z.ZodOptional<z.ZodString>;
523
+ address: z.ZodString;
524
+ phone: z.ZodOptional<z.ZodString>;
525
+ hours: z.ZodOptional<z.ZodArray<z.ZodString>>;
526
+ }, z.core.$strip>>;
527
+ }, z.core.$strip>, z.ZodObject<{
528
+ kind: z.ZodLiteral<"faq">;
529
+ heading: z.ZodOptional<z.ZodString>;
530
+ anchor: z.ZodOptional<z.ZodString>;
531
+ items: z.ZodArray<z.ZodObject<{
532
+ question: z.ZodString;
533
+ answer: z.ZodString;
534
+ }, z.core.$strip>>;
535
+ }, z.core.$strip>, z.ZodObject<{
536
+ kind: z.ZodLiteral<"index">;
537
+ heading: z.ZodOptional<z.ZodString>;
538
+ blurb: z.ZodOptional<z.ZodString>;
539
+ entries: z.ZodArray<z.ZodObject<{
540
+ label: z.ZodString;
541
+ meta: z.ZodOptional<z.ZodString>;
542
+ anchor: z.ZodString;
543
+ }, z.core.$strip>>;
544
+ }, z.core.$strip>, z.ZodObject<{
545
+ kind: z.ZodLiteral<"table">;
546
+ heading: z.ZodOptional<z.ZodString>;
547
+ blurb: z.ZodOptional<z.ZodString>;
548
+ anchor: z.ZodOptional<z.ZodString>;
549
+ columns: z.ZodArray<z.ZodString>;
550
+ rows: z.ZodArray<z.ZodArray<z.ZodString>>;
551
+ monoColumns: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
552
+ statusColumn: z.ZodOptional<z.ZodNumber>;
553
+ note: z.ZodOptional<z.ZodString>;
554
+ }, z.core.$strip>], "kind">>;
555
+ }, z.core.$strip>>;
556
+ provenance: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
557
+ kind: z.ZodLiteral<"scraped">;
558
+ url: z.ZodURL;
559
+ }, z.core.$strip>, z.ZodObject<{
560
+ kind: z.ZodLiteral<"operator">;
561
+ }, z.core.$strip>, z.ZodObject<{
562
+ kind: z.ZodLiteral<"inferred">;
563
+ }, z.core.$strip>, z.ZodObject<{
564
+ kind: z.ZodLiteral<"not-found">;
565
+ }, z.core.$strip>], "kind">>>;
566
+ }, z.core.$strip>;
567
+ export type SiteSpec = z.infer<typeof siteSpecSchema>;
568
+ /** Nav entry: a label and where it goes, nothing more. */
569
+ export declare const siteNavItemSchema: z.ZodObject<{
570
+ path: z.ZodString;
571
+ label: z.ZodString;
572
+ }, z.core.$strip>;
573
+ export type SiteNavItem = z.infer<typeof siteNavItemSchema>;