@riverbankcms/sdk 0.98.0 → 0.99.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/{PreviewEditorSidebar-CG3SSJND.mjs → PreviewEditorSidebar-TPOKCCKY.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-RHNGKAAU.mjs → PreviewEditorUI-Y347GLC2.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-OGTXRQ4M.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +36 -36
  5. package/dist/_dts/api/src/billing.d.ts +2 -0
  6. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +5 -1
  7. package/dist/_dts/api/src/endpoints.d.ts +8 -0
  8. package/dist/_dts/api/src/index.d.ts +1 -1
  9. package/dist/_dts/api/src/siteOperations.d.ts +65 -1
  10. package/dist/_dts/billing/src/site-arrangements.d.ts +151 -0
  11. package/dist/_dts/billing/src/subscriptions/store.d.ts +2 -0
  12. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/resolveThumbnail.d.ts +2 -1
  13. package/dist/_dts/blocks/src/PageRenderer.d.ts +6 -0
  14. package/dist/_dts/blocks/src/system/runtime/components/booking/DatePicker.d.ts +6 -2
  15. package/dist/_dts/blocks/src/system/runtime/components/booking/SuccessMessage.d.ts +3 -1
  16. package/dist/_dts/blocks/src/system/runtime/components/booking/TimeSlotSelector.d.ts +10 -4
  17. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +2 -2
  18. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +11 -0
  19. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/StepIndicator.d.ts +3 -1
  20. package/dist/_dts/blocks/src/system/runtime/shared/components/FeedbackMessage.d.ts +2 -1
  21. package/dist/_dts/blocks/src/system/runtime/{nodes/event-registration → shared/components}/SelectableOptionCard.d.ts +11 -2
  22. package/dist/_dts/blocks/src/system/runtime/shared/components/StepIndicator.d.ts +16 -5
  23. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  24. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  25. package/dist/_dts/blocks/src/utils/date-formatting.d.ts +17 -1
  26. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +274 -30
  27. package/dist/_dts/sdk/src/__mocks__/next-cache.d.ts +1 -1
  28. package/dist/_dts/sdk/src/cli/commands/push.d.ts +13 -0
  29. package/dist/_dts/sdk/src/cli/merge-remote/entryMergeReport.d.ts +6 -18
  30. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -4
  31. package/dist/_dts/sdk/src/cli/merge-remote/pageMergeReport.d.ts +6 -18
  32. package/dist/_dts/sdk/src/cli/merge-remote/pageSnapshots.d.ts +2 -4
  33. package/dist/_dts/sdk/src/cli/merge-remote/sharedBaseSnapshots.d.ts +32 -0
  34. package/dist/_dts/sdk/src/cli/merge-remote/sharedMergePlan.d.ts +27 -0
  35. package/dist/_dts/sdk/src/cli/merge-remote/sharedMergeReport.d.ts +63 -0
  36. package/dist/_dts/sdk/src/client/index.d.ts +6 -0
  37. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +6 -1
  38. package/dist/_dts/sdk/src/next/types.d.ts +19 -0
  39. package/dist/_dts/sdk/src/prebuild/loader.d.ts +8 -1
  40. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  41. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +4 -0
  42. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +6 -0
  43. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +8 -0
  44. package/dist/_dts/sdk/src/rendering/index.d.ts +7 -7
  45. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -0
  46. package/dist/_dts/sdk/src/routing/resolveRoute.d.ts +18 -0
  47. package/dist/_dts/sdk/src/test/apiClient.d.ts +17 -0
  48. package/dist/_dts/sdk/src/test/bunDom.setup.d.ts +1 -0
  49. package/dist/_dts/sdk/src/test/env.d.ts +4 -0
  50. package/dist/_dts/sdk/src/version.d.ts +1 -1
  51. package/dist/_dts/site-commands/src/commands.d.ts +3 -3
  52. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  53. package/dist/_dts/theme-core/src/interactive/generateBaseCSS.d.ts +6 -0
  54. package/dist/_dts/theme-core/src/status/contextualColors.d.ts +6 -0
  55. package/dist/_dts/theme-core/src/status/index.d.ts +1 -0
  56. package/dist/{chunk-H24OU7WG.mjs → chunk-4HXF2QLH.mjs} +2 -2
  57. package/dist/{chunk-QPXE2OUZ.mjs → chunk-EMJIT3ZJ.mjs} +1 -1
  58. package/dist/{chunk-PKDPQHB5.mjs → chunk-PM7HGDHM.mjs} +2 -2
  59. package/dist/{chunk-DBRI3PQF.mjs → chunk-XO34WBBP.mjs} +1383 -1143
  60. package/dist/{chunk-6WDBXCPX.mjs → chunk-YGTTEVUM.mjs} +7 -7
  61. package/dist/{chunk-V2BYFSPW.mjs → chunk-YWTCCOSF.mjs} +8 -0
  62. package/dist/cli/index.mjs +1010 -921
  63. package/dist/client/{accordion-Q2BDNL53.mjs → accordion-QSUEYL4L.mjs} +2 -2
  64. package/dist/client/{bookingForm-ZMP4P7EK.mjs → bookingForm-QYGAHPDP.mjs} +364 -300
  65. package/dist/client/bookings.mjs +697 -411
  66. package/dist/client/{carousel-LW3UXPWO.mjs → carousel-SM2LEWAU.mjs} +3 -3
  67. package/dist/client/{cart-Z6D3KS6K.mjs → cart-3N3SFKNQ.mjs} +7 -7
  68. package/dist/client/{checkout-YMT2QJQM.mjs → checkout-YFAYPKPZ.mjs} +7 -7
  69. package/dist/client/{chunk-XNTHVZ25.mjs → chunk-5DLGREUB.mjs} +1 -1
  70. package/dist/client/{chunk-SK2BMD22.mjs → chunk-CLZ7NBSP.mjs} +147 -75
  71. package/dist/client/{chunk-R4XK3CKR.mjs → chunk-CYJ3MUFP.mjs} +6 -5
  72. package/dist/client/{chunk-JNE6UI6U.mjs → chunk-H3H3ODO7.mjs} +1 -1
  73. package/dist/client/{chunk-IEOECM7U.mjs → chunk-HPEQ4YWW.mjs} +28 -73
  74. package/dist/client/{chunk-PCHACQEB.mjs → chunk-IIUIKJ4K.mjs} +15 -7
  75. package/dist/client/{chunk-KDP7ZRZV.mjs → chunk-IOAHWAQG.mjs} +2 -0
  76. package/dist/client/{chunk-26ZBRXFR.mjs → chunk-JTKBF3W2.mjs} +3 -3
  77. package/dist/client/{chunk-OLAOAZEO.mjs → chunk-K7KTSACR.mjs} +1 -1
  78. package/dist/client/{chunk-ET2MDQQT.mjs → chunk-R32M5HFS.mjs} +6 -6
  79. package/dist/client/{chunk-DRRQ7QSL.mjs → chunk-WEVT46PX.mjs} +3 -3
  80. package/dist/client/{chunk-HBQEAOG4.mjs → chunk-ZU65LTI3.mjs} +1 -1
  81. package/dist/client/client.mjs +1875 -1581
  82. package/dist/client/{courseRegistration-DGKCMC77.mjs → courseRegistration-LYBE7VVK.mjs} +7 -7
  83. package/dist/client/{eventCalendar-74Z2NNFM.mjs → eventCalendar-FMTB75X6.mjs} +9 -9
  84. package/dist/client/{eventCombined-GK2ODOX2.mjs → eventCombined-E4LUCJXT.mjs} +9 -9
  85. package/dist/client/{eventDetails-MONAGT3N.mjs → eventDetails-GELSRR4Z.mjs} +9 -9
  86. package/dist/client/{eventListing-SKGAO6PS.mjs → eventListing-TB623B6R.mjs} +9 -9
  87. package/dist/client/{eventRegistration-6KISGXRD.mjs → eventRegistration-NRIKHXTI.mjs} +9 -9
  88. package/dist/client/{form-FXPRTXHI.mjs → form-Y4U4IAXE.mjs} +3 -3
  89. package/dist/client/{headerSection-7NAN5WNB.mjs → headerSection-QSOVV5P7.mjs} +3 -3
  90. package/dist/client/hooks.mjs +115 -21
  91. package/dist/client/{locationMap-UERN74U4.mjs → locationMap-QYCAHH7H.mjs} +3 -3
  92. package/dist/client/{newsletterForm-SGWXMJ7U.mjs → newsletterForm-NWHY5TBY.mjs} +3 -3
  93. package/dist/client/{productDetail-HN3HWZQZ.mjs → productDetail-FYDMU2CE.mjs} +7 -7
  94. package/dist/client/{productList-YT22Z5UR.mjs → productList-D76CGACQ.mjs} +7 -7
  95. package/dist/client/rendering/client.mjs +1209 -975
  96. package/dist/client/rendering/islands.mjs +19 -19
  97. package/dist/client/rendering.mjs +1952 -1638
  98. package/dist/client/{shop-TKEDNWUS.mjs → shop-SOUACT5N.mjs} +7 -7
  99. package/dist/preview-next/before-render.mjs +8 -0
  100. package/dist/preview-next/client/runtime.mjs +5 -5
  101. package/dist/preview-next/middleware.mjs +8 -0
  102. package/dist/{sdk-runtime-LWNYCQF2.mjs → sdk-runtime-XPVE3LBA.mjs} +6 -6
  103. package/dist/server/components.mjs +917 -765
  104. package/dist/server/config-validation.mjs +100 -19
  105. package/dist/server/config.mjs +100 -19
  106. package/dist/server/data.mjs +115 -21
  107. package/dist/server/index.mjs +59 -25
  108. package/dist/server/next.mjs +1017 -816
  109. package/dist/server/page-converter.mjs +92 -19
  110. package/dist/server/prebuild-loader.mjs +42 -23
  111. package/dist/server/prebuild.mjs +1 -1
  112. package/dist/server/rendering/server.mjs +932 -767
  113. package/dist/server/rendering.mjs +968 -776
  114. package/dist/server/routing.mjs +162 -36
  115. package/dist/server/server.mjs +156 -32
  116. package/dist/server/theme-bridge.mjs +597 -505
  117. package/dist/server/theme.mjs +5 -4
  118. package/dist/styles/index.css +499 -490
  119. package/package.json +6 -4
  120. package/dist/SdkPreviewModeRuntime-OV5PNJBB.mjs +0 -8
@@ -5742,6 +5742,14 @@ var ENDPOINT_DEFINITIONS = {
5742
5742
  responseKind: "json",
5743
5743
  errors: []
5744
5744
  },
5745
+ adminResolveSiteBillingManualReview: {
5746
+ path: "/admin/sites/{siteId}/billing/manual-reviews/{reviewId}/resolve",
5747
+ method: "POST",
5748
+ tags: ["admin", "site-{siteId}", "billing"],
5749
+ auth: "admin",
5750
+ responseKind: "json",
5751
+ errors: []
5752
+ },
5745
5753
  // Admin GSC/SEO endpoints
5746
5754
  adminGscVerifyStart: {
5747
5755
  path: "/admin/seo/gsc/properties/verify/start",
@@ -13409,6 +13417,79 @@ var TokenResolver = class {
13409
13417
  }
13410
13418
  };
13411
13419
 
13420
+ // ../theme-core/src/interactive/generateBaseCSS.ts
13421
+ var FONT_WEIGHT_MAP = {
13422
+ regular: 400,
13423
+ medium: 500,
13424
+ semibold: 600,
13425
+ bold: 700
13426
+ };
13427
+ function generateBaseInteractiveCSS(options) {
13428
+ const {
13429
+ typography,
13430
+ padding,
13431
+ borderRadius,
13432
+ includeTransition = true,
13433
+ includeFlexCenter = false,
13434
+ borderWidth
13435
+ } = options;
13436
+ const rules = [];
13437
+ if (typography.fontWeight !== void 0) {
13438
+ const weight = typeof typography.fontWeight === "number" ? typography.fontWeight : FONT_WEIGHT_MAP[typography.fontWeight];
13439
+ rules.push(`font-weight: ${weight};`);
13440
+ }
13441
+ if (typography.typography === "heading") {
13442
+ rules.push(`font-family: var(--font-heading);`);
13443
+ rules.push(`letter-spacing: var(--ls-heading);`);
13444
+ } else if (typography.typography === "body") {
13445
+ rules.push(`font-family: var(--font-body);`);
13446
+ }
13447
+ if (typography.italic) {
13448
+ rules.push(`font-style: italic;`);
13449
+ }
13450
+ if (typography.textTransform && typography.textTransform !== "none") {
13451
+ rules.push(`text-transform: ${typography.textTransform};`);
13452
+ }
13453
+ if (padding) {
13454
+ if (borderWidth && borderWidth !== "0px") {
13455
+ const paddingParts = padding.split(" ");
13456
+ const verticalPadding = paddingParts[0] || "0.5rem";
13457
+ const horizontalPadding = paddingParts[1] || paddingParts[0] || "1rem";
13458
+ rules.push(`padding-top: calc(${verticalPadding} - ${borderWidth} - 1px);`);
13459
+ rules.push(`padding-bottom: calc(${verticalPadding} - ${borderWidth} - 1px);`);
13460
+ rules.push(`padding-left: calc(${horizontalPadding} - ${borderWidth});`);
13461
+ rules.push(`padding-right: calc(${horizontalPadding} - ${borderWidth});`);
13462
+ } else {
13463
+ rules.push(`padding: ${padding};`);
13464
+ }
13465
+ }
13466
+ if (borderRadius) {
13467
+ rules.push(`border-radius: ${borderRadius};`);
13468
+ }
13469
+ if (includeTransition) {
13470
+ rules.push(`transition: all 200ms ease;`);
13471
+ }
13472
+ if (includeFlexCenter) {
13473
+ rules.push(`display: inline-flex;`);
13474
+ rules.push(`align-items: center;`);
13475
+ rules.push(`justify-content: center;`);
13476
+ rules.push(`cursor: pointer;`);
13477
+ }
13478
+ return rules;
13479
+ }
13480
+ function generateInteractiveChildInheritanceCSS(selector) {
13481
+ return `
13482
+ ${selector} * {
13483
+ font-family: inherit;
13484
+ font-weight: inherit;
13485
+ font-style: inherit;
13486
+ letter-spacing: inherit;
13487
+ text-transform: inherit;
13488
+ color: inherit;
13489
+ }
13490
+ `;
13491
+ }
13492
+
13412
13493
  // ../theme-core/src/buttons/effects/presets/background.ts
13413
13494
  var darkenBackgroundEffect = {
13414
13495
  id: "darken-background",
@@ -14903,7 +14984,9 @@ function resolveAliasSource(enabled) {
14903
14984
  function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
14904
14985
  const out = [];
14905
14986
  const variantId = parseButtonVariantIdForCss(variant.id);
14906
- out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
14987
+ const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}`;
14988
+ out.push(variantBaseRule(variant, selector, global, tokens, theme));
14989
+ out.push({ raw: generateInteractiveChildInheritanceCSS(selector) });
14907
14990
  const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
14908
14991
  if (hoverBg) out.push(hoverBg);
14909
14992
  out.push(variantFocusVisibleRule(variantId, themeId));
@@ -14920,8 +15003,7 @@ function parseButtonVariantIdForCss(value) {
14920
15003
  }
14921
15004
  return variantId;
14922
15005
  }
14923
- function variantBaseRule(variant, variantId, global, themeId, tokens, theme) {
14924
- const selector = `:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}`;
15006
+ function variantBaseRule(variant, selector, global, tokens, theme) {
14925
15007
  const decls = [];
14926
15008
  decls.push(["font-weight", String(global.fontWeight)]);
14927
15009
  decls.push(["font-family", resolveFontFamily(global)]);
@@ -15557,15 +15639,16 @@ var joyStamp = defineButtonPersonality({
15557
15639
  // 700, matching the mockup's chunky button labels.
15558
15640
  typography: "heading",
15559
15641
  fontWeight: 700,
15642
+ fontSize: "text-lg",
15560
15643
  borderWidth: 2,
15561
15644
  hoverTransform: "none",
15562
15645
  hoverColor: "none"
15563
15646
  },
15564
15647
  sizes: {
15565
- sm: { padding: "0.625rem 1.25rem", fontSize: "text-sm" },
15566
- md: { padding: "0.875rem 1.75rem", fontSize: "text-base" },
15567
- lg: { padding: "1.125rem 2.25rem", fontSize: "text-lg" },
15568
- xl: { padding: "1.25rem 2.75rem", fontSize: "text-xl" }
15648
+ sm: { padding: "0.625rem 1.25rem", fontSize: "text-base" },
15649
+ md: { padding: "0.875rem 1.75rem", fontSize: "text-lg" },
15650
+ lg: { padding: "1.125rem 2.25rem", fontSize: "text-xl" },
15651
+ xl: { padding: "1.25rem 2.75rem", fontSize: "text-2xl" }
15569
15652
  },
15570
15653
  variants: [
15571
15654
  {
@@ -16143,6 +16226,20 @@ function generateDefaultCardSystem(theme) {
16143
16226
  };
16144
16227
  }
16145
16228
 
16229
+ // ../theme-core/src/status/contextualColors.ts
16230
+ var STATUS_MUTED_COLOR_VAR = "--rb-status-muted-color";
16231
+ var DEFAULT_STATUS_MUTED_COLOR = "rgb(var(--tb-mutedText))";
16232
+ var SURFACE_MUTED_STATUS_COLOR = "color-mix(in oklab, currentColor, transparent 18%)";
16233
+ function statusMutedColorValue() {
16234
+ return `var(${STATUS_MUTED_COLOR_VAR}, ${DEFAULT_STATUS_MUTED_COLOR})`;
16235
+ }
16236
+ function statusMutedColorDeclaration() {
16237
+ return `color: ${statusMutedColorValue()};`;
16238
+ }
16239
+ function contextualMutedStatusColorDeclaration(value) {
16240
+ return `${STATUS_MUTED_COLOR_VAR}: ${value}`;
16241
+ }
16242
+
16146
16243
  // ../theme-core/src/cards/generateCardCss.ts
16147
16244
  var PER_CORNER_RADIUS_MAP = {
16148
16245
  square: "0",
@@ -16216,6 +16313,7 @@ function generateVariantCSS(variant, themeId, tokens, theme) {
16216
16313
  if (variant.foregroundToken) {
16217
16314
  rules.push(`color: ${tokens.getColor(variant.foregroundToken)}`);
16218
16315
  }
16316
+ rules.push(contextualMutedStatusColorDeclaration(SURFACE_MUTED_STATUS_COLOR));
16219
16317
  if (variant.accentEdge) {
16220
16318
  const side = ACCENT_EDGE_SIDE_MAP[variant.accentEdge.edge];
16221
16319
  const width = ACCENT_EDGE_WIDTH_MAP[variant.accentEdge.width];
@@ -16474,7 +16572,7 @@ var LABEL_FONT_SIZE_MAP = {
16474
16572
  base: "1rem"
16475
16573
  // 16px
16476
16574
  };
16477
- var FONT_WEIGHT_MAP = {
16575
+ var FONT_WEIGHT_MAP2 = {
16478
16576
  regular: "400",
16479
16577
  medium: "500",
16480
16578
  semibold: "600",
@@ -47593,14 +47691,27 @@ function BookingFormSSR({
47593
47691
  return /* @__PURE__ */ jsxs15(
47594
47692
  "div",
47595
47693
  {
47596
- className: `booking-form-ssr ${className ?? ""}`.trim(),
47694
+ className: `rb-reg-surface booking-form-ssr ${display.state === "missing" ? "" : "ab-shell "}${className ?? ""}`.trim(),
47597
47695
  ...getIslandRootProps("booking-form", blockId),
47696
+ "aria-busy": display.state === "missing" ? void 0 : true,
47697
+ "aria-label": display.state === "missing" ? void 0 : "Loading booking form",
47698
+ role: display.state === "missing" ? void 0 : "status",
47598
47699
  children: [
47599
47700
  /* @__PURE__ */ jsx29(IslandPropsScript, { value: islandProps }),
47600
- /* @__PURE__ */ jsx29("div", { className: "booking-form-ssr__summary", children: display.state === "missing" ? /* @__PURE__ */ jsx29("p", { className: "booking-form-ssr__error", children: display.message }) : /* @__PURE__ */ jsxs15(Fragment3, { children: [
47601
- /* @__PURE__ */ jsx29("strong", { children: display.submitLabel }),
47602
- display.successMessage ? /* @__PURE__ */ jsx29("p", { className: "booking-form-ssr__success", children: display.successMessage }) : null
47603
- ] }) }),
47701
+ display.state === "missing" ? /* @__PURE__ */ jsx29("div", { className: "alert alert-error", role: "alert", children: /* @__PURE__ */ jsx29("p", { className: "ab-text", children: display.message }) }) : /* @__PURE__ */ jsxs15(Fragment3, { children: [
47702
+ /* @__PURE__ */ jsx29("span", { className: "rb-sr-only", children: "Loading booking form..." }),
47703
+ /* @__PURE__ */ jsxs15("div", { className: "rb-reg-stack", "aria-hidden": "true", children: [
47704
+ /* @__PURE__ */ jsx29("div", { className: "rb-reg-summary", children: /* @__PURE__ */ jsxs15("div", { className: "rb-reg-stack rb-reg-stack--sm", children: [
47705
+ /* @__PURE__ */ jsx29("div", { className: "rb-shell-line rb-shell-line--md" }),
47706
+ /* @__PURE__ */ jsx29("div", { className: "rb-shell-line rb-shell-line--sm" })
47707
+ ] }) }),
47708
+ /* @__PURE__ */ jsxs15("div", { className: "rb-reg-stack rb-reg-stack--sm", children: [
47709
+ /* @__PURE__ */ jsx29("div", { className: "rb-shell-line rb-shell-line--lg" }),
47710
+ /* @__PURE__ */ jsx29("div", { className: "rb-shell-line rb-shell-line--xs" })
47711
+ ] }),
47712
+ /* @__PURE__ */ jsx29("div", { className: "rb-wizard-actions", children: /* @__PURE__ */ jsx29("div", { className: "ab-shell-button", children: display.submitLabel }) })
47713
+ ] })
47714
+ ] }),
47604
47715
  children
47605
47716
  ]
47606
47717
  }
@@ -50252,20 +50363,38 @@ function EventRegistrationShell({
50252
50363
  "div",
50253
50364
  {
50254
50365
  id: EVENT_REGISTRATION_ANCHOR_ID,
50255
- className: "er-container er-registration-shell",
50366
+ className: "rb-reg-surface er-container er-registration-shell",
50256
50367
  "aria-busy": "true",
50257
50368
  role: "status",
50258
50369
  children: /* @__PURE__ */ jsxs38("div", { className: "er-payment-layout er-payment-layout--no-sidebar", children: [
50259
50370
  /* @__PURE__ */ jsxs38("div", { className: "er-payment-layout-main", children: [
50260
- /* @__PURE__ */ jsx54("div", { className: "er-steps-nav er-registration-shell__steps", "aria-hidden": "true", children: /* @__PURE__ */ jsx54("ol", { className: "er-steps", children: display.stepLabels.map((label, index) => {
50371
+ /* @__PURE__ */ jsx54("div", { className: "rb-steps-nav er-steps-nav er-registration-shell__steps", "aria-hidden": "true", children: /* @__PURE__ */ jsx54("ol", { className: "rb-steps er-steps", children: display.stepLabels.map((label, index) => {
50261
50372
  const isActive = index === 0;
50262
- return /* @__PURE__ */ jsxs38("li", { className: "er-step", children: [
50263
- /* @__PURE__ */ jsx54("span", { className: cx("er-step-circle", isActive && "er-step-circle--active"), children: index + 1 }),
50264
- /* @__PURE__ */ jsx54("span", { className: cx("er-step-label", isActive && "er-step-label--active"), children: label }),
50265
- index < display.stepLabels.length - 1 ? /* @__PURE__ */ jsx54("span", { className: "er-step-connector" }) : null
50373
+ return /* @__PURE__ */ jsxs38("li", { className: "rb-step er-step", children: [
50374
+ /* @__PURE__ */ jsx54(
50375
+ "span",
50376
+ {
50377
+ className: cx(
50378
+ "rb-step-circle er-step-circle",
50379
+ isActive && "rb-step-circle--active er-step-circle--active"
50380
+ ),
50381
+ children: index + 1
50382
+ }
50383
+ ),
50384
+ /* @__PURE__ */ jsx54(
50385
+ "span",
50386
+ {
50387
+ className: cx(
50388
+ "rb-step-label er-step-label",
50389
+ isActive && "rb-step-label--active er-step-label--active"
50390
+ ),
50391
+ children: label
50392
+ }
50393
+ ),
50394
+ index < display.stepLabels.length - 1 ? /* @__PURE__ */ jsx54("span", { className: "rb-step-connector er-step-connector" }) : null
50266
50395
  ] }, label);
50267
50396
  }) }) }),
50268
- /* @__PURE__ */ jsxs38("div", { className: "er-stack", children: [
50397
+ /* @__PURE__ */ jsxs38("div", { className: "rb-reg-stack er-stack", children: [
50269
50398
  /* @__PURE__ */ jsxs38("div", { children: [
50270
50399
  /* @__PURE__ */ jsx54("p", { className: "er-registration-shell__eyebrow", children: "Registration" }),
50271
50400
  /* @__PURE__ */ jsx54("h3", { className: "er-title er-registration-shell__title", children: display.titleText }),
@@ -50273,20 +50402,20 @@ function EventRegistrationShell({
50273
50402
  ] }),
50274
50403
  /* @__PURE__ */ jsxs38("div", { className: "er-event-grid er-registration-shell__cards", "aria-hidden": "true", children: [
50275
50404
  /* @__PURE__ */ jsxs38("div", { className: "er-event-card er-registration-shell__card", children: [
50276
- /* @__PURE__ */ jsx54("div", { className: "er-registration-shell__line er-registration-shell__line--lg" }),
50277
- /* @__PURE__ */ jsx54("div", { className: "er-registration-shell__line er-registration-shell__line--sm" })
50405
+ /* @__PURE__ */ jsx54("div", { className: "rb-shell-line rb-shell-line--lg er-registration-shell__line er-registration-shell__line--lg" }),
50406
+ /* @__PURE__ */ jsx54("div", { className: "rb-shell-line rb-shell-line--sm er-registration-shell__line er-registration-shell__line--sm" })
50278
50407
  ] }),
50279
50408
  /* @__PURE__ */ jsxs38("div", { className: "er-event-card er-registration-shell__card", children: [
50280
- /* @__PURE__ */ jsx54("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
50281
- /* @__PURE__ */ jsx54("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
50409
+ /* @__PURE__ */ jsx54("div", { className: "rb-shell-line rb-shell-line--md er-registration-shell__line er-registration-shell__line--md" }),
50410
+ /* @__PURE__ */ jsx54("div", { className: "rb-shell-line rb-shell-line--xs er-registration-shell__line er-registration-shell__line--xs" })
50282
50411
  ] })
50283
50412
  ] })
50284
50413
  ] })
50285
50414
  ] }),
50286
50415
  /* @__PURE__ */ jsx54("div", { className: "er-payment-layout-footer", children: /* @__PURE__ */ jsxs38("div", { className: "er-summary-bar er-registration-shell__summary", "aria-hidden": "true", children: [
50287
50416
  /* @__PURE__ */ jsxs38("div", { className: "er-summary-bar-info", children: [
50288
- /* @__PURE__ */ jsx54("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
50289
- /* @__PURE__ */ jsx54("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
50417
+ /* @__PURE__ */ jsx54("div", { className: "rb-shell-line rb-shell-line--md er-registration-shell__line er-registration-shell__line--md" }),
50418
+ /* @__PURE__ */ jsx54("div", { className: "rb-shell-line rb-shell-line--xs er-registration-shell__line er-registration-shell__line--xs" })
50290
50419
  ] }),
50291
50420
  /* @__PURE__ */ jsx54("div", { className: "er-registration-shell__button-placeholder", children: display.summaryButtonText })
50292
50421
  ] }) })
@@ -50305,6 +50434,7 @@ function FeedbackMessage({
50305
50434
  tone,
50306
50435
  children,
50307
50436
  className,
50437
+ id,
50308
50438
  title,
50309
50439
  titleClassName,
50310
50440
  bodyClassName,
@@ -50316,6 +50446,7 @@ function FeedbackMessage({
50316
50446
  return /* @__PURE__ */ jsxs39(
50317
50447
  "div",
50318
50448
  {
50449
+ id,
50319
50450
  className,
50320
50451
  "data-feedback-tone": tone,
50321
50452
  role,
@@ -52493,7 +52624,7 @@ function generateInputCss({
52493
52624
  const labelSelector = `${rootSelector} .form-label`;
52494
52625
  const labelRules = [];
52495
52626
  labelRules.push(`color: ${rgbColorValue(inputSystem.label.textColorToken)}`);
52496
- labelRules.push(`font-weight: ${FONT_WEIGHT_MAP[inputSystem.label.fontWeight]}`);
52627
+ labelRules.push(`font-weight: ${FONT_WEIGHT_MAP2[inputSystem.label.fontWeight]}`);
52497
52628
  labelRules.push(`font-size: ${LABEL_FONT_SIZE_MAP[inputSystem.label.fontSize]}`);
52498
52629
  if (inputSystem.label.textTransform && inputSystem.label.textTransform !== "none") {
52499
52630
  labelRules.push(`text-transform: ${inputSystem.label.textTransform}`);
@@ -52734,67 +52865,6 @@ function generateDefaultInputSystem(theme) {
52734
52865
  };
52735
52866
  }
52736
52867
 
52737
- // ../theme-core/src/interactive/generateBaseCSS.ts
52738
- var FONT_WEIGHT_MAP2 = {
52739
- regular: 400,
52740
- medium: 500,
52741
- semibold: 600,
52742
- bold: 700
52743
- };
52744
- function generateBaseInteractiveCSS(options) {
52745
- const {
52746
- typography,
52747
- padding,
52748
- borderRadius,
52749
- includeTransition = true,
52750
- includeFlexCenter = false,
52751
- borderWidth
52752
- } = options;
52753
- const rules = [];
52754
- if (typography.fontWeight !== void 0) {
52755
- const weight = typeof typography.fontWeight === "number" ? typography.fontWeight : FONT_WEIGHT_MAP2[typography.fontWeight];
52756
- rules.push(`font-weight: ${weight};`);
52757
- }
52758
- if (typography.typography === "heading") {
52759
- rules.push(`font-family: var(--font-heading);`);
52760
- rules.push(`letter-spacing: var(--ls-heading);`);
52761
- } else if (typography.typography === "body") {
52762
- rules.push(`font-family: var(--font-body);`);
52763
- }
52764
- if (typography.italic) {
52765
- rules.push(`font-style: italic;`);
52766
- }
52767
- if (typography.textTransform && typography.textTransform !== "none") {
52768
- rules.push(`text-transform: ${typography.textTransform};`);
52769
- }
52770
- if (padding) {
52771
- if (borderWidth && borderWidth !== "0px") {
52772
- const paddingParts = padding.split(" ");
52773
- const verticalPadding = paddingParts[0] || "0.5rem";
52774
- const horizontalPadding = paddingParts[1] || paddingParts[0] || "1rem";
52775
- rules.push(`padding-top: calc(${verticalPadding} - ${borderWidth} - 1px);`);
52776
- rules.push(`padding-bottom: calc(${verticalPadding} - ${borderWidth} - 1px);`);
52777
- rules.push(`padding-left: calc(${horizontalPadding} - ${borderWidth});`);
52778
- rules.push(`padding-right: calc(${horizontalPadding} - ${borderWidth});`);
52779
- } else {
52780
- rules.push(`padding: ${padding};`);
52781
- }
52782
- }
52783
- if (borderRadius) {
52784
- rules.push(`border-radius: ${borderRadius};`);
52785
- }
52786
- if (includeTransition) {
52787
- rules.push(`transition: all 200ms ease;`);
52788
- }
52789
- if (includeFlexCenter) {
52790
- rules.push(`display: inline-flex;`);
52791
- rules.push(`align-items: center;`);
52792
- rules.push(`justify-content: center;`);
52793
- rules.push(`cursor: pointer;`);
52794
- }
52795
- return rules;
52796
- }
52797
-
52798
52868
  // ../theme-core/src/navigation/generateNavLinkCSS.ts
52799
52869
  function generateNavLinkCSS(options) {
52800
52870
  const { themeId, tokens, theme, style, className } = options;
@@ -52881,14 +52951,7 @@ ${activeSelector} {
52881
52951
  }
52882
52952
  `);
