@riverbankcms/sdk 0.125.0 → 0.127.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 (177) hide show
  1. package/README.md +3 -1
  2. package/dist/{PreviewEditorSidebar-BezDOtQ7.mjs → PreviewEditorSidebar-BXtfF7tp.mjs} +122 -301
  3. package/dist/{PreviewEditorUI-CgSqmfo2.mjs → PreviewEditorUI-Dou73Q0K.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BH-3-jSj.mjs → PreviewQueryProvider-DgFDIwvK.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-Co3AHfj0.mjs → SdkPreviewModeRuntime-B0HPXr-l.mjs} +141 -63
  6. package/dist/{SiteChromeCustomizeContext-BHF-KANn.mjs → SiteChromeCustomizeContext-DZiDBAYu.mjs} +5330 -5841
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1552 -202
  8. package/dist/_dts/api/src/common/envelope.d.ts +1 -1
  9. package/dist/_dts/api/src/contentRuntime.d.ts +1 -7
  10. package/dist/_dts/api/src/endpoints.d.ts +0 -7
  11. package/dist/_dts/api/src/sdk-event-upsert.d.ts +42 -0
  12. package/dist/_dts/api/src/sdkContracts.d.ts +11 -9
  13. package/dist/_dts/api/src/siteOperations.d.ts +18 -1
  14. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +1 -14
  15. package/dist/_dts/block-form/src/backend/store-backend.d.ts +2 -1
  16. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +1 -0
  17. package/dist/_dts/blocks/src/index.d.ts +3 -2
  18. package/dist/_dts/blocks/src/lib/media.d.ts +267 -0
  19. package/dist/_dts/blocks/src/system/constants/buttonRoles.d.ts +0 -13
  20. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.d.ts +15 -2
  21. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +4 -4
  22. package/dist/_dts/blocks/src/system/runtime/nodes/mergeResolveImageUrlContexts.d.ts +7 -0
  23. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +2 -2
  24. package/dist/_dts/content-editor/src/ui/blockValidationManifestRegistry.d.ts +17 -0
  25. package/dist/_dts/content-editor/src/ui/blockValidationView.d.ts +1 -1
  26. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +4 -0
  27. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +322 -171
  28. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +4 -0
  29. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockValidationManifests.d.ts +26 -0
  30. package/dist/_dts/editor-blocks/src/widgets/rich-text/imageInsert.d.ts +3 -3
  31. package/dist/_dts/media-editor/src/MediaEditor.d.ts +2 -2
  32. package/dist/_dts/media-editor/src/context.d.ts +1 -2
  33. package/dist/_dts/media-editor/src/index.d.ts +3 -1
  34. package/dist/_dts/media-editor/src/mediaSelection.d.ts +32 -0
  35. package/dist/_dts/media-editor/src/types.d.ts +3 -1
  36. package/dist/_dts/media-editor/src/useMediaSelection.d.ts +26 -0
  37. package/dist/_dts/preview-next/src/client/index.d.ts +2 -0
  38. package/dist/_dts/preview-next/src/client/preview/HeaderMenuControls.d.ts +12 -0
  39. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +1 -2
  40. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +13 -3
  41. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  42. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +6 -60
  43. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +3 -13
  44. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +8 -100
  45. package/dist/_dts/preview-next/src/client/preview/headerInteractionPaletteSurfaceState.d.ts +8 -0
  46. package/dist/_dts/preview-next/src/client/preview/previewThemeRoles.d.ts +15 -0
  47. package/dist/_dts/preview-next/src/client/preview/siteChromeCustomizeTypes.d.ts +54 -0
  48. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +13 -3
  49. package/dist/_dts/preview-next/src/client/preview/siteChromeNavQuickControlHistory.d.ts +3 -0
  50. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +6 -3
  51. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +1 -4
  52. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorApplyPayload.d.ts +1 -15
  53. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +11 -21
  54. package/dist/_dts/sdk/src/cli/commands/event.d.ts +2 -2
  55. package/dist/_dts/sdk/src/cli/commands/eventOccurrenceSchedule.d.ts +12 -0
  56. package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +6 -0
  57. package/dist/_dts/sdk/src/cli/commands/style.d.ts +1 -1
  58. package/dist/_dts/sdk/src/cli/content/legacyEventScheduleShapeError.d.ts +5 -0
  59. package/dist/_dts/sdk/src/cli/content/localEventSchedule.d.ts +17 -0
  60. package/dist/_dts/sdk/src/cli/content/reader.d.ts +5 -10
  61. package/dist/_dts/sdk/src/cli/migrations/events.d.ts +1 -1
  62. package/dist/_dts/sdk/src/cli/site-commands/eventScheduleCompiler.d.ts +24 -0
  63. package/dist/_dts/sdk/src/client/management/http.d.ts +1 -1
  64. package/dist/_dts/sdk/src/client/management/types.d.ts +3 -28
  65. package/dist/_dts/sdk/src/config/index.d.ts +1 -1
  66. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -20
  67. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  68. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +2 -2
  69. package/dist/_dts/sdk/src/version.d.ts +1 -1
  70. package/dist/_dts/site-commands/src/commandContract.d.ts +33 -5
  71. package/dist/_dts/site-commands/src/commandDomain.d.ts +2 -2
  72. package/dist/_dts/site-commands/src/commands.d.ts +38 -9
  73. package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +28 -1
  74. package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +4 -4
  75. package/dist/_dts/theme-core/src/buttons/effects/presets/background.d.ts +1 -1
  76. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +0 -18
  77. package/dist/_dts/theme-core/src/buttons/types.d.ts +1 -3
  78. package/dist/_dts/theme-core/src/header/containerSchema.d.ts +20 -0
  79. package/dist/_dts/theme-core/src/header/generateHeaderCss.d.ts +1 -1
  80. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +14 -0
  81. package/dist/_dts/theme-core/src/header/legacyNavLinkStyle.d.ts +3 -0
  82. package/dist/_dts/theme-core/src/header/paintTargets.d.ts +25 -0
  83. package/dist/_dts/theme-core/src/header/scrollTreatment.d.ts +11 -0
  84. package/dist/_dts/theme-core/src/header/surfaceRules.d.ts +9 -0
  85. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +15 -0
  86. package/dist/_dts/theme-core/src/palette/colors.d.ts +1 -1
  87. package/dist/_dts/theme-core/src/palette/concretePalette.d.ts +20 -0
  88. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +2 -17
  89. package/dist/_dts/theme-core/src/palette/index.d.ts +1 -6
  90. package/dist/_dts/theme-core/src/palette/schema.d.ts +39 -0
  91. package/dist/_dts/theme-core/src/schema.d.ts +105 -45
  92. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +3 -51
  93. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +4 -11
  94. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +3 -51
  95. package/dist/_dts/theme-core/src/site-styles/headerInteractionPalette.d.ts +32 -0
  96. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +19 -106
  97. package/dist/_dts/theme-core/src/site-styles/headerOpeningForeground.d.ts +22 -0
  98. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +2 -0
  99. package/dist/_dts/theme-core/src/site-styles/headerStyleParts.d.ts +4 -0
  100. package/dist/_dts/theme-core/src/site-styles/index.d.ts +3 -0
  101. package/dist/_dts/theme-core/src/site-styles/lookOptionGroups.d.ts +24 -0
  102. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +1 -2
  103. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +4 -22
  104. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorOptions.d.ts +21 -0
  105. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +5 -7
  106. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -6
  107. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +4 -1
  108. package/dist/cli/index.mjs +1583 -1601
  109. package/dist/cli/init-docs/content/cli-reference.md +6 -3
  110. package/dist/cli/init-docs/content/content-management.md +24 -13
  111. package/dist/client/{DiscountCodeDisclosure-CyPpekBp.mjs → DiscountCodeDisclosure-BDFRp8Y7.mjs} +1 -1
  112. package/dist/client/{EventCombined.client-zywit-60.mjs → EventCombined.client-DJgF1_lf.mjs} +2 -2
  113. package/dist/client/{EventListing.client-J2nLhkKT.mjs → EventListing.client-CnWGNjOr.mjs} +2 -2
  114. package/dist/client/{LeafletStaticMap-CSubXWt6.mjs → LeafletStaticMap-BISs9Bl7.mjs} +1 -1
  115. package/dist/client/{MagicLinkForm-DDLIfiq9.mjs → MagicLinkForm-b5E_HoG9.mjs} +1 -1
  116. package/dist/client/{StepIndicator-DE8EvHIp.mjs → StepIndicator-D8gVYkK-.mjs} +2 -2
  117. package/dist/client/{accordion-Ct5T5NiA.mjs → accordion-DFDajgDz.mjs} +1 -1
  118. package/dist/client/{bookingForm-DMxtLPxw.mjs → bookingForm-Bdqj9-52.mjs} +5 -6
  119. package/dist/client/bookings.mjs +315 -46
  120. package/dist/client/{carousel--FMqgvob.mjs → carousel-Cvqf-kN8.mjs} +1 -1
  121. package/dist/client/{cart-BKX1bWiU.mjs → cart-CuH2TJXP.mjs} +3 -3
  122. package/dist/client/{checkout-B_jxi4WW.mjs → checkout-CMNPpejZ.mjs} +3 -3
  123. package/dist/client/client.mjs +1381 -1427
  124. package/dist/client/{courseRegistration-DH4MlkRD.mjs → courseRegistration-DTEYWL6Z.mjs} +6 -7
  125. package/dist/client/{eventCalendar-BQILwAcL.mjs → eventCalendar-BW-XoxZ0.mjs} +4 -4
  126. package/dist/client/{eventCombined-DFFW_Vmo.mjs → eventCombined-Bpn7s0y9.mjs} +2 -2
  127. package/dist/client/{eventDetails-B045CTSJ.mjs → eventDetails-D2uUSTMH.mjs} +3 -3
  128. package/dist/client/{eventListing-BDMYNVzS.mjs → eventListing-CVr1c094.mjs} +2 -2
  129. package/dist/client/{eventRegistration-CQ2-BSnB.mjs → eventRegistration-Dv4AvkMw.mjs} +30 -22
  130. package/dist/client/{form-DJKuyZgN.mjs → form-DxdKf9fs.mjs} +1 -1
  131. package/dist/client/{headerSection-DeTjfiDo.mjs → headerSection-BaXI5Sro.mjs} +2 -2
  132. package/dist/client/hooks.mjs +851 -976
  133. package/dist/client/{locationMap-i2wDA8gB.mjs → locationMap-BEtW2fKz.mjs} +2 -2
  134. package/dist/client/{newsletterForm-DKiueauk.mjs → newsletterForm-BKKs0S4R.mjs} +1 -1
  135. package/dist/client/{pricing-C01J3Epx.mjs → pricing-ClkqcElA.mjs} +1 -1
  136. package/dist/client/{productDetail-Dfc1sZaX.mjs → productDetail-H-ru8dyy.mjs} +3 -3
  137. package/dist/client/{productList-BXbvXWTF.mjs → productList-Buyi5c0C.mjs} +3 -3
  138. package/dist/client/{propsDecoder-CIR5DQ1l.mjs → propsDecoder-BF7i6Ijg.mjs} +293 -65
  139. package/dist/client/rendering/client.mjs +1145 -1190
  140. package/dist/client/rendering/islands.mjs +18 -18
  141. package/dist/client/rendering.mjs +1257 -1298
  142. package/dist/client/{useDiscountCodeUi-Bcyh4508.mjs → scrollToBlock-D_7t8yWb.mjs} +18 -2
  143. package/dist/client/{shop-BbNwPKM-.mjs → shop-CF7SZQNX.mjs} +5 -6
  144. package/dist/client/{shop-commerce-XO-XMFEt.mjs → shop-commerce-DA7_Rq5p.mjs} +4 -4
  145. package/dist/client/{shop-commerce-store-Byh6OUGK.mjs → shop-commerce-store-BmLqW7Gh.mjs} +1 -1
  146. package/dist/client/{shopShared-Bbq39mwr.mjs → shopShared-WL-E1znM.mjs} +2 -2
  147. package/dist/client/{useEventFilters-C8OOJ3el.mjs → useEventFilters-rc8VLeLV.mjs} +2 -2
  148. package/dist/client/{usePolling-CyJVo9kF.mjs → usePolling-1ncrfd4S.mjs} +2 -2
  149. package/dist/preview-next/before-render.mjs +0 -7
  150. package/dist/preview-next/client/runtime.mjs +4 -4
  151. package/dist/preview-next/middleware.mjs +0 -7
  152. package/dist/{previewAuthStore-CJX21dGi.mjs → previewAuthStore-Dev9CdG9.mjs} +0 -7
  153. package/dist/{sdk-runtime-BGhyuE-E.mjs → sdk-runtime-BnrCCFJq.mjs} +2 -2
  154. package/dist/{separator-BFs-Kmv5.mjs → separator-CFvBx2yl.mjs} +1 -1
  155. package/dist/server/components.mjs +1389 -1489
  156. package/dist/server/config-validation.mjs +851 -976
  157. package/dist/server/config.mjs +851 -976
  158. package/dist/server/data.mjs +851 -976
  159. package/dist/server/index.mjs +1 -8
  160. package/dist/server/next.mjs +1393 -1500
  161. package/dist/server/page-converter.mjs +851 -976
  162. package/dist/server/prebuild.mjs +1 -1
  163. package/dist/server/rendering/server.mjs +1346 -1446
  164. package/dist/server/rendering.mjs +1390 -1490
  165. package/dist/server/routing.mjs +939 -1041
  166. package/dist/server/server.mjs +852 -984
  167. package/dist/server/theme-bridge.mjs +322 -279
  168. package/dist/server/theme.mjs +277 -33
  169. package/package.json +1 -1
  170. package/dist/_dts/editor-blocks/src/widgets/rich-text/ensureRichTextImageAssetIdentifier.d.ts +0 -8
  171. package/dist/_dts/theme-core/src/palette/editorState.d.ts +0 -75
  172. package/dist/_dts/theme-core/src/palette/libraryModel.d.ts +0 -64
  173. package/dist/_dts/theme-core/src/palette/persistenceReadSource.d.ts +0 -81
  174. package/dist/_dts/theme-core/src/palette/resolveSelection.d.ts +0 -75
  175. package/dist/_dts/theme-core/src/palette/selection.d.ts +0 -74
  176. package/dist/_dts/theme-core/src/palette/sitePalettePersistence.d.ts +0 -34
  177. package/dist/client/scrollToBlock-C86BYkyV.mjs +0 -17
