@riverbankcms/sdk 0.90.0 → 0.91.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 (90) hide show
  1. package/dist/{PreviewEditorSidebar-KVXNF3VW.mjs → PreviewEditorSidebar-3TT47WCF.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-J3JN5Z7T.mjs → PreviewEditorUI-ORCLLUNZ.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-GMCDQPZZ.mjs +8 -0
  4. package/dist/_dts/api/src/bookingConfig.d.ts +3 -0
  5. package/dist/_dts/api/src/event-listing-destination.d.ts +59 -0
  6. package/dist/_dts/api/src/index.d.ts +4 -0
  7. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +0 -1
  8. package/dist/_dts/api/src/navigation.d.ts +2 -0
  9. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +3 -1
  10. package/dist/_dts/api/src/settings/permissions.d.ts +273 -0
  11. package/dist/_dts/api/src/types.d.ts +1 -0
  12. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +60 -2
  13. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +12 -1
  14. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +9 -9
  15. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +1 -1
  16. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +17 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +5 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +24 -0
  19. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/destination.d.ts +8 -0
  20. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +3 -0
  21. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  22. package/dist/_dts/core/src/event-pricing.d.ts +12 -2
  23. package/dist/_dts/core/src/string.d.ts +12 -0
  24. package/dist/_dts/sdk/src/cli/sync/validation.d.ts +2 -2
  25. package/dist/_dts/sdk/src/public-api/contracts.d.ts +11 -1
  26. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +11 -1
  27. package/dist/_dts/sdk/src/version.d.ts +1 -1
  28. package/dist/{chunk-GSPFFUVB.mjs → chunk-AFPMCLS7.mjs} +2 -2
  29. package/dist/{chunk-RQ3XZ4SJ.mjs → chunk-GDT2QGIL.mjs} +1 -1
  30. package/dist/{chunk-PMBB6MQ7.mjs → chunk-RQUZYSES.mjs} +345 -153
  31. package/dist/{chunk-AEOYWPE4.mjs → chunk-S3YHJWEU.mjs} +7 -7
  32. package/dist/{chunk-UG7I7S7W.mjs → chunk-U5YM4AWE.mjs} +1 -1
  33. package/dist/{chunk-BOQXMCSP.mjs → chunk-ZA2S7H34.mjs} +3 -3
  34. package/dist/cli/index.mjs +363 -437
  35. package/dist/cli/init-docs/content/workflow-add-block.md +48 -0
  36. package/dist/cli/init-docs/content/workflow-custom-block.md +10 -0
  37. package/dist/client/{accordion-GXQNWQ6O.mjs → accordion-AFX37652.mjs} +2 -2
  38. package/dist/client/{bookingForm-STLUJ36H.mjs → bookingForm-32V5QCOW.mjs} +6 -6
  39. package/dist/client/bookings.mjs +1170 -571
  40. package/dist/client/{carousel-CVRN6EPP.mjs → carousel-TJGQJ7ER.mjs} +3 -3
  41. package/dist/client/{cart-IYIBA5CL.mjs → cart-JUU2JEW4.mjs} +6 -6
  42. package/dist/client/{checkout-O3BGM4GS.mjs → checkout-RD6BTFX4.mjs} +6 -6
  43. package/dist/client/{chunk-DAS5CIER.mjs → chunk-6QZIBNGV.mjs} +119 -21
  44. package/dist/client/{chunk-VFHZLZAC.mjs → chunk-6RN62XBV.mjs} +1 -1
  45. package/dist/client/{chunk-D3ETC2SU.mjs → chunk-C4LP6BPG.mjs} +1 -1
  46. package/dist/client/{chunk-NBFRJ5NB.mjs → chunk-CKXEUWWA.mjs} +2 -2
  47. package/dist/client/{chunk-4RTFGHZN.mjs → chunk-E6VIWZUG.mjs} +6 -3
  48. package/dist/client/{chunk-Z62JYS5O.mjs → chunk-FMZZHAIR.mjs} +2 -2
  49. package/dist/client/{chunk-FHU6PFPM.mjs → chunk-ISAUXU5R.mjs} +1 -1
  50. package/dist/client/{chunk-HIHOQGIP.mjs → chunk-LJCX6V7Q.mjs} +9 -9
  51. package/dist/client/{chunk-6DPXDOIL.mjs → chunk-MLBNVN4H.mjs} +99 -26
  52. package/dist/client/{chunk-7DH35FGA.mjs → chunk-PMNAV6LO.mjs} +1 -1
  53. package/dist/client/{chunk-MFPKS6QS.mjs → chunk-RMOFBBNA.mjs} +5 -5
  54. package/dist/client/{chunk-25W2EQUN.mjs → chunk-RWYFG625.mjs} +17 -8
  55. package/dist/client/client.mjs +305 -113
  56. package/dist/client/{courseRegistration-2D3ACMJR.mjs → courseRegistration-X63QAIVV.mjs} +6 -6
  57. package/dist/client/{eventCalendar-QY4UZUFF.mjs → eventCalendar-5T24GCZL.mjs} +9 -9
  58. package/dist/client/{eventCombined-RRCDKJC2.mjs → eventCombined-AZVTF22X.mjs} +9 -9
  59. package/dist/client/{eventDetails-YO335BUT.mjs → eventDetails-7GPFNLGF.mjs} +9 -9
  60. package/dist/client/{eventListing-PXA6GFQ3.mjs → eventListing-QEUMTMUM.mjs} +9 -9
  61. package/dist/client/{eventRegistration-2ZHEDDXO.mjs → eventRegistration-P2EDKCQZ.mjs} +9 -9
  62. package/dist/client/{form-ZS6KX4U2.mjs → form-NUJ7H4IN.mjs} +3 -3
  63. package/dist/client/{headerSection-QK5SLIIB.mjs → headerSection-JB7LECPL.mjs} +3 -3
  64. package/dist/client/hooks.mjs +93 -42
  65. package/dist/client/{locationMap-GFNIUD2X.mjs → locationMap-UEYWUCSW.mjs} +3 -3
  66. package/dist/client/{newsletterForm-PGLTTCUG.mjs → newsletterForm-S2YZQ2X7.mjs} +3 -3
  67. package/dist/client/{productDetail-OPBE5ZPI.mjs → productDetail-H5MADGG7.mjs} +6 -6
  68. package/dist/client/{productList-NI72Q62Z.mjs → productList-DK7YON7H.mjs} +6 -6
  69. package/dist/client/rendering/client.mjs +262 -70
  70. package/dist/client/rendering/islands.mjs +19 -19
  71. package/dist/client/rendering.mjs +306 -114
  72. package/dist/client/{shop-3ZQPEWYI.mjs → shop-6PA7RDRJ.mjs} +6 -6
  73. package/dist/client/spam-protection.mjs +10 -10
  74. package/dist/preview-next/client/runtime.mjs +5 -5
  75. package/dist/{sdk-runtime-FSHXCWDS.mjs → sdk-runtime-JP5347OB.mjs} +6 -6
  76. package/dist/server/components.mjs +149 -69
  77. package/dist/server/config-validation.mjs +85 -34
  78. package/dist/server/config.mjs +85 -34
  79. package/dist/server/data.mjs +93 -42
  80. package/dist/server/index.mjs +1 -1
  81. package/dist/server/navigation.mjs +2 -2
  82. package/dist/server/next.mjs +170 -90
  83. package/dist/server/page-converter.mjs +77 -26
  84. package/dist/server/prebuild.mjs +1 -1
  85. package/dist/server/rendering/server.mjs +161 -81
  86. package/dist/server/rendering.mjs +165 -85
  87. package/dist/server/routing.mjs +135 -58
  88. package/dist/server/server.mjs +102 -51
  89. package/package.json +2 -2
  90. package/dist/SdkPreviewModeRuntime-UBL6MSNP.mjs +0 -8
@@ -1,15 +1,15 @@
1
1
  "use client";
2
- import { useWaitlistClaim, resolveCoursePricingState, formatCoursePriceDisplay, formatCoursePriceAmount, MagicLinkForm } from './chunk-Z62JYS5O.mjs';
3
- import { SpinnerNode } from './chunk-FHU6PFPM.mjs';
2
+ import { useWaitlistClaim, resolveCoursePricingState, formatCoursePriceDisplay, formatCoursePriceAmount, MagicLinkForm } from './chunk-FMZZHAIR.mjs';
3
+ import { SpinnerNode } from './chunk-ISAUXU5R.mjs';
4
4
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
5
- import { DiscountCodeDisclosure, useDiscountCodeUi, getStepNumber, logoutPortal, StepIndicator, LoggedInAsUser, CheckIcon, formatPrice, TerminalPanel, StateIcon, ClockIcon, CrossIcon, scrollToBlock, buildCheckoutReturnUrls, MembershipHero, validateFormData } from './chunk-NBFRJ5NB.mjs';
5
+ import { DiscountCodeDisclosure, useDiscountCodeUi, getStepNumber, logoutPortal, StepIndicator, LoggedInAsUser, CheckIcon, formatPrice, TerminalPanel, StateIcon, ClockIcon, CrossIcon, scrollToBlock, buildCheckoutReturnUrls, MembershipHero, validateFormData } from './chunk-CKXEUWWA.mjs';
6
6
  import { getFieldValidationControlProps, FieldValidationMessage } from './chunk-3DCJ45Z2.mjs';
7
7
  import { ModalShell } from './chunk-WBQG7VJA.mjs';
8
- import { AltchaWidget, getChallengeUrl, isSpamProtectionEnabled } from './chunk-HIHOQGIP.mjs';
8
+ import { AltchaWidget, getChallengeUrl, isSpamProtectionEnabled } from './chunk-LJCX6V7Q.mjs';
9
9
  import { BlockApiProvider, useBlockApi } from './chunk-WHZQDPBZ.mjs';
10
10
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
11
- import { defineIslandPropsDecoder, themeButtonClassName } from './chunk-6DPXDOIL.mjs';
12
- import { formatBookingDate, toScheduledBookingDateTime, toBookingTimeZone, formatBookingTime } from './chunk-25W2EQUN.mjs';
11
+ import { defineIslandPropsDecoder, themeButtonClassName } from './chunk-MLBNVN4H.mjs';
12
+ import { formatBookingDate, toScheduledBookingDateTime, toBookingTimeZone, formatBookingTime } from './chunk-RWYFG625.mjs';
13
13
  import React2, { Component, useMemo, useState, useEffect } from 'react';
14
14
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
15
15
 
@@ -1,18 +1,18 @@
1
- import { EventCalendarClient } from './chunk-DAS5CIER.mjs';
2
- import './chunk-D3ETC2SU.mjs';
3
- import './chunk-Z62JYS5O.mjs';
1
+ import { EventCalendarClient } from './chunk-6QZIBNGV.mjs';
2
+ import './chunk-C4LP6BPG.mjs';
3
+ import './chunk-FMZZHAIR.mjs';
4
4
  import './chunk-6N7YRNYU.mjs';
5
- import './chunk-4RTFGHZN.mjs';
6
- import './chunk-FHU6PFPM.mjs';
5
+ import './chunk-E6VIWZUG.mjs';
6
+ import './chunk-ISAUXU5R.mjs';
7
7
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
8
- import './chunk-NBFRJ5NB.mjs';
8
+ import './chunk-CKXEUWWA.mjs';
9
9
  import './chunk-3DCJ45Z2.mjs';
10
10
  import './chunk-WBQG7VJA.mjs';
11
- import './chunk-HIHOQGIP.mjs';
11
+ import './chunk-LJCX6V7Q.mjs';
12
12
  import { BlockApiProvider } from './chunk-WHZQDPBZ.mjs';
13
13
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
14
- import { defineIslandPropsDecoder } from './chunk-6DPXDOIL.mjs';
15
- import './chunk-25W2EQUN.mjs';
14
+ import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
15
+ import './chunk-RWYFG625.mjs';
16
16
  import { jsx } from 'react/jsx-runtime';
17
17
 
18
18
  var decode = defineIslandPropsDecoder("event-calendar");
@@ -1,18 +1,18 @@
1
- import { EventCombinedIslandClient } from './chunk-DAS5CIER.mjs';
2
- import './chunk-D3ETC2SU.mjs';
3
- import './chunk-Z62JYS5O.mjs';
1
+ import { EventCombinedIslandClient } from './chunk-6QZIBNGV.mjs';
2
+ import './chunk-C4LP6BPG.mjs';
3
+ import './chunk-FMZZHAIR.mjs';
4
4
  import './chunk-6N7YRNYU.mjs';
5
- import './chunk-4RTFGHZN.mjs';
6
- import './chunk-FHU6PFPM.mjs';
5
+ import './chunk-E6VIWZUG.mjs';
6
+ import './chunk-ISAUXU5R.mjs';
7
7
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
8
- import './chunk-NBFRJ5NB.mjs';
8
+ import './chunk-CKXEUWWA.mjs';
9
9
  import './chunk-3DCJ45Z2.mjs';
10
10
  import './chunk-WBQG7VJA.mjs';
11
- import './chunk-HIHOQGIP.mjs';
11
+ import './chunk-LJCX6V7Q.mjs';
12
12
  import { BlockApiProvider } from './chunk-WHZQDPBZ.mjs';
13
13
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
14
- import { defineIslandPropsDecoder } from './chunk-6DPXDOIL.mjs';
15
- import './chunk-25W2EQUN.mjs';
14
+ import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
15
+ import './chunk-RWYFG625.mjs';
16
16
  import { jsx } from 'react/jsx-runtime';
17
17
 
18
18
  var decode = defineIslandPropsDecoder("event-combined");
@@ -1,17 +1,17 @@
1
- import { EventDetailsIslandClient } from './chunk-DAS5CIER.mjs';
2
- import './chunk-D3ETC2SU.mjs';
3
- import './chunk-Z62JYS5O.mjs';
1
+ import { EventDetailsIslandClient } from './chunk-6QZIBNGV.mjs';
2
+ import './chunk-C4LP6BPG.mjs';
3
+ import './chunk-FMZZHAIR.mjs';
4
4
  import './chunk-6N7YRNYU.mjs';
5
- import './chunk-4RTFGHZN.mjs';
6
- import './chunk-FHU6PFPM.mjs';
7
- import './chunk-NBFRJ5NB.mjs';
5
+ import './chunk-E6VIWZUG.mjs';
6
+ import './chunk-ISAUXU5R.mjs';
7
+ import './chunk-CKXEUWWA.mjs';
8
8
  import './chunk-3DCJ45Z2.mjs';
9
9
  import './chunk-WBQG7VJA.mjs';
10
- import './chunk-HIHOQGIP.mjs';
10
+ import './chunk-LJCX6V7Q.mjs';
11
11
  import './chunk-WHZQDPBZ.mjs';
12
12
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
13
- import { defineIslandPropsDecoder } from './chunk-6DPXDOIL.mjs';
14
- import './chunk-25W2EQUN.mjs';
13
+ import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
14
+ import './chunk-RWYFG625.mjs';
15
15
  import { jsx } from 'react/jsx-runtime';
16
16
 
17
17
  var decode = defineIslandPropsDecoder("event-details");
@@ -1,18 +1,18 @@
1
- import { EventListingClient } from './chunk-DAS5CIER.mjs';
2
- import './chunk-D3ETC2SU.mjs';
3
- import './chunk-Z62JYS5O.mjs';
1
+ import { EventListingClient } from './chunk-6QZIBNGV.mjs';
2
+ import './chunk-C4LP6BPG.mjs';
3
+ import './chunk-FMZZHAIR.mjs';
4
4
  import './chunk-6N7YRNYU.mjs';
5
- import './chunk-4RTFGHZN.mjs';
6
- import './chunk-FHU6PFPM.mjs';
5
+ import './chunk-E6VIWZUG.mjs';
6
+ import './chunk-ISAUXU5R.mjs';
7
7
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
8
- import './chunk-NBFRJ5NB.mjs';
8
+ import './chunk-CKXEUWWA.mjs';
9
9
  import './chunk-3DCJ45Z2.mjs';
10
10
  import './chunk-WBQG7VJA.mjs';
11
- import './chunk-HIHOQGIP.mjs';
11
+ import './chunk-LJCX6V7Q.mjs';
12
12
  import { BlockApiProvider } from './chunk-WHZQDPBZ.mjs';
13
13
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
14
- import { defineIslandPropsDecoder } from './chunk-6DPXDOIL.mjs';
15
- import './chunk-25W2EQUN.mjs';
14
+ import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
15
+ import './chunk-RWYFG625.mjs';
16
16
  import { jsx } from 'react/jsx-runtime';
17
17
 
18
18
  var decode = defineIslandPropsDecoder("event-listing");
@@ -1,18 +1,18 @@
1
- import { EventRegistrationIslandClient } from './chunk-DAS5CIER.mjs';
2
- import './chunk-D3ETC2SU.mjs';
3
- import './chunk-Z62JYS5O.mjs';
1
+ import { EventRegistrationIslandClient } from './chunk-6QZIBNGV.mjs';
2
+ import './chunk-C4LP6BPG.mjs';
3
+ import './chunk-FMZZHAIR.mjs';
4
4
  import './chunk-6N7YRNYU.mjs';
5
- import './chunk-4RTFGHZN.mjs';
6
- import './chunk-FHU6PFPM.mjs';
5
+ import './chunk-E6VIWZUG.mjs';
6
+ import './chunk-ISAUXU5R.mjs';
7
7
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
8
- import './chunk-NBFRJ5NB.mjs';
8
+ import './chunk-CKXEUWWA.mjs';
9
9
  import './chunk-3DCJ45Z2.mjs';
10
10
  import './chunk-WBQG7VJA.mjs';
11
- import './chunk-HIHOQGIP.mjs';
11
+ import './chunk-LJCX6V7Q.mjs';
12
12
  import { BlockApiProvider } from './chunk-WHZQDPBZ.mjs';
13
13
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
14
- import { defineIslandPropsDecoder } from './chunk-6DPXDOIL.mjs';
15
- import './chunk-25W2EQUN.mjs';
14
+ import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
15
+ import './chunk-RWYFG625.mjs';
16
16
  import { jsx } from 'react/jsx-runtime';
17
17
 
18
18
  var decode = defineIslandPropsDecoder("event-registration");
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { isSpamProtectionEnabled, AltchaWidget, getChallengeUrl } from './chunk-HIHOQGIP.mjs';
2
+ import { isSpamProtectionEnabled, AltchaWidget, getChallengeUrl } from './chunk-LJCX6V7Q.mjs';
3
3
  import { BlockApiProvider, FeedbackMessage, useBlockApi } from './chunk-WHZQDPBZ.mjs';
4
4
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
5
- import { defineIslandPropsDecoder, themeButtonClassName, assertNever, err, ok } from './chunk-6DPXDOIL.mjs';
6
- import { clsx_default } from './chunk-25W2EQUN.mjs';
5
+ import { defineIslandPropsDecoder, themeButtonClassName, assertNever, err, ok } from './chunk-MLBNVN4H.mjs';
6
+ import { clsx_default } from './chunk-RWYFG625.mjs';
7
7
  import { useState, useReducer, useRef } from 'react';
8
8
  import { jsx, jsxs } from 'react/jsx-runtime';
9
9
 
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { useCommerceCart } from './chunk-VFHZLZAC.mjs';
2
+ import { useCommerceCart } from './chunk-6RN62XBV.mjs';
3
3
  import { resolveDedicatedCheckoutPath, ModalShell } from './chunk-WBQG7VJA.mjs';
4
- import { defineIslandPropsDecoder, buildCartDisplay, themeButtonClassName } from './chunk-6DPXDOIL.mjs';
5
- import './chunk-25W2EQUN.mjs';
4
+ import { defineIslandPropsDecoder, buildCartDisplay, themeButtonClassName } from './chunk-MLBNVN4H.mjs';
5
+ import './chunk-RWYFG625.mjs';
6
6
  import * as React2 from 'react';
7
7
  import { createPortal } from 'react-dom';
8
8
  import { createRoot } from 'react-dom/client';
@@ -6504,6 +6504,8 @@ function publicEventPricingType(pricing) {
6504
6504
  case "ticket_types":
6505
6505
  case "course":
6506
6506
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
6507
+ case "external":
6508
+ return "external";
6507
6509
  }
6508
6510
  }