52883
52953
  }
52884
- cssChunks.push(`
52885
- ${selector} * {
52886
- font-family: inherit;
52887
- font-weight: inherit;
52888
- letter-spacing: inherit;
52889
- color: inherit;
52890
- }
52891
- `);
52954
+ cssChunks.push(generateInteractiveChildInheritanceCSS(selector));
52892
52955
  return cssChunks.join("");
52893
52956
  }
52894
52957
  function buildTextContrastShadow(input) {
@@ -54185,7 +54248,7 @@ ${root} .status-error { color: rgb(var(--tb-destructive)); }
54185
54248
  ${root} .status-success { color: rgb(var(--tb-success)); }
54186
54249
  ${root} .status-warning { color: rgb(var(--tb-warning)); }
54187
54250
  ${root} .status-info { color: rgb(var(--tb-info)); }
54188
- ${root} .status-muted { color: rgb(var(--tb-mutedText)); }`);
54251
+ ${root} .status-muted { ${statusMutedColorDeclaration()} }`);
54189
54252
  cssBlocks.push(`/* Alert containers */
54190
54253
  ${root} .alert {
54191
54254
  padding: 1rem;
@@ -54501,6 +54564,34 @@ ${root} {
54501
54564
  /* Order summary */
54502
54565
  --er-summary-bg: rgba(var(--tb-primary), 0.1);
54503
54566
  --er-summary-border: rgb(var(--tb-border));
54567
+
54568
+ /* Shared registration-surface mappings (issue 1174).
54569
+ Route the shared --rb-reg-* contract through this block's documented
54570
+ Tier 3 vars so existing --er-* overrides keep working unchanged. */
54571
+ --rb-reg-radius: var(--er-radius);
54572
+ --rb-reg-border: var(--er-border);
54573
+ --rb-reg-border-hover: var(--er-border-hover);
54574
+ --rb-reg-border-selected: var(--er-border-selected);
54575
+ --rb-reg-bg-selected: var(--er-payment-bg-selected);
54576
+ --rb-reg-option-bg: var(--er-control-bg);
54577
+ --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
54578
+ --rb-reg-surface-bg: rgb(var(--tb-surface));
54579
+ --rb-reg-on-surface: var(--er-on-surface);
54580
+ --rb-reg-on-surface-muted: var(--er-on-surface-muted);
54581
+ --rb-reg-on-surface-subtle: var(--er-on-surface-subtle);
54582
+ --rb-reg-on-surface-faint: var(--er-on-surface-faint);
54583
+ --rb-reg-check-bg: var(--er-check-bg);
54584
+ --rb-reg-check-text: var(--er-check-text);
54585
+ --rb-reg-step-active: var(--er-step-active);
54586
+ --rb-reg-step-completed: var(--er-step-completed);
54587
+ --rb-reg-step-inactive: var(--er-step-inactive);
54588
+ --rb-reg-step-text: var(--er-step-text);
54589
+ --rb-reg-step-text-active: var(--er-step-text-active);
54590
+ --rb-reg-step-connector: var(--er-step-connector);
54591
+ --rb-reg-summary-bg: var(--er-surface-muted);
54592
+ --rb-reg-summary-border: var(--er-border);
54593
+ --rb-reg-focus-ring: var(--er-focus-ring);
54594
+ --rb-reg-shell-line: var(--er-shell-line);
54504
54595
  }
54505
54596
  `;
54506
54597
  }
