@riverbankcms/sdk 0.74.0 → 0.75.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 (113) hide show
  1. package/dist/{PreviewEditorSidebar-5XL7M3OM.mjs → PreviewEditorSidebar-U2IHCBYN.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-ZDFRDJID.mjs → PreviewEditorUI-ZGH2RQNP.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-MTUGBTLQ.mjs +8 -0
  4. package/dist/_dts/api/src/cache-tags.d.ts +22 -0
  5. package/dist/_dts/api/src/contentRuntime.d.ts +1 -0
  6. package/dist/_dts/api/src/endpoints.d.ts +24 -24
  7. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +2 -1
  8. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +4 -1
  9. package/dist/_dts/blocks/src/client/booking-form.d.ts +2 -0
  10. package/dist/_dts/blocks/src/client/carousel.d.ts +1 -0
  11. package/dist/_dts/blocks/src/client/course-registration.d.ts +2 -0
  12. package/dist/_dts/blocks/src/client/events.d.ts +4 -0
  13. package/dist/_dts/blocks/src/client/form.d.ts +2 -0
  14. package/dist/_dts/blocks/src/client/header.d.ts +1 -0
  15. package/dist/_dts/blocks/src/client/location-map.d.ts +1 -0
  16. package/dist/_dts/blocks/src/client/newsletter-form.d.ts +2 -0
  17. package/dist/_dts/blocks/src/client/shop.d.ts +6 -0
  18. package/dist/_dts/blocks/src/lib/video.d.ts +2 -0
  19. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +21 -1
  20. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +1 -0
  21. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +3 -2
  22. package/dist/_dts/blocks/src/system/runtime/nodes/events/index.d.ts +3 -0
  23. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +1 -0
  24. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +1 -0
  25. package/dist/_dts/content-editor/src/hooks/validateBlocksForPublish.d.ts +5 -0
  26. package/dist/_dts/preview-next/src/client/preview/SiteChromeEditableSurface.d.ts +12 -2
  27. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -0
  28. package/dist/_dts/sdk/src/rendering/islands/deferredVideoEmbeds.d.ts +2 -0
  29. package/dist/_dts/sdk/src/rendering/server.d.ts +3 -0
  30. package/dist/_dts/sdk/src/version.d.ts +1 -1
  31. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  32. package/dist/{chunk-YY7K3QD2.mjs → chunk-BGMNDF6T.mjs} +7 -7
  33. package/dist/{chunk-2MIWNFJM.mjs → chunk-GFE74WRD.mjs} +309 -84
  34. package/dist/{chunk-CEQBBLMJ.mjs → chunk-RWXQBRQZ.mjs} +1 -1
  35. package/dist/{chunk-7RX72SK2.mjs → chunk-VX7B5VAC.mjs} +36 -25
  36. package/dist/{chunk-YRJKZEQ3.mjs → chunk-Z7JLNTJR.mjs} +1 -1
  37. package/dist/{chunk-CBD47MTM.mjs → chunk-ZSHFGFUG.mjs} +2 -2
  38. package/dist/cli/index.mjs +3395 -3753
  39. package/dist/client/{accordion-ZZVXWV3N.mjs → accordion-T2UD2ZTH.mjs} +1 -1
  40. package/dist/client/bookingForm-GUP75FKN.mjs +3022 -0
  41. package/dist/client/bookings.mjs +19 -10
  42. package/dist/client/{carousel-25WK2H7G.mjs → carousel-2NQA6V57.mjs} +3 -2
  43. package/dist/client/cart-5TFIAFDS.mjs +18 -0
  44. package/dist/client/checkout-TP4WAHZE.mjs +18 -0
  45. package/dist/client/chunk-2PHQZ666.mjs +383 -0
  46. package/dist/client/chunk-3DCJ45Z2.mjs +36 -0
  47. package/dist/client/chunk-3PEDD5KJ.mjs +146 -0
  48. package/dist/client/chunk-CY2ZTSE5.mjs +204 -0
  49. package/dist/client/chunk-F7LHOKEH.mjs +146 -0
  50. package/dist/client/{chunk-6VGXRE34.mjs → chunk-FU2QRZMX.mjs} +6 -6
  51. package/dist/client/chunk-I2MMZO53.mjs +6 -0
  52. package/dist/client/chunk-II7O4XN3.mjs +2206 -0
  53. package/dist/client/chunk-M3L3KYYR.mjs +1181 -0
  54. package/dist/client/chunk-NWOUL6JY.mjs +1378 -0
  55. package/dist/client/chunk-OJPZEZU2.mjs +31 -0
  56. package/dist/client/chunk-RTZ3JKKX.mjs +178 -0
  57. package/dist/client/chunk-TQ5MSPDX.mjs +74 -0
  58. package/dist/client/chunk-VUAOE3AG.mjs +5592 -0
  59. package/dist/client/chunk-WJXXNDSE.mjs +245 -0
  60. package/dist/client/chunk-YLMKMCSJ.mjs +86 -0
  61. package/dist/client/chunk-ZLMS67RR.mjs +106 -0
  62. package/dist/client/client.mjs +51626 -52074
  63. package/dist/client/courseRegistration-5DPU6PDY.mjs +1737 -0
  64. package/dist/client/{eventCalendar-X6GIPYFM.mjs → eventCalendar-F3GZGTEF.mjs} +13 -2
  65. package/dist/client/{eventCombined-EZUOPM3G.mjs → eventCombined-BQOB6QMY.mjs} +13 -2
  66. package/dist/client/eventDetails-PEM2EJWE.mjs +25 -0
  67. package/dist/client/{eventListing-HEFGAETC.mjs → eventListing-YMIQPVME.mjs} +13 -2
  68. package/dist/client/{eventRegistration-3LCP2V3P.mjs → eventRegistration-4I6ZNDUF.mjs} +13 -2
  69. package/dist/client/form-ZJVAYZ6G.mjs +300 -0
  70. package/dist/client/headerSection-TOT5MGTF.mjs +729 -0
  71. package/dist/client/hooks.mjs +49 -33
  72. package/dist/client/locationMap-J66NZREU.mjs +227 -0
  73. package/dist/client/newsletterForm-ET2XUMRO.mjs +208 -0
  74. package/dist/client/productDetail-C2XIH7C5.mjs +18 -0
  75. package/dist/client/productList-T2AZLFTP.mjs +18 -0
  76. package/dist/client/rendering/client.mjs +11763 -12445
  77. package/dist/client/rendering/islands.mjs +98 -21
  78. package/dist/client/rendering.mjs +46778 -47229
  79. package/dist/client/shop-UZ6IUZXD.mjs +20 -0
  80. package/dist/preview-next/before-render.mjs +37 -25
  81. package/dist/preview-next/client/runtime.mjs +5 -5
  82. package/dist/preview-next/middleware.mjs +37 -25
  83. package/dist/{sdk-runtime-OHNONZ5U.mjs → sdk-runtime-JCUQM63Y.mjs} +6 -6
  84. package/dist/server/components.mjs +409 -266
  85. package/dist/server/config-validation.mjs +49 -33
  86. package/dist/server/config.mjs +49 -33
  87. package/dist/server/data.mjs +49 -33
  88. package/dist/server/index.mjs +45 -33
  89. package/dist/server/next.mjs +405 -262
  90. package/dist/server/page-converter.mjs +12 -8
  91. package/dist/server/prebuild.mjs +1 -1
  92. package/dist/server/rendering/server.mjs +493 -265
  93. package/dist/server/rendering.mjs +411 -268
  94. package/dist/server/routing.mjs +49 -33
  95. package/dist/server/server.mjs +50 -34
  96. package/dist/server/theme-bridge.mjs +5 -0
  97. package/dist/styles/index.css +5 -0
  98. package/package.json +2 -1
  99. package/dist/SdkPreviewModeRuntime-CRYNDSPL.mjs +0 -8
  100. package/dist/client/bookingForm-4X77HKDS.mjs +0 -34
  101. package/dist/client/cart-JWD2VRFU.mjs +0 -11
  102. package/dist/client/checkout-V7KYGWL7.mjs +0 -11
  103. package/dist/client/chunk-5IYGMTUE.mjs +0 -18614
  104. package/dist/client/chunk-RKCFVIMS.mjs +0 -26
  105. package/dist/client/courseRegistration-O6ZPK4YT.mjs +0 -29
  106. package/dist/client/eventDetails-3WODIXET.mjs +0 -14
  107. package/dist/client/form-AKXQMY6Z.mjs +0 -85
  108. package/dist/client/headerSection-5KHCMU6B.mjs +0 -12
  109. package/dist/client/locationMap-7HIADW76.mjs +0 -14
  110. package/dist/client/newsletterForm-5N4YTMU3.mjs +0 -60
  111. package/dist/client/productDetail-IZUA7ZP3.mjs +0 -11
  112. package/dist/client/productList-KWIIJE6I.mjs +0 -11
  113. package/dist/client/shop-XZQFRQWZ.mjs +0 -13
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { ApiRequestError } from './chunk-7RX72SK2.mjs';
2
+ import { ApiRequestError } from './chunk-VX7B5VAC.mjs';
3
3
  import { __commonJS, __export, __toESM, __require } from './chunk-XGB3TDIC.mjs';
4
4
  import * as React63 from 'react';
5
5
  import React63__default, { forwardRef, createElement, createContext, useRef, useMemo, useEffect, useState, useCallback, useImperativeHandle, useLayoutEffect, useContext, memo, createRef, Component as Component$1, useDebugValue, useId as useId$1, useSyncExternalStore, isValidElement, cloneElement, useReducer, startTransition } from 'react';
@@ -30415,6 +30415,9 @@ function validationContext(options = {}) {
30415
30415
  function formatFieldPath(path) {
30416
30416
  return path.map((segment) => String(segment)).join(".");
30417
30417
  }
30418
+ function toZodIssuePath(path) {
30419
+ return [...path];
30420
+ }
30418
30421
  function fieldIssueToMessage(issue2) {
30419
30422
  switch (issue2.kind) {
30420
30423
  case "required":
@@ -30543,6 +30546,9 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
30543
30546
  return assertNever4(field);
30544
30547
  }
30545
30548
  }
30549
+ function deriveFieldValidationPlans(fields3, parentPath = []) {
30550
+ return fields3.map((field) => deriveFieldValidationPlan(field, [...parentPath, field.id]));
30551
+ }
30546
30552
  function commonConstraints(required, ...specific) {
30547
30553
  return required ? [{ kind: "required" }, ...specific] : [...specific];
30548
30554
  }
@@ -30558,9 +30564,19 @@ function makePlan(kind, valueKind, field, path, required, constraints) {
30558
30564
  fieldType: field.type,
30559
30565
  path,
30560
30566
  required,
30567
+ visibility: fieldVisibility(field),
30561
30568
  constraints
30562
30569
  };
30563
30570
  }
30571
+ function fieldVisibility(field) {
30572
+ if (field.ui?.hidden) {
30573
+ return { kind: "hidden" };
30574
+ }
30575
+ if (field.visibleRoles && field.visibleRoles.length > 0) {
30576
+ return { kind: "roleRestricted", roles: field.visibleRoles };
30577
+ }
30578
+ return { kind: "visible" };
30579
+ }
30564
30580
  function withRepeaterItemConstraints(field, constraints) {
30565
30581
  const next = [...constraints];
30566
30582
  if (typeof field.minItems === "number") next.push({ kind: "minItems", minimum: field.minItems });
@@ -30574,7 +30590,7 @@ function deriveRepeatedItemVariants(field, parentPath) {
30574
30590
  }));
