@marktiderman/genesis-sites 0.0.0-stage → 0.2.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +465 -2
  3. package/dist/assets/form-island.c0f6fac859.js +51 -0
  4. package/dist/assets/islands.77d11f5697.js +1 -0
  5. package/dist/assets/sites-forms.4e6aa42497.css +10 -0
  6. package/dist/assets/sites-forms.css +10 -0
  7. package/dist/assets/sites.css +2 -0
  8. package/dist/assets/sites.e1ffd2708b.css +2 -0
  9. package/dist/blocks.d.ts +13 -0
  10. package/dist/blocks.js +26 -0
  11. package/dist/blocks.js.map +1 -0
  12. package/dist/chunk-3VKTBE7S.js +69 -0
  13. package/dist/chunk-3VKTBE7S.js.map +1 -0
  14. package/dist/chunk-C375ZPU2.js +2241 -0
  15. package/dist/chunk-C375ZPU2.js.map +1 -0
  16. package/dist/chunk-IXMY4B56.js +877 -0
  17. package/dist/chunk-IXMY4B56.js.map +1 -0
  18. package/dist/chunk-VZUDRPFG.js +13 -0
  19. package/dist/chunk-VZUDRPFG.js.map +1 -0
  20. package/dist/chunk-ZGWGQGT2.js +595 -0
  21. package/dist/chunk-ZGWGQGT2.js.map +1 -0
  22. package/dist/import.d.ts +130 -0
  23. package/dist/import.js +330 -0
  24. package/dist/import.js.map +1 -0
  25. package/dist/index.d.ts +273 -0
  26. package/dist/index.js +254 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/registry-D_DCWRTc.d.ts +1030 -0
  29. package/dist/sections.d.ts +802 -0
  30. package/dist/sections.js +6 -0
  31. package/dist/sections.js.map +1 -0
  32. package/dist/store-DkSycDhq.d.ts +443 -0
  33. package/dist/supabase.d.ts +41 -0
  34. package/dist/supabase.js +283 -0
  35. package/dist/supabase.js.map +1 -0
  36. package/dist/web.d.ts +136 -0
  37. package/dist/web.js +479 -0
  38. package/dist/web.js.map +1 -0
  39. package/migrations/0001_genesis_sites.sql +821 -0
  40. package/migrations/0002_genesis_sites_posts.sql +404 -0
  41. package/migrations/tests/0001_genesis_sites.test.sql +349 -0
  42. package/migrations/tests/0002_genesis_sites_posts.test.sql +242 -0
  43. package/package.json +152 -3