@@ -54633,25 +54724,40 @@ ${root} {
54633
54724
  --ab-info-bg: rgba(var(--tb-info), 0.1);
54634
54725
  --ab-info-text: rgb(var(--tb-info));
54635
54726
 
54636
- /* Loading/muted states */
54727
+ /* Muted summary state */
54637
54728
  --ab-muted-bg: rgba(var(--tb-text), 0.05);
54638
- --ab-muted-text: rgba(var(--tb-text), 0.6);
54639
- --ab-spinner-color: rgb(var(--tb-primary));
54640
54729
 
54641
- /* Form elements */
54642
- --ab-input-border: rgb(var(--tb-border));
54730
+ /* Focus ring used by shared registration-surface controls */
54643
54731
  --ab-input-focus-ring: rgba(var(--tb-primary), 0.3);
54644
54732
 
54645
- /* Buttons */
54646
- --ab-btn-primary-bg: rgb(var(--tb-primary));
54647
- --ab-btn-primary-text: rgb(var(--tb-background));
54648
- --ab-btn-primary-hover: rgba(var(--tb-primary), 0.9);
54649
- --ab-btn-secondary-border: rgb(var(--tb-border));
54650
- --ab-btn-secondary-hover: rgba(var(--tb-text), 0.05);
54651
-
54652
- /* Text opacity levels */
54653
- --ab-text-muted-opacity: 0.6;
54654
- --ab-text-faint-opacity: 0.4;
54733
+ /* Shared registration-surface mappings (issue 1174).
54734
+ Route the shared --rb-reg-* contract through this block's Tier 3 vars
54735
+ (palette tokens where no --ab-* var exists) so --ab-* overrides keep
54736
+ working as the block adopts the shared classes. */
54737
+ --rb-reg-radius: var(--ab-card-radius, var(--rb-block-radius));
54738
+ --rb-reg-border: var(--ab-card-border);
54739
+ --rb-reg-border-hover: var(--ab-card-border-hover);
54740
+ --rb-reg-border-selected: var(--ab-card-border-selected);
54741
+ --rb-reg-bg-selected: var(--ab-card-bg-selected);
54742
+ --rb-reg-option-bg: transparent;
54743
+ --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
54744
+ --rb-reg-surface-bg: rgb(var(--tb-surface));
54745
+ --rb-reg-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
54746
+ --rb-reg-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
54747
+ --rb-reg-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
54748
+ --rb-reg-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
54749
+ --rb-reg-check-bg: var(--ab-check-bg);
54750
+ --rb-reg-check-text: var(--ab-check-text);
54751
+ --rb-reg-step-active: rgb(var(--tb-primary));
54752
+ --rb-reg-step-completed: rgb(var(--tb-success));
54753
+ --rb-reg-step-inactive: rgb(var(--tb-mutedText));
54754
+ --rb-reg-step-text: rgb(255 255 255);
54755
+ --rb-reg-step-text-active: rgb(var(--tb-primaryText, 255 255 255));
54756
+ --rb-reg-step-connector: rgba(var(--tb-border), 0.5);
54757
+ --rb-reg-summary-bg: var(--ab-muted-bg);
54758
+ --rb-reg-summary-border: var(--ab-card-border);
54759
+ --rb-reg-focus-ring: var(--ab-input-focus-ring);
54760
+ --rb-reg-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
54655
54761
  }
54656
54762
  `;
54657
54763
  }
@@ -54942,6 +55048,35 @@ ${root} {
54942
55048
  /* Summary */
54943
55049
  --cr-summary-bg: rgba(var(--tb-primary), 0.1);
54944
55050
  --cr-summary-border: rgb(var(--tb-border));
55051
+
55052
+ /* Shared registration-surface mappings (issue 1174).
55053
+ Route the shared --rb-reg-* contract through this block's Tier 3 vars
55054
+ (palette tokens where no --cr-* var exists) so existing --cr-* overrides
55055
+ keep working unchanged. */
55056
+ --rb-reg-radius: var(--rb-block-radius);
55057
+ --rb-reg-border: var(--cr-border);
55058
+ --rb-reg-border-hover: var(--cr-border-hover);
55059
+ --rb-reg-border-selected: var(--cr-border-selected);
55060
+ --rb-reg-bg-selected: var(--cr-payment-bg-selected);
55061
+ --rb-reg-option-bg: rgb(var(--tb-background));
55062
+ --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
55063
+ --rb-reg-surface-bg: rgb(var(--tb-surface));
55064
+ --rb-reg-on-surface: var(--cr-on-surface);
55065
+ --rb-reg-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
55066
+ --rb-reg-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
55067
+ --rb-reg-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
55068
+ --rb-reg-check-bg: var(--cr-check-bg);
55069
+ --rb-reg-check-text: var(--cr-check-text);
55070
+ --rb-reg-step-active: var(--cr-step-active);
55071
+ --rb-reg-step-completed: var(--cr-step-completed);
55072
+ --rb-reg-step-inactive: var(--cr-step-inactive);
55073
+ --rb-reg-step-text: var(--cr-step-text);
55074
+ --rb-reg-step-text-active: var(--cr-step-text-active);
55075
+ --rb-reg-step-connector: var(--cr-step-connector);
55076
+ --rb-reg-summary-bg: var(--cr-summary-bg);
55077
+ --rb-reg-summary-border: var(--cr-summary-border);
55078
+ --rb-reg-focus-ring: var(--cr-focus-ring);
55079
+ --rb-reg-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
54945
55080
  }
54946
55081
  `;
54947
55082
  }