@@ -953,9 +953,12 @@ calendar date is never accepted as an identity.
953
953
  Cancellation preserves registrations and is idempotent. Deletion requires
954
954
  zero registrations and confirmation (`--yes` for remote or JSON use).
955
955
 
956
- Occurrence collections are deliberately imperative. `pull events` and
957
- `push events` only manage the event-series schedule and never reconcile,
958
- create, or delete individual occurrence rows.
956
+ `pull events` writes the complete non-cancelled occurrence schedule into each
957
+ portable event file. `push events` creates those rows for a new series and
958
+ accepts an exact replay for an existing series. It deliberately rejects
959
+ existing-series additions, removals, or retiming; use the imperative occurrence
960
+ commands for those operational changes. Cancelled occurrence tombstones remain
961
+ in the CMS and are omitted from portable authored content.
959
962
 
960
963
  ### verify
961
964
 
@@ -630,15 +630,23 @@ Footer links are managed via the site's footer navigation menu (see `content/nav
630
630
  "path": "/events/yoga-class",
631
631
  "status": "active",
632
632
  "visibility": "public",
633
+ "preset": "class",
634
+ "bookingScope": "single_occurrence",
635
+ "occurrences": [
636
+ {
637
+ "startsAt": "2026-01-05T15:00:00.000Z",
638
+ "endsAt": "2026-01-05T16:00:00.000Z",
639
+ "timeZone": "America/Los_Angeles"
640
+ },
641
+ {
642
+ "startsAt": "2026-01-12T15:00:00.000Z",
643
+ "endsAt": "2026-01-12T16:00:00.000Z",
644
+ "timeZone": "America/Los_Angeles"
645
+ }
646
+ ],
633
647
  "venueRef": "main-hall",