@@ -0,0 +1,802 @@
1
+ import { Y as SectionDefinition, d as Link, O as RenderContext, S as SectionNode, a6 as Surface, I as Image, F as FileRef, A as AnySectionDefinition } from './registry-D_DCWRTc.js';
2
+ import { z } from 'zod';
3
+ import * as lucide_react from 'lucide-react';
4
+ import * as React from 'react';
5
+ import { BandProps } from '@marktiderman/genesis-ui/band';
6
+ import { HeaderSlotProps } from '@marktiderman/genesis-forms-web';
7
+
8
+ declare const ctaSection: Readonly<SectionDefinition<{
9
+ heading: string;
10
+ primaryCta: {
11
+ label: string;
12
+ href: string;
13
+ newTab?: boolean | undefined;
14
+ target?: "_self" | "_blank" | undefined;
15
+ external?: boolean | undefined;
16
+ event?: string | undefined;
17
+ };
18
+ surface: "base" | "muted" | "accent" | "inverse";
19
+ body?: string | undefined;
20
+ secondaryCta?: {
21
+ label: string;
22
+ href: string;
23
+ newTab?: boolean | undefined;
24
+ target?: "_self" | "_blank" | undefined;
25
+ external?: boolean | undefined;
26
+ event?: string | undefined;
27
+ } | undefined;
28
+ anchor?: string | undefined;
29
+ }>>;
30
+
31
+ declare const faqSection: Readonly<SectionDefinition<{
32
+ heading: string;
33
+ items: {
34
+ question: string;
35
+ answer: string;
36
+ }[];
37
+ surface: "base" | "muted" | "accent" | "inverse";
38
+ body?: string | undefined;
39
+ anchor?: string | undefined;
40
+ }>>;
41
+
42
+ declare const featuresSection: Readonly<SectionDefinition<{
43
+ heading: string;
44
+ items: {
45
+ title: string;
46
+ body: string;
47
+ icon?: "check" | "message" | "target" | "activity" | "award" | "calendar" | "clock" | "dumbbell" | "heart" | "leaf" | "mail" | "map-pin" | "phone" | "shield" | "smile" | "sparkles" | "star" | "trophy" | "users" | "zap" | undefined;
48
+ image?: {
49
+ src: string;
50
+ alt: string;
51
+ decorative?: boolean | undefined;
52
+ width?: number | undefined;
53
+ height?: number | undefined;
54
+ focal?: {
55
+ x: number;
56
+ y: number;
57
+ } | undefined;
58
+ } | undefined;
59
+ link?: {
60
+ label: string;
61
+ href: string;
62
+ newTab?: boolean | undefined;
63
+ target?: "_self" | "_blank" | undefined;
64
+ external?: boolean | undefined;
65
+ event?: string | undefined;
66
+ } | undefined;
67
+ cta?: {
68
+ label: string;
69
+ href: string;
70
+ newTab?: boolean | undefined;
71
+ target?: "_self" | "_blank" | undefined;
72
+ external?: boolean | undefined;
73
+ event?: string | undefined;
74
+ } | undefined;
75
+ note?: string | undefined;
76
+ }[];
77
+ columns: 2 | 4 | 3;
78
+ numbered: boolean;
79
+ surface: "base" | "muted" | "accent" | "inverse";
80
+ eyebrow?: string | undefined;
81
+ body?: string | undefined;
82
+ cta?: {
83
+ label: string;
84
+ href: string;
85
+ newTab?: boolean | undefined;
86
+ target?: "_self" | "_blank" | undefined;
87
+ external?: boolean | undefined;
88
+ event?: string | undefined;
89
+ } | undefined;
90
+ anchor?: string | undefined;
91
+ }>>;
92
+
93
+ declare const footerSection: Readonly<SectionDefinition<{
94
+ columns: {
95
+ heading: string;
96
+ links: {
97
+ label: string;
98
+ href: string;
99
+ newTab?: boolean | undefined;
100
+ target?: "_self" | "_blank" | undefined;
101
+ external?: boolean | undefined;
102
+ event?: string | undefined;
103
+ }[];
104
+ }[];
105
+ links: {
106
+ label: string;
107
+ href: string;
108
+ newTab?: boolean | undefined;
109
+ target?: "_self" | "_blank" | undefined;
110
+ external?: boolean | undefined;
111
+ event?: string | undefined;
112
+ }[];
113
+ surface: "base" | "muted" | "accent" | "inverse";
114
+ tagline?: string | undefined;
115
+ copyright?: string | undefined;
116
+ }>>;
117
+
118
+ declare const formEmbedSection: Readonly<SectionDefinition<{
119
+ heading: string;
120
+ form: string;
121
+ surface: "base" | "muted" | "accent" | "inverse";
122
+ anchor: string;
123
+ body?: string | undefined;
124
+ }>>;
125
+
126
+ declare const gallerySection: Readonly<SectionDefinition<{
127
+ images: {
128
+ src: string;
129
+ alt: string;
130
+ decorative?: boolean | undefined;
131
+ width?: number | undefined;
132
+ height?: number | undefined;
133
+ focal?: {
134
+ x: number;
135
+ y: number;
136
+ } | undefined;
137
+ caption?: string | undefined;
138
+ }[];
139
+ surface: "base" | "muted" | "accent" | "inverse";
140
+ heading?: string | undefined;
141
+ body?: string | undefined;
142
+ anchor?: string | undefined;
143
+ }>>;
144
+
145
+ declare const heroSection: Readonly<SectionDefinition<{
146
+ heading: string;
147
+ eyebrow?: string | undefined;
148
+ body?: string | undefined;
149
+ primaryCta?: {
150
+ label: string;
151
+ href: string;
152
+ newTab?: boolean | undefined;
153
+ target?: "_self" | "_blank" | undefined;
154
+ external?: boolean | undefined;
155
+ event?: string | undefined;
156
+ } | undefined;
157
+ secondaryCta?: {
158
+ label: string;
159
+ href: string;
160
+ newTab?: boolean | undefined;
161
+ target?: "_self" | "_blank" | undefined;
162
+ external?: boolean | undefined;
163
+ event?: string | undefined;
164
+ } | undefined;
165
+ image?: {
166
+ src: string;
167
+ alt: string;
168
+ decorative?: boolean | undefined;
169
+ width?: number | undefined;
170
+ height?: number | undefined;
171
+ focal?: {
172
+ x: number;
173
+ y: number;
174
+ } | undefined;
175
+ } | undefined;
176
+ anchor?: string | undefined;
177
+ }>>;
178
+
179
+ declare const logosSection: Readonly<SectionDefinition<{
180
+ items: {
181
+ name: string;
182
+ image?: {
183
+ src: string;
184
+ alt: string;
185
+ decorative?: boolean | undefined;
186
+ width?: number | undefined;
187
+ height?: number | undefined;
188
+ focal?: {
189
+ x: number;
190
+ y: number;
191
+ } | undefined;
192
+ } | undefined;
193
+ href?: string | undefined;
194
+ }[];
195
+ surface: "base" | "muted" | "accent" | "inverse";
196
+ heading?: string | undefined;
197
+ claim?: string | undefined;
198
+ anchor?: string | undefined;
199
+ }>>;
200
+
201
+ declare const navSection: Readonly<SectionDefinition<{
202
+ showName: boolean;
203
+ logo?: {
204
+ src: string;
205
+ alt: string;
206
+ decorative?: boolean | undefined;
207
+ width?: number | undefined;
208
+ height?: number | undefined;
209
+ focal?: {
210
+ x: number;
211
+ y: number;
212
+ } | undefined;
213
+ } | undefined;
214
+ cta?: {
215
+ label: string;
216
+ href: string;
217
+ newTab?: boolean | undefined;
218
+ target?: "_self" | "_blank" | undefined;
219
+ external?: boolean | undefined;
220
+ event?: string | undefined;
221
+ } | undefined;
222
+ }>>;
223
+
224
+ declare const pricingSection: Readonly<SectionDefinition<{
225
+ heading: string;
226
+ tiers: {
227
+ name: string;
228
+ price: string;
229
+ features: string[];
230
+ period?: string | undefined;
231
+ description?: string | undefined;
232
+ cta?: {
233
+ label: string;
234
+ href: string;
235
+ newTab?: boolean | undefined;
236
+ target?: "_self" | "_blank" | undefined;
237
+ external?: boolean | undefined;
238
+ event?: string | undefined;
239
+ } | undefined;
240
+ highlighted?: boolean | undefined;
241
+ badge?: string | undefined;
242
+ }[];
243
+ groups: {
244
+ heading: string;
245
+ tiers: {
246
+ name: string;
247
+ price: string;
248
+ features: string[];
249
+ period?: string | undefined;
250
+ description?: string | undefined;
251
+ cta?: {
252
+ label: string;
253
+ href: string;
254
+ newTab?: boolean | undefined;
255
+ target?: "_self" | "_blank" | undefined;
256
+ external?: boolean | undefined;
257
+ event?: string | undefined;
258
+ } | undefined;
259
+ highlighted?: boolean | undefined;
260
+ badge?: string | undefined;
261
+ }[];
262
+ eyebrow?: string | undefined;
263
+ body?: string | undefined;
264
+ note?: string | undefined;
265
+ anchor?: string | undefined;
266
+ }[];
267
+ surface: "base" | "muted" | "accent" | "inverse";
268
+ eyebrow?: string | undefined;
269
+ body?: string | undefined;
270
+ note?: string | undefined;
271
+ anchor?: string | undefined;
272
+ }>>;
273
+
274
+ declare const richTextSection: Readonly<SectionDefinition<{
275
+ body: {
276
+ type: "doc";
277
+ content?: Record<string, unknown>[] | undefined;
278
+ };
279
+ surface: "base" | "muted" | "accent" | "inverse";
280
+ heading?: string | undefined;
281
+ anchor?: string | undefined;
282
+ }>>;
283
+
284
+ declare const statsSection: Readonly<SectionDefinition<{
285
+ items: {
286
+ value: string;
287
+ label: string;
288
+ }[];
289
+ surface: "base" | "muted" | "accent" | "inverse";
290
+ heading?: string | undefined;
291
+ body?: string | undefined;
292
+ anchor?: string | undefined;
293
+ }>>;
294
+
295
+ declare const testimonialsSection: Readonly<SectionDefinition<{
296
+ items: {
297
+ quote: string;
298
+ name: string;
299
+ role?: string | undefined;
300
+ avatar?: {
301
+ src: string;
302
+ alt: string;
303
+ decorative?: boolean | undefined;
304
+ width?: number | undefined;
305
+ height?: number | undefined;
306
+ focal?: {
307
+ x: number;
308
+ y: number;
309
+ } | undefined;
310
+ } | undefined;
311
+ }[];
312
+ surface: "base" | "muted" | "accent" | "inverse";
313
+ heading?: string | undefined;
314
+ body?: string | undefined;
315
+ anchor?: string | undefined;
316
+ }>>;
317
+
318
+ /** A post's date as the page says it, in UTC so every visitor sees the same day. */
319
+ declare function formatPostDate(iso: string, lang: string): string;
320
+ declare const blogListSection: Readonly<SectionDefinition<{
321
+ heading: string;
322
+ perPage: number;
323
+ paginate: boolean;
324
+ showExcerpt: boolean;
325
+ showDate: boolean;
326
+ emptyText: string;
327
+ surface: "base" | "muted" | "accent" | "inverse";
328
+ eyebrow?: string | undefined;
329
+ body?: string | undefined;
330
+ category?: string | undefined;
331
+ cta?: {
332
+ label: string;
333
+ href: string;
334
+ newTab?: boolean | undefined;
335
+ target?: "_self" | "_blank" | undefined;
336
+ external?: boolean | undefined;
337
+ event?: string | undefined;
338
+ } | undefined;
339
+ anchor?: string | undefined;
340
+ }>>;
341
+
342
+ declare const fileSection: Readonly<SectionDefinition<{
343
+ heading: string;
344
+ files: {
345
+ label: string;
346
+ file: {
347
+ src: string;
348
+ mime: "application/pdf" | "image/png" | "image/jpeg" | "image/webp" | "image/avif" | "image/gif";
349
+ bytes?: number | undefined;
350
+ };
351
+ description?: string | undefined;
352
+ }[];
353
+ surface: "base" | "muted" | "accent" | "inverse";
354
+ eyebrow?: string | undefined;
355
+ body?: string | undefined;
356
+ anchor?: string | undefined;
357
+ }>>;
358
+
359
+ declare const MAP_PROVIDERS: {
360
+ readonly openstreetmap: {
361
+ readonly name: "OpenStreetMap";
362
+ readonly origin: "https://www.openstreetmap.org";
363
+ };
364
+ readonly google: {
365
+ readonly name: "Google Maps";
366
+ readonly origin: "https://www.google.com";
367
+ };
368
+ };
369
+ type MapProvider = keyof typeof MAP_PROVIDERS;
370
+ declare const schema: z.ZodObject<{
371
+ eyebrow: z.ZodOptional<z.ZodString>;
372
+ heading: z.ZodString;
373
+ body: z.ZodOptional<z.ZodString>;
374
+ address: z.ZodArray<z.ZodString>;
375
+ provider: z.ZodDefault<z.ZodEnum<{
376
+ openstreetmap: "openstreetmap";
377
+ google: "google";
378
+ }>>;
379
+ query: z.ZodOptional<z.ZodString>;
380
+ lat: z.ZodOptional<z.ZodNumber>;
381
+ lng: z.ZodOptional<z.ZodNumber>;
382
+ zoom: z.ZodDefault<z.ZodNumber>;
383
+ title: z.ZodOptional<z.ZodString>;
384
+ image: z.ZodOptional<z.ZodObject<{
385
+ src: z.ZodString & z.ZodType<string, string, z.core.$ZodTypeInternals<string, string>>;
386
+ alt: z.ZodDefault<z.ZodString>;
387
+ decorative: z.ZodOptional<z.ZodBoolean>;
388
+ width: z.ZodOptional<z.ZodNumber>;
389
+ height: z.ZodOptional<z.ZodNumber>;
390
+ focal: z.ZodOptional<z.ZodObject<{
391
+ x: z.ZodNumber;
392
+ y: z.ZodNumber;
393
+ }, z.core.$strip>>;
394
+ }, z.core.$strip>>;
395
+ contact: z.ZodDefault<z.ZodArray<z.ZodObject<{
396
+ label: z.ZodString;
397
+ href: z.ZodString & z.ZodType<string, string, z.core.$ZodTypeInternals<string, string>>;
398
+ newTab: z.ZodOptional<z.ZodBoolean>;
399
+ target: z.ZodOptional<z.ZodEnum<{
400
+ _self: "_self";
401
+ _blank: "_blank";
402
+ }>>;
403
+ external: z.ZodOptional<z.ZodBoolean>;
404
+ event: z.ZodOptional<z.ZodString>;
405
+ }, z.core.$strip>>>;
406
+ primaryCta: z.ZodOptional<z.ZodObject<{
407
+ label: z.ZodString;
408
+ href: z.ZodString & z.ZodType<string, string, z.core.$ZodTypeInternals<string, string>>;
409
+ newTab: z.ZodOptional<z.ZodBoolean>;
410
+ target: z.ZodOptional<z.ZodEnum<{
411
+ _self: "_self";
412
+ _blank: "_blank";
413
+ }>>;
414
+ external: z.ZodOptional<z.ZodBoolean>;
415
+ event: z.ZodOptional<z.ZodString>;
416
+ }, z.core.$strip>>;
417
+ secondaryCta: z.ZodOptional<z.ZodObject<{
418
+ label: z.ZodString;
419
+ href: z.ZodString & z.ZodType<string, string, z.core.$ZodTypeInternals<string, string>>;
420
+ newTab: z.ZodOptional<z.ZodBoolean>;
421
+ target: z.ZodOptional<z.ZodEnum<{
422
+ _self: "_self";
423
+ _blank: "_blank";
424
+ }>>;
425
+ external: z.ZodOptional<z.ZodBoolean>;
426
+ event: z.ZodOptional<z.ZodString>;
427
+ }, z.core.$strip>>;
428
+ loadLabel: z.ZodDefault<z.ZodString>;
429
+ consentNote: z.ZodOptional<z.ZodString>;
430
+ surface: z.ZodDefault<z.ZodEnum<{
431
+ base: "base";
432
+ muted: "muted";
433
+ accent: "accent";
434
+ inverse: "inverse";
435
+ }>>;
436
+ anchor: z.ZodOptional<z.ZodString>;
437
+ }, z.core.$strip>;
438
+ type Props = z.infer<typeof schema>;
439
+ /** The provider's embed URL for these props: built here, never typed by an editor. */
440
+ declare function mapEmbedUrl(props: Pick<Props, "provider" | "query" | "address" | "lat" | "lng" | "zoom">): string;
441
+ /** The provider's own page for the place: the link that works without script. */
442
+ declare function mapPageUrl(props: Pick<Props, "provider" | "query" | "address" | "lat" | "lng" | "zoom">): string;
443
+ declare const mapSection: Readonly<SectionDefinition<{
444
+ heading: string;
445
+ address: string[];
446
+ provider: "openstreetmap" | "google";
447
+ zoom: number;
448
+ contact: {
449
+ label: string;
450
+ href: string;
451
+ newTab?: boolean | undefined;
452
+ target?: "_self" | "_blank" | undefined;
453
+ external?: boolean | undefined;
454
+ event?: string | undefined;
455
+ }[];
456
+ loadLabel: string;
457
+ surface: "base" | "muted" | "accent" | "inverse";
458
+ eyebrow?: string | undefined;
459
+ body?: string | undefined;
460
+ query?: string | undefined;
461
+ lat?: number | undefined;
462
+ lng?: number | undefined;
463
+ title?: string | undefined;
464
+ image?: {
465
+ src: string;
466
+ alt: string;
467
+ decorative?: boolean | undefined;
468
+ width?: number | undefined;
469
+ height?: number | undefined;
470
+ focal?: {
471
+ x: number;
472
+ y: number;
473
+ } | undefined;
474
+ } | undefined;
475
+ primaryCta?: {
476
+ label: string;
477
+ href: string;
478
+ newTab?: boolean | undefined;
479
+ target?: "_self" | "_blank" | undefined;
480
+ external?: boolean | undefined;
481
+ event?: string | undefined;
482
+ } | undefined;
483
+ secondaryCta?: {
484
+ label: string;
485
+ href: string;
486
+ newTab?: boolean | undefined;
487
+ target?: "_self" | "_blank" | undefined;
488
+ external?: boolean | undefined;
489
+ event?: string | undefined;
490
+ } | undefined;
491
+ consentNote?: string | undefined;
492
+ anchor?: string | undefined;
493
+ }>>;
494
+
495
+ declare const postBodySection: Readonly<SectionDefinition<{
496
+ showCover: boolean;
497
+ showAuthor: boolean;
498
+ showDate: boolean;
499
+ backLabel: string;
500
+ surface: "base" | "muted" | "accent" | "inverse";
501
+ }>>;
502
+
503
+ declare const WEEKDAYS: readonly ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
504
+ type Weekday = (typeof WEEKDAYS)[number];
505
+ /** How a class type's chip is drawn, from the brand's own colours. */
506
+ declare const CHIP_TONES: readonly ["primary", "inverse", "soft", "outline", "plain"];
507
+ declare const Session: z.ZodObject<{
508
+ day: z.ZodEnum<{
509
+ mon: "mon";
510
+ tue: "tue";
511
+ wed: "wed";
512
+ thu: "thu";
513
+ fri: "fri";
514
+ sat: "sat";
515
+ sun: "sun";
516
+ }>;
517
+ start: z.ZodString;
518
+ end: z.ZodOptional<z.ZodString>;
519
+ title: z.ZodString;
520
+ type: z.ZodOptional<z.ZodString>;
521
+ coach: z.ZodOptional<z.ZodString>;
522
+ location: z.ZodOptional<z.ZodString>;
523
+ note: z.ZodOptional<z.ZodString>;
524
+ link: z.ZodOptional<z.ZodObject<{
525
+ label: z.ZodString;
526
+ href: z.ZodString & z.ZodType<string, string, z.core.$ZodTypeInternals<string, string>>;
527
+ newTab: z.ZodOptional<z.ZodBoolean>;
528
+ target: z.ZodOptional<z.ZodEnum<{
529
+ _self: "_self";
530
+ _blank: "_blank";
531
+ }>>;
532
+ external: z.ZodOptional<z.ZodBoolean>;
533
+ event: z.ZodOptional<z.ZodString>;
534
+ }, z.core.$strip>>;
535
+ }, z.core.$strip>;
536
+ type ScheduleSession = z.infer<typeof Session>;
537
+ /** `06:15` as the page says it: `6:15 am` or `06:15`. */
538
+ declare function formatTime(time: string, clock: "12h" | "24h"): string;
539
+ declare const scheduleSection: Readonly<SectionDefinition<{
540
+ heading: string;
541
+ days: ("mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun")[];
542
+ clock: "12h" | "24h";
543
+ types: {
544
+ id: string;
545
+ name: string;
546
+ tone: "inverse" | "primary" | "soft" | "outline" | "plain";
547
+ description?: string | undefined;
548
+ }[];
549
+ sessions: {
550
+ day: "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun";
551
+ start: string;
552
+ title: string;
553
+ end?: string | undefined;
554
+ type?: string | undefined;
555
+ coach?: string | undefined;
556
+ location?: string | undefined;
557
+ note?: string | undefined;
558
+ link?: {
559
+ label: string;
560
+ href: string;
561
+ newTab?: boolean | undefined;
562
+ target?: "_self" | "_blank" | undefined;
563
+ external?: boolean | undefined;
564
+ event?: string | undefined;
565
+ } | undefined;
566
+ }[];
567
+ emptyText: string;
568
+ surface: "base" | "muted" | "accent" | "inverse";
569
+ eyebrow?: string | undefined;
570
+ body?: string | undefined;
571
+ dayNames?: Partial<Record<"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun", string>> | undefined;
572
+ footnote?: string | undefined;
573
+ anchor?: string | undefined;
574
+ }>>;
575
+
576
+ declare const teamSection: Readonly<SectionDefinition<{
577
+ heading: string;
578
+ members: {
579
+ name: string;
580
+ role?: string | undefined;
581
+ credentials?: string | undefined;
582
+ photo?: {
583
+ src: string;
584
+ alt: string;
585
+ decorative?: boolean | undefined;
586
+ width?: number | undefined;
587
+ height?: number | undefined;
588
+ focal?: {
589
+ x: number;
590
+ y: number;
591
+ } | undefined;
592
+ } | undefined;
593
+ summary?: string | undefined;
594
+ bio?: string | undefined;
595
+ quote?: {
596
+ text: string;
597
+ cite?: string | undefined;
598
+ } | undefined;
599
+ profile?: string | undefined;
600
+ cta?: {
601
+ label: string;
602
+ href: string;
603
+ newTab?: boolean | undefined;
604
+ target?: "_self" | "_blank" | undefined;
605
+ external?: boolean | undefined;
606
+ event?: string | undefined;
607
+ } | undefined;
608
+ anchor?: string | undefined;
609
+ }[];
610
+ columns: 2 | 4 | 3;
611
+ surface: "base" | "muted" | "accent" | "inverse";
612
+ eyebrow?: string | undefined;
613
+ body?: string | undefined;
614
+ anchor?: string | undefined;
615
+ }>>;
616
+
617
+ declare const timelineSection: Readonly<SectionDefinition<{
618
+ heading: string;
619
+ steps: {
620
+ title: string;
621
+ label?: string | undefined;
622
+ body?: string | undefined;
623
+ image?: {
624
+ src: string;
625
+ alt: string;
626
+ decorative?: boolean | undefined;
627
+ width?: number | undefined;
628
+ height?: number | undefined;
629
+ focal?: {
630
+ x: number;
631
+ y: number;
632
+ } | undefined;
633
+ } | undefined;
634
+ cta?: {
635
+ label: string;
636
+ href: string;
637
+ newTab?: boolean | undefined;
638
+ target?: "_self" | "_blank" | undefined;
639
+ external?: boolean | undefined;
640
+ event?: string | undefined;
641
+ } | undefined;
642
+ }[];
643
+ numbered: boolean;
644
+ surface: "base" | "muted" | "accent" | "inverse";
645
+ eyebrow?: string | undefined;
646
+ body?: string | undefined;
647
+ anchor?: string | undefined;
648
+ }>>;
649
+
650
+ /** An in-page anchor (`#contact`): lowercase letters, digits and hyphens. */
651
+ declare const Anchor: z.ZodOptional<z.ZodString>;
652
+ declare const ICONS: {
653
+ activity: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
654
+ award: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
655
+ calendar: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
656
+ check: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
657
+ clock: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
658
+ dumbbell: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
659
+ heart: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
660
+ leaf: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
661
+ mail: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
662
+ "map-pin": React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
663
+ message: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
664
+ phone: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
665
+ shield: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
666
+ smile: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
667
+ sparkles: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
668
+ star: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
669
+ target: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
670
+ trophy: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
671
+ users: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
672
+ zap: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
673
+ };
674
+ type IconName = keyof typeof ICONS;
675
+ declare const IconName: z.ZodEnum<{
676
+ check: "check";
677
+ message: "message";
678
+ target: "target";
679
+ activity: "activity";
680
+ award: "award";
681
+ calendar: "calendar";
682
+ clock: "clock";
683
+ dumbbell: "dumbbell";
684
+ heart: "heart";
685
+ leaf: "leaf";
686
+ mail: "mail";
687
+ "map-pin": "map-pin";
688
+ phone: "phone";
689
+ shield: "shield";
690
+ smile: "smile";
691
+ sparkles: "sparkles";
692
+ star: "star";
693
+ trophy: "trophy";
694
+ users: "users";
695
+ zap: "zap";
696
+ }>;
697
+ /**
698
+ * A stored link as it prints: checked again (a document that skipped the
699
+ * schema can't smuggle `javascript:` in), with the host's base path on site
700
+ * paths. An unsafe link renders as an inert `#` and is logged.
701
+ */
702
+ declare function resolveHref(href: string, ctx: RenderContext): string;
703
+ /**
704
+ * A link's attributes: its checked href, and for an http(s) link, `rel` and
705
+ * `target`. An outbound link (`external`), or one that opens a new tab,
706
+ * gets `rel="noopener noreferrer"` and `data-gs-outbound` (for analytics);
707
+ * any other absolute link `rel="noopener"`. An outbound link whose href
708
+ * isn't http(s) (a document that skipped the schema) renders inert.
709
+ */
710
+ declare function linkAttrs(link: Link, ctx: RenderContext, defaultEvent?: string): Record<string, string>;
711
+ type ButtonTone = "primary" | "secondary" | "outline" | "inverse" | "ghost";
712
+ /** A link drawn as a button: at least 44px tall, with the focus ring. */
713
+ declare function ButtonLink({ link, ctx, tone, className }: {
714
+ link: Link;
715
+ ctx: RenderContext;
716
+ tone?: ButtonTone;
717
+ className?: string;
718
+ }): React.JSX.Element;
719
+ /** A text link: underlined, at least 24px tall (WCAG 2.5.8). */
720
+ declare function TextLink({ link, ctx, className }: {
721
+ link: Link;
722
+ ctx: RenderContext;
723
+ className?: string;
724
+ }): React.JSX.Element;
725
+ /** "PDF, 1.2 MB": what a download is, said beside its link. */
726
+ declare function fileDescription(file: FileRef): string;
727
+ /** A file's href: checked again, under the base path when it is a site path. Null when it isn't safe. */
728
+ declare function fileHref(file: FileRef, ctx: RenderContext): string | null;
729
+ interface SiteImageProps {
730
+ image: Image;
731
+ className?: string;
732
+ /** `sizes` for the browser's pick; the image is one source here (image CDN transforms are V1). */
733
+ sizes?: string;
734
+ /** The page's largest image (a hero): loaded eagerly, at high priority. */
735
+ priority?: boolean;
736
+ ctx: RenderContext;
737
+ }
738
+ /** An image with alt text (empty when decorative), its size to stop layout shift, and lazy loading below the fold. */
739
+ declare function SiteImage({ image, className, sizes, priority, ctx }: SiteImageProps): React.JSX.Element | null;
740
+ /** The section's title, at the level the page gives it (h1 for the page's main heading). */
741
+ declare function SectionTitle({ ctx, id, size, className, children }: {
742
+ ctx: RenderContext;
743
+ id: string;
744
+ size?: "xl" | "lg" | "md" | "sm";
745
+ className?: string;
746
+ children: React.ReactNode;
747
+ }): React.JSX.Element;
748
+ /** An item's title inside a section: one level below the section's. */
749
+ declare function ItemTitle({ ctx, className, children }: {
750
+ ctx: RenderContext;
751
+ className?: string;
752
+ children: React.ReactNode;
753
+ }): React.JSX.Element;
754
+ declare const titleId: (ctx: RenderContext, part?: string) => string;
755
+ /** The band a body section sits on, named by its title. */
756
+ declare function SectionBand({ node, ctx, anchor, surface, spacing, width, labelled, className, children, }: {
757
+ node: SectionNode;
758
+ ctx: RenderContext;
759
+ anchor?: string | undefined;
760
+ surface?: Surface;
761
+ spacing?: BandProps["spacing"];
762
+ width?: BandProps["width"];
763
+ labelled?: boolean;
764
+ className?: string;
765
+ children: React.ReactNode;
766
+ }): React.JSX.Element;
767
+ /** A section's heading block: an eyebrow, the title and a lead, centred or left. */
768
+ declare function SectionIntro({ ctx, eyebrow, heading, body, align, tone, size, }: {
769
+ ctx: RenderContext;
770
+ eyebrow?: string | undefined;
771
+ heading?: string | undefined;
772
+ body?: string | undefined;
773
+ align?: "center" | "left";
774
+ tone?: "muted" | "inherit";
775
+ size?: "xl" | "lg" | "md" | "sm";
776
+ }): React.JSX.Element | null;
777
+ /** A section with no visible title still needs a name: a visually hidden one. */
778
+ declare function HiddenTitle({ ctx, children }: {
779
+ ctx: RenderContext;
780
+ children: React.ReactNode;
781
+ }): React.JSX.Element;
782
+
783
+ declare function SiteFormHeader({ title, description, requiredNote }: HeaderSlotProps): React.JSX.Element;
784
+ declare const siteFormSlots: {
785
+ header: typeof SiteFormHeader;
786
+ };
787
+
788
+ /**
789
+ * @marktiderman/genesis-sites/sections: the built-in section catalog.
790
+ *
791
+ * Importing this module registers the 20 built-in sections (unless a host
792
+ * registered a replacement first, with `{ replace: true }`). Each is
793
+ * server-safe React on genesis-ui's `Band` and `Display`, mobile first, with
794
+ * 2–4 variants and presets for the editor's Add picker.
795
+ *
796
+ * @packageDocumentation
797
+ */
798
+
799
+ /** The built-in sections, in the editor's order. */
800
+ declare const builtInSections: readonly AnySectionDefinition[];
801
+
802
+ export { Anchor, ButtonLink, CHIP_TONES, HiddenTitle, ICONS, IconName, ItemTitle, MAP_PROVIDERS, type MapProvider, type ScheduleSession, SectionBand, SectionIntro, SectionTitle, SiteFormHeader, SiteImage, TextLink, WEEKDAYS, type Weekday, blogListSection, builtInSections, ctaSection, faqSection, featuresSection, fileDescription, fileHref, fileSection, footerSection, formEmbedSection, formatPostDate, formatTime, gallerySection, heroSection, linkAttrs, logosSection, mapEmbedUrl, mapPageUrl, mapSection, navSection, postBodySection, pricingSection, resolveHref, richTextSection, scheduleSection, siteFormSlots, statsSection, teamSection, testimonialsSection, timelineSection, titleId };