@@ -56221,6 +56356,8 @@ var MemoBlockSection = React6.memo(
56221
56356
  occurrenceContext: dataContext?.occurrenceContext ?? null,
56222
56357
  entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
56223
56358
  contentEntry: dataContext?.contentEntry ?? null,
56359
+ pageSurface: dataContext?.pageSurface ?? null,
56360
+ subject: dataContext?.subject ?? null,
56224
56361
  supabaseUrl: dataContext?.supabaseUrl,
56225
56362
  imageResolveContext: resolvedImageResolveContext,
56226
56363
  blockId: block.id ?? null,
@@ -56349,6 +56486,8 @@ var MemoBlockSection = React6.memo(
56349
56486
  occurrenceContext: dataContext?.occurrenceContext ?? null,
56350
56487
  entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
56351
56488
  contentEntry: dataContext?.contentEntry ?? null,
56489
+ pageSurface: dataContext?.pageSurface ?? null,
56490
+ subject: dataContext?.subject ?? null,
56352
56491
  supabaseUrl: dataContext?.supabaseUrl,
56353
56492
  imageResolveContext: resolvedImageResolveContext,
56354
56493
  blockId: block.id ?? null,
@@ -56376,7 +56515,9 @@ var MemoBlockSection = React6.memo(
56376
56515
  // Occurrence and content entry context for template pages
56377
56516
  occurrenceContext: dataContext?.occurrenceContext ?? null,
56378
56517
  entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
56379
- contentEntry: dataContext?.contentEntry ?? null
56518
+ contentEntry: dataContext?.contentEntry ?? null,
56519
+ pageSurface: dataContext?.pageSurface ?? null,
56520
+ subject: dataContext?.subject ?? null
56380
56521
  }
56381
56522
  };
56382
56523
  const blockBindings = block.bindings;
@@ -59721,13 +59862,36 @@ var containerResponsiveThemeCss = `/*
59721
59862
  */
59722
59863
 
59723
59864
  /* =============================================================================
59724
- * Shared: Registration Terminal State Icons
59725
- * Used by event-registration and course-registration blocks.
59865
+ * Shared: Registration Surface (issue 1174)
59866
+ *
59867
+ * Wizard-surface primitives shared by the event-registration,
59868
+ * course-registration and appointment-booking blocks: surface container,
59869
+ * selectable option cards, step indicator, wizard actions row, on-surface
59870
+ * text ramp, layout stacks, summary box and skeleton shell lines.
59871
+ *
59872
+ * Uses:
59873
+ * - Tier 1 vars: --tb-* (from theme palette) as inline fallbacks
59874
+ * - Tier 2 vars: --rb-block-radius, --rb-block-transition (from theme scope)
59875
+ * - Shared vars: --rb-reg-* (mapped per block by the Tier 3 var generators;
59876
+ * canonical name list in blocks/registrationSurfaceVars.ts)
59877
+ *
59878
+ * Defaults intentionally match the event-registration (issue 1089) values; blocks
59879
+ * that need to preserve a different look override in their own block CSS,
59880
+ * which is imported after this file (cascade order is the override contract \u2014
59881
+ * all selectors here are zero-specificity \`:where()\`).
59726
59882
  *
59727
- * Layout rules only \u2014 block-specific colors are defined in each block's CSS
59728
- * via scoped \`.rb-state-icon--{variant}\` rules.
59883
+ * Layout-only \`.rb-state-icon\` rules (formerly registration-shared.css) live
59884
+ * here too; block CSS provides the \`.rb-state-icon--{variant}\` colors.
59885
+ *
59886
+ * Naming: component-like primitives follow the existing bare \`rb-\` shared
59887
+ * precedent (\`.rb-state-icon\`, \`.rb-tile\`): \`.rb-option-card\`, \`.rb-step-*\`,
59888
+ * \`.rb-wizard-actions\`, \`.rb-on-surface\`, \`.rb-shell-*\`. Container/layout
59889
+ * pieces that would otherwise collide with the global \`.rb-*\` utility layer
59890
+ * are namespaced \`rb-reg-*\` (\`.rb-reg-surface\`, \`.rb-reg-stack\`, ...). All of
59891
+ * them are scoped to the three registration blocks either way.
59729
59892
  * ============================================================================= */
59730
59893
 
59894
+ /* Terminal state icon (layout only \u2014 colors are per-block) */
59731
59895
  :where(.theme-scope) .rb-state-icon {
59732
59896
  width: 4rem;
59733
59897
  height: 4rem;
@@ -59743,112 +59907,346 @@ var containerResponsiveThemeCss = `/*
59743
59907
  height: 2rem;
59744
59908
  }
59745
59909
 
59746
- /* =============================================================================
59747
- * Block: Event Registration (pilot #76)
59748
- * Uses CSS vars: --er-* (Tier 3) and --rb-block-* (Tier 2)
59749
- * =============================================================================
59750
- */
59751
-
59752
- :where(.theme-scope) :where([data-block="event-registration"]) {
59753
- --rb-modal-overlay-bg: rgb(var(--tb-text, 0 0 0) / 0.6);
59754
- --rb-event-tile-bg: var(--er-event-card-bg);
59755
- --rb-event-tile-border: var(--er-border);
59756
- --rb-event-tile-border-width: var(--er-event-card-border-width);
59757
- --rb-event-tile-border-hover: var(--er-border-hover);
59758
- --rb-event-tile-border-selected: var(--er-border-selected);
59759
- --rb-event-tile-hover-opacity: var(--er-event-card-hover-opacity);
59760
- --rb-event-tile-bg-selected: rgba(var(--tb-primary), 0.1);
59761
- --er-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
59762
- --er-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
59763
- --er-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
59764
- --er-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
59765
- --er-on-surface-disabled: rgba(var(--tb-onSurface, var(--tb-text)), 0.78);
59766
- --er-on-surface-disabled-detail: rgba(var(--tb-onSurface, var(--tb-text)), 0.68);
59767
- }
59768
-
59769
- /* Container */
59770
- :where(.theme-scope) :where([data-block="event-registration"]) .er-container {
59771
- border-radius: var(--rb-block-radius);
59772
- border: 1px solid var(--er-border);
59910
+ /* Surface container */
59911
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
59912
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
59913
+ border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
59773
59914
  padding: clamp(1rem, 2vw, 1.5rem);
59774
- background: rgb(var(--tb-surface));
59775
- color: var(--er-on-surface);
59776
- transition: border-color var(--rb-block-transition) ease;
59915
+ background: var(--rb-reg-surface-bg, rgb(var(--tb-surface, 248 250 252)));
59916
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
59917
+ transition: border-color var(--rb-block-transition, 150ms) ease;
59777
59918
  width: 100%;
59778
59919
  max-width: 800px;
59779
59920
  margin-inline: 0;
59780
59921
  }
59781
59922
 
59782
- /* SSR shell / required-island fallback */
59783
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
59784
- min-height: 24rem;
59923
+ /* Selectable option card */
59924
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card {
59925
+ position: relative;
59926
+ display: flex;
59927
+ align-items: flex-start;
59928
+ gap: 0.75rem;
59929
+ padding: 1rem;
59930
+ border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
59931
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
59932
+ background: var(--rb-reg-option-bg, transparent);
59933
+ color: inherit;
59934
+ cursor: pointer;
59935
+ text-align: left;
59936
+ transition: border-color var(--rb-block-transition, 150ms) ease,
59937
+ background-color var(--rb-block-transition, 150ms) ease,
59938
+ box-shadow var(--rb-block-transition, 150ms) ease;
59785
59939
  }
59786
59940
 
59787
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__steps {
59788
- margin-bottom: 1.25rem;
59941
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card:hover:not(:disabled):not([aria-disabled="true"]) {
59942
+ border-color: var(--rb-reg-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
59943
+ box-shadow: var(--rb-reg-option-hover-shadow, 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08));
59789
59944
  }
59790
59945
 
59791
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__eyebrow {
59792
- margin: 0 0 0.35rem;
59793
- color: var(--er-on-surface-subtle);
59794
- font-size: 0.75rem;
59795
- font-weight: 700;
59796
- letter-spacing: 0.04em;
59797
- line-height: 1.2;
59798
- text-transform: uppercase;
59946
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
59947
+ outline: 2px solid var(--rb-reg-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
59948
+ outline-offset: 2px;
59799
59949
  }
59800
59950
 
59801
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__title {
59951
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
59952
+ border-color: var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
59953
+ background-color: var(--rb-reg-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.08));
59954
+ box-shadow: 0 0 0 1px var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
59955
+ }
59956
+
59957
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled {
59958
+ cursor: not-allowed;
59959
+ opacity: 0.7;
59960
+ }
59961
+
59962
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled:hover {
59963
+ border-color: var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
59964
+ box-shadow: none;
59965
+ }
59966
+
59967
+ /* Check indicator */
59968
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check {
59969
+ flex-shrink: 0;
59970
+ width: 1.25rem;
59971
+ height: 1.25rem;
59972
+ border-radius: 50%;
59973
+ background: var(--rb-reg-check-bg, rgb(var(--tb-primary, 17 24 39)));
59974
+ display: flex;
59975
+ align-items: center;
59976
+ justify-content: center;
59977
+ }
59978
+
59979
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
59980
+ width: 0.75rem;
59981
+ height: 0.75rem;
59982
+ color: var(--rb-reg-check-text, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
59983
+ }
59984
+
59985
+ /* Step indicator */
59986
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
59987
+ margin-bottom: 1.5rem;
59988
+ }
59989
+
59990
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps {
59991
+ display: flex;
59992
+ align-items: center;
59993
+ justify-content: center;
59994
+ gap: 0.5rem;
59995
+ list-style: none;
59996
+ padding: 0;
59802
59997
  margin: 0;
59803
59998
  }
59804
59999
 
59805
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__copy {
59806
- margin: 0.35rem 0 0;
59807
- max-width: 36rem;
59808
- line-height: 1.45;
60000
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step {
60001
+ display: flex;
60002
+ align-items: center;
60003
+ gap: 0.5rem;
59809
60004
  }
59810
60005
 
59811
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__cards {
59812
- margin-top: 0.25rem;
59813
- overflow: hidden;
59814
- border: 1px solid var(--er-border);
59815
- border-radius: var(--rb-block-radius);
59816
- background: var(--er-control-bg);
60006
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle {
60007
+ width: 1.75rem;
60008
+ height: 1.75rem;
60009
+ border-radius: 50%;
60010
+ display: flex;
60011
+ align-items: center;
60012
+ justify-content: center;
60013
+ font-size: 0.75rem;
60014
+ font-weight: 600;
60015
+ background: var(--rb-reg-step-inactive, rgb(var(--tb-mutedText, 100 116 139)));
60016
+ color: var(--rb-reg-step-text, rgb(var(--tb-primaryForeground, 255 255 255)));
60017
+ transition: background-color var(--rb-block-transition, 150ms) ease;
59817
60018
  }
59818
60019
 
59819
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__card {
60020
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
60021
+ background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
60022
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
60023
+ }
60024
+
60025
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
60026
+ background: var(--rb-reg-step-completed, rgb(var(--tb-success, 22 163 74)));
60027
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
60028
+ }
60029
+
60030
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-check {
60031
+ width: 0.75rem;
60032
+ height: 0.75rem;
60033
+ }
60034
+
60035
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-connector {
60036
+ width: 2rem;
60037
+ height: 2px;
60038
+ background: var(--rb-reg-step-connector, rgba(var(--tb-border, 226 232 240), 0.5));
60039
+ }
60040
+
60041
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
60042
+ font-size: 0.75rem;
60043
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
60044
+ display: none;
60045
+ }
60046
+
60047
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
60048
+ font-weight: 500;
60049
+ }
60050
+
60051
+ @container rb-site (min-width: 640px) {
60052
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
60053
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
60054
+ display: inline;
60055
+ }
60056
+ }
60057
+ }
60058
+
60059
+ /* Wizard actions row */
60060
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions {
60061
+ display: flex;
60062
+ justify-content: space-between;
60063
+ align-items: center;
60064
+ gap: 1rem;
60065
+ margin-top: 1.5rem;
60066
+ }
60067
+
60068
+ /* When there's only one action (no back button), push it to the right */
60069
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions > :only-child {
60070
+ margin-inline-start: auto;
60071
+ }
60072
+
60073
+ /* On-surface text ramp */
60074
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface {
60075
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
60076
+ }
60077
+
60078
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
60079
+ color: var(--rb-reg-on-surface-muted, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.7));
60080
+ }
60081
+
60082
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
60083
+ color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
60084
+ }
60085
+
60086
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
60087
+ color: var(--rb-reg-on-surface-faint, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.5));
60088
+ }
60089
+
60090
+ /* Layout stacks */
60091
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack {
60092
+ display: flex;
60093
+ flex-direction: column;
60094
+ gap: 1rem;
60095
+ }
60096
+
60097
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack--sm {
60098
+ gap: 0.75rem;
60099
+ }
60100
+
60101
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row {
60102
+ display: flex;
60103
+ align-items: center;
60104
+ gap: 1rem;
60105
+ }
60106
+
60107
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row--between {
60108
+ justify-content: space-between;
60109
+ align-items: flex-start;
60110
+ }
60111
+
60112
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-grid {
59820
60113
  display: grid;
59821
- gap: 0.5rem;
60114
+ gap: 0.75rem;
60115
+ }
60116
+
60117
+ /* Summary box */
60118
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-summary {
59822
60119
  padding: 1rem;
60120
+ border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.75);
60121
+ border: 1px solid var(--rb-reg-summary-border, rgb(var(--tb-border, 226 232 240)));
60122
+ background: var(--rb-reg-summary-bg, rgba(var(--tb-muted, 241 245 249), 0.42));
59823
60123
  }
59824
60124
 
59825
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line {
60125
+ /* Skeleton shell lines */
60126
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line {
59826
60127
  height: 0.75rem;
59827
60128
  border-radius: 9999px;
59828
60129
  background: linear-gradient(
59829
60130
  90deg,
59830
- var(--er-shell-line),
59831
- rgba(var(--tb-primary), 0.12),
59832
- var(--er-shell-line)
60131
+ var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22)),
60132
+ rgba(var(--tb-primary, 17 24 39), 0.12),
60133
+ var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22))
59833
60134
  );
59834
60135
  }
59835
60136
 
