@riverbankcms/sdk 0.78.2 → 0.79.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 (159) hide show
  1. package/README.md +80 -0
  2. package/dist/{PreviewEditorSidebar-4DXLYX2V.mjs → PreviewEditorSidebar-56NMJMIK.mjs} +724 -47
  3. package/dist/{PreviewEditorUI-CS5P4N3P.mjs → PreviewEditorUI-27KJVEET.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-H4BSP6E7.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +36 -0
  6. package/dist/_dts/api/src/endpoints.d.ts +55 -0
  7. package/dist/_dts/api/src/index.d.ts +5 -3
  8. package/dist/_dts/api/src/media.d.ts +8 -1
  9. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  10. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +8 -8
  11. package/dist/_dts/api/src/navigation/identity.d.ts +59 -0
  12. package/dist/_dts/api/src/navigation.d.ts +2 -0
  13. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +4 -0
  14. package/dist/_dts/api/src/sdkContracts.d.ts +1 -0
  15. package/dist/_dts/api/src/siteIcons.d.ts +128 -0
  16. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +16 -0
  17. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +7 -0
  18. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
  19. package/dist/_dts/api/src/types.d.ts +1 -1
  20. package/dist/_dts/api/src/webhooks.d.ts +239 -0
  21. package/dist/_dts/blocks/src/index.d.ts +4 -0
  22. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  23. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  24. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  25. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  26. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  27. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  28. package/dist/_dts/blocks/src/system/blocks/feature-card-icons.d.ts +57 -0
  29. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +4 -0
  30. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  33. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +22 -22
  34. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  35. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  36. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  37. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
  38. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +170 -0
  39. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +5 -0
  40. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +3 -1
  41. package/dist/_dts/blocks/src/system/icons/ids.d.ts +13 -0
  42. package/dist/_dts/blocks/src/system/icons/index.d.ts +6 -0
  43. package/dist/_dts/blocks/src/system/icons/presets.d.ts +4 -0
  44. package/dist/_dts/blocks/src/system/icons/registry.d.ts +18 -0
  45. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +239 -0
  46. package/dist/_dts/blocks/src/system/icons/value.d.ts +94 -0
  47. package/dist/_dts/blocks/src/system/index.d.ts +1 -0
  48. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +4 -1
  49. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/feature-card-icon.d.ts +13 -0
  51. package/dist/_dts/content-model/src/contentManifest.d.ts +3 -1
  52. package/dist/_dts/core/src/branded.d.ts +6 -0
  53. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +191 -0
  54. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +12 -1
  55. package/dist/_dts/editor-blocks/src/block-editor/BlockCardBody.d.ts +12 -1
  56. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +12 -2
  57. package/dist/_dts/editor-blocks/src/block-editor/FeatureCardIconsPanel.d.ts +21 -0
  58. package/dist/_dts/editor-blocks/src/block-editor/GeneratedIconSetDialog.d.ts +40 -0
  59. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +11 -1
  60. package/dist/_dts/editor-blocks/src/block-editor/featureCardIconActions.d.ts +82 -0
  61. package/dist/_dts/editor-blocks/src/widgets/icon-picker/IconPickerField.d.ts +1 -1
  62. package/dist/_dts/media-core/src/fileDomain.d.ts +8 -1
  63. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -2
  64. package/dist/_dts/media-react/src/components/MediaLibrary.d.ts +2 -1
  65. package/dist/_dts/media-react/src/components/MediaPickerMini.d.ts +2 -1
  66. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +17 -0
  67. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +4 -0
  68. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +3 -2
  69. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +6 -0
  70. package/dist/_dts/sdk/src/cli/navigationIdentity.d.ts +11 -0
  71. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +4 -0
  72. package/dist/_dts/sdk/src/cli/site-commands/oneOffCommands.d.ts +1 -0
  73. package/dist/_dts/sdk/src/cli/sync/diff.d.ts +9 -0
  74. package/dist/_dts/sdk/src/client/management/types.d.ts +2 -0
  75. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  76. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  77. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +19 -2
  78. package/dist/_dts/sdk/src/next/index.d.ts +1 -1
  79. package/dist/_dts/sdk/src/next/revalidate.d.ts +26 -5
  80. package/dist/_dts/sdk/src/next/static-params.d.ts +28 -3
  81. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -1
  82. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  83. package/dist/_dts/sdk/src/version.d.ts +1 -1
  84. package/dist/_dts/sdk/src/webhooks/index.d.ts +1 -1
  85. package/dist/_dts/sdk/src/webhooks/verify.d.ts +6 -102
  86. package/dist/_dts/site-commands/src/commands.d.ts +3 -0
  87. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  88. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +3 -3
  89. package/dist/_dts/theme-core/src/schema.d.ts +5 -5
  90. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -2
  91. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +5 -5
  92. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  93. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -4
  94. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -0
  95. package/dist/_dts/ui/src/combobox.d.ts +1 -0
  96. package/dist/{chunk-RGTOD4AJ.mjs → chunk-4HCW7FHJ.mjs} +491 -56
  97. package/dist/{chunk-OKMBEAXY.mjs → chunk-A3HHFKVT.mjs} +1 -1
  98. package/dist/{chunk-6HYXHRAI.mjs → chunk-GP555I66.mjs} +177 -7
  99. package/dist/{chunk-CR5HKAGU.mjs → chunk-K2IIF34C.mjs} +55 -0
  100. package/dist/{chunk-4QEGTLK6.mjs → chunk-LCY32PXF.mjs} +1 -1
  101. package/dist/{chunk-MCRQMPET.mjs → chunk-V47ZU33I.mjs} +1745 -157
  102. package/dist/cli/index.mjs +1169 -171
  103. package/dist/cli/init-docs/content/workflow-editor-workflows.md +2 -0
  104. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +138 -0
  105. package/dist/client/{accordion-PLYNJIIM.mjs → accordion-QLA7KBYO.mjs} +1 -1
  106. package/dist/client/{bookingForm-BXAP6AO7.mjs → bookingForm-PYZIPA5G.mjs} +3 -3
  107. package/dist/client/bookings.mjs +110 -2
  108. package/dist/client/{carousel-TRBXDHGF.mjs → carousel-5EIULWBI.mjs} +2 -2
  109. package/dist/client/{cart-Z7H3HJRS.mjs → cart-DOP3FNI4.mjs} +5 -5
  110. package/dist/client/{checkout-WAFCUBIX.mjs → checkout-BVMF6FBV.mjs} +5 -5
  111. package/dist/client/{chunk-JRDUHZCT.mjs → chunk-44K2U3QI.mjs} +4 -4
  112. package/dist/client/{chunk-UVQEJJTN.mjs → chunk-CCNTDRCF.mjs} +1 -1
  113. package/dist/client/{chunk-ZI3LLBPZ.mjs → chunk-GG4M2NP6.mjs} +1 -1
  114. package/dist/client/{chunk-JGXPTEI2.mjs → chunk-R5ESWNKX.mjs} +6 -3
  115. package/dist/client/{chunk-CWGTG37I.mjs → chunk-TYONZMST.mjs} +1 -1
  116. package/dist/client/{chunk-75OUS5MT.mjs → chunk-UDS3NTWA.mjs} +1 -1
  117. package/dist/client/{chunk-DNRGY432.mjs → chunk-V6M5FCR5.mjs} +1 -1
  118. package/dist/client/{chunk-FUXW6VW2.mjs → chunk-YLDYVRZL.mjs} +4 -4
  119. package/dist/client/client.mjs +21329 -19729
  120. package/dist/client/{courseRegistration-AHFQHWIJ.mjs → courseRegistration-E6EAA6NL.mjs} +3 -3
  121. package/dist/client/{eventCalendar-LDXTV5R7.mjs → eventCalendar-HBG3HAK6.mjs} +5 -5
  122. package/dist/client/{eventCombined-A4JGTNJO.mjs → eventCombined-6K5ZZWAK.mjs} +5 -5
  123. package/dist/client/{eventDetails-4YXTZ7EG.mjs → eventDetails-Q75ICXLT.mjs} +5 -5
  124. package/dist/client/{eventListing-P72TPFFM.mjs → eventListing-27P5F7DZ.mjs} +5 -5
  125. package/dist/client/{eventRegistration-LSYJHGMT.mjs → eventRegistration-IQ7AMASR.mjs} +5 -5
  126. package/dist/client/{form-AOPYOKOW.mjs → form-JRTD65FN.mjs} +1 -1
  127. package/dist/client/{headerSection-5TFYDFVQ.mjs → headerSection-7FPSSZHS.mjs} +2 -2
  128. package/dist/client/hooks.mjs +350 -35
  129. package/dist/client/{locationMap-QSZ3ZVAZ.mjs → locationMap-7NGFNYBH.mjs} +1 -1
  130. package/dist/client/{newsletterForm-KTRHZY52.mjs → newsletterForm-F3BADCI2.mjs} +1 -1
  131. package/dist/client/{productDetail-N4E775RG.mjs → productDetail-V3HP7ITJ.mjs} +5 -5
  132. package/dist/client/{productList-UGUQ2S45.mjs → productList-L3EGJUF2.mjs} +5 -5
  133. package/dist/client/rendering/client.mjs +2713 -1382
  134. package/dist/client/rendering/islands.mjs +18 -18
  135. package/dist/client/rendering.mjs +2014 -414
  136. package/dist/client/{shop-VHSZEEQ2.mjs → shop-DQUB5E2C.mjs} +5 -5
  137. package/dist/preview-next/before-render.mjs +55 -0
  138. package/dist/preview-next/client/runtime.mjs +5 -5
  139. package/dist/preview-next/middleware.mjs +55 -0
  140. package/dist/{sdk-runtime-WHPJEF5G.mjs → sdk-runtime-AF6KXJU4.mjs} +6 -6
  141. package/dist/server/components.mjs +2169 -781
  142. package/dist/server/config-validation.mjs +350 -35
  143. package/dist/server/config.mjs +350 -35
  144. package/dist/server/data.mjs +350 -35
  145. package/dist/server/index.mjs +64 -1
  146. package/dist/server/next/revalidate.mjs +229 -34
  147. package/dist/server/next.mjs +2307 -818
  148. package/dist/server/page-converter.mjs +275 -34
  149. package/dist/server/prebuild.mjs +1 -1
  150. package/dist/server/rendering/server.mjs +2174 -786
  151. package/dist/server/rendering.mjs +2187 -799
  152. package/dist/server/routing.mjs +767 -50
  153. package/dist/server/server.mjs +351 -36
  154. package/dist/server/theme-bridge.mjs +164 -2
  155. package/dist/server/theme.mjs +2 -2
  156. package/dist/server/webhooks.mjs +129 -25
  157. package/dist/styles/index.css +55 -0
  158. package/package.json +2 -1
  159. package/dist/SdkPreviewModeRuntime-IJDHTW4W.mjs +0 -8
@@ -31,6 +31,8 @@ Use `contentType: "page"` for page workflows. Use a content type key, such as `b
31
31
 
32
32
  Riverbank saves the draft, disables the editor, creates a workflow run, and posts to your endpoint. Verify the raw body with the same HMAC helper used for webhooks:
33
33
 
34
+ The `x-riverbank-signature` header is formatted as `sha256=<hex HMAC-SHA256 digest>`.
35
+
34
36
  ```ts
35
37
  import { verifyWebhookSignature } from "@riverbankcms/sdk/webhooks";
36
38
 
@@ -0,0 +1,138 @@
1
+ # Workflow: Production ISR and Revalidation
2
+
3
+ ## Purpose
4
+
5
+ Configure a Riverbank SDK Next.js App Router site to prerender published routes, serve production pages through ISR, and refresh affected paths when the CMS sends signed publish webhooks.
6
+
7
+ ## Prerequisites
8
+
9
+ - A Riverbank SDK site using `createCatchAllPage()` in `src/app/[[...slug]]/page.tsx`.
10
+ - A production content API key in `RIVERBANK_API_KEY`.
11
+ - `RIVERBANK_SITE_ID` set to this site's Riverbank site ID.
12
+ - `NEXT_PUBLIC_DASHBOARD_URL` set to the dashboard origin, for example `https://cms.example.com`.
13
+ - A shared webhook secret for the deployed site and the Riverbank webhook endpoint.
14
+
15
+ Preview deployments should also set `RIVERBANK_PREVIEW_MODE=true` so draft previews stay dynamic instead of serving stale ISR HTML.
16
+
17
+ ## Configure the Catch-All Route
18
+
19
+ In `src/app/[[...slug]]/page.tsx`:
20
+
21
+ ```tsx
22
+ import {
23
+ createCatchAllPage,
24
+ generateAllStaticParams,
25
+ getISRConfig,
26
+ } from '@riverbankcms/sdk/next'
27
+
28
+ import config from '@/riverbank.config'
29
+ import { blockOverrides } from '@/lib/block-overrides'
30
+ import { getRiverbankClient } from '@/lib/riverbank-client'
31
+
32
+ export const revalidate = getISRConfig().revalidate
33
+ export const dynamicParams = true
34
+ export { generateAllStaticParams as generateStaticParams }
35
+
36
+ const { Page, generateMetadata } = createCatchAllPage({
37
+ getClient: getRiverbankClient,
38
+ config,
39
+ blockOverrides,
40
+ })
41
+
42
+ export default Page
43
+ export { generateMetadata }
44
+ ```
45
+
46
+ `generateAllStaticParams()` discovers published pages and routable entries at build time. It reads:
47
+
48
+ - `RIVERBANK_API_KEY`
49
+ - `RIVERBANK_SITE_ID`
50
+ - `NEXT_PUBLIC_DASHBOARD_URL`
51
+
52
+ By default, route discovery falls back to the homepage if the CMS is temporarily unavailable. Use strict mode when you want production CI to fail instead:
53
+
54
+ ```tsx
55
+ import { generateAllStaticParams } from '@riverbankcms/sdk/next'
56
+
57
+ export function generateStaticParams() {
58
+ return generateAllStaticParams({ failureMode: 'throw' })
59
+ }
60
+ ```
61
+
62
+ If your site already centralizes the SDK client, use the explicit factory:
63
+
64
+ ```tsx
65
+ import { createGenerateStaticParams } from '@riverbankcms/sdk/next'
66
+
67
+ import config from '@/riverbank.config'
68
+ import { getRiverbankClient } from '@/lib/riverbank-client'
69
+
70
+ export const generateStaticParams = createGenerateStaticParams({
71
+ getClient: getRiverbankClient,
72
+ siteId: config.siteId,
73
+ failureMode: 'throw',
74
+ })
75
+ ```
76
+
77
+ ## Add the Revalidation Route
78
+
79
+ Create `src/app/api/revalidate/route.ts`:
80
+
81
+ ```ts
82
+ import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate'
83
+
84
+ export const POST = createRevalidateHandler()
85
+ ```
86
+
87
+ Set the same secret in the deployed site and the Riverbank webhook endpoint:
88
+
89
+ ```bash
90
+ RIVERBANK_WEBHOOK_SECRET=...
91
+ ```
92
+
93
+ Riverbank signs each request with:
94
+
95
+ ```http
96
+ X-Riverbank-Signature: sha256=<hex HMAC-SHA256 digest>
97
+ ```
98
+
99
+ The digest is computed over the raw JSON body. The SDK handler rejects unsigned requests, plain hex signatures without the `sha256=` prefix, malformed digests, bad signatures, and invalid payloads. Malformed path entries are skipped and reported in the response metadata while valid tags and paths still revalidate.
100
+
101
+ Riverbank includes a `dispatchId` in signed payloads and sends matching `X-Riverbank-Dispatch-Id` / `X-Riverbank-Correlation-Id` headers. To join CMS delivery logs with this site's deployment logs, use the optional callback metadata:
102
+
103
+ ```ts
104
+ export const POST = createRevalidateHandler({
105
+ onRevalidate: (_payload, _items, metadata) => {
106
+ console.info('Riverbank ISR revalidated', metadata)
107
+ },
108
+ })
109
+ ```
110
+
111
+ ## Configure the CMS Webhook Endpoint
112
+
113
+ In the Riverbank dashboard, configure or reuse an enabled webhook endpoint whose URL points at the deployed route:
114
+
115
+ ```text
116
+ https://www.example.com/api/revalidate
117
+ ```
118
+
119
+ Use the same `RIVERBANK_WEBHOOK_SECRET` value for that endpoint. SDK-site revalidation events include page and entry publish, unpublish, delete, and public path changes, along with navigation, theme, and site settings updates. Events send top-level `paths` and `tags`; the SDK handler normalizes and dedupes them before calling `revalidatePath()` and `revalidateTag()`.
120
+
121
+ Some valid events are tags-only. Global render changes do not include explicit paths, and very large path sets degrade to tags-only delivery so webhook payloads stay bounded. Existing webhook endpoints may need their subscribed event list updated to receive the newer unpublish, delete, and path-change events.
122
+
123
+ For troubleshooting, inspect the endpoint's delivery logs in Riverbank. Each delivery stores minimized payload diagnostics with `dispatchId`, `siteId`, event, `pathCount`, `tagCount`, status, response time, and a minimized failure body. Secrets, signature headers, cookies, authorization headers, and raw sensitive fields are not written to delivery logs.
124
+
125
+ ## Verify
126
+
127
+ 1. Build the site with production environment variables present.
128
+ 2. Confirm a published route is included in the static params output or appears as prerendered in the Next build summary.
129
+ 3. Visit a published page.
130
+ 4. Publish a change in the CMS.
131
+ 5. Confirm the webhook delivery succeeds.
132
+ 6. Reload the page and confirm the changed content appears without waiting for the normal ISR interval.
133
+
134
+ For local SDK development inside the Riverbank monorepo, the smoke check is:
135
+
136
+ ```bash
137
+ pnpm --filter @riverbankcms/sdk test:isr-catch-all-revalidate-smoke
138
+ ```
@@ -1,4 +1,4 @@
1
- import { defineIslandPropsDecoder } from './chunk-JGXPTEI2.mjs';
1
+ import { defineIslandPropsDecoder } from './chunk-R5ESWNKX.mjs';
2
2
  import './chunk-AUJ5DBZJ.mjs';
3
3
 
4
4
  // src/rendering/islands/enhancers/accordion.ts
@@ -1,14 +1,14 @@
1
1
  "use client";
2
- import { usePolling } from './chunk-DNRGY432.mjs';
2
+ import { usePolling } from './chunk-V6M5FCR5.mjs';
3
3
  import { SpinnerNode } from './chunk-CE7IBGVW.mjs';
4
4
  import { useDiscountCodeUi } from './chunk-ZFHRN6W2.mjs';
5
- import { scrollToBlock, buildCheckoutReturnUrls, DiscountCodeDisclosure, formatPrice } from './chunk-UVQEJJTN.mjs';
5
+ import { scrollToBlock, buildCheckoutReturnUrls, DiscountCodeDisclosure, formatPrice } from './chunk-CCNTDRCF.mjs';
6
6
  import { FieldValidationMessage, getFieldValidationControlProps } from './chunk-3DCJ45Z2.mjs';
7
7
  import './chunk-3PEDD5KJ.mjs';
8
8
  import { isSpamProtectionEnabled, getChallengeUrl, AltchaWidget } from './chunk-YLMKMCSJ.mjs';
9
9
  import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-UDNSI5PY.mjs';
10
10
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
11
- import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever11, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith2, err2 } from './chunk-JGXPTEI2.mjs';
11
+ import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever11, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith2, err2 } from './chunk-R5ESWNKX.mjs';
12
12
  import { resolveBookingTimeZoneId, DEFAULT_BOOKING_TIME_ZONE, unsafeAsFormId, unsafeAsAppointmentResourceId, unsafeAsCustomerPassId, unsafeAsAppointmentServiceId, formatLocalScheduleDate, addLocalScheduleDays, parseBookingLocalDate, resolveFlexibleBalanceInitialPaymentCents, resolveFlexibleBalanceDueAt, getBookingInstalmentDepositRefundability, unsafeAsPassId, splitAmountWithRemainderInFirst, addIntervalPreservingMonthAnchor, clampConfiguredAmount, getBookingInstalmentPlanIntervalCount, omitZeroAmountFutureRows, formatBookingInstant } from './chunk-AUJ5DBZJ.mjs';
