@riverbankcms/sdk 0.127.0 → 0.129.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 (178) hide show
  1. package/README.md +33 -0
  2. package/dist/{PreviewEditorSidebar-BXtfF7tp.mjs → PreviewEditorSidebar-B43CJ0g_.mjs} +9 -33
  3. package/dist/{PreviewEditorUI-Dou73Q0K.mjs → PreviewEditorUI-DHirVkeM.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-DgFDIwvK.mjs → PreviewQueryProvider-B1kbhaJD.mjs} +1 -1
  5. package/dist/SdkPreviewModeRuntime-BJumZy1B.mjs +11209 -0
  6. package/dist/{SiteChromeCustomizeContext-DZiDBAYu.mjs → SiteChromeCustomizeContext-D9SlpwEj.mjs} +31757 -1621
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +288 -36
  8. package/dist/_dts/api/src/bookingClosures.d.ts +19 -3
  9. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +4 -3
  10. package/dist/_dts/api/src/bookingRecords.d.ts +0 -13
  11. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +2 -2
  12. package/dist/_dts/api/src/communications.d.ts +2 -1
  13. package/dist/_dts/api/src/contactFormSummary.d.ts +15 -0
  14. package/dist/_dts/api/src/contentRuntime.d.ts +2 -5
  15. package/dist/_dts/api/src/endpoints.d.ts +1 -1
  16. package/dist/_dts/api/src/footerSettings.d.ts +11 -0
  17. package/dist/_dts/api/src/index.d.ts +2 -1
  18. package/dist/_dts/api/src/occurrenceScheduling.d.ts +48 -0
  19. package/dist/_dts/api/src/participantMessaging.d.ts +5 -3
  20. package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +7 -0
  21. package/dist/_dts/api/src/sdkContracts.d.ts +7 -5
  22. package/dist/_dts/api/src/siteOperations.d.ts +12 -3
  23. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +3 -2
  24. package/dist/_dts/blocks/src/PageRenderer.d.ts +20 -10
  25. package/dist/_dts/blocks/src/client/form.d.ts +1 -0
  26. package/dist/_dts/blocks/src/client/newsletter-form.d.ts +1 -0
  27. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -0
  28. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -8
  29. package/dist/_dts/blocks/src/index.d.ts +2 -1
  30. package/dist/_dts/blocks/src/pageRendererBoundaries.d.ts +30 -0
  31. package/dist/_dts/blocks/src/pageRenderingMode.d.ts +37 -0
  32. package/dist/_dts/blocks/src/rendering/server.d.ts +1 -1
  33. package/dist/_dts/blocks/src/server.d.ts +1 -1
  34. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +41 -0
  35. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +14 -23
  36. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +1 -1
  37. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +109 -23
  38. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  39. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +42 -108
  40. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +21 -54
  41. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +1 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationSurface.d.ts +26 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +8 -0
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +21 -0
  45. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +29 -78
  46. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.server.d.ts +1 -1
  47. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +3 -6
  48. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +27 -8
  49. package/dist/_dts/content-editor/src/FooterComposerOverview.d.ts +21 -0
  50. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +3 -1
  51. package/dist/_dts/content-editor/src/FooterEngagementEditorFields.d.ts +31 -0
  52. package/dist/_dts/content-editor/src/FooterEngagementEditorPanel.d.ts +17 -0
  53. package/dist/_dts/content-editor/src/footerComposer.d.ts +3 -0
  54. package/dist/_dts/content-editor/src/footerEngagementDraft.d.ts +57 -0
  55. package/dist/_dts/content-editor/src/footerEngagementEditor.d.ts +11 -0
  56. package/dist/_dts/content-editor/src/footerPreviewRuntime.d.ts +13 -0
  57. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  58. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +35 -0
  59. package/dist/_dts/core/src/footer-arrangement.d.ts +2 -0
  60. package/dist/_dts/core/src/footer-composition-types.d.ts +118 -0
  61. package/dist/_dts/core/src/footer-composition.d.ts +7 -116
  62. package/dist/_dts/core/src/footer-engagement.d.ts +30 -0
  63. package/dist/_dts/core/src/index.d.ts +4 -0
  64. package/dist/_dts/core/src/newsletter-signup-destination.d.ts +38 -0
  65. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +73 -6
  66. package/dist/_dts/db/src/index.d.ts +1 -0
  67. package/dist/_dts/db/src/schemas/forms.d.ts +72 -2
  68. package/dist/_dts/db/src/schemas/standard-contact.d.ts +114 -0
  69. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +2 -0
  70. package/dist/_dts/preview-next/src/client/blocks/previewBatchLoaderParams.d.ts +6 -0
  71. package/dist/_dts/preview-next/src/client/index.d.ts +47 -47
  72. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +2 -5
  73. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +2 -5
  74. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +2 -5
  75. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -4
  76. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +19 -7
  77. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +30 -23
  78. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -5
  79. package/dist/_dts/preview-next/src/client/preview/themeRuntime.d.ts +9 -0
  80. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewMode.d.ts +21 -6
  81. package/dist/_dts/preview-next/src/client/sdk-runtime.d.ts +8 -8
  82. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +6 -5
  83. package/dist/_dts/sdk/src/cli/commands/push/execute/footer.d.ts +9 -0
  84. package/dist/_dts/sdk/src/cli/content/footerFile.d.ts +10 -0
  85. package/dist/_dts/sdk/src/cli/content/reader.d.ts +3 -5
  86. package/dist/_dts/sdk/src/cli/site-commands/footerCommands.d.ts +15 -3
  87. package/dist/_dts/sdk/src/client/combineAbortSignals.d.ts +2 -0
  88. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -15
  89. package/dist/_dts/sdk/src/client/types.d.ts +10 -2
  90. package/dist/_dts/sdk/src/client/wholeSeriesReadOperations.d.ts +11 -0
  91. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  92. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  93. package/dist/_dts/sdk/src/contracts/event-registration-content.d.ts +16 -0
  94. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +4 -15
  95. package/dist/_dts/sdk/src/next/catch-all.d.ts +6 -0
  96. package/dist/_dts/sdk/src/next/index.d.ts +2 -1
  97. package/dist/_dts/sdk/src/next/renderSdkContent.d.ts +33 -0
  98. package/dist/_dts/sdk/src/next/types.d.ts +23 -9
  99. package/dist/_dts/sdk/src/preview-next/before-render.d.ts +4 -6
  100. package/dist/_dts/sdk/src/preview-next/client/index.d.ts +3 -3
  101. package/dist/_dts/sdk/src/preview-next/client/runtime.d.ts +1 -1
  102. package/dist/_dts/sdk/src/public-api/contracts.d.ts +4 -18
  103. package/dist/_dts/sdk/src/public-api/teamMemberContracts.d.ts +17 -0
  104. package/dist/_dts/sdk/src/public-api/wholeSeriesContracts.d.ts +2 -0
  105. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +32 -3
  106. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +13 -2
  107. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +31 -18
  108. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +20 -9
  109. package/dist/_dts/sdk/src/rendering/index.d.ts +8 -4
  110. package/dist/_dts/sdk/src/rendering/mediaAssets.d.ts +8 -2
  111. package/dist/_dts/sdk/src/rendering/renderingMode.d.ts +23 -0
  112. package/dist/_dts/sdk/src/rendering/server.d.ts +5 -3
  113. package/dist/_dts/sdk/src/rendering/themeRuntime.d.ts +6 -0
  114. package/dist/_dts/sdk/src/version.d.ts +1 -1
  115. package/dist/_dts/site-commands/src/commandContract.d.ts +8 -1
  116. package/dist/_dts/site-commands/src/commands.d.ts +16 -2
  117. package/dist/_dts/theme-core/src/header/paintTargets.d.ts +10 -4
  118. package/dist/_dts/theme-core/src/header/surfaceRules.d.ts +2 -3
  119. package/dist/cli/index.mjs +5535 -4835
  120. package/dist/cli/init-docs/content/workflow-preview-mode.md +24 -11
  121. package/dist/client/{courseRegistration-DTEYWL6Z.mjs → CourseRegistrationWizard-xRmA7REV.mjs} +329 -49
  122. package/dist/client/{DiscountCodeDisclosure-BDFRp8Y7.mjs → DiscountCodeDisclosure-B9vriL5C.mjs} +1 -1
  123. package/dist/client/{EventCombined.client-DJgF1_lf.mjs → EventCombined.client-BgVnVTlz.mjs} +2 -2
  124. package/dist/client/{EventListing.client-CnWGNjOr.mjs → EventListing.client-CqdsO7jO.mjs} +2 -2
  125. package/dist/client/{LeafletStaticMap-BISs9Bl7.mjs → LeafletStaticMap-CKPxot9M.mjs} +1 -1
  126. package/dist/client/{StepIndicator-D8gVYkK-.mjs → StepIndicator-DGCYuBJ1.mjs} +2 -2
  127. package/dist/client/{accordion-DFDajgDz.mjs → accordion-BfN5Eqd-.mjs} +1 -1
  128. package/dist/client/{bookingForm-Bdqj9-52.mjs → bookingForm-DOvCpBFP.mjs} +5 -5
  129. package/dist/client/{carousel-Cvqf-kN8.mjs → carousel-DPNmiH0f.mjs} +1 -1
  130. package/dist/client/{cart-CuH2TJXP.mjs → cart--egVXlrR.mjs} +3 -3
  131. package/dist/client/{checkout-CMNPpejZ.mjs → checkout-DywWtMcq.mjs} +3 -3
  132. package/dist/client/client.mjs +5324 -4942
  133. package/dist/client/courseRegistration-Dk9qFVwt.mjs +46 -0
  134. package/dist/client/{eventCalendar-BW-XoxZ0.mjs → eventCalendar-Bkz2HjlS.mjs} +4 -4
  135. package/dist/client/{eventCombined-Bpn7s0y9.mjs → eventCombined-D4kipYWg.mjs} +2 -2
  136. package/dist/client/{eventDetails-D2uUSTMH.mjs → eventDetails-Dz_5ix2Q.mjs} +56 -35
  137. package/dist/client/{eventListing-CVr1c094.mjs → eventListing-D0vm-zST.mjs} +2 -2
  138. package/dist/client/{eventRegistration-Dv4AvkMw.mjs → eventRegistration-Cw1E4Q4p.mjs} +58 -6
  139. package/dist/client/{form-DxdKf9fs.mjs → form-C2Zf1n3K.mjs} +1 -1
  140. package/dist/client/{headerSection-BaXI5Sro.mjs → headerSection-CP05gzdc.mjs} +2 -2
  141. package/dist/client/hooks.mjs +212 -61
  142. package/dist/client/{locationMap-BEtW2fKz.mjs → locationMap-Cl3x9PYJ.mjs} +2 -2
  143. package/dist/client/{newsletterForm-BKKs0S4R.mjs → newsletterForm-DyEJoClm.mjs} +26 -20
  144. package/dist/client/{pricing-ClkqcElA.mjs → pricing-DGuNR1W4.mjs} +1 -1
  145. package/dist/client/{productDetail-H-ru8dyy.mjs → productDetail-Cq-HrGew.mjs} +3 -3
  146. package/dist/client/{productList-Buyi5c0C.mjs → productList-DbB3jwqd.mjs} +3 -3
  147. package/dist/client/{propsDecoder-BF7i6Ijg.mjs → propsDecoder-CiTuhUwY.mjs} +130 -87
  148. package/dist/client/rendering/client.mjs +416 -208
  149. package/dist/client/rendering/islands.mjs +18 -18
  150. package/dist/client/rendering.mjs +6026 -5596
  151. package/dist/client/{scrollToBlock-D_7t8yWb.mjs → scrollToBlock-CShkRqab.mjs} +1 -1
  152. package/dist/client/{shop-CF7SZQNX.mjs → shop-Cu4Ib-ZA.mjs} +5 -5
  153. package/dist/client/{shop-commerce-DA7_Rq5p.mjs → shop-commerce-BzpsOdh7.mjs} +4 -4
  154. package/dist/client/{shop-commerce-store-BmLqW7Gh.mjs → shop-commerce-store-DaE7Fhj8.mjs} +1 -1
  155. package/dist/client/{shopShared-WL-E1znM.mjs → shopShared-cF0c20vB.mjs} +2 -2
  156. package/dist/client/{useEventFilters-rc8VLeLV.mjs → useEventFilters-QZ3HMgaJ.mjs} +2 -2
  157. package/dist/client/{usePolling-1ncrfd4S.mjs → usePolling-BKf0GcE-.mjs} +2 -2
  158. package/dist/preview-next/before-render.mjs +11 -4
  159. package/dist/preview-next/client/runtime.mjs +4 -4
  160. package/dist/preview-next/middleware.mjs +1 -1
  161. package/dist/{previewAuthStore-Dev9CdG9.mjs → previewAuthStore-BesgU5Xu.mjs} +1 -1
  162. package/dist/{sdk-runtime-BnrCCFJq.mjs → sdk-runtime-CfZd5pAm.mjs} +2 -2
  163. package/dist/{separator-CFvBx2yl.mjs → separator-DkTe68HE.mjs} +1 -1
  164. package/dist/server/components.mjs +950 -639
  165. package/dist/server/config-validation.mjs +209 -61
  166. package/dist/server/config.mjs +209 -61
  167. package/dist/server/data.mjs +212 -61
  168. package/dist/server/index.mjs +40 -16
  169. package/dist/server/next.mjs +1181 -835
  170. package/dist/server/page-converter.mjs +211 -64
  171. package/dist/server/prebuild.mjs +1 -1
  172. package/dist/server/rendering/server.mjs +974 -637
  173. package/dist/server/rendering.mjs +980 -644
  174. package/dist/server/routing.mjs +254 -80
  175. package/dist/server/server.mjs +252 -77
  176. package/package.json +1 -1
  177. package/dist/SdkPreviewModeRuntime-B0HPXr-l.mjs +0 -39546
  178. package/dist/client/MagicLinkForm-b5E_HoG9.mjs +0 -327