59836
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--lg {
60137
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--lg {
59837
60138
  width: min(26rem, 82%);
59838
60139
  }
59839
60140
 
59840
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--md {
60141
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--md {
59841
60142
  width: min(19rem, 68%);
59842
60143
  }
59843
60144
 
59844
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--sm {
60145
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--sm {
59845
60146
  width: min(14rem, 52%);
59846
60147
  }
59847
60148
 
59848
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--xs {
60149
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--xs {
59849
60150
  width: min(10rem, 42%);
59850
60151
  }
59851
60152
 
60153
+ /* Skeleton block (rectangular placeholder, pulses) */
60154
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
60155
+ height: 2.5rem;
60156
+ width: 100%;
60157
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
60158
+ background: var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22));
60159
+ animation: rb-reg-pulse 1.5s ease-in-out infinite;
60160
+ }
60161
+
60162
+ @keyframes rb-reg-pulse {
60163
+ 0%, 100% {
60164
+ opacity: 1;
60165
+ }
60166
+ 50% {
60167
+ opacity: 0.5;
60168
+ }
60169
+ }
60170
+
60171
+ @media (prefers-reduced-motion: reduce) {
60172
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
60173
+ animation: none;
60174
+ }
60175
+ }
60176
+
60177
+ /* =============================================================================
60178
+ * Block: Event Registration (pilot #76)
60179
+ * Uses CSS vars: --er-* (Tier 3) and --rb-block-* (Tier 2)
60180
+ * =============================================================================
60181
+ */
60182
+
60183
+ :where(.theme-scope) :where([data-block="event-registration"]) {
60184
+ --rb-modal-overlay-bg: rgb(var(--tb-text, 0 0 0) / 0.6);
60185
+ --rb-event-tile-bg: var(--er-event-card-bg);
60186
+ --rb-event-tile-border: var(--er-border);
60187
+ --rb-event-tile-border-width: var(--er-event-card-border-width);
60188
+ --rb-event-tile-border-hover: var(--er-border-hover);
60189
+ --rb-event-tile-border-selected: var(--er-border-selected);
60190
+ --rb-event-tile-hover-opacity: var(--er-event-card-hover-opacity);
60191
+ --rb-event-tile-bg-selected: rgba(var(--tb-primary), 0.1);
60192
+ --er-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
60193
+ --er-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
60194
+ --er-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
60195
+ --er-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
60196
+ --er-on-surface-disabled: rgba(var(--tb-onSurface, var(--tb-text)), 0.78);
60197
+ --er-on-surface-disabled-detail: rgba(var(--tb-onSurface, var(--tb-text)), 0.68);
60198
+ }
60199
+
60200
+ /* Container: styled by the shared .rb-reg-surface (registration-surface.css);
60201
+ .er-container remains in markup as a hook and for the overlay/embedded
60202
+ variants below. */
60203
+
60204
+ /* SSR shell / required-island fallback */
60205
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
60206
+ min-height: 24rem;
60207
+ }
60208
+
60209
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__steps {
60210
+ margin-bottom: 1.25rem;
60211
+ }
60212
+
60213
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__eyebrow {
60214
+ margin: 0 0 0.35rem;
60215
+ color: var(--er-on-surface-subtle);
60216
+ font-size: 0.75rem;
60217
+ font-weight: 700;
60218
+ letter-spacing: 0.04em;
60219
+ line-height: 1.2;
60220
+ text-transform: uppercase;
60221
+ }
60222
+
60223
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__title {
60224
+ margin: 0;
60225
+ }
60226
+
60227
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__copy {
60228
+ margin: 0.35rem 0 0;
60229
+ max-width: 36rem;
60230
+ line-height: 1.45;
60231
+ }
60232
+
60233
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__cards {
60234
+ margin-top: 0.25rem;
60235
+ overflow: hidden;
60236
+ border: 1px solid var(--er-border);
60237
+ border-radius: var(--rb-block-radius);
60238
+ background: var(--er-control-bg);
60239
+ }
60240
+
60241
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__card {
60242
+ display: grid;
60243
+ gap: 0.5rem;
60244
+ padding: 1rem;
60245
+ }
60246
+
60247
+ /* Shell skeleton lines: styled by the shared .rb-shell-line family
60248
+ (registration-surface.css); legacy classes remain in markup as hooks. */
60249
+
59852
60250
  :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__summary {
59853
60251
  align-items: center;
59854
60252
  border-radius: calc(var(--rb-block-radius) * 0.75);
@@ -59924,13 +60322,8 @@ var containerResponsiveThemeCss = `/*
59924
60322
  color: var(--er-capacity-soldout-text);
59925
60323
  }
59926
60324
 
59927
- /* Selected event summary */
59928
- :where(.theme-scope) :where([data-block="event-registration"]) .er-event-summary {
59929
- padding: 1rem;
59930
- border-radius: calc(var(--rb-block-radius) * 0.75);
59931
- border: 1px solid var(--er-border);
59932
- background: var(--er-surface-muted);
59933
- }
60325
+ /* Selected event summary: superseded by the shared .rb-reg-summary
60326
+ (registration-surface.css); no markup emitted .er-event-summary anymore. */
59934
60327
 
59935
60328
  /* Ticket counter */
59936
60329
  :where(.theme-scope) :where([data-block="event-registration"]) .er-ticket-counter-group {
@@ -60136,7 +60529,7 @@ var containerResponsiveThemeCss = `/*
60136
60529
  opacity: 1;
60137
60530
  }
60138
60531
 
60139
- /* State icon color variants (layout from registration-shared.css) */
60532
+ /* State icon color variants (layout from registration-surface.css) */
60140
60533
  :where(.theme-scope) :where([data-block="event-registration"]) .rb-state-icon--success {
60141
60534
  background: var(--er-success-bg);
60142
60535
  color: var(--er-success-text);
@@ -60292,16 +60685,8 @@ var containerResponsiveThemeCss = `/*
60292
60685
  text-align: center;
60293
60686
  }
60294
60687
 
60295
- /* Layout */
60296
- :where(.theme-scope) :where([data-block="event-registration"]) .er-stack {
60297
- display: flex;
60298
- flex-direction: column;
60299
- gap: 1rem;
60300
- }
60301
-
60302
- :where(.theme-scope) :where([data-block="event-registration"]) .er-stack--sm {
60303
- gap: 0.75rem;
60304
- }
60688
+ /* Layout stacks/rows: styled by the shared .rb-reg-stack / .rb-reg-row
60689
+ (registration-surface.css); legacy classes remain in markup as hooks. */
60305
60690
 
60306
60691
  /* Event/date selection rows */
60307
60692
  :where(.theme-scope) :where([data-block="event-registration"]) .er-event-grid {
@@ -60310,17 +60695,6 @@ var containerResponsiveThemeCss = `/*
60310
60695
  gap: 0;
60311
60696
  }
60312
60697
 
60313
- :where(.theme-scope) :where([data-block="event-registration"]) .er-row {
60314
- display: flex;
60315
- align-items: center;
60316
- gap: 1rem;
60317
- }
60318
-
60319
- :where(.theme-scope) :where([data-block="event-registration"]) .er-row--between {
60320
- justify-content: space-between;
60321
- align-items: flex-start;
60322
- }
60323
-
60324
60698
  :where(.theme-scope) :where([data-block="event-registration"]) .er-center {
60325
60699
  text-align: center;
60326
60700
  padding: 2rem;
@@ -60332,18 +60706,8 @@ var containerResponsiveThemeCss = `/*
60332
60706
  margin-bottom: 1rem;
60333
60707
  }
60334
60708
 
60335
- :where(.theme-scope) :where([data-block="event-registration"]) .er-actions {
60336
- display: flex;
60337
- justify-content: space-between;
60338
- align-items: center;
60339
- gap: 1rem;
60340
- margin-top: 1.5rem;
60341
- }
60342
-
60343
- /* When there's only one button (no back), push to the right */
60344
- :where(.theme-scope) :where([data-block="event-registration"]) .er-actions > :only-child {
60345
- margin-inline-start: auto;
60346
- }
60709
+ /* Actions row: styled by the shared .rb-wizard-actions (registration-surface.css);
60710
+ .er-actions remains in markup as a hook. */
60347
60711
 
60348
60712
  :where(.theme-scope) :where([data-block="event-registration"]) .er-button-with-spinner {
60349
60713
  display: inline-flex;
@@ -60595,23 +60959,8 @@ var containerResponsiveThemeCss = `/*
60595
60959
  color: var(--er-on-surface-faint);
60596
60960
  }
60597
60961
 
60598
- /* Checkmark indicator */
60599
- :where(.theme-scope) :where([data-block="event-registration"]) .er-check {
60600
- flex-shrink: 0;
60601
- width: 1.25rem;
60602
- height: 1.25rem;
60603
- border-radius: 50%;
60604
- background: var(--er-check-bg);
60605
- display: flex;
60606
- align-items: center;
60607
- justify-content: center;
60608
- }
60609
-
60610
- :where(.theme-scope) :where([data-block="event-registration"]) .er-check svg {
60611
- width: 0.75rem;
60612
- height: 0.75rem;
60613
- color: var(--er-check-text);
60614
- }
60962
+ /* Checkmark indicator: styled by the shared .rb-option-check
60963
+ (registration-surface.css); .er-check remains in markup as a hook. */
60615
60964
 
60616
60965
  /* Payment summary */
60617
60966
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-summary {
@@ -60659,78 +61008,12 @@ var containerResponsiveThemeCss = `/*
60659
61008
  margin-bottom: 1.5rem;
60660
61009
  }
60661
61010
 
60662
- :where(.theme-scope) :where([data-block="event-registration"]) .er-steps {
60663
- display: flex;
60664
- align-items: center;
60665
- justify-content: center;
60666
- gap: 0.5rem;
60667
- list-style: none;
60668
- padding: 0;
60669
- margin: 0;
60670
- }
60671
-
60672
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step {
60673
- display: flex;
60674
- align-items: center;
60675
- gap: 0.5rem;
60676
- }
60677
-
60678
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle {
60679
- width: 1.75rem;
60680
- height: 1.75rem;
60681
- border-radius: 50%;
60682
- display: flex;
60683
- align-items: center;
60684
- justify-content: center;
60685
- font-size: 0.75rem;
60686
- font-weight: 600;
60687
- background: var(--er-step-inactive);
60688
- color: var(--er-step-text);
60689
- transition: background-color var(--rb-block-transition) ease;
60690
- }
60691
-
60692
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle--active {
60693
- background: var(--er-step-active);
60694
- color: var(--er-step-text-active);
60695
- }
60696
-
60697
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle--completed {
60698
- background: var(--er-step-completed);
60699
- color: var(--er-step-text-active);
60700
- }
60701
-
60702
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-check {
60703
- width: 0.75rem;
60704
- height: 0.75rem;
60705
- }
60706
-
60707
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-connector {
60708
- width: 2rem;
60709
- height: 2px;
60710
- background: var(--er-step-connector);
60711
- }
60712
-
60713
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-connector--completed {
60714
- background: var(--er-step-connector);
60715
- }
60716
-
60717
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label {
60718
- font-size: 0.75rem;
60719
- color: var(--er-on-surface);
60720
- display: none;
60721
- }
60722
-
60723
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label--active {
60724
- font-weight: 500;
60725
- }
60726
-
60727
- @container rb-site (min-width: 640px) {
60728
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
60729
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label {
60730
- display: inline;
60731
- }
60732
- }
60733
- }
61011
+ /* Step indicator internals: styled by the shared .rb-steps / .rb-step-*
61012
+ family (registration-surface.css) via the --rb-reg-step-* mappings in the
61013
+ event-registration var generator; er-* classes remain in markup as hooks.
61014
+ Note: .er-steps-nav above is intentionally retained \u2014 its source position
61015
+ keeps the wizard's 1.5rem step margin winning over the SSR shell's
61016
+ 1.25rem .er-registration-shell__steps override. */
60734
61017
 
60735
61018
  /* Sticky order summary */
60736
61019
  :where(.theme-scope) :where([data-block="event-registration"]) .er-summary {
@@ -62963,295 +63246,420 @@ var containerResponsiveThemeCss = `/*
62963
63246
 
62964
63247
  /* =============================================================================
62965
63248
  * Block: Appointment Booking
63249
+ *
63250
+ * Structural styling comes from the shared registration-surface layer
63251
+ * (registration-surface.css): surface container, option cards + check,
63252
+ * step indicator, wizard actions, on-surface text ramp, stacks, summary box
63253
+ * and skeleton shell. Colors flow through the --rb-reg-* contract, mapped
63254
+ * from this block's --ab-* Tier 3 vars by its var generator.
63255
+ *
63256
+ * Inputs use the theme-generated form-* classes; feedback boxes use the
63257
+ * theme-generated alert / alert-{tone} classes. Only genuinely
63258
+ * booking-specific rules live here.
63259
+ *
62966
63260
  * Uses:
62967
- * - Tier 1 vars: --tb-border, --tb-text, --tb-primary (from theme palette)
62968
- * - Tier 2 vars: --rb-block-radius, --rb-block-transition (from theme scope)
63261
+ * - Tier 1 vars: --tb-* (from theme palette)
62969
63262
  * - Tier 3 vars: --ab-* (from appointment-booking var generator)
62970
63263
  * =============================================================================
62971
63264
  */
62972
63265
 
62973
- /* Main container */
62974
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-container {
62975
- width: 100%;
63266
+ /* Typography helpers */
63267
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-title {
63268
+ font-size: 1.5rem;
63269
+ font-weight: 600;
63270
+ line-height: 1.3;
62976
63271
  }
62977
63272
 
62978
- /* Stack layout utilities */
62979
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack {
62980
- display: flex;
62981
- flex-direction: column;
62982
- gap: 1.5rem;
63273
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-subtitle {
63274
+ font-size: 0.9375rem;
63275
+ font-weight: 600;
63276
+ line-height: 1.3;
62983
63277
  }
62984
63278
 
62985
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack--sm {
62986
- display: flex;
62987
- flex-direction: column;
62988
- gap: 0.75rem;
63279
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text {
63280
+ font-size: 0.875rem;
62989
63281
  }
62990
63282
 
62991
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack--xs {
62992
- display: flex;
62993
- flex-direction: column;
62994
- gap: 0.5rem;
63283
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--sm {
63284
+ font-size: 0.75rem;
62995
63285
  }
62996
63286
 
62997
- /* Row layout */
62998
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-row {
62999
- display: flex;
63000
- align-items: center;
63001
- gap: 0.75rem;
63287
+ /* Centered state (loading / terminal panels) */
63288
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-center {
63289
+ text-align: center;
63290
+ padding: 2rem;
63002
63291
  }
63003
63292
 
63004
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-row--between {
63005
- justify-content: space-between;
63293
+ /* Terminal state title (below the state icon) */
63294
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-terminal-title {
63295
+ margin: 0.75rem 0 0.5rem 0;
63296
+ font-size: 1.125rem;
63297
+ font-weight: 700;
63298
+ }
63299
+
63300
+ /* State icon color variants (layout from registration-surface.css) */
63301
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--success {
63302
+ background: var(--ab-success-bg, rgba(var(--tb-success, 22 163 74), 0.1));
63303
+ color: var(--ab-success-text, rgb(var(--tb-success, 22 163 74)));
63304
+ }
63305
+
63306
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--error {
63307
+ background: var(--ab-error-bg, rgba(var(--tb-destructive, 220 38 38), 0.1));
63308
+ color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
63006
63309
  }
63007
63310
 
63008
- /* Grid layout */
63009
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-grid {
63311
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--info {
63312
+ background: var(--ab-info-bg, rgba(var(--tb-info, 14 165 233), 0.1));
63313
+ color: var(--ab-info-text, rgb(var(--tb-info, 14 165 233)));
63314
+ }
63315
+
63316
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--warning {
63317
+ background: var(--ab-warning-bg, rgba(var(--tb-warning, 245 158 11), 0.1));
63318
+ color: var(--ab-warning-text, rgb(var(--tb-warning, 245 158 11)));
63319
+ }
63320
+
63321
+ /* Payment option summary rows (label/value lines inside an option card) */
63322
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-option-rows {
63010
63323
  display: grid;
63011
- gap: 0.75rem;
63324
+ gap: 0.125rem;
63012
63325
  }
63013
63326
 
63014
- /* Center layout */
63015
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-center {
63016
- text-align: center;
63017
- padding: 2rem;
63327
+ /* Date/time pill grids (selection pills extend .rb-option-card) */
63328
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-grid {
63329
+ display: flex;
63330
+ flex-wrap: wrap;
63331
+ gap: 0.5rem;
63018
63332
  }
63019
63333
 
63020
- /* Typography */
63021
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-title {
63022
- font-size: 1.5rem;
63023
- font-weight: 700;
63334
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-date-pill {
63335
+ flex-direction: column;
63336
+ align-items: center;
63337
+ gap: 0.125rem;
63338
+ padding: 0.5rem 0.875rem;
63339
+ min-width: 4.25rem;
63340
+ text-align: center;
63024
63341
  }
63025
63342
 
63026
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-subtitle {
63343
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-time-pill {
63344
+ align-items: center;
63345
+ justify-content: center;
63346
+ padding: 0.5rem 0.875rem;
63347
+ min-width: 5.5rem;
63027
63348
  font-size: 0.875rem;
63028
63349
  font-weight: 500;
63350
+ text-align: center;
63029
63351
  }
63030
63352
 
63031
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text {
63032
- font-size: 0.875rem;
63353
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-caption {
63354
+ font-size: 0.6875rem;
63355
+ font-weight: 600;
63356
+ letter-spacing: 0;
63357
+ line-height: 1.2;
63358
+ text-transform: uppercase;
63359
+ color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
63033
63360
  }
63034
63361
 
63035
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--sm {
63036
- font-size: 0.75rem;
63362
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-value {
63363
+ font-size: 1.125rem;
63364
+ font-weight: 600;
63365
+ line-height: 1.2;
63037
63366
  }
63038
63367
 
63039
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--muted {
63040
- opacity: var(--ab-text-muted-opacity, 0.6);
63368
+ /* SSR shell skeleton (mirrors the hydrated layout to reduce hydration jump) */
63369
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-shell {
63370
+ min-height: 18rem;
63041
63371
  }
63042
63372
 
63043
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--faint {
63044
- opacity: var(--ab-text-faint-opacity, 0.4);
63373
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-shell-button {
63374
+ display: inline-flex;
63375
+ min-height: 2.5rem;
63376
+ align-items: center;
63377
+ justify-content: center;
63378
+ border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.6);
63379
+ background: rgb(var(--tb-primary, 17 24 39));
63380
+ color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
63381
+ padding: 0.625rem 1rem;
63382
+ font-size: 0.875rem;
63383
+ font-weight: 600;
63384
+ line-height: 1.2;
63385
+ text-align: center;
63386
+ white-space: nowrap;
63045
63387
  }
63046
63388
 
63047
- /* Selection cards (service, resource, time slot) */
63048
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card {
63049
- position: relative;
63050
- padding: 1rem;
63051
- border: 2px solid var(--ab-card-border, rgb(var(--tb-border, 226 232 240)));
63052
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
63053
- text-align: left;
63054
- background: transparent;
63389
+ /* Inline text-link button (e.g. "Load more dates") */
63390
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-link {
63391
+ display: inline;
63392
+ color: rgb(var(--tb-primary, 17 24 39));
63393
+ background: none;
63394
+ border: none;
63395
+ padding: 0;
63396
+ font: inherit;
63397
+ text-decoration: underline;
63055
63398
  cursor: pointer;
63056
- transition: border-color var(--rb-block-transition, 150ms) ease, background-color var(--rb-block-transition, 150ms) ease;
63057
63399
  }
63058
63400
 
63059
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card:hover {
63060
- border-color: var(--ab-card-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
63401
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-link:hover {
63402
+ text-decoration: none;
63061
63403
  }
63062
63404
 
63063
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card--selected {
63064
- border-color: var(--ab-card-border-selected, rgb(var(--tb-primary, 17 24 39)));
63065
- background-color: var(--ab-card-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.05));
63405
+ /* Altcha wrapper */
63406
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-altcha {
63407
+ margin-top: 1rem;
63066
63408
  }
63067
63409
 
63068
- /* Checkmark indicator */
63069
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-check {
63070
- flex-shrink: 0;
63071
- width: 1.25rem;
63072
- height: 1.25rem;
63073
- border-radius: 50%;
63074
- background-color: var(--ab-check-bg, rgb(var(--tb-primary, 17 24 39)));
63075
- display: flex;
63076
- align-items: center;
63077
- justify-content: center;
63410
+ /* =============================================================================
63411
+ * Shared: Inline Text Marks
63412
+ * =============================================================================
63413
+ */
63414
+
63415
+ :where(.theme-scope) .rb-inline-text-accent,
63416
+ :where(.theme-scope) .rb-inline-text-highlight {
63417
+ font: inherit;
63418
+ letter-spacing: inherit;
63419
+ text-transform: inherit;
63078
63420
  }
63079
63421
 
63080
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-check svg {
63081
- width: 0.75rem;
63082
- height: 0.75rem;
63083
- color: var(--ab-check-text, rgb(var(--tb-background, 255 255 255)));
63422
+ :where(.theme-scope) .rb-inline-text-accent-accent {
63423
+ color: rgb(var(--tb-accent));
63084
63424
  }
63085
63425
 
63086
- /* Info box (service summary) */
63087
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-info-box {
63088
- padding: 1rem;
63089
- border: 1px solid var(--ab-card-border, rgb(var(--tb-border, 226 232 240)));
63090
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
63091
- background-color: var(--ab-muted-bg, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
63426
+ :where(.theme-scope) .rb-inline-text-accent-brand {
63427
+ color: rgb(var(--tb-primary));
63092
63428
  }
63093
63429
 
63094
- /* Alert states */
63095
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert {
63096
- padding: 0.75rem 1rem;
63097
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
63098
- font-size: 0.875rem;
63430
+ :where(.theme-scope) .rb-inline-text-accent-contrast {
63431
+ color: var(--section-text-color, rgb(var(--tb-text)));
63099
63432
  }
63100
63433
 
63101
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--success {
63102
- background-color: var(--ab-success-bg, rgba(var(--tb-success, 22 163 74), 0.1));
63103
- color: var(--ab-success-text, rgb(var(--tb-success, 22 163 74)));
63434
+ :where(.theme-scope) .rb-inline-text-highlight {
63435
+ border-radius: 0.22em;
63436
+ box-decoration-break: clone;
63437
+ -webkit-box-decoration-break: clone;
63438
+ padding: 0.02em 0.12em;
63104
63439
  }
63105
63440
 
63106
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--error {
63107
- background-color: var(--ab-error-bg, rgba(var(--tb-destructive, 220 38 38), 0.1));
63108
- color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
63441
+ :where(.theme-scope) .rb-inline-text-highlight-soft {
63442
+ background: color-mix(in oklab, var(--section-text-color, rgb(var(--tb-text))) 14%, transparent);
63109
63443
  }
63110
63444
 
63111
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--warning {
63112
- background-color: var(--ab-warning-bg, rgba(var(--tb-warning, 245 158 11), 0.1));
63113
- color: var(--ab-warning-text, rgb(var(--tb-warning, 245 158 11)));
63445
+ :where(.theme-scope) .rb-inline-text-highlight-accent {
63446
+ background: color-mix(in oklab, rgb(var(--tb-accent)) 28%, transparent);
63114
63447
  }
63115
63448
 
63116
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--info {
63117
- background-color: var(--ab-info-bg, rgba(var(--tb-info, 14 165 233), 0.1));
63118
- color: var(--ab-info-text, rgb(var(--tb-info, 14 165 233)));
63449
+ :where(.theme-scope) .rb-inline-text-highlight-brand {
63450
+ background: color-mix(in oklab, rgb(var(--tb-primary)) 24%, transparent);
63119
63451
  }
63120
63452
 
63121
- /* Form elements */
63122
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-label {
63123
- display: block;
63124
- font-size: 0.875rem;
63125
- font-weight: 500;
63126
- margin-bottom: 0.5rem;
63453
+ /* =============================================================================
63454
+ * Block: Hero (Phase 2)
63455
+ * Uses theme palette vars directly (no Tier 3 vars needed)
63456
+ * =============================================================================
63457
+ */
63458
+
63459
+ /* Eyebrow - color only (typography via .rb-eyebrow) */
63460
+ :where(.theme-scope) :where([data-block="hero"]) .hero-eyebrow:not(.rb-eyebrow-treatment-accent) {
63461
+ color: var(--section-text-color, rgb(var(--tb-text)));
63127
63462
  }
63128
63463
 
63129
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-required {
63130
- color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
63131
- margin-left: 0.125rem;
63464
+ /* Subheadline - supporting text below headline */
63465
+ :where(.theme-scope) :where([data-block="hero"]) .hero-headline {
63466
+ text-wrap: balance;
63132
63467
  }
63133
63468
 
63134
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-input,
63135
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-select,
63136
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-textarea {
63137
- width: 100%;
63138
- padding: 0.5rem 0.75rem;
63139
- border: 1px solid var(--ab-input-border, rgb(var(--tb-border, 226 232 240)));
63140
- border-radius: var(--ab-input-radius, var(--rb-input-radius, var(--radius-control, var(--rb-block-radius, 1rem))));
63141
- background: transparent;
63142
- font-size: 0.875rem;
63143
- transition: border-color var(--rb-block-transition, 150ms) ease, box-shadow var(--rb-block-transition, 150ms) ease;
63469
+ :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
63470
+ font-size: 1.125rem;
63471
+ color: var(--section-supporting-color, var(--section-text-color, rgb(var(--tb-text))));
63144
63472
  }
63145
63473
 
63146
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-input:focus,
63147
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-select:focus,
63148
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-textarea:focus {
63149
- outline: none;
63150
- border-color: var(--ab-card-border-selected, rgb(var(--tb-primary, 17 24 39)));
63151
- box-shadow: 0 0 0 3px var(--ab-input-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
63474
+ @container rb-site (min-width: 640px) {
63475
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
63476
+ :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
63477
+ font-size: 1.25rem;
63478
+ }
63479
+ }
63152
63480
  }
63153
63481
 
63154
- /* Buttons */
63155
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn {
63156
- display: inline-flex;
63157
- align-items: center;
63158
- justify-content: center;
63159
- padding: 0.5rem 1.5rem;
63160
- border-radius: var(--ab-button-radius, var(--rb-button-radius, var(--rb-block-radius, 1rem)));
63161
- font-size: 0.875rem;
63162
- font-weight: 500;
63163
- cursor: pointer;
63164
- transition: background-color var(--rb-block-transition, 150ms) ease, border-color var(--rb-block-transition, 150ms) ease;
63482
+ /* Hero typography scales. These classes are emitted by Theme V2 hero looks. */
63483
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-quiet .hero-headline {
63484
+ font-size: clamp(2rem, 4vw, 3rem);
63485
+ line-height: 1.12;
63165
63486
  }
63166
63487
 
63167
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--primary {
63168
- flex: 1;
63169
- background-color: var(--ab-btn-primary-bg, rgb(var(--tb-primary, 17 24 39)));
63170
- color: var(--ab-btn-primary-text, rgb(var(--tb-primaryForeground, 255 255 255)));
63171
- border: none;
63488
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-quiet .hero-subheadline {
63489
+ font-size: clamp(1rem, 1.2vw, 1.25rem);
63490
+ line-height: 1.55;
63172
63491
  }
63173
63492
 
63174
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--primary:hover:not(:disabled) {
63175
- background-color: var(--ab-btn-primary-hover, rgba(var(--tb-primary, 17 24 39), 0.9));
63493
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-headline {
63494
+ font-size: clamp(2.75rem, 5.6vw, 4.75rem);
63495
+ line-height: 1.06;
63176
63496
  }
63177
63497
 
63178
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--secondary {
63179
- background: transparent;
63180
- border: 1px solid var(--ab-btn-secondary-border, rgb(var(--tb-border, 226 232 240)));
63498
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-subheadline {
63499
+ font-size: clamp(1.0625rem, 1.4vw, 1.375rem);
63500
+ line-height: 1.55;
63181
63501
  }
63182
63502
 
63183
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--secondary:hover:not(:disabled) {
63184
- background-color: var(--ab-btn-secondary-hover, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
63503
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-headline {
63504
+ font-size: clamp(3.5rem, 7.2vw, 6.25rem);
63505
+ line-height: 1;
63185
63506
  }
63186
63507
 
63187
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--link {
63188
- background: transparent;
63189
- border: none;
63190
- padding: 0;
63191
- text-decoration: underline;
63508
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-subheadline {
63509
+ font-size: clamp(1.125rem, 1.5vw, 1.5rem);
63510
+ line-height: 1.5;
63192
63511
  }
63193
63512
 
63194
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--link:hover {
63195
- text-decoration: none;
63513
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-headline {
63514
+ font-size: clamp(4.25rem, 10vw, 8.5rem);
63515
+ line-height: 0.94;
63196
63516
  }
63197
63517
 
63198
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn:disabled {
63199
- opacity: 0.5;
63200
- cursor: not-allowed;
63518
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-subheadline {
63519
+ font-size: clamp(1.125rem, 1.4vw, 1.5rem);
63520
+ line-height: 1.45;
63201
63521
  }
63202
63522
 
63203
- /* Actions row */
63204
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-actions {
63205
- display: flex;
63206
- gap: 0.75rem;
63207
- margin-top: 1.5rem;
63523
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-medium.rb-hero-typography-poster .hero-headline {
63524
+ font-size: clamp(3.5rem, 7.5vw, 6.5rem);
63208
63525
  }
63209
63526
 
63210
- /* Skeleton loading */
63211
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-skeleton {
63212
- height: 2.5rem;
63213
- width: 100%;
63214
- background-color: var(--ab-muted-bg, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
63215
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
63216
- animation: ab-pulse 1.5s ease-in-out infinite;
63527
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
63528
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-display .hero-headline {
63529
+ font-size: clamp(3rem, 6vw, 5.25rem);
63530
+ line-height: 1.02;
63217
63531
  }
63218
63532
 
63219
- @keyframes ab-pulse {
63220
- 0%, 100% {
63221
- opacity: 1;
63222
- }
63223
- 50% {
63224
- opacity: 0.5;
63533
+ @container rb-site (max-width: 639px) {
63534
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
63535
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-headline,
63536
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-headline,
63537
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
63538
+ :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-display .hero-headline {
63539
+ font-size: clamp(2.5rem, 11vw, 3.5rem);
63540
+ line-height: 1.05;
63225
63541
  }
63226
63542
  }
63543
+ }
63227
63544
 
63228
- /* Field wrapper */
63229
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-field {
63545
+ /* =============================================================================
63546
+ * Shared: Heading Group (used by CTA, single-button, etc.)
63547
+ * =============================================================================
63548
+ */
63549
+
63550
+ /* Eyebrow - color only (typography via .rb-eyebrow) */
63551
+ :where(.theme-scope) .heading-eyebrow:not(.rb-eyebrow-treatment-accent) {
63552
+ color: rgb(var(--tb-mutedText));
63553
+ }
63554
+
63555
+ /* =============================================================================
63556
+ * Block: CTA (Phase 2)
63557
+ * =============================================================================
63558
+ */
63559
+
63560
+ /* CTA content/body text */
63561
+ :where(.theme-scope) :where([data-block="cta-full"]) .cta-content {
63562
+ color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
63563
+ }
63564
+
63565
+ /* CTA button row container */
63566
+ :where(.theme-scope) :where([data-block="cta-full"]) .cta-row {
63230
63567
  display: flex;
63231
- flex-direction: column;
63232
- gap: 0.5rem;
63568
+ flex-wrap: wrap;
63233
63569
  }
63234
63570
 
63235
- /* Altcha wrapper */
63236
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-altcha {
63237
- margin-top: 1rem;
63571
+ /* =============================================================================
63572
+ * Block: Body Text (content block, Phase 2)
63573
+ *
63574
+ * Style contract:
63575
+ * - Variant styling is keyed off \`data-block-variant\` on the PageRenderer wrapper.
63576
+ * - Prose sizing comes from \`rb-prose-*\` (theme-aware) in \`packages/blocks/src/theme/styles.css\`.
63577
+ * =============================================================================
63578
+ */
63579
+
63580
+ /* Body copy rich text container */
63581
+ :where(.theme-scope) :where([data-block="body-text"]) .body-copy-container {
63582
+ max-width: 48rem;
63583
+ margin-left: 0;
63584
+ margin-right: auto;
63238
63585
  }
63239
63586
 
63240
- /* Link button (inline text link) */
63241
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-link {
63242
- display: inline;
63243
- margin-left: 0.5rem;
63244
- color: rgb(var(--tb-primary, 17 24 39));
63245
- background: none;
63246
- border: none;
63247
- padding: 0;
63248
- font: inherit;
63249
- text-decoration: underline;
63250
- cursor: pointer;
63587
+ :where(.theme-scope) :where([data-block="body-text"]) .body-copy-container.rb-items-center {
63588
+ margin-left: auto;
63589
+ margin-right: auto;
63251
63590
  }
63252
63591
 
63253
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-link:hover {
63254
- text-decoration: none;
63592
+ /* Body copy rich text */
63593
+ :where(.theme-scope) :where([data-block="body-text"]) .body-copy-body {
63594
+ color: inherit;
63595
+ }
63596
+
63597
+ /* Ensure editing mode doesn't silently change typography inside ProseMirror */
63598
+ :where(.theme-scope) :where([data-block="body-text"]) .body-copy-body :where(.ProseMirror) {
63599
+ font-size: inherit;
63600
+ line-height: inherit;
63601
+ }
63602
+
63603
+ /* Variant: Intro (centered, wider container, larger text, relaxed leading) */
63604
+ :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) .body-copy-container {
63605
+ max-width: 60rem;
63606
+ }
63607
+
63608
+ :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) .body-copy-body {
63609
+ font-size: var(--rb-prose-lg-font-size);
63610
+ line-height: var(--rb-prose-lg-line-height);
63611
+ }
63612
+
63613
+ @container rb-site (min-width: 640px) {
63614
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
63615
+ :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) .body-copy-body {
63616
+ font-size: var(--rb-prose-xl-sm-font-size);
63617
+ line-height: var(--rb-prose-xl-sm-line-height);
63618
+ }
63619
+ }
63620
+ }
63621
+
63622
+ /* Variant: Narrow (left-aligned, shorter line length) */
63623
+ :where(.theme-scope) :where([data-block="body-text"][data-block-variant="narrow"]) .body-copy-container {
63624
+ max-width: 34rem;
63625
+ margin-left: 0;
63626
+ margin-right: auto;
63627
+ }
63628
+
63629
+ /* Override prose sizing via theme-aware vars (see styles.css) */
63630
+ :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) {
63631
+ /* Mobile-first: use rb-prose-lg sizing below 640px */
63632
+ --rb-prose-lg-font-size: clamp(
63633
+ calc(var(--fs-body, 16px) * 1.35),
63634
+ calc(var(--fs-body, 16px) * 1.1 + 1.25vw),
63635
+ calc(var(--fs-body, 16px) * 1.6)
63636
+ );
63637
+ --rb-prose-lg-line-height: calc(var(--lh-body, 1.65) + 0.2);
63638
+
63639
+ /* At >= 640px, rb-prose-xl-sm applies and becomes the dominant size */
63640
+ --rb-prose-xl-sm-font-size: clamp(
63641
+ calc(var(--fs-body, 16px) * 1.55),
63642
+ calc(var(--fs-body, 16px) * 1.25 + 1.5vw),
63643
+ calc(var(--fs-body, 16px) * 1.8)
63644
+ );
63645
+ --rb-prose-xl-sm-line-height: calc(var(--lh-body, 1.65) + 0.2);
63646
+ }
63647
+
63648
+ /* =============================================================================
63649
+ * Block: Form (formCopy fragment, Phase 2)
63650
+ * =============================================================================
63651
+ */
63652
+
63653
+ /* Form title */
63654
+ :where(.theme-scope) :where([data-block="form"]) .form-copy-title {
63655
+ font-size: 1.5rem;
63656
+ font-weight: 600;
63657
+ }
63658
+
63659
+ /* Form intro text */
63660
+ :where(.theme-scope) :where([data-block="form"]) .form-copy-intro {
63661
+ font-size: 1rem;
63662
+ color: var(--section-text-color, rgb(var(--tb-text)));
63255
63663
  }
63256
63664
 
63257
63665
  /* =============================================================================
@@ -63341,261 +63749,6 @@ var containerResponsiveThemeCss = `/*
63341
63749
  margin-top: 0.5rem;
63342
63750
  }
63343
63751
 
63344
- /* =============================================================================
63345
- * Shared: Inline Text Marks
63346
- * =============================================================================
63347
- */
63348
-
63349
- :where(.theme-scope) .rb-inline-text-accent,
63350
- :where(.theme-scope) .rb-inline-text-highlight {
63351
- font: inherit;
63352
- letter-spacing: inherit;
63353
- text-transform: inherit;
63354
- }
63355
-
63356
- :where(.theme-scope) .rb-inline-text-accent-accent {
63357
- color: rgb(var(--tb-accent));
63358
- }
63359
-
63360
- :where(.theme-scope) .rb-inline-text-accent-brand {
63361
- color: rgb(var(--tb-primary));
63362
- }
63363
-
63364
- :where(.theme-scope) .rb-inline-text-accent-contrast {
63365
- color: var(--section-text-color, rgb(var(--tb-text)));
63366
- }
63367
-
63368
- :where(.theme-scope) .rb-inline-text-highlight {
63369
- border-radius: 0.22em;
63370
- box-decoration-break: clone;
63371
- -webkit-box-decoration-break: clone;
63372
- padding: 0.02em 0.12em;
63373
- }
63374
-
63375
- :where(.theme-scope) .rb-inline-text-highlight-soft {
63376
- background: color-mix(in oklab, var(--section-text-color, rgb(var(--tb-text))) 14%, transparent);
63377
- }
63378
-
63379
- :where(.theme-scope) .rb-inline-text-highlight-accent {
63380
- background: color-mix(in oklab, rgb(var(--tb-accent)) 28%, transparent);
63381
- }
63382
-
63383
- :where(.theme-scope) .rb-inline-text-highlight-brand {
63384
- background: color-mix(in oklab, rgb(var(--tb-primary)) 24%, transparent);
63385
- }
63386
-
63387
- /* =============================================================================
63388
- * Block: Hero (Phase 2)
63389
- * Uses theme palette vars directly (no Tier 3 vars needed)
63390
- * =============================================================================
63391
- */
63392
-
63393
- /* Eyebrow - color only (typography via .rb-eyebrow) */
63394
- :where(.theme-scope) :where([data-block="hero"]) .hero-eyebrow:not(.rb-eyebrow-treatment-accent) {
63395
- color: var(--section-text-color, rgb(var(--tb-text)));
63396
- }
63397
-
63398
- /* Subheadline - supporting text below headline */
63399
- :where(.theme-scope) :where([data-block="hero"]) .hero-headline {
63400
- text-wrap: balance;
63401
- }
63402
-
63403
- :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
63404
- font-size: 1.125rem;
63405
- color: var(--section-supporting-color, var(--section-text-color, rgb(var(--tb-text))));
63406
- }
63407
-
63408
- @container rb-site (min-width: 640px) {
63409
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
63410
- :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
63411
- font-size: 1.25rem;
63412
- }
63413
- }
63414
- }
63415
-
63416
- /* Hero typography scales. These classes are emitted by Theme V2 hero looks. */
63417
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-quiet .hero-headline {
63418
- font-size: clamp(2rem, 4vw, 3rem);
63419
- line-height: 1.12;
63420
- }
63421
-
63422
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-quiet .hero-subheadline {
63423
- font-size: clamp(1rem, 1.2vw, 1.25rem);
63424
- line-height: 1.55;
63425
- }
63426
-
63427
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-headline {
63428
- font-size: clamp(2.75rem, 5.6vw, 4.75rem);
63429
- line-height: 1.06;
63430
- }
63431
-
63432
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-subheadline {
63433
- font-size: clamp(1.0625rem, 1.4vw, 1.375rem);
63434
- line-height: 1.55;
63435
- }
63436
-
63437
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-headline {
63438
- font-size: clamp(3.5rem, 7.2vw, 6.25rem);
63439
- line-height: 1;
63440
- }
63441
-
63442
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-subheadline {
63443
- font-size: clamp(1.125rem, 1.5vw, 1.5rem);
63444
- line-height: 1.5;
63445
- }
63446
-
63447
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-headline {
63448
- font-size: clamp(4.25rem, 10vw, 8.5rem);
63449
- line-height: 0.94;
63450
- }
63451
-
63452
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-subheadline {
63453
- font-size: clamp(1.125rem, 1.4vw, 1.5rem);
63454
- line-height: 1.45;
63455
- }
63456
-
63457
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-medium.rb-hero-typography-poster .hero-headline {
63458
- font-size: clamp(3.5rem, 7.5vw, 6.5rem);
63459
- }
63460
-
63461
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
63462
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-display .hero-headline {
63463
- font-size: clamp(3rem, 6vw, 5.25rem);
63464
- line-height: 1.02;
63465
- }
63466
-
63467
- @container rb-site (max-width: 639px) {
63468
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
63469
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-headline,
63470
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-headline,
63471
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
63472
- :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-display .hero-headline {
63473
- font-size: clamp(2.5rem, 11vw, 3.5rem);
63474
- line-height: 1.05;
63475
- }
63476
- }
63477
- }
63478
-
63479
- /* =============================================================================
63480
- * Shared: Heading Group (used by CTA, single-button, etc.)
63481
- * =============================================================================
63482
- */
63483
-
63484
- /* Eyebrow - color only (typography via .rb-eyebrow) */
63485
- :where(.theme-scope) .heading-eyebrow:not(.rb-eyebrow-treatment-accent) {
63486
- color: rgb(var(--tb-mutedText));
63487
- }
63488
-
63489
- /* =============================================================================
63490
- * Block: CTA (Phase 2)
63491
- * =============================================================================
63492
- */
63493
-
63494
- /* CTA content/body text */
63495
- :where(.theme-scope) :where([data-block="cta-full"]) .cta-content {
63496
- color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
63497
- }
63498
-
63499
- /* CTA button row container */
63500
- :where(.theme-scope) :where([data-block="cta-full"]) .cta-row {
63501
- display: flex;
63502
- flex-wrap: wrap;
63503
- }
63504
-
63505
- /* =============================================================================
63506
- * Block: Body Text (content block, Phase 2)
63507
- *
63508
- * Style contract:
63509
- * - Variant styling is keyed off \`data-block-variant\` on the PageRenderer wrapper.
63510
- * - Prose sizing comes from \`rb-prose-*\` (theme-aware) in \`packages/blocks/src/theme/styles.css\`.
63511
- * =============================================================================
63512
- */
63513
-
63514
- /* Body copy rich text container */
63515
- :where(.theme-scope) :where([data-block="body-text"]) .body-copy-container {
63516
- max-width: 48rem;
63517
- margin-left: 0;
63518
- margin-right: auto;
63519
- }
63520
-
63521
- :where(.theme-scope) :where([data-block="body-text"]) .body-copy-container.rb-items-center {
63522
- margin-left: auto;
63523
- margin-right: auto;
63524
- }
63525
-
63526
- /* Body copy rich text */
63527
- :where(.theme-scope) :where([data-block="body-text"]) .body-copy-body {
63528
- color: inherit;
63529
- }
63530
-
63531
- /* Ensure editing mode doesn't silently change typography inside ProseMirror */
63532
- :where(.theme-scope) :where([data-block="body-text"]) .body-copy-body :where(.ProseMirror) {
63533
- font-size: inherit;
63534
- line-height: inherit;
63535
- }
63536
-
63537
- /* Variant: Intro (centered, wider container, larger text, relaxed leading) */
63538
- :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) .body-copy-container {
63539
- max-width: 60rem;
63540
- }
63541
-
63542
- :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) .body-copy-body {
63543
- font-size: var(--rb-prose-lg-font-size);
63544
- line-height: var(--rb-prose-lg-line-height);
63545
- }
63546
-
63547
- @container rb-site (min-width: 640px) {
63548
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
63549
- :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) .body-copy-body {
63550
- font-size: var(--rb-prose-xl-sm-font-size);
63551
- line-height: var(--rb-prose-xl-sm-line-height);
63552
- }
63553
- }
63554
- }
63555
-
63556
- /* Variant: Narrow (left-aligned, shorter line length) */
63557
- :where(.theme-scope) :where([data-block="body-text"][data-block-variant="narrow"]) .body-copy-container {
63558
- max-width: 34rem;
63559
- margin-left: 0;
63560
- margin-right: auto;
63561
- }
63562
-
63563
- /* Override prose sizing via theme-aware vars (see styles.css) */
63564
- :where(.theme-scope) :where([data-block="body-text"][data-block-variant="intro"]) {
63565
- /* Mobile-first: use rb-prose-lg sizing below 640px */
63566
- --rb-prose-lg-font-size: clamp(
63567
- calc(var(--fs-body, 16px) * 1.35),
63568
- calc(var(--fs-body, 16px) * 1.1 + 1.25vw),
63569
- calc(var(--fs-body, 16px) * 1.6)
63570
- );
63571
- --rb-prose-lg-line-height: calc(var(--lh-body, 1.65) + 0.2);
63572
-
63573
- /* At >= 640px, rb-prose-xl-sm applies and becomes the dominant size */
63574
- --rb-prose-xl-sm-font-size: clamp(
63575
- calc(var(--fs-body, 16px) * 1.55),
63576
- calc(var(--fs-body, 16px) * 1.25 + 1.5vw),
63577
- calc(var(--fs-body, 16px) * 1.8)
63578
- );
63579
- --rb-prose-xl-sm-line-height: calc(var(--lh-body, 1.65) + 0.2);
63580
- }
63581
-
63582
- /* =============================================================================
63583
- * Block: Form (formCopy fragment, Phase 2)
63584
- * =============================================================================
63585
- */
63586
-
63587
- /* Form title */
63588
- :where(.theme-scope) :where([data-block="form"]) .form-copy-title {
63589
- font-size: 1.5rem;
63590
- font-weight: 600;
63591
- }
63592
-
63593
- /* Form intro text */
63594
- :where(.theme-scope) :where([data-block="form"]) .form-copy-intro {
63595
- font-size: 1rem;
63596
- color: var(--section-text-color, rgb(var(--tb-text)));
63597
- }
63598
-
63599
63752
  /* =============================================================================
63600
63753
  * Block-Level Override Utilities
63601
63754
  *
@@ -65212,14 +65365,11 @@ var containerResponsiveThemeCss = `/*
65212
65365
  --cr-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
65213
65366
  }
65214
65367
 
65215
- /* Container */
65368
+ /* Container: base styling comes from the shared .rb-reg-surface
65369
+ (registration-surface.css); these overrides preserve course
65370
+ registration's pre-extraction look (fixed padding, centered). */
65216
65371
  :where(.theme-scope) :where([data-block="course-registration"]) .cr-container {
65217
- border-radius: var(--rb-block-radius);
65218
- border: 1px solid var(--cr-border);
65219
65372
  padding: 1.5rem;
65220
- background: rgb(var(--tb-surface));
65221
- color: var(--cr-on-surface);
65222
- max-width: 50rem; /* 800px */
65223
65373
  margin-inline: auto;
65224
65374
  }
