@riverbankcms/sdk 0.74.0 → 0.76.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 (145) hide show
  1. package/README.md +2 -0
  2. package/dist/{PreviewEditorSidebar-5XL7M3OM.mjs → PreviewEditorSidebar-X2HWXFOL.mjs} +172 -89
  3. package/dist/{PreviewEditorUI-ZDFRDJID.mjs → PreviewEditorUI-AQXIXPOH.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-ZQNDCASH.mjs +8 -0
  5. package/dist/_dts/api/src/bookingOperations.d.ts +12 -0
  6. package/dist/_dts/api/src/cache-tags.d.ts +22 -0
  7. package/dist/_dts/api/src/contentRuntime.d.ts +1 -0
  8. package/dist/_dts/api/src/endpoints.d.ts +24 -24
  9. package/dist/_dts/api/src/index.d.ts +1 -1
  10. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +13 -4
  11. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +4 -2
  12. package/dist/_dts/block-form/src/client/index.d.ts +1 -1
  13. package/dist/_dts/block-form/src/manifest/utils.d.ts +24 -0
  14. package/dist/_dts/blocks/src/client/booking-form.d.ts +2 -0
  15. package/dist/_dts/blocks/src/client/carousel.d.ts +1 -0
  16. package/dist/_dts/blocks/src/client/course-registration.d.ts +2 -0
  17. package/dist/_dts/blocks/src/client/events.d.ts +6 -0
  18. package/dist/_dts/blocks/src/client/form.d.ts +2 -0
  19. package/dist/_dts/blocks/src/client/header.d.ts +1 -0
  20. package/dist/_dts/blocks/src/client/location-map.d.ts +1 -0
  21. package/dist/_dts/blocks/src/client/newsletter-form.d.ts +2 -0
  22. package/dist/_dts/blocks/src/client/shop.d.ts +6 -0
  23. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -4
  24. package/dist/_dts/blocks/src/lib/video.d.ts +2 -0
  25. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +21 -1
  26. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +7 -6
  27. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  28. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +3 -2
  29. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +3 -27
  30. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +163 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +5 -5
  32. package/dist/_dts/blocks/src/system/runtime/nodes/events/index.d.ts +3 -0
  33. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +1 -0
  34. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +1 -0
  35. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionCompactRow.d.ts +29 -0
  36. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionList.d.ts +13 -0
  37. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +4 -0
  38. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +4 -3
  39. package/dist/_dts/blocks/src/system/runtime/shared/utils/bookingRoute.d.ts +20 -0
  40. package/dist/_dts/blocks/src/system/runtime/shared/utils/index.d.ts +2 -1
  41. package/dist/_dts/blocks/src/system/types/link.d.ts +12 -0
  42. package/dist/_dts/content-editor/src/hooks/validateBlocksForPublish.d.ts +5 -0
  43. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +2 -0
  44. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +3 -1
  45. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +3 -1
  46. package/dist/_dts/editor-blocks/src/block-editor/BlockSettingsModal.d.ts +5 -1
  47. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -0
  48. package/dist/_dts/editor-blocks/src/block-editor/actionControlMode.d.ts +2 -0
  49. package/dist/_dts/editor-blocks/src/index.d.ts +1 -1
  50. package/dist/_dts/preview-next/src/client/preview/SiteChromeEditableSurface.d.ts +12 -2
  51. package/dist/_dts/preview-next/src/client/preview/themeOverlay.d.ts +21 -3
  52. package/dist/_dts/sdk/src/components.d.ts +2 -2
  53. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -0
  54. package/dist/_dts/sdk/src/rendering/index.d.ts +2 -2
  55. package/dist/_dts/sdk/src/rendering/islands/deferredVideoEmbeds.d.ts +2 -0
  56. package/dist/_dts/sdk/src/rendering/overrideResolution.d.ts +6 -0
  57. package/dist/_dts/sdk/src/rendering/overrides.d.ts +21 -1
  58. package/dist/_dts/sdk/src/rendering/server.d.ts +4 -0
  59. package/dist/_dts/sdk/src/version.d.ts +1 -1
  60. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  61. package/dist/{chunk-2MIWNFJM.mjs → chunk-LYI7TEMH.mjs} +494 -171
  62. package/dist/{chunk-YY7K3QD2.mjs → chunk-Q4OLG66B.mjs} +9 -9
  63. package/dist/{chunk-CEQBBLMJ.mjs → chunk-TW2Y4RR5.mjs} +69 -14
  64. package/dist/{chunk-CBD47MTM.mjs → chunk-V5VORNEJ.mjs} +2 -2
  65. package/dist/{chunk-7RX72SK2.mjs → chunk-VX7B5VAC.mjs} +36 -25
  66. package/dist/{chunk-YRJKZEQ3.mjs → chunk-Z7JLNTJR.mjs} +1 -1
  67. package/dist/cli/index.mjs +3395 -3753
  68. package/dist/client/{accordion-ZZVXWV3N.mjs → accordion-2YHIBOZH.mjs} +1 -1
  69. package/dist/client/bookingForm-35IBDWAS.mjs +3012 -0
  70. package/dist/client/bookings.mjs +30 -21
  71. package/dist/client/{carousel-25WK2H7G.mjs → carousel-K6XG7NZQ.mjs} +3 -2
  72. package/dist/client/cart-HCFYUTTU.mjs +18 -0
  73. package/dist/client/checkout-J3U4XR7K.mjs +18 -0
  74. package/dist/client/chunk-3DCJ45Z2.mjs +36 -0
  75. package/dist/client/chunk-3PEDD5KJ.mjs +146 -0
  76. package/dist/client/{chunk-6VGXRE34.mjs → chunk-7UOSCYY4.mjs} +76 -29
  77. package/dist/client/chunk-BOIHIU7E.mjs +106 -0
  78. package/dist/client/chunk-F7LHOKEH.mjs +146 -0
  79. package/dist/client/chunk-FGUIVT2B.mjs +204 -0
  80. package/dist/client/chunk-I2MMZO53.mjs +6 -0
  81. package/dist/client/chunk-II7O4XN3.mjs +2206 -0
  82. package/dist/client/chunk-J227A3CQ.mjs +245 -0
  83. package/dist/client/chunk-JEZECJ3W.mjs +383 -0
  84. package/dist/client/chunk-M3L3KYYR.mjs +1181 -0
  85. package/dist/client/chunk-OJPZEZU2.mjs +31 -0
  86. package/dist/client/chunk-PFBX3IQL.mjs +1378 -0
  87. package/dist/client/chunk-RTZ3JKKX.mjs +178 -0
  88. package/dist/client/chunk-SNSWVZEP.mjs +5592 -0
  89. package/dist/client/chunk-TQ5MSPDX.mjs +74 -0
  90. package/dist/client/chunk-YLMKMCSJ.mjs +86 -0
  91. package/dist/client/client.mjs +54052 -54518
  92. package/dist/client/courseRegistration-ZBXS7VGI.mjs +1737 -0
  93. package/dist/client/{eventCalendar-X6GIPYFM.mjs → eventCalendar-EQQZHJBA.mjs} +13 -2
  94. package/dist/client/{eventCombined-EZUOPM3G.mjs → eventCombined-JCFTGBFQ.mjs} +13 -2
  95. package/dist/client/eventDetails-HLUTQSYY.mjs +25 -0
  96. package/dist/client/{eventListing-HEFGAETC.mjs → eventListing-FG4MICVB.mjs} +13 -2
  97. package/dist/client/{eventRegistration-3LCP2V3P.mjs → eventRegistration-GUEB7LBT.mjs} +13 -2
  98. package/dist/client/form-YQEW4YIT.mjs +300 -0
  99. package/dist/client/headerSection-GTR3TTRM.mjs +729 -0
  100. package/dist/client/hooks.mjs +49 -33
  101. package/dist/client/locationMap-SPC7VGUH.mjs +227 -0
  102. package/dist/client/newsletterForm-4IW5BLID.mjs +208 -0
  103. package/dist/client/productDetail-KP5H2WJO.mjs +18 -0
  104. package/dist/client/productList-3M3M72XZ.mjs +18 -0
  105. package/dist/client/rendering/client.mjs +15580 -16277
  106. package/dist/client/rendering/islands.mjs +98 -21
  107. package/dist/client/rendering.mjs +48730 -49191
  108. package/dist/client/shop-ACQKVGOM.mjs +20 -0
  109. package/dist/preview-next/before-render.mjs +37 -25
  110. package/dist/preview-next/chrome.css +1 -1
  111. package/dist/preview-next/client/runtime.mjs +5 -5
  112. package/dist/preview-next/editor-base.css +2 -148
  113. package/dist/preview-next/editor-chrome.css +179 -0
  114. package/dist/preview-next/middleware.mjs +37 -25
  115. package/dist/{sdk-runtime-OHNONZ5U.mjs → sdk-runtime-K7HNB4U2.mjs} +6 -6
  116. package/dist/server/components.mjs +1294 -1103
  117. package/dist/server/config-validation.mjs +49 -33
  118. package/dist/server/config.mjs +49 -33
  119. package/dist/server/data.mjs +49 -33
  120. package/dist/server/index.mjs +45 -33
  121. package/dist/server/next.mjs +1240 -1050
  122. package/dist/server/page-converter.mjs +12 -8
  123. package/dist/server/prebuild.mjs +1 -1
  124. package/dist/server/rendering/server.mjs +1389 -1104
  125. package/dist/server/rendering.mjs +1300 -1109
  126. package/dist/server/routing.mjs +49 -33
  127. package/dist/server/server.mjs +50 -34
  128. package/dist/server/theme-bridge.mjs +5 -0
  129. package/dist/styles/index.css +5 -0
  130. package/package.json +2 -1
  131. package/dist/SdkPreviewModeRuntime-CRYNDSPL.mjs +0 -8
  132. package/dist/client/bookingForm-4X77HKDS.mjs +0 -34
  133. package/dist/client/cart-JWD2VRFU.mjs +0 -11
  134. package/dist/client/checkout-V7KYGWL7.mjs +0 -11
  135. package/dist/client/chunk-5IYGMTUE.mjs +0 -18614
  136. package/dist/client/chunk-RKCFVIMS.mjs +0 -26
  137. package/dist/client/courseRegistration-O6ZPK4YT.mjs +0 -29
  138. package/dist/client/eventDetails-3WODIXET.mjs +0 -14
  139. package/dist/client/form-AKXQMY6Z.mjs +0 -85
  140. package/dist/client/headerSection-5KHCMU6B.mjs +0 -12
  141. package/dist/client/locationMap-7HIADW76.mjs +0 -14
  142. package/dist/client/newsletterForm-5N4YTMU3.mjs +0 -60
  143. package/dist/client/productDetail-IZUA7ZP3.mjs +0 -11
  144. package/dist/client/productList-KWIIJE6I.mjs +0 -11
  145. 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 };