13
13
  import React2, { useRef, useState, useMemo, useReducer, useEffect, useCallback, useLayoutEffect } from 'react';
14
14
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -4047,7 +4047,7 @@ var themeColorBaseTokenNames = [
4047
4047
  "accentForeground"
4048
4048
  ];
4049
4049
  var themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
4050
- var SHADE_STEPS = [
4050
+ var themeColorShadeSteps = [
4051
4051
  "50",
4052
4052
  "100",
4053
4053
  "200",
@@ -4060,7 +4060,7 @@ var SHADE_STEPS = [
4060
4060
  "900",
4061
4061
  "950"
4062
4062
  ];
4063
- var shadeStepSet = new Set(SHADE_STEPS);
4063
+ var shadeStepSet = new Set(themeColorShadeSteps);
4064
4064
  function isKnownBaseToken(value) {
4065
4065
  return themeColorBaseTokenSet.has(value);
4066
4066
  }
@@ -9225,6 +9225,114 @@ var curatedSiteStyles = [
9225
9225
  paletteChoice("warm-neutral-clay")
9226
9226
  ]
9227
9227
  }),
9228
+ defineCuratedSiteStyle({
9229
+ id: "site-style:clarity-zen-blue",
9230
+ name: "Clarity Zen",
9231
+ description: "Calm, editorial, and reassuring for therapy, counselling, and wellbeing support practices.",
9232
+ generationBrief: "Use a calm, soft palette, editorial serif headings, warm grounded copy, rounded cards, calm proof sections, and clear booking routes. Keep the tone compassionate and straightforward, with professional trust rather than hard-sell wellness language.",
9233
+ siteCreatorSelection: {
9234
+ kind: "site_creator_keyword_heuristic",
9235
+ priority: 25
9236
+ },
9237
+ selectionKeywordRules: [
9238
+ { kind: "substring", value: "psychotherap" },
9239
+ { kind: "phrase", value: "mental health" },
9240
+ { kind: "phrase", value: "talk therapy" },
9241
+ { kind: "phrase", value: "therapy and wellbeing" }
9242
+ ],
9243
+ tokenRecipes: {
9244
+ palette: "brand-led",
9245
+ contrast: "standard",
9246
+ radius: "rounded",
9247
+ shadow: "subtle",
9248
+ typography: "serif-editorial",
9249
+ spacing: "airy",
9250
+ motion: "subtle"
9251
+ },
9252
+ compositionBudget: balancedBudget,
9253
+ themeOverrides: {
9254
+ typography: {
9255
+ body: {
9256
+ family: "Inter, system-ui, sans-serif",
9257
+ size: "md",
9258
+ weight: "regular",
9259
+ lineHeight: "relaxed",
9260
+ letterSpacing: "normal"
9261
+ },
9262
+ headings: {
9263
+ default: {
9264
+ family: '"Cormorant Garamond", Georgia, serif',
9265
+ weight: "regular",
9266
+ lineHeight: "normal",
9267
+ letterSpacing: "normal",
9268
+ colorToken: "text",
9269
+ italic: null,
9270
+ case: null
9271
+ },
9272
+ h1: {
9273
+ size: "xl",
9274
+ weight: "regular",
9275
+ lineHeight: "normal",
9276
+ letterSpacing: "normal",
9277
+ italic: null
9278
+ },
9279
+ h2: {
9280
+ size: "lg",
9281
+ weight: "regular",
9282
+ lineHeight: "normal",
9283
+ letterSpacing: "normal",
9284
+ italic: null
9285
+ },
9286
+ h3: {
9287
+ size: "md",
9288
+ weight: "regular",
9289
+ lineHeight: "normal",
9290
+ letterSpacing: "normal",
9291
+ italic: null
9292
+ }
9293
+ },
9294
+ scale: "majorThird"
9295
+ },
9296
+ bodyText: {
9297
+ intro: {
9298
+ paragraphSize: "default",
9299
+ headingSize: "editorial"
9300
+ }
9301
+ }
9302
+ },
9303
+ defaultBlockVariants: {
9304
+ "block.faq": "split-heading-columns"
9305
+ },
9306
+ recommendedAppearancePresetIds: [
9307
+ "hero-split-editorial",
9308
+ "intro-organic-statement",
9309
+ "feature-cards-raised-rule",
9310
+ "media-text-quiet-story",
9311
+ "testimonials-brand-background-quotes",
9312
+ "faq-contained-help",
9313
+ "contact-form-panel"
9314
+ ],
9315
+ recommendedHeaderLookIds: [
9316
+ "centered-calm",
9317
+ "serif-line",
9318
+ "minimal-transparent"
9319
+ ],
9320
+ recommendedFooterLookIds: [
9321
+ "footer-muted-grounding",
9322
+ "site-footer-brand-two-band"
9323
+ ],
9324
+ buttonPersonalityChoices: [
9325
+ buttonChoice("soft-pill"),
9326
+ buttonChoice("pebble"),
9327
+ buttonChoice("editorial-link")
9328
+ ],
9329
+ paletteVariantChoices: [
9330
+ paletteChoice("brand-led-cool"),
9331
+ paletteChoice("soft-natural-watercolor"),
9332
+ paletteChoice("soft-natural-stone"),
9333
+ paletteChoice("warm-neutral-cream")
9334
+ ]
9335
+ }),
9228
9336
  defineCuratedSiteStyle({
9229
9337
  id: "site-style:personal-retreat-journal",
9230
9338
  name: "Personal Retreat Journal",
@@ -1,6 +1,6 @@
1
- import { normalizeCarouselProps, CarouselNodeClient } from './chunk-75OUS5MT.mjs';
1
+ import { normalizeCarouselProps, CarouselNodeClient } from './chunk-UDS3NTWA.mjs';
2
2
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
3
- import { defineIslandPropsDecoder } from './chunk-JGXPTEI2.mjs';
3
+ import { defineIslandPropsDecoder } from './chunk-R5ESWNKX.mjs';
4
4
  import './chunk-AUJ5DBZJ.mjs';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,14 +1,14 @@
1
- import { mountShopBlockIsland, CartClient } from './chunk-FUXW6VW2.mjs';
2
- import './chunk-CWGTG37I.mjs';
3
- import './chunk-75OUS5MT.mjs';
1
+ import { mountShopBlockIsland, CartClient } from './chunk-YLDYVRZL.mjs';
2
+ import './chunk-TYONZMST.mjs';
3
+ import './chunk-UDS3NTWA.mjs';
4
4
  import './chunk-I2MMZO53.mjs';
5
5
  import './chunk-ZFHRN6W2.mjs';
6
- import './chunk-UVQEJJTN.mjs';
6
+ import './chunk-CCNTDRCF.mjs';
7
7
  import './chunk-3DCJ45Z2.mjs';
8
8
  import './chunk-3PEDD5KJ.mjs';
9
9
  import './chunk-UDNSI5PY.mjs';
10
10
  import './chunk-N7PBWBWQ.mjs';
11
- import { defineIslandPropsDecoder } from './chunk-JGXPTEI2.mjs';
11
+ import { defineIslandPropsDecoder } from './chunk-R5ESWNKX.mjs';
12
12
  import './chunk-AUJ5DBZJ.mjs';
13
13
 
14
14
  // src/rendering/islands/enhancers/cart.tsx
@@ -1,14 +1,14 @@
1
- import { mountShopBlockIsland, CheckoutClient } from './chunk-FUXW6VW2.mjs';
2
- import './chunk-CWGTG37I.mjs';
3
- import './chunk-75OUS5MT.mjs';
1
+ import { mountShopBlockIsland, CheckoutClient } from './chunk-YLDYVRZL.mjs';
2
+ import './chunk-TYONZMST.mjs';
3
+ import './chunk-UDS3NTWA.mjs';
4
4
  import './chunk-I2MMZO53.mjs';
5
5
  import './chunk-ZFHRN6W2.mjs';
6
- import './chunk-UVQEJJTN.mjs';
6
+ import './chunk-CCNTDRCF.mjs';
7
7
  import './chunk-3DCJ45Z2.mjs';
8
8
  import './chunk-3PEDD5KJ.mjs';
9
9
  import './chunk-UDNSI5PY.mjs';
10
10
  import './chunk-N7PBWBWQ.mjs';
11
- import { defineIslandPropsDecoder } from './chunk-JGXPTEI2.mjs';
11
+ import { defineIslandPropsDecoder } from './chunk-R5ESWNKX.mjs';
12
12
  import './chunk-AUJ5DBZJ.mjs';
13
13
 
14
14
  // src/rendering/islands/enhancers/checkout.tsx
@@ -1,15 +1,15 @@
1
1
  "use client";
2
2
  import { LeafletStaticMap } from './chunk-XSV6KW4D.mjs';
3
- import { MagicLinkForm, useWaitlistClaim } from './chunk-ZI3LLBPZ.mjs';
4
- import { usePolling } from './chunk-DNRGY432.mjs';
3
+ import { MagicLinkForm, useWaitlistClaim } from './chunk-GG4M2NP6.mjs';
4
+ import { usePolling } from './chunk-V6M5FCR5.mjs';
5
5
  import { SpinnerNode } from './chunk-CE7IBGVW.mjs';
6
6
  import { useDiscountCodeUi } from './chunk-ZFHRN6W2.mjs';
7
- import { TabBarFragment, logoutPortal, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, consumeSearchParam, LoggedInAsUser, CheckIcon } from './chunk-UVQEJJTN.mjs';
7
+ import { TabBarFragment, logoutPortal, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, consumeSearchParam, LoggedInAsUser, CheckIcon } from './chunk-CCNTDRCF.mjs';
8
8
  import { getFieldValidationControlProps, FieldValidationMessage } from './chunk-3DCJ45Z2.mjs';
9
9
  import { ModalShell } from './chunk-3PEDD5KJ.mjs';
10
10
  import { isSpamProtectionEnabled, AltchaWidget, getChallengeUrl } from './chunk-YLMKMCSJ.mjs';
11
11
  import { useBlockApi, FeedbackMessage } from './chunk-UDNSI5PY.mjs';
12
- import { buildEventCalendarListingRender, getWeekCalendarDays, formatCalendarTitle, groupEventsByDate, getOrderedDayNames, getMonthCalendarDays, formatDateKey, themeButtonClassName, normalizeEventBlockKind, EventCompactRow, EmptyState, getContainerClass, getCardOrientation, addMonths, getThreeMonthRange, isToday, MAX_EVENTS_PER_DAY, formatTime, resolveCoursePricingState, formatEventDateParts, formatCoursePriceAmount, DateTimeTile, normalizeIdList, EventCard, buildTimetableModel, formatDate, isEventContentType, formatCoursePriceDisplay, MONTH_NAMES, formatEventPrice, getEventAvailability, formatEventTeacherLine, CreditCard, Ticket, Star, Sparkles, assertNever11 } from './chunk-JGXPTEI2.mjs';
12
+ import { buildEventCalendarListingRender, getWeekCalendarDays, formatCalendarTitle, groupEventsByDate, getOrderedDayNames, getMonthCalendarDays, formatDateKey, themeButtonClassName, normalizeEventBlockKind, EventCompactRow, EmptyState, getContainerClass, getCardOrientation, addMonths, getThreeMonthRange, isToday, MAX_EVENTS_PER_DAY, formatTime, resolveCoursePricingState, formatEventDateParts, formatCoursePriceAmount, DateTimeTile, normalizeIdList, EventCard, buildTimetableModel, formatDate, isEventContentType, formatCoursePriceDisplay, MONTH_NAMES, formatEventPrice, getEventAvailability, formatEventTeacherLine, CreditCard, Ticket, Star, Sparkles, assertNever11 } from './chunk-R5ESWNKX.mjs';
13
13
  import { getBookingLocalDateKey, toScheduledBookingDateTime, toBookingTimeZone, formatBookingDateTime, formatBookingDate, formatBookingTime } from './chunk-AUJ5DBZJ.mjs';
14
14
  import { createContext, useId, useMemo, useState, useRef, useEffect, useCallback, useContext, useReducer } from 'react';
15
15
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  import { FeedbackMessage } from './chunk-UDNSI5PY.mjs';
2
- import { themeButtonClassName } from './chunk-JGXPTEI2.mjs';
2
+ import { themeButtonClassName } from './chunk-R5ESWNKX.mjs';
3
3
  import { clsx_default } from './chunk-AUJ5DBZJ.mjs';
4
4
  import { useId } from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useBlockApi, BlockApiError } from './chunk-UDNSI5PY.mjs';
3
- import { themeButtonClassName } from './chunk-JGXPTEI2.mjs';
3
+ import { themeButtonClassName } from './chunk-R5ESWNKX.mjs';
4
4
  import { useState, useSyncExternalStore, useEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -771,7 +771,7 @@ var themeColorBaseTokenNames = [
771
771
  "accentForeground"
772
772
  ];
773
773
  var themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
774
- var SHADE_STEPS = [
774
+ var themeColorShadeSteps = [
775
775
  "50",
776
776
  "100",
777
777
  "200",
@@ -784,7 +784,7 @@ var SHADE_STEPS = [
784
784
  "900",
785
785
  "950"
786
786
  ];
787
- var shadeStepSet = new Set(SHADE_STEPS);
787
+ var shadeStepSet = new Set(themeColorShadeSteps);
788
788
  function isKnownBaseToken(value) {
789
789
  return themeColorBaseTokenSet.has(value);
790
790
  }
@@ -1971,6 +1971,9 @@ function resolveRepeaterGridColumnFieldId(options) {
1971
1971
  return asNonEmptyString(options?.id) ?? DEFAULT_REPEATER_GRID_COLUMN_FIELD_ID;
1972
1972
  }
1973
1973
 
1974
+ // ../blocks/src/system/icons/presets.ts
1975
+ var ICON_PICKER_PRESETS = ["cta", "feature"];
1976
+
1974
1977
  // ../blocks/src/system/manifest/schema.ts
1975
1978
  var visibilityLevels = ["admin", "designer", "author"];
1976
1979
  var MEDIA_KINDS = [
@@ -2129,7 +2132,7 @@ var uiSchema = z.object({
2129
2132
  layoutGridColumnField: z.string().optional(),
2130
2133
  layoutGridMaxRows: z.number().int().positive().optional(),
2131
2134
  // Icon picker configuration (used when ui.widget === 'iconPicker')
2132
- iconPickerPreset: z.enum(["cta"]).optional(),
2135
+ iconPickerPreset: z.enum(ICON_PICKER_PRESETS).optional(),
2133
2136
  // Entry picker configuration
2134
2137
  contentTypeField: z.string().optional(),
2135
2138
  fixedContentType: z.string().optional(),
@@ -1,4 +1,4 @@
1
- import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-JGXPTEI2.mjs';
1
+ import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-R5ESWNKX.mjs';
2
2
  import * as React from 'react';
3
3
 
4
4
  var EMPTY_STATE = EMPTY_COMMERCE_CART_STATE;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { ChevronLeft, ChevronRight } from './chunk-JGXPTEI2.mjs';
2
+ import { ChevronLeft, ChevronRight } from './chunk-R5ESWNKX.mjs';
3
3
  import { clsx_default } from './chunk-AUJ5DBZJ.mjs';
4
4
  import React, { useRef, useState, useCallback, useEffect } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { assertNever11 } from './chunk-JGXPTEI2.mjs';
2
+ import { assertNever11 } from './chunk-R5ESWNKX.mjs';
3
3
  import { useReducer, useRef, useCallback, useEffect } from 'react';
4
4
 
5
5
  // ../blocks/src/system/runtime/hooks/usePolling.state.ts
@@ -1,13 +1,13 @@
1
1
  "use client";
2
- import { addPassToCommerceCart, useCommerceCart } from './chunk-CWGTG37I.mjs';
3
- import { CarouselNodeClient } from './chunk-75OUS5MT.mjs';
2
+ import { addPassToCommerceCart, useCommerceCart } from './chunk-TYONZMST.mjs';
3
+ import { CarouselNodeClient } from './chunk-UDS3NTWA.mjs';
4
4
  import { isRecord } from './chunk-I2MMZO53.mjs';
5
5
  import { useDiscountCodeUi } from './chunk-ZFHRN6W2.mjs';
6
- import { createBodyThemePortalRoot, consumeSearchParams, scrollToBlock, TerminalPanel, StateIcon, CheckIcon, CrossIcon, ActionRow, DiscountCodeDisclosure, consumeSearchParam, buildCheckoutReturnUrls } from './chunk-UVQEJJTN.mjs';
6
+ import { createBodyThemePortalRoot, consumeSearchParams, scrollToBlock, TerminalPanel, StateIcon, CheckIcon, CrossIcon, ActionRow, DiscountCodeDisclosure, consumeSearchParam, buildCheckoutReturnUrls } from './chunk-CCNTDRCF.mjs';
7
7
  import { ModalShell, resolveDedicatedCheckoutPath } from './chunk-3PEDD5KJ.mjs';
8
8
  import { useBlockApi, FeedbackMessage, BlockApiProvider } from './chunk-UDNSI5PY.mjs';
9
9
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
10
- import { themeButtonClassName, formatCommercePrice, formatInterval, getShopDisplayForItems, deriveCommerceCheckoutState, buildProductDetailDisplay, productItemKey, buildProductCartItem, buildProductCardDisplay, assertNever11, reportWorkflowError, clearWorkflowFeedback } from './chunk-JGXPTEI2.mjs';
10
+ import { themeButtonClassName, formatCommercePrice, formatInterval, getShopDisplayForItems, deriveCommerceCheckoutState, buildProductDetailDisplay, productItemKey, buildProductCartItem, buildProductCardDisplay, assertNever11, reportWorkflowError, clearWorkflowFeedback } from './chunk-R5ESWNKX.mjs';
11
11
  import { assertNever, ok, err, getCurrentResolveImageUrlContext, resolveImageUrlWithContext, ImagePresets } from './chunk-AUJ5DBZJ.mjs';
12
12
  import * as React3 from 'react';
13
13
  import React3__default, { useState, useRef, useCallback, useEffect } from 'react';