@riverbankcms/sdk 0.60.16 → 0.62.4

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 (232) hide show
  1. package/dist/_dts/api/src/accessAdmin.d.ts +7 -0
  2. package/dist/_dts/api/src/bookingClosures.d.ts +106 -0
  3. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +59 -1
  4. package/dist/_dts/api/src/bookingRecords.d.ts +101 -4
  5. package/dist/_dts/api/src/bookings.d.ts +2 -1
  6. package/dist/_dts/api/src/calendar.d.ts +11 -1
  7. package/dist/_dts/api/src/contentRuntime.d.ts +2 -0
  8. package/dist/_dts/api/src/contentVersionHistory.d.ts +52 -0
  9. package/dist/_dts/api/src/contentVersionHistoryClient.d.ts +45 -0
  10. package/dist/_dts/api/src/endpoints.d.ts +206 -6
  11. package/dist/_dts/api/src/index.d.ts +9 -2
  12. package/dist/_dts/api/src/participantMessaging.d.ts +113 -0
  13. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +31 -7
  14. package/dist/_dts/api/src/siteMembers.d.ts +10 -1
  15. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +76 -51
  16. package/dist/_dts/api/src/types.d.ts +3 -1
  17. package/dist/_dts/api/src/url.d.ts +3 -3
  18. package/dist/_dts/blocks/src/bindings/index.d.ts +2 -2
  19. package/dist/_dts/blocks/src/index.d.ts +66 -62
  20. package/dist/_dts/blocks/src/lib/media.d.ts +60 -0
  21. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +2 -2
  22. package/dist/_dts/blocks/src/system/blocks/audio-player.d.ts +2 -2
  23. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +2 -2
  24. package/dist/_dts/blocks/src/system/blocks/blog-post.d.ts +0 -21
  25. package/dist/_dts/blocks/src/system/blocks/body-text.d.ts +2 -6
  26. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +2 -2
  27. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +2 -2
  28. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +0 -10
  29. package/dist/_dts/blocks/src/system/blocks/columns.d.ts +0 -10
  30. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -20
  31. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +0 -20
  32. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +15 -15
  33. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +5 -10
  34. package/dist/_dts/blocks/src/system/blocks/embed.d.ts +0 -11
  35. package/dist/_dts/blocks/src/system/blocks/event-details.d.ts +0 -20
  36. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +0 -20
  37. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +43 -27
  38. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +24 -15
  39. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +2 -2
  40. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +132 -12
  41. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +3 -2
  42. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +2 -10
  43. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +2 -2
  44. package/dist/_dts/blocks/src/system/blocks/form.d.ts +2 -24
  45. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +2 -2
  46. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +2 -3
  47. package/dist/_dts/blocks/src/system/blocks/image-gallery.d.ts +2 -2
  48. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +0 -13
  49. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +17 -17
  50. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +2 -10
  51. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +2 -2
  52. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +2 -2
  53. package/dist/_dts/blocks/src/system/blocks/shared/bookingPaymentTerms.d.ts +9 -9
  54. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +2 -2
  55. package/dist/_dts/blocks/src/system/blocks/single-button.d.ts +16 -15
  56. package/dist/_dts/blocks/src/system/blocks/site-footer.d.ts +2 -6
  57. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +0 -11
  58. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +3 -3
  59. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +2 -2
  60. package/dist/_dts/blocks/src/system/blocks/video-grid.d.ts +2 -2
  61. package/dist/_dts/blocks/src/system/constants/events.d.ts +18 -0
  62. package/dist/_dts/blocks/src/system/customize/facets.d.ts +105 -0
  63. package/dist/_dts/blocks/src/system/defineBlock.d.ts +29 -5
  64. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
  65. package/dist/_dts/blocks/src/system/fragments/library/blogFeaturedPost.d.ts +0 -24
  66. package/dist/_dts/blocks/src/system/fragments/library/bodyCopy.d.ts +0 -4
  67. package/dist/_dts/blocks/src/system/fragments/library/bookingForm.d.ts +0 -4
  68. package/dist/_dts/blocks/src/system/fragments/library/card.d.ts +0 -6
  69. package/dist/_dts/blocks/src/system/fragments/library/columnContent.d.ts +0 -6
  70. package/dist/_dts/blocks/src/system/fragments/library/ctaCopy.d.ts +0 -4
  71. package/dist/_dts/blocks/src/system/fragments/library/ctaRow.d.ts +0 -4
  72. package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +0 -4
  73. package/dist/_dts/blocks/src/system/fragments/library/faqHeading.d.ts +0 -4
  74. package/dist/_dts/blocks/src/system/fragments/library/feedbackCallout.d.ts +0 -6
  75. package/dist/_dts/blocks/src/system/fragments/library/footerBottomText.d.ts +0 -4
  76. package/dist/_dts/blocks/src/system/fragments/library/formCopy.d.ts +0 -4
  77. package/dist/_dts/blocks/src/system/fragments/library/formEmbed.d.ts +0 -18
  78. package/dist/_dts/blocks/src/system/fragments/library/headerCta.d.ts +0 -4
  79. package/dist/_dts/blocks/src/system/fragments/library/heading.d.ts +0 -6
  80. package/dist/_dts/blocks/src/system/fragments/library/heroCopy.d.ts +0 -4
  81. package/dist/_dts/blocks/src/system/fragments/library/heroCtaRow.d.ts +0 -4
  82. package/dist/_dts/blocks/src/system/fragments/library/heroLayoutControls.d.ts +0 -4
  83. package/dist/_dts/blocks/src/system/fragments/library/image.d.ts +0 -6
  84. package/dist/_dts/blocks/src/system/fragments/library/newsletterCopy.d.ts +0 -4
  85. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +0 -4
  86. package/dist/_dts/blocks/src/system/fragments/library/quote.d.ts +0 -6
  87. package/dist/_dts/blocks/src/system/fragments/library/richText.d.ts +0 -6
  88. package/dist/_dts/blocks/src/system/fragments/library/sectionState.d.ts +0 -6
  89. package/dist/_dts/blocks/src/system/fragments/library/singleButton.d.ts +0 -4
  90. package/dist/_dts/blocks/src/system/fragments/library/spinner.d.ts +0 -5
  91. package/dist/_dts/blocks/src/system/fragments/library/teamMember.d.ts +0 -6
  92. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +0 -31
  93. package/dist/_dts/blocks/src/system/fragments/library/testimonialsHeading.d.ts +0 -4
  94. package/dist/_dts/blocks/src/system/fragments/library/videoEmbed.d.ts +0 -6
  95. package/dist/_dts/blocks/src/system/fragments/types.d.ts +11 -3
  96. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +4 -0
  97. package/dist/_dts/blocks/src/system/index.d.ts +1 -0
  98. package/dist/_dts/blocks/src/system/manifest/derivedContent.d.ts +3 -3
  99. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +10 -10
  100. package/dist/_dts/blocks/src/system/media/constrainedVideoMedia.d.ts +13 -0
  101. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -0
  102. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -0
  103. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +4 -0
  104. package/dist/_dts/blocks/src/system/runtime/nodes/media.d.ts +1 -0
  105. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.state.d.ts +12 -0
  106. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +7 -0
  107. package/dist/_dts/blocks/src/system/runtime/shared/components/FieldValidationMessage.d.ts +19 -0
  108. package/dist/_dts/blocks/src/system/runtime/shared/components/TerminalPanel.d.ts +8 -2
  109. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +3 -1
  110. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  111. package/dist/_dts/blocks/src/system/transforms/registry/_utils/themeColorResolution.d.ts +7 -0
  112. package/dist/_dts/content-editor/src/hooks/useDebouncedLatestSave.d.ts +24 -0
  113. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  114. package/dist/_dts/content-editor/src/ui/stores/autosaveStore.d.ts +1 -0
  115. package/dist/_dts/content-editor/src/ui/stores/types.d.ts +1 -0
  116. package/dist/_dts/content-model/src/contentManifest.d.ts +2 -2
  117. package/dist/_dts/content-model/src/referenceFields.d.ts +7 -1
  118. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +242 -6
  119. package/dist/_dts/db/src/schemas/forms.d.ts +1 -0
  120. package/dist/_dts/editor-blocks/src/media/MediaField.d.ts +2 -0
  121. package/dist/_dts/editor-blocks/src/widgets/entry-picker/EntryPickerWidgetProvider.d.ts +3 -2
  122. package/dist/_dts/editor-blocks/src/widgets/entry-picker/loaders.d.ts +2 -1
  123. package/dist/_dts/editor-blocks/src/widgets/entry-picker/types.d.ts +2 -1
  124. package/dist/_dts/editor-blocks/src/widgets/link/LinkPicker.d.ts +2 -1
  125. package/dist/_dts/editor-blocks/src/widgets/link/LinkWidget.d.ts +2 -1
  126. package/dist/_dts/editor-blocks/src/widgets/link/LinkWidgetContext.d.ts +2 -1
  127. package/dist/_dts/editor-blocks/src/widgets/link/loaders.d.ts +2 -1
  128. package/dist/_dts/editor-blocks/src/widgets/link/types.d.ts +3 -2
  129. package/dist/_dts/editor-blocks/src/widgets/reference/dynamicAdapters.d.ts +9 -0
  130. package/dist/_dts/editor-blocks/src/widgets/reference/loaders.d.ts +5 -1
  131. package/dist/_dts/media-core/src/index.d.ts +1 -0
  132. package/dist/_dts/media-core/src/videoSlotPolicy.d.ts +38 -0
  133. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -1
  134. package/dist/_dts/media-editor/src/MediaPickerDialog.d.ts +7 -0
  135. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +2 -1
  136. package/dist/_dts/preview-next/src/client/blocks/composer/composePageFromBlocks.d.ts +2 -1
  137. package/dist/_dts/preview-next/src/client/blocks/composer/index.d.ts +2 -2
  138. package/dist/_dts/preview-next/src/client/blocks/composer/mergeDrafts.d.ts +2 -1
  139. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +31 -8
  140. package/dist/_dts/preview-next/src/client/blocks/customizeFacetControls.d.ts +9 -0
  141. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +6 -5
  142. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +14 -0
  143. package/dist/_dts/preview-next/src/client/blocks/previewProjection/aiProposalProjection.d.ts +7 -0
  144. package/dist/_dts/preview-next/src/client/blocks/previewProjection/applyPreviewProjections.d.ts +7 -0
  145. package/dist/_dts/preview-next/src/client/blocks/previewProjection/index.d.ts +4 -0
  146. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +5 -0
  147. package/dist/_dts/preview-next/src/client/blocks/previewProjection/types.d.ts +72 -0
  148. package/dist/_dts/preview-next/src/client/index.d.ts +1 -1
  149. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +8 -5
  150. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +2 -1
  151. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +11 -1
  152. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +9 -5
  153. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +6 -1
  154. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +13 -2
  155. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +7 -1
  156. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControlStyles.d.ts +1 -0
  157. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +7 -3
  158. package/dist/_dts/preview-next/src/client/preview/previewCustomizeRuntimePatch.d.ts +9 -1
  159. package/dist/_dts/preview-next/src/client/preview/previewCustomizeWorkflowState.d.ts +13 -0
  160. package/dist/_dts/preview-next/src/client/preview/sidebarTabPreference.d.ts +8 -2
  161. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +49 -0
  162. package/dist/_dts/preview-next/src/client/widgets/widgetAdapters.d.ts +1 -1
  163. package/dist/_dts/sdk/src/contracts/content.d.ts +10 -0
  164. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -1
  165. package/dist/_dts/sdk/src/manifest/prompt/examples/features-grid.d.ts +1 -1
  166. package/dist/_dts/sdk/src/manifest/prompt/examples/pricing.d.ts +5 -5
  167. package/dist/_dts/sdk/src/public-api/contracts.d.ts +3 -1
  168. package/dist/_dts/sdk/src/rendering/helpers/bindings.d.ts +1 -0
  169. package/dist/_dts/sdk/src/version.d.ts +1 -1
  170. package/dist/_dts/surfaces/src/index.d.ts +1 -0
  171. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  172. package/dist/_dts/theme-core/src/index.d.ts +1 -0
  173. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +3 -0
  174. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +2 -21
  175. package/dist/_dts/theme-core/src/schema.d.ts +25 -0
  176. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +451 -0
  177. package/dist/_dts/theme-core/src/site-styles/appearancePresetResolution.d.ts +12 -0
  178. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +61 -0
  179. package/dist/_dts/theme-core/src/site-styles/appearancePresets.d.ts +5 -563
  180. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +448 -0
  181. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +30 -0
  182. package/dist/_dts/theme-core/src/site-styles/customizableSurfaces.d.ts +94 -0
  183. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +12 -0
  184. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +59 -0
  185. package/dist/_dts/theme-core/src/site-styles/generatedDesignPipeline.d.ts +4 -0
  186. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +2 -0
  187. package/dist/_dts/theme-core/src/site-styles/headerCtaVariants.d.ts +3 -0
  188. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +155 -0
  189. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +15 -0
  190. package/dist/_dts/theme-core/src/site-styles/index.d.ts +6 -0
  191. package/dist/_dts/theme-core/src/site-styles/pageDesignAuthority.d.ts +7 -0
  192. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +25 -0
  193. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +15 -1
  194. package/dist/_dts/theme-core/src/site-styles/records.d.ts +1 -0
  195. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +8 -0
  196. package/dist/_dts/theme-core/src/site-styles/siteStyleBlockPolicies.d.ts +96 -0
  197. package/dist/_dts/theme-core/src/site-styles/sourceCatalogs.d.ts +6 -6
  198. package/dist/_dts/theme-core/src/site-styles/types.d.ts +23 -5
  199. package/dist/_dts/theme-core/src/siteChrome.d.ts +53 -0
  200. package/dist/_dts/theme-core/src/tokens/colorTokenParts.d.ts +13 -0
  201. package/dist/_dts/theme-core/src/tokens/index.d.ts +2 -0
  202. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +29 -0
  203. package/dist/_dts/theme-core/src/utils/tokenOrColor.d.ts +27 -1
  204. package/dist/cli/index.mjs +5149 -3635
  205. package/dist/client/bookings.mjs +711 -560
  206. package/dist/client/client.mjs +10110 -8168
  207. package/dist/client/hooks.mjs +3861 -2739
  208. package/dist/client/rendering/client.mjs +8606 -7009
  209. package/dist/client/rendering/islands.mjs +25202 -23768
  210. package/dist/client/rendering.mjs +10661 -8713
  211. package/dist/preview-next/before-render.mjs +256 -6
  212. package/dist/preview-next/client/runtime.mjs +7700 -4016
  213. package/dist/preview-next/editor-base.css +31 -0
  214. package/dist/preview-next/middleware.mjs +267 -6
  215. package/dist/server/components.mjs +4501 -3270
  216. package/dist/server/config-validation.mjs +4089 -2967
  217. package/dist/server/config.mjs +4089 -2967
  218. package/dist/server/data.mjs +3861 -2739
  219. package/dist/server/index.mjs +322 -24
  220. package/dist/server/next.mjs +4274 -3041
  221. package/dist/server/page-converter.mjs +3520 -2717
  222. package/dist/server/prebuild.mjs +1 -1
  223. package/dist/server/rendering/server.mjs +4500 -3270
  224. package/dist/server/rendering.mjs +4526 -3291
  225. package/dist/server/routing.mjs +4006 -2723
  226. package/dist/server/server.mjs +3897 -2772
  227. package/dist/server/theme-bridge.mjs +1435 -788
  228. package/dist/server/theme.mjs +628 -497
  229. package/dist/styles/index.css +61 -9
  230. package/package.json +1 -1
  231. package/dist/_dts/blocks/src/system/transforms/registry/_utils/colorResolution.d.ts +0 -13
  232. package/dist/_dts/preview-next/src/client/blocks/overlay.d.ts +0 -30
