@riverbankcms/sdk 0.84.2 → 0.88.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 (143) hide show
  1. package/dist/{PreviewEditorSidebar-4PH35ZIE.mjs → PreviewEditorSidebar-EVRS3C7T.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-WHMCRJGM.mjs → PreviewEditorUI-54WD4IGE.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-ZALZDJEK.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +684 -0
  5. package/dist/_dts/api/src/endpoints.d.ts +58 -14
  6. package/dist/_dts/api/src/index.d.ts +4 -1
  7. package/dist/_dts/api/src/launchReadiness.d.ts +3 -3
  8. package/dist/_dts/api/src/mailchimpIntegration.d.ts +215 -0
  9. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +35 -15
  10. package/dist/_dts/api/src/siteInfrastructure.d.ts +0 -14
  11. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +1 -13
  12. package/dist/_dts/api/src/types.d.ts +6 -3
  13. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  14. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  15. package/dist/_dts/blocks/src/index.d.ts +2 -1
  16. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  17. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  18. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  19. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  20. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  21. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  22. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  23. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -288
  24. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  25. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  26. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +42 -42
  27. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +300 -0
  28. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +63 -3
  29. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +53 -1
  33. package/dist/_dts/blocks/src/system/manifest/richTextSchema.d.ts +27 -0
  34. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -23
  35. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +10 -2
  36. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -0
  37. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -0
  38. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -0
  39. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +4 -0
  40. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  41. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +11 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +15 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.server.d.ts +1 -1
  44. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +32 -0
  45. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +5 -1
  46. package/dist/_dts/blocks/src/system/runtime/shared/components/ModalShell.d.ts +5 -1
  47. package/dist/_dts/blocks/src/system/runtime/shared/utils/formatting.d.ts +1 -1
  48. package/dist/_dts/content-model/src/referenceFields.d.ts +1 -1
  49. package/dist/_dts/core/src/currency-format.d.ts +37 -2
  50. package/dist/_dts/core/src/event-pricing.d.ts +24 -0
  51. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +551 -20
  52. package/dist/_dts/editor-blocks/src/widgets/reference/loaders.d.ts +3 -1
  53. package/dist/_dts/sdk/src/cli/canonical-entry-policy.d.ts +53 -0
  54. package/dist/_dts/sdk/src/cli/commands/migrate.d.ts +1 -0
  55. package/dist/_dts/sdk/src/cli/commands/pull.d.ts +7 -1
  56. package/dist/_dts/sdk/src/cli/content/reader.d.ts +2 -0
  57. package/dist/_dts/sdk/src/cli/migrations/events.d.ts +73 -0
  58. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  59. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  60. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -0
  61. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +3 -9
  62. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +1 -1
  63. package/dist/_dts/sdk/src/manifest/three-pass-converter.d.ts +7 -18
  64. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  65. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +3 -1
  66. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +7 -3
  67. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +4 -24
  68. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +45 -0
  69. package/dist/_dts/sdk/src/version.d.ts +1 -1
  70. package/dist/_dts/site-commands/src/commands.d.ts +57 -0
  71. package/dist/_dts/surfaces/src/index.d.ts +12 -0
  72. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  73. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +9 -9
  74. package/dist/_dts/theme-core/src/schema.d.ts +11 -11
  75. package/dist/{chunk-ZR2GQK2A.mjs → chunk-7KOO7RPP.mjs} +953 -315
  76. package/dist/{chunk-OCGTXHSO.mjs → chunk-ER4UIW4X.mjs} +7 -7
  77. package/dist/{chunk-WFPYN7KA.mjs → chunk-HVOBXA3Y.mjs} +2 -2
  78. package/dist/{chunk-NFWGLRZZ.mjs → chunk-K3JWH6HE.mjs} +37 -3
  79. package/dist/{chunk-4QNLOTES.mjs → chunk-O4LVYUVH.mjs} +58 -14
  80. package/dist/{chunk-PYDHOMEO.mjs → chunk-YDMBIIS5.mjs} +1 -1
  81. package/dist/cli/index.mjs +1858 -512
  82. package/dist/client/{accordion-2UZPBMYM.mjs → accordion-PT5CGW5N.mjs} +2 -2
  83. package/dist/client/{bookingForm-36CWQUMV.mjs → bookingForm-2HLRTEYS.mjs} +7 -7
  84. package/dist/client/bookings.mjs +51 -6
  85. package/dist/client/{carousel-QH77HR6X.mjs → carousel-Z2LKYSWA.mjs} +3 -3
  86. package/dist/client/cart-ND5IK4A6.mjs +18 -0
  87. package/dist/client/checkout-EYUSGAY7.mjs +18 -0
  88. package/dist/client/{chunk-SYIJ5JO2.mjs → chunk-6DVPO44G.mjs} +1 -1
  89. package/dist/client/{chunk-3C2VTPWI.mjs → chunk-BAWHZ5GM.mjs} +176 -13
  90. package/dist/client/{chunk-52CGCQ7B.mjs → chunk-BL66UWGD.mjs} +10 -80
  91. package/dist/client/{chunk-VGDBVNOO.mjs → chunk-DIRW2LNG.mjs} +241 -210
  92. package/dist/client/{chunk-UDNSI5PY.mjs → chunk-GOFO7HRH.mjs} +1 -2
  93. package/dist/client/{chunk-ZKUO52W3.mjs → chunk-H4MHEXYS.mjs} +1 -1
  94. package/dist/client/{chunk-ZE5G642V.mjs → chunk-LI2C6M5O.mjs} +75 -1
  95. package/dist/client/{chunk-3DTWLTXM.mjs → chunk-MHBEWDT7.mjs} +117 -3
  96. package/dist/client/{chunk-4OXKTA3D.mjs → chunk-O5JNI3E4.mjs} +2 -2
  97. package/dist/client/{chunk-XSV6KW4D.mjs → chunk-S4G65LGR.mjs} +1 -1
  98. package/dist/client/{chunk-DVNUDUVT.mjs → chunk-WBQG7VJA.mjs} +4 -1
  99. package/dist/client/{chunk-F5VRX5Y6.mjs → chunk-WCVK4MBJ.mjs} +1 -1
  100. package/dist/client/{chunk-7UCLJ5SP.mjs → chunk-X7GVFB7Y.mjs} +4 -7
  101. package/dist/client/client.mjs +2125 -1403
  102. package/dist/client/{courseRegistration-TMKU6ABO.mjs → courseRegistration-H3AZBUEG.mjs} +7 -7
  103. package/dist/client/{eventCalendar-G6TI32X6.mjs → eventCalendar-FPKJGLGS.mjs} +10 -11
  104. package/dist/client/{eventCombined-SCKEMNAR.mjs → eventCombined-QCGIZBUY.mjs} +10 -11
  105. package/dist/client/{eventDetails-XPIFXXPK.mjs → eventDetails-HIT3BJWU.mjs} +10 -11
  106. package/dist/client/{eventListing-7QFMEMGT.mjs → eventListing-R4HNWJDN.mjs} +10 -11
  107. package/dist/client/{eventRegistration-TOODSZUI.mjs → eventRegistration-Q7BYY5HF.mjs} +10 -11
  108. package/dist/client/{form-MTCMVCZT.mjs → form-NI6YOG6S.mjs} +3 -3
  109. package/dist/client/{headerSection-Y5TMR3TW.mjs → headerSection-SDYGII36.mjs} +4 -4
  110. package/dist/client/hooks.mjs +1682 -1412
  111. package/dist/client/{locationMap-RH2LG7FZ.mjs → locationMap-BDETEUQD.mjs} +3 -4
  112. package/dist/client/{newsletterForm-PCAIPFMA.mjs → newsletterForm-EKYIU67X.mjs} +70 -22
  113. package/dist/client/{productDetail-OIGDR4YE.mjs → productDetail-5UTGNN76.mjs} +8 -9
  114. package/dist/client/{productList-4MA5S2CX.mjs → productList-7YA5KXZQ.mjs} +8 -9
  115. package/dist/client/rendering/client.mjs +753 -329
  116. package/dist/client/rendering/islands.mjs +19 -19
  117. package/dist/client/rendering.mjs +3786 -3034
  118. package/dist/client/shop-AIMUMZYC.mjs +20 -0
  119. package/dist/preview-next/before-render.mjs +58 -14
  120. package/dist/preview-next/client/runtime.mjs +5 -5
  121. package/dist/preview-next/editor-chrome.css +56 -9
  122. package/dist/preview-next/middleware.mjs +58 -14
  123. package/dist/{sdk-runtime-QLOCYKVU.mjs → sdk-runtime-NW472WNT.mjs} +6 -6
  124. package/dist/server/components.mjs +1518 -1015
  125. package/dist/server/config-validation.mjs +1719 -1461
  126. package/dist/server/config.mjs +1719 -1461
  127. package/dist/server/data.mjs +1683 -1413
  128. package/dist/server/index.mjs +79 -17
  129. package/dist/server/next.mjs +1902 -1311
  130. package/dist/server/page-converter.mjs +2193 -1169
  131. package/dist/server/prebuild.mjs +1 -1
  132. package/dist/server/rendering/server.mjs +1709 -1209
  133. package/dist/server/rendering.mjs +1894 -1347
  134. package/dist/server/routing.mjs +1872 -1499
  135. package/dist/server/server.mjs +1571 -1264
  136. package/dist/server/theme-bridge.mjs +234 -0
  137. package/dist/styles/index.css +232 -0
  138. package/package.json +1 -1
  139. package/dist/SdkPreviewModeRuntime-4FGSVUYI.mjs +0 -8
  140. package/dist/client/cart-X4YK4FTW.mjs +0 -19
  141. package/dist/client/checkout-OM2BEPWD.mjs +0 -19
  142. package/dist/client/chunk-I2MMZO53.mjs +0 -6
  143. package/dist/client/shop-WXSYV5QO.mjs +0 -21
@@ -0,0 +1,53 @@
1
+ import type { PulledContent } from '../client/management';
2
+ import type { LocalContent } from './content/reader';
3
+ export declare const CANONICAL_EVENT_ENTRY_TYPE = "event";
4
+ export declare const EVENT_MIGRATION_COMMAND = "riverbankcms migrate events";
5
+ export declare const EVENT_PUSH_COMMAND = "riverbankcms push events";
6
+ export declare const EVENT_PULL_COMMAND = "riverbankcms pull events";
7
+ export type CanonicalEntrySurface = typeof CANONICAL_EVENT_ENTRY_TYPE;
8
+ export type CanonicalEntryOperation = 'push' | 'pull';
9
+ export type CanonicalEntryPolicy = Readonly<{
10
+ contentType: CanonicalEntrySurface;
11
+ migrationCommand: string;
12
+ commands: Readonly<Record<CanonicalEntryOperation, string>>;
13
+ }>;
14
+ export type CanonicalEntryScopeViolation = Readonly<{
15
+ contentType: CanonicalEntrySurface;
16
+ message: string;
17
+ suggestion: string;
18
+ }>;
19
+ export type CanonicalEntrySyncDecision = Readonly<{
20
+ tag: 'allow';
21
+ }> | Readonly<{
22
+ tag: 'reject';
23
+ violation: CanonicalEntryScopeViolation;
24
+ }> | Readonly<{
25
+ tag: 'allow-with-canonical-exclusions';
26
+ policies: readonly CanonicalEntryPolicy[];
27
+ }>;
28
+ export type CanonicalEntryFilterResult<TContent> = Readonly<{
29
+ content: TContent;
30
+ removedEntryCount: number;
31
+ removedContentTypes: readonly CanonicalEntrySurface[];
32
+ }>;
33
+ export declare function isCanonicalEventEntryType(contentType: string | undefined): contentType is CanonicalEntrySurface;
34
+ export declare function getCanonicalEntryPolicy(contentType: string | undefined): CanonicalEntryPolicy | null;
35
+ export declare function getCanonicalEntrySyncDecision(input: {
36
+ scope: string;
37
+ contentType?: string;
38
+ operation: CanonicalEntryOperation;
39
+ }): CanonicalEntrySyncDecision;
40
+ export declare function getCanonicalEntryScopeViolation(input: {
41
+ scope: string;
42
+ contentType?: string;
43
+ operation: CanonicalEntryOperation;
44
+ }): CanonicalEntryScopeViolation | null;
45
+ export declare function shouldExcludeCanonicalEntries(decision: CanonicalEntrySyncDecision): boolean;
46
+ export declare function filterGenericEntryContentTypes(contentTypes: readonly string[]): string[];
47
+ export declare function stripCanonicalEventEntriesFromLocalContent(content: LocalContent): CanonicalEntryFilterResult<LocalContent>;
48
+ export declare function stripCanonicalEventEntriesFromPulledContent(content: PulledContent): CanonicalEntryFilterResult<PulledContent>;
49
+ export declare function findLegacyEventEntryFiles(contentDir: string): Promise<string[]>;
50
+ export declare function formatLegacyEventEntryWarning(files: readonly string[]): Readonly<{
51
+ files: readonly string[];
52
+ suggestion: string;
53
+ }>;
@@ -5,6 +5,7 @@
5
5
  *
6
6
  * Usage:
7
7
  * riverbankcms migrate entries [contentType] [--content-dir <dir>] [--dry-run] [--force] [--yes]
8
+ * riverbankcms migrate events [--content-dir <dir>] [--dry-run] [--yes]
8
9
  */
9
10
  import { Command } from 'commander';
10
11
  export declare const migrateCommand: Command;
@@ -15,12 +15,18 @@
15
15
  * riverbankcms pull footer # Pull footer content
16
16
  */
17
17
  import { Command } from 'commander';
18
- import type { PulledContent } from '../../client/management';
18
+ import type { ManagementClient, PulledContent } from '../../client/management';
19
+ import type { OutputContext } from '../output';
19
20
  import type { EntryBaseSnapshotTarget } from '../merge-remote/entrySnapshots';
20
21
  export declare function entryBaseSnapshotTargetForPull(input: Readonly<{
21
22
  isRemote: boolean;
22
23
  siteId: string;
23
24
  }>): EntryBaseSnapshotTarget;
25
+ /**
26
+ * Fetch broad generic content, including paginated entry payloads when needed,
27
+ * then remove canonical/owner-managed entry types before diffing or writing.
28
+ */
29
+ export declare function pullAllContentWithCanonicalEntryPolicy(client: ManagementClient, output: OutputContext): Promise<PulledContent>;
24
30
  export declare function createScopedPullContent(meta: PulledContent['meta'], overrides: Partial<Omit<PulledContent, 'meta'>>): PulledContent;
25
31
  /**
26
32
  * Determines whether the pull command should prompt for overwrite confirmation.
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import type { NavigationAuthoringLinkInput, NavigationLocalItemInput } from '../../../../api/src/navigation';
8
8
  import type { SdkEventPricingInput } from '../../../../api/src/sdk-event-pricing';
9
+ import type { EventPaymentTermsInput } from '../../client/management/types';
9
10
  import type { Theme } from '../../contracts';
10
11
  export interface LocalEntry {
11
12
  identifier: string;
@@ -172,6 +173,7 @@ export interface LocalEvent {
172
173
  schedule?: LocalEventSchedule;
173
174
  capacity?: number | null;
174
175
  pricing?: LocalEventPricing;
176
+ paymentTerms?: EventPaymentTermsInput;
175
177
  venueRef?: string | null;
176
178
  categoryRef?: string | null;
177
179
  content?: LocalEventContent;
@@ -0,0 +1,73 @@
1
+ import type { LocalEvent } from '../content/reader';
2
+ export type EventMigrationPlanItem = Readonly<{
3
+ tag: 'mergeLegacyIntoEvent';
4
+ legacyFilePath: string;
5
+ eventFilePath: string;
6
+ eventIdentifier: string;
7
+ mergedEvent: LocalEvent;
8
+ mergedFields: readonly string[];
9
+ }> | Readonly<{
10
+ tag: 'archiveLegacyOnly';
11
+ legacyFilePath: string;
12
+ eventFilePath: string;
13
+ eventIdentifier: string;
14
+ reason: string;
15
+ }> | Readonly<{
16
+ tag: 'conflict';
17
+ legacyFilePath: string;
18
+ eventIdentifier: string;
19
+ conflicts: readonly string[];
20
+ }> | Readonly<{
21
+ tag: 'ambiguousMatch';
22
+ legacyFilePath: string;
23
+ candidateEventIdentifiers: readonly string[];
24
+ }> | Readonly<{
25
+ tag: 'unmappableLegacyFields';
26
+ legacyFilePath: string;
27
+ eventIdentifier?: string;
28
+ fields: readonly string[];
29
+ }> | Readonly<{
30
+ tag: 'orphanedLegacy';
31
+ legacyFilePath: string;
32
+ legacyIdentifier: string;
33
+ reason: string;
34
+ }> | Readonly<{
35
+ tag: 'invalidLegacyShape';
36
+ legacyFilePath: string;
37
+ reason: string;
38
+ }>;
39
+ export type WritableEventMigrationPlanItem = Extract<EventMigrationPlanItem, {
40
+ tag: 'mergeLegacyIntoEvent' | 'archiveLegacyOnly';
41
+ }>;
42
+ export type BlockedEventMigrationPlanItem = Exclude<EventMigrationPlanItem, WritableEventMigrationPlanItem>;
43
+ export type EventMigrationPlan = Readonly<{
44
+ tag: 'writable';
45
+ contentDir: string;
46
+ items: readonly WritableEventMigrationPlanItem[];
47
+ }> | Readonly<{
48
+ tag: 'blocked';
49
+ contentDir: string;
50
+ items: readonly EventMigrationPlanItem[];
51
+ blockers: readonly BlockedEventMigrationPlanItem[];
52
+ }>;
53
+ export type MigrateEventsResult = Readonly<{
54
+ status: 'writable' | 'blocked';
55
+ legacyFilesFound: number;
56
+ eventsToWrite: number;
57
+ legacyFilesToArchive: number;
58
+ merged: number;
59
+ archiveOnly: number;
60
+ conflicts: number;
61
+ ambiguous: number;
62
+ unmappable: number;
63
+ orphaned: number;
64
+ invalid: number;
65
+ dryRun: boolean;
66
+ items: readonly EventMigrationPlanItem[];
67
+ }>;
68
+ export type MigrateEventsOptions = Readonly<{
69
+ contentDir: string;
70
+ dryRun?: boolean;
71
+ }>;
72
+ export declare function planEventMigration(contentDir: string): Promise<EventMigrationPlan>;
73
+ export declare function migrateEvents(options: MigrateEventsOptions): Promise<MigrateEventsResult>;
@@ -439,10 +439,16 @@ export interface RiverbankClient {
439
439
  limit?: number;
440
440
  from?: string;
441
441
  to?: string;
442
+ afterStartsAt?: string;
443
+ afterId?: string;
442
444
  stage?: string;
443
445
  categoryIds?: string;
444
446
  venueId?: string;
447
+ staffMemberId?: string;
445
448
  kind?: 'all' | 'courses' | 'events';
449
+ eventSurface?: string;
450
+ eventPresets?: string;
451
+ scheduleScope?: string;
446
452
  /** Optional: filter to a specific content entry (event series) */
447
453
  entryId?: string;
448
454
  /** Optional: filter to a specific seriesId */
@@ -465,6 +471,9 @@ export interface RiverbankClient {
465
471
  venueId?: string;
466
472
  staffMemberId?: string;
467
473
  kind?: string;
474
+ eventSurface?: string;
475
+ eventPresets?: string;
476
+ scheduleScope?: string;
468
477
  entryId?: string;
469
478
  seriesId?: string;
470
479
  includeOccurrenceId?: string;
@@ -144,6 +144,7 @@ export declare const sdkLoaderEndpointSchema: z.ZodEnum<{
144
144
  getPublishedEntryPreview: "getPublishedEntryPreview";
145
145
  listPublishedEntries: "listPublishedEntries";
146
146
  getPublicEventDetails: "getPublicEventDetails";
147
+ listPublicRouteCandidates: "listPublicRouteCandidates";
147
148
  }>;
148
149
  export declare const loaderParamBindingSchema: z.ZodObject<{
149
150
  $bind: z.ZodObject<{
@@ -231,6 +232,7 @@ export declare const sdkConfigLoaderSchema: z.ZodObject<{
231
232
  getPublishedEntryPreview: "getPublishedEntryPreview";
232
233
  listPublishedEntries: "listPublishedEntries";
233
234
  getPublicEventDetails: "getPublicEventDetails";
235
+ listPublicRouteCandidates: "listPublicRouteCandidates";
234
236
  }>;
235
237
  params: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodObject<{
236
238
  $bind: z.ZodObject<{
@@ -294,6 +296,7 @@ export declare const sdkDataLoadersSchema: z.ZodOptional<z.ZodRecord<z.ZodString
294
296
  getPublishedEntryPreview: "getPublishedEntryPreview";
295
297
  listPublishedEntries: "listPublishedEntries";
296
298
  getPublicEventDetails: "getPublicEventDetails";
299
+ listPublicRouteCandidates: "listPublicRouteCandidates";
297
300
  }>;
298
301
  params: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodObject<{
299
302
  $bind: z.ZodObject<{
@@ -455,10 +455,13 @@ export type NewsletterSignupPreset = 'emailOnly' | 'emailName' | 'emailFirstLast
455
455
  export type NewsletterSignupContent = {
456
456
  title?: string | null;
457
457
  subtitle?: RichTextDoc | null;
458
+ listId?: string | null;
458
459
  preset: NewsletterSignupPreset;
460
+ includePhone?: boolean | null;
459
461
  buttonLabel?: string | null;
460
462
  successMessage?: string | null;
461
463
  privacyNote?: string | null;
464
+ tags?: string | null;
462
465
  _sectionStyles?: SectionStylesContent;
463
466
  };
464
467
  export type ContactNewsletterContent = {
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import type { PageOutline } from '../contracts';
6
6
  import type { SdkCustomBlock } from '../config/types';
7
+ import { SUPPORTED_LOADER_ENDPOINTS, type SupportedLoaderEndpoint } from '../../../blocks/src/system/data/index';
7
8
  import type { RiverbankClient } from '../client/types';
8
9
  export type PrefetchContext = {
9
10
  siteId?: string;
@@ -12,15 +13,8 @@ export type PrefetchContext = {
12
13
  root?: Record<string, unknown>;
13
14
  };
14
15
  export type ResolvedBlockData = Record<string, Record<string, unknown>>;
15
- /**
16
- * Supported loader endpoints for SDK data fetching.
17
- * Only these endpoints can be used in block data loaders when using the SDK.
18
- *
19
- * This is the SDK's public contract for whitelisted endpoints.
20
- * In the monorepo we should keep it in sync with blocks' internal list.
21
- */
22
- export declare const SUPPORTED_LOADER_ENDPOINTS: readonly ["listPublishedEntries", "getPublishedEntryPreview", "listPublicEvents", "listPublicCourses", "listPublicTeamMembers", "listPublicProducts", "listPublicPasses", "listPublicMemberships", "getPublicFormById", "getPublicBookingServices", "getPublicEventDetails"];
23
- export type SupportedLoaderEndpoint = (typeof SUPPORTED_LOADER_ENDPOINTS)[number];
16
+ export { SUPPORTED_LOADER_ENDPOINTS };
17
+ export type { SupportedLoaderEndpoint };
24
18
  /**
25
19
  * Options for SDK block data prefetching.
26
20
  */
@@ -291,4 +291,4 @@ export interface ContentTypeSummaryForPrompt {
291
291
  isRouted: boolean;
292
292
  }
293
293
  export declare function buildContentTypePromptSection(contentTypes: ContentTypeSummaryForPrompt[]): string;
294
- export declare const PASS1_SYSTEM_PROMPT = "You are an expert at analyzing HTML/JSX markup to extract editable content fields for a CMS.\n\nYour task: Analyze the HTML/JSX markup and identify ALL pieces of content that should be editable by a user.\n\n## FIELD ECONOMY PRINCIPLES\n\n**Prefer fewer, smarter fields. CMS editors should not face 25-field forms.**\n\n1. **Use richText for formatted lists and multi-line content:**\n - Opening hours \u2192 single richText with formatted list (not 6 separate text fields)\n - Address with line breaks \u2192 single richText (not address1, address2, city, postcode)\n - Feature lists, specs, ingredients \u2192 richText with bullet list\n\n RichText supports: paragraphs, bold, italic, bullet lists, numbered lists, links.\n The CMS editor can format content naturally without rigid field structure.\n\n2. **Use repeaters only when items need individual editing/reordering:**\n - Testimonials with avatar + name + quote \u2192 repeater (each item is distinct)\n - Team members with photo + bio \u2192 repeater\n - Social links where user adds/removes platforms \u2192 repeater\n\n3. **Anti-patterns to AVOID:**\n \u274C hoursMonFriDay, hoursMonFriTime, hoursSatDay... (6+ fields for hours table)\n \u274C socialInstagram, socialFacebook, socialTwitter (proliferating similar fields)\n \u274C address1, address2, city, state, zip (5 fields for one address)\n\n \u2705 openingHours: single richText field with formatted content\n \u2705 address: single richText field with line breaks\n \u2705 socialLinks: repeater with { platform, url } IF user needs to add/remove links\n\n## Field Type Rules\n\n### Simple Fields\n- **text**: Short text (<200 chars), headings, labels, button text\n - Set multiline: true for paragraphs or text with line breaks\n - Set multiline: false for single-line text\n- **richText**: Formatted content with HTML tags (p, strong, em, ul, etc.)\n- **media**: Images (<img>) or videos (<video>)\n - defaultValue: { \"src\": \"image-url\", \"alt\": \"description\" }\n- **link**: Anchors (<a>) or buttons that navigate\n - defaultValue: { \"label\": \"visible text\" }\n - Only extract the visible text - link destinations are configured in the CMS\n\n### Container Fields\n\n- **repeater**: List of similar items that editors can add/remove/reorder\n - Use when: Multiple similar items (social links, features, team members)\n - Requires: itemLabel (singular name for item), itemFields (array of nested fields)\n - Example: Social links \u2192 repeater with itemFields: [{ id: \"platform\", type: \"text\" }, { id: \"url\", type: \"link\" }]\n\n- **group**: Related fields grouped together (NOT repeating)\n - Use when: Logically related fields that should appear together in the CMS\n - Requires: groupFields (array of nested fields)\n - Example: Contact info \u2192 group with groupFields: [{ id: \"phone\", type: \"text\" }, { id: \"email\", type: \"text\" }]\n\n### When to use each type:\n- Single value \u2192 simple field (text, richText, media, link)\n- Formatted list where structure is static \u2192 richText (opening hours, address)\n- List where items can be added/removed/reordered \u2192 repeater\n- Related fields that belong together \u2192 group\n\n## Output Requirements\n\n1. Give each field a camelCase id (e.g., headline, ctaButton, heroImage)\n2. Extract the actual content as defaultValue\n3. Describe where each field appears in htmlContext\n4. Set required: true for primary content, false for optional\n\n## Examples\n\n### Example 1: Simple Fields\n\nInput HTML:\n```html\n<section>\n <h1>Welcome to Our Site</h1>\n <p>We build amazing products.</p>\n <a href=\"/start\">Get Started</a>\n</section>\n```\n\nOutput:\n```json\n{\n \"blockId\": \"custom.hero\",\n \"blockTitle\": \"Hero Section\",\n \"blockDescription\": \"Simple hero with headline, description, and CTA\",\n \"category\": \"marketing\",\n \"fields\": [\n { \"id\": \"headline\", \"type\": \"text\", \"label\": \"Headline\", \"required\": true, \"multiline\": false, \"defaultValue\": \"Welcome to Our Site\", \"htmlContext\": \"h1 main heading\" },\n { \"id\": \"description\", \"type\": \"text\", \"label\": \"Description\", \"required\": true, \"multiline\": false, \"defaultValue\": \"We build amazing products.\", \"htmlContext\": \"p below heading\" },\n { \"id\": \"cta\", \"type\": \"link\", \"label\": \"Call to Action\", \"required\": false, \"multiline\": null, \"defaultValue\": { \"label\": \"Get Started\" }, \"htmlContext\": \"a button at bottom\" }\n ],\n \"contentTypeApproach\": { \"approach\": \"none\", \"rationale\": \"Single hero section, not list data\" }\n}\n```\n\n### Example 2: Repeater Field\n\nInput HTML with repeating social links:\n```html\n<footer>\n <div class=\"social-links\">\n <a href=\"https://instagram.com/...\"><svg>Instagram</svg></a>\n <a href=\"https://facebook.com/...\"><svg>Facebook</svg></a>\n <a href=\"https://twitter.com/...\"><svg>Twitter</svg></a>\n </div>\n</footer>\n```\n\nOutput with repeater:\n```json\n{\n \"blockId\": \"custom.footer\",\n \"blockTitle\": \"Footer\",\n \"blockDescription\": \"Footer with social links\",\n \"category\": \"layout\",\n \"fields\": [\n {\n \"id\": \"socialLinks\",\n \"type\": \"repeater\",\n \"label\": \"Social Links\",\n \"required\": false,\n \"itemLabel\": \"Link\",\n \"itemFields\": [\n { \"id\": \"platform\", \"type\": \"text\", \"label\": \"Platform\", \"required\": true },\n { \"id\": \"url\", \"type\": \"link\", \"label\": \"URL\", \"required\": true }\n ],\n \"htmlContext\": \"Row of social media icon links\"\n }\n ],\n \"contentTypeApproach\": { \"approach\": \"repeater\", \"rationale\": \"Social links are page-specific and editors need to add/remove platforms\" }\n}\n```\n";
294
+ export declare const PASS1_SYSTEM_PROMPT = "You are an expert at analyzing HTML/JSX markup to extract editable content fields for a CMS.\n\nYour task: Analyze the HTML/JSX markup and identify ALL pieces of content that should be editable by a user.\n\n## FIELD ECONOMY PRINCIPLES\n\n**Prefer fewer, smarter fields. CMS editors should not face 25-field forms.**\n\n1. **Use richText for formatted lists and multi-line content:**\n - Opening hours \u2192 single richText with formatted list (not 6 separate text fields)\n - Address with line breaks \u2192 single richText with hard line breaks / Shift+Enter between lines (not address1, address2, city, postcode)\n - Feature lists, specs, ingredients \u2192 richText with bullet list\n\n RichText supports: paragraphs, hard line breaks, bold, italic, bullet lists, numbered lists, links.\n The CMS editor can format content naturally without rigid field structure.\n For line-oriented content like addresses, opening hours, and contact details, keep one logical paragraph and use hard line breaks between lines. In the CMS editor, authors create those line breaks with Shift+Enter; Enter creates a new paragraph.\n\n2. **Use repeaters only when items need individual editing/reordering:**\n - Testimonials with avatar + name + quote \u2192 repeater (each item is distinct)\n - Team members with photo + bio \u2192 repeater\n - Social links where user adds/removes platforms \u2192 repeater\n\n3. **Anti-patterns to AVOID:**\n \u274C hoursMonFriDay, hoursMonFriTime, hoursSatDay... (6+ fields for hours table)\n \u274C socialInstagram, socialFacebook, socialTwitter (proliferating similar fields)\n \u274C address1, address2, city, state, zip (5 fields for one address)\n\n \u2705 openingHours: single richText field with formatted content / hard line breaks\n \u2705 address: single richText field with hard line breaks (Shift+Enter in the editor)\n \u2705 socialLinks: repeater with { platform, url } IF user needs to add/remove links\n\n## Field Type Rules\n\n### Simple Fields\n- **text**: Short text (<200 chars), headings, labels, button text\n - Set multiline: true for paragraphs or text with line breaks\n - Set multiline: false for single-line text\n- **richText**: Formatted content with HTML tags (p, strong, em, ul, etc.)\n- **media**: Images (<img>) or videos (<video>)\n - defaultValue: { \"src\": \"image-url\", \"alt\": \"description\" }\n- **link**: Anchors (<a>) or buttons that navigate\n - defaultValue: { \"label\": \"visible text\" }\n - Only extract the visible text - link destinations are configured in the CMS\n\n### Container Fields\n\n- **repeater**: List of similar items that editors can add/remove/reorder\n - Use when: Multiple similar items (social links, features, team members)\n - Requires: itemLabel (singular name for item), itemFields (array of nested fields)\n - Example: Social links \u2192 repeater with itemFields: [{ id: \"platform\", type: \"text\" }, { id: \"url\", type: \"link\" }]\n\n- **group**: Related fields grouped together (NOT repeating)\n - Use when: Logically related fields that should appear together in the CMS\n - Requires: groupFields (array of nested fields)\n - Example: Contact info \u2192 group with groupFields: [{ id: \"phone\", type: \"text\" }, { id: \"email\", type: \"text\" }]\n\n### When to use each type:\n- Single value \u2192 simple field (text, richText, media, link)\n- Formatted list where structure is static \u2192 richText (opening hours, address; use hard line breaks / Shift+Enter for line-oriented text)\n- List where items can be added/removed/reordered \u2192 repeater\n- Related fields that belong together \u2192 group\n\n## Output Requirements\n\n1. Give each field a camelCase id (e.g., headline, ctaButton, heroImage)\n2. Extract the actual content as defaultValue\n3. Describe where each field appears in htmlContext\n4. Set required: true for primary content, false for optional\n\n## Examples\n\n### Example 1: Simple Fields\n\nInput HTML:\n```html\n<section>\n <h1>Welcome to Our Site</h1>\n <p>We build amazing products.</p>\n <a href=\"/start\">Get Started</a>\n</section>\n```\n\nOutput:\n```json\n{\n \"blockId\": \"custom.hero\",\n \"blockTitle\": \"Hero Section\",\n \"blockDescription\": \"Simple hero with headline, description, and CTA\",\n \"category\": \"marketing\",\n \"fields\": [\n { \"id\": \"headline\", \"type\": \"text\", \"label\": \"Headline\", \"required\": true, \"multiline\": false, \"defaultValue\": \"Welcome to Our Site\", \"htmlContext\": \"h1 main heading\" },\n { \"id\": \"description\", \"type\": \"text\", \"label\": \"Description\", \"required\": true, \"multiline\": false, \"defaultValue\": \"We build amazing products.\", \"htmlContext\": \"p below heading\" },\n { \"id\": \"cta\", \"type\": \"link\", \"label\": \"Call to Action\", \"required\": false, \"multiline\": null, \"defaultValue\": { \"label\": \"Get Started\" }, \"htmlContext\": \"a button at bottom\" }\n ],\n \"contentTypeApproach\": { \"approach\": \"none\", \"rationale\": \"Single hero section, not list data\" }\n}\n```\n\n### Example 2: Repeater Field\n\nInput HTML with repeating social links:\n```html\n<footer>\n <div class=\"social-links\">\n <a href=\"https://instagram.com/...\"><svg>Instagram</svg></a>\n <a href=\"https://facebook.com/...\"><svg>Facebook</svg></a>\n <a href=\"https://twitter.com/...\"><svg>Twitter</svg></a>\n </div>\n</footer>\n```\n\nOutput with repeater:\n```json\n{\n \"blockId\": \"custom.footer\",\n \"blockTitle\": \"Footer\",\n \"blockDescription\": \"Footer with social links\",\n \"category\": \"layout\",\n \"fields\": [\n {\n \"id\": \"socialLinks\",\n \"type\": \"repeater\",\n \"label\": \"Social Links\",\n \"required\": false,\n \"itemLabel\": \"Link\",\n \"itemFields\": [\n { \"id\": \"platform\", \"type\": \"text\", \"label\": \"Platform\", \"required\": true },\n { \"id\": \"url\", \"type\": \"link\", \"label\": \"URL\", \"required\": true }\n ],\n \"htmlContext\": \"Row of social media icon links\"\n }\n ],\n \"contentTypeApproach\": { \"approach\": \"repeater\", \"rationale\": \"Social links are page-specific and editors need to add/remove platforms\" }\n}\n```\n";
@@ -10,28 +10,16 @@
10
10
  * This approach ensures CSS rules reference classNames that actually exist
11
11
  * in the layout by applying patches programmatically between passes.
12
12
  */
13
+ import { parseRichTextInlineMarkdown, parseRichTextParagraphInlineMarkdown, type TipTapNode } from '../../../blocks/src/index';
13
14
  import type { HtmlToManifestInput, HtmlToManifestOutput, ConversionResult, ConverterOptions } from './types';
14
15
  import { DEFAULT_MANIFEST_MODEL } from './constants';
15
16
  export { DEFAULT_MANIFEST_MODEL };
16
- interface TipTapNode {
17
- type: string;
18
- content?: TipTapNode[];
19
- text?: string;
20
- marks?: Array<{
21
- type: string;
22
- }>;
23
- }
24
- /**
25
- * Parse inline markdown (bold only) into TipTap text nodes.
26
- *
27
- * Only bold (**text**) is supported because LLM-generated rich text defaults
28
- * typically only use bold for emphasis. Other markdown features (italic, links,
29
- * headings) are not expected in field default values and would add complexity
30
- * without meaningful benefit.
31
- */
32
- declare function parseInlineMarkdown(text: string): TipTapNode[];
33
17
  /**
34
18
  * Convert a plain string (or simple markdown) to TipTap doc format.
19
+ *
20
+ * Double newlines create semantic paragraphs. Single newlines remain inside the
21
+ * current paragraph as TipTap hardBreak nodes for line-oriented content such as
22
+ * addresses and opening hours.
35
23
  */
36
24
  declare function stringToTipTapDoc(text: string): TipTapNode;
37
25
  /**
@@ -70,7 +58,8 @@ export declare function validateManifestOutput(data: unknown): {
70
58
  * @internal
71
59
  */
72
60
  export declare const __testing: {
73
- parseInlineMarkdown: typeof parseInlineMarkdown;
61
+ parseInlineMarkdown: typeof parseRichTextInlineMarkdown;
62
+ parseParagraphInlineMarkdown: typeof parseRichTextParagraphInlineMarkdown;
74
63
  stringToTipTapDoc: typeof stringToTipTapDoc;
75
64
  coerceRichTextDefaultValue: typeof coerceRichTextDefaultValue;
76
65
  };
@@ -2,11 +2,13 @@ import * as React from 'react';
2
2
  import type { EntrySubrouteContextData, MediaAssetIndexItem, OccurrenceContextData, PageOutline, ResolveImageUrlContextInput, RouteMap, Theme, ThemeTokens } from '../contracts';
3
3
  import type { SdkCustomBlock } from '../config/types';
4
4
  import type { BlockOverrides } from './overrides';
5
+ import type { SiteBookingOfferingPresetSummary } from '../public-api/contracts';
5
6
  export type ComponentRegistry = Record<string, React.ElementType>;
6
7
  export type PageRendererDataContext = {
7
8
  siteId?: string;
8
9
  pageId?: string;
9
10
  resolvedData?: Record<string, Record<string, unknown>>;
11
+ bookingOfferingPresets?: readonly SiteBookingOfferingPresetSummary[];
10
12
  previewStage?: 'published' | 'preview';
11
13
  routes?: RouteMap;
12
14
  pagesByIdentifier?: Record<string, string>;
@@ -1,6 +1,7 @@
1
1
  import type { ReactElement } from 'react';
2
2
  import type { EntrySubrouteContextData, MediaAssetIndexItem, OccurrenceContextData, PageOutline, RouteMap, Theme, ThemeTokens } from '../../contracts';
3
3
  import type { ResolvedBlockData } from '../../data';
4
+ import type { SiteBookingOfferingPresetSummary } from '../../public-api/contracts';
4
5
  import type { RuntimeSdkConfig } from '../helpers/loadPage';
5
6
  import { type ComponentRegistry } from '../blocks-page-renderer';
6
7
  import type { BlockOverrides } from '../overrides';
@@ -11,6 +12,7 @@ export type PageProps = {
11
12
  siteId: string;
12
13
  themeTokens?: ThemeTokens;
13
14
  resolvedData?: ResolvedBlockData;
15
+ bookingOfferingPresets?: readonly SiteBookingOfferingPresetSummary[];
14
16
  routeMap?: RouteMap;
15
17
  /** Page identifier to routeId lookup for { kind: 'page' } CTA links */
16
18
  pagesByIdentifier?: Record<string, string>;
@@ -89,4 +91,4 @@ export type PageHydrationBootstrapConfig = {
89
91
  mediaAssets?: readonly MediaAssetIndexItem[];
90
92
  };
91
93
  export declare function toPageHydrationBootstrapConfig(props: Pick<PageProps, 'siteId' | 'supabaseUrl' | 'mediaAssets'>): PageHydrationBootstrapConfig;
92
- export declare function PageContent({ page, theme, themeTokens: providedTokens, siteId, resolvedData, routeMap, pagesByIdentifier, entriesByIdentifier, wrapBlock, registry, usePlaceholders, blockOverrides, sdkConfig, customBlocks, supabaseUrl, mediaAssets, apiBaseUrl, portalToken, previewToken, dataContext, useThemeScope, }: PageProps): ReactElement;
94
+ export declare function PageContent({ page, theme, themeTokens: providedTokens, siteId, resolvedData, bookingOfferingPresets, routeMap, pagesByIdentifier, entriesByIdentifier, wrapBlock, registry, usePlaceholders, blockOverrides, sdkConfig, customBlocks, supabaseUrl, mediaAssets, apiBaseUrl, portalToken, previewToken, dataContext, useThemeScope, }: PageProps): ReactElement;
@@ -8,8 +8,8 @@ import type { MediaAssetIndexItem, RouteMap, Theme } from '../../contracts';
8
8
  import type { RiverbankClient, SiteResponse } from '../../client/types';
9
9
  import type { PageProps } from '../components/Page';
10
10
  import type { ResolvedBlockData } from '../../data/prefetchBlockData';
11
- import type { RuntimeSdkConfig } from './loadPage';
12
11
  import type { SdkCustomBlock } from '../../config/types';
12
+ import { type RuntimeSdkConfig } from './pageRuntimeSupport';
13
13
  /**
14
14
  * Site data included in content results for metadata generation.
15
15
  */
@@ -92,6 +92,8 @@ export type PageContentResult = {
92
92
  customBlocks?: SdkCustomBlock[];
93
93
  /** Pre-fetched block data for data loaders */
94
94
  resolvedData: ResolvedBlockData;
95
+ /** Selected booking offering presets exposed to SSR blocks. */
96
+ bookingOfferingPresets?: PageProps['bookingOfferingPresets'];
95
97
  /** Site data for metadata generation */
96
98
  site: SiteData;
97
99
  /**
@@ -112,7 +114,7 @@ export type PageContentResult = {
112
114
  /** ContentType -> identifier -> routeId lookup for { kind: 'entry' } CTA links */
113
115
  entriesByIdentifier?: Record<string, Record<string, string>>;
114
116
  /** Canonical media assets for resolving identifier-only media values in preview/edit UIs. */
115
- mediaAssets?: MediaAssetIndexItem[];
117
+ mediaAssets?: readonly MediaAssetIndexItem[];
116
118
  };
117
119
  /**
118
120
  * Result when path resolves to a content entry
@@ -125,6 +127,8 @@ export type EntryContentResult = {
125
127
  templatePage: PageProps['page'] | null;
126
128
  /** Pre-fetched block data for template page data loaders */
127
129
  resolvedData: ResolvedBlockData;
130
+ /** Selected booking offering presets exposed to SSR blocks. */
131
+ bookingOfferingPresets?: PageProps['bookingOfferingPresets'];
128
132
  /** Data context for template blocks (includes entry content for bindings) */
129
133
  dataContext: {
130
134
  contentEntry: Record<string, unknown>;
@@ -155,7 +159,7 @@ export type EntryContentResult = {
155
159
  /** ContentType -> identifier -> routeId lookup for { kind: 'entry' } CTA links */
156
160
  entriesByIdentifier?: Record<string, Record<string, string>>;
157
161
  /** Canonical media assets for resolving identifier-only media values in preview/edit UIs. */
158
- mediaAssets?: MediaAssetIndexItem[];
162
+ mediaAssets?: readonly MediaAssetIndexItem[];
159
163
  };
160
164
  /**
161
165
  * Discriminated union result from loadContent
@@ -3,15 +3,15 @@
3
3
  *
4
4
  * Use this in server components, getServerSideProps, or API routes.
5
5
  */
6
- import type { RiverbankClient, SiteResponse } from '../../client/types';
7
- import type { MediaAssetIndexItem } from '../../contracts';
6
+ import type { RiverbankClient } from '../../client/types';
8
7
  import type { PageProps } from '../components/Page';
9
8
  import type { DataLoaderOverrides } from '../../data/types';
9
+ import { type RuntimeSdkConfig } from './pageRuntimeSupport';
10
10
  /**
11
11
  * SDK config from API response (without siteId which is stripped at storage).
12
12
  * This is the runtime representation - for defining configs, use RiverbankSiteConfig.
13
13
  */
14
- export type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;
14
+ export type { RuntimeSdkConfig } from './pageRuntimeSupport';
15
15
  export type LoadPageParams = {
16
16
  client: RiverbankClient;
17
17
  siteId: string;
@@ -77,32 +77,12 @@ export type LoadPageParams = {
77
77
  */
78
78
  searchParams?: Record<string, string | string[] | undefined>;
79
79
  };
80
- export type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {
80
+ export type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides' | 'sdkConfig'> & {
81
81
  /**
82
82
  * SDK site configuration, if available.
83
83
  * Contains SDK-defined theme palette, section backgrounds, and style options.
84
84
  */
85
85
  sdkConfig: RuntimeSdkConfig | null;
86
- /**
87
- * Supabase storage URL for direct image access.
88
- * SDK sites use this instead of NEXT_PUBLIC_SUPABASE_URL env var.
89
- */
90
- supabaseUrl?: string;
91
- /**
92
- * Canonical media sidecar for resolving identifier-only media values on first paint.
93
- */
94
- mediaAssets?: readonly MediaAssetIndexItem[];
95
- /**
96
- * Page identifier to routeId lookup for CTA link resolution.
97
- * Used to resolve { kind: 'page', identifier: '...' } links at render time.
98
- */
99
- pagesByIdentifier?: Record<string, string>;
100
- /**
101
- * Entry identifier to routeId lookup for CTA link resolution.
102
- * Maps contentTypeKey -> identifier -> routeId.
103
- * Used to resolve { kind: 'entry', contentType: '...', identifier: '...' } links at render time.
104
- */
105
- entriesByIdentifier?: Record<string, Record<string, string>>;
106
86
  };
107
87
  /**
108
88
  * Server-side helper to fetch all data needed for <Page> component.
@@ -0,0 +1,45 @@
1
+ import type { MediaAssetIndexItem, PageOutline, RouteMap, Theme } from '../../contracts';
2
+ import type { SiteBookingOfferingPresetSummary } from '../../public-api/contracts';
3
+ import type { SiteResponse } from '../../client/types';
4
+ import type { SdkCustomBlock } from '../../config/types';
5
+ export type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;
6
+ export type SiteData = SiteResponse['site'];
7
+ export type SiteRenderSupport = Readonly<{
8
+ theme: Theme;
9
+ site: SiteData;
10
+ sdkConfig: RuntimeSdkConfig | null;
11
+ bookingOfferingPresets: readonly SiteBookingOfferingPresetSummary[];
12
+ customBlocks?: SdkCustomBlock[];
13
+ supabaseUrl?: string;
14
+ routeMap?: RouteMap;
15
+ pagesByIdentifier?: Record<string, string>;
16
+ entriesByIdentifier?: Record<string, Record<string, string>>;
17
+ mediaAssets?: readonly MediaAssetIndexItem[];
18
+ }>;
19
+ export type PageRecordForPreview = Readonly<{
20
+ id: string;
21
+ routeId?: string | null;
22
+ name: string;
23
+ path: string | null;
24
+ purpose: string;
25
+ status?: string | null;
26
+ draftStatus?: string | null;
27
+ publishedAt?: string | null;
28
+ draftTitle?: string | null;
29
+ draftPath?: string | null;
30
+ draftMetaTitle?: string | null;
31
+ draftMetaDescription?: string | null;
32
+ publishedMetaTitle?: string | null;
33
+ publishedMetaDescription?: string | null;
34
+ ogImageId?: string | null;
35
+ }>;
36
+ export declare function buildSiteRenderSupport(site: SiteResponse, mediaAssets: readonly MediaAssetIndexItem[] | undefined): SiteRenderSupport;
37
+ export declare function collectMediaAssetSidecar(mediaAssets: readonly MediaAssetIndexItem[] | null | undefined): readonly MediaAssetIndexItem[] | undefined;
38
+ export declare function buildPageOutline(input: Readonly<{
39
+ name: string;
40
+ path: string | null | undefined;
41
+ fallbackPath: string;
42
+ purpose: string;
43
+ blocks: readonly unknown[];
44
+ }>): PageOutline;
45
+ export declare function sanitizeSdkRuntimeBlockContent(blockKind: string, content: Record<string, unknown>): Record<string, unknown>;
@@ -8,4 +8,4 @@
8
8
  * 1. This constant
9
9
  * 2. The "version" field in package.json
10
10
  */
11
- export declare const SDK_VERSION = "0.84.2";
11
+ export declare const SDK_VERSION = "0.88.0";
@@ -457,6 +457,24 @@ export declare const upsertEventSeriesCommandSchema: z.ZodObject<{
457
457
  }, z.core.$strict>, z.ZodObject<{
458
458
  kind: z.ZodLiteral<"ticket_types">;
459
459
  currency: z.ZodOptional<z.ZodString>;
460
+ ticketTypes: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
461
+ identifier: z.ZodString;
462
+ cmsTicketTypeId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
463
+ name: z.ZodString;
464
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
465
+ priceAmount: z.ZodNumber;
466
+ priceCurrency: z.ZodOptional<z.ZodString>;
467
+ isActive: z.ZodOptional<z.ZodBoolean>;
468
+ sortOrder: z.ZodOptional<z.ZodNumber>;
469
+ capacityLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
470
+ attendanceScope: z.ZodOptional<z.ZodEnum<{
471
+ both: "both";
472
+ in_person: "in_person";
473
+ online: "online";
474
+ }>>;
475
+ saleStartsAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
476
+ saleEndsAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
477
+ }, z.core.$strict>>>>;
460
478
  }, z.core.$strict>, z.ZodObject<{
461
479
  kind: z.ZodLiteral<"manual_payment">;
462
480
  instructions: z.ZodOptional<z.ZodString>;
@@ -493,6 +511,7 @@ export declare const upsertEventSeriesCommandSchema: z.ZodObject<{
493
511
  contentEntryRef: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<ContentEntryRef, string>>>;
494
512
  }, z.core.$strict>>;
495
513
  settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
514
+ paymentTerms: z.ZodOptional<z.ZodUnknown>;
496
515
  presentation: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
497
516
  tags: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
498
517
  staffRefs: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<StaffRef, string>>>>>;
@@ -1398,6 +1417,24 @@ export declare const siteCommandSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
1398
1417
  }, z.core.$strict>, z.ZodObject<{
1399
1418
  kind: z.ZodLiteral<"ticket_types">;
1400
1419
  currency: z.ZodOptional<z.ZodString>;
1420
+ ticketTypes: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
1421
+ identifier: z.ZodString;
1422
+ cmsTicketTypeId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1423
+ name: z.ZodString;
1424
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1425
+ priceAmount: z.ZodNumber;
1426
+ priceCurrency: z.ZodOptional<z.ZodString>;
1427
+ isActive: z.ZodOptional<z.ZodBoolean>;
1428
+ sortOrder: z.ZodOptional<z.ZodNumber>;
1429
+ capacityLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1430
+ attendanceScope: z.ZodOptional<z.ZodEnum<{
1431
+ both: "both";
1432
+ in_person: "in_person";
1433
+ online: "online";
1434
+ }>>;
1435
+ saleStartsAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1436
+ saleEndsAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1437
+ }, z.core.$strict>>>>;
1401
1438
  }, z.core.$strict>, z.ZodObject<{
1402
1439
  kind: z.ZodLiteral<"manual_payment">;
1403
1440
  instructions: z.ZodOptional<z.ZodString>;
@@ -1434,6 +1471,7 @@ export declare const siteCommandSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
1434
1471
  contentEntryRef: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<ContentEntryRef, string>>>;
1435
1472
  }, z.core.$strict>>;
1436
1473
  settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1474
+ paymentTerms: z.ZodOptional<z.ZodUnknown>;
1437
1475
  presentation: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1438
1476
  tags: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
1439
1477
  staffRefs: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<StaffRef, string>>>>>;
@@ -2254,6 +2292,24 @@ export declare const siteCommandBatchSchema: z.ZodObject<{
2254
2292
  }, z.core.$strict>, z.ZodObject<{
2255
2293
  kind: z.ZodLiteral<"ticket_types">;
2256
2294
  currency: z.ZodOptional<z.ZodString>;
2295
+ ticketTypes: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
2296
+ identifier: z.ZodString;
2297
+ cmsTicketTypeId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2298
+ name: z.ZodString;
2299
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2300
+ priceAmount: z.ZodNumber;
2301
+ priceCurrency: z.ZodOptional<z.ZodString>;
2302
+ isActive: z.ZodOptional<z.ZodBoolean>;
2303
+ sortOrder: z.ZodOptional<z.ZodNumber>;
2304
+ capacityLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
2305
+ attendanceScope: z.ZodOptional<z.ZodEnum<{
2306
+ both: "both";
2307
+ in_person: "in_person";
2308
+ online: "online";
2309
+ }>>;
2310
+ saleStartsAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2311
+ saleEndsAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2312
+ }, z.core.$strict>>>>;
2257
2313
  }, z.core.$strict>, z.ZodObject<{
2258
2314
  kind: z.ZodLiteral<"manual_payment">;
2259
2315
  instructions: z.ZodOptional<z.ZodString>;
@@ -2290,6 +2346,7 @@ export declare const siteCommandBatchSchema: z.ZodObject<{
2290
2346
  contentEntryRef: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<ContentEntryRef, string>>>;
2291
2347
  }, z.core.$strict>>;
2292
2348
  settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
2349
+ paymentTerms: z.ZodOptional<z.ZodUnknown>;
2293
2350
  presentation: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
2294
2351
  tags: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
2295
2352
  staffRefs: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<StaffRef, string>>>>>;