65225
65375
 
@@ -65896,7 +66046,7 @@ var containerResponsiveThemeCss = `/*
65896
66046
  padding: 2rem 1rem;
65897
66047
  }
65898
66048
 
65899
- /* State icon color variants (layout from registration-shared.css) */
66049
+ /* State icon color variants (layout from registration-surface.css) */
65900
66050
  :where(.theme-scope) :where([data-block="course-registration"]) .rb-state-icon--success {
65901
66051
  background: var(--cr-success-bg);
65902
66052
  color: var(--cr-success-text);
@@ -69795,6 +69945,10 @@ var MultiPageUpdateResponse = z76.object({
69795
69945
  function isSupportedLoaderEndpoint2(endpoint) {
69796
69946
  return SUPPORTED_LOADER_ENDPOINTS.includes(endpoint);
69797
69947
  }
69948
+ var defaultPrefetchBlockDataDeps = {
69949
+ prefetchBlockDataCore: prefetchBlockData,
69950
+ normalizeLoaderParams
69951
+ };
69798
69952
  var ENTRY_REF_KEYS = [
69799
69953
  "identifier",
69800
69954
  "entryIdentifier",
@@ -70057,18 +70211,27 @@ async function getPublicWeeklySlotAvailability({ client, params }) {
70057
70211
  });
70058
70212
  }
70059
70213
  async function prefetchBlockData2(page, context, client, options) {
70214
+ return prefetchBlockDataWithDeps(
70215
+ defaultPrefetchBlockDataDeps,
70216
+ page,
70217
+ context,
70218
+ client,
70219
+ options
70220
+ );
70221
+ }
70222
+ async function prefetchBlockDataWithDeps(deps, page, context, client, options) {
70060
70223
  const { customBlocks } = options ?? {};
70061
70224
  const customBlockMap = new Map(
70062
70225
  (customBlocks ?? []).map((block) => [block.id, block])
70063
70226
  );
70064
- return prefetchBlockData(page, context, {
70227
+ return deps.prefetchBlockDataCore(page, context, {
70065
70228
  apiClient: async ({ endpoint, params }) => {
70066
70229
  if (!isSupportedLoaderEndpoint2(endpoint)) {
70067
70230
  throw new Error(
70068
70231
  `Unsupported loader endpoint: ${endpoint}. SDK only supports: ${SUPPORTED_LOADER_ENDPOINTS.join(", ")}`
70069
70232
  );
70070
70233
  }
70071
- const resolvedParams = normalizeLoaderParams(endpoint, params, context);
70234
+ const resolvedParams = deps.normalizeLoaderParams(endpoint, params, context);
70072
70235
  return await loaderAdapters[endpoint]({ client, params: resolvedParams });
70073
70236
  },
70074
70237
  isValidEndpoint: isSupportedLoaderEndpoint2,
@@ -70528,12 +70691,18 @@ function selectBlocksForDeclaredEntrySlot(input) {
70528
70691
  }
70529
70692
 
70530
70693
  // src/rendering/helpers/loadContent.ts
70694
+ var defaultLoadContentDeps = {
70695
+ prefetchBlockData: prefetchBlockData2
70696
+ };
70531
70697
  function isPageContent(result) {
70532
70698
  return result.type === "page";
70533
70699
  }
70534
70700
  function isEntryContent(result) {
70535
70701
  return result.type === "entry";
70536
70702
  }
70703
+ function isPageSurfaceContent(result) {
70704
+ return result.type === "pageSurface";
70705
+ }
70537
70706
  function isContentLoadNotFoundError(error) {
70538
70707
  if (typeof error !== "object" || error === null || !("status" in error)) {
70539
70708
  return false;
@@ -70544,6 +70713,9 @@ function getRejectedReason(result) {
70544
70713
  return result.reason;
70545
70714
  }
70546
70715
  async function loadContent(params) {
70716
+ return loadContentWithDeps(defaultLoadContentDeps, params);
70717
+ }
70718
+ async function loadContentWithDeps(deps, params) {
70547
70719
  const {
70548
70720
  client,
70549
70721
  siteId,
@@ -70572,7 +70744,7 @@ async function loadContent(params) {
70572
70744
  }
70573
70745
  const site = siteResult.value;
70574
70746
  const contentResponse = contentResult.value;
70575
- return loadContentFromContentResponse({
70747
+ return loadContentFromContentResponseWithDeps(deps, {
70576
70748
  client,
70577
70749
  siteId,
70578
70750
  site,
@@ -70580,8 +70752,14 @@ async function loadContent(params) {
70580
70752
  preview
70581
70753
  });
70582
70754
  }
70583
- async function loadContentFromContentResponse(params) {
70584
- const { client, siteId, site, contentResponse, preview = false } = params;
70755
+ async function loadContentFromContentResponseWithDeps(deps, params) {
70756
+ const {
70757
+ client,
70758
+ siteId,
70759
+ site,
70760
+ contentResponse,
70761
+ preview = false
70762
+ } = params;
70585
70763
  const support = buildSiteRenderSupport(
70586
70764
  site,
70587
70765
  collectMediaAssetSidecar(contentResponse.mediaAssets)
@@ -70611,6 +70789,7 @@ async function loadContentFromContentResponse(params) {
70611
70789
  entry,
70612
70790
  { siteId, preview },
70613
70791
  client,
70792
+ deps,
70614
70793
  { customBlocks: support.customBlocks }
70615
70794
  );
70616
70795
  return {
@@ -70682,6 +70861,7 @@ async function loadContentFromContentResponse(params) {
70682
70861
  pagePurpose: "page-surface-template",
70683
70862
  context: { siteId, preview },
70684
70863
  client,
70864
+ deps,
70685
70865
  options: { customBlocks: support.customBlocks }
70686
70866
  });
70687
70867
  return {
@@ -70724,7 +70904,7 @@ async function loadContentFromContentResponse(params) {
70724
70904
  purpose: pageData.purpose,
70725
70905
  blocks: pageData.blocks
70726
70906
  });
70727
- const resolvedData = await prefetchBlockData2(
70907
+ const resolvedData = await deps.prefetchBlockData(
70728
70908
  pageOutline,
70729
70909
  {
70730
70910
  siteId,
@@ -70773,7 +70953,7 @@ function isEntryResponse(response) {
70773
70953
  function isPageSurfaceResponse(response) {
70774
70954
  return response.type === "pageSurface";
70775
70955
  }
70776
- async function processEntryTemplate(templates, entrySlots, entry, context, client, options) {
70956
+ async function processEntryTemplate(templates, entrySlots, entry, context, client, deps, options) {
70777
70957
  return processTemplatePage({
70778
70958
  templates,
70779
70959
  slotContent: entrySlots,
@@ -70795,6 +70975,7 @@ async function processEntryTemplate(templates, entrySlots, entry, context, clien
70795
70975
  pagePurpose: "entry-template",
70796
70976
  context,
70797
70977
  client,
70978
+ deps,
70798
70979
  options
70799
70980
  });
70800
70981
  }
@@ -70815,7 +70996,7 @@ async function processTemplatePage(input) {
70815
70996
  purpose: input.pagePurpose,
70816
70997
  blocks
70817
70998
  };
70818
- const resolvedData = await prefetchBlockData2(
70999
+ const resolvedData = await input.deps.prefetchBlockData(
70819
71000
  templatePage,
70820
71001
  {
70821
71002
  siteId: input.context.siteId,
@@ -71105,6 +71286,8 @@ function PageContent({
71105
71286
  occurrenceContext: dataContext?.occurrenceContext ?? null,
71106
71287
  entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
71107
71288
  contentEntry: dataContext?.contentEntry ?? null,
71289
+ pageSurface: dataContext?.pageSurface ?? null,
71290
+ subject: dataContext?.subject ?? null,
71108
71291
  editableRouteMetadataFieldIds: dataContext?.editableRouteMetadataFieldIds ?? null,
71109
71292
  previewStage: dataContext?.previewStage,
71110
71293
  supabaseUrl,
@@ -72199,7 +72382,7 @@ var CircuitOpenError = class extends Error {
72199
72382
  };
72200
72383
 
72201
72384
  // src/version.ts
72202
- var SDK_VERSION = "0.98.0";
72385
+ var SDK_VERSION = "0.99.0";
72203
72386
 
72204
72387
  // src/next/content-load-failure.ts
72205
72388
  var SdkContentLoadError = RiverbankContentLoadError;
@@ -72418,6 +72601,7 @@ function createCatchAllPage(options) {
72418
72601
  getClient,
72419
72602
  config,
72420
72603
  preview: previewOption,
72604
+ contentContract: contentContractOption = "compat",
72421
72605
  blockOverrides,
72422
72606
  siteUrl,
72423
72607
  beforeRender,
@@ -72431,6 +72615,9 @@ function createCatchAllPage(options) {
72431
72615
  const enablePortal = enablePortalOption ?? config.enablePortal ?? false;
72432
72616
  const preview = previewOption ?? detectPreviewFromClient(getClient);
72433
72617
  const contentTypes = (config.content?.contentTypes ?? []).map(toRoutingInfo);
72618
+ function resolveContentContract(path) {
72619
+ return typeof contentContractOption === "function" ? contentContractOption({ path, preview }) : contentContractOption;
72620
+ }
72434
72621
  async function resolveRequestContext() {
72435
72622
  if (!getRequestContext) return void 0;
72436
72623
  try {
@@ -72484,7 +72671,8 @@ function createCatchAllPage(options) {
72484
72671
  client,
72485
72672
  siteId: config.siteId,
72486
72673
  path: contentPath,
72487
- preview
72674
+ preview,
72675
+ contentContract: resolveContentContract(contentPath)
72488
72676
  });
72489
72677
  return contentFound(content);
72490
72678
  } catch (error) {
@@ -72621,63 +72809,66 @@ function createCatchAllPage(options) {
72621
72809
  console.warn(themeResult.warning);
72622
72810
  }
72623
72811
  const resolvedTheme = themeResult.theme;
72624
- let rendered;
72625
- if (isPageContent(content)) {
72812
+ const renderPageComponent = async (args) => {
72626
72813
  const resolvedBlockOverrides = await resolveBlockOverridesForPage(
72627
72814
  blockOverrides,
72628
- content.page
72815
+ args.page
72629
72816
  );
72630
- rendered = /* @__PURE__ */ jsx70(
72817
+ return /* @__PURE__ */ jsx70(
72631
72818
  Page,
72632
72819
  {
72633
- page: content.page,
72820
+ page: args.page,
72634
72821
  theme: resolvedTheme,
72635
- siteId: content.siteId,
72822
+ siteId: args.content.siteId,
72636
72823
  apiBaseUrl,
72637
72824
  portalToken,
72638
- resolvedData: content.resolvedData,
72639
- bookingOfferingPresets: content.bookingOfferingPresets,
72825
+ resolvedData: args.content.resolvedData,
72826
+ bookingOfferingPresets: args.content.bookingOfferingPresets,
72640
72827
  blockOverrides: resolvedBlockOverrides,
72641
- sdkConfig: content.sdkConfig,
72642
- supabaseUrl: content.supabaseUrl,
72643
- mediaAssets: content.mediaAssets,
72828
+ sdkConfig: args.content.sdkConfig,
72829
+ supabaseUrl: args.content.supabaseUrl,
72830
+ mediaAssets: args.content.mediaAssets,
72644
72831
  themeRuntime,
72645
- dataContext: {
72646
- previewStage: preview ? "preview" : "published"
72647
- }
72832
+ dataContext: args.dataContext
72648
72833
  }
72649
72834
  );
72835
+ };
72836
+ let rendered;
72837
+ if (isPageContent(content)) {
72838
+ rendered = await renderPageComponent({
72839
+ page: content.page,
72840
+ content,
72841
+ dataContext: {
72842
+ previewStage: preview ? "preview" : "published"
72843
+ }
72844
+ });
72650
72845
  } else if (isEntryContent(content)) {
72651
72846
  if (!content.templatePage) {
72652
72847
  return notFound();
72653
72848
  }
72654
- const resolvedBlockOverrides = await resolveBlockOverridesForPage(
72655
- blockOverrides,
72656
- content.templatePage
72657
- );
72658
- rendered = /* @__PURE__ */ jsx70(
72659
- Page,
72660
- {
72661
- page: content.templatePage,
72662
- theme: resolvedTheme,
72663
- siteId: content.siteId,
72664
- apiBaseUrl,
72665
- portalToken,
72666
- resolvedData: content.resolvedData,
72667
- bookingOfferingPresets: content.bookingOfferingPresets,
72668
- blockOverrides: resolvedBlockOverrides,
72669
- sdkConfig: content.sdkConfig,
72670
- supabaseUrl: content.supabaseUrl,
72671
- mediaAssets: content.mediaAssets,
72672
- themeRuntime,
72673
- dataContext: {
72674
- contentEntry: content.dataContext.contentEntry,
72675
- occurrenceContext,
72676
- entrySubrouteContext,
72677
- previewStage: preview ? "preview" : "published"
72678
- }
72849
+ rendered = await renderPageComponent({
72850
+ page: content.templatePage,
72851
+ content,
72852
+ dataContext: {
72853
+ contentEntry: content.dataContext.contentEntry,
72854
+ occurrenceContext,
72855
+ entrySubrouteContext,
72856
+ previewStage: preview ? "preview" : "published"
72679
72857
  }
72680
- );
72858
+ });
72859
+ } else if (isPageSurfaceContent(content)) {
72860
+ if (!content.templatePage) {
72861
+ return notFound();
72862
+ }
72863
+ rendered = await renderPageComponent({
72864
+ page: content.templatePage,
72865
+ content,
72866
+ dataContext: {
72867
+ pageSurface: content.dataContext.pageSurface,
72868
+ subject: content.dataContext.subject,
72869
+ previewStage: preview ? "preview" : "published"
72870
+ }
72871
+ });
72681
72872
  } else {
72682
72873
  return notFound();
72683
72874
  }
@@ -72748,6 +72939,9 @@ function createCatchAllPage(options) {
72748
72939
  const page = isPageContent(content) ? content.page : isEntryContent(content) ? {
72749
72940
  name: content.entry.metaTitle ?? content.entry.title,
72750
72941
  purpose: content.entry.metaDescription ?? void 0
72942
+ } : isPageSurfaceContent(content) ? {
72943
+ name: content.pageSurface.metaTitle ?? content.pageSurface.title,
72944
+ purpose: content.pageSurface.metaDescription ?? void 0
72751
72945
  } : { name: "Page" };
72752
72946
  const metadataGenerator = preview ? generatePreviewMetadata : generatePageMetadata;
72753
72947
  const metadataOverrides = getEntrySubrouteMetadataOverrides({
@@ -73689,7 +73883,14 @@ function resolveAuth(config) {
73689
73883
  'Authentication configuration is required. Provide either `auth` (recommended) or `apiKey` (deprecated). For public endpoints without auth, use: { auth: { type: "none" } }'
73690
73884
  );
73691
73885
  }
73886
+ var defaultRiverbankClientDeps = {
73887
+ createBearerAPIClient,
73888
+ createInternalAPIClient
73889
+ };
73692
73890
  function createRiverbankClient(config) {
73891
+ return createRiverbankClientWithDeps(defaultRiverbankClientDeps, config);
73892
+ }
73893
+ function createRiverbankClientWithDeps(deps, config) {
73693
73894
  if (!config.baseUrl) {
73694
73895
  throw new Error(
73695
73896
  "baseUrl is required when creating a Riverbank client. Expected format: https://dashboard.example.com/api (must include /api path)"
@@ -73732,7 +73933,7 @@ function createRiverbankClient(config) {
73732
73933
  keyType = "preview";
73733
73934
  break;
73734
73935
  }
73735
- const baseApiClient = authConfig.type === "none" ? createInternalAPIClient(config.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config.baseUrl) : createBearerAPIClient(authConfig.token, config.baseUrl);
73936
+ const baseApiClient = authConfig.type === "none" ? deps.createInternalAPIClient(config.baseUrl) : authConfig.type === "api-key" ? deps.createBearerAPIClient(authConfig.key, config.baseUrl) : deps.createBearerAPIClient(authConfig.token, config.baseUrl);
73736
73937
  const apiClient = withDefaultHeaders(baseApiClient, config.defaultHeaders);
73737
73938
  const cache = new SimpleCache({
73738
73939
  maxSize: cacheMaxSize,