30575
30591
  }
30576
30592
  function deriveNestedFieldPlans(fields3, parentPath) {
30577
- return fields3.map((field) => deriveFieldValidationPlan(field, [...parentPath, field.id]));
30593
+ return deriveFieldValidationPlans(fields3, parentPath);
30578
30594
  }
30579
30595
  function getRepeaterFields(field) {
30580
30596
  const fields3 = field.polymorphic && field.itemTypes ? Object.values(field.itemTypes).flatMap((itemType) => itemType.fields) : field.schema?.fields ?? [];
@@ -30600,6 +30616,71 @@ function resolveSelectConstraintSource(field) {
30600
30616
  return assertNever4(source);
30601
30617
  }
30602
30618
  }
30619
+ function normalizeStoredContentValues(plans, content, options = {}) {
30620
+ if (!content || typeof content !== "object" || Array.isArray(content)) {
30621
+ return {};
30622
+ }
30623
+ const planMap = new Map(plans.map((plan) => [plan.fieldId, plan]));
30624
+ const normalized = {};
30625
+ const ctx = validationContext(options);
30626
+ for (const [key, value] of Object.entries(content)) {
30627
+ const plan = planMap.get(key);
30628
+ normalized[key] = plan ? normalizeStoredFieldValueWithContext(plan, value, ctx) : value;
30629
+ }
30630
+ return normalized;
30631
+ }
30632
+ function normalizeStoredFieldValueWithContext(plan, value, ctx) {
30633
+ if (value === null && !plan.required) {
30634
+ return void 0;
30635
+ }
30636
+ switch (plan.kind) {
30637
+ case "group":
30638
+ return normalizeStoredObjectChildren(plan.children, value, childValidationContext(plan, ctx));
30639
+ case "repeater":
30640
+ return normalizeStoredRepeaterItems(plan, value, ctx);
30641
+ case "string":
30642
+ case "number":
30643
+ case "boolean":
30644
+ case "richText":
30645
+ case "media":
30646
+ case "link":
30647
+ case "select":
30648
+ case "passthrough":
30649
+ return normalizeFieldValue(plan, value, ctx);
30650
+ default:
30651
+ return assertNever4(plan);
30652
+ }
30653
+ }
30654
+ function normalizeStoredObjectChildren(children, value, ctx) {
30655
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
30656
+ return value;
30657
+ }
30658
+ const normalized = { ...value };
30659
+ for (const child of children) {
30660
+ normalized[child.fieldId] = normalizeStoredFieldValueWithContext(
30661
+ child,
30662
+ normalized[child.fieldId],
30663
+ ctx
30664
+ );
30665
+ }
30666
+ return normalized;
30667
+ }
30668
+ function normalizeStoredRepeaterItems(plan, value, ctx) {
30669
+ if (!Array.isArray(value)) {
30670
+ return value;
30671
+ }
30672
+ return value.map((item) => {
30673
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
30674
+ return item;
30675
+ }
30676
+ const itemRecord = item;
30677
+ const fields3 = plan.repeatedItemVariants ? plan.repeatedItemVariants.find((variant) => variant.typeId === itemRecord._type)?.fields : plan.repeatedItemPlan;
30678
+ if (!fields3) {
30679
+ return item;
30680
+ }
30681
+ return normalizeStoredObjectChildren(fields3, itemRecord, ctx);
30682
+ });
30683
+ }
30603
30684
  function normalizeFieldValue(plan, value, ctx) {
30604
30685
  switch (plan.kind) {
30605
30686
  case "number":
@@ -30854,16 +30935,19 @@ function fieldPlanToZod(plan, options = {}) {
30854
30935
  const ctx = validationContext(options);
30855
30936
  return z.any().transform((value) => normalizeFieldValue(plan, value, ctx)).superRefine((value, zodCtx) => {
30856
30937
  for (const validationIssue of validateNormalizedFieldValue(plan, value, ctx)) {
30857
- addFieldIssueToZodContext(zodCtx, validationIssue);
30938
+ addFieldIssueToZodContext(zodCtx, validationIssue, plan.path);
30858
30939
  }
30859
30940
  });
30860
30941
  }
30861
- function addFieldIssueToZodContext(zodCtx, validationIssue) {
30942
+ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
30862
30943
  const message2 = fieldIssueToMessage(validationIssue);
30944
+ const path = relativeZodIssuePath(validationIssue.path, rootPath);
30945
+ const issuePath = path.length > 0 ? { path: toZodIssuePath(path) } : {};
30863
30946
  switch (validationIssue.kind) {
30864
30947
  case "required":
30865
30948
  if (validationIssue.emptyOrigin) {
30866
30949
  zodCtx.addIssue({
30950
+ ...issuePath,
30867
30951
  code: "too_small",
30868
30952
  origin: validationIssue.emptyOrigin,
30869
30953
  minimum: 1,
@@ -30872,10 +30956,11 @@ function addFieldIssueToZodContext(zodCtx, validationIssue) {
30872
30956
  });
30873
30957
  return;
30874
30958
  }
30875
- zodCtx.addIssue({ code: "invalid_type", expected: "nonoptional", message: message2 });
30959
+ zodCtx.addIssue({ ...issuePath, code: "invalid_type", expected: "nonoptional", message: message2 });
30876
30960
  return;
30877
30961
  case "tooLong":
30878
30962
  zodCtx.addIssue({
30963
+ ...issuePath,
30879
30964
  code: "too_big",
30880
30965
  origin: "string",
30881
30966
  maximum: validationIssue.maximum,
@@ -30884,7 +30969,7 @@ function addFieldIssueToZodContext(zodCtx, validationIssue) {
30884
30969
  });
30885
30970
  return;
30886
30971
  case "invalidOption":
30887
- zodCtx.addIssue({ code: "invalid_value", values: [], message: message2 });
30972
+ zodCtx.addIssue({ ...issuePath, code: "invalid_value", values: [], message: message2 });
30888
30973
  return;
30889
30974
  case "wrongType":
30890
30975
  case "invalidEmail":
@@ -30901,12 +30986,72 @@ function addFieldIssueToZodContext(zodCtx, validationIssue) {
30901
30986
  case "invalidMedia":
30902
30987
  case "invalidLink":
30903
30988
  case "invalidReference":
30904
- zodCtx.addIssue({ code: "custom", message: message2 });
30989
+ zodCtx.addIssue({ ...issuePath, code: "custom", message: message2 });
30905
30990
  return;
30906
30991
  default:
30907
30992
  assertNever4(validationIssue);
30908
30993
  }
30909
30994
  }
30995
+ function relativeZodIssuePath(path, rootPath) {
30996
+ return startsWithFieldPath(path, rootPath) ? path.slice(rootPath.length) : path;
30997
+ }
30998
+ function resolveFieldValidationDescriptor(plans, path) {
30999
+ const plan = findFieldValidationPlan(plans, path);
31000
+ return plan ? fieldValidationDescriptor(plan) : null;
31001
+ }
31002
+ function findFieldValidationPlan(plans, path) {
31003
+ for (const plan of plans) {
31004
+ if (sameFieldPath(plan.path, path)) {
31005
+ return plan;
31006
+ }
31007
+ const nested = findNestedFieldValidationPlan(plan, path);
31008
+ if (nested) {
31009
+ return nested;
31010
+ }
31011
+ }
31012
+ return null;
31013
+ }
31014
+ function findNestedFieldValidationPlan(plan, path) {
31015
+ switch (plan.kind) {
31016
+ case "group":
31017
+ return findFieldValidationPlan(plan.children, path);
31018
+ case "repeater": {
31019
+ const index2 = path[plan.path.length];
31020
+ if (typeof index2 !== "number") {
31021
+ return null;
31022
+ }
31023
+ const childPlans = plan.repeatedItemVariants ? plan.repeatedItemVariants.flatMap((variant) => variant.fields) : plan.repeatedItemPlan ?? [];
31024
+ const materialized = childPlans.map(
31025
+ (childPlan) => materializeRepeaterItemPlan(childPlan, plan.path, index2)
31026
+ );
31027
+ return findFieldValidationPlan(materialized, path);
31028
+ }
31029
+ case "string":
31030
+ case "number":
31031
+ case "boolean":
31032
+ case "richText":
31033
+ case "media":
31034
+ case "link":
31035
+ case "select":
31036
+ case "passthrough":
31037
+ return null;
31038
+ default:
31039
+ return assertNever4(plan);
31040
+ }
31041
+ }
31042
+ function fieldValidationDescriptor(plan) {
31043
+ return {
31044
+ path: plan.path,
31045
+ fieldPath: formatFieldPath(plan.path),
31046
+ fieldId: plan.fieldId,
31047
+ label: plan.label,
31048
+ fieldType: plan.fieldType,
31049
+ visibility: plan.visibility
31050
+ };
31051
+ }
31052
+ function sameFieldPath(left, right) {
31053
+ return left.length === right.length && left.every((segment, index2) => segment === right[index2]);
31054
+ }
30910
31055
  function compilePattern(pattern) {
30911
31056
  try {
30912
31057
  return new RegExp(pattern);
@@ -30981,24 +31126,33 @@ function preprocessEmptyValues(content) {
30981
31126
  }
30982
31127
  return result;
30983
31128
  }
30984
- function deriveContentZodFromManifest(manifestOrFields, options = {}) {
30985
- const shape = {};
30986
- const fields3 = Array.isArray(manifestOrFields) ? manifestOrFields : manifestOrFields.fields ?? [];
30987
- for (const field of fields3) {
30988
- shape[field.id] = buildFieldSchema(field, options);
30989
- }
30990
- return z.object(shape).catchall(z.unknown()).passthrough();
30991
- }
30992
31129
  function createManifestValidator(manifestOrFields, options = {}) {
30993
31130
  const isDraft = options.mode === "draft";
30994
- const baseSchema = deriveContentZodFromManifest(manifestOrFields, options);
31131
+ const plans = derivePlansFromManifestOrFields(manifestOrFields);
31132
+ const baseSchema = deriveContentZodFromPlans(plans, options);
30995
31133
  if (isDraft) {
30996
- return z.preprocess(preprocessEmptyValues, baseSchema);
31134
+ return z.preprocess(
31135
+ (content) => preprocessEmptyValues(
31136
+ normalizeStoredContentValues(plans, content, options)
31137
+ ),
31138
+ baseSchema
31139
+ );
30997
31140
  }
30998
- return baseSchema;
31141
+ return z.preprocess(
31142
+ (content) => normalizeStoredContentValues(plans, content, options),
31143
+ baseSchema
31144
+ );
30999
31145
  }
31000
- function buildFieldSchema(field, options) {
31001
- return fieldPlanToZod(deriveFieldValidationPlan(field), options);
31146
+ function deriveContentZodFromPlans(plans, options) {
31147
+ const shape = {};
31148
+ for (const plan of plans) {
31149
+ shape[plan.fieldId] = fieldPlanToZod(plan, options);
31150
+ }
31151
+ return z.object(shape).catchall(z.unknown()).passthrough();
31152
+ }
31153
+ function derivePlansFromManifestOrFields(manifestOrFields) {
31154
+ const fields3 = Array.isArray(manifestOrFields) ? manifestOrFields : manifestOrFields.fields ?? [];
31155
+ return deriveFieldValidationPlans(fields3);
31002
31156
  }
31003
31157
 
31004
31158
  // ../blocks/src/system/manifest/variantKey.ts
@@ -49037,7 +49191,7 @@ var cardStylingFields = [
49037
49191
  description: "Text for the event action button",
49038
49192
  required: false,
49039
49193
  multiline: false,
49040
- defaultValue: "View event",
49194
+ defaultValue: "Book now",
49041
49195
  maxLength: 40
49042
49196
  }
49043
49197
  ];
@@ -49528,6 +49682,7 @@ var eventRegistrationBlockDefinition = {
49528
49682
  limit: "50",
49529
49683
  // Get more events for selection
49530
49684
  stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
49685
+ readProfile: "registration",
49531
49686
  // When rendering on an event content entry page, scope the list to that entry so
49532
49687
  // the wizard always includes the current event (and avoids stale cached "all events" responses).
49533
49688
  entryId: { $bind: { from: "$root.contentEntry._entryId", fallback: "" } }
@@ -50449,7 +50604,7 @@ var eventSpotlightLayout = [
50449
50604
  columns: { $bind: { from: "content.columns", fallback: "3" } },
50450
50605
  cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
50451
50606
  buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
50452
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
50607
+ buttonText: { $bind: { from: "content.buttonText", fallback: "Book now" } },
50453
50608
  ctaLabel: { $bind: { from: "content.ctaLabel" } },
50454
50609
  ctaUrl: { $bind: { from: "content.ctaUrl", transforms: [{ id: "links.resolve" }] } },
50455
50610
  showVenue: { $bind: { from: "content.showVenue" } },
@@ -50493,7 +50648,8 @@ var eventSpotlightBlockDefinition = {
50493
50648
  siteId: { $bind: { from: "$root.siteId" } },
50494
50649
  limit: { $bind: { from: "content.maxEvents", fallback: "3" } },
50495
50650
  stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
50496
- detailLevel: "listing"
50651
+ detailLevel: "listing",
50652
+ readProfile: "spotlight"
50497
50653
  },
50498
50654
  mode: "server"
50499
50655
  }
@@ -50985,7 +51141,7 @@ var COLUMN_CLASSES = {
50985
51141
  };
50986
51142
  function getContainerClass(layout, columns) {
50987
51143
  if (layout === "compact") {
50988
- return "rb-flex rb-flex-col rb-gap-2";
51144
+ return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
50989
51145
  }
50990
51146
  if (layout === "stack") {
50991
51147
  return "rb-flex rb-flex-col rb-gap-6";
@@ -51116,7 +51272,7 @@ function formatEventPrice(event) {
51116
51272
  }
51117
51273
  function resolveEventCta(event, buttonText) {
51118
51274
  const { isFull: isSoldOut } = getEventAvailability(event);
51119
- const defaultButtonText = event.kind === "course_session" ? "View course" : "View event";
51275
+ const defaultButtonText = event.kind === "course_session" ? "Book course" : "Book now";
51120
51276
  const effectiveButtonText = buttonText ?? defaultButtonText;
51121
51277
  if (isSoldOut) {
51122
51278
  return { label: "Sold out", href: event.path, hidden: true };
@@ -52703,7 +52859,7 @@ var eventListingBlockRuntime = defineProgressiveBlockRuntime({
52703
52859
  containerClass: getContainerClass(layout, source.columns ?? "3"),
52704
52860
  cardVariant: source.cardVariant ?? "default",
52705
52861
  buttonVariant: source.buttonVariant ?? "primary",
52706
- buttonText: source.buttonText ?? "View event",
52862
+ buttonText: source.buttonText ?? "Book now",
52707
52863
  showVenue: source.showVenue ?? true,
52708
52864
  showMap: source.showMap ?? true,
52709
52865
  showCapacity: source.showCapacity ?? true,
@@ -52934,7 +53090,7 @@ var eventListingLayout = [
52934
53090
  loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
52935
53091
  cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
52936
53092
  buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
52937
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
53093
+ buttonText: { $bind: { from: "content.buttonText", fallback: "Book now" } },
52938
53094
  showVenue: { $bind: { from: "content.showVenue" } },
52939
53095
  showMap: { $bind: { from: "content.showMap" } },
52940
53096
  showCapacity: { $bind: { from: "content.showCapacity" } },
@@ -52984,6 +53140,7 @@ var eventListingBlockDefinition = {
52984
53140
  limit: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
52985
53141
  stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
52986
53142
  detailLevel: "listing",
53143
+ readProfile: { $bind: { from: "content.layout", fallback: "listing-card" } },
52987
53144
  kind: { $bind: { from: "content.kind" } },
52988
53145
  eventSurface: { $bind: { from: "content.eventSurface" } },
52989
53146
  eventPresets: {
@@ -53115,7 +53272,7 @@ function buildEventCalendarDisplay(source) {
53115
53272
  ),
53116
53273
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
53117
53274
  buttonVariant: source.buttonVariant ?? "primary",
53118
- buttonText: source.buttonText ?? "View event",
53275
+ buttonText: source.buttonText ?? "Book now",
53119
53276
  showVenue: source.showVenue ?? true,
53120
53277
  showMap: source.showMap ?? true,
53121
53278
  showCapacity: source.showCapacity ?? true,
@@ -53323,7 +53480,7 @@ var eventCalendarLayout = [
53323
53480
  $bind: { from: "content.buttonVariant", fallback: "primary" }
53324
53481
  },
53325
53482
  buttonText: {
53326
- $bind: { from: "content.buttonText", fallback: "View event" }
53483
+ $bind: { from: "content.buttonText", fallback: "Book now" }
53327
53484
  },
53328
53485
  emptyMessage: { $bind: { from: "content.emptyMessage" } }
53329
53486
  })
@@ -53777,6 +53934,7 @@ var eventCalendarBlockDefinition = {
53777
53934
  limit: 100,
53778
53935
  stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
53779
53936
  detailLevel: "listing",
53937
+ readProfile: { $bind: { from: "content.variant", fallback: "listing-card" } },
53780
53938
  // Pass filter params if configured
53781
53939
  kind: { $bind: { from: "content.kind" } },
53782
53940
  eventSurface: { $bind: { from: "content.eventSurface" } },
@@ -59802,9 +59960,9 @@ function getEmbedUrl(info) {
59802
59960
  const kind = info.kind ?? "p";
59803
59961
  return `https://www.instagram.com/${kind}/${info.id}/embed`;
59804
59962
  }
59805
- default:
59806
- return "";
59807
59963
  }
59964
+ const exhaustive = info.provider;
59965
+ return exhaustive;
59808
59966
  }
59809
59967
  function getThumbnailUrl(info) {
59810
59968
  switch (info.provider) {
@@ -59814,9 +59972,20 @@ function getThumbnailUrl(info) {
59814
59972
  return `https://vumbnail.com/${info.id}.jpg`;
59815
59973
  case "instagram":
59816
59974
  return "";
59817
- default:
59818
- return "";
59819
59975
  }
59976
+ const exhaustive = info.provider;
59977
+ return exhaustive;
59978
+ }
59979
+ function getVideoEmbedLoadingStrategy(provider) {
59980
+ switch (provider) {
59981
+ case "youtube":
59982
+ case "vimeo":
59983
+ return "native-lazy";
59984
+ case "instagram":
59985
+ return "defer-until-near-viewport";
59986
+ }
59987
+ const exhaustive = provider;
59988
+ return exhaustive;
59820
59989
  }
59821
59990
  function getVideoEmbed(url) {
59822
59991
  const info = parseVideoUrl(url);
@@ -59871,35 +60040,43 @@ var VideoEmbedNode = ({
59871
60040
  );
59872
60041
  }
59873
60042
  const title = getVideoTitle(embedInfo);
59874
- return /* @__PURE__ */ jsx("div", { ...rest, children: /* @__PURE__ */ jsx(
60043
+ const loadingStrategy = getVideoEmbedLoadingStrategy(embedInfo.provider);
60044
+ const shouldDeferSrc = loadingStrategy === "defer-until-near-viewport";
60045
+ return /* @__PURE__ */ jsx("div", { ...rest, children: /* @__PURE__ */ jsxs(
59875
60046
  "div",
59876
60047
  {
59877
60048
  className,
60049
+ "data-rb-video-embed-wrapper": shouldDeferSrc ? "true" : void 0,
59878
60050
  style: {
59879
60051
  ...style2,
59880
60052
  aspectRatio: resolvedAspectRatio,
59881
60053
  position: "relative",
59882
60054
  width: "100%"
59883
60055
  },
59884
- children: /* @__PURE__ */ jsx(
59885
- "iframe",
59886
- {
59887
- src: embedInfo.embedUrl,
59888
- title,
59889
- style: {
59890
- position: "absolute",
59891
- top: 0,
59892
- left: 0,
59893
- width: "100%",
59894
- height: "100%",
59895
- border: "none"
59896
- },
59897
- loading: "lazy",
59898
- allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",
59899
- referrerPolicy: "no-referrer-when-downgrade",
59900
- allowFullScreen: true
59901
- }
59902
- )
60056
+ children: [
60057
+ /* @__PURE__ */ jsx(
60058
+ "iframe",
60059
+ {
60060
+ src: shouldDeferSrc ? void 0 : embedInfo.embedUrl,
60061
+ title,
60062
+ loading: "lazy",
60063
+ "data-rb-video-embed-deferred": shouldDeferSrc ? "true" : void 0,
60064
+ "data-rb-video-embed-src": shouldDeferSrc ? embedInfo.embedUrl : void 0,
60065
+ style: {
60066
+ position: "absolute",
60067
+ top: 0,
60068
+ left: 0,
60069
+ width: "100%",
60070
+ height: "100%",
60071
+ border: "none"
60072
+ },
60073
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",
60074
+ referrerPolicy: "no-referrer-when-downgrade",
60075
+ allowFullScreen: true
60076
+ }
60077
+ ),
60078
+ shouldDeferSrc ? /* @__PURE__ */ jsx("noscript", { children: /* @__PURE__ */ jsx("a", { href: embedInfo.url, children: "View on Instagram" }) }) : null
60079
+ ]
59903
60080
  }
59904
60081
  ) });
59905
60082
  };
@@ -59914,9 +60091,9 @@ function getVideoTitle(info) {
59914
60091
  const label = kind === "reel" ? "reel" : kind === "tv" ? "video" : "post";
59915
60092
  return `Instagram ${label} ${info.id}`;
59916
60093
  }
59917
- default:
59918
- return "Embedded video";
59919
60094
  }
60095
+ const exhaustive = info.provider;
60096
+ return exhaustive;
59920
60097
  }
59921
60098
  function getAspectRatio(propAspectRatio, style2) {
59922
60099
  const styleAspectRatio = style2?.aspectRatio;
@@ -60159,10 +60336,15 @@ var HeaderSectionNode = ({
60159
60336
  blockId,
60160
60337
  children,
60161
60338
  className,
60339
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
60162
60340
  ...rest
60163
60341
  }) => {
60164
60342
  const { wrapperClasses, sectionClasses } = splitPositioningClasses(className);
60165
- const wrapperClassName = `block-site-header${wrapperClasses ? ` ${wrapperClasses}` : ""}`;
60343
+ const wrapperClassName = [
60344
+ "block-site-header",
60345
+ wrapperClasses,
60346
+ previewSiteChromeSurface ? "group/site-chrome rb-relative" : ""
60347
+ ].filter(Boolean).join(" ");
60166
60348
  const asProp = rest.as;
60167
60349
  const styleProp = rest.style;
60168
60350
  const backgroundProp = typeof rest.background === "string" ? rest.background : void 0;
@@ -60178,6 +60360,7 @@ var HeaderSectionNode = ({
60178
60360
  "data-block": "site-header",
60179
60361
  "data-block-kind": "block.site-header",
60180
60362
  "data-block-id": blockId ?? void 0,
60363
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
60181
60364
  children: [
60182
60365
  /* @__PURE__ */ jsx(IslandPropsScript, { value: { enabled: hasShrinkClasses(className) } }),
60183
60366
  /* @__PURE__ */ jsx(
@@ -61810,7 +61993,7 @@ var EventSpotlight = ({
61810
61993
  columns = "3",
61811
61994
  cardVariant = "default",
61812
61995
  buttonVariant = "primary",
61813
- buttonText = "View event",
61996
+ buttonText = "Book now",
61814
61997
  ctaLabel,
61815
61998
  ctaUrl,
61816
61999
  showVenue = true,
@@ -61956,7 +62139,7 @@ function buildEventCombinedDisplay(source) {
61956
62139
  showMap: source.showMap ?? true,
61957
62140
  showCapacity: source.showCapacity ?? true,
61958
62141
  buttonVariant: source.buttonVariant ?? "primary",
61959
- buttonText: source.buttonText ?? "View event",
62142
+ buttonText: source.buttonText ?? "Book now",
61960
62143
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
61961
62144
  };
61962
62145
  }
@@ -78456,6 +78639,11 @@ var containerResponsiveThemeCss = `/*
78456
78639
  * Dense row layout for event-calendar compact list mode
78457
78640
  * ============================================================================= */
78458
78641
 
78642
+ :where(.theme-scope) .event-listing-compact-container {
78643
+ width: min(100%, 56rem);
78644
+ margin-inline: auto;
78645
+ }
78646
+
78459
78647
  :where(.theme-scope) .event-compact-row {
78460
78648
  display: flex;
78461
78649
  align-items: center;
@@ -80403,16 +80591,24 @@ function validateBlockManifestIssues(manifest, values, mode) {
80403
80591
  return result.error.issues.map(withNormalizedManifestMessage);
80404
80592
  }
80405
80593
  function validateBlockManifest(manifest, values, mode) {
80594
+ const plans = getManifestValidationCacheEntry(manifest).plans;
80406
80595
  return validateBlockManifestIssues(manifest, values, mode).map((issue2) => {
80407
80596
  const path = normalizeIssuePath(issue2.path);
80597
+ const fieldDescriptor = resolveFieldValidationDescriptor(plans, path);
80408
80598
  return {
80409
80599
  code: issue2.code,
80410
80600
  path,
80411
80601
  fieldPath: normalizePathString(path),
80602
+ fieldDescriptor,
80603
+ isFieldVisibleInSidebar: isValidationFieldVisibleInSidebar(fieldDescriptor),
80412
80604
  message: issue2.message
80413
80605
  };
80414
80606
  });
80415
80607
  }
80608
+ function isValidationFieldVisibleInSidebar(descriptor) {
80609
+ if (!descriptor) return true;
80610
+ return descriptor.visibility.kind === "visible";
80611
+ }
80416
80612
  function normalizeManifestIssueMessage(issue2) {
80417
80613
  switch (issue2.code) {
80418
80614
  case "invalid_type":
@@ -80431,8 +80627,8 @@ function normalizeManifestIssueMessage(issue2) {
80431
80627
  }
80432
80628
  }
80433
80629
  function getManifestValidation(manifest, mode) {
80434
- const cached = manifestValidationCache.get(manifest);
80435
- const existing = cached?.[mode];
80630
+ const cached = getManifestValidationCacheEntry(manifest);
80631
+ const existing = cached.validators[mode];
80436
80632
  if (existing) {
80437
80633
  return existing;
80438
80634
  }
@@ -80440,10 +80636,19 @@ function getManifestValidation(manifest, mode) {
80440
80636
  allowNull: false,
80441
80637
  mode
80442
80638
  });
80443
- manifestValidationCache.set(manifest, {
80444
- ...cached,
80445
- [mode]: created
80446
- });
80639
+ cached.validators[mode] = created;
80640
+ return created;
80641
+ }
80642
+ function getManifestValidationCacheEntry(manifest) {
80643
+ const cached = manifestValidationCache.get(manifest);
80644
+ if (cached) {
80645
+ return cached;
80646
+ }
80647
+ const created = {
80648
+ plans: deriveFieldValidationPlans(manifest.fields ?? []),
80649
+ validators: {}
80650
+ };
80651
+ manifestValidationCache.set(manifest, created);
80447
80652
  return created;
80448
80653
  }
80449
80654
  function normalizeIssuePath(path) {
@@ -82031,6 +82236,8 @@ function deriveBlockedPublishPlan({
82031
82236
  if (!firstError) {
82032
82237
  return { type: "allowed" };
82033
82238
  }
82239
+ const focusError = validationErrors.find((error) => error.isFieldVisibleInSidebar) ?? firstError;
82240
+ const focusFieldPath = focusError.isFieldVisibleInSidebar ? focusError.fieldPath || null : null;
82034
82241
  return {
82035
82242
  type: "blocked",
82036
82243
  invalidBlockIds,
@@ -82039,8 +82246,8 @@ function deriveBlockedPublishPlan({
82039
82246
  reveal: "show-validation"
82040
82247
  })),
82041
82248
  focusTarget: {
82042
- blockId: firstError.blockId,
82043
- fieldPath: firstError.fieldPath || null
82249
+ blockId: focusError.blockId,
82250
+ fieldPath: focusFieldPath
82044
82251
  },
82045
82252
  message: invalidBlockIds.length === 1 ? {
82046
82253
  type: "single-invalid-block",
@@ -82099,9 +82306,12 @@ function validateAllBlocks(uiStore) {
82099
82306
  blockId: snapshot.id,
82100
82307
  blockKind: snapshot.meta.kind,
82101
82308
  fieldPath: issue2.fieldPath,
82309
+ fieldDescriptor: issue2.fieldDescriptor,
82310
+ isFieldVisibleInSidebar: issue2.isFieldVisibleInSidebar,
82102
82311
  fieldLabel: getFieldLabelFromManifest(
82103
82312
  definition.manifest,
82104
- issue2.path
82313
+ issue2.path,
82314
+ issue2.fieldDescriptor
82105
82315
  ),
82106
82316
  message: issue2.message
82107
82317
  });
@@ -82110,7 +82320,8 @@ function validateAllBlocks(uiStore) {
82110
82320
  }
82111
82321
  return errors;
82112
82322
  }
82113
- function getFieldLabelFromManifest(manifest, path) {
82323
+ function getFieldLabelFromManifest(manifest, path, descriptor) {
82324
+ if (descriptor) return descriptor.label;
82114
82325
  if (path.length === 0) return "Unknown field";
82115
82326
  const fieldId = path[0];
82116
82327
  if (typeof fieldId !== "string") return String(fieldId);
@@ -106052,7 +106263,7 @@ var DEFAULT_VALUE_BUILDERS = {
106052
106263
  contentTypeSelect: getContentTypeSelectFieldDefault,
106053
106264
  entryPicker: getEntryPickerFieldDefault
106054
106265
  };
106055
- function buildFieldSchema2(field, ctx) {
106266
+ function buildFieldSchema(field, ctx) {
106056
106267
  const builder = SCHEMA_BUILDERS[field.type];
106057
106268
  if (!builder) {
106058
106269
  console.warn(`No schema builder registered for field type: ${field.type}`);
@@ -106158,10 +106369,10 @@ function isFieldVisible(field, role) {
106158
106369
  function buildValidationSchema(fields3) {
106159
106370
  const shape = {};
106160
106371
  const ctx = {
106161
- getFieldSchema: (field) => buildFieldSchema2(field, ctx)
106372
+ getFieldSchema: (field) => buildFieldSchema(field, ctx)
106162
106373
  };
106163
106374
  for (const field of fields3) {
106164
- shape[field.id] = buildFieldSchema2(field, ctx);
106375
+ shape[field.id] = buildFieldSchema(field, ctx);
106165
106376
  }
106166
106377
  return z.object(shape).catchall(z.unknown()).passthrough();
106167
106378
  }
@@ -109380,6 +109591,7 @@ function clearBookingFieldError(errors, fieldId) {
109380
109591
  function createInitialBookingFlowReducerState(input) {
109381
109592
  const initialData = input.initialData ?? {};
109382
109593
  return {
109594
+ phase: "editing",
109383
109595
  currentStepId: "service-selection",
109384
109596
  selectedServiceId: toOptionalAppointmentServiceId(
109385
109597
  toOptionalString(initialData.serviceId) ?? input.defaultServiceId
@@ -109400,8 +109612,7 @@ function createInitialBookingFlowReducerState(input) {
109400
109612
  ),
109401
109613
  altchaSolution: null,
109402
109614
  validationErrors: createEmptyBookingValidationErrors(),
109403
- feedback: { kind: "none" },
109404
- isSubmitting: false
109615
+ feedback: { kind: "none" }
109405
109616
  };
109406
109617
  }
109407
109618
  function collectInitialFieldValues(initialData) {
@@ -109528,8 +109739,15 @@ function bookingFlowReducer(state, event) {
109528
109739
  case "validation-errors-set":
109529
109740
  return { ...state, validationErrors: event.errors };
109530
109741
  case "feedback-set":
109531
- return { ...state, feedback: event.feedback };
109742
+ return {
109743
+ ...state,
109744
+ phase: event.feedback.kind === "success" ? "completed" : "editing",
109745
+ feedback: event.feedback
109746
+ };
109532
109747
  case "availability-selection-invalidated":
109748
+ if (state.phase !== "editing") {
109749
+ return state;
109750
+ }
109533
109751
  return {
109534
109752
  ...state,
109535
109753
  currentStepId: "datetime-selection",
@@ -109543,11 +109761,11 @@ function bookingFlowReducer(state, event) {
109543
109761
  validationErrors: clearBookingFormError(state.validationErrors)
109544
109762
  };
109545
109763
  case "feedback-cleared":
109546
- return { ...state, feedback: { kind: "none" } };
109764
+ return { ...state, phase: "editing", feedback: { kind: "none" } };
109547
109765
  case "submission-started":
109548
- return { ...state, isSubmitting: true };
109766
+ return { ...state, phase: "submitting" };
109549
109767
  case "submission-finished":
109550
- return { ...state, isSubmitting: false };
109768
+ return state.phase === "submitting" ? { ...state, phase: "editing" } : state;
109551
109769
  case "reset":
109552
109770
  return event.initial;
109553
109771
  default:
@@ -109982,8 +110200,8 @@ function toHeadlessEligibleAppointmentPackage(appointmentPackage) {
109982
110200
  };
109983
110201
  }
109984
110202
  function resolveHeadlessBookingStatus(input) {
109985
- if (input.isSubmitting) return { tag: "submitting" };
109986
- if (input.feedback.kind === "success") {
110203
+ if (input.phase === "submitting") return { tag: "submitting" };
110204
+ if (input.phase === "completed" && input.feedback.kind === "success") {
109987
110205
  return {
109988
110206
  tag: "success",
109989
110207
  resourceName: input.feedback.resourceName
@@ -110142,6 +110360,7 @@ function useHeadlessBookingFlow(options) {
110142
110360
  [availableDates]
110143
110361
  );
110144
110362
  useEffect(() => {
110363
+ if (state.phase !== "editing") return;
110145
110364
  const canEvaluateDate = availabilityDatesQuery.ok && Boolean(availableDatesLoadedRange) && !isLoadingDates && !datesError;
110146
110365
  const canEvaluateSlot = !state.selectedSlot || availabilitySlotsQuery.ok && hasLoadedSlots && !isLoadingSlots && !slotsError;
110147
110366
  if (!canEvaluateDate || !canEvaluateSlot) return;
@@ -110167,6 +110386,7 @@ function useHeadlessBookingFlow(options) {
110167
110386
  isLoadingSlots,
110168
110387
  slotViews,
110169
110388
  slotsError,
110389
+ state.phase,
110170
110390
  state.selectedDate,
110171
110391
  state.selectedSlot
110172
110392
  ]);
@@ -110327,7 +110547,7 @@ function useHeadlessBookingFlow(options) {
110327
110547
  const submitBooking = useCallback(
110328
110548
  async (submitOptions) => {
110329
110549
  const latest = latestRef.current;
110330
- if (submittingRef.current || latest.state.isSubmitting) {
110550
+ if (submittingRef.current || latest.state.phase === "submitting") {
110331
110551
  return {
110332
110552
  ok: false,
110333
110553
  reason: "blocked",
@@ -110523,7 +110743,7 @@ function useHeadlessBookingFlow(options) {
110523
110743
  const spamProtectionEnabled = options.spamProtectionEnabled ?? isSpamProtectionEnabled();
110524
110744
  const status = resolveHeadlessBookingStatus({
110525
110745
  feedback: state.feedback,
110526
- isSubmitting: state.isSubmitting
110746
+ phase: state.phase
110527
110747
  });
110528
110748
  const view = resolveHeadlessBookingView({
110529
110749
  form: options.form,
@@ -120057,6 +120277,7 @@ var HeaderSectionNode2 = ({
120057
120277
  pathBase,
120058
120278
  children,
120059
120279
  className: originalClassName,
120280
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
120060
120281
  ...restProps
120061
120282
  }) => {
120062
120283
  const rootRef = useRef(null);
@@ -120064,7 +120285,11 @@ var HeaderSectionNode2 = ({
120064
120285
  () => splitPositioningClasses(originalClassName),
120065
120286
  [originalClassName]
120066
120287
  );
120067
- const wrapperClassName = `block-site-header${wrapperClasses ? ` ${wrapperClasses}` : ""}`;
120288
+ const wrapperClassName = [
120289
+ "block-site-header",
120290
+ wrapperClasses,
120291
+ previewSiteChromeSurface ? "group/site-chrome rb-relative" : ""
120292
+ ].filter(Boolean).join(" ");
120068
120293
  const hasShrinkClasses2 = useMemo(
120069
120294
  () => Boolean(sectionClasses?.includes("rb-header-shrink")),
120070
120295
  [sectionClasses]
@@ -120097,6 +120322,7 @@ var HeaderSectionNode2 = ({
120097
120322
  "data-block-content": blockContent ? "true" : void 0,
120098
120323
  "data-fragment-registry": fragmentRegistry2 ? "true" : void 0,
120099
120324
  "data-path-base": typeof pathBase === "string" ? pathBase : void 0,
120325
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
120100
120326
  children: /* @__PURE__ */ jsx(
120101
120327
  Section_default,
120102
120328
  {
@@ -121537,7 +121763,7 @@ var EventCombinedClient = ({
121537
121763
  showCapacity,
121538
121764
  // Styling
121539
121765
  buttonVariant = "primary",
121540
- buttonText = "View event",
121766
+ buttonText = "Book now",
121541
121767
  emptyMessage = "No upcoming events scheduled.",
121542
121768
  className
121543
121769
  }) => {
@@ -162940,7 +163166,6 @@ var PreviewRichTextEditorInner = ({
162940
163166
  toolbarTone: "dark",
162941
163167
  toolbarPortalToChrome: false,
162942
163168
  hideToolbar: true,
162943
- onClick: () => editor?.chain().focus().run(),
162944
163169
  renderContent: (content) => /* @__PURE__ */ jsx(
162945
163170
  "div",
162946
163171
  {