6509
6511
  function isFreePublicEventPriceDisplay(display) {
@@ -6517,6 +6519,7 @@ function isFreePublicEventPriceDisplay(display) {
6517
6519
  case "range":
6518
6520
  case "mixed":
6519
6521
  case "unavailable":
6522
+ case "external":
6520
6523
  return false;
6521
6524
  }
6522
6525
  }
@@ -6534,11 +6537,11 @@ function isValidTimeZone(timeZone) {
6534
6537
  }
6535
6538
  function getSafeTimeZone(timeZone) {
6536
6539
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
6537
- return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6540
+ return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6538
6541
  }
6539
6542
  function parseStrictBookingTimeZone(timeZone) {
6540
6543
  const normalized = timeZone.trim();
6541
- if (!normalized || !isValidTimeZone(normalized)) {
6544
+ if (normalized.length === 0 || !isValidTimeZone(normalized)) {
6542
6545
  return null;
6543
6546
  }
6544
6547
  return normalized;
@@ -6612,7 +6615,7 @@ function parseScheduledBookingDateTime(input) {
6612
6615
  try {
6613
6616
  const startsAt = toUtcIsoDateTimeString(input.startsAt);
6614
6617
  const timeZone = parseStrictBookingTimeZone(input.timeZone);
6615
- if (!timeZone) {
6618
+ if (timeZone === null) {
6616
6619
  return {
6617
6620
  ok: false,
6618
6621
  field: "timeZone",
@@ -6658,10 +6661,10 @@ function normalizeLocationAddressText(value) {
6658
6661
  return null;
6659
6662
  }
6660
6663
  const trimmed = value.trim();
6661
- return trimmed ? trimmed : null;
6664
+ return trimmed.length > 0 ? trimmed : null;
6662
6665
  }
6663
6666
  function hasLocationCoordinates(value) {
6664
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6667
+ return value != null && typeof value.lat === "number" && typeof value.lng === "number";
6665
6668
  }
6666
6669
  function toLocationCoordinates(value) {
6667
6670
  if (!hasLocationCoordinates(value)) {
@@ -28079,6 +28082,18 @@ var publicCoursesArraySchema = z42.array(publicCourseSchema);
28079
28082
  var eventPresetSchema = z43.enum(["event", "class", "workshop", "retreat", "performance"]);
28080
28083
  var eventScheduleScopeSchema = z43.enum(["recurring", "oneOff"]);
28081
28084
  var eventDestinationModeSchema = z43.enum(["cms-managed", "system-managed"]);
28085
+ var publicEventDestinationSchema = z43.discriminatedUnion("kind", [
28086
+ z43.object({
28087
+ kind: z43.literal("native"),
28088
+ mode: eventDestinationModeSchema,
28089
+ path: z43.string()
28090
+ }),
28091
+ z43.object({
28092
+ kind: z43.literal("external"),
28093
+ url: z43.string(),
28094
+ label: z43.string()
28095
+ })
28096
+ ]);
28082
28097
  var eventVenueSchema = z43.object({
28083
28098
  id: z43.string(),
28084
28099
  name: z43.string(),
@@ -28093,7 +28108,7 @@ var eventCategorySchema = z43.object({
28093
28108
  name: z43.string(),
28094
28109
  color: z43.string().nullable()
28095
28110
  });
28096
- var pricingTypeSchema = z43.enum(["free", "paid"]);
28111
+ var pricingTypeSchema = z43.enum(["free", "paid", "external"]);
28097
28112
  var accessRestrictionSchema = z43.enum(["none", "category"]);
28098
28113
  var eventPricingModeSchema = z43.enum(["single", "ticket_types"]);
28099
28114
  var publicCoursePriceDisplaySchema = z43.discriminatedUnion("kind", [
@@ -28114,6 +28129,7 @@ var publicEventPriceDisplaySchema = z43.discriminatedUnion("kind", [
28114
28129
  currency: z43.string()
28115
28130
  }),
28116
28131
  z43.object({ kind: z43.literal("unavailable"), currency: z43.string() }),
28132
+ z43.object({ kind: z43.literal("external"), label: z43.string() }),
28117
28133
  z43.object({ kind: z43.literal("course"), display: publicCoursePriceDisplaySchema })
28118
28134
  ]);
28119
28135
  var publicEventTicketTypePriceDisplaySchema = z43.union([
@@ -28192,6 +28208,10 @@ var publicEventPricingSchema = z43.discriminatedUnion("kind", [
28192
28208
  z43.object({
28193
28209
  kind: z43.literal("course"),
28194
28210
  display: z43.object({ kind: z43.literal("course"), display: publicCoursePriceDisplaySchema })
28211
+ }),
28212
+ z43.object({
28213
+ kind: z43.literal("external"),
28214
+ display: z43.object({ kind: z43.literal("external"), label: z43.string() })
28195
28215
  })
28196
28216
  ]);
28197
28217
  var publicTeamMemberSummarySchema = z43.object({
@@ -28220,7 +28240,8 @@ var publicEventSchema = z43.object({
28220
28240
  image: mediaSchema2.nullable().optional()
28221
28241
  }).optional(),
28222
28242
  slug: z43.string(),
28223
- path: z43.string(),
28243
+ path: z43.string().nullable(),
28244
+ destination: publicEventDestinationSchema,
28224
28245
  requiresRegistration: z43.boolean(),
28225
28246
  deliveryMode: z43.enum(["in_person", "online", "hybrid"]),
28226
28247
  attendanceModes: z43.array(publicEventAttendanceModeAvailabilitySchema),
@@ -28524,12 +28545,41 @@ function isEventContentType(slug) {
28524
28545
  return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
28525
28546
  }
28526
28547
 
28548
+ // ../blocks/src/system/runtime/nodes/events/shared/destination.ts
28549
+ function isRecord3(value) {
28550
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28551
+ }
28552
+ function isRuntimeEventDestination(value) {
28553
+ if (!isRecord3(value) || typeof value.kind !== "string") return false;
28554
+ if (value.kind === "native") {
28555
+ return (value.mode === "cms-managed" || value.mode === "system-managed") && typeof value.path === "string";
28556
+ }
28557
+ return value.kind === "external" && typeof value.url === "string" && typeof value.label === "string";
28558
+ }
28559
+ function resolveRuntimeEventDestination(event) {
28560
+ if (isRuntimeEventDestination(event.destination)) {
28561
+ return event.destination;
28562
+ }
28563
+ return {
28564
+ kind: "native",
28565
+ mode: event.eventDestinationMode === "system-managed" ? "system-managed" : "cms-managed",
28566
+ path: typeof event.path === "string" ? event.path : ""
28567
+ };
28568
+ }
28569
+
28527
28570
  // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
28528
28571
  var DEFAULT_EVENT_CURRENCY = "USD";
28529
28572
  function resolveRuntimeEventPricing(event) {
28530
28573
  if (isPublicEventPricing(event.pricing)) {
28531
28574
  return event.pricing;
28532
28575
  }
28576
+ const destination = resolveRuntimeEventDestination(event);
28577
+ if (destination.kind === "external") {
28578
+ return {
28579
+ kind: "external",
28580
+ display: { kind: "external", label: "External registration" }
28581
+ };
28582
+ }
28533
28583
  const legacy = event;
28534
28584
  const currency = readCurrency(legacy.currency);
28535
28585
  if (event.requiresRegistration === false) {
@@ -28566,22 +28616,22 @@ function resolveRuntimeEventPricing(event) {
28566
28616
  function readCurrency(value) {
28567
28617
  return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
28568
28618
  }
28569
- function isRecord3(value) {
28619
+ function isRecord4(value) {
28570
28620
  return typeof value === "object" && value !== null && !Array.isArray(value);
28571
28621
  }
28572
28622
  function isPublicEventPricing(value) {
28573
- if (!isRecord3(value) || typeof value.kind !== "string") return false;
28574
- return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
28623
+ if (!isRecord4(value) || typeof value.kind !== "string") return false;
28624
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
28575
28625
  }
28576
28626
  function isPublicEventTicketType(value) {
28577
- return isRecord3(value) && typeof value.id === "string";
28627
+ return isRecord4(value) && typeof value.id === "string";
28578
28628
  }
28579
28629
  function readTicketTypePriceDisplay(value, currency) {
28580
28630
  const display = readLegacyPriceDisplay(value, currency);
28581
- return display.kind === "course" ? { kind: "unavailable", currency } : display;
28631
+ return display.kind === "course" || display.kind === "external" ? { kind: "unavailable", currency } : display;
28582
28632
  }
28583
28633
  function readLegacyPriceDisplay(value, currency) {
28584
- if (!isRecord3(value) || typeof value.kind !== "string") {
28634
+ if (!isRecord4(value) || typeof value.kind !== "string") {
28585
28635
  return { kind: "unavailable", currency };
28586
28636
  }
28587
28637
  const displayCurrency = readCurrency(value.currency);
@@ -28620,7 +28670,7 @@ function readLegacyPriceDisplay(value, currency) {
28620
28670
  case "unavailable":
28621
28671
  return { kind: "unavailable", currency: displayCurrency };
28622
28672
  case "course":
28623
- return isRecord3(value.display) ? {
28673
+ return isRecord4(value.display) ? {
28624
28674
  kind: "course",
28625
28675
  display: readCoursePriceDisplay(value.display, displayCurrency)
28626
28676
  } : {
@@ -28707,7 +28757,7 @@ function resolveEventRequiresPayment(input) {
28707
28757
  if (!input.event) {
28708
28758
  return false;
28709
28759
  }
28710
- return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
28760
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) === "paid";
28711
28761
  }
28712
28762
 
28713
28763
  // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
@@ -28904,15 +28954,16 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
28904
28954
  })
28905
28955
  });
28906
28956
  function normalizeEventRegistrationEventInput(value) {
28907
- if (!isRecord4(value)) {
28957
+ if (!isRecord5(value)) {
28908
28958
  return value;
28909
28959
  }
28910
28960
  return {
28911
28961
  ...value,
28962
+ destination: resolveRuntimeEventDestination(value),
28912
28963
  pricing: resolveRuntimeEventPricing(value)
28913
28964
  };
28914
28965
  }
28915
- function isRecord4(value) {
28966
+ function isRecord5(value) {
28916
28967
  return typeof value === "object" && value !== null && !Array.isArray(value);
28917
28968
  }
28918
28969
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
@@ -31474,7 +31525,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
31474
31525
  return keys.length >= 2 ? keys : [];
31475
31526
  }
31476
31527
  function normalizeOfferingsPreviewContentForWrite(value) {
31477
- if (!isRecord5(value)) return null;
31528
+ if (!isRecord6(value)) return null;
31478
31529
  const groupOrderValue = value.groupOrder;
31479
31530
  if (Array.isArray(groupOrderValue)) {
31480
31531
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -31487,7 +31538,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
31487
31538
  return { ...value, groupOrder: [] };
31488
31539
  }
31489
31540
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
31490
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
31541
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord6) : []
31491
31542
  );
31492
31543
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
31493
31544
  }
@@ -31501,7 +31552,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
31501
31552
  }
31502
31553
  return keys;
31503
31554
  }
31504
- function isRecord5(value) {
31555
+ function isRecord6(value) {
31505
31556
  return typeof value === "object" && value !== null && !Array.isArray(value);
31506
31557
  }
31507
31558
 
@@ -31868,7 +31919,7 @@ function isOfferingsPreviewItemLimit(value) {
31868
31919
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
31869
31920
  }
31870
31921
  function normalizeOfferingsPreviewGroupOverride(value) {
31871
- if (!isRecord6(value)) return [];
31922
+ if (!isRecord7(value)) return [];
31872
31923
  const override = {};
31873
31924
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
31874
31925
  override.sourceKey = value.sourceKey;
@@ -31900,12 +31951,12 @@ function isButtonVariant(value) {
31900
31951
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
31901
31952
  }
31902
31953
  function normalizeCardStylesContent(value) {
31903
- return isRecord6(value) || value === null ? value : void 0;
31954
+ return isRecord7(value) || value === null ? value : void 0;
31904
31955
  }
31905
31956
  function normalizeSectionStylesContent(value) {
31906
- return isRecord6(value) || value === null ? value : void 0;
31957
+ return isRecord7(value) || value === null ? value : void 0;
31907
31958
  }
31908
- function isRecord6(value) {
31959
+ function isRecord7(value) {
31909
31960
  return typeof value === "object" && value !== null && !Array.isArray(value);
31910
31961
  }
31911
31962
 
@@ -36998,11 +37049,11 @@ function extractRouteUpdatedAt(candidate) {
36998
37049
  }
36999
37050
  function resolveRouteTargetForStage(routeIdValue, routes, stageInput) {
37000
37051
  const routeId = typeof routeIdValue === "string" ? routeIdValue : null;
37001
- if (!routeId || !routes) return null;
37052
+ if (routeId === null || routeId.length === 0 || routes === void 0) return null;
37002
37053
  const routeEntry = routes[routeId];
37003
37054
  if (!isRouteVisibleInStage(routeEntry, stageInput)) return null;
37004
37055
  const href = extractRouteHref(routeEntry, stageInput);
37005
- if (!href) return null;
37056
+ if (href === null) return null;
37006
37057
  return {
37007
37058
  routeId,
37008
37059
  href,
@@ -37145,7 +37196,7 @@ var defaultTransforms = createTransformRegistry(builtinTransformDefinitions);
37145
37196
  // ../blocks/src/system/data/linkedContentEntries.ts
37146
37197
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
37147
37198
  function coerceLinkedContentEntriesPayload(payload) {
37148
- if (!isRecord7(payload)) return payload;
37199
+ if (!isRecord8(payload)) return payload;
37149
37200
  const response = payload;
37150
37201
  if (!Array.isArray(response.entries)) return payload;
37151
37202
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -37153,12 +37204,12 @@ function coerceLinkedContentEntriesPayload(payload) {
37153
37204
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
37154
37205
  }
37155
37206
  function enrichLinkedContentEntry(entry, contentType) {
37156
- if (!isRecord7(entry)) return entry;
37207
+ if (!isRecord8(entry)) return entry;
37157
37208
  const entryId = typeof entry.id === "string" ? entry.id : null;
37158
37209
  if (!entryId) return entry;
37159
37210
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
37160
37211
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
37161
- const content = isRecord7(entry.content) ? entry.content : {};
37212
+ const content = isRecord8(entry.content) ? entry.content : {};
37162
37213
  const meta = {
37163
37214
  kind: "linked-content-entry",
37164
37215
  entryId,
@@ -37251,7 +37302,7 @@ function capitalize(value) {
37251
37302
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
37252
37303
  }
37253
37304
  function parsePublicContentTypeMeta(value) {
37254
- if (!isRecord7(value)) return null;
37305
+ if (!isRecord8(value)) return null;
37255
37306
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
37256
37307
  return {
37257
37308
  key: value.key,
@@ -37261,7 +37312,7 @@ function parsePublicContentTypeMeta(value) {
37261
37312
  };
37262
37313
  }
37263
37314
  function parsePublicContentTypeLinkedEntryEditing(value) {
37264
- if (!isRecord7(value) || typeof value.kind !== "string") return null;
37315
+ if (!isRecord8(value) || typeof value.kind !== "string") return null;
37265
37316
  switch (value.kind) {
37266
37317
  case "generic":
37267
37318
  return { kind: "generic" };
@@ -37275,7 +37326,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
37275
37326
  }
37276
37327
  }
37277
37328
  function parsePublicContentTypeFieldMeta(value) {
37278
- if (!isRecord7(value)) return [];
37329
+ if (!isRecord8(value)) return [];
37279
37330
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
37280
37331
  return [{
37281
37332
  id: value.id,
@@ -37289,7 +37340,7 @@ function parseStringArray(value) {
37289
37340
  if (!Array.isArray(value)) return null;
37290
37341
  return value.filter((item) => typeof item === "string");
37291
37342
  }
37292
- function isRecord7(value) {
37343
+ function isRecord8(value) {
37293
37344
  return typeof value === "object" && value !== null && !Array.isArray(value);
37294
37345
  }
37295
37346
 
@@ -39064,7 +39115,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
39064
39115
  }
39065
39116
 
39066
39117
  // ../api/src/utils/isRecord.ts
39067
- function isRecord8(value) {
39118
+ function isRecord9(value) {
39068
39119
  return typeof value === "object" && value !== null && !Array.isArray(value);
39069
39120
  }
39070
39121
 
@@ -39371,7 +39422,7 @@ function sanitizeMarks(marks) {
39371
39422
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
39372
39423
  return [{ type: mark.type }];
39373
39424
  }
39374
- if (mark.type === "link" && isRecord8(mark.attrs) && typeof mark.attrs.href === "string") {
39425
+ if (mark.type === "link" && isRecord9(mark.attrs) && typeof mark.attrs.href === "string") {
39375
39426
  const attrs = { href: mark.attrs.href };
39376
39427
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
39377
39428
  attrs.target = mark.attrs.target;
@@ -39386,10 +39437,10 @@ function sanitizeMarks(marks) {
39386
39437
  return sanitized.length > 0 ? sanitized : void 0;
39387
39438
  }
39388
39439
  function unwrapRichTextValue(value) {
39389
- if (isRecord8(value) && isRecord8(value.doc)) {
39440
+ if (isRecord9(value) && isRecord9(value.doc)) {
39390
39441
  return unwrapRichTextValue(value.doc);
39391
39442
  }
39392
- if (isRecord8(value) && value.type === "doc") {
39443
+ if (isRecord9(value) && value.type === "doc") {
39393
39444
  return {
39394
39445
  type: "doc",
39395
39446
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -39398,7 +39449,7 @@ function unwrapRichTextValue(value) {
39398
39449
  return EMPTY_SITE_BANNER_BODY;
39399
39450
  }
39400
39451
  function isTipTapNodeLike(value) {
39401
- return isRecord8(value) && typeof value.type === "string";
39452
+ return isRecord9(value) && typeof value.type === "string";
39402
39453
  }
39403
39454
  function coerceTipTapNode(value) {
39404
39455
  return {
@@ -39406,9 +39457,9 @@ function coerceTipTapNode(value) {
39406
39457
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
39407
39458
  ...typeof value.text === "string" ? { text: value.text } : {},
39408
39459
  ...Array.isArray(value.marks) ? {
39409
- marks: value.marks.filter((mark) => isRecord8(mark) && typeof mark.type === "string").map((mark) => ({
39460
+ marks: value.marks.filter((mark) => isRecord9(mark) && typeof mark.type === "string").map((mark) => ({
39410
39461
  type: mark.type,
39411
- ...isRecord8(mark.attrs) ? { attrs: mark.attrs } : {}
39462
+ ...isRecord9(mark.attrs) ? { attrs: mark.attrs } : {}
39412
39463
  }))
39413
39464
  } : {}
39414
39465
  };
@@ -39578,7 +39629,7 @@ var ENTRY_REF_KEYS = [
39578
39629
  "entryId",
39579
39630
  "slug"
39580
39631
  ];
39581
- function isRecord9(value) {
39632
+ function isRecord10(value) {
39582
39633
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
39583
39634
  }
39584
39635
  function extractManualEntryRef(item) {
@@ -39586,7 +39637,7 @@ function extractManualEntryRef(item) {
39586
39637
  const trimmed = item.trim();
39587
39638
  return trimmed.length > 0 ? trimmed : null;
39588
39639
  }
39589
- if (!isRecord9(item)) return null;
39640
+ if (!isRecord10(item)) return null;
39590
39641
  for (const key of ENTRY_REF_KEYS) {
39591
39642
  const raw = item[key];
39592
39643
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -1,7 +1,7 @@
1
- import { LeafletStaticMap } from './chunk-D3ETC2SU.mjs';
1
+ import { LeafletStaticMap } from './chunk-C4LP6BPG.mjs';
2
2
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
3
- import { defineIslandPropsDecoder } from './chunk-6DPXDOIL.mjs';
4
- import { normalizeLocationAddressText, toLocationCoordinates, textColorStyle, mergeStyles, borderColorStyle, backgroundColorStyle } from './chunk-25W2EQUN.mjs';
3
+ import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
4
+ import { normalizeLocationAddressText, toLocationCoordinates, textColorStyle, mergeStyles, borderColorStyle, backgroundColorStyle } from './chunk-RWYFG625.mjs';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
7
7
  // ../blocks/src/system/runtime/nodes/location-map.shared.ts
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { getFieldValidationControlProps, FieldValidationMessage } from './chunk-3DCJ45Z2.mjs';
3
- import { isSpamProtectionEnabled, AltchaWidget, getChallengeUrl } from './chunk-HIHOQGIP.mjs';
3
+ import { isSpamProtectionEnabled, AltchaWidget, getChallengeUrl } from './chunk-LJCX6V7Q.mjs';
4
4
  import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-WHZQDPBZ.mjs';
5
5
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
6
- import { defineIslandPropsDecoder, themeButtonClassName, assertNever } from './chunk-6DPXDOIL.mjs';
7
- import { clsx_default } from './chunk-25W2EQUN.mjs';
6
+ import { defineIslandPropsDecoder, themeButtonClassName, assertNever } from './chunk-MLBNVN4H.mjs';
7
+ import { clsx_default } from './chunk-RWYFG625.mjs';
8
8
  import { useReducer, useState } from 'react';
9
9
  import { jsx, jsxs } from 'react/jsx-runtime';
10
10
 
@@ -1,15 +1,15 @@
1
- import { mountShopBlockIsland, ProductDetailClient } from './chunk-MFPKS6QS.mjs';
2
- import './chunk-VFHZLZAC.mjs';
3
- import './chunk-7DH35FGA.mjs';
1
+ import { mountShopBlockIsland, ProductDetailClient } from './chunk-RMOFBBNA.mjs';
2
+ import './chunk-6RN62XBV.mjs';
3
+ import './chunk-PMNAV6LO.mjs';
4
4
  import './chunk-6N7YRNYU.mjs';
5
5
  import './chunk-L4J5Y62O.mjs';
6
- import './chunk-NBFRJ5NB.mjs';
6
+ import './chunk-CKXEUWWA.mjs';
7
7
  import './chunk-3DCJ45Z2.mjs';
8
8
  import './chunk-WBQG7VJA.mjs';
9
9
  import './chunk-WHZQDPBZ.mjs';
10
10
  import './chunk-N7PBWBWQ.mjs';
11
- import { defineIslandPropsDecoder } from './chunk-6DPXDOIL.mjs';
12
- import './chunk-25W2EQUN.mjs';
11
+ import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
12
+ import './chunk-RWYFG625.mjs';
13
13
 
14
14
  // src/rendering/islands/enhancers/productDetail.tsx
15
15
  var decode = defineIslandPropsDecoder("product-detail");