@@ -1,22 +1,7 @@
1
1
  import { type InteractiveIslandProps } from '../../../contracts/islands';
2
- import { type NewsletterSignupDestinationProvider, type NewsletterSignupPublicDestinationRef } from '../../blocks/newsletter-signup-destination';
3
- import { type NewsletterButtonVariant, type NewsletterFieldDef, type NewsletterPreset } from './newsletter-form.types';
4
- export type NewsletterFormSourceProps = Readonly<{
5
- blockId?: string | null;
6
- siteId?: string;
7
- apiBaseUrl?: string;
8
- listId?: string | null;
9
- destinationProvider?: NewsletterSignupDestinationProvider | null;
10
- preset?: NewsletterPreset;
11
- includePhone?: boolean;
12
- buttonLabel?: string | null;
13
- buttonVariant?: NewsletterButtonVariant | null;
14
- successMessage?: string | null;
15
- privacyNote?: string | null;
16
- tags?: string | null;
17
- spamProtectionEnabled?: boolean;
18
- className?: string | null;
19
- }>;
2
+ import { type NewsletterSignupPublicDestinationRef } from '../../blocks/newsletter-signup-destination';
3
+ import { type NewsletterButtonVariant, type NewsletterFieldDef, type NewsletterFormProps, type NewsletterPreset } from './newsletter-form.types';
4
+ export type NewsletterFormSourceProps = NewsletterFormProps;
20
5
  export type NewsletterFormDisplay = Readonly<{
21
6
  kind: 'newsletter-form';
22
7
  className: string | null;
@@ -27,13 +12,28 @@ export type NewsletterFormDisplay = Readonly<{
27
12
  fields: readonly NewsletterFieldDef[];
28
13
  }>;
29
14
  export type NewsletterFormHydration = Readonly<{
30
- destinationRef?: NewsletterSignupPublicDestinationRef | null;
31
- listId?: string | null;
15
+ target: NewsletterFormHydrationTarget;
32
16
  preset: NewsletterPreset;
33
17
  includePhone: boolean;
34
18
  tags?: string | null;
35
19
  spamProtectionEnabled?: boolean;
36
20
  }>;
21
+ export type NewsletterFormHydrationTarget = Readonly<{
22
+ tag: 'block-source';
23
+ destinationRef: NewsletterSignupBlockDestinationRef | null;
24
+ }> | Readonly<{
25
+ tag: 'signed-footer-source';
26
+ destinationRef: NewsletterSignupSignedDestinationRef;
27
+ }> | Readonly<{
28
+ tag: 'legacy-direct-list';
29
+ listId: string | null;
30
+ }>;
31
+ type NewsletterSignupBlockDestinationRef = Extract<NewsletterSignupPublicDestinationRef, {
32
+ tag: 'block_ref';
33
+ }>;
34
+ type NewsletterSignupSignedDestinationRef = Extract<NewsletterSignupPublicDestinationRef, {
35
+ tag: 'signed_destination_ref';
36
+ }>;
37
37
  type NewsletterIslandMeta = Readonly<{
38
38
  siteId?: string;
39
39
  apiBaseUrl?: string;
@@ -42,22 +42,7 @@ export declare function buildNewsletterDisplay(source: NewsletterFormSourceProps
42
42
  export type NewsletterFormInteractiveIslandProps = InteractiveIslandProps<NewsletterIslandMeta, 'newsletter-form', typeof newsletterFormBlockRuntime>;
43
43
  export declare const newsletterFormBlockRuntime: Readonly<{
44
44
  kind: "progressive";
45
- buildRender: (source: Readonly<{
46
- blockId?: string | null;
47
- siteId?: string;
48
- apiBaseUrl?: string;
49
- listId?: string | null;
50
- destinationProvider?: NewsletterSignupDestinationProvider | null;
51
- preset?: NewsletterPreset;
52
- includePhone?: boolean;
53
- buttonLabel?: string | null;
54
- buttonVariant?: NewsletterButtonVariant | null;
55
- successMessage?: string | null;
56
- privacyNote?: string | null;
57
- tags?: string | null;
58
- spamProtectionEnabled?: boolean;
59
- className?: string | null;
60
- }>) => Readonly<{
45
+ buildRender: (source: NewsletterFormProps) => Readonly<{
61
46
  display: Readonly<{
62
47
  kind: "newsletter-form";
63
48
  className: string | null;
@@ -68,8 +53,7 @@ export declare const newsletterFormBlockRuntime: Readonly<{
68
53
  fields: readonly NewsletterFieldDef[];
69
54
  }>;
70
55
  hydration: Readonly<{
71
- destinationRef?: NewsletterSignupPublicDestinationRef | null;
72
- listId?: string | null;
56
+ target: NewsletterFormHydrationTarget;
73
57
  preset: NewsletterPreset;
74
58
  includePhone: boolean;
75
59
  tags?: string | null;
@@ -78,38 +62,8 @@ export declare const newsletterFormBlockRuntime: Readonly<{
78
62
  }>;
79
63
  contracts: Readonly<{
80
64
  source: Readonly<{
81
- encode: (value: Readonly<{
82
- blockId?: string | null;
83
- siteId?: string;
84
- apiBaseUrl?: string;
85
- listId?: string | null;
86
- destinationProvider?: NewsletterSignupDestinationProvider | null;
87
- preset?: NewsletterPreset;
88
- includePhone?: boolean;
89
- buttonLabel?: string | null;
90
- buttonVariant?: NewsletterButtonVariant | null;
91
- successMessage?: string | null;
92
- privacyNote?: string | null;
93
- tags?: string | null;
94
- spamProtectionEnabled?: boolean;
95
- className?: string | null;
96
- }>) => unknown;
97
- decode: (input: unknown) => import("../../../contracts").DecodeResult<Readonly<{
98
- blockId?: string | null;
99
- siteId?: string;
100
- apiBaseUrl?: string;
101
- listId?: string | null;
102
- destinationProvider?: NewsletterSignupDestinationProvider | null;
103
- preset?: NewsletterPreset;
104
- includePhone?: boolean;
105
- buttonLabel?: string | null;
106
- buttonVariant?: NewsletterButtonVariant | null;
107
- successMessage?: string | null;
108
- privacyNote?: string | null;
109
- tags?: string | null;
110
- spamProtectionEnabled?: boolean;
111
- className?: string | null;
112
- }>>;
65
+ encode: (value: NewsletterFormProps) => unknown;
66
+ decode: (input: unknown) => import("../../../contracts").DecodeResult<NewsletterFormProps>;
113
67
  }>;
114
68
  render: Readonly<{
115
69
  encode: (value: Readonly<{
@@ -123,8 +77,7 @@ export declare const newsletterFormBlockRuntime: Readonly<{
123
77
  fields: readonly NewsletterFieldDef[];
124
78
  }>;
125
79
  hydration: Readonly<{
126
- destinationRef?: NewsletterSignupPublicDestinationRef | null;
127
- listId?: string | null;
80
+ target: NewsletterFormHydrationTarget;
128
81
  preset: NewsletterPreset;
129
82
  includePhone: boolean;
130
83
  tags?: string | null;
@@ -142,8 +95,7 @@ export declare const newsletterFormBlockRuntime: Readonly<{
142
95
  fields: readonly NewsletterFieldDef[];
143
96
  }>;
144
97
  hydration: Readonly<{
145
- destinationRef?: NewsletterSignupPublicDestinationRef | null;
146
- listId?: string | null;
98
+ target: NewsletterFormHydrationTarget;
147
99
  preset: NewsletterPreset;
148
100
  includePhone: boolean;
149
101
  tags?: string | null;
@@ -153,6 +105,7 @@ export declare const newsletterFormBlockRuntime: Readonly<{
153
105
  }>;
154
106
  }>;
155
107
  }>;
108
+ export declare function projectNewsletterFormHydrationTarget(source: NewsletterFormSourceProps): NewsletterFormHydrationTarget;
156
109
  export declare const newsletterFormInteractiveIslandPropsCodec: Readonly<{
157
110
  encode: (value: Readonly<Readonly<{
158
111
  siteId?: string;
@@ -172,8 +125,7 @@ export declare const newsletterFormInteractiveIslandPropsCodec: Readonly<{
172
125
  fields: readonly NewsletterFieldDef[];
173
126
  }>;
174
127
  hydration: Readonly<{
175
- destinationRef?: NewsletterSignupPublicDestinationRef | null;
176
- listId?: string | null;
128
+ target: NewsletterFormHydrationTarget;
177
129
  preset: NewsletterPreset;
178
130
  includePhone: boolean;
179
131
  tags?: string | null;
@@ -199,8 +151,7 @@ export declare const newsletterFormInteractiveIslandPropsCodec: Readonly<{
199
151
  fields: readonly NewsletterFieldDef[];
200
152
  }>;
201
153
  hydration: Readonly<{
202
- destinationRef?: NewsletterSignupPublicDestinationRef | null;
203
- listId?: string | null;
154
+ target: NewsletterFormHydrationTarget;
204
155
  preset: NewsletterPreset;
205
156
  includePhone: boolean;
206
157
  tags?: string | null;
@@ -6,5 +6,5 @@ import type { NewsletterFormProps } from './newsletter-form.types';
6
6
  * Renders the newsletter signup form for SSR with hydration support.
7
7
  * Uses the islands architecture pattern to hydrate on the client.
8
8
  */
9
- export declare function NewsletterFormSSR({ blockId, siteId, apiBaseUrl, listId, destinationProvider, preset, includePhone, buttonLabel, buttonVariant, successMessage, privacyNote, tags, spamProtectionEnabled, className, }: NewsletterFormProps): React.JSX.Element;
9
+ export declare function NewsletterFormSSR(props: NewsletterFormProps): React.JSX.Element;
10
10
  export default NewsletterFormSSR;
@@ -1,5 +1,5 @@
1
1
  import type { NewsletterSubscribeTarget } from '../api/types';
2
- import type { NewsletterSignupPublicDestinationRef } from '../../blocks/newsletter-signup-destination';
2
+ import type { NewsletterFormHydrationTarget } from './newsletter-form.interactive';
3
3
  export type NewsletterFormRawSubmissionFields = Readonly<{
4
4
  email: FormDataEntryValue | null;
5
5
  firstName: FormDataEntryValue | null;
@@ -23,10 +23,7 @@ export type NewsletterSubmitTargetResolution = Readonly<{
23
23
  target: NewsletterSubscribeTarget;
24
24
  }> | Readonly<{
25
25
  tag: 'unavailable';
26
- reason: 'missing_legacy_list';
26
+ reason: 'missing_block_source' | 'missing_legacy_list';
27
27
  }>;
28
28
  export declare function mapNewsletterFormFieldsToSubscriberInput(fields: NewsletterFormRawSubmissionFields): NewsletterFormSubmissionFields;
29
- export declare function resolveNewsletterSubmitTarget(input: Readonly<{
30
- listId?: string | null;
31
- destinationRef?: NewsletterSignupPublicDestinationRef | null;
32
- }>): NewsletterSubmitTargetResolution;
29
+ export declare function resolveNewsletterSubmitTarget(input: NewsletterFormHydrationTarget): NewsletterSubmitTargetResolution;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Shared types for the newsletter form server and client components.
5
5
  */
6
- import type { NewsletterSignupFieldPreset } from '../../blocks/newsletter-signup-destination';
6
+ import type { NewsletterSignupDestinationProvider, NewsletterSignupFieldPreset, NewsletterSignupPublicDestinationRef } from '../../blocks/newsletter-signup-destination';
7
7
  import type { BlockButtonRole } from '../../constants/buttonRoles';
8
8
  export type NewsletterPreset = NewsletterSignupFieldPreset;
9
9
  export type NewsletterFieldDef = {
@@ -15,17 +15,11 @@ export type NewsletterFieldDef = {
15
15
  };
16
16
  export type NewsletterDestinationProvider = 'riverbank' | 'mailchimp';
17
17
  export type NewsletterButtonVariant = BlockButtonRole;
18
- export type NewsletterFormProps = {
19
- /** Block ID for island hydration */
20
- blockId?: string | null;
18
+ type NewsletterFormCommonProps = {
21
19
  /** Site ID for API calls */
22
20
  siteId?: string;
23
21
  /** API base URL for client-side fetching */
24
22
  apiBaseUrl?: string;
25
- /** Newsletter list ID to subscribe users to */
26
- listId?: string | null;
27
- /** Active signup destination provider */
28
- destinationProvider?: NewsletterDestinationProvider | null;
29
23
  /** Field preset configuration */
30
24
  preset?: NewsletterPreset;
31
25
  /** Adds an optional phone field to the selected preset */
@@ -45,9 +39,34 @@ export type NewsletterFormProps = {
45
39
  /** Additional CSS class */
46
40
  className?: string | null;
47
41
  };
42
+ type BlockNewsletterFormSource = Readonly<{
43
+ source: 'block';
44
+ blockId?: string | null;
45
+ destinationProvider?: NewsletterSignupDestinationProvider | null;
46
+ /** Authoring state only; public submission authority is always blockId. */
47
+ listId?: string | null;
48
+ }>;
49
+ type SignedFooterNewsletterFormSource = Readonly<{
50
+ source: 'signed-footer';
51
+ destinationRef: Extract<NewsletterSignupPublicDestinationRef, {
52
+ tag: 'signed_destination_ref';
53
+ }>;
54
+ blockId?: never;
55
+ destinationProvider?: never;
56
+ listId?: never;
57
+ }>;
58
+ type LegacyDirectListNewsletterFormSource = Readonly<{
59
+ source: 'legacy-direct-list';
60
+ listId: string | null;
61
+ blockId?: never;
62
+ destinationRef?: never;
63
+ destinationProvider?: never;
64
+ }>;
65
+ export type NewsletterFormProps = NewsletterFormCommonProps & (BlockNewsletterFormSource | SignedFooterNewsletterFormSource | LegacyDirectListNewsletterFormSource);
48
66
  /**
49
67
  * Get form fields based on preset configuration.
50
68
  */
51
69
  export declare function getPresetFields(preset: NewsletterPreset, options?: {
52
70
  includePhone?: boolean;
53
71
  }): NewsletterFieldDef[];
72
+ export {};
@@ -0,0 +1,21 @@
1
+ import { type FooterCompositionV1 } from '../../core/src/index';
2
+ import type { FooterRuntimeViewModel } from '../../blocks/src/client/site-chrome';
3
+ import { type FooterEditorTarget, type planFooterEditorView } from './footerComposer';
4
+ import type { SaveState } from './useFooterComposerState';
5
+ type FooterPlan = ReturnType<typeof planFooterEditorView>;
6
+ export declare function SaveBadge({ state }: {
7
+ state: SaveState;
8
+ }): import("react").JSX.Element | null;
9
+ export declare function FooterPreview({ runtime, }: {
10
+ runtime: FooterRuntimeViewModel;
11
+ }): import("react").JSX.Element;
12
+ export declare function FooterOverview({ plan, composition, onTarget, onChange, manageLinksHref, manageSettingsHref, onEngagement, }: {
13
+ plan: FooterPlan;
14
+ composition: FooterCompositionV1;
15
+ onTarget: (target: FooterEditorTarget) => void;
16
+ onChange: (composition: FooterCompositionV1) => void;
17
+ manageLinksHref: string;
18
+ manageSettingsHref: string;
19
+ onEngagement: () => void;
20
+ }): import("react").JSX.Element;
21
+ export {};
@@ -1,11 +1,13 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import type { ApiClient } from '../../api/src/request';
3
3
  import { type FooterEditorTarget } from './footerComposer';
4
- export declare function FooterComposerPanel({ apiClient, siteId: rawSiteId, customFooterMode, manageLinksHref, manageSettingsHref, legalRegion, initialTarget, variant, canEdit, onSaved, loadingFallback, }: {
4
+ export declare function FooterComposerPanel({ apiClient, siteId: rawSiteId, customFooterMode, manageLinksHref, manageFormsHref, manageNewsletterHref, manageSettingsHref, legalRegion, initialTarget, variant, canEdit, onSaved, loadingFallback, }: {
5
5
  apiClient: ApiClient;
6
6
  siteId: string;
7
7
  customFooterMode: 'default' | 'blocks' | 'default+blocks' | 'none';
8
8
  manageLinksHref: string;
9
+ manageFormsHref?: string;
10
+ manageNewsletterHref?: string;
9
11
  manageSettingsHref: string;
10
12
  legalRegion?: 'integrated' | 'separate';
11
13
  initialTarget?: FooterEditorTarget;
@@ -0,0 +1,31 @@
1
+ import type { FooterEngagementAuthoringOptions } from '../../api/src/footer-settings';
2
+ import type { FooterEngagementDraft, FooterEngagementDraftEvent } from './footerEngagementDraft';
3
+ type DispatchDraft = (event: FooterEngagementDraftEvent) => void;
4
+ export declare function EngagementKindChoice({ dispatch, kind, }: Readonly<{
5
+ dispatch: DispatchDraft;
6
+ kind: FooterEngagementDraft['kind'];
7
+ }>): import("react").JSX.Element;
8
+ export declare function EngagementCopyFields({ dispatch, draft, error, }: Readonly<{
9
+ dispatch: DispatchDraft;
10
+ draft: FooterEngagementDraft;
11
+ error: string | null;
12
+ }>): import("react").JSX.Element;
13
+ export declare function EngagementPlacementChoice({ dispatch, treatment, }: Readonly<{
14
+ dispatch: DispatchDraft;
15
+ treatment: FooterEngagementDraft['treatment'];
16
+ }>): import("react").JSX.Element;
17
+ export declare function StandardContactChoice({ dispatch, formId, manageFormsHref, options, }: Readonly<{
18
+ dispatch: DispatchDraft;
19
+ formId: string;
20
+ manageFormsHref: string;
21
+ options: FooterEngagementAuthoringOptions;
22
+ }>): import("react").JSX.Element;
23
+ export declare function MailingListChoice({ dispatch, draft, manageNewsletterHref, options, }: Readonly<{
24
+ dispatch: DispatchDraft;
25
+ draft: Extract<FooterEngagementDraft, {
26
+ kind: 'mailing-list';
27
+ }>;
28
+ manageNewsletterHref: string;
29
+ options: FooterEngagementAuthoringOptions;
30
+ }>): import("react").JSX.Element;
31
+ export {};
@@ -0,0 +1,17 @@
1
+ import type { FooterEngagementSection } from '../../core/src/index';
2
+ import type { FooterEngagementAuthoringOptions } from '../../api/src/footer-settings';
3
+ import type { FooterEngagementReadiness } from './footerEngagementEditor';
4
+ type FooterEngagementEditorPanelProps = Readonly<{
5
+ candidate: FooterEngagementSection | null;
6
+ current: FooterEngagementSection | null;
7
+ manageFormsHref: string;
8
+ manageNewsletterHref: string;
9
+ onApply: () => void;
10
+ onCancel: () => void;
11
+ onPreview: (candidate: FooterEngagementSection) => void;
12
+ onRemove: () => void;
13
+ options: FooterEngagementAuthoringOptions;
14
+ readiness: FooterEngagementReadiness;
15
+ }>;
16
+ export declare function FooterEngagementEditorPanel(props: FooterEngagementEditorPanelProps): import("react").JSX.Element;
17
+ export {};
@@ -4,6 +4,8 @@ export type FooterEditorTarget = Readonly<{
4
4
  }> | Readonly<{
5
5
  kind: 'module';
6
6
  moduleId: FooterModuleId;
7
+ }> | Readonly<{
8
+ kind: 'engagement';
7
9
  }> | Readonly<{
8
10
  kind: 'shared-profile';
9
11
  section: 'contact' | 'opening-hours' | 'social-links';
@@ -48,6 +50,7 @@ type FooterEditorViewPlanInput = Readonly<{
48
50
  hasLogo?: boolean;
49
51
  hasMainNavigation?: boolean;
50
52
  hasLegalPolicyNavigation?: boolean;
53
+ hasEngagementSource?: boolean;
51
54
  canEdit: boolean;
52
55
  legalRegion?: 'integrated' | 'separate';
53
56
  }>;
@@ -0,0 +1,57 @@
1
+ import { type FooterEngagementSection, type Result } from '../../core/src/index';
2
+ type FooterEngagementDraftBase = Readonly<{
3
+ treatment: FooterEngagementSection['treatment'];
4
+ heading: string;
5
+ intro: string;
6
+ }>;
7
+ type FooterMailingCopyDraft = Readonly<{
8
+ buttonLabel: string;
9
+ successMessage: string;
10
+ privacyNote: string;
11
+ }>;
12
+ export type FooterEngagementDraft = (FooterEngagementDraftBase & Readonly<{
13
+ kind: 'standard-contact';
14
+ formId: string;
15
+ }>) | (FooterEngagementDraftBase & FooterMailingCopyDraft & Readonly<{
16
+ kind: 'mailing-list';
17
+ destination: Readonly<{
18
+ provider: 'riverbank';
19
+ listId: string;
20
+ }> | Readonly<{
21
+ provider: 'mailchimp';
22
+ audienceId: string;
23
+ }>;
24
+ }>);
25
+ export type FooterEngagementDraftEvent = Readonly<{
26
+ type: 'select-kind';
27
+ kind: FooterEngagementDraft['kind'];
28
+ }> | Readonly<{
29
+ type: 'set-treatment';
30
+ treatment: FooterEngagementDraft['treatment'];
31
+ }> | Readonly<{
32
+ type: 'set-heading';
33
+ heading: string;
34
+ }> | Readonly<{
35
+ type: 'set-intro';
36
+ intro: string;
37
+ }> | Readonly<{
38
+ type: 'set-form';
39
+ formId: string;
40
+ }> | Readonly<{
41
+ type: 'select-mailing-provider';
42
+ provider: 'riverbank' | 'mailchimp';
43
+ }> | Readonly<{
44
+ type: 'set-mailing-destination';
45
+ id: string;
46
+ }> | Readonly<{
47
+ type: 'set-mailing-copy';
48
+ field: keyof FooterMailingCopyDraft;
49
+ value: string;
50
+ }>;
51
+ export declare function reduceFooterEngagementDraft(draft: FooterEngagementDraft, event: FooterEngagementDraftEvent): FooterEngagementDraft;
52
+ export declare function createFooterEngagementDraft(section: FooterEngagementSection | null): FooterEngagementDraft;
53
+ type DraftParseError = Readonly<{
54
+ message: string;
55
+ }>;
56
+ export declare function parseFooterEngagementDraft(draft: FooterEngagementDraft, currentId: string, mailchimpConnectionId: string): Result<FooterEngagementSection, DraftParseError>;
57
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { FooterEngagementSection } from '../../core/src/index';
2
+ import type { FooterEngagementAuthoringOptions } from '../../api/src/footer-settings';
3
+ import type { FooterResolvedEngagement } from '../../blocks/src/client/site-chrome';
4
+ export type FooterEngagementReadiness = Readonly<{
5
+ kind: 'ready';
6
+ }> | Readonly<{
7
+ kind: 'needs-repair';
8
+ message: string;
9
+ }>;
10
+ export declare function resolveFooterEngagementAuthoringState(section: FooterEngagementSection | null, options: FooterEngagementAuthoringOptions): FooterEngagementReadiness;
11
+ export declare function resolveFooterEngagementPreview(section: FooterEngagementSection | null, options: FooterEngagementAuthoringOptions): FooterResolvedEngagement;
@@ -0,0 +1,13 @@
1
+ import { type FooterResolvedEngagement, type FooterRuntimeViewModel } from '../../blocks/src/client/site-chrome';
2
+ import type { FooterCompositionV1, PublicProfile } from '../../core/src/index';
3
+ export type FooterPreviewRuntimeInput = Readonly<{
4
+ composition: FooterCompositionV1;
5
+ publicProfile: PublicProfile;
6
+ hasBusinessAddress: boolean;
7
+ hasLogo: boolean;
8
+ hasMainNavigation: boolean;
9
+ hasLegalPolicyNavigation: boolean;
10
+ legalRegion: 'integrated' | 'separate';
11
+ engagement: FooterResolvedEngagement;
12
+ }>;
13
+ export declare function buildFooterPreviewRuntime(input: FooterPreviewRuntimeInput): FooterRuntimeViewModel;
@@ -25,6 +25,7 @@ export { PreviewRichTextEditor } from './primitives/PreviewRichTextEditor';
25
25
  export { recordsEqual as editorValuesEqual } from './ui/stores/utils';
26
26
  export { footerModuleLabel, planFooterEditorView, type FooterEditorSectionPlan, type FooterEditorSource, type FooterEditorTarget, type FooterEditorViewPlan, } from './footerComposer';
27
27
  export { FooterComposerPanel } from './FooterComposerPanel';
28
+ export { resolveFooterEngagementAuthoringState, type FooterEngagementReadiness, } from './footerEngagementEditor';
28
29
  export { useStoreBinding, parseEditorPath } from './primitives/shared';
29
30
  export type { PathInfo } from './primitives/shared';
30
31
  export * from './ai/overlayHelpers';
@@ -0,0 +1,35 @@
1
+ import { type FooterCompositionSnapshot, type PublicProfileSnapshot } from '../../api/src/footer-settings';
2
+ import type { ApiClient } from '../../api/src/request';
3
+ import { type FooterCompositionV1, type PublicProfile } from '../../core/src/index';
4
+ import type { FooterEditorTarget } from './footerComposer';
5
+ export type SaveState = 'idle' | 'saving' | 'saved' | 'conflict' | 'failed';
6
+ export type CompositionSaveOutcome = 'saved' | 'conflict' | 'failed';
7
+ type FooterComposerStateOptions = Readonly<{
8
+ apiClient: ApiClient;
9
+ canEdit: boolean;
10
+ initialTarget?: FooterEditorTarget;
11
+ onSaved?: () => void;
12
+ rawSiteId: string;
13
+ }>;
14
+ export declare function useFooterComposerState({ apiClient, canEdit, initialTarget, onSaved, rawSiteId, }: FooterComposerStateOptions): {
15
+ message: string | null;
16
+ saveComposition: (next: FooterCompositionV1, optimistic?: boolean) => Promise<CompositionSaveOutcome>;
17
+ saveProfile: (next: PublicProfile) => Promise<void>;
18
+ saveState: SaveState;
19
+ siteId: import("../../core/src/index").SiteId;
20
+ target: FooterEditorTarget;
21
+ setTarget: import("react").Dispatch<import("react").SetStateAction<FooterEditorTarget>>;
22
+ compositionSnapshot: FooterCompositionSnapshot | null;
23
+ engagementOptions: Readonly<{
24
+ forms: readonly import("../../api/src/footerSettings").FooterFormSummary[];
25
+ newsletterLists: readonly import("../../api/src/index").NewsletterListRecord[];
26
+ mailchimp: import("../../api/src/index").ListMailchimpAudiencesResponse;
27
+ }> | null;
28
+ load: () => Promise<void>;
29
+ loadError: string | null;
30
+ navigationMenus: import("../../api/src/index").NavigationMenuWithItems[] | null;
31
+ profileSnapshot: PublicProfileSnapshot | null;
32
+ setCompositionSnapshot: import("react").Dispatch<import("react").SetStateAction<FooterCompositionSnapshot | null>>;
33
+ setProfileSnapshot: import("react").Dispatch<import("react").SetStateAction<PublicProfileSnapshot | null>>;
34
+ };
35
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { FooterArrangementPlan, FooterLookPolicy, RenderableFooterSection } from './footer-composition-types';
2
+ export declare function planFooterArrangement(renderableSections: readonly RenderableFooterSection[], policy: FooterLookPolicy): FooterArrangementPlan;
@@ -0,0 +1,118 @@
1
+ import type { Brand } from './branded';
2
+ import type { FooterEngagementSection, FooterEngagementSource } from './footer-engagement';
3
+ import type { RichTextDoc } from './rich-text';
4
+ export type FooterModuleId = Brand<string, 'FooterModuleId'>;
5
+ export type FooterMembershipKey = Brand<string, 'FooterMembershipKey'>;
6
+ export type FooterRichText = RichTextDoc;
7
+ export type FooterNavigationRole = 'main' | 'legal-policy';
8
+ type FooterSectionBase<TKind extends string> = Readonly<{
9
+ id: FooterModuleId;
10
+ kind: TKind;
11
+ heading: string | null;
12
+ selected: boolean;
13
+ }>;
14
+ export type FooterSection = (FooterSectionBase<'brand'> & Readonly<{
15
+ showLogo: boolean;
16
+ showTitle: boolean;
17
+ }>) | (FooterSectionBase<'navigation'> & Readonly<{
18
+ source: Readonly<{
19
+ kind: 'menu-role';
20
+ role: 'main';
21
+ }>;
22
+ }>) | (FooterSectionBase<'legal-navigation'> & Readonly<{
23
+ source: Readonly<{
24
+ kind: 'menu-role';
25
+ role: 'legal-policy';
26
+ }>;
27
+ }>) | (FooterSectionBase<'business-address'> & Readonly<{
28
+ source: Readonly<{
29
+ kind: 'business-address';
30
+ }>;
31
+ }>) | (FooterSectionBase<'contact'> & Readonly<{
32
+ source: Readonly<{
33
+ kind: 'public-profile';
34
+ }>;
35
+ }>) | (FooterSectionBase<'opening-hours'> & Readonly<{
36
+ source: Readonly<{
37
+ kind: 'public-profile';
38
+ }>;
39
+ }>) | (FooterSectionBase<'social-links'> & Readonly<{
40
+ source: Readonly<{
41
+ kind: 'public-profile';
42
+ }>;
43
+ }>) | (FooterSectionBase<'supporting-text'> & Readonly<{
44
+ content: FooterRichText | null;
45
+ }>) | (FooterSectionBase<'legal'> & Readonly<{
46
+ content: FooterRichText | null;
47
+ }>) | FooterEngagementSection;
48
+ export type FooterSectionKind = FooterSection['kind'];
49
+ export type FooterCompositionV1 = Readonly<{
50
+ schemaVersion: 1;
51
+ sections: readonly FooterSection[];
52
+ }>;
53
+ export type FooterCompositionError = Readonly<{
54
+ code: 'invalid_shape' | 'unsupported_schema_version' | 'invalid_section' | 'duplicate_section_id' | 'duplicate_section_kind' | 'unknown_section';
55
+ path: string;
56
+ message: string;
57
+ }>;
58
+ export type FooterLookPolicy = Readonly<{
59
+ kind: 'integrated-legal';
60
+ }> | Readonly<{
61
+ kind: 'separate-legal-region';
62
+ }>;
63
+ export type FooterVisualGroupKind = 'identity' | 'main-navigation' | 'visit' | 'engagement' | 'legal-ending';
64
+ export type FooterColumnCount = 1 | 2 | 3 | 4 | 5;
65
+ export type FooterVisualGroup = Readonly<{
66
+ kind: FooterVisualGroupKind;
67
+ sections: readonly FooterSection[];
68
+ span: 1;
69
+ }>;
70
+ export type FooterRenderRegion = Readonly<{
71
+ kind: 'engagement-row' | 'main' | 'bottom';
72
+ columns: FooterColumnCount;
73
+ groups: readonly FooterVisualGroup[];
74
+ }>;
75
+ export type FooterArrangementPlan = Readonly<{
76
+ membershipKey: FooterMembershipKey;
77
+ regions: readonly FooterRenderRegion[];
78
+ mobileGroups: readonly FooterVisualGroup[];
79
+ }>;
80
+ export type FooterRepairTarget = Readonly<{
81
+ kind: 'site-identity';
82
+ }> | Readonly<{
83
+ kind: 'navigation';
84
+ role: FooterNavigationRole;
85
+ }> | Readonly<{
86
+ kind: 'business-address';
87
+ }> | Readonly<{
88
+ kind: 'engagement-source';
89
+ source: FooterEngagementSource['kind'];
90
+ }> | Readonly<{
91
+ kind: 'public-profile';
92
+ section: 'contact' | 'opening-hours' | 'social-links';
93
+ }> | Readonly<{
94
+ kind: 'footer-section';
95
+ sectionId: FooterModuleId;
96
+ }>;
97
+ export type ResolvedFooterSection = Readonly<{
98
+ kind: 'renderable';
99
+ section: FooterSection;
100
+ }> | Readonly<{
101
+ kind: 'missing-source';
102
+ section: FooterSection;
103
+ repairTarget: FooterRepairTarget;
104
+ }>;
105
+ export type RenderableFooterSection = Extract<ResolvedFooterSection, {
106
+ kind: 'renderable';
107
+ }>;
108
+ export type FooterSourceAvailability = Readonly<{
109
+ hasLogo: boolean;
110
+ hasMainNavigation: boolean;
111
+ hasLegalPolicyNavigation: boolean;
112
+ hasBusinessAddress: boolean;
113
+ hasContact: boolean;
114
+ hasOpeningHours: boolean;
115
+ hasSocialLinks: boolean;
116
+ hasEngagementSource: boolean;
117
+ }>;
118
+ export {};