@@ -52533,6 +52689,37 @@ function pickReadableTextColor(background) {
52533
52689
  return "rgb(var(--tb-onAccent, 255 255 255))";
52534
52690
  }
52535
52691
  }
52692
+ function BookingOptionCompactRow({
52693
+ option,
52694
+ buttonVariant = "primary"
52695
+ }) {
52696
+ const primaryMeta = option.primaryMeta?.filter((item) => item.length > 0) ?? [];
52697
+ const secondaryMeta = option.secondaryMeta?.filter((item) => item.label.length > 0) ?? [];
52698
+ const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "sm" });
52699
+ return /* @__PURE__ */ jsxs("div", { className: "event-compact-row", children: [
52700
+ /* @__PURE__ */ jsxs("div", { className: "event-compact-row-content", children: [
52701
+ /* @__PURE__ */ jsxs("div", { className: "event-compact-row-top", children: [
52702
+ /* @__PURE__ */ jsx("span", { className: "event-compact-row-title", children: option.title }),
52703
+ primaryMeta.length > 0 && /* @__PURE__ */ jsx("span", { className: "event-compact-row-datetime", children: primaryMeta.join(" \xB7 ") })
52704
+ ] }),
52705
+ /* @__PURE__ */ jsxs("div", { className: "event-compact-row-bottom", children: [
52706
+ secondaryMeta.map((item) => /* @__PURE__ */ jsxs(
52707
+ "span",
52708
+ {
52709
+ className: item.className,
52710
+ children: [
52711
+ item.icon,
52712
+ item.label
52713
+ ]
52714
+ },
52715
+ item.id ?? `${item.className ?? "meta"}:${item.label}`
52716
+ )),
52717
+ option.priceLabel && /* @__PURE__ */ jsx("span", { className: "event-compact-row-price", children: option.priceLabel })
52718
+ ] })
52719
+ ] }),
52720
+ option.action.kind === "status" ? /* @__PURE__ */ jsx("span", { className: "event-compact-row-status", children: option.action.label }) : /* @__PURE__ */ jsx("a", { href: option.action.href, className: `${buttonClass} event-compact-row-cta`, children: option.action.label })
52721
+ ] });
52722
+ }
52536
52723
  var EventCompactRow = ({
52537
52724
  event,
52538
52725
  buttonVariant = "primary",
@@ -52544,28 +52731,31 @@ var EventCompactRow = ({
52544
52731
  const price = formatEventPrice(event);
52545
52732
  const teacherLine = formatEventTeacherLine(event);
52546
52733
  const cta = resolveEventCta(event, buttonText);
52547
- const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "sm" });
52548
- return /* @__PURE__ */ jsxs("div", { className: "event-compact-row", children: [
52549
- /* @__PURE__ */ jsxs("div", { className: "event-compact-row-content", children: [
52550
- /* @__PURE__ */ jsxs("div", { className: "event-compact-row-top", children: [
52551
- /* @__PURE__ */ jsx("span", { className: "event-compact-row-title", children: event.title }),
52552
- /* @__PURE__ */ jsxs("span", { className: "event-compact-row-datetime", children: [
52553
- formattedDate,
52554
- " \xB7 ",
52555
- formattedTime
52556
- ] })
52557
- ] }),
52558
- /* @__PURE__ */ jsxs("div", { className: "event-compact-row-bottom", children: [
52559
- event.venue && /* @__PURE__ */ jsxs("span", { className: "event-compact-row-venue", children: [
52560
- /* @__PURE__ */ jsx(MapPinIcon, { className: "rb-shrink-0" }),
52561
- event.venue.name
52562
- ] }),
52563
- teacherLine && /* @__PURE__ */ jsx("span", { className: "event-compact-row-teacher", children: teacherLine }),
52564
- /* @__PURE__ */ jsx("span", { className: "event-compact-row-price", children: price })
52565
- ] })
52566
- ] }),
52567
- cta.hidden ? /* @__PURE__ */ jsx("span", { className: "event-compact-row-status", children: cta.label }) : /* @__PURE__ */ jsx("a", { href: cta.href, className: `${buttonClass} event-compact-row-cta`, children: cta.label })
52568
- ] });
52734
+ const option = {
52735
+ id: event.occurrenceId ?? event.id,
52736
+ title: event.title,
52737
+ primaryMeta: [formattedDate, formattedTime],
52738
+ secondaryMeta: [
52739
+ ...event.venue ? [
52740
+ {
52741
+ id: "venue",
52742
+ label: event.venue.name,
52743
+ icon: /* @__PURE__ */ jsx(MapPinIcon, { className: "rb-shrink-0" }),
52744
+ className: "event-compact-row-venue"
52745
+ }
52746
+ ] : [],
52747
+ ...teacherLine ? [
52748
+ {
52749
+ id: "teacher",
52750
+ label: teacherLine,
52751
+ className: "event-compact-row-teacher"
52752
+ }
52753
+ ] : []
52754
+ ],
52755
+ priceLabel: price,
52756
+ action: cta.hidden ? { kind: "status", label: cta.label } : { kind: "action", label: cta.label, href: cta.href }
52757
+ };
52758
+ return /* @__PURE__ */ jsx(BookingOptionCompactRow, { buttonVariant, option });
52569
52759
  };
52570
52760
  var EmptyState = ({
52571
52761
  message: message2 = "No upcoming events scheduled.",
@@ -52703,7 +52893,7 @@ var eventListingBlockRuntime = defineProgressiveBlockRuntime({
52703
52893
  containerClass: getContainerClass(layout, source.columns ?? "3"),
52704
52894
  cardVariant: source.cardVariant ?? "default",
52705
52895
  buttonVariant: source.buttonVariant ?? "primary",
52706
- buttonText: source.buttonText ?? "View event",
52896
+ buttonText: source.buttonText ?? "Book now",
52707
52897
  showVenue: source.showVenue ?? true,
52708
52898
  showMap: source.showMap ?? true,
52709
52899
  showCapacity: source.showCapacity ?? true,
@@ -52934,7 +53124,7 @@ var eventListingLayout = [
52934
53124
  loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
52935
53125
  cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
52936
53126
  buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
52937
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
53127
+ buttonText: { $bind: { from: "content.buttonText", fallback: "Book now" } },
52938
53128
  showVenue: { $bind: { from: "content.showVenue" } },
52939
53129
  showMap: { $bind: { from: "content.showMap" } },
52940
53130
  showCapacity: { $bind: { from: "content.showCapacity" } },
@@ -52984,6 +53174,7 @@ var eventListingBlockDefinition = {
52984
53174
  limit: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
52985
53175
  stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
52986
53176
  detailLevel: "listing",
53177
+ readProfile: { $bind: { from: "content.layout", fallback: "listing-card" } },
52987
53178
  kind: { $bind: { from: "content.kind" } },
52988
53179
  eventSurface: { $bind: { from: "content.eventSurface" } },
52989
53180
  eventPresets: {
@@ -53115,7 +53306,7 @@ function buildEventCalendarDisplay(source) {
53115
53306
  ),
53116
53307
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
53117
53308
  buttonVariant: source.buttonVariant ?? "primary",
53118
- buttonText: source.buttonText ?? "View event",
53309
+ buttonText: source.buttonText ?? "Book now",
53119
53310
  showVenue: source.showVenue ?? true,
53120
53311
  showMap: source.showMap ?? true,
53121
53312
  showCapacity: source.showCapacity ?? true,
@@ -53323,7 +53514,7 @@ var eventCalendarLayout = [
53323
53514
  $bind: { from: "content.buttonVariant", fallback: "primary" }
53324
53515
  },
53325
53516
  buttonText: {
53326
- $bind: { from: "content.buttonText", fallback: "View event" }
53517
+ $bind: { from: "content.buttonText", fallback: "Book now" }
53327
53518
  },
53328
53519
  emptyMessage: { $bind: { from: "content.emptyMessage" } }
53329
53520
  })
@@ -53777,6 +53968,7 @@ var eventCalendarBlockDefinition = {
53777
53968
  limit: 100,
53778
53969
  stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
53779
53970
  detailLevel: "listing",
53971
+ readProfile: { $bind: { from: "content.variant", fallback: "listing-card" } },
53780
53972
  // Pass filter params if configured
53781
53973
  kind: { $bind: { from: "content.kind" } },
53782
53974
  eventSurface: { $bind: { from: "content.eventSurface" } },
@@ -59802,9 +59994,9 @@ function getEmbedUrl(info) {
59802
59994
  const kind = info.kind ?? "p";
59803
59995
  return `https://www.instagram.com/${kind}/${info.id}/embed`;
59804
59996
  }
59805
- default:
59806
- return "";
59807
59997
  }
59998
+ const exhaustive = info.provider;
59999
+ return exhaustive;
59808
60000
  }
59809
60001
  function getThumbnailUrl(info) {
59810
60002
  switch (info.provider) {
@@ -59814,9 +60006,20 @@ function getThumbnailUrl(info) {
59814
60006
  return `https://vumbnail.com/${info.id}.jpg`;
59815
60007
  case "instagram":
59816
60008
  return "";
59817
- default:
59818
- return "";
59819
60009
  }
60010
+ const exhaustive = info.provider;
60011
+ return exhaustive;
60012
+ }
60013
+ function getVideoEmbedLoadingStrategy(provider) {
60014
+ switch (provider) {
60015
+ case "youtube":
60016
+ case "vimeo":
60017
+ return "native-lazy";
60018
+ case "instagram":
60019
+ return "defer-until-near-viewport";
60020
+ }
60021
+ const exhaustive = provider;
60022
+ return exhaustive;
59820
60023
  }
59821
60024
  function getVideoEmbed(url) {
59822
60025
  const info = parseVideoUrl(url);
@@ -59871,35 +60074,43 @@ var VideoEmbedNode = ({
59871
60074
  );
59872
60075
  }
59873
60076
  const title = getVideoTitle(embedInfo);
59874
- return /* @__PURE__ */ jsx("div", { ...rest, children: /* @__PURE__ */ jsx(
60077
+ const loadingStrategy = getVideoEmbedLoadingStrategy(embedInfo.provider);
60078
+ const shouldDeferSrc = loadingStrategy === "defer-until-near-viewport";
60079
+ return /* @__PURE__ */ jsx("div", { ...rest, children: /* @__PURE__ */ jsxs(
59875
60080
  "div",
59876
60081
  {
59877
60082
  className,
60083
+ "data-rb-video-embed-wrapper": shouldDeferSrc ? "true" : void 0,
59878
60084
  style: {
59879
60085
  ...style2,
59880
60086
  aspectRatio: resolvedAspectRatio,
59881
60087
  position: "relative",
59882
60088
  width: "100%"
59883
60089
  },
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
- )
60090
+ children: [
60091
+ /* @__PURE__ */ jsx(
60092
+ "iframe",
60093
+ {
60094
+ src: shouldDeferSrc ? void 0 : embedInfo.embedUrl,
60095
+ title,
60096
+ loading: "lazy",
60097
+ "data-rb-video-embed-deferred": shouldDeferSrc ? "true" : void 0,
60098
+ "data-rb-video-embed-src": shouldDeferSrc ? embedInfo.embedUrl : void 0,
60099
+ style: {
60100
+ position: "absolute",
60101
+ top: 0,
60102
+ left: 0,
60103
+ width: "100%",
60104
+ height: "100%",
60105
+ border: "none"
60106
+ },
60107
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",
60108
+ referrerPolicy: "no-referrer-when-downgrade",
60109
+ allowFullScreen: true
60110
+ }
60111
+ ),
60112
+ shouldDeferSrc ? /* @__PURE__ */ jsx("noscript", { children: /* @__PURE__ */ jsx("a", { href: embedInfo.url, children: "View on Instagram" }) }) : null
60113
+ ]
59903
60114
  }
59904
60115
  ) });
59905
60116
  };
@@ -59914,9 +60125,9 @@ function getVideoTitle(info) {
59914
60125
  const label = kind === "reel" ? "reel" : kind === "tv" ? "video" : "post";
59915
60126
  return `Instagram ${label} ${info.id}`;
59916
60127
  }
59917
- default:
59918
- return "Embedded video";
59919
60128
  }
60129
+ const exhaustive = info.provider;
60130
+ return exhaustive;
59920
60131
  }
59921
60132
  function getAspectRatio(propAspectRatio, style2) {
59922
60133
  const styleAspectRatio = style2?.aspectRatio;
@@ -60159,10 +60370,15 @@ var HeaderSectionNode = ({
60159
60370
  blockId,
60160
60371
  children,
60161
60372
  className,
60373
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
60162
60374
  ...rest
60163
60375
  }) => {
60164
60376
  const { wrapperClasses, sectionClasses } = splitPositioningClasses(className);
60165
- const wrapperClassName = `block-site-header${wrapperClasses ? ` ${wrapperClasses}` : ""}`;
60377
+ const wrapperClassName = [
60378
+ "block-site-header",
60379
+ wrapperClasses,
60380
+ previewSiteChromeSurface ? "group/site-chrome rb-relative" : ""
60381
+ ].filter(Boolean).join(" ");
60166
60382
  const asProp = rest.as;
60167
60383
  const styleProp = rest.style;
60168
60384
  const backgroundProp = typeof rest.background === "string" ? rest.background : void 0;
@@ -60178,6 +60394,7 @@ var HeaderSectionNode = ({
60178
60394
  "data-block": "site-header",
60179
60395
  "data-block-kind": "block.site-header",
60180
60396
  "data-block-id": blockId ?? void 0,
60397
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
60181
60398
  children: [
60182
60399
  /* @__PURE__ */ jsx(IslandPropsScript, { value: { enabled: hasShrinkClasses(className) } }),
60183
60400
  /* @__PURE__ */ jsx(
@@ -60811,7 +61028,18 @@ function getBookingSuccessMessage(successMessage) {
60811
61028
  return successMessage?.trim() || "Your appointment has been booked! Check your email for confirmation.";
60812
61029
  }
60813
61030
 
60814
- // ../blocks/src/system/runtime/nodes/booking-form.interactive.ts
61031
+ // ../logger/src/noop.ts
61032
+ var noop = () => {
61033
+ };
61034
+ var logger = {
61035
+ debug: noop,
61036
+ info: noop,
61037
+ warn: noop,
61038
+ error: noop,
61039
+ withFields: (_2) => logger
61040
+ };
61041
+
61042
+ // ../blocks/src/system/runtime/nodes/booking-runtime-sources.ts
60815
61043
  var bookingFieldOptionSchema = z.object({
60816
61044
  value: z.string(),
60817
61045
  label: z.string()
@@ -60865,6 +61093,8 @@ var bookingSourceFormSchema = z.object({
60865
61093
  createdAt: z.string(),
60866
61094
  updatedAt: z.string()
60867
61095
  });
61096
+
61097
+ // ../blocks/src/system/runtime/nodes/booking-form.interactive.ts
60868
61098
  var blockBookingPaymentTermsAvailabilitySchema = z.union([
60869
61099
  z.object({
60870
61100
  kind: z.literal("available"),
@@ -61810,7 +62040,7 @@ var EventSpotlight = ({
61810
62040
  columns = "3",
61811
62041
  cardVariant = "default",
61812
62042
  buttonVariant = "primary",
61813
- buttonText = "View event",
62043
+ buttonText = "Book now",
61814
62044
  ctaLabel,
61815
62045
  ctaUrl,
61816
62046
  showVenue = true,
@@ -61956,7 +62186,7 @@ function buildEventCombinedDisplay(source) {
61956
62186
  showMap: source.showMap ?? true,
61957
62187
  showCapacity: source.showCapacity ?? true,
61958
62188
  buttonVariant: source.buttonVariant ?? "primary",
61959
- buttonText: source.buttonText ?? "View event",
62189
+ buttonText: source.buttonText ?? "Book now",
61960
62190
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
61961
62191
  };
61962
62192
  }
@@ -78456,6 +78686,11 @@ var containerResponsiveThemeCss = `/*
78456
78686
  * Dense row layout for event-calendar compact list mode
78457
78687
  * ============================================================================= */
78458
78688
 
78689
+ :where(.theme-scope) .event-listing-compact-container {
78690
+ width: min(100%, 56rem);
78691
+ margin-inline: auto;
78692
+ }
78693
+
78459
78694
  :where(.theme-scope) .event-compact-row {
78460
78695
  display: flex;
78461
78696
  align-items: center;
@@ -80388,51 +80623,36 @@ function deriveBlockDraftSaveability(input) {
80388
80623
  issues
80389
80624
  };
80390
80625
  }
80391
- function withNormalizedManifestMessage(issue2) {
80392
- return {
80393
- ...issue2,
80394
- message: normalizeManifestIssueMessage(issue2)
80395
- };
80396
- }
80397
80626
  function validateBlockManifestIssues(manifest, values, mode) {
80398
80627
  const validator = getManifestValidation(manifest, mode);
80399
80628
  const result = validator.safeParse(values);
80400
80629
  if (result.success) {
80401
80630
  return [];
80402
80631
  }
80403
- return result.error.issues.map(withNormalizedManifestMessage);
80632
+ return result.error.issues;
80404
80633
  }
80405
80634
  function validateBlockManifest(manifest, values, mode) {
80635
+ const plans = getManifestValidationCacheEntry(manifest).plans;
80406
80636
  return validateBlockManifestIssues(manifest, values, mode).map((issue2) => {
80407
80637
  const path = normalizeIssuePath(issue2.path);
80638
+ const fieldDescriptor = resolveFieldValidationDescriptor(plans, path);
80408
80639
  return {
80409
80640
  code: issue2.code,
80410
80641
  path,
80411
80642
  fieldPath: normalizePathString(path),
80643
+ fieldDescriptor,
80644
+ isFieldVisibleInSidebar: isValidationFieldVisibleInSidebar(fieldDescriptor),
80412
80645
  message: issue2.message
80413
80646
  };
80414
80647
  });
80415
80648
  }
80416
- function normalizeManifestIssueMessage(issue2) {
80417
- switch (issue2.code) {
80418
- case "invalid_type":
80419
- return issue2.message;
80420
- case "too_big":
80421
- return issue2.origin === "string" ? `Use ${issue2.maximum} characters or fewer` : issue2.message;
80422
- case "too_small":
80423
- if (issue2.origin !== "string") return issue2.message;
80424
- return issue2.minimum === 1 ? "This field is required" : `Use at least ${issue2.minimum} characters`;
80425
- case "invalid_format":
80426
- if (issue2.format === "email") return "Enter a valid email address";
80427
- if (issue2.format === "url") return "Enter a valid web address";
80428
- return "Check the format and try again";
80429
- default:
80430
- return issue2.message;
80431
- }
80649
+ function isValidationFieldVisibleInSidebar(descriptor) {
80650
+ if (!descriptor) return true;
80651
+ return descriptor.visibility.kind === "visible";
80432
80652
  }
80433
80653
  function getManifestValidation(manifest, mode) {
80434
- const cached = manifestValidationCache.get(manifest);
80435
- const existing = cached?.[mode];
80654
+ const cached = getManifestValidationCacheEntry(manifest);
80655
+ const existing = cached.validators[mode];
80436
80656
  if (existing) {
80437
80657
  return existing;
80438
80658
  }
@@ -80440,10 +80660,19 @@ function getManifestValidation(manifest, mode) {
80440
80660
  allowNull: false,
80441
80661
  mode
80442
80662
  });
80443
- manifestValidationCache.set(manifest, {
80444
- ...cached,
80445
- [mode]: created
80446
- });
80663
+ cached.validators[mode] = created;
80664
+ return created;
80665
+ }
80666
+ function getManifestValidationCacheEntry(manifest) {
80667
+ const cached = manifestValidationCache.get(manifest);
80668
+ if (cached) {
80669
+ return cached;
80670
+ }
80671
+ const created = {
80672
+ plans: deriveFieldValidationPlans(manifest.fields ?? []),
80673
+ validators: {}
80674
+ };
80675
+ manifestValidationCache.set(manifest, created);
80447
80676
  return created;
80448
80677
  }
80449
80678
  function normalizeIssuePath(path) {
@@ -81951,7 +82180,6 @@ function useBlockAutosave({
81951
82180
  if (saveability.kind === "saveable") {
81952
82181
  return true;
81953
82182
  }
81954
- drafts.clearPending(snapshot.id);
81955
82183
  return false;
81956
82184
  });
81957
82185
  return saveablePending.map((s2) => ({
@@ -82031,6 +82259,8 @@ function deriveBlockedPublishPlan({
82031
82259
  if (!firstError) {
82032
82260
  return { type: "allowed" };
82033
82261
  }
82262
+ const focusError = validationErrors.find((error) => error.isFieldVisibleInSidebar) ?? firstError;
82263
+ const focusFieldPath = focusError.isFieldVisibleInSidebar ? focusError.fieldPath || null : null;
82034
82264
  return {
82035
82265
  type: "blocked",
82036
82266
  invalidBlockIds,
@@ -82039,8 +82269,8 @@ function deriveBlockedPublishPlan({
82039
82269
  reveal: "show-validation"
82040
82270
  })),
82041
82271
  focusTarget: {
82042
- blockId: firstError.blockId,
82043
- fieldPath: firstError.fieldPath || null
82272
+ blockId: focusError.blockId,
82273
+ fieldPath: focusFieldPath
82044
82274
  },
82045
82275
  message: invalidBlockIds.length === 1 ? {
82046
82276
  type: "single-invalid-block",
@@ -82083,25 +82313,24 @@ function applyBlockedPublishPlan(uiStore, plan, setErrorMessage) {
82083
82313
  // ../content-editor/src/hooks/validateBlocksForPublish.ts
82084
82314
  function validateAllBlocks(uiStore) {
82085
82315
  const errors = [];
82086
- const draftsState = uiStore.getState().drafts;
82316
+ const state = uiStore.getState();
82317
+ const draftsState = state.drafts;
82087
82318
  const allBlocks = draftsState.inspect();
82088
82319
  for (const snapshot of allBlocks) {
82089
82320
  if (!snapshot.meta?.kind) continue;
82090
- const content = snapshot.current ?? snapshot.baseline ?? {};
82091
- const definition = getBlockDefinition(snapshot.meta.kind);
82092
- if (!definition?.manifest) {
82093
- continue;
82094
- }
82095
- const issues = validateBlockManifest(definition.manifest, content, "strict");
82321
+ const { issues, manifest } = getPublishValidationIssues(uiStore, snapshot);
82096
82322
  if (issues.length > 0) {
82097
82323
  for (const issue2 of issues) {
82098
82324
  errors.push({
82099
82325
  blockId: snapshot.id,
82100
82326
  blockKind: snapshot.meta.kind,
82101
82327
  fieldPath: issue2.fieldPath,
82328
+ fieldDescriptor: issue2.fieldDescriptor,
82329
+ isFieldVisibleInSidebar: issue2.isFieldVisibleInSidebar,
82102
82330
  fieldLabel: getFieldLabelFromManifest(
82103
- definition.manifest,
82104
- issue2.path
82331
+ manifest,
82332
+ issue2.path,
82333
+ issue2.fieldDescriptor
82105
82334
  ),
82106
82335
  message: issue2.message
82107
82336
  });
@@ -82110,11 +82339,49 @@ function validateAllBlocks(uiStore) {
82110
82339
  }
82111
82340
  return errors;
82112
82341
  }
82113
- function getFieldLabelFromManifest(manifest, path) {
82342
+ function getPublishValidationIssues(uiStore, snapshot) {
82343
+ const definition = getBlockDefinition(snapshot.meta.kind);
82344
+ const registryManifest = definition?.manifest ?? null;
82345
+ if (registryManifest) {
82346
+ const content = snapshot.current ?? snapshot.baseline ?? {};
82347
+ return {
82348
+ issues: validateBlockManifest(registryManifest, content, "strict"),
82349
+ manifest: registryManifest
82350
+ };
82351
+ }
82352
+ const saveability = uiStore.getState().blockValidation?.getBlockSaveability(snapshot.id);
82353
+ if (!saveability) {
82354
+ return { issues: [], manifest: null };
82355
+ }
82356
+ if (saveability.issues.length > 0) {
82357
+ return {
82358
+ issues: saveability.issues,
82359
+ manifest: null
82360
+ };
82361
+ }
82362
+ if (saveability.kind === "save_failed") {
82363
+ return {
82364
+ issues: [
82365
+ {
82366
+ code: "custom",
82367
+ path: [],
82368
+ fieldPath: "",
82369
+ fieldDescriptor: null,
82370
+ isFieldVisibleInSidebar: true,
82371
+ message: saveability.error
82372
+ }
82373
+ ],
82374
+ manifest: null
82375
+ };
82376
+ }
82377
+ return { issues: [], manifest: null };
82378
+ }
82379
+ function getFieldLabelFromManifest(manifest, path, descriptor) {
82380
+ if (descriptor) return descriptor.label;
82114
82381
  if (path.length === 0) return "Unknown field";
82115
82382
  const fieldId = path[0];
82116
82383
  if (typeof fieldId !== "string") return String(fieldId);
82117
- const field = manifest.fields?.find((f2) => f2.id === fieldId);
82384
+ const field = manifest?.fields?.find((f2) => f2.id === fieldId);
82118
82385
  return field?.label ?? fieldId;
82119
82386
  }
82120
82387
 
@@ -82229,15 +82496,6 @@ function useEntryActions({
82229
82496
  }, [uiStore, hasRoute, setErrorMessage]);
82230
82497
  const performPublish = useCallback(async (options) => {
82231
82498
  setErrorMessage(null);
82232
- const dirtyTypes = getDirtyAutosaveTypes(uiStore, hasRoute);
82233
- uiStore.getState().autosave.saveNow(dirtyTypes);
82234
- uiStore.getState().autosave.flushAllPending();
82235
- await waitForAutosavesComplete(uiStore);
82236
- if (hasAutosaveErrors(uiStore)) {
82237
- const message2 = "Cannot publish: failed to save draft changes.";
82238
- setErrorMessage(message2);
82239
- throw new Error(message2);
82240
- }
82241
82499
  const validationErrors = validateAllBlocks(uiStore);
82242
82500
  const blockedPublishPlan = deriveBlockedPublishPlan({
82243
82501
  validationErrors,
@@ -82247,6 +82505,15 @@ function useEntryActions({
82247
82505
  applyBlockedPublishPlan(uiStore, blockedPublishPlan, setErrorMessage);
82248
82506
  return;
82249
82507
  }
82508
+ const dirtyTypes = getDirtyAutosaveTypes(uiStore, hasRoute);
82509
+ uiStore.getState().autosave.saveNow(dirtyTypes);
82510
+ uiStore.getState().autosave.flushAllPending();
82511
+ await waitForAutosavesComplete(uiStore);
82512
+ if (hasAutosaveErrors(uiStore)) {
82513
+ const message2 = "Cannot publish: failed to save draft changes.";
82514
+ setErrorMessage(message2);
82515
+ throw new Error(message2);
82516
+ }
82250
82517
  uiStore.getState().autosave.setMetadataStatus({ status: "saving" });
82251
82518
  try {
82252
82519
  const values = uiStore.getState().metadata.getCurrentValues() || {};
@@ -90205,9 +90472,9 @@ var computePosition2 = (reference, floating, options) => {
90205
90472
  });
90206
90473
  };
90207
90474
  var isClient = typeof document !== "undefined";
90208
- var noop = function noop2() {
90475
+ var noop2 = function noop3() {
90209
90476
  };
90210
- var index = isClient ? useLayoutEffect : noop;
90477
+ var index = isClient ? useLayoutEffect : noop2;
90211
90478
  function deepEqual4(a2, b2) {
90212
90479
  if (a2 === b2) {
90213
90480
  return true;
@@ -105520,6 +105787,17 @@ function readSliderFieldUiConfig(ui) {
105520
105787
  };
105521
105788
  }
105522
105789
 
105790
+ // ../block-form/src/manifest/utils.ts
105791
+ function assertNever9(value) {
105792
+ throw new Error(`Unhandled manifest variant: ${JSON.stringify(value)}`);
105793
+ }
105794
+ function getGroupChildFields(field) {
105795
+ return field.schema?.fields ?? field.fields;
105796
+ }
105797
+ function getRepeaterChildFields(field) {
105798
+ return field.schema?.fields ?? field.fields ?? [];
105799
+ }
105800
+
105523
105801
  // ../block-form/src/manifest/canonicalValidation.ts
105524
105802
  function buildCanonicalFieldSchema(field) {
105525
105803
  const manifestField = normalizeFieldForCanonicalValidation(field);
@@ -105584,7 +105862,7 @@ function groupFieldToManifestInput(field) {
105584
105862
  ...field,
105585
105863
  schema: {
105586
105864
  ...field.schema,
105587
- fields: (field.schema?.fields ?? field.fields).map(toManifestFieldInput)
105865
+ fields: getGroupChildFields(field).map(toManifestFieldInput)
105588
105866
  }
105589
105867
  };
105590
105868
  }
@@ -105616,13 +105894,10 @@ function repeaterFieldToManifestInput(field) {
105616
105894
  ...field,
105617
105895
  schema: {
105618
105896
  ...field.schema,
105619
- fields: (field.schema?.fields ?? field.fields).map(toManifestFieldInput)
105897
+ fields: getRepeaterChildFields(field).map(toManifestFieldInput)
105620
105898
  }
105621
105899
  };
105622
105900
  }
105623
- function assertNever9(value) {
105624
- throw new Error(`Unhandled field config variant: ${JSON.stringify(value)}`);
105625
- }
105626
105901
 
105627
105902
  // ../block-form/src/widgets/TextField/textFieldSchema.ts
105628
105903
  function buildTextFieldSchema(field) {
@@ -106052,7 +106327,7 @@ var DEFAULT_VALUE_BUILDERS = {
106052
106327
  contentTypeSelect: getContentTypeSelectFieldDefault,
106053
106328
  entryPicker: getEntryPickerFieldDefault
106054
106329
  };
106055
- function buildFieldSchema2(field, ctx) {
106330
+ function buildFieldSchema(field, ctx) {
106056
106331
  const builder = SCHEMA_BUILDERS[field.type];
106057
106332
  if (!builder) {
106058
106333
  console.warn(`No schema builder registered for field type: ${field.type}`);
@@ -106158,13 +106433,58 @@ function isFieldVisible(field, role) {
106158
106433
  function buildValidationSchema(fields3) {
106159
106434
  const shape = {};
106160
106435
  const ctx = {
106161
- getFieldSchema: (field) => buildFieldSchema2(field, ctx)
106436
+ getFieldSchema: (field) => buildManifestFieldSchema(field, ctx)
106162
106437
  };
106163
106438
  for (const field of fields3) {
106164
- shape[field.id] = buildFieldSchema2(field, ctx);
106439
+ shape[field.id] = buildManifestFieldSchema(field, ctx);
106165
106440
  }
106166
106441
  return z.object(shape).catchall(z.unknown()).passthrough();
106167
106442
  }
106443
+ function buildManifestFieldSchema(field, ctx) {
106444
+ if (shouldUseCanonicalSchema(field)) {
106445
+ return buildCanonicalFieldSchema(field);
106446
+ }
106447
+ return buildFieldSchema(field, ctx);
106448
+ }
106449
+ function shouldUseCanonicalSchema(field) {
106450
+ switch (field.type) {
106451
+ case "text":
106452
+ case "number":
106453
+ case "select":
106454
+ case "boolean":
106455
+ case "url":
106456
+ case "slug":
106457
+ case "link":
106458
+ case "media":
106459
+ case "file":
106460
+ case "reference":
106461
+ return true;
106462
+ case "group":
106463
+ return getGroupChildFields(field).every(shouldUseCanonicalSchema);
106464
+ case "modal":
106465
+ return field.schema.fields.every(shouldUseCanonicalSchema);
106466
+ case "repeater":
106467
+ if (field.polymorphic) {
106468
+ return Object.values(field.itemTypes).every(
106469
+ (itemType) => itemType.fields.every(shouldUseCanonicalSchema)
106470
+ );
106471
+ }
106472
+ return getRepeaterChildFields(field).every(shouldUseCanonicalSchema);
106473
+ case "tabGroup":
106474
+ if (field.activeTabField) return false;
106475
+ return field.tabs.every((tab) => tab.fields.every(shouldUseCanonicalSchema));
106476
+ case "richText":
106477
+ case "date":
106478
+ case "time":
106479
+ case "datetime":
106480
+ case "presetOrCustom":
106481
+ case "contentTypeSelect":
106482
+ case "entryPicker":
106483
+ case "button":
106484
+ return false;
106485
+ }
106486
+ return assertNever9(field);
106487
+ }
106168
106488
  function createManifestValidation(manifest, options) {
106169
106489
  const { fields: fields3, schema } = createManifestFormAdapter(manifest, {
106170
106490
  role: options?.role
@@ -108527,17 +108847,6 @@ function useBlockApi() {
108527
108847
  }
108528
108848
  return client;
108529
108849
  }
108530
-
108531
- // ../logger/src/noop.ts
108532
- var noop3 = () => {
108533
- };
108534
- var logger = {
108535
- debug: noop3,
108536
- info: noop3,
108537
- warn: noop3,
108538
- error: noop3,
108539
- withFields: (_2) => logger
108540
- };
108541
108850
  function AltchaWidget({
108542
108851
  challengeUrl,
108543
108852
  onSolutionChange,
@@ -109380,6 +109689,7 @@ function clearBookingFieldError(errors, fieldId) {
109380
109689
  function createInitialBookingFlowReducerState(input) {
109381
109690
  const initialData = input.initialData ?? {};
109382
109691
  return {
109692
+ phase: "editing",
109383
109693
  currentStepId: "service-selection",
109384
109694
  selectedServiceId: toOptionalAppointmentServiceId(
109385
109695
  toOptionalString(initialData.serviceId) ?? input.defaultServiceId
@@ -109400,8 +109710,7 @@ function createInitialBookingFlowReducerState(input) {
109400
109710
  ),
109401
109711
  altchaSolution: null,
109402
109712
  validationErrors: createEmptyBookingValidationErrors(),
109403
- feedback: { kind: "none" },
109404
- isSubmitting: false
109713
+ feedback: { kind: "none" }
109405
109714
  };
109406
109715
  }
109407
109716
  function collectInitialFieldValues(initialData) {
@@ -109528,8 +109837,15 @@ function bookingFlowReducer(state, event) {
109528
109837
  case "validation-errors-set":
109529
109838
  return { ...state, validationErrors: event.errors };
109530
109839
  case "feedback-set":
109531
- return { ...state, feedback: event.feedback };
109840
+ return {
109841
+ ...state,
109842
+ phase: event.feedback.kind === "success" ? "completed" : "editing",
109843
+ feedback: event.feedback
109844
+ };
109532
109845
  case "availability-selection-invalidated":
109846
+ if (state.phase !== "editing") {
109847
+ return state;
109848
+ }
109533
109849
  return {
109534
109850
  ...state,
109535
109851
  currentStepId: "datetime-selection",
@@ -109543,11 +109859,11 @@ function bookingFlowReducer(state, event) {
109543
109859
  validationErrors: clearBookingFormError(state.validationErrors)
109544
109860
  };
109545
109861
  case "feedback-cleared":
109546
- return { ...state, feedback: { kind: "none" } };
109862
+ return { ...state, phase: "editing", feedback: { kind: "none" } };
109547
109863
  case "submission-started":
109548
- return { ...state, isSubmitting: true };
109864
+ return { ...state, phase: "submitting" };
109549
109865
  case "submission-finished":
109550
- return { ...state, isSubmitting: false };
109866
+ return state.phase === "submitting" ? { ...state, phase: "editing" } : state;
109551
109867
  case "reset":
109552
109868
  return event.initial;
109553
109869
  default:
@@ -109982,8 +110298,8 @@ function toHeadlessEligibleAppointmentPackage(appointmentPackage) {
109982
110298
  };
109983
110299
  }
109984
110300
  function resolveHeadlessBookingStatus(input) {
109985
- if (input.isSubmitting) return { tag: "submitting" };
109986
- if (input.feedback.kind === "success") {
110301
+ if (input.phase === "submitting") return { tag: "submitting" };
110302
+ if (input.phase === "completed" && input.feedback.kind === "success") {
109987
110303
  return {
109988
110304
  tag: "success",
109989
110305
  resourceName: input.feedback.resourceName
@@ -110142,6 +110458,7 @@ function useHeadlessBookingFlow(options) {
110142
110458
  [availableDates]
110143
110459
  );
110144
110460
  useEffect(() => {
110461
+ if (state.phase !== "editing") return;
110145
110462
  const canEvaluateDate = availabilityDatesQuery.ok && Boolean(availableDatesLoadedRange) && !isLoadingDates && !datesError;
110146
110463
  const canEvaluateSlot = !state.selectedSlot || availabilitySlotsQuery.ok && hasLoadedSlots && !isLoadingSlots && !slotsError;
110147
110464
  if (!canEvaluateDate || !canEvaluateSlot) return;
@@ -110167,6 +110484,7 @@ function useHeadlessBookingFlow(options) {
110167
110484
  isLoadingSlots,
110168
110485
  slotViews,
110169
110486
  slotsError,
110487
+ state.phase,
110170
110488
  state.selectedDate,
110171
110489
  state.selectedSlot
110172
110490
  ]);
@@ -110327,7 +110645,7 @@ function useHeadlessBookingFlow(options) {
110327
110645
  const submitBooking = useCallback(
110328
110646
  async (submitOptions) => {
110329
110647
  const latest = latestRef.current;
110330
- if (submittingRef.current || latest.state.isSubmitting) {
110648
+ if (submittingRef.current || latest.state.phase === "submitting") {
110331
110649
  return {
110332
110650
  ok: false,
110333
110651
  reason: "blocked",
@@ -110523,7 +110841,7 @@ function useHeadlessBookingFlow(options) {
110523
110841
  const spamProtectionEnabled = options.spamProtectionEnabled ?? isSpamProtectionEnabled();
110524
110842
  const status = resolveHeadlessBookingStatus({
110525
110843
  feedback: state.feedback,
110526
- isSubmitting: state.isSubmitting
110844
+ phase: state.phase
110527
110845
  });
110528
110846
  const view = resolveHeadlessBookingView({
110529
110847
  form: options.form,
@@ -120057,6 +120375,7 @@ var HeaderSectionNode2 = ({
120057
120375
  pathBase,
120058
120376
  children,
120059
120377
  className: originalClassName,
120378
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
120060
120379
  ...restProps
120061
120380
  }) => {
120062
120381
  const rootRef = useRef(null);
@@ -120064,7 +120383,11 @@ var HeaderSectionNode2 = ({
120064
120383
  () => splitPositioningClasses(originalClassName),
120065
120384
  [originalClassName]
120066
120385
  );
120067
- const wrapperClassName = `block-site-header${wrapperClasses ? ` ${wrapperClasses}` : ""}`;
120386
+ const wrapperClassName = [
120387
+ "block-site-header",
120388
+ wrapperClasses,
120389
+ previewSiteChromeSurface ? "group/site-chrome rb-relative" : ""
120390
+ ].filter(Boolean).join(" ");
120068
120391
  const hasShrinkClasses2 = useMemo(
120069
120392
  () => Boolean(sectionClasses?.includes("rb-header-shrink")),
120070
120393
  [sectionClasses]
@@ -120097,6 +120420,7 @@ var HeaderSectionNode2 = ({
120097
120420
  "data-block-content": blockContent ? "true" : void 0,
120098
120421
  "data-fragment-registry": fragmentRegistry2 ? "true" : void 0,
120099
120422
  "data-path-base": typeof pathBase === "string" ? pathBase : void 0,
120423
+ "data-preview-site-chrome-surface": previewSiteChromeSurface,
120100
120424
  children: /* @__PURE__ */ jsx(
120101
120425
  Section_default,
120102
120426
  {
@@ -121537,7 +121861,7 @@ var EventCombinedClient = ({
121537
121861
  showCapacity,
121538
121862
  // Styling
121539
121863
  buttonVariant = "primary",
121540
- buttonText = "View event",
121864
+ buttonText = "Book now",
121541
121865
  emptyMessage = "No upcoming events scheduled.",
121542
121866
  className
121543
121867
  }) => {
@@ -123238,7 +123562,7 @@ function shouldHoistNestedGroupSettings(field) {
123238
123562
  const ui = field.ui;
123239
123563
  return ui?.hideLabel === true;
123240
123564
  }
123241
- function getGroupChildFields(field) {
123565
+ function getGroupChildFields2(field) {
123242
123566
  if (field.type !== "group") return [];
123243
123567
  if (Array.isArray(field.fields)) return field.fields;
123244
123568
  if (Array.isArray(field.schema?.fields)) return field.schema.fields;
@@ -123246,7 +123570,7 @@ function getGroupChildFields(field) {
123246
123570
  }
123247
123571
  function hoistNestedGroupSettings(field) {
123248
123572
  if (!shouldHoistNestedGroupSettings(field)) return [];
123249
- const groupChildren = getGroupChildFields(field);
123573
+ const groupChildren = getGroupChildFields2(field);
123250
123574
  if (groupChildren.length === 0) return [];
123251
123575
  const { display, behavior, style: style2 } = partitionFieldsByIntent(groupChildren);
123252
123576
  const nestedSettings = [...display, ...behavior, ...style2];
@@ -161202,7 +161526,7 @@ function EditorStatusBar({
161202
161526
  lastSavedLabel,
161203
161527
  secondaryMessage
161204
161528
  ]);
161205
- const disablePublish = isSaving || toolbar?.disablePublish || !hasChanges;
161529
+ const disablePublish = isSaving || toolbar?.disablePublish || !hasChanges && currentLifecycle !== "draft";
161206
161530
  isSaving || toolbar?.disableDiscard || !hasChanges;
161207
161531
  const statusClass = unsavedError || generalError ? "text-destructive" : "text-slate-600";
161208
161532
  return /* @__PURE__ */ jsx(FixedBottomSurface, { variant: "light", children: /* @__PURE__ */ jsxs(
@@ -162940,7 +163264,6 @@ var PreviewRichTextEditorInner = ({
162940
163264
  toolbarTone: "dark",
162941
163265
  toolbarPortalToChrome: false,
162942
163266
  hideToolbar: true,
162943
- onClick: () => editor?.chain().focus().run(),
162944
163267
  renderContent: (content) => /* @__PURE__ */ jsx(
162945
163268
  "div",
162946
163269
  {
@@ -164702,4 +165025,4 @@ lucide-react/dist/esm/lucide-react.js:
164702
165025
  *)
164703
165026
  */
164704
165027
 
164705
- export { ArrowDown, ArrowUp, BackgroundColorField, BackgroundGradientField, Badge2 as Badge, BlockApiProvider, Box, Button, CSS2 as CSS, CTA_ICON_OPTIONS, Callout, CalloutDescription, CalloutTitle, Card, CardContent, CardHeader, CardTitle, Check, ChevronDown, ChevronLeft, ChevronRight, Collapsible2 as Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, ColorPicker, Combobox, Content, ContentFieldsForm, Copy, DEFAULT_LAUNCH_READINESS_INPUT, Dialog2 as Dialog, DialogClose2 as DialogClose, DialogContent2 as DialogContent, DialogDescription2 as DialogDescription, DialogFooter, DialogHeader, DialogTitle2 as DialogTitle, DndContext, DropdownMenu2 as DropdownMenu, DropdownMenuContent2 as DropdownMenuContent, DropdownMenuItem2 as DropdownMenuItem, DropdownMenuLabel2 as DropdownMenuLabel, DropdownMenuSeparator2 as DropdownMenuSeparator, DropdownMenuTrigger2 as DropdownMenuTrigger, EMPTY_DOC, EditableBlockProvider, EditorChrome, EditorProvider, EmptyState2 as EmptyState, EntryControllerProvider, FieldFrame, FixedBottomSurface, FormRenderer, GripVertical, Input, KeyboardCode, Label4 as Label, List2 as List, LoaderCircle, ManifestForm, Maximize2, MediaEditor, MediaEditorProvider, MediaPickerDialog, MediaPickerMini, Monitor, PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE, PUBLIC_FILE_FIELD_KINDS, PageRenderer, Palette, PaletteProvider, Pencil, Plus, PointerSensor, PreviewRichTextEditor, PreviewTextEditor, ResizableSplitPane, RichText2 as RichText, RichTextEditorSurface, Root2, RotateCcw, SUBROUTE_KINDS, ScrollableDialogContent, Search, Select2 as Select, SelectContent2 as SelectContent, SelectItem2 as SelectItem, SelectTrigger2 as SelectTrigger, SelectValue2 as SelectValue, Separator2 as Separator, Settings, SiteDocumentLayout, Smartphone, Sparkles, Surface, Tablet, Tabs2 as Tabs, TabsContent2 as TabsContent, TabsList2 as TabsList, TabsTrigger2 as TabsTrigger, Text2 as Text, ThemeScope, Trash2, TriangleAlert, Trigger, X, applyCompiledRuntimeFieldsToContent, applyPageDesignEditorAction, asDesignBlockId, asEditorBlockId, asEditorBlockValues, asRecord, asSiteId, assertNever3 as assertNever, assertNever5 as assertNever2, augmentManifestWithStyleGroups, buildEditorModelRuntimeFieldsByBlockId, buildThemeRuntime, buttonPersonalities, canRedoHistory, canUndoHistory, classifyHistoryShortcut, clientComponentRegistry, closestCenter, cn, compileSiteThemeFromSelections, createBlock, createEditorInsertBlockCommand, createEditorRemoveBlockCommand, createEditorReorderBlocksCommand, createHistoryState, createManifestFormAdapter, createManifestValidation, createRoutingHelpers, createSnapshotFromPageRecord, createStoreBackend, curatedSiteStyles, deleteBlock, deriveLaunchReadiness, findButtonPersonality, findFooterLook, findHeaderLook, findPaletteVariant, foldSubroute, footerLookCatalog, footerLookRejectionReasonLabel, getBlockDefinition, getClientRect, getCtaIconComponent, getCuratedSiteStyle, getDirectImageUrlForMediaAsset, getFieldIntent, getModalConfig, getPageDesignEditorState, getRichTextImagePositionFromTarget, getRouteMetadataManifestForType, headerLookCatalog, headerLookRejectionReasonLabel, insertOrReplaceRichTextImage, isCtaIconName, isHeaderField, isInternalResolvedLinkValue, isKeyboardEvent, isNonEmptyValue, isObjectRecord2 as isObjectRecord, isSvgMimeType, isThemeV2NormalEditorRawStyleFieldName, isThemeV2NormalEditorRawStylePath, listBlockDescriptors, listContentTypes, lucide_react_exports, mergeManifestWithSdkOptions, mutateBlockContent, normalEditorCuratedPromotedFieldPaths, normalizePickerSearchThreshold, omitRouteTitleFieldFromManifest, paletteOverridesSchema, paletteVariants, parseAspectRatioValue, planPageDesignLayoutLookCompatibility, planSiteDocument, previewAssistantEnabled, pushHistoryEntry, recoveryConflictCopy, redoHistory, reorderBlocks, requireEntriesForCuratedChoices, resolveBlockTitle, resolveImageUrlWithContext, resolveMediaSlotContract, resolvePickerSelectionLabel, resolvePreviewSidebarTab, resolveVisiblePromotedFieldPathsForEditorBlock, shouldShowPickerSearch, siteStyleIdFromTheme, surfaceResolutionContextFromTheme, systemCustomizeFacetAppliesToLayoutVariant, systemCustomizeFacetApplyContentPatch, systemCustomizeFacetCurrentValue, systemCustomizeFacetDefinitionForBlock, systemCustomizeFacetDefinitionsForBlock, systemCustomizeFacetLabelForValue, systemCustomizeFacetNextValue, systemCustomizeFacetRollbackContentPatch, toRoutableLinkPayload, transformSdkBlockToDefinition, transformSdkBlockToManifest, undoHistory, unfinishedBlockCopy, unwrapResponse, useAsyncPickerOptions, useBackendWatch, useBlockContext, useCombinedRefs, useDebouncedLatestSave, useDndContext, useDraggable, useDroppable, useEditor2 as useEditor, useEditorUiStore, useEditorUiStoreInstance, useEntryController, useEntryEditorController, useField, useIsomorphicLayoutEffect3 as useIsomorphicLayoutEffect, useMediaEditor, useMediaEditorOptional, useMultiAutosave, useOptionalEditorUiStoreInstance, useRichTextEditor, useSdkConfig, useSensor, useSensors, useUISelector, useUniqueId, validateBlockManifestIssues, writePlanForLookCustomizationCommand };
165028
+ export { ArrowDown, ArrowUp, BackgroundColorField, BackgroundGradientField, Badge2 as Badge, BlockApiProvider, Box, Button, CSS2 as CSS, CTA_ICON_OPTIONS, Callout, CalloutDescription, CalloutTitle, Card, CardContent, CardHeader, CardTitle, Check, ChevronDown, ChevronLeft, ChevronRight, Collapsible2 as Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, ColorPicker, Combobox, Content, ContentFieldsForm, Copy, DEFAULT_LAUNCH_READINESS_INPUT, Dialog2 as Dialog, DialogClose2 as DialogClose, DialogContent2 as DialogContent, DialogDescription2 as DialogDescription, DialogFooter, DialogHeader, DialogTitle2 as DialogTitle, DndContext, DropdownMenu2 as DropdownMenu, DropdownMenuContent2 as DropdownMenuContent, DropdownMenuItem2 as DropdownMenuItem, DropdownMenuLabel2 as DropdownMenuLabel, DropdownMenuSeparator2 as DropdownMenuSeparator, DropdownMenuTrigger2 as DropdownMenuTrigger, EMPTY_DOC, EditableBlockProvider, EditorChrome, EditorProvider, EllipsisVertical, EmptyState2 as EmptyState, EntryControllerProvider, FieldFrame, FixedBottomSurface, FormRenderer, GripVertical, Input, KeyboardCode, Label4 as Label, List2 as List, LoaderCircle, ManifestForm, Maximize2, MediaEditor, MediaEditorProvider, MediaPickerDialog, MediaPickerMini, Monitor, PAGE_DESIGN_EDITOR_STATE_FETCH_ERROR_MESSAGE, PUBLIC_FILE_FIELD_KINDS, PageRenderer, Palette, PaletteProvider, Pencil, Plus, PointerSensor, PreviewRichTextEditor, PreviewTextEditor, ResizableSplitPane, RichText2 as RichText, RichTextEditorSurface, Root2, RotateCcw, SUBROUTE_KINDS, ScrollableDialogContent, Search, Select2 as Select, SelectContent2 as SelectContent, SelectItem2 as SelectItem, SelectTrigger2 as SelectTrigger, SelectValue2 as SelectValue, Separator2 as Separator, Settings, SiteDocumentLayout, Smartphone, Sparkles, Surface, Tablet, Tabs2 as Tabs, TabsContent2 as TabsContent, TabsList2 as TabsList, TabsTrigger2 as TabsTrigger, Text2 as Text, ThemeScope, Trash2, TriangleAlert, Trigger, X, applyCompiledRuntimeFieldsToContent, applyPageDesignEditorAction, asDesignBlockId, asEditorBlockId, asEditorBlockValues, asRecord, asSiteId, assertNever3 as assertNever, assertNever5 as assertNever2, augmentManifestWithStyleGroups, buildEditorModelRuntimeFieldsByBlockId, buildThemeRuntime, buttonPersonalities, canRedoHistory, canUndoHistory, classifyHistoryShortcut, clientComponentRegistry, closestCenter, cn, compileSiteThemeFromSelections, createBlock, createEditorInsertBlockCommand, createEditorRemoveBlockCommand, createEditorReorderBlocksCommand, createHistoryState, createManifestFormAdapter, createManifestValidation, createRoutingHelpers, createSnapshotFromPageRecord, createStoreBackend, curatedSiteStyles, deleteBlock, deriveLaunchReadiness, findButtonPersonality, findFooterLook, findHeaderLook, findPaletteVariant, foldSubroute, footerLookCatalog, footerLookRejectionReasonLabel, getBlockDefinition, getClientRect, getCtaIconComponent, getCuratedSiteStyle, getDirectImageUrlForMediaAsset, getFieldIntent, getModalConfig, getPageDesignEditorState, getRichTextImagePositionFromTarget, getRouteMetadataManifestForType, headerLookCatalog, headerLookRejectionReasonLabel, insertOrReplaceRichTextImage, isCtaIconName, isHeaderField, isInternalResolvedLinkValue, isKeyboardEvent, isNonEmptyValue, isObjectRecord2 as isObjectRecord, isSvgMimeType, isThemeV2NormalEditorRawStyleFieldName, isThemeV2NormalEditorRawStylePath, listBlockDescriptors, listContentTypes, lucide_react_exports, mergeManifestWithSdkOptions, mutateBlockContent, normalEditorCuratedPromotedFieldPaths, normalizePickerSearchThreshold, omitRouteTitleFieldFromManifest, paletteOverridesSchema, paletteVariants, parseAspectRatioValue, planPageDesignLayoutLookCompatibility, planSiteDocument, previewAssistantEnabled, pushHistoryEntry, recoveryConflictCopy, redoHistory, reorderBlocks, requireEntriesForCuratedChoices, resolveBlockTitle, resolveImageUrlWithContext, resolveMediaSlotContract, resolvePickerSelectionLabel, resolvePreviewSidebarTab, resolveVisiblePromotedFieldPathsForEditorBlock, shouldShowPickerSearch, siteStyleIdFromTheme, surfaceResolutionContextFromTheme, systemCustomizeFacetAppliesToLayoutVariant, systemCustomizeFacetApplyContentPatch, systemCustomizeFacetCurrentValue, systemCustomizeFacetDefinitionForBlock, systemCustomizeFacetDefinitionsForBlock, systemCustomizeFacetLabelForValue, systemCustomizeFacetNextValue, systemCustomizeFacetRollbackContentPatch, toRoutableLinkPayload, transformSdkBlockToDefinition, transformSdkBlockToManifest, undoHistory, unfinishedBlockCopy, unwrapResponse, useAsyncPickerOptions, useBackendWatch, useBlockContext, useCombinedRefs, useDebouncedLatestSave, useDndContext, useDraggable, useDroppable, useEditor2 as useEditor, useEditorUiStore, useEditorUiStoreInstance, useEntryController, useEntryEditorController, useField, useIsomorphicLayoutEffect3 as useIsomorphicLayoutEffect, useMediaEditor, useMediaEditorOptional, useMultiAutosave, useOptionalEditorUiStoreInstance, useRichTextEditor, useSdkConfig, useSensor, useSensors, useUISelector, useUniqueId, validateBlockManifestIssues, writePlanForLookCustomizationCommand };