634
648
  "categoryRef": "workshop",
635
649
  "capacity": 30,
636
- "schedule": {
637
- "recurrenceRule": "FREQ=WEEKLY;BYDAY=MO",
638
- "startDate": "2026-01-05",
639
- "defaultStartTime": "07:00:00",
640
- "durationMinutes": 60
641
- },
642
650
  "pricing": {
643
651
  "requiresPayment": true,
644
652
  "priceAmount": 2500,
@@ -674,8 +682,10 @@ Footer links are managed via the site's footer navigation menu (see `content/nav
674
682
  **Event field notes:**
675
683
 
676
684
  - `priceAmount` is in cents (2500 = $25.00)
677
- - `recurrenceRule` uses iCal RRULE format
678
- - `startDate` is `YYYY-MM-DD`; for one-off events use `recurrenceRule: null` plus `startDate`
685
+ - `preset` controls the event's presentation defaults; `bookingScope` controls
686
+ whether a registration selects one occurrence or the complete series.
687
+ - `occurrences` is the complete authored schedule. Instants use canonical UTC
688
+ ISO datetimes and every item carries the event's IANA timezone.
679
689
  - `venueRef` and `categoryRef` reference slugs/identifiers from venues and event-categories
680
690
  - `status`: "draft", "active", "completed", "cancelled", or "archived"
681
691
  - `visibility`: "private", "public", or "unlisted"
@@ -688,11 +698,12 @@ Footer links are managed via the site's footer navigation menu (see `content/nav
688
698
 
689
699
  See `cli-reference.md` for event-related CLI commands: `riverbankcms push/pull venues|event-categories|events`.
690
700
 
691
- Individual bookable dates are managed separately with
692
- `riverbankcms event occurrence list|add|update|cancel|delete`. They are not
693
- written to `content/events/*.json`, and event pull/push never reconciles the
694
- occurrence collection. See the `event` section in `cli-reference.md` for
695
- timezone, DST, recurrence, cancellation, and deletion rules.
701
+ `riverbankcms pull events` writes every non-cancelled occurrence to the event
702
+ file. Pushing a new event creates that explicit schedule, and pushing an
703
+ unchanged existing schedule is safe. Existing-series additions, removals, or
704
+ retiming remain an explicit capability gap; use `riverbankcms event occurrence
705
+ list|add|update|cancel|delete` for those operational changes. Cancelled rows are
706
+ operational tombstones and are not recreated from portable content.
696
707
 
697
708
  ---
698
709
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { X as themeButtonClassName } from "./propsDecoder-CIR5DQ1l.mjs";
2
+ import { X as themeButtonClassName } from "./propsDecoder-BF7i6Ijg.mjs";
3
3
  import { useId } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region ../blocks/src/system/runtime/api/types/discounts.ts
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { t as clsx } from "./clsx-DgIEfj3H.mjs";
3
- import { A as formatDate, E as getEventRuntimeFiltersKey, F as formatEventTeacherLine, I as formatTime, L as getCardOrientation, N as formatEventPrice, R as getContainerClass, T as buildEventRuntimeFilters, U as getEventAvailability, V as resolveEventLinkProps, X as themeButtonClassName, yt as assertNever, z as groupEventsByDate } from "./propsDecoder-CIR5DQ1l.mjs";
4
- import { a as EventCardClient, i as EventPaginatedListView, n as useEventPagination, o as EventFilters, r as toError, t as useEventFilters } from "./useEventFilters-C8OOJ3el.mjs";
3
+ import { A as formatDate, E as getEventRuntimeFiltersKey, F as formatEventTeacherLine, I as formatTime, L as getCardOrientation, N as formatEventPrice, R as getContainerClass, T as buildEventRuntimeFilters, U as getEventAvailability, V as resolveEventLinkProps, X as themeButtonClassName, yt as assertNever, z as groupEventsByDate } from "./propsDecoder-BF7i6Ijg.mjs";
4
+ import { a as EventCardClient, i as EventPaginatedListView, n as useEventPagination, o as EventFilters, r as toError, t as useEventFilters } from "./useEventFilters-rc8VLeLV.mjs";
5
5
  import { n as useBlockApi } from "./context-CJz1Vlsz.mjs";
6
6
  import { t as createBodyThemePortalRoot } from "./themePortalRoot-AGs4cE7t.mjs";
7
7
  import { t as ModalShell } from "./ModalShell-CqkBvBIC.mjs";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { T as buildEventRuntimeFilters } from "./propsDecoder-CIR5DQ1l.mjs";
3
- import { i as EventPaginatedListView, n as useEventPagination, o as EventFilters, t as useEventFilters } from "./useEventFilters-C8OOJ3el.mjs";
2
+ import { T as buildEventRuntimeFilters } from "./propsDecoder-BF7i6Ijg.mjs";
3
+ import { i as EventPaginatedListView, n as useEventPagination, o as EventFilters, t as useEventFilters } from "./useEventFilters-rc8VLeLV.mjs";
4
4
  import { useId, useMemo } from "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/events/EventListing.client.tsx
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { J as isRecord } from "./propsDecoder-CIR5DQ1l.mjs";
2
+ import { J as isRecord } from "./propsDecoder-BF7i6Ijg.mjs";
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region ../blocks/src/system/runtime/nodes/shared/LeafletStaticMap.tsx
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { X as themeButtonClassName, yt as assertNever } from "./propsDecoder-CIR5DQ1l.mjs";
2
+ import { X as themeButtonClassName, yt as assertNever } from "./propsDecoder-BF7i6Ijg.mjs";
3
3
  import { n as useBlockApi } from "./context-CJz1Vlsz.mjs";
4
4
  import { useEffect, useReducer, useState, useSyncExternalStore } from "react";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  import { t as clsx } from "./clsx-DgIEfj3H.mjs";
2
- import { Wt as formatCurrencyAmount } from "./propsDecoder-CIR5DQ1l.mjs";
3
- import { i as CheckIcon } from "./useDiscountCodeUi-Bcyh4508.mjs";
2
+ import { Wt as formatCurrencyAmount } from "./propsDecoder-BF7i6Ijg.mjs";
3
+ import { a as CheckIcon } from "./scrollToBlock-D_7t8yWb.mjs";
4
4
  import "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/shared/utils/formatting.ts
@@ -1,4 +1,4 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-CIR5DQ1l.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
2
2
  //#region src/rendering/islands/enhancers/accordion.ts
3
3
  const decode = defineIslandPropsDecoder("accordion");
4
4
  function parseDefaultValues(value) {
@@ -1,16 +1,15 @@
1
1
  "use client";
2
2
  import { d as unsafeAsAppointmentResourceId, f as unsafeAsAppointmentServiceId, g as unsafeAsPassId, m as unsafeAsFormId, p as unsafeAsCustomerPassId } from "./colorStyles-BWpj_h4C.mjs";
3
- import { n as buildBookingPaymentSelectionViewModel, t as usePolling } from "./usePolling-CyJVo9kF.mjs";
4
- import { Ct as okWith, Et as addLocalScheduleDays, Nt as parseBookingLocalDate, Pt as resolveBookingTimeZoneId, Tt as reportWorkflowSuccess, Wt as formatCurrencyAmount, X as themeButtonClassName, _t as toSelectedCollectionOptionKind, at as formatBookingCentsAsCurrencyInput, bt as clearWorkflowFeedback, ct as getBookingServiceSlidingScale, dt as parseBookingCurrencyInputToCents, ft as prepareBookingSubmission, gt as resolveDefaultBookingServiceId, ht as resolveBookingSiteId, it as deriveBookingFormViewState, jt as formatLocalScheduleDate, kt as formatBookingInstant, lt as getBookingSuccessMessage, mt as resolveBookingPaymentStep, ot as formatBookingSubmissionPreparationError, pt as resolveAppointmentCheckoutVerificationState, rt as logger, st as getBookingRedirectStateFromLocation, t as defineIslandPropsDecoder, ut as isBookingServiceSlidingAmountInRange, vt as BOOKING_FORM_DATA_RESERVED_KEYS, wt as reportWorkflowError, xt as err, yt as assertNever } from "./propsDecoder-CIR5DQ1l.mjs";
3
+ import { n as buildBookingPaymentSelectionViewModel, t as usePolling } from "./usePolling-1ncrfd4S.mjs";
4
+ import { Ct as okWith, Et as addLocalScheduleDays, Nt as parseBookingLocalDate, Pt as resolveBookingTimeZoneId, Tt as reportWorkflowSuccess, Wt as formatCurrencyAmount, X as themeButtonClassName, _t as toSelectedCollectionOptionKind, at as formatBookingCentsAsCurrencyInput, bt as clearWorkflowFeedback, ct as getBookingServiceSlidingScale, dt as parseBookingCurrencyInputToCents, ft as prepareBookingSubmission, gt as resolveDefaultBookingServiceId, ht as resolveBookingSiteId, it as deriveBookingFormViewState, jt as formatLocalScheduleDate, kt as formatBookingInstant, lt as getBookingSuccessMessage, mt as resolveBookingPaymentStep, ot as formatBookingSubmissionPreparationError, pt as resolveAppointmentCheckoutVerificationState, rt as logger, st as getBookingRedirectStateFromLocation, t as defineIslandPropsDecoder, ut as isBookingServiceSlidingAmountInRange, vt as BOOKING_FORM_DATA_RESERVED_KEYS, wt as reportWorkflowError, xt as err, yt as assertNever } from "./propsDecoder-BF7i6Ijg.mjs";
5
5
  import { n as useBlockApi, t as BlockApiProvider } from "./context-CJz1Vlsz.mjs";
6
6
  import { n as isSpamProtectionEnabled, r as AltchaWidget, t as getChallengeUrl } from "./src-B833rYRr.mjs";
7
- import { i as CheckIcon, n as TerminalPanel, r as StateIcon, t as useDiscountCodeUi } from "./useDiscountCodeUi-Bcyh4508.mjs";
8
- import { t as DiscountCodeDisclosure } from "./DiscountCodeDisclosure-CyPpekBp.mjs";
9
- import { n as SpinnerNode, t as StepIndicator } from "./StepIndicator-DE8EvHIp.mjs";
7
+ import { a as CheckIcon, i as StateIcon, n as useDiscountCodeUi, r as TerminalPanel, t as scrollToBlock } from "./scrollToBlock-D_7t8yWb.mjs";
8
+ import { t as DiscountCodeDisclosure } from "./DiscountCodeDisclosure-BDFRp8Y7.mjs";
9
+ import { n as SpinnerNode, t as StepIndicator } from "./StepIndicator-D8gVYkK-.mjs";
10
10
  import { t as FeedbackMessage } from "./FeedbackMessage-ByMrs3cr.mjs";
11
11
  import { n as getFieldValidationControlProps, t as FieldValidationMessage } from "./FieldValidationMessage-AYanWFb-.mjs";
12
12
  import { t as buildCheckoutReturnUrls } from "./checkoutUrls-Ct8Mxna3.mjs";
13
- import { t as scrollToBlock } from "./scrollToBlock-C86BYkyV.mjs";
14
13
  import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
15
14
  import { t as buildRouteIslandApiConfig } from "./routeIslandApiConfig-UNsfPcYq.mjs";
16
15
  import React, { useCallback, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from "react";
@@ -7416,7 +7416,7 @@ const PALETTE_TOKEN_NAMES = [
7416
7416
  "text",
7417
7417
  "border"
7418
7418
  ];
7419
- z$1.enum(PALETTE_TOKEN_NAMES);
7419
+ const paletteTokenNameSchema = z$1.enum(PALETTE_TOKEN_NAMES);
7420
7420
  const themeColorBaseTokenNames = [
7421
7421
  ...PALETTE_TOKEN_NAMES,
7422
7422
  ...blockColorTokenNames,
@@ -7475,8 +7475,6 @@ const VARIANT_ROLES = [
7475
7475
  "secondary",
7476
7476
  "outline",
7477
7477
  "ghost",
7478
- "link",
7479
- "tertiary",
7480
7478
  "accent"
7481
7479
  ];
7482
7480
  /**
@@ -7485,7 +7483,7 @@ const VARIANT_ROLES = [
7485
7483
  * IDs become class selectors, so keep the contract deliberately narrower than
7486
7484
  * an arbitrary string and shared with every authoring/runtime boundary.
7487
7485
  */
7488
- const buttonVariantIdSchema = z$1.string().min(1).max(50).regex(/^[a-z0-9-]+$/, "Button variant IDs may contain lowercase letters, numbers, and hyphens only");
7486
+ const buttonVariantIdSchema = z$1.string().min(1).max(50).regex(/^[a-z0-9-]+$/, "Button variant IDs may contain lowercase letters, numbers, and hyphens only").refine((value) => value !== "link" && value !== "tertiary", { message: "Retired button role IDs are not valid variant IDs" });
7489
7487
  function parseOpaqueButtonColourToken(value) {
7490
7488
  const token = parseThemeColorToken(value);
7491
7489
  if (token === null) return null;
@@ -7897,6 +7895,172 @@ const mediaSchema$1 = z.object({
7897
7895
  transform: transformSchema$1.optional()
7898
7896
  });
7899
7897
  //#endregion
7898
+ //#region ../theme-core/src/palette/colors.ts
7899
+ const HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
7900
+ const NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
7901
+ const THEME_PALETTE_COLOR_ORDER = [
7902
+ "primary",
7903
+ "secondary",
7904
+ "accent",
7905
+ "success",
7906
+ "warning",
7907
+ "destructive",
7908
+ "background",
7909
+ "surface",
7910
+ "surfaceAlt",
7911
+ "muted",
7912
+ "text",
7913
+ "primaryForeground",
7914
+ "border"
7915
+ ];
7916
+ const hexColorSchema = z$1.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
7917
+ const paletteModeSchema = z$1.enum(["light", "dark"]);
7918
+ const PALETTE_VALUE_KEY_PREFIX = "palette-value:v1|";
7919
+ z$1.string().regex(/^[0-9a-f]{64}$/, "Palette hash must be a lowercase SHA-256 value").transform((value) => value);
7920
+ const paletteColorsSchema = z$1.object({
7921
+ primary: hexColorSchema,
7922
+ primaryForeground: hexColorSchema,
7923
+ secondary: hexColorSchema,
7924
+ accent: hexColorSchema,
7925
+ success: hexColorSchema,
7926
+ warning: hexColorSchema,
7927
+ destructive: hexColorSchema,
7928
+ background: hexColorSchema,
7929
+ surface: hexColorSchema,
7930
+ surfaceAlt: hexColorSchema,
7931
+ muted: hexColorSchema,
7932
+ text: hexColorSchema,
7933
+ border: hexColorSchema
7934
+ }).strict().transform((value) => value);
7935
+ function normalizePaletteHex(value) {
7936
+ if (!NORMALIZABLE_HEX_REGEX.test(value)) return null;
7937
+ const normalized = value.toLowerCase();
7938
+ if (normalized.length === 7) return normalized;
7939
+ const triplet = normalized.slice(1);
7940
+ const red = triplet.charAt(0);
7941
+ const green = triplet.charAt(1);
7942
+ const blue = triplet.charAt(2);
7943
+ return `#${red}${red}${green}${green}${blue}${blue}`;
7944
+ }
7945
+ function paletteColorsFromEntries(entries) {
7946
+ const values = {};
7947
+ for (const entry of entries) {
7948
+ const parsedRole = paletteTokenNameSchema.safeParse(entry.name);
7949
+ if (!parsedRole.success) return {
7950
+ ok: false,
7951
+ error: {
7952
+ kind: "unknown-role",
7953
+ role: entry.name
7954
+ }
7955
+ };
7956
+ const role = parsedRole.data;
7957
+ if (values[role] !== void 0) return {
7958
+ ok: false,
7959
+ error: {
7960
+ kind: "duplicate-role",
7961
+ role
7962
+ }
7963
+ };
7964
+ const hex = normalizePaletteHex(entry.hex);
7965
+ if (!hex) return {
7966
+ ok: false,
7967
+ error: {
7968
+ kind: "invalid-color",
7969
+ role,
7970
+ value: entry.hex
7971
+ }
7972
+ };
7973
+ values[role] = hex;
7974
+ }
7975
+ const missing = PALETTE_TOKEN_NAMES.filter((role) => values[role] === void 0);
7976
+ if (missing.length > 0) return {
7977
+ ok: false,
7978
+ error: {
7979
+ kind: "missing-roles",
7980
+ roles: missing
7981
+ }
7982
+ };
7983
+ return {
7984
+ ok: true,
7985
+ colors: paletteColorsSchema.parse(values)
7986
+ };
7987
+ }
7988
+ function paletteColorEntries(colors) {
7989
+ return THEME_PALETTE_COLOR_ORDER.map((name) => ({
7990
+ name,
7991
+ hex: colors[name]
7992
+ }));
7993
+ }
7994
+ function paletteColorFingerprint(colors) {
7995
+ return PALETTE_TOKEN_NAMES.map((name) => `${name}:${colors[name]}`).join("|");
7996
+ }
7997
+ function canonicalPaletteHashInput(colors, mode) {
7998
+ return `${mode}|${paletteColorFingerprint(colors)}`;
7999
+ }
8000
+ /**
8001
+ * Stable curated-catalogue identity. Do not reorder roles: the order comes
8002
+ * from PALETTE_TOKEN_NAMES through canonicalPaletteHashInput.
8003
+ */
8004
+ function paletteValueKey(colors, mode) {
8005
+ return `${PALETTE_VALUE_KEY_PREFIX}${canonicalPaletteHashInput(colors, mode)}`;
8006
+ }
8007
+ /** Parses only the exact v1 canonical form emitted by paletteValueKey. */
8008
+ function parsePaletteValueKey(value) {
8009
+ if (typeof value !== "string" || !value.startsWith(PALETTE_VALUE_KEY_PREFIX)) return null;
8010
+ const [rawMode, ...rawRoles] = value.slice(17).split("|");
8011
+ const mode = paletteModeSchema.safeParse(rawMode);
8012
+ if (!mode.success || rawRoles.length !== PALETTE_TOKEN_NAMES.length) return null;
8013
+ const colors = paletteColorsFromEntries(rawRoles.map((roleValue) => {
8014
+ const separator = roleValue.indexOf(":");
8015
+ return separator === -1 ? {
8016
+ name: "",
8017
+ hex: ""
8018
+ } : {
8019
+ name: roleValue.slice(0, separator),
8020
+ hex: roleValue.slice(separator + 1)
8021
+ };
8022
+ }));
8023
+ if (!colors.ok || paletteValueKey(colors.colors, mode.data) !== value) return null;
8024
+ return value;
8025
+ }
8026
+ z$1.string().transform((value, ctx) => {
8027
+ const parsed = parsePaletteValueKey(value);
8028
+ if (parsed) return parsed;
8029
+ ctx.addIssue({
8030
+ code: "custom",
8031
+ message: "Invalid canonical palette value key"
8032
+ });
8033
+ return z$1.NEVER;
8034
+ });
8035
+ //#endregion
8036
+ //#region ../theme-core/src/palette/schema.ts
8037
+ const colourHexString = z$1.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
8038
+ const paletteColorSchema = z$1.object({
8039
+ name: z$1.string().min(1),
8040
+ hex: colourHexString
8041
+ });
8042
+ const paletteMetaSchema = z$1.object({ mode: z$1.enum(["light", "dark"]) });
8043
+ const paletteSchema = z$1.object({
8044
+ colors: z$1.array(paletteColorSchema),
8045
+ meta: paletteMetaSchema
8046
+ }).transform((palette, ctx) => {
8047
+ const colors = paletteColorsFromEntries(palette.colors);
8048
+ if (!colors.ok) {
8049
+ ctx.addIssue({
8050
+ code: "custom",
8051
+ message: `Invalid complete palette: ${colors.error.kind}`
8052
+ });
8053
+ return z$1.NEVER;
8054
+ }
8055
+ return {
8056
+ colors: paletteColorEntries(colors.colors).map(({ name, hex }) => ({
8057
+ name: String(name),
8058
+ hex: String(hex)
8059
+ })),
8060
+ meta: palette.meta
8061
+ };
8062
+ });
8063
+ //#endregion
7900
8064
  //#region ../theme-core/src/cards/types.ts
7901
8065
  const cardVariantRoleValues = ["default", "alternative"];
7902
8066
  const boxlessCardVariantValue = "none";
@@ -8827,6 +8991,60 @@ const siteChromeBackgroundOverrideOwner = "site-chrome-editor";
8827
8991
  * palette context and happens in `parseThemeColorReference`.
8828
8992
  */
8829
8993
  const tokenOrCssColorValueSchema = z$1.string();
8994
+ const BREAKPOINT_LG = 1024;
8995
+ const BREAKPOINT_XL = 1280;
8996
+ const BREAKPOINT_LG_DOWN = BREAKPOINT_LG - 1;
8997
+ function mqUp(px) {
8998
+ return `(min-width: ${px}px)`;
8999
+ }
9000
+ function mqDown(px) {
9001
+ return `(max-width: ${px}px)`;
9002
+ }
9003
+ function mqBetween(minPx, maxPx) {
9004
+ return `${mqUp(minPx)} and ${mqDown(maxPx)}`;
9005
+ }
9006
+ mqUp(640);
9007
+ mqUp(768);
9008
+ mqUp(BREAKPOINT_LG);
9009
+ mqUp(BREAKPOINT_XL);
9010
+ mqDown(639);
9011
+ mqDown(767);
9012
+ mqDown(BREAKPOINT_LG_DOWN);
9013
+ mqBetween(640, BREAKPOINT_LG_DOWN);
9014
+ mqDown(640);
9015
+ mqDown(768);
9016
+ //#endregion
9017
+ //#region ../theme-core/src/header/scrollTreatment.ts
9018
+ const headerScrollTreatmentSchema = z$1.discriminatedUnion("kind", [z$1.object({
9019
+ kind: z$1.literal("contrast-glass"),
9020
+ backgroundTone: z$1.enum(["light", "dark"])
9021
+ })]).optional();
9022
+ //#endregion
9023
+ //#region ../theme-core/src/header/containerSchema.ts
9024
+ const headerContainerSchema = z$1.object({
9025
+ rounded: z$1.enum([
9026
+ "none",
9027
+ "sm",
9028
+ "md",
9029
+ "lg",
9030
+ "xl",
9031
+ "2xl"
9032
+ ]).default("xl"),
9033
+ border: z$1.boolean().default(true),
9034
+ shadow: z$1.boolean().default(true),
9035
+ padding: z$1.enum([
9036
+ "sm",
9037
+ "md",
9038
+ "lg"
9039
+ ]).default("md"),
9040
+ tint: z$1.string().nullable().optional(),
9041
+ opacity: z$1.number().min(0).max(1).default(.12)
9042
+ }).optional();
9043
+ const headerInteractionPaletteSchema = z$1.enum([
9044
+ "primary",
9045
+ "secondary",
9046
+ "accent"
9047
+ ]);
8830
9048
  //#endregion
8831
9049
  //#region ../theme-core/src/schema.ts
8832
9050
  const axesSchema = z$1.object({
@@ -8857,16 +9075,6 @@ const axesSchema = z$1.object({
8857
9075
  "expressive"
8858
9076
  ])
8859
9077
  });
8860
- const colourHexString = z$1.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
8861
- const paletteColorSchema = z$1.object({
8862
- name: z$1.string().min(1),
8863
- hex: colourHexString
8864
- });
8865
- const paletteMetaSchema = z$1.object({ mode: z$1.enum(["light", "dark"]) });
8866
- const paletteSchema = z$1.object({
8867
- colors: z$1.array(paletteColorSchema),
8868
- meta: paletteMetaSchema
8869
- });
8870
9078
  const typographyStyleSchema = z$1.object({
8871
9079
  family: z$1.string().min(1),
8872
9080
  weight: z$1.enum([
@@ -9246,25 +9454,6 @@ const navFontWeight = z$1.enum([
9246
9454
  ]);
9247
9455
  const headerMaxWidth = z$1.enum(["container", "full"]);
9248
9456
  const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
9249
- const headerContainerSchema = z$1.object({
9250
- rounded: z$1.enum([
9251
- "none",
9252
- "sm",
9253
- "md",
9254
- "lg",
9255
- "xl",
9256
- "2xl"
9257
- ]).default("xl"),
9258
- border: z$1.boolean().default(true),
9259
- shadow: z$1.boolean().default(true),
9260
- padding: z$1.enum([
9261
- "sm",
9262
- "md",
9263
- "lg"
9264
- ]).default("md"),
9265
- tint: z$1.string().nullable().optional(),
9266
- opacity: z$1.number().min(0).max(1).default(.12)
9267
- }).optional();
9268
9457
  const headerBorderSchema = componentBorderSchema.extend({ position: z$1.enum([
9269
9458
  "bottom",
9270
9459
  "top",
@@ -9391,6 +9580,7 @@ const headerSchema = z$1.object({
9391
9580
  shrinkOnScroll: z$1.boolean(),
9392
9581
  maxWidth: headerMaxWidth,
9393
9582
  barFrame: headerBarFrame.optional(),
9583
+ scrollTreatment: headerScrollTreatmentSchema,
9394
9584
  logoOverride: mediaSchema$1.nullable().optional(),
9395
9585
  background: headerBackgroundSchema.default({
9396
9586
  type: "color",
@@ -9403,6 +9593,7 @@ const headerSchema = z$1.object({
9403
9593
  navFontRole: z$1.enum(["body", "heading"]).optional(),
9404
9594
  navTypography: z$1.enum(["body", "heading"]).optional(),
9405
9595
  navTextSize: navLinkStyleSchema.shape.textSize,
9596
+ interactionPalette: headerInteractionPaletteSchema.optional(),
9406
9597
  navPlacement: z$1.enum(["end", "center"]).optional(),
9407
9598
  container: headerContainerSchema,
9408
9599
  border: headerBorderSchema,
@@ -9710,6 +9901,59 @@ function themeButtonClassName(spec) {
9710
9901
  spec.extraClassName
9711
9902
  ].filter(Boolean).join(" ");
9712
9903
  }
9904
+ shadeBackgroundEffect({
9905
+ id: "darken-background",
9906
+ name: "Darken on Hover",
9907
+ description: "Darkens the background color on hover",
9908
+ label: "Darken Amount (shade step)",
9909
+ shadeDirection: 1
9910
+ });
9911
+ shadeBackgroundEffect({
9912
+ id: "lighten-background",
9913
+ name: "Lighten on Hover",
9914
+ description: "Lightens the background color on hover",
9915
+ label: "Lighten Amount (shade step)",
9916
+ shadeDirection: -1
9917
+ });
9918
+ function shadeBackgroundEffect(config) {
9919
+ return {
9920
+ id: config.id,
9921
+ name: config.name,
9922
+ description: config.description,
9923
+ category: "background",
9924
+ pseudoElement: "none",
9925
+ applicableTo: ["button"],
9926
+ customizableOption: {
9927
+ name: "amount",
9928
+ type: "select",
9929
+ label: config.label,
9930
+ default: 100,
9931
+ options: [
9932
+ 0,
9933
+ 100,
9934
+ 200,
9935
+ 300,
9936
+ 400,
9937
+ 500,
9938
+ 600,
9939
+ 700,
9940
+ 800,
9941
+ 900
9942
+ ]
9943
+ },
9944
+ isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
9945
+ generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
9946
+ if (buttonConfig.background.type !== "solid") return "";
9947
+ const amount = (options.amount || 100) * config.shadeDirection;
9948
+ const baseToken = buttonConfig.background.colorToken ?? "primary-500";
9949
+ return `
9950
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
9951
+ background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
9952
+ }
9953
+ `;
9954
+ }
9955
+ };
9956
+ }
9713
9957
  buttonSizeNameSchema.options;
9714
9958
  //#endregion
9715
9959
  //#region ../theme-core/src/buttons/styles/domain.ts
@@ -13634,6 +13878,9 @@ function usePaymentVerificationWithDeps(config, deps) {
13634
13878
  };
13635
13879
  }
13636
13880
  //#endregion
13881
+ //#region ../blocks/src/system/runtime/nodes/event-registration/constants.ts
13882
+ const EVENT_REGISTRATION_ANCHOR_ID = "event-registration";
13883
+ //#endregion
13637
13884
  //#region ../blocks/src/system/runtime/nodes/event-registration/sessionStorage.ts
13638
13885
  const STORAGE_PREFIX = "riverbank:event-registration:";
13639
13886
  const STALE_THRESHOLD_MS = 1440 * 60 * 1e3;
@@ -13810,16 +14057,29 @@ function cleanupStaleRegistrations() {
13810
14057
  }
13811
14058
  //#endregion
13812
14059
  //#region ../blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.ts
14060
+ const eventRegistrationStripeReturnDeps = {
14061
+ usePaymentVerification,
14062
+ consumeSearchParam,
14063
+ scrollToBlock,
14064
+ cleanupStaleRegistrations,
14065
+ clearPendingRegistration,
14066
+ getPendingRegistration
14067
+ };
13813
14068
  function useEventRegistrationStripeReturn(options) {
14069
+ return useEventRegistrationStripeReturnWithDeps(options, eventRegistrationStripeReturnDeps);
14070
+ }
14071
+ function useEventRegistrationStripeReturnWithDeps(options, deps) {
13814
14072
  const { api, events, occurrenceId, pendingAttendeeId, setErrorMessage, setFormData, setPaymentSelection, setPendingAttendeeId, setRegistrationResult, setSelectedEvent, setSelectedAttendanceMode, setTicketSelections, setStep, setTicketsCount, step } = options;
13815
- const verification = usePaymentVerification(useMemo(() => step === "verifying-payment" && pendingAttendeeId ? { transactionId: pendingAttendeeId } : null, [step, pendingAttendeeId]));
14073
+ const verificationConfig = useMemo(() => step === "verifying-payment" && pendingAttendeeId ? { transactionId: pendingAttendeeId } : null, [step, pendingAttendeeId]);
14074
+ const verification = deps.usePaymentVerification(verificationConfig);
13816
14075
  useEffect(() => {
13817
- cleanupStaleRegistrations();
13818
- const registrationStatus = consumeSearchParam("registration");
13819
- if (!registrationStatus) return;
14076
+ deps.cleanupStaleRegistrations();
14077
+ const registrationStatus = deps.consumeSearchParam("registration");
14078
+ if (registrationStatus !== "cancelled" && registrationStatus !== "success") return;
14079
+ deps.scrollToBlock(EVENT_REGISTRATION_ANCHOR_ID);
13820
14080
  const siteId = api.config.siteId;
13821
14081
  if (!siteId) return;
13822
- const pending = getPendingRegistration(siteId, occurrenceId || void 0);
14082
+ const pending = deps.getPendingRegistration(siteId, occurrenceId || void 0);
13823
14083
  if (!pending) return;
13824
14084
  setFormData(pending.formData);
13825
14085
  setTicketSelections(pending.ticketSelections);
@@ -13839,7 +14099,7 @@ function useEventRegistrationStripeReturn(options) {
13839
14099
  useEffect(() => {
13840
14100
  if (verification.status === "completed") {
13841
14101
  const siteId = api.config.siteId;
13842
- if (siteId && occurrenceId) clearPendingRegistration(siteId, occurrenceId);
14102
+ if (siteId && occurrenceId) deps.clearPendingRegistration(siteId, occurrenceId);
13843
14103
  setRegistrationResult({ status: "confirmed" });
13844
14104
  setStep("success");
13845
14105
  } else if (verification.status === "failed") {
@@ -13950,13 +14210,7 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
13950
14210
  if (!result.alreadyRegistered && result.status === "confirmed" && result.pendingPayment && (method === "stripe" || method === "pass_bundle" || method === "membership_bundle")) {
13951
14211
  options.setPendingAttendeeId(result.attendeeId);
13952
14212
  options.setStep("redirecting");
13953
- const currentUrl = new URL(window.location.href);
13954
- const successParams = new URLSearchParams(currentUrl.search);
13955
- successParams.set("registration", "success");
13956
- const successUrl = `${currentUrl.origin}${currentUrl.pathname}?${successParams.toString()}${currentUrl.hash}`;
13957
- const cancelParams = new URLSearchParams(currentUrl.search);
13958
- cancelParams.set("registration", "cancelled");
13959
- const cancelUrl = `${currentUrl.origin}${currentUrl.pathname}?${cancelParams.toString()}${currentUrl.hash}`;
14213
+ const { successUrl, cancelUrl } = buildCheckoutReturnUrls("registration", EVENT_REGISTRATION_ANCHOR_ID);
13960
14214
  const checkoutType = method === "pass_bundle" ? "pass_bundle" : method === "membership_bundle" ? "membership_bundle" : "event";
13961
14215
  const checkoutResult = await options.api.createEventCheckout({
13962
14216
  attendeeId: result.attendeeId,
@@ -14221,6 +14475,12 @@ const mediaBaseSchema = z.object({
14221
14475
  poster: mediaPosterSchema.optional(),
14222
14476
  transform: transformSchema.optional()
14223
14477
  });
14478
+ /**
14479
+ * Canonical identifier carried by media values that are safe to persist.
14480
+ * Parsing trims boundary input so downstream writers cannot retain whitespace-only
14481
+ * identifiers or independently disagree about normalization.
14482
+ */
14483
+ const mediaIdentifierSchema = z.string().trim().min(1).brand();
14224
14484
  const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
14225
14485
  const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
14226
14486
  const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
@@ -14235,6 +14495,15 @@ const mediaSchema = z.discriminatedUnion("type", [
14235
14495
  spreadsheetMediaSchema,
14236
14496
  archiveMediaSchema
14237
14497
  ]);
14498
+ const persistableMediaBaseSchema = mediaBaseSchema.extend({ identifier: mediaIdentifierSchema });
14499
+ z.discriminatedUnion("type", [
14500
+ persistableMediaBaseSchema.extend({ type: z.literal("image") }),
14501
+ persistableMediaBaseSchema.extend({ type: z.literal("video") }),
14502
+ persistableMediaBaseSchema.extend({ type: z.literal("audio") }),
14503
+ persistableMediaBaseSchema.extend({ type: z.literal("document") }),
14504
+ persistableMediaBaseSchema.extend({ type: z.literal("spreadsheet") }),
14505
+ persistableMediaBaseSchema.extend({ type: z.literal("archive") })
14506
+ ]);
14238
14507
  //#endregion
14239
14508
  //#region ../blocks/src/system/manifest/richTextSchema.ts
14240
14509
  /**
@@ -1,4 +1,4 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-CIR5DQ1l.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
2
2
  import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
3
3
  import { n as normalizeCarouselProps, t as CarouselNodeClient } from "./carousel.client-CpwTUhIo.mjs";
4
4
  import "react";
@@ -1,6 +1,6 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-CIR5DQ1l.mjs";
2
- import { t as CartController } from "./shop-commerce-XO-XMFEt.mjs";
3
- import { t as mountShopBlockIsland } from "./shopShared-Bbq39mwr.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
2
+ import { t as CartController } from "./shop-commerce-DA7_Rq5p.mjs";
3
+ import { t as mountShopBlockIsland } from "./shopShared-WL-E1znM.mjs";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/cart.client.tsx