@@ -86,7 +86,7 @@ function ze() {
86
86
  /* @__PURE__ */ Te(P)
87
87
  );
88
88
  }
89
- function z5(e) {
89
+ function z12(e) {
90
90
  if (L) {
91
91
  if (/* @__PURE__ */ Te(P) !== null)
92
92
  throw Tt(), Je;
@@ -2115,12 +2115,12 @@ function ha(e, t) {
2115
2115
  var mt = we(Dr, 2);
2116
2116
  let Pr;
2117
2117
  var We = X(mt);
2118
- en(We), We.__change = ui, z5(mt);
2118
+ en(We), We.__change = ui, z12(mt);
2119
2119
  var Ut = we(mt, 2), wi = X(Ut);
2120
2120
  {
2121
2121
  var pi = (n) => {
2122
2122
  var u = na(), _ = Gr(u), y = X(_);
2123
- Ge(y, () => c(re).verified), z5(_);
2123
+ Ge(y, () => c(re).verified), z12(_);
2124
2124
  var T = we(_, 2);
2125
2125
  en(T), Pe(() => {
2126
2126
  se(T, "name", V()), jo(T, c(Le));
@@ -2129,10 +2129,10 @@ function ha(e, t) {
2129
2129
  {
2130
2130
  var _ = (T) => {
2131
2131
  var E = ia(), p = X(E);
2132
- Ge(p, () => c(re).verifying), z5(E), ne(T, E);
2132
+ Ge(p, () => c(re).verifying), z12(E), ne(T, E);
2133
2133
  }, y = (T) => {
2134
2134
  var E = oa(), p = X(E);
2135
- Ge(p, () => c(re).label), z5(E), Pe(() => se(E, "for", c(cr))), ne(T, E);
2135
+ Ge(p, () => c(re).label), z12(E), Pe(() => se(E, "for", c(cr))), ne(T, E);
2136
2136
  };
2137
2137
  $e(
2138
2138
  n,
@@ -2147,18 +2147,18 @@ function ha(e, t) {
2147
2147
  c(C) === b.VERIFIED ? n(pi) : n(bi, false);
2148
2148
  });
2149
2149
  }
2150
- z5(Ut);
2150
+ z12(Ut);
2151
2151
  var yi = we(Ut, 2);
2152
2152
  {
2153
2153
  var Ei = (n) => {
2154
2154
  var u = aa(), _ = X(u);
2155
- se(_, "href", sr), z5(u), Pe(() => se(_, "aria-label", c(re).ariaLinkLabel)), ne(n, u);
2155
+ se(_, "href", sr), z12(u), Pe(() => se(_, "aria-label", c(re).ariaLinkLabel)), ne(n, u);
2156
2156
  };
2157
2157
  $e(yi, (n) => {
2158
2158
  (N() !== true || c(Dt)) && n(Ei);
2159
2159
  });
2160
2160
  }
2161
- z5(Mt);
2161
+ z12(Mt);
2162
2162
  var Or = we(Mt, 2);
2163
2163
  {
2164
2164
  var xi = (n) => {
@@ -2166,16 +2166,16 @@ function ha(e, t) {
2166
2166
  {
2167
2167
  var y = (E) => {
2168
2168
  var p = la(), x = X(p);
2169
- Ge(x, () => c(re).expired), z5(p), Pe(() => se(p, "title", c(He))), ne(E, p);
2169
+ Ge(x, () => c(re).expired), z12(p), Pe(() => se(p, "title", c(He))), ne(E, p);
2170
2170
  }, T = (E) => {
2171
2171
  var p = sa(), x = X(p);
2172
- Ge(x, () => c(re).error), z5(p), Pe(() => se(p, "title", c(He))), ne(E, p);
2172
+ Ge(x, () => c(re).error), z12(p), Pe(() => se(p, "title", c(He))), ne(E, p);
2173
2173
  };
2174
2174
  $e(_, (E) => {
2175
2175
  c(C) === b.EXPIRED ? E(y) : E(T, false);
2176
2176
  });
2177
2177
  }
2178
- z5(u), ne(n, u);
2178
+ z12(u), ne(n, u);
2179
2179
  };
2180
2180
  $e(Or, (n) => {
2181
2181
  (c(He) || c(C) === b.EXPIRED) && n(xi);
@@ -2185,7 +2185,7 @@ function ha(e, t) {
2185
2185
  {
2186
2186
  var $i = (n) => {
2187
2187
  var u = ua(), _ = X(u), y = X(_);
2188
- Ge(y, () => c(re).footer), z5(_), z5(u), ne(n, u);
2188
+ Ge(y, () => c(re).footer), z12(_), z12(u), ne(n, u);
2189
2189
  };
2190
2190
  $e(Fr, (n) => {
2191
2191
  c(re).footer && (k() !== true || c(Dt)) && n($i);
@@ -2201,7 +2201,7 @@ function ha(e, t) {
2201
2201
  v() && n(Ci);
2202
2202
  });
2203
2203
  }
2204
- return z5(ot), nn(ot, (n) => D(B, n), () => c(B)), Pe(
2204
+ return z12(ot), nn(ot, (n) => D(B, n), () => c(B)), Pe(
2205
2205
  (n) => {
2206
2206
  se(ot, "data-state", c(C)), se(ot, "data-floating", v()), Pr = Fo(mt, 1, "altcha-checkbox", null, Pr, n), se(We, "id", c(cr)), We.required = r2() !== "onsubmit" && (!v() || r2() !== "off");
2207
2207
  },
@@ -2806,8 +2806,139 @@ function clsx() {
2806
2806
  }
2807
2807
  var clsx_default = clsx;
2808
2808
 
2809
+ // ../theme-core/src/tokens/colorTokenParts.ts
2810
+ function parseOpacityPercent(source) {
2811
+ const trimmed = source.trim();
2812
+ if (!trimmed) return null;
2813
+ if (!/^\d{1,3}(?:\.\d+)?$/.test(trimmed)) return null;
2814
+ const value = Number(trimmed);
2815
+ if (!Number.isFinite(value)) return null;
2816
+ if (value < 0 || value > 100) return null;
2817
+ return value;
2818
+ }
2819
+ function parseColorTokenParts(source) {
2820
+ const trimmed = source.trim();
2821
+ if (trimmed.startsWith("raw:")) {
2822
+ return { kind: "raw", value: trimmed.slice(4) };
2823
+ }
2824
+ const [token, opacityRaw, extra] = trimmed.split("/");
2825
+ if (!token || extra !== void 0) {
2826
+ return { kind: "invalid", token: trimmed };
2827
+ }
2828
+ if (opacityRaw === void 0) {
2829
+ return { kind: "token", token, opacityPercent: null };
2830
+ }
2831
+ const opacityPercent = parseOpacityPercent(opacityRaw);
2832
+ if (opacityPercent === null) {
2833
+ return { kind: "invalid", token: trimmed };
2834
+ }
2835
+ return { kind: "token", token, opacityPercent };
2836
+ }
2837
+
2809
2838
  // ../theme-core/src/buttons/types.ts
2839
+ import { z as z2 } from "zod";
2840
+
2841
+ // ../theme-core/src/tokens/themeColorTokens.ts
2810
2842
  import { z } from "zod";
2843
+
2844
+ // ../theme-core/src/tokens/blockColorTokens.ts
2845
+ var blockColorTokenNames = [
2846
+ "text",
2847
+ "heading",
2848
+ "mutedText",
2849
+ "surface",
2850
+ "background",
2851
+ "foreground",
2852
+ "border",
2853
+ "primary",
2854
+ "secondary",
2855
+ "accent",
2856
+ "success",
2857
+ "warning",
2858
+ "info",
2859
+ "error",
2860
+ "destructive",
2861
+ "scrim",
2862
+ "shadow",
2863
+ // Common "on*" tokens used when rendering colored chips/badges.
2864
+ "onPrimary",
2865
+ "onSecondary",
2866
+ "onAccent",
2867
+ "onSuccess",
2868
+ "onWarning",
2869
+ "onInfo",
2870
+ "onError",
2871
+ "onDestructive",
2872
+ "onSurface"
2873
+ ];
2874
+ var blockColorTokenNameSet = new Set(
2875
+ blockColorTokenNames
2876
+ );
2877
+
2878
+ // ../theme-core/src/tokens/themeColorTokens.ts
2879
+ var PALETTE_TOKEN_NAMES = [
2880
+ "primary",
2881
+ "primaryForeground",
2882
+ "secondary",
2883
+ "accent",
2884
+ "success",
2885
+ "warning",
2886
+ "destructive",
2887
+ "background",
2888
+ "surface",
2889
+ "surfaceAlt",
2890
+ "muted",
2891
+ "text",
2892
+ "border"
2893
+ ];
2894
+ var paletteTokenNameSchema = z.enum(PALETTE_TOKEN_NAMES);
2895
+ var themeColorBaseTokenNames = [
2896
+ ...PALETTE_TOKEN_NAMES,
2897
+ ...blockColorTokenNames,
2898
+ // Existing generated themes can carry palette-local "white" tokens in
2899
+ // token-only component fields. Keep it explicit until those rows are
2900
+ // migrated to canonical foreground/background roles.
2901
+ "white",
2902
+ "neutral",
2903
+ "primaryText",
2904
+ "secondaryForeground",
2905
+ "accentForeground"
2906
+ ];
2907
+ var themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
2908
+ var SHADE_STEPS = [
2909
+ "50",
2910
+ "100",
2911
+ "200",
2912
+ "300",
2913
+ "400",
2914
+ "500",
2915
+ "600",
2916
+ "700",
2917
+ "800",
2918
+ "900",
2919
+ "950"
2920
+ ];
2921
+ var shadeStepSet = new Set(SHADE_STEPS);
2922
+ function isKnownBaseToken(value) {
2923
+ return themeColorBaseTokenSet.has(value);
2924
+ }
2925
+ function isKnownShadeToken(value) {
2926
+ const match = value.match(/^([a-zA-Z][a-zA-Z0-9]*)(?:-([0-9]{2,3}))$/);
2927
+ if (!match) return false;
2928
+ const [, base, shade] = match;
2929
+ return Boolean(base && shade && isKnownBaseToken(base) && shadeStepSet.has(shade));
2930
+ }
2931
+ function isThemeColorTokenBase(value) {
2932
+ return isKnownBaseToken(value) || isKnownShadeToken(value);
2933
+ }
2934
+ function isThemeColorToken(value) {
2935
+ if (typeof value !== "string") return false;
2936
+ const parts = parseColorTokenParts(value);
2937
+ return parts.kind === "token" && isThemeColorTokenBase(parts.token);
2938
+ }
2939
+ var themeColorTokenSchema = z.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
2940
+
2941
+ // ../theme-core/src/buttons/types.ts
2811
2942
  var VARIANT_ROLES = [
2812
2943
  "primary",
2813
2944
  "secondary",
@@ -2818,22 +2949,22 @@ var VARIANT_ROLES = [
2818
2949
  "accent"
2819
2950
  ];
2820
2951
  var DEFAULT_VARIANT_ALIAS_ID = "default";
2821
- var cornerStyleSchema = z.enum(["square", "rounded", "pill"]);
2822
- var shadowSizeSchema = z.enum(["none", "low", "medium", "high"]);
2823
- var textTransformSchema = z.enum(["none", "uppercase", "lowercase", "capitalize"]);
2824
- var fontWeightSchema = z.union([z.literal(500), z.literal(600), z.literal(700)]);
2825
- var buttonTypographySchema = z.enum(["body", "heading"]);
2826
- var letterSpacingSchema = z.enum(["tight", "normal", "loose"]);
2827
- var hoverTransformSchema = z.enum(["none", "lift", "scale", "press"]);
2828
- var hoverColorSchema = z.enum(["none", "brighten", "darken", "saturate", "token"]);
2829
- var buttonPaddingPresetSchema = z.enum(["compact", "default", "spacious"]);
2830
- var gradientStyleSchema = z.enum(["linear", "radial", "conic"]);
2831
- var gradientSharpnessSchema = z.enum(["smooth", "medium", "hard"]);
2832
- var prioritySchema = z.union([z.literal(1), z.literal(2), z.literal(3)]);
2833
- var variantRoleSchema = z.enum(VARIANT_ROLES);
2834
- var buttonSizeNameSchema = z.enum(["sm", "md", "lg", "xl"]);
2952
+ var cornerStyleSchema = z2.enum(["square", "rounded", "pill"]);
2953
+ var shadowSizeSchema = z2.enum(["none", "low", "medium", "high"]);
2954
+ var textTransformSchema = z2.enum(["none", "uppercase", "lowercase", "capitalize"]);
2955
+ var fontWeightSchema = z2.union([z2.literal(500), z2.literal(600), z2.literal(700)]);
2956
+ var buttonTypographySchema = z2.enum(["body", "heading"]);
2957
+ var letterSpacingSchema = z2.enum(["tight", "normal", "loose"]);
2958
+ var hoverTransformSchema = z2.enum(["none", "lift", "scale", "press"]);
2959
+ var hoverColorSchema = z2.enum(["none", "brighten", "darken", "saturate", "token"]);
2960
+ var buttonPaddingPresetSchema = z2.enum(["compact", "default", "spacious"]);
2961
+ var gradientStyleSchema = z2.enum(["linear", "radial", "conic"]);
2962
+ var gradientSharpnessSchema = z2.enum(["smooth", "medium", "hard"]);
2963
+ var prioritySchema = z2.union([z2.literal(1), z2.literal(2), z2.literal(3)]);
2964
+ var variantRoleSchema = z2.enum(VARIANT_ROLES);
2965
+ var buttonSizeNameSchema = z2.enum(["sm", "md", "lg", "xl"]);
2835
2966
  var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
2836
- var paddingShorthandSchema = z.string().refine(
2967
+ var paddingShorthandSchema = z2.string().refine(
2837
2968
  (value) => {
2838
2969
  const parts = value.split(/\s+/).filter(Boolean);
2839
2970
  return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
@@ -2842,11 +2973,11 @@ var paddingShorthandSchema = z.string().refine(
2842
2973
  message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
2843
2974
  }
2844
2975
  );
2845
- var buttonSizeConfigSchema = z.object({
2976
+ var buttonSizeConfigSchema = z2.object({
2846
2977
  padding: paddingShorthandSchema,
2847
- fontSize: z.string().optional()
2978
+ fontSize: z2.string().optional()
2848
2979
  });
2849
- var buttonSizesSchema = z.object({
2980
+ var buttonSizesSchema = z2.object({
2850
2981
  sm: buttonSizeConfigSchema,
2851
2982
  md: buttonSizeConfigSchema,
2852
2983
  lg: buttonSizeConfigSchema,
@@ -2857,9 +2988,9 @@ var buttonSizesSchema = z.object({
2857
2988
  lg,
2858
2989
  xl: xl ?? lg
2859
2990
  }));
2860
- var buttonGlobalSettingsSchema = z.object({
2991
+ var buttonGlobalSettingsSchema = z2.object({
2861
2992
  cornerStyle: cornerStyleSchema,
2862
- cornerRadius: z.number().min(0).max(24).optional(),
2993
+ cornerRadius: z2.number().min(0).max(24).optional(),
2863
2994
  shadow: shadowSizeSchema,
2864
2995
  textTransform: textTransformSchema,
2865
2996
  fontWeight: fontWeightSchema,
@@ -2869,88 +3000,88 @@ var buttonGlobalSettingsSchema = z.object({
2869
3000
  * by the current generator and will be removed once the legacy
2870
3001
  * `primitives/content/components/Button.tsx` slot exports are deleted.
2871
3002
  */
2872
- borderWidth: z.union([z.literal(1), z.literal(2), z.literal(3)]),
3003
+ borderWidth: z2.union([z2.literal(1), z2.literal(2), z2.literal(3)]),
2873
3004
  // === Family-level typography ===
2874
3005
  // Typography source (body or heading) — selects which theme typography pool to inherit
2875
3006
  typography: buttonTypographySchema.optional(),
2876
3007
  // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
2877
3008
  // Sized variants get this as default; fixed variants inherit unless they override.
2878
3009
  // Size class CSS may still override at run time for sized variants.
2879
- fontSize: z.string().optional(),
3010
+ fontSize: z2.string().optional(),
2880
3011
  // Letter spacing applied to all variants
2881
3012
  letterSpacing: letterSpacingSchema.optional(),
2882
3013
  // Italic style
2883
- italic: z.boolean().optional(),
3014
+ italic: z2.boolean().optional(),
2884
3015
  // Padding preset (applies to sized variants without a sizes config)
2885
3016
  paddingPreset: buttonPaddingPresetSchema.optional(),
2886
3017
  hoverTransform: hoverTransformSchema,
2887
3018
  hoverColor: hoverColorSchema,
2888
3019
  // When hoverColor is 'token', this specifies which token to use
2889
- hoverColorToken: z.string().optional(),
3020
+ hoverColorToken: themeColorTokenSchema.optional(),
2890
3021
  // Gradient settings (if any variant uses gradients)
2891
3022
  gradientStyle: gradientStyleSchema.optional(),
2892
- gradientAngle: z.number().min(0).max(360).optional(),
3023
+ gradientAngle: z2.number().min(0).max(360).optional(),
2893
3024
  gradientSharpness: gradientSharpnessSchema.optional()
2894
3025
  });
2895
- var gradientDirectionSchema = z.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
2896
- var buttonBackgroundSchema = z.discriminatedUnion("type", [
2897
- z.object({ type: z.literal("solid"), colorToken: z.string() }),
2898
- z.object({
2899
- type: z.literal("gradient"),
2900
- stops: z.array(z.string()).min(2),
3026
+ var gradientDirectionSchema = z2.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
3027
+ var buttonBackgroundSchema = z2.discriminatedUnion("type", [
3028
+ z2.object({ type: z2.literal("solid"), colorToken: themeColorTokenSchema }),
3029
+ z2.object({
3030
+ type: z2.literal("gradient"),
3031
+ stops: z2.array(themeColorTokenSchema).min(2),
2901
3032
  direction: gradientDirectionSchema
2902
3033
  }),
2903
- z.object({ type: z.literal("transparent") })
3034
+ z2.object({ type: z2.literal("transparent") })
2904
3035
  ]);
2905
- var effectApplicationSchema = z.object({
2906
- effectId: z.string(),
2907
- options: z.record(z.string(), z.any()).optional()
3036
+ var effectApplicationSchema = z2.object({
3037
+ effectId: z2.string(),
3038
+ options: z2.record(z2.string(), z2.any()).optional()
2908
3039
  });
2909
- var buttonBorderSchema = z.object({
2910
- widthClass: z.string(),
2911
- colorToken: z.string()
3040
+ var buttonBorderSchema = z2.object({
3041
+ widthClass: z2.string(),
3042
+ colorToken: themeColorTokenSchema
2912
3043
  });
2913
- var variantShadowSchema = z.object({
2914
- elevation: z.enum(["none", "low", "medium", "high"]),
2915
- softness: z.enum(["crisp", "soft", "hard"]).nullable(),
2916
- position: z.enum(["bottom", "bottom-right"]).default("bottom")
3044
+ var variantShadowSchema = z2.object({
3045
+ elevation: z2.enum(["none", "low", "medium", "high"]),
3046
+ softness: z2.enum(["crisp", "soft", "hard"]).nullable(),
3047
+ position: z2.enum(["bottom", "bottom-right"]).default("bottom")
2917
3048
  });
2918
- var variantEffectsSchema = z.object({
2919
- base: z.array(effectApplicationSchema).optional(),
2920
- hover: z.array(effectApplicationSchema).optional(),
2921
- active: z.array(effectApplicationSchema).optional(),
2922
- focus: z.array(effectApplicationSchema).optional()
3049
+ var variantEffectsSchema = z2.object({
3050
+ base: z2.array(effectApplicationSchema).optional(),
3051
+ hover: z2.array(effectApplicationSchema).optional(),
3052
+ active: z2.array(effectApplicationSchema).optional(),
3053
+ focus: z2.array(effectApplicationSchema).optional()
2923
3054
  });
2924
- var variantSizeOverridesSchema = z.object({
3055
+ var variantSizeOverridesSchema = z2.object({
2925
3056
  sm: buttonSizeConfigSchema.optional(),
2926
3057
  md: buttonSizeConfigSchema.optional(),
2927
3058
  lg: buttonSizeConfigSchema.optional(),
2928
3059
  xl: buttonSizeConfigSchema.optional()
2929
3060
  });
2930
- var buttonVariantSchema = z.object({
2931
- id: z.string(),
2932
- name: z.string().min(1).max(20),
2933
- enabled: z.boolean(),
3061
+ var buttonVariantSchema = z2.object({
3062
+ id: z2.string(),
3063
+ name: z2.string().min(1).max(20),
3064
+ enabled: z2.boolean(),
2934
3065
  priority: prioritySchema,
2935
3066
  // Base appearance (token-based)
2936
3067
  background: buttonBackgroundSchema,
2937
- textColorToken: z.string(),
3068
+ textColorToken: themeColorTokenSchema,
2938
3069
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
2939
- borderRadius: z.string().optional(),
3070
+ borderRadius: z2.string().optional(),
2940
3071
  // Optional shadow override (uses theme.shadow if not specified)
2941
3072
  shadow: variantShadowSchema.optional(),
2942
3073
  // Border (optional)
2943
3074
  border: buttonBorderSchema.optional(),
2944
3075
  // Hover background token (per-variant override, takes precedence over global hoverColorToken)
2945
- hoverBackgroundToken: z.string().optional(),
3076
+ hoverBackgroundToken: z2.string().optional(),
2946
3077
  // Effect composition
2947
3078
  effects: variantEffectsSchema.optional(),
2948
3079
  // Per-variant size overrides — see VariantSizeOverrides
2949
3080
  sizes: variantSizeOverridesSchema.optional()
2950
3081
  });
2951
- var buttonSystemSchema = z.object({
3082
+ var buttonSystemSchema = z2.object({
2952
3083
  global: buttonGlobalSettingsSchema,
2953
- variants: z.array(buttonVariantSchema).min(1).max(6),
3084
+ variants: z2.array(buttonVariantSchema).min(1).max(6),
2954
3085
  sizes: buttonSizesSchema.optional()
2955
3086
  });
2956
3087
 
@@ -2977,21 +3108,21 @@ function themeButtonClassName(spec) {
2977
3108
  var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
2978
3109
 
2979
3110
  // ../theme-core/src/buttons/personalities/types.ts
2980
- import { z as z3 } from "zod";
3111
+ import { z as z4 } from "zod";
2981
3112
 
2982
3113
  // ../theme-core/src/site-styles/styleTags.ts
2983
- import { z as z2 } from "zod";
3114
+ import { z as z3 } from "zod";
2984
3115
  var STYLE_AXIS_VALUES = {
2985
3116
  tone: ["minimal", "classic", "bold"],
2986
3117
  energy: ["calm", "vibrant"],
2987
3118
  motion: ["subtle", "standard", "expressive"],
2988
3119
  era: ["editorial", "modern", "organic", "technical", "retro"]
2989
3120
  };
2990
- var styleTagsSchema = z2.object({
2991
- tone: z2.enum(STYLE_AXIS_VALUES.tone).optional(),
2992
- energy: z2.enum(STYLE_AXIS_VALUES.energy).optional(),
2993
- motion: z2.enum(STYLE_AXIS_VALUES.motion).optional(),
2994
- era: z2.enum(STYLE_AXIS_VALUES.era).optional()
3121
+ var styleTagsSchema = z3.object({
3122
+ tone: z3.enum(STYLE_AXIS_VALUES.tone).optional(),
3123
+ energy: z3.enum(STYLE_AXIS_VALUES.energy).optional(),
3124
+ motion: z3.enum(STYLE_AXIS_VALUES.motion).optional(),
3125
+ era: z3.enum(STYLE_AXIS_VALUES.era).optional()
2995
3126
  });
2996
3127
 
2997
3128
  // ../theme-core/src/buttons/personalities/types.ts
@@ -3001,11 +3132,11 @@ function asButtonPersonalityId(value) {
3001
3132
  }
3002
3133
  return value;
3003
3134
  }
3004
- var buttonPersonalityIdSchema = z3.string().min(1).transform((value) => asButtonPersonalityId(value));
3005
- var buttonPersonalitySchema = z3.object({
3135
+ var buttonPersonalityIdSchema = z4.string().min(1).transform((value) => asButtonPersonalityId(value));
3136
+ var buttonPersonalitySchema = z4.object({
3006
3137
  id: buttonPersonalityIdSchema,
3007
- name: z3.string().min(1),
3008
- description: z3.string().min(1),
3138
+ name: z4.string().min(1),
3139
+ description: z4.string().min(1),
3009
3140
  tags: styleTagsSchema,
3010
3141
  buttonSystem: buttonSystemSchema
3011
3142
  });
@@ -3859,8 +3990,8 @@ function addLocalScheduleDays(date, days) {
3859
3990
  }
3860
3991
 
3861
3992
  // ../theme-core/src/accordions/types.ts
3862
- import { z as z4 } from "zod";
3863
- var accordionIconSchema = z4.enum([
3993
+ import { z as z5 } from "zod";
3994
+ var accordionIconSchema = z5.enum([
3864
3995
  "plus-minus",
3865
3996
  // + becomes - (swap or rotate 90°)
3866
3997
  "chevron",
@@ -3872,49 +4003,49 @@ var accordionIconSchema = z4.enum([
3872
4003
  "circle-plus-minus"
3873
4004
  // ⊕ becomes ⊖ (swap with fade)
3874
4005
  ]);
3875
- var accordionSystemSchema = z4.object({
4006
+ var accordionSystemSchema = z5.object({
3876
4007
  // Visual styling (solid color only - gradients can be added later if needed)
3877
- background: z4.object({
3878
- type: z4.literal("solid"),
3879
- colorToken: z4.string()
4008
+ background: z5.object({
4009
+ type: z5.literal("solid"),
4010
+ colorToken: themeColorTokenSchema
3880
4011
  }),
3881
4012
  // Spacing (padding inside items)
3882
- spacing: z4.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
4013
+ spacing: z5.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
3883
4014
  // Border radius (null = inherit from theme.corners)
3884
- corners: z4.enum(["square", "soft", "rounded", "pill"]).nullable(),
4015
+ corners: z5.enum(["square", "soft", "rounded", "pill"]).nullable(),
3885
4016
  // Border styling (null = inherit from theme.border)
3886
- border: z4.object({
3887
- widthClass: z4.string(),
4017
+ border: z5.object({
4018
+ widthClass: z5.string(),
3888
4019
  // e.g., 'border', 'border-2', 'border-0'
3889
- colorToken: z4.string()
4020
+ colorToken: themeColorTokenSchema
3890
4021
  }).nullable(),
3891
4022
  // Shadow (null = inherit from theme.shadow)
3892
- shadow: z4.object({
3893
- elevation: z4.enum(["none", "low", "medium", "high"]),
3894
- softness: z4.enum(["soft", "crisp", "hard"]).nullable(),
3895
- position: z4.enum(["bottom", "bottom-right"])
4023
+ shadow: z5.object({
4024
+ elevation: z5.enum(["none", "low", "medium", "high"]),
4025
+ softness: z5.enum(["soft", "crisp", "hard"]).nullable(),
4026
+ position: z5.enum(["bottom", "bottom-right"])
3896
4027
  }).nullable(),
3897
4028
  // Icon style and animation
3898
- icon: z4.object({
4029
+ icon: z5.object({
3899
4030
  style: accordionIconSchema,
3900
- position: z4.enum(["left", "right"]),
3901
- size: z4.enum(["sm", "md", "lg"])
4031
+ position: z5.enum(["left", "right"]),
4032
+ size: z5.enum(["sm", "md", "lg"])
3902
4033
  }),
3903
4034
  // Trigger (question) styling
3904
- trigger: z4.object({
3905
- textColorToken: z4.string(),
3906
- fontWeight: z4.enum(["regular", "medium", "semibold", "bold"]).nullable()
4035
+ trigger: z5.object({
4036
+ textColorToken: themeColorTokenSchema,
4037
+ fontWeight: z5.enum(["regular", "medium", "semibold", "bold"]).nullable()
3907
4038
  // null = inherit from theme
3908
4039
  }),
3909
4040
  // Hover state styling
3910
- hover: z4.object({
3911
- backgroundColorToken: z4.string().optional(),
3912
- textColorToken: z4.string().optional(),
3913
- borderColorToken: z4.string().optional()
4041
+ hover: z5.object({
4042
+ backgroundColorToken: themeColorTokenSchema.optional(),
4043
+ textColorToken: themeColorTokenSchema.optional(),
4044
+ borderColorToken: themeColorTokenSchema.optional()
3914
4045
  }),
3915
4046
  // Content (answer) styling
3916
- content: z4.object({
3917
- textColorToken: z4.string()
4047
+ content: z5.object({
4048
+ textColorToken: themeColorTokenSchema
3918
4049
  })
3919
4050
  });
3920
4051
 
@@ -4397,39 +4528,302 @@ function getBookingSuccessMessage(successMessage) {
4397
4528
  return successMessage?.trim() || "Your appointment has been booked! Check your email for confirmation.";
4398
4529
  }
4399
4530
 
4400
- // ../theme-core/src/tokens/blockColorTokens.ts
4401
- var blockColorTokenNames = [
4402
- "text",
4403
- "heading",
4404
- "mutedText",
4405
- "surface",
4406
- "background",
4407
- "foreground",
4408
- "border",
4409
- "primary",
4410
- "secondary",
4411
- "accent",
4412
- "success",
4413
- "warning",
4414
- "info",
4415
- "error",
4416
- "destructive",
4417
- "scrim",
4418
- "shadow",
4419
- // Common "on*" tokens used when rendering colored chips/badges.
4420
- "onPrimary",
4421
- "onSecondary",
4422
- "onAccent",
4423
- "onSuccess",
4424
- "onWarning",
4425
- "onInfo",
4426
- "onError",
4427
- "onDestructive",
4428
- "onSurface"
4429
- ];
4430
- var blockColorTokenNameSet = new Set(
4431
- blockColorTokenNames
4531
+ // ../theme-core/src/inputs/types.ts
4532
+ import { z as z6 } from "zod";
4533
+ var inputSystemSchema = z6.object({
4534
+ // Base styling (applied to all inputs)
4535
+ base: z6.object({
4536
+ background: z6.union([
4537
+ z6.object({
4538
+ type: z6.literal("solid"),
4539
+ colorToken: themeColorTokenSchema
4540
+ }),
4541
+ z6.object({
4542
+ type: z6.literal("transparent")
4543
+ })
4544
+ ]),
4545
+ textColorToken: themeColorTokenSchema,
4546
+ border: z6.object({
4547
+ widthClass: z6.string(),
4548
+ // e.g., 'border', 'border-2'
4549
+ colorToken: themeColorTokenSchema,
4550
+ style: z6.enum(["all", "underline"]).optional()
4551
+ }),
4552
+ corners: z6.enum(["square", "soft", "rounded", "pill"]).nullable(),
4553
+ // null = inherit from theme.corners
4554
+ shadow: z6.object({
4555
+ elevation: z6.enum(["none", "low", "medium"]),
4556
+ softness: z6.enum(["soft", "crisp", "hard"]).nullable()
4557
+ }).nullable(),
4558
+ spacing: z6.enum(["compact", "cozy", "medium", "comfortable"]),
4559
+ // padding inside inputs
4560
+ fontSize: z6.enum(["sm", "base", "lg"])
4561
+ }),
4562
+ // Label styling
4563
+ label: z6.object({
4564
+ textColorToken: themeColorTokenSchema,
4565
+ fontWeight: z6.enum(["regular", "medium", "semibold", "bold", "black"]),
4566
+ fontSize: z6.enum(["2xs", "xs", "sm", "base"]),
4567
+ textTransform: z6.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
4568
+ letterSpacing: z6.enum(["normal", "wide", "wider", "widest"]).optional(),
4569
+ opacity: z6.number().min(0.2).max(1).optional()
4570
+ }),
4571
+ // Focus state
4572
+ focus: z6.object({
4573
+ ringColorToken: themeColorTokenSchema,
4574
+ ringWidth: z6.enum(["0", "1", "2", "3"]),
4575
+ borderColorToken: themeColorTokenSchema.optional()
4576
+ // Change border color on focus
4577
+ }),
4578
+ // Error state (for validation feedback)
4579
+ error: z6.object({
4580
+ borderColorToken: themeColorTokenSchema,
4581
+ textColorToken: themeColorTokenSchema
4582
+ }),
4583
+ // Disabled state
4584
+ disabled: z6.object({
4585
+ backgroundColorToken: themeColorTokenSchema,
4586
+ textColorToken: themeColorTokenSchema,
4587
+ opacity: z6.number().min(0.3).max(0.7)
4588
+ })
4589
+ });
4590
+
4591
+ // ../theme-core/src/navigation/types.ts
4592
+ import { z as z8 } from "zod";
4593
+
4594
+ // ../theme-core/src/interactive/baseSchema.ts
4595
+ import { z as z7 } from "zod";
4596
+ var interactiveTypographySchema = z7.object({
4597
+ /** Font family source */
4598
+ typography: z7.enum(["body", "heading"]).default("body"),
4599
+ /** Font weight */
4600
+ fontWeight: z7.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
4601
+ /** Text transform */
4602
+ textTransform: z7.enum(["none", "uppercase", "capitalize"]).default("none"),
4603
+ /** Italic style */
4604
+ italic: z7.boolean().default(false)
4605
+ });
4606
+ var effectApplicationSchema2 = z7.object({
4607
+ /** Effect preset ID */
4608
+ effectId: z7.string(),
4609
+ /** User-provided customization options */
4610
+ options: z7.record(z7.string(), z7.any()).optional()
4611
+ });
4612
+ var effectCompositionSchema = z7.object({
4613
+ /** Effects always applied */
4614
+ base: z7.array(effectApplicationSchema2).optional(),
4615
+ /** Effects applied on hover */
4616
+ hover: z7.array(effectApplicationSchema2).optional(),
4617
+ /** Effects applied on active/pressed */
4618
+ active: z7.array(effectApplicationSchema2).optional(),
4619
+ /** Effects applied on focus */
4620
+ focus: z7.array(effectApplicationSchema2).optional()
4621
+ });
4622
+
4623
+ // ../theme-core/src/navigation/types.ts
4624
+ var navLinkPaddingSchema = z8.enum(["none", "compact", "default"]);
4625
+ var navLinkPaddingXSchema = z8.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
4626
+ var navLinkBorderRadiusSchema = z8.enum(["none", "sm", "md", "full"]);
4627
+ var navLinkTextSizeSchema = z8.enum(["xs", "sm", "base", "lg"]);
4628
+ var navLinkLetterSpacingSchema = z8.enum(["normal", "wide", "wider", "widest"]);
4629
+ var navLinkStyleSchema = z8.object({
4630
+ /** Display name for the style */
4631
+ name: z8.string().min(1).max(30).optional(),
4632
+ /** Typography settings (inherited from interactive base) */
4633
+ ...interactiveTypographySchema.shape,
4634
+ /** Text color token */
4635
+ colorToken: themeColorTokenSchema.default("text"),
4636
+ /** Optional text size override */
4637
+ textSize: navLinkTextSizeSchema.optional(),
4638
+ /** Optional letter spacing override */
4639
+ letterSpacing: navLinkLetterSpacingSchema.optional(),
4640
+ /** Hover/active color token (for color-change effects) */
4641
+ hoverColorToken: themeColorTokenSchema.nullable().optional(),
4642
+ /** Padding preset */
4643
+ padding: navLinkPaddingSchema.default("compact"),
4644
+ /** Horizontal padding override (overrides horizontal component of padding preset) */
4645
+ paddingX: navLinkPaddingXSchema.optional(),
4646
+ /** Border radius (for capsule/pill styles) */
4647
+ borderRadius: navLinkBorderRadiusSchema.default("none"),
4648
+ /** Composable effects */
4649
+ effects: effectCompositionSchema.optional()
4650
+ });
4651
+
4652
+ // ../theme-core/src/customCss/validation.ts
4653
+ import { z as z9 } from "zod";
4654
+ var FORBIDDEN_SELECTORS = [":root", "html", "body"];
4655
+ var UNIVERSAL_SELECTOR = "*";
4656
+ var REMOTE_URL_PATTERN = /url\s*\(\s*['"]?(https?:|\/\/)/i;
4657
+ var JAVASCRIPT_URL_PATTERN = /javascript\s*:/i;
4658
+ function isForbiddenSelectorPart(part) {
4659
+ const normalized = part.toLowerCase().trim();
4660
+ if (!normalized) return true;
4661
+ if (normalized === UNIVERSAL_SELECTOR || normalized.startsWith("* ") || normalized.endsWith(" *") || normalized.includes(" * ")) {
4662
+ return true;
4663
+ }
4664
+ for (const forbidden of FORBIDDEN_SELECTORS) {
4665
+ if (normalized === forbidden) return true;
4666
+ if (normalized.startsWith(forbidden + " ")) return true;
4667
+ if (normalized.startsWith(forbidden + ">")) return true;
4668
+ if (normalized.startsWith(forbidden + "+")) return true;
4669
+ if (normalized.startsWith(forbidden + "~")) return true;
4670
+ if (normalized.startsWith(forbidden + ".")) return true;
4671
+ if (normalized.startsWith(forbidden + "#")) return true;
4672
+ if (normalized.startsWith(forbidden + "[")) return true;
4673
+ if (normalized.startsWith(forbidden + ":") && !normalized.startsWith(forbidden + "::")) return true;
4674
+ }
4675
+ return false;
4676
+ }
4677
+ function hasScopeEscapingSiblingCombinator(selector) {
4678
+ const normalized = selector.trim();
4679
+ return /&\s*[+~]/.test(normalized);
4680
+ }
4681
+ function containsForbiddenSelector(selector) {
4682
+ const normalized = selector.toLowerCase().trim();
4683
+ if (!normalized) return true;
4684
+ if (hasScopeEscapingSiblingCombinator(selector)) {
4685
+ return true;
4686
+ }
4687
+ const parts = normalized.split(",");
4688
+ for (const part of parts) {
4689
+ if (isForbiddenSelectorPart(part)) {
4690
+ return true;
4691
+ }
4692
+ }
4693
+ return false;
4694
+ }
4695
+ var selectorSchema = z9.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
4696
+ (s) => !containsForbiddenSelector(s),
4697
+ { message: "Global selectors (:root, html, body, *) are not allowed" }
4698
+ );
4699
+ function containsRemoteUrl(value) {
4700
+ return REMOTE_URL_PATTERN.test(value);
4701
+ }
4702
+ function containsJavascriptUrl(value) {
4703
+ return JAVASCRIPT_URL_PATTERN.test(value);
4704
+ }
4705
+ var declarationValueSchema = z9.string().max(500, "Declaration value too long (max 500 characters)").refine(
4706
+ (v) => !containsRemoteUrl(v),
4707
+ { message: "Remote url() references are not allowed. Use local paths, data URIs, or fragment IDs." }
4708
+ ).refine(
4709
+ (v) => !containsJavascriptUrl(v),
4710
+ { message: "javascript: URLs are not allowed" }
4711
+ );
4712
+ var declarationsSchema = z9.record(
4713
+ z9.string().min(1).max(100),
4714
+ // property name
4715
+ declarationValueSchema
4716
+ // property value
4717
+ );
4718
+ var customCssRuleSchema = z9.object({
4719
+ id: z9.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
4720
+ selector: selectorSchema,
4721
+ declarations: declarationsSchema
4722
+ });
4723
+ var blockCustomCssRuleSchema = customCssRuleSchema.extend({
4724
+ blockKind: z9.string().min(1, "Block kind is required").max(50, "Block kind too long")
4725
+ });
4726
+ var customCssRulesSchema = z9.array(customCssRuleSchema).optional();
4727
+ var blockCustomCssRulesSchema = z9.array(blockCustomCssRuleSchema).optional();
4728
+
4729
+ // ../theme-core/src/customCss/atRuleValidation.ts
4730
+ import { z as z10 } from "zod";
4731
+ var KEYFRAME_OFFSET_PATTERN = /^(from|to|\d{1,3}%)$/i;
4732
+ var ANIMATION_NAME_PATTERN = /^[a-zA-Z_-][a-zA-Z0-9_-]*$/;
4733
+ var BLOCKED_AT_RULES = ["@import", "@charset"];
4734
+ var BLOCKED_AT_RULE_PATTERN = /@(?:import|charset)\b/i;
4735
+ var ruleIdSchema = z10.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
4736
+ var nestedRuleSchema = z10.object({
4737
+ selector: selectorSchema,
4738
+ declarations: declarationsSchema
4739
+ });
4740
+ function isValidKeyframeOffset(offset) {
4741
+ const trimmed = offset.trim().toLowerCase();
4742
+ if (trimmed === "from" || trimmed === "to") return true;
4743
+ const match = trimmed.match(/^(\d{1,3})%$/);
4744
+ if (!match || match[1] === void 0) return false;
4745
+ const value = parseInt(match[1], 10);
4746
+ return value >= 0 && value <= 100;
4747
+ }
4748
+ var keyframeOffsetSchema = z10.string().transform((offset) => offset.trim()).refine(
4749
+ (offset) => KEYFRAME_OFFSET_PATTERN.test(offset),
4750
+ { message: 'Invalid keyframe offset. Use percentages (0%, 50%, 100%) or "from"/"to"' }
4751
+ ).refine(
4752
+ isValidKeyframeOffset,
4753
+ { message: "Keyframe offset must be between 0% and 100%" }
4754
+ );
4755
+ var animationNameSchema = z10.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
4756
+ (name) => ANIMATION_NAME_PATTERN.test(name),
4757
+ { message: "Invalid animation name. Use letters, numbers, dashes, underscores (start with letter, dash, or underscore)" }
4758
+ );
4759
+ var keyframeSchema = z10.object({
4760
+ offset: keyframeOffsetSchema,
4761
+ declarations: declarationsSchema
4762
+ });
4763
+ var keyframesAtRuleSchema = z10.object({
4764
+ id: ruleIdSchema,
4765
+ type: z10.literal("keyframes"),
4766
+ name: animationNameSchema,
4767
+ frames: z10.array(keyframeSchema).min(1, "At least one keyframe is required")
4768
+ });
4769
+ var fontFaceDeclarationsSchema = z10.record(z10.string().min(1).max(100), declarationValueSchema).refine(
4770
+ (decls) => "fontFamily" in decls || "font-family" in decls,
4771
+ { message: "font-family is required in @font-face" }
4772
+ );
4773
+ var fontFaceAtRuleSchema = z10.object({
4774
+ id: ruleIdSchema,
4775
+ type: z10.literal("font-face"),
4776
+ declarations: fontFaceDeclarationsSchema
4777
+ });
4778
+ var mediaQuerySchema = z10.string().min(1, "Media query is required").max(200, "Media query too long");
4779
+ var mediaAtRuleSchema = z10.object({
4780
+ id: ruleIdSchema,
4781
+ type: z10.literal("media"),
4782
+ query: mediaQuerySchema,
4783
+ rules: z10.array(nestedRuleSchema).min(1, "At least one rule is required")
4784
+ });
4785
+ var supportsConditionSchema = z10.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
4786
+ var supportsAtRuleSchema = z10.object({
4787
+ id: ruleIdSchema,
4788
+ type: z10.literal("supports"),
4789
+ condition: supportsConditionSchema,
4790
+ rules: z10.array(nestedRuleSchema).min(1, "At least one rule is required")
4791
+ });
4792
+ function containsBlockedAtRule(css) {
4793
+ return BLOCKED_AT_RULE_PATTERN.test(css);
4794
+ }
4795
+ var rawCssSchema = z10.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
4796
+ (css) => css.trim().startsWith("@"),
4797
+ { message: "Raw at-rule must start with @" }
4798
+ ).refine(
4799
+ (css) => !containsBlockedAtRule(css),
4800
+ { message: `Blocked at-rules: ${BLOCKED_AT_RULES.join(", ")}. Use typed at-rules or local assets instead.` }
4432
4801
  );
4802
+ var rawAtRuleSchema = z10.object({
4803
+ id: ruleIdSchema,
4804
+ type: z10.literal("raw"),
4805
+ css: rawCssSchema
4806
+ });
4807
+ var customCssAtRuleSchema = z10.discriminatedUnion("type", [
4808
+ keyframesAtRuleSchema,
4809
+ fontFaceAtRuleSchema,
4810
+ mediaAtRuleSchema,
4811
+ supportsAtRuleSchema,
4812
+ rawAtRuleSchema
4813
+ ]);
4814
+ var customCssAtRulesSchema = z10.array(customCssAtRuleSchema).optional();
4815
+
4816
+ // ../theme-core/src/shared/componentStyles.ts
4817
+ import { z as z11 } from "zod";
4818
+ var componentBorderSchema = z11.object({
4819
+ width: z11.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
4820
+ style: z11.enum(["solid", "dashed"]).default("solid"),
4821
+ colorToken: themeColorTokenSchema.optional()
4822
+ // defaults to "border" if not set
4823
+ });
4824
+ var componentShadowSchema = z11.object({
4825
+ elevation: z11.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
4826
+ });
4433
4827
 
4434
4828
  // ../theme-core/src/responsive/breakpoints.ts
4435
4829
  var BREAKPOINT_SM = 640;
@@ -4459,6 +4853,38 @@ var MQ_TABLET_ONLY = mqBetween(BREAKPOINT_SM, BREAKPOINT_LG_DOWN);
4459
4853
  var MQ_MAX_640 = mqDown(BREAKPOINT_SM);
4460
4854
  var MQ_MAX_768 = mqDown(BREAKPOINT_MD);
4461
4855
 
4856
+ // ../blocks/src/system/runtime/shared/components/FeedbackMessage.tsx
4857
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
4858
+ function joinClasses(...parts) {
4859
+ return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
4860
+ }
4861
+ function FeedbackMessage({
4862
+ tone,
4863
+ children,
4864
+ className,
4865
+ title,
4866
+ titleClassName,
4867
+ bodyClassName,
4868
+ role = "status",
4869
+ live
4870
+ }) {
4871
+ const resolvedLive = live ?? (role === "alert" ? "assertive" : "polite");
4872
+ const shouldWrapBody = Boolean(title || bodyClassName);
4873
+ return /* @__PURE__ */ jsxs2(
4874
+ "div",
4875
+ {
4876
+ className,
4877
+ "data-feedback-tone": tone,
4878
+ role,
4879
+ "aria-live": resolvedLive === "off" ? void 0 : resolvedLive,
4880
+ children: [
4881
+ title ? /* @__PURE__ */ jsx3("p", { className: joinClasses(titleClassName), "data-feedback-title": true, children: title }) : null,
4882
+ shouldWrapBody ? /* @__PURE__ */ jsx3("div", { className: joinClasses(bodyClassName), "data-feedback-body": true, children }) : children
4883
+ ]
4884
+ }
4885
+ );
4886
+ }
4887
+
4462
4888
  // ../blocks/src/system/runtime/nodes/booking-form.client.tsx
4463
4889
  import React7, { useCallback as useCallback6, useRef as useRef6, useState as useState7 } from "react";
4464
4890
 
@@ -4475,7 +4901,7 @@ var logger = {
4475
4901
 
4476
4902
  // ../altcha/src/AltchaWidget.tsx
4477
4903
  import { useEffect, useRef, useState } from "react";
4478
- import { jsx as jsx3 } from "react/jsx-runtime";
4904
+ import { jsx as jsx4 } from "react/jsx-runtime";
4479
4905
  function AltchaWidget({
4480
4906
  challengeUrl,
4481
4907
  onSolutionChange,
@@ -4521,7 +4947,7 @@ function AltchaWidget({
4521
4947
  }
4522
4948
  };
4523
4949
  }, [challengeUrl, auto, hidelogo, className, onSolutionChange]);
4524
- return /* @__PURE__ */ jsx3("div", { ref: containerRef });
4950
+ return /* @__PURE__ */ jsx4("div", { ref: containerRef });
4525
4951
  }
4526
4952
 
4527
4953
  // ../altcha/src/client.ts
@@ -4840,7 +5266,7 @@ function useMultiStep({
4840
5266
  }
4841
5267
 
4842
5268
  // ../blocks/src/system/runtime/components/multi-step/MultiStepForm.tsx
4843
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
5269
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
4844
5270
  function MultiStepForm({
4845
5271
  steps,
4846
5272
  initialData,
@@ -4876,7 +5302,7 @@ function MultiStepForm({
4876
5302
  } = context;
4877
5303
  const currentStep = visibleSteps[currentStepIndex];
4878
5304
  if (!currentStep) {
4879
- return /* @__PURE__ */ jsx4("div", { className: "rb-text-center rb-py-12", children: /* @__PURE__ */ jsx4("p", { className: "status-muted", children: "No steps available" }) });
5305
+ return /* @__PURE__ */ jsx5("div", { className: "rb-text-center rb-py-12", children: /* @__PURE__ */ jsx5("p", { className: "status-muted", children: "No steps available" }) });
4880
5306
  }
4881
5307
  const stepComponent = isValidElement(currentStep.component) ? cloneElement(
4882
5308
  currentStep.component,
@@ -4890,8 +5316,8 @@ function MultiStepForm({
4890
5316
  const showNextButton = !currentStep.isTerminal;
4891
5317
  const nextButtonLabel = isLastStep ? currentStep.nextLabel || "Complete" : currentStep.nextLabel || "Continue";
4892
5318
  const backButtonLabel = currentStep.backLabel || "Back";
4893
- return /* @__PURE__ */ jsx4(MultiStepContext.Provider, { value: context, children: /* @__PURE__ */ jsxs2("div", { className: `multi-step-form ${className}`, children: [
4894
- progressStyle !== "none" && /* @__PURE__ */ jsx4("div", { className: "rb-mb-8", children: /* @__PURE__ */ jsx4(
5319
+ return /* @__PURE__ */ jsx5(MultiStepContext.Provider, { value: context, children: /* @__PURE__ */ jsxs3("div", { className: `multi-step-form ${className}`, children: [
5320
+ progressStyle !== "none" && /* @__PURE__ */ jsx5("div", { className: "rb-mb-8", children: /* @__PURE__ */ jsx5(
4895
5321
  ProgressIndicator,
4896
5322
  {
4897
5323
  steps: visibleSteps,
@@ -4900,13 +5326,13 @@ function MultiStepForm({
4900
5326
  onStepClick: allowSkip ? goToStep : void 0
4901
5327
  }
4902
5328
  ) }),
4903
- /* @__PURE__ */ jsx4("div", { className: "step-content", children: stepComponent }),
4904
- Object.keys(errors).length > 0 && /* @__PURE__ */ jsxs2("div", { className: "rb-mt-6 alert alert-error", children: [
4905
- errors._form && /* @__PURE__ */ jsx4("p", { className: "rb-caption", children: /* @__PURE__ */ jsx4("strong", { children: errors._form }) }),
4906
- Object.entries(errors).filter(([key]) => key !== "_form").map(([key, message]) => /* @__PURE__ */ jsx4("p", { className: "rb-caption", children: message }, key))
5329
+ /* @__PURE__ */ jsx5("div", { className: "step-content", children: stepComponent }),
5330
+ Object.keys(errors).length > 0 && /* @__PURE__ */ jsxs3(FeedbackMessage, { tone: "error", className: "rb-mt-6 alert alert-error", role: "alert", children: [
5331
+ errors._form && /* @__PURE__ */ jsx5("p", { className: "rb-caption", children: /* @__PURE__ */ jsx5("strong", { children: errors._form }) }),
5332
+ Object.entries(errors).filter(([key]) => key !== "_form").map(([key, message]) => /* @__PURE__ */ jsx5("p", { className: "rb-caption", children: message }, key))
4907
5333
  ] }),
4908
- (showBackButton || showNextButton) && /* @__PURE__ */ jsxs2("div", { className: "rb-flex rb-gap-3 rb-mt-8", children: [
4909
- showBackButton && /* @__PURE__ */ jsx4(
5334
+ (showBackButton || showNextButton) && /* @__PURE__ */ jsxs3("div", { className: "rb-flex rb-gap-3 rb-mt-8", children: [
5335
+ showBackButton && /* @__PURE__ */ jsx5(
4910
5336
  "button",
4911
5337
  {
4912
5338
  type: "button",
@@ -4916,7 +5342,7 @@ function MultiStepForm({
4916
5342
  children: backButtonLabel
4917
5343
  }
4918
5344
  ),
4919
- showNextButton && /* @__PURE__ */ jsxs2(
5345
+ showNextButton && /* @__PURE__ */ jsxs3(
4920
5346
  "button",
4921
5347
  {
4922
5348
  type: "button",
@@ -4928,7 +5354,7 @@ function MultiStepForm({
4928
5354
  extraClassName: "rb-flex-1"
4929
5355
  }),
4930
5356
  children: [
4931
- (isValidating || isSubmitting) && /* @__PURE__ */ jsx4(
5357
+ (isValidating || isSubmitting) && /* @__PURE__ */ jsx5(
4932
5358
  SpinnerNode,
4933
5359
  {
4934
5360
  size: "sm",
@@ -4953,11 +5379,11 @@ function ProgressIndicator({
4953
5379
  onStepClick
4954
5380
  }) {
4955
5381
  if (style === "dots") {
4956
- return /* @__PURE__ */ jsx4("div", { className: "rb-flex rb-items-center rb-justify-center rb-gap-2", children: steps.map((step, index) => {
5382
+ return /* @__PURE__ */ jsx5("div", { className: "rb-flex rb-items-center rb-justify-center rb-gap-2", children: steps.map((step, index) => {
4957
5383
  const isActive = index === currentIndex;
4958
5384
  const isCompleted = index < currentIndex;
4959
5385
  const isClickable = onStepClick && index <= currentIndex;
4960
- return /* @__PURE__ */ jsx4(
5386
+ return /* @__PURE__ */ jsx5(
4961
5387
  "button",
4962
5388
  {
4963
5389
  type: "button",
@@ -4976,13 +5402,13 @@ function ProgressIndicator({
4976
5402
  }) });
4977
5403
  }
4978
5404
  if (style === "steps") {
4979
- return /* @__PURE__ */ jsx4("div", { className: "rb-flex rb-items-center rb-justify-between", children: steps.map((step, index) => {
5405
+ return /* @__PURE__ */ jsx5("div", { className: "rb-flex rb-items-center rb-justify-between", children: steps.map((step, index) => {
4980
5406
  const isActive = index === currentIndex;
4981
5407
  const isCompleted = index < currentIndex;
4982
5408
  const isClickable = onStepClick && index <= currentIndex;
4983
5409
  const isLast = index === steps.length - 1;
4984
- return /* @__PURE__ */ jsxs2("div", { className: "rb-flex rb-items-center rb-flex-1", children: [
4985
- /* @__PURE__ */ jsxs2(
5410
+ return /* @__PURE__ */ jsxs3("div", { className: "rb-flex rb-items-center rb-flex-1", children: [
5411
+ /* @__PURE__ */ jsxs3(
4986
5412
  "button",
4987
5413
  {
4988
5414
  type: "button",
@@ -4993,7 +5419,7 @@ function ProgressIndicator({
4993
5419
  ${isClickable ? "rb-cursor-pointer" : "rb-cursor-default"}
4994
5420
  `,
4995
5421
  children: [
4996
- /* @__PURE__ */ jsx4(
5422
+ /* @__PURE__ */ jsx5(
4997
5423
  "div",
4998
5424
  {
4999
5425
  className: `
@@ -5004,7 +5430,7 @@ function ProgressIndicator({
5004
5430
  children: isCompleted ? "\u2713" : index + 1
5005
5431
  }
5006
5432
  ),
5007
- /* @__PURE__ */ jsx4(
5433
+ /* @__PURE__ */ jsx5(
5008
5434
  "span",
5009
5435
  {
5010
5436
  className: `
@@ -5017,59 +5443,28 @@ function ProgressIndicator({
5017
5443
  ]
5018
5444
  }
5019
5445
  ),
5020
- !isLast && /* @__PURE__ */ jsx4("div", { className: "step-connector rb-ml-2 rb-mr-2 rb-hidden rb-sm-block" })
5446
+ !isLast && /* @__PURE__ */ jsx5("div", { className: "step-connector rb-ml-2 rb-mr-2 rb-hidden rb-sm-block" })
5021
5447
  ] }, step.id);
5022
5448
  }) });
5023
5449
  }
5024
5450
  const progress = (currentIndex + 1) / steps.length * 100;
5025
- return /* @__PURE__ */ jsxs2("div", { className: "rb-space-y-2", children: [
5026
- /* @__PURE__ */ jsxs2("div", { className: "rb-flex rb-justify-between rb-caption status-muted", children: [
5027
- /* @__PURE__ */ jsxs2("span", { children: [
5451
+ return /* @__PURE__ */ jsxs3("div", { className: "rb-space-y-2", children: [
5452
+ /* @__PURE__ */ jsxs3("div", { className: "rb-flex rb-justify-between rb-caption status-muted", children: [
5453
+ /* @__PURE__ */ jsxs3("span", { children: [
5028
5454
  "Step ",
5029
5455
  currentIndex + 1,
5030
5456
  " of ",
5031
5457
  steps.length
5032
5458
  ] }),
5033
- /* @__PURE__ */ jsxs2("span", { children: [
5459
+ /* @__PURE__ */ jsxs3("span", { children: [
5034
5460
  Math.round(progress),
5035
5461
  "%"
5036
5462
  ] })
5037
5463
  ] }),
5038
- /* @__PURE__ */ jsx4("div", { className: "progress-bar", children: /* @__PURE__ */ jsx4("div", { className: "progress-fill", style: { width: `${progress}%` } }) })
5464
+ /* @__PURE__ */ jsx5("div", { className: "progress-bar", children: /* @__PURE__ */ jsx5("div", { className: "progress-fill", style: { width: `${progress}%` } }) })
5039
5465
  ] });
5040
5466
  }
5041
5467
 
5042
- // ../blocks/src/system/runtime/shared/components/FeedbackMessage.tsx
5043
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
5044
- function joinClasses(...parts) {
5045
- return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
5046
- }
5047
- function FeedbackMessage({
5048
- tone,
5049
- children,
5050
- className,
5051
- title,
5052
- titleClassName,
5053
- bodyClassName,
5054
- role = "status",
5055
- live
5056
- }) {
5057
- const resolvedLive = live ?? (role === "alert" ? "assertive" : "polite");
5058
- return /* @__PURE__ */ jsxs3(
5059
- "div",
5060
- {
5061
- className,
5062
- "data-feedback-tone": tone,
5063
- role,
5064
- "aria-live": resolvedLive === "off" ? void 0 : resolvedLive,
5065
- children: [
5066
- title ? /* @__PURE__ */ jsx5("p", { className: joinClasses(titleClassName), "data-feedback-title": true, children: title }) : null,
5067
- /* @__PURE__ */ jsx5("div", { className: joinClasses(bodyClassName), "data-feedback-body": true, children })
5068
- ]
5069
- }
5070
- );
5071
- }
5072
-
5073
5468
  // ../blocks/src/system/runtime/components/booking/SuccessMessage.tsx
5074
5469
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
5075
5470
  var SuccessMessage = ({
@@ -5347,7 +5742,7 @@ function ServiceResourceSelector({
5347
5742
  /* @__PURE__ */ jsx7(SpinnerNode, { size: "md", srLabel: "Loading practitioners" }),
5348
5743
  /* @__PURE__ */ jsx7("p", { className: "ab-text ab-text--muted", children: "Loading practitioners..." })
5349
5744
  ] }),
5350
- resourceError && /* @__PURE__ */ jsx7("div", { className: "ab-alert ab-alert--error", children: resourceError }),
5745
+ resourceError && /* @__PURE__ */ jsx7(FeedbackMessage, { tone: "error", className: "ab-alert ab-alert--error", role: "alert", children: resourceError }),
5351
5746
  /* @__PURE__ */ jsxs5("div", { className: "ab-actions", children: [
5352
5747
  onBack && /* @__PURE__ */ jsx7(
5353
5748
  "button",
@@ -5493,7 +5888,7 @@ var DatePicker = ({
5493
5888
  "Select Date",
5494
5889
  required && /* @__PURE__ */ jsx9("span", { className: "ab-required", children: "*" })
5495
5890
  ] }),
5496
- /* @__PURE__ */ jsx9("div", { className: "ab-alert ab-alert--warning", children: /* @__PURE__ */ jsxs6("p", { className: "ab-text", children: [
5891
+ /* @__PURE__ */ jsx9(FeedbackMessage, { tone: "warning", className: "ab-alert ab-alert--warning", role: "status", children: /* @__PURE__ */ jsxs6("p", { className: "ab-text", children: [
5497
5892
  "No available dates in this period.",
5498
5893
  hasMore && onLoadMore && /* @__PURE__ */ jsx9(
5499
5894
  "button",
@@ -5552,7 +5947,7 @@ var TimeSlotSelector = ({
5552
5947
  "Select Time",
5553
5948
  required && /* @__PURE__ */ jsx10("span", { className: "ab-required", children: "*" })
5554
5949
  ] }),
5555
- isLoading ? /* @__PURE__ */ jsx10("div", { className: "ab-alert ab-alert--info ab-center", children: "Loading available times..." }) : slots.length === 0 ? /* @__PURE__ */ jsx10("div", { className: "ab-alert ab-alert--info ab-center", children: "No available times for this date" }) : /* @__PURE__ */ jsxs7(
5950
+ isLoading ? /* @__PURE__ */ jsx10(FeedbackMessage, { tone: "info", className: "ab-alert ab-alert--info ab-center", role: "status", children: "Loading available times..." }) : slots.length === 0 ? /* @__PURE__ */ jsx10(FeedbackMessage, { tone: "info", className: "ab-alert ab-alert--info ab-center", role: "status", children: "No available times for this date" }) : /* @__PURE__ */ jsxs7(
5556
5951
  "select",
5557
5952
  {
5558
5953
  id: "booking-slot",
@@ -5792,7 +6187,7 @@ function DateTimeSelectionStep({
5792
6187
  " minutes"
5793
6188
  ] })
5794
6189
  ] }),
5795
- error && /* @__PURE__ */ jsx11("div", { className: "ab-alert ab-alert--error", children: error }),
6190
+ error && /* @__PURE__ */ jsx11(FeedbackMessage, { tone: "error", className: "ab-alert ab-alert--error", role: "alert", children: error }),
5796
6191
  /* @__PURE__ */ jsx11(
5797
6192
  DatePicker,
5798
6193
  {
@@ -6172,7 +6567,7 @@ function PaymentOptionSelectionStep({
6172
6567
  }
6173
6568
  }, [appointmentPackages, data.selectedAppointmentPackageId, updateData]);
6174
6569
  if (resolution.mode === "unsupported" || !service) {
6175
- return /* @__PURE__ */ jsx12("div", { className: "ab-alert ab-alert--error", children: resolution.errorMessage ?? "Payment options are unavailable for this service right now." });
6570
+ return /* @__PURE__ */ jsx12(FeedbackMessage, { tone: "error", className: "ab-alert ab-alert--error", role: "alert", children: resolution.errorMessage ?? "Payment options are unavailable for this service right now." });
6176
6571
  }
6177
6572
  const viewModel = buildBookingPaymentSelectionViewModel({
6178
6573
  serviceTitle: service.title,
@@ -6188,8 +6583,8 @@ function PaymentOptionSelectionStep({
6188
6583
  /* @__PURE__ */ jsx12("h3", { className: "ab-subtitle", children: viewModel.sectionTitle }),
6189
6584
  /* @__PURE__ */ jsx12("p", { className: "ab-text ab-text--muted", children: service.title })
6190
6585
  ] }),
6191
- appointmentPackages.tag === "loading" ? /* @__PURE__ */ jsx12("div", { className: "ab-alert ab-alert--info", role: "status", children: "Checking package credits..." }) : null,
6192
- appointmentPackages.tag === "error" ? /* @__PURE__ */ jsxs9("div", { className: "ab-alert ab-alert--info", role: "status", children: [
6586
+ appointmentPackages.tag === "loading" ? /* @__PURE__ */ jsx12(FeedbackMessage, { tone: "info", className: "ab-alert ab-alert--info", role: "status", children: "Checking package credits..." }) : null,
6587
+ appointmentPackages.tag === "error" ? /* @__PURE__ */ jsxs9(FeedbackMessage, { tone: "info", className: "ab-alert ab-alert--info", role: "status", children: [
6193
6588
  appointmentPackages.message,
6194
6589
  " You can continue with the normal payment option."
6195
6590
  ] }) : null,
@@ -6281,8 +6676,44 @@ function PaymentOptionSelectionStep({
6281
6676
  }
6282
6677
 
6283
6678
  // ../blocks/src/system/runtime/components/multi-step/DynamicFormFields.tsx
6284
- import { useState as useState5, useCallback as useCallback4 } from "react";
6285
- import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
6679
+ import { useState as useState5, useCallback as useCallback4 } from "react";
6680
+
6681
+ // ../blocks/src/system/runtime/shared/components/FieldValidationMessage.tsx
6682
+ import { jsx as jsx13 } from "react/jsx-runtime";
6683
+ function getFieldValidationControlProps({
6684
+ message,
6685
+ messageId,
6686
+ describedBy
6687
+ }) {
6688
+ const hasMessage = Boolean(message);
6689
+ const ariaDescribedBy = [describedBy, hasMessage ? messageId : void 0].filter((part) => typeof part === "string" && part.length > 0).join(" ");
6690
+ return {
6691
+ "aria-invalid": hasMessage ? "true" : void 0,
6692
+ "aria-describedby": ariaDescribedBy || void 0
6693
+ };
6694
+ }
6695
+ function FieldValidationMessage({
6696
+ id,
6697
+ children,
6698
+ className,
6699
+ live = "assertive"
6700
+ }) {
6701
+ return /* @__PURE__ */ jsx13(
6702
+ "p",
6703
+ {
6704
+ id,
6705
+ className,
6706
+ "data-field-validation-message": true,
6707
+ "data-field-validation-tone": "error",
6708
+ role: "alert",
6709
+ "aria-live": live === "off" ? void 0 : live,
6710
+ children
6711
+ }
6712
+ );
6713
+ }
6714
+
6715
+ // ../blocks/src/system/runtime/components/multi-step/DynamicFormFields.tsx
6716
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
6286
6717
  function DynamicFormFields({
6287
6718
  fields,
6288
6719
  showLabels = true,
@@ -6359,26 +6790,30 @@ function DynamicFormFields({
6359
6790
  },
6360
6791
  [data, touched]
6361
6792
  );
6362
- return /* @__PURE__ */ jsx13("div", { className: `rb-space-y-6 ${className}`, children: fields.map((field) => {
6793
+ return /* @__PURE__ */ jsx14("div", { className: `rb-space-y-6 ${className}`, children: fields.map((field) => {
6363
6794
  const error = getFieldError(field);
6364
6795
  const value = data[field.id] ?? "";
6796
+ const helpId = field.helpText ? `${field.id}-help` : void 0;
6797
+ const errorId = `${field.id}-error`;
6365
6798
  return /* @__PURE__ */ jsxs10("div", { className: "rb-space-y-2", children: [
6366
6799
  showLabels && /* @__PURE__ */ jsxs10("label", { htmlFor: field.id, className: "form-label", children: [
6367
6800
  field.label,
6368
- field.required && /* @__PURE__ */ jsx13("span", { className: "required-marker", children: "*" })
6801
+ field.required && /* @__PURE__ */ jsx14("span", { className: "required-marker", children: "*" })
6369
6802
  ] }),
6370
- field.helpText && /* @__PURE__ */ jsx13("p", { className: "rb-caption status-muted", children: field.helpText }),
6371
- /* @__PURE__ */ jsx13(
6803
+ field.helpText && /* @__PURE__ */ jsx14("p", { id: helpId, className: "rb-caption status-muted", children: field.helpText }),
6804
+ /* @__PURE__ */ jsx14(
6372
6805
  FieldInput,
6373
6806
  {
6374
6807
  field,
6375
6808
  value,
6376
6809
  onChange: (val) => handleChange(field.id, val),
6377
6810
  onBlur: () => handleBlur(field.id),
6378
- error
6811
+ error,
6812
+ errorId,
6813
+ describedBy: helpId
6379
6814
  }
6380
6815
  ),
6381
- error && /* @__PURE__ */ jsx13("p", { className: "rb-caption status-error", children: error })
6816
+ error && /* @__PURE__ */ jsx14(FieldValidationMessage, { id: errorId, className: "rb-caption status-error", children: error })
6382
6817
  ] }, field.id);
6383
6818
  }) });
6384
6819
  }
@@ -6387,7 +6822,9 @@ function FieldInput({
6387
6822
  value,
6388
6823
  onChange,
6389
6824
  onBlur,
6390
- error
6825
+ error,
6826
+ errorId,
6827
+ describedBy
6391
6828
  }) {
6392
6829
  const inputClass = "form-input";
6393
6830
  const textareaClass = "form-textarea";
@@ -6395,9 +6832,14 @@ function FieldInput({
6395
6832
  const checkboxClass = "form-checkbox";
6396
6833
  const radioClass = "form-radio";
6397
6834
  const strValue = typeof value === "string" ? value : String(value ?? "");
6835
+ const validationProps = getFieldValidationControlProps({
6836
+ message: error,
6837
+ messageId: errorId,
6838
+ describedBy
6839
+ });
6398
6840
  switch (field.type) {
6399
6841
  case "textarea":
6400
- return /* @__PURE__ */ jsx13(
6842
+ return /* @__PURE__ */ jsx14(
6401
6843
  "textarea",
6402
6844
  {
6403
6845
  id: field.id,
@@ -6410,13 +6852,13 @@ function FieldInput({
6410
6852
  minLength: field.minLength,
6411
6853
  maxLength: field.maxLength,
6412
6854
  rows: 4,
6413
- "aria-invalid": error ? "true" : void 0,
6855
+ ...validationProps,
6414
6856
  className: textareaClass
6415
6857
  }
6416
6858
  );
6417
6859
  case "select":
6418
6860
  if (field.multiple) {
6419
- return /* @__PURE__ */ jsx13(
6861
+ return /* @__PURE__ */ jsx14(
6420
6862
  "select",
6421
6863
  {
6422
6864
  id: field.id,
@@ -6429,9 +6871,9 @@ function FieldInput({
6429
6871
  onBlur,
6430
6872
  required: field.required,
6431
6873
  multiple: true,
6432
- "aria-invalid": error ? "true" : void 0,
6874
+ ...validationProps,
6433
6875
  className: `${selectClass} rb-h-32`,
6434
- children: field.options?.map((opt) => /* @__PURE__ */ jsx13("option", { value: opt.value, children: opt.label }, opt.value))
6876
+ children: field.options?.map((opt) => /* @__PURE__ */ jsx14("option", { value: opt.value, children: opt.label }, opt.value))
6435
6877
  }
6436
6878
  );
6437
6879
  }
@@ -6444,17 +6886,17 @@ function FieldInput({
6444
6886
  onChange: (e) => onChange(e.target.value),
6445
6887
  onBlur,
6446
6888
  required: field.required,
6447
- "aria-invalid": error ? "true" : void 0,
6889
+ ...validationProps,
6448
6890
  className: selectClass,
6449
6891
  children: [
6450
- /* @__PURE__ */ jsx13("option", { value: "", children: "Select an option..." }),
6451
- field.options?.map((opt) => /* @__PURE__ */ jsx13("option", { value: opt.value, children: opt.label }, opt.value))
6892
+ /* @__PURE__ */ jsx14("option", { value: "", children: "Select an option..." }),
6893
+ field.options?.map((opt) => /* @__PURE__ */ jsx14("option", { value: opt.value, children: opt.label }, opt.value))
6452
6894
  ]
6453
6895
  }
6454
6896
  );
6455
6897
  case "radio":
6456
- return /* @__PURE__ */ jsx13("div", { className: "rb-space-y-2", children: field.options?.map((opt) => /* @__PURE__ */ jsxs10("label", { className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer", children: [
6457
- /* @__PURE__ */ jsx13(
6898
+ return /* @__PURE__ */ jsx14("div", { className: "rb-space-y-2", children: field.options?.map((opt) => /* @__PURE__ */ jsxs10("label", { className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer", children: [
6899
+ /* @__PURE__ */ jsx14(
6458
6900
  "input",
6459
6901
  {
6460
6902
  type: "radio",
@@ -6464,16 +6906,17 @@ function FieldInput({
6464
6906
  onChange: (e) => onChange(e.target.value),
6465
6907
  onBlur,
6466
6908
  required: field.required,
6909
+ ...validationProps,
6467
6910
  className: radioClass
6468
6911
  }
6469
6912
  ),
6470
- /* @__PURE__ */ jsx13("span", { className: "rb-caption", children: opt.label })
6913
+ /* @__PURE__ */ jsx14("span", { className: "rb-caption", children: opt.label })
6471
6914
  ] }, opt.value)) });
6472
6915
  case "checkbox":
6473
6916
  if (field.options && field.options.length > 1) {
6474
6917
  const checkedValues = Array.isArray(value) ? value : [];
6475
- return /* @__PURE__ */ jsx13("div", { className: "rb-space-y-2", children: field.options.map((opt) => /* @__PURE__ */ jsxs10("label", { className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer", children: [
6476
- /* @__PURE__ */ jsx13(
6918
+ return /* @__PURE__ */ jsx14("div", { className: "rb-space-y-2", children: field.options.map((opt) => /* @__PURE__ */ jsxs10("label", { className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer", children: [
6919
+ /* @__PURE__ */ jsx14(
6477
6920
  "input",
6478
6921
  {
6479
6922
  type: "checkbox",
@@ -6485,14 +6928,15 @@ function FieldInput({
6485
6928
  onChange(newValues);
6486
6929
  },
6487
6930
  onBlur,
6931
+ ...validationProps,
6488
6932
  className: checkboxClass
6489
6933
  }
6490
6934
  ),
6491
- /* @__PURE__ */ jsx13("span", { className: "rb-caption", children: opt.label })
6935
+ /* @__PURE__ */ jsx14("span", { className: "rb-caption", children: opt.label })
6492
6936
  ] }, opt.value)) });
6493
6937
  }
6494
6938
  return /* @__PURE__ */ jsxs10("label", { className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer", children: [
6495
- /* @__PURE__ */ jsx13(
6939
+ /* @__PURE__ */ jsx14(
6496
6940
  "input",
6497
6941
  {
6498
6942
  type: "checkbox",
@@ -6502,14 +6946,15 @@ function FieldInput({
6502
6946
  onChange: (e) => onChange(e.target.checked),
6503
6947
  onBlur,
6504
6948
  required: field.required,
6949
+ ...validationProps,
6505
6950
  className: checkboxClass
6506
6951
  }
6507
6952
  ),
6508
- /* @__PURE__ */ jsx13("span", { className: "rb-caption", children: field.placeholder || field.label })
6953
+ /* @__PURE__ */ jsx14("span", { className: "rb-caption", children: field.placeholder || field.label })
6509
6954
  ] });
6510
6955
  case "booking_requirement_consent":
6511
6956
  return /* @__PURE__ */ jsxs10("label", { className: "rb-flex rb-items-start rb-gap-2 rb-cursor-pointer", children: [
6512
- /* @__PURE__ */ jsx13(
6957
+ /* @__PURE__ */ jsx14(
6513
6958
  "input",
6514
6959
  {
6515
6960
  type: "checkbox",
@@ -6519,13 +6964,14 @@ function FieldInput({
6519
6964
  onChange: (e) => onChange(e.target.checked),
6520
6965
  onBlur,
6521
6966
  required: field.required,
6967
+ ...validationProps,
6522
6968
  className: `${checkboxClass} rb-mt-0.5`
6523
6969
  }
6524
6970
  ),
6525
- /* @__PURE__ */ jsx13("span", { className: "rb-caption", children: field.placeholder || field.label })
6971
+ /* @__PURE__ */ jsx14("span", { className: "rb-caption", children: field.placeholder || field.label })
6526
6972
  ] });
6527
6973
  case "number":
6528
- return /* @__PURE__ */ jsx13(
6974
+ return /* @__PURE__ */ jsx14(
6529
6975
  "input",
6530
6976
  {
6531
6977
  type: "number",
@@ -6538,12 +6984,12 @@ function FieldInput({
6538
6984
  required: field.required,
6539
6985
  min: field.min,
6540
6986
  max: field.max,
6541
- "aria-invalid": error ? "true" : void 0,
6987
+ ...validationProps,
6542
6988
  className: inputClass
6543
6989
  }
6544
6990
  );
6545
6991
  case "date":
6546
- return /* @__PURE__ */ jsx13(
6992
+ return /* @__PURE__ */ jsx14(
6547
6993
  "input",
6548
6994
  {
6549
6995
  type: "date",
@@ -6555,12 +7001,12 @@ function FieldInput({
6555
7001
  required: field.required,
6556
7002
  min: field.min ? String(field.min) : void 0,
6557
7003
  max: field.max ? String(field.max) : void 0,
6558
- "aria-invalid": error ? "true" : void 0,
7004
+ ...validationProps,
6559
7005
  className: inputClass
6560
7006
  }
6561
7007
  );
6562
7008
  case "time":
6563
- return /* @__PURE__ */ jsx13(
7009
+ return /* @__PURE__ */ jsx14(
6564
7010
  "input",
6565
7011
  {
6566
7012
  type: "time",
@@ -6570,13 +7016,13 @@ function FieldInput({
6570
7016
  onChange: (e) => onChange(e.target.value),
6571
7017
  onBlur,
6572
7018
  required: field.required,
6573
- "aria-invalid": error ? "true" : void 0,
7019
+ ...validationProps,
6574
7020
  className: inputClass
6575
7021
  }
6576
7022
  );
6577
7023
  // text, email, tel, url
6578
7024
  default:
6579
- return /* @__PURE__ */ jsx13(
7025
+ return /* @__PURE__ */ jsx14(
6580
7026
  "input",
6581
7027
  {
6582
7028
  type: field.type,
@@ -6590,7 +7036,7 @@ function FieldInput({
6590
7036
  minLength: field.minLength,
6591
7037
  maxLength: field.maxLength,
6592
7038
  pattern: field.pattern,
6593
- "aria-invalid": error ? "true" : void 0,
7039
+ ...validationProps,
6594
7040
  className: inputClass
6595
7041
  }
6596
7042
  );
@@ -7048,7 +7494,7 @@ function useBookingSubmission(_siteId) {
7048
7494
  }
7049
7495
 
7050
7496
  // ../blocks/src/system/runtime/nodes/course-registration/DiscountCodeSection.tsx
7051
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
7497
+ import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
7052
7498
  function DiscountCodeSection({
7053
7499
  isOpen,
7054
7500
  code,
@@ -7056,10 +7502,10 @@ function DiscountCodeSection({
7056
7502
  onChange,
7057
7503
  onRemove
7058
7504
  }) {
7059
- return /* @__PURE__ */ jsx14("div", { className: "cr-discount", children: !isOpen ? /* @__PURE__ */ jsx14("button", { type: "button", className: "cr-discount__toggle", onClick: onOpen, children: "Have a discount code?" }) : /* @__PURE__ */ jsxs11("div", { className: "cr-discount__form", children: [
7060
- /* @__PURE__ */ jsx14("label", { htmlFor: "cr-discount-code", className: "cr-discount__label", children: "Discount code" }),
7505
+ return /* @__PURE__ */ jsx15("div", { className: "cr-discount", children: !isOpen ? /* @__PURE__ */ jsx15("button", { type: "button", className: "cr-discount__toggle", onClick: onOpen, children: "Have a discount code?" }) : /* @__PURE__ */ jsxs11("div", { className: "cr-discount__form", children: [
7506
+ /* @__PURE__ */ jsx15("label", { htmlFor: "cr-discount-code", className: "cr-discount__label", children: "Discount code" }),
7061
7507
  /* @__PURE__ */ jsxs11("div", { className: "cr-discount__row", children: [
7062
- /* @__PURE__ */ jsx14(
7508
+ /* @__PURE__ */ jsx15(
7063
7509
  "input",
7064
7510
  {
7065
7511
  id: "cr-discount-code",
@@ -7070,9 +7516,9 @@ function DiscountCodeSection({
7070
7516
  autoComplete: "off"
7071
7517
  }
7072
7518
  ),
7073
- /* @__PURE__ */ jsx14("button", { type: "button", className: "cr-discount__remove", onClick: onRemove, children: "Remove" })
7519
+ /* @__PURE__ */ jsx15("button", { type: "button", className: "cr-discount__remove", onClick: onRemove, children: "Remove" })
7074
7520
  ] }),
7075
- /* @__PURE__ */ jsx14("p", { className: "cr-discount__hint", children: "Applied at checkout." })
7521
+ /* @__PURE__ */ jsx15("p", { className: "cr-discount__hint", children: "Applied at checkout." })
7076
7522
  ] }) });
7077
7523
  }
7078
7524
 
@@ -7160,7 +7606,7 @@ function scrollToBlock(anchorId) {
7160
7606
  }
7161
7607
 
7162
7608
  // ../blocks/src/system/runtime/nodes/booking-form.client.tsx
7163
- import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
7609
+ import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
7164
7610
  var PORTAL_REBOOK_QUERY_PARAM = "rebook";
7165
7611
  var PORTAL_REBOOK_QUERY_VALUE = "1";
7166
7612
  var REBOOK_COMPLETION_MODE_VERIFIED_CHECKOUT = "verified_checkout";
@@ -7296,11 +7742,13 @@ var BookingFormClient = ({
7296
7742
  viewState.kind
7297
7743
  ]);
7298
7744
  if (render.display.state === "missing" || !form || !render.hydration.formId) {
7299
- return /* @__PURE__ */ jsx15(
7300
- "div",
7745
+ return /* @__PURE__ */ jsx16(
7746
+ FeedbackMessage,
7301
7747
  {
7748
+ tone: "error",
7302
7749
  className: `ab-alert ab-alert--error ${render.display.className ?? ""}`.trim(),
7303
- children: /* @__PURE__ */ jsx15("p", { className: "ab-text", children: render.display.message ?? "Booking form not found. Please check your configuration." })
7750
+ role: "alert",
7751
+ children: /* @__PURE__ */ jsx16("p", { className: "ab-text", children: render.display.message ?? "Booking form not found. Please check your configuration." })
7304
7752
  }
7305
7753
  );
7306
7754
  }
@@ -7342,7 +7790,7 @@ var BookingFormClient = ({
7342
7790
  window.location.href = result.data.checkoutUrl;
7343
7791
  };
7344
7792
  if (viewState.kind === "success") {
7345
- return /* @__PURE__ */ jsx15(
7793
+ return /* @__PURE__ */ jsx16(
7346
7794
  SuccessMessage,
7347
7795
  {
7348
7796
  message: getBookingSuccessMessage(render.display.successMessage),
@@ -7352,18 +7800,18 @@ var BookingFormClient = ({
7352
7800
  );
7353
7801
  }
7354
7802
  if (viewState.kind === "verifying") {
7355
- return /* @__PURE__ */ jsx15(
7803
+ return /* @__PURE__ */ jsx16(
7356
7804
  "div",
7357
7805
  {
7358
7806
  id: bookingAnchorId,
7359
7807
  className: render.display.className ?? void 0,
7360
- children: /* @__PURE__ */ jsx15("div", { className: "ab-alert ab-alert--info", role: "status", children: /* @__PURE__ */ jsx15("p", { className: "ab-text", children: viewState.message }) })
7808
+ children: /* @__PURE__ */ jsx16(FeedbackMessage, { tone: "info", className: "ab-alert ab-alert--info", role: "status", children: /* @__PURE__ */ jsx16("p", { className: "ab-text", children: viewState.message }) })
7361
7809
  }
7362
7810
  );
7363
7811
  }
7364
7812
  return /* @__PURE__ */ jsxs12("div", { id: bookingAnchorId, className: render.display.className ?? void 0, children: [
7365
- render.hydration.noticeMessage ? /* @__PURE__ */ jsx15("div", { className: "ab-alert ab-alert--info rb-mb-4", role: "status", children: /* @__PURE__ */ jsx15("p", { className: "ab-text", children: render.hydration.noticeMessage }) }) : null,
7366
- /* @__PURE__ */ jsx15(
7813
+ render.hydration.noticeMessage ? /* @__PURE__ */ jsx16(FeedbackMessage, { tone: "info", className: "ab-alert ab-alert--info rb-mb-4", role: "status", children: /* @__PURE__ */ jsx16("p", { className: "ab-text", children: render.hydration.noticeMessage }) }) : null,
7814
+ /* @__PURE__ */ jsx16(
7367
7815
  MultiStepForm,
7368
7816
  {
7369
7817
  steps,
@@ -7380,7 +7828,7 @@ var BookingFormClient = ({
7380
7828
  }
7381
7829
  ),
7382
7830
  shouldShowDiscountSection ? /* @__PURE__ */ jsxs12("div", { className: "rb-mt-6", children: [
7383
- discountUi.manualCodeEntryAllowed ? /* @__PURE__ */ jsx15(
7831
+ discountUi.manualCodeEntryAllowed ? /* @__PURE__ */ jsx16(
7384
7832
  DiscountCodeSection,
7385
7833
  {
7386
7834
  isOpen: discountUi.discountUiOpen,
@@ -7393,16 +7841,16 @@ var BookingFormClient = ({
7393
7841
  }
7394
7842
  }
7395
7843
  ) : null,
7396
- discountUi.autoAppliedDiscount && discountUi.discountCode.trim().length === 0 ? /* @__PURE__ */ jsx15("div", { className: "ab-alert ab-alert--info rb-mt-4", role: "status", children: /* @__PURE__ */ jsxs12("p", { className: "ab-text", children: [
7844
+ discountUi.autoAppliedDiscount && discountUi.discountCode.trim().length === 0 ? /* @__PURE__ */ jsx16(FeedbackMessage, { tone: "info", className: "ab-alert ab-alert--info rb-mt-4", role: "status", children: /* @__PURE__ */ jsxs12("p", { className: "ab-text", children: [
7397
7845
  "Discount available: ",
7398
7846
  discountUi.autoAppliedDiscount.publicLabel,
7399
7847
  " ",
7400
7848
  "will apply automatically at checkout."
7401
7849
  ] }) }) : null
7402
7850
  ] }) : null,
7403
- feedback.tag === "error" ? /* @__PURE__ */ jsxs12("div", { className: "ab-alert ab-alert--error", role: "alert", children: [
7404
- /* @__PURE__ */ jsx15("p", { className: "ab-text", children: feedback.message }),
7405
- /* @__PURE__ */ jsx15(
7851
+ feedback.tag === "error" ? /* @__PURE__ */ jsxs12(FeedbackMessage, { tone: "error", className: "ab-alert ab-alert--error", role: "alert", children: [
7852
+ /* @__PURE__ */ jsx16("p", { className: "ab-text", children: feedback.message }),
7853
+ /* @__PURE__ */ jsx16(
7406
7854
  "button",
7407
7855
  {
7408
7856
  type: "button",
@@ -7412,7 +7860,7 @@ var BookingFormClient = ({
7412
7860
  }
7413
7861
  )
7414
7862
  ] }) : null,
7415
- showSpamProtection && /* @__PURE__ */ jsx15("div", { className: "ab-altcha", children: /* @__PURE__ */ jsx15(
7863
+ showSpamProtection && /* @__PURE__ */ jsx16("div", { className: "ab-altcha", children: /* @__PURE__ */ jsx16(
7416
7864
  AltchaWidget,
7417
7865
  {
7418
7866
  challengeUrl: getChallengeUrl(),
@@ -7425,127 +7873,6 @@ var BookingFormClient = ({
7425
7873
  // ../theme-core/src/ClientThemeScope.tsx
7426
7874
  import { useMemo as useMemo6 } from "react";
7427
7875
 
7428
- // ../theme-core/src/inputs/types.ts
7429
- import { z as z6 } from "zod";
7430
- var inputSystemSchema = z6.object({
7431
- // Base styling (applied to all inputs)
7432
- base: z6.object({
7433
- background: z6.union([
7434
- z6.object({
7435
- type: z6.literal("solid"),
7436
- colorToken: z6.string()
7437
- }),
7438
- z6.object({
7439
- type: z6.literal("transparent")
7440
- })
7441
- ]),
7442
- textColorToken: z6.string(),
7443
- border: z6.object({
7444
- widthClass: z6.string(),
7445
- // e.g., 'border', 'border-2'
7446
- colorToken: z6.string(),
7447
- style: z6.enum(["all", "underline"]).optional()
7448
- }),
7449
- corners: z6.enum(["square", "soft", "rounded", "pill"]).nullable(),
7450
- // null = inherit from theme.corners
7451
- shadow: z6.object({
7452
- elevation: z6.enum(["none", "low", "medium"]),
7453
- softness: z6.enum(["soft", "crisp", "hard"]).nullable()
7454
- }).nullable(),
7455
- spacing: z6.enum(["compact", "cozy", "medium", "comfortable"]),
7456
- // padding inside inputs
7457
- fontSize: z6.enum(["sm", "base", "lg"])
7458
- }),
7459
- // Label styling
7460
- label: z6.object({
7461
- textColorToken: z6.string(),
7462
- fontWeight: z6.enum(["regular", "medium", "semibold", "bold", "black"]),
7463
- fontSize: z6.enum(["2xs", "xs", "sm", "base"]),
7464
- textTransform: z6.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
7465
- letterSpacing: z6.enum(["normal", "wide", "wider", "widest"]).optional(),
7466
- opacity: z6.number().min(0.2).max(1).optional()
7467
- }),
7468
- // Focus state
7469
- focus: z6.object({
7470
- ringColorToken: z6.string(),
7471
- ringWidth: z6.enum(["0", "1", "2", "3"]),
7472
- borderColorToken: z6.string().optional()
7473
- // Change border color on focus
7474
- }),
7475
- // Error state (for validation feedback)
7476
- error: z6.object({
7477
- borderColorToken: z6.string(),
7478
- textColorToken: z6.string()
7479
- }),
7480
- // Disabled state
7481
- disabled: z6.object({
7482
- backgroundColorToken: z6.string(),
7483
- textColorToken: z6.string(),
7484
- opacity: z6.number().min(0.3).max(0.7)
7485
- })
7486
- });
7487
-
7488
- // ../theme-core/src/navigation/types.ts
7489
- import { z as z8 } from "zod";
7490
-
7491
- // ../theme-core/src/interactive/baseSchema.ts
7492
- import { z as z7 } from "zod";
7493
- var interactiveTypographySchema = z7.object({
7494
- /** Font family source */
7495
- typography: z7.enum(["body", "heading"]).default("body"),
7496
- /** Font weight */
7497
- fontWeight: z7.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
7498
- /** Text transform */
7499
- textTransform: z7.enum(["none", "uppercase", "capitalize"]).default("none"),
7500
- /** Italic style */
7501
- italic: z7.boolean().default(false)
7502
- });
7503
- var effectApplicationSchema2 = z7.object({
7504
- /** Effect preset ID */
7505
- effectId: z7.string(),
7506
- /** User-provided customization options */
7507
- options: z7.record(z7.string(), z7.any()).optional()
7508
- });
7509
- var effectCompositionSchema = z7.object({
7510
- /** Effects always applied */
7511
- base: z7.array(effectApplicationSchema2).optional(),
7512
- /** Effects applied on hover */
7513
- hover: z7.array(effectApplicationSchema2).optional(),
7514
- /** Effects applied on active/pressed */
7515
- active: z7.array(effectApplicationSchema2).optional(),
7516
- /** Effects applied on focus */
7517
- focus: z7.array(effectApplicationSchema2).optional()
7518
- });
7519
-
7520
- // ../theme-core/src/navigation/types.ts
7521
- var navLinkPaddingSchema = z8.enum(["none", "compact", "default"]);
7522
- var navLinkPaddingXSchema = z8.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
7523
- var navLinkBorderRadiusSchema = z8.enum(["none", "sm", "md", "full"]);
7524
- var navLinkTextSizeSchema = z8.enum(["xs", "sm", "base", "lg"]);
7525
- var navLinkLetterSpacingSchema = z8.enum(["normal", "wide", "wider", "widest"]);
7526
- var navLinkStyleSchema = z8.object({
7527
- /** Display name for the style */
7528
- name: z8.string().min(1).max(30).optional(),
7529
- /** Typography settings (inherited from interactive base) */
7530
- ...interactiveTypographySchema.shape,
7531
- /** Text color token */
7532
- colorToken: z8.string().default("text"),
7533
- /** Optional text size override */
7534
- textSize: navLinkTextSizeSchema.optional(),
7535
- /** Optional letter spacing override */
7536
- letterSpacing: navLinkLetterSpacingSchema.optional(),
7537
- /** Hover/active color token (for color-change effects) */
7538
- hoverColorToken: z8.string().nullable().optional(),
7539
- /** Padding preset */
7540
- padding: navLinkPaddingSchema.default("compact"),
7541
- /** Horizontal padding override (overrides horizontal component of padding preset) */
7542
- paddingX: navLinkPaddingXSchema.optional(),
7543
- /** Border radius (for capsule/pill styles) */
7544
- borderRadius: navLinkBorderRadiusSchema.default("none"),
7545
- /** Composable effects */
7546
- effects: effectCompositionSchema.optional()
7547
- });
7548
-
7549
7876
  // ../theme-core/src/navigation/presets.ts
7550
7877
  var NAV_LINK_PRESETS = {
7551
7878
  /**
@@ -7690,18 +8017,6 @@ var NAV_LINK_PRESETS = {
7690
8017
  };
7691
8018
  var NAV_LINK_PRESET_IDS = Object.keys(NAV_LINK_PRESETS);
7692
8019
 
7693
- // ../theme-core/src/shared/componentStyles.ts
7694
- import { z as z9 } from "zod";
7695
- var componentBorderSchema = z9.object({
7696
- width: z9.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
7697
- style: z9.enum(["solid", "dashed"]).default("solid"),
7698
- colorToken: z9.string().optional()
7699
- // defaults to "border" if not set
7700
- });
7701
- var componentShadowSchema = z9.object({
7702
- elevation: z9.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
7703
- });
7704
-
7705
8020
  // ../theme-core/src/layout/generateLayoutCss.ts
7706
8021
  var waveTransitionMask = svgDataUrl(
7707
8022
  "<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V46C130 55 260 24 420 30C590 36 690 62 860 42C1035 21 1160 47 1305 36C1365 31 1415 33 1440 38V72H0Z' fill='white'/></svg>"
@@ -8159,170 +8474,6 @@ blockVarRegistry.set("testimonials", generateTestimonialsVars);
8159
8474
  blockVarRegistry.set("course-details", generateCourseDetailsVars);
8160
8475
  blockVarRegistry.set("course-registration", generateCourseRegistrationVars);
8161
8476
 
8162
- // ../theme-core/src/customCss/validation.ts
8163
- import { z as z10 } from "zod";
8164
- var FORBIDDEN_SELECTORS = [":root", "html", "body"];
8165
- var UNIVERSAL_SELECTOR = "*";
8166
- var REMOTE_URL_PATTERN = /url\s*\(\s*['"]?(https?:|\/\/)/i;
8167
- var JAVASCRIPT_URL_PATTERN = /javascript\s*:/i;
8168
- function isForbiddenSelectorPart(part) {
8169
- const normalized = part.toLowerCase().trim();
8170
- if (!normalized) return true;
8171
- if (normalized === UNIVERSAL_SELECTOR || normalized.startsWith("* ") || normalized.endsWith(" *") || normalized.includes(" * ")) {
8172
- return true;
8173
- }
8174
- for (const forbidden of FORBIDDEN_SELECTORS) {
8175
- if (normalized === forbidden) return true;
8176
- if (normalized.startsWith(forbidden + " ")) return true;
8177
- if (normalized.startsWith(forbidden + ">")) return true;
8178
- if (normalized.startsWith(forbidden + "+")) return true;
8179
- if (normalized.startsWith(forbidden + "~")) return true;
8180
- if (normalized.startsWith(forbidden + ".")) return true;
8181
- if (normalized.startsWith(forbidden + "#")) return true;
8182
- if (normalized.startsWith(forbidden + "[")) return true;
8183
- if (normalized.startsWith(forbidden + ":") && !normalized.startsWith(forbidden + "::")) return true;
8184
- }
8185
- return false;
8186
- }
8187
- function hasScopeEscapingSiblingCombinator(selector) {
8188
- const normalized = selector.trim();
8189
- return /&\s*[+~]/.test(normalized);
8190
- }
8191
- function containsForbiddenSelector(selector) {
8192
- const normalized = selector.toLowerCase().trim();
8193
- if (!normalized) return true;
8194
- if (hasScopeEscapingSiblingCombinator(selector)) {
8195
- return true;
8196
- }
8197
- const parts = normalized.split(",");
8198
- for (const part of parts) {
8199
- if (isForbiddenSelectorPart(part)) {
8200
- return true;
8201
- }
8202
- }
8203
- return false;
8204
- }
8205
- var selectorSchema = z10.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
8206
- (s) => !containsForbiddenSelector(s),
8207
- { message: "Global selectors (:root, html, body, *) are not allowed" }
8208
- );
8209
- function containsRemoteUrl(value) {
8210
- return REMOTE_URL_PATTERN.test(value);
8211
- }
8212
- function containsJavascriptUrl(value) {
8213
- return JAVASCRIPT_URL_PATTERN.test(value);
8214
- }
8215
- var declarationValueSchema = z10.string().max(500, "Declaration value too long (max 500 characters)").refine(
8216
- (v) => !containsRemoteUrl(v),
8217
- { message: "Remote url() references are not allowed. Use local paths, data URIs, or fragment IDs." }
8218
- ).refine(
8219
- (v) => !containsJavascriptUrl(v),
8220
- { message: "javascript: URLs are not allowed" }
8221
- );
8222
- var declarationsSchema = z10.record(
8223
- z10.string().min(1).max(100),
8224
- // property name
8225
- declarationValueSchema
8226
- // property value
8227
- );
8228
- var customCssRuleSchema = z10.object({
8229
- id: z10.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
8230
- selector: selectorSchema,
8231
- declarations: declarationsSchema
8232
- });
8233
- var blockCustomCssRuleSchema = customCssRuleSchema.extend({
8234
- blockKind: z10.string().min(1, "Block kind is required").max(50, "Block kind too long")
8235
- });
8236
- var customCssRulesSchema = z10.array(customCssRuleSchema).optional();
8237
- var blockCustomCssRulesSchema = z10.array(blockCustomCssRuleSchema).optional();
8238
-
8239
- // ../theme-core/src/customCss/atRuleValidation.ts
8240
- import { z as z11 } from "zod";
8241
- var KEYFRAME_OFFSET_PATTERN = /^(from|to|\d{1,3}%)$/i;
8242
- var ANIMATION_NAME_PATTERN = /^[a-zA-Z_-][a-zA-Z0-9_-]*$/;
8243
- var BLOCKED_AT_RULES = ["@import", "@charset"];
8244
- var BLOCKED_AT_RULE_PATTERN = /@(?:import|charset)\b/i;
8245
- var ruleIdSchema = z11.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
8246
- var nestedRuleSchema = z11.object({
8247
- selector: selectorSchema,
8248
- declarations: declarationsSchema
8249
- });
8250
- function isValidKeyframeOffset(offset) {
8251
- const trimmed = offset.trim().toLowerCase();
8252
- if (trimmed === "from" || trimmed === "to") return true;
8253
- const match = trimmed.match(/^(\d{1,3})%$/);
8254
- if (!match || match[1] === void 0) return false;
8255
- const value = parseInt(match[1], 10);
8256
- return value >= 0 && value <= 100;
8257
- }
8258
- var keyframeOffsetSchema = z11.string().transform((offset) => offset.trim()).refine(
8259
- (offset) => KEYFRAME_OFFSET_PATTERN.test(offset),
8260
- { message: 'Invalid keyframe offset. Use percentages (0%, 50%, 100%) or "from"/"to"' }
8261
- ).refine(
8262
- isValidKeyframeOffset,
8263
- { message: "Keyframe offset must be between 0% and 100%" }
8264
- );
8265
- var animationNameSchema = z11.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
8266
- (name) => ANIMATION_NAME_PATTERN.test(name),
8267
- { message: "Invalid animation name. Use letters, numbers, dashes, underscores (start with letter, dash, or underscore)" }
8268
- );
8269
- var keyframeSchema = z11.object({
8270
- offset: keyframeOffsetSchema,
8271
- declarations: declarationsSchema
8272
- });
8273
- var keyframesAtRuleSchema = z11.object({
8274
- id: ruleIdSchema,
8275
- type: z11.literal("keyframes"),
8276
- name: animationNameSchema,
8277
- frames: z11.array(keyframeSchema).min(1, "At least one keyframe is required")
8278
- });
8279
- var fontFaceDeclarationsSchema = z11.record(z11.string().min(1).max(100), declarationValueSchema).refine(
8280
- (decls) => "fontFamily" in decls || "font-family" in decls,
8281
- { message: "font-family is required in @font-face" }
8282
- );
8283
- var fontFaceAtRuleSchema = z11.object({
8284
- id: ruleIdSchema,
8285
- type: z11.literal("font-face"),
8286
- declarations: fontFaceDeclarationsSchema
8287
- });
8288
- var mediaQuerySchema = z11.string().min(1, "Media query is required").max(200, "Media query too long");
8289
- var mediaAtRuleSchema = z11.object({
8290
- id: ruleIdSchema,
8291
- type: z11.literal("media"),
8292
- query: mediaQuerySchema,
8293
- rules: z11.array(nestedRuleSchema).min(1, "At least one rule is required")
8294
- });
8295
- var supportsConditionSchema = z11.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
8296
- var supportsAtRuleSchema = z11.object({
8297
- id: ruleIdSchema,
8298
- type: z11.literal("supports"),
8299
- condition: supportsConditionSchema,
8300
- rules: z11.array(nestedRuleSchema).min(1, "At least one rule is required")
8301
- });
8302
- function containsBlockedAtRule(css) {
8303
- return BLOCKED_AT_RULE_PATTERN.test(css);
8304
- }
8305
- var rawCssSchema = z11.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
8306
- (css) => css.trim().startsWith("@"),
8307
- { message: "Raw at-rule must start with @" }
8308
- ).refine(
8309
- (css) => !containsBlockedAtRule(css),
8310
- { message: `Blocked at-rules: ${BLOCKED_AT_RULES.join(", ")}. Use typed at-rules or local assets instead.` }
8311
- );
8312
- var rawAtRuleSchema = z11.object({
8313
- id: ruleIdSchema,
8314
- type: z11.literal("raw"),
8315
- css: rawCssSchema
8316
- });
8317
- var customCssAtRuleSchema = z11.discriminatedUnion("type", [
8318
- keyframesAtRuleSchema,
8319
- fontFaceAtRuleSchema,
8320
- mediaAtRuleSchema,
8321
- supportsAtRuleSchema,
8322
- rawAtRuleSchema
8323
- ]);
8324
- var customCssAtRulesSchema = z11.array(customCssAtRuleSchema).optional();
8325
-
8326
8477
  // ../theme-core/src/responsiveMode.ts
8327
8478
  var THEME_RESPONSIVE_MODE_ATTR = "data-rb-responsive-mode";
8328
8479
  function escapeRegExp(value) {
@@ -8351,10 +8502,10 @@ function buildResponsiveScopeRulePatternSource() {
8351
8502
  }
8352
8503
 
8353
8504
  // ../theme-core/src/ThemeScopeCore.tsx
8354
- import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
8505
+ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
8355
8506
 
8356
8507
  // ../theme-core/src/ClientThemeScope.tsx
8357
- import { jsx as jsx17 } from "react/jsx-runtime";
8508
+ import { jsx as jsx18 } from "react/jsx-runtime";
8358
8509
 
8359
8510
  // ../blocks/src/system/runtime/hooks/useBookingFormConfig.ts
8360
8511
  import { useState as useState8, useEffect as useEffect9 } from "react";