@riverbankcms/sdk 0.96.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 (208) hide show
  1. package/README.md +20 -1
  2. package/dist/{PreviewEditorSidebar-46VT4QVU.mjs → PreviewEditorSidebar-TPOKCCKY.mjs} +3 -3
  3. package/dist/{PreviewEditorUI-JD75GE5F.mjs → PreviewEditorUI-Y347GLC2.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-OGTXRQ4M.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +36 -36
  6. package/dist/_dts/api/src/billing.d.ts +2 -0
  7. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +35 -1
  8. package/dist/_dts/api/src/bookingOperations.d.ts +246 -0
  9. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +5 -1
  10. package/dist/_dts/api/src/contentRuntime.d.ts +109 -40
  11. package/dist/_dts/api/src/endpoints.d.ts +88 -0
  12. package/dist/_dts/api/src/index.d.ts +3 -2
  13. package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
  14. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +10 -0
  15. package/dist/_dts/api/src/sdkContracts.d.ts +2 -0
  16. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +2 -1
  17. package/dist/_dts/api/src/siteOperations.d.ts +65 -1
  18. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +7 -1
  19. package/dist/_dts/billing/src/site-arrangements.d.ts +151 -0
  20. package/dist/_dts/billing/src/subscriptions/store.d.ts +2 -0
  21. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/resolveThumbnail.d.ts +2 -1
  22. package/dist/_dts/blocks/src/PageRenderer.d.ts +8 -1
  23. package/dist/_dts/blocks/src/bindings/types.d.ts +0 -4
  24. package/dist/_dts/blocks/src/client/site-chrome.d.ts +7 -0
  25. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -0
  26. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +12 -12
  27. package/dist/_dts/blocks/src/primitives/content/primitives.d.ts +4 -0
  28. package/dist/_dts/blocks/src/system/blocks/events/shared/index.d.ts +1 -0
  29. package/dist/_dts/blocks/src/system/blocks/events/shared/layout.d.ts +2 -0
  30. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  31. package/dist/_dts/blocks/src/system/blocks/weekly-slot-availability.d.ts +34 -0
  32. package/dist/_dts/blocks/src/system/componentFactory.d.ts +1 -0
  33. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  34. package/dist/_dts/blocks/src/system/customize/facets.d.ts +2 -2
  35. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +4 -1
  37. package/dist/_dts/blocks/src/system/node/builder.d.ts +2 -0
  38. package/dist/_dts/blocks/src/system/node/schema.d.ts +13 -0
  39. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  40. package/dist/_dts/blocks/src/system/registry.d.ts +1 -0
  41. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +2 -1
  42. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
  43. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +24 -0
  44. package/dist/_dts/blocks/src/system/runtime/components/booking/DatePicker.d.ts +6 -2
  45. package/dist/_dts/blocks/src/system/runtime/components/booking/SuccessMessage.d.ts +3 -1
  46. package/dist/_dts/blocks/src/system/runtime/components/booking/TimeSlotSelector.d.ts +10 -4
  47. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -0
  48. package/dist/_dts/blocks/src/system/runtime/hooks/useAppointmentCheckoutVerification.d.ts +7 -0
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableSlots.d.ts +2 -2
  50. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +2 -2
  51. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +4 -0
  52. package/dist/_dts/blocks/src/system/runtime/hooks/usePaymentVerification.d.ts +5 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +11 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/StepIndicator.d.ts +3 -1
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +14 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +8 -2
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +133 -2
  58. package/dist/_dts/blocks/src/system/runtime/nodes/weekly-slot-availability.client.controller.d.ts +3 -0
  59. package/dist/_dts/blocks/src/system/runtime/nodes/weekly-slot-availability.client.d.ts +9 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/weekly-slot-availability.client.state.d.ts +14 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/weekly-slot-availability.server.d.ts +10 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/weekly-slot-availability.view.d.ts +11 -0
  63. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +31 -1
  64. package/dist/_dts/blocks/src/system/runtime/shared/components/FeedbackMessage.d.ts +2 -1
  65. package/dist/_dts/blocks/src/system/runtime/{nodes/event-registration → shared/components}/SelectableOptionCard.d.ts +11 -2
  66. package/dist/_dts/blocks/src/system/runtime/shared/components/StepIndicator.d.ts +16 -5
  67. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  68. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  69. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +5 -0
  70. package/dist/_dts/blocks/src/utils/date-formatting.d.ts +18 -2
  71. package/dist/_dts/content-editor/src/primitives/PreviewInlineTextEditor.d.ts +1 -1
  72. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +1 -1
  73. package/dist/_dts/content-model/src/templates/defaults.d.ts +5 -5
  74. package/dist/_dts/content-model/src/templates/types.d.ts +2 -6
  75. package/dist/_dts/core/src/branded.d.ts +8 -0
  76. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +767 -20
  77. package/dist/_dts/field-primitives/src/bindings/index.d.ts +8 -0
  78. package/dist/_dts/sdk/src/__mocks__/next-cache.d.ts +1 -1
  79. package/dist/_dts/sdk/src/cli/commands/push/publishGuidance.d.ts +15 -0
  80. package/dist/_dts/sdk/src/cli/commands/push/scopes/commandBackedDatedOfferingScope.d.ts +2 -1
  81. package/dist/_dts/sdk/src/cli/commands/push/scopes/types.d.ts +3 -1
  82. package/dist/_dts/sdk/src/cli/commands/push/stale-resolution.d.ts +9 -3
  83. package/dist/_dts/sdk/src/cli/commands/push/workflowPlan.d.ts +34 -0
  84. package/dist/_dts/sdk/src/cli/commands/push.d.ts +13 -0
  85. package/dist/_dts/sdk/src/cli/commands/setup.d.ts +2 -0
  86. package/dist/_dts/sdk/src/cli/config-loader.d.ts +2 -0
  87. package/dist/_dts/sdk/src/cli/content/metadataStore.d.ts +29 -0
  88. package/dist/_dts/sdk/src/cli/content/reader.d.ts +16 -14
  89. package/dist/_dts/sdk/src/cli/content/writer.d.ts +6 -4
  90. package/dist/_dts/sdk/src/cli/env-scope.d.ts +2 -0
  91. package/dist/_dts/sdk/src/cli/helpers.d.ts +6 -7
  92. package/dist/_dts/sdk/src/cli/merge-remote/entryMergePush.d.ts +2 -0
  93. package/dist/_dts/sdk/src/cli/merge-remote/entryMergeReport.d.ts +6 -18
  94. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -4
  95. package/dist/_dts/sdk/src/cli/merge-remote/pageMergePush.d.ts +2 -0
  96. package/dist/_dts/sdk/src/cli/merge-remote/pageMergeReport.d.ts +6 -18
  97. package/dist/_dts/sdk/src/cli/merge-remote/pageSnapshots.d.ts +2 -4
  98. package/dist/_dts/sdk/src/cli/merge-remote/sharedBaseSnapshots.d.ts +32 -0
  99. package/dist/_dts/sdk/src/cli/merge-remote/sharedMergePlan.d.ts +27 -0
  100. package/dist/_dts/sdk/src/cli/merge-remote/sharedMergeReport.d.ts +63 -0
  101. package/dist/_dts/sdk/src/cli/push-config.d.ts +13 -2
  102. package/dist/_dts/sdk/src/cli/setup/setupPlan.d.ts +51 -0
  103. package/dist/_dts/sdk/src/cli/site-commands/commandRuntime.d.ts +21 -0
  104. package/dist/_dts/sdk/src/client/index.d.ts +6 -0
  105. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +1 -1
  106. package/dist/_dts/sdk/src/client/types.d.ts +18 -2
  107. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  108. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  109. package/dist/_dts/sdk/src/contracts/bindings.d.ts +3 -7
  110. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +13 -0
  111. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +6 -1
  112. package/dist/_dts/sdk/src/next/route-outcome-proxy.d.ts +3 -3
  113. package/dist/_dts/sdk/src/next/types.d.ts +19 -0
  114. package/dist/_dts/sdk/src/prebuild/loader.d.ts +8 -1
  115. package/dist/_dts/sdk/src/public-api/contracts.d.ts +174 -78
  116. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  117. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  118. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +4 -0
  119. package/dist/_dts/sdk/src/rendering/helpers/bindings.d.ts +4 -4
  120. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +58 -1
  121. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +8 -0
  122. package/dist/_dts/sdk/src/rendering/hooks/usePage.d.ts +2 -2
  123. package/dist/_dts/sdk/src/rendering/index.d.ts +7 -7
  124. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +18 -66
  125. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -0
  126. package/dist/_dts/sdk/src/routing/resolveRoute.d.ts +18 -0
  127. package/dist/_dts/sdk/src/test/apiClient.d.ts +17 -0
  128. package/dist/_dts/sdk/src/test/bunDom.setup.d.ts +1 -0
  129. package/dist/_dts/sdk/src/test/env.d.ts +4 -0
  130. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  131. package/dist/_dts/sdk/src/version.d.ts +1 -1
  132. package/dist/_dts/site-commands/src/commands.d.ts +3 -3
  133. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  134. package/dist/_dts/theme-core/src/interactive/generateBaseCSS.d.ts +6 -0
  135. package/dist/_dts/theme-core/src/status/contextualColors.d.ts +6 -0
  136. package/dist/_dts/theme-core/src/status/index.d.ts +1 -0
  137. package/dist/{chunk-VHIMXQ7Z.mjs → chunk-4HXF2QLH.mjs} +2 -2
  138. package/dist/{chunk-VTPPVAOL.mjs → chunk-EMJIT3ZJ.mjs} +1 -1
  139. package/dist/{chunk-4TLTV7OB.mjs → chunk-PM7HGDHM.mjs} +2 -2
  140. package/dist/{chunk-XMATDBXO.mjs → chunk-XO34WBBP.mjs} +2139 -1348
  141. package/dist/{chunk-EL55VV6Q.mjs → chunk-YGTTEVUM.mjs} +31 -10
  142. package/dist/{chunk-7ED5UNHL.mjs → chunk-YWTCCOSF.mjs} +117 -0
  143. package/dist/cli/index.mjs +2690 -1503
  144. package/dist/cli/init-docs/content/cli-reference.md +29 -1
  145. package/dist/cli/init-docs/content/getting-started.md +8 -0
  146. package/dist/cli/init-docs/content/workflow-agent-safe-sync.md +3 -1
  147. package/dist/cli/init-docs/content/workflow-preview-mode.md +6 -0
  148. package/dist/cli/init-docs/content/workflow-remote-setup.md +51 -0
  149. package/dist/client/{accordion-GUNXIIZR.mjs → accordion-QSUEYL4L.mjs} +2 -2
  150. package/dist/client/{bookingForm-AOU4VHP5.mjs → bookingForm-QYGAHPDP.mjs} +376 -302
  151. package/dist/client/bookings.mjs +795 -429
  152. package/dist/client/{carousel-4QSX2JPC.mjs → carousel-SM2LEWAU.mjs} +3 -3
  153. package/dist/client/{cart-JKN6C4ZB.mjs → cart-3N3SFKNQ.mjs} +7 -7
  154. package/dist/client/{checkout-YY6YMITW.mjs → checkout-YFAYPKPZ.mjs} +7 -7
  155. package/dist/client/{chunk-SY543WZ3.mjs → chunk-5DLGREUB.mjs} +1 -1
  156. package/dist/client/{chunk-A3YN7M3G.mjs → chunk-CLZ7NBSP.mjs} +147 -75
  157. package/dist/client/{chunk-GWCRCJLB.mjs → chunk-CYJ3MUFP.mjs} +18 -6
  158. package/dist/client/{chunk-JNE6UI6U.mjs → chunk-H3H3ODO7.mjs} +1 -1
  159. package/dist/client/{chunk-CPKMJVBD.mjs → chunk-HPEQ4YWW.mjs} +83 -109
  160. package/dist/client/{chunk-PCHACQEB.mjs → chunk-IIUIKJ4K.mjs} +15 -7
  161. package/dist/client/{chunk-TNGL2WJF.mjs → chunk-IOAHWAQG.mjs} +18 -0
  162. package/dist/client/{chunk-6H27K6AA.mjs → chunk-JTKBF3W2.mjs} +10 -4
  163. package/dist/client/{chunk-OLAOAZEO.mjs → chunk-K7KTSACR.mjs} +1 -1
  164. package/dist/client/{chunk-BFCJZODD.mjs → chunk-R32M5HFS.mjs} +6 -6
  165. package/dist/client/{chunk-VJROUYOQ.mjs → chunk-WEVT46PX.mjs} +3 -3
  166. package/dist/client/{chunk-H7A6PUGM.mjs → chunk-ZU65LTI3.mjs} +1 -1
  167. package/dist/client/client.mjs +5052 -4083
  168. package/dist/client/{courseRegistration-UU2KMPSQ.mjs → courseRegistration-LYBE7VVK.mjs} +7 -7
  169. package/dist/client/{eventCalendar-WIVNS2TM.mjs → eventCalendar-FMTB75X6.mjs} +9 -9
  170. package/dist/client/{eventCombined-P3G5MW4J.mjs → eventCombined-E4LUCJXT.mjs} +9 -9
  171. package/dist/client/{eventDetails-2VHJ2RDG.mjs → eventDetails-GELSRR4Z.mjs} +9 -9
  172. package/dist/client/{eventListing-TGO6JI3R.mjs → eventListing-TB623B6R.mjs} +9 -9
  173. package/dist/client/{eventRegistration-B46HEJES.mjs → eventRegistration-NRIKHXTI.mjs} +9 -9
  174. package/dist/client/{form-VKRTFUNQ.mjs → form-Y4U4IAXE.mjs} +3 -3
  175. package/dist/client/{headerSection-XUX4ZJLO.mjs → headerSection-QSOVV5P7.mjs} +3 -3
  176. package/dist/client/hooks.mjs +1776 -1355
  177. package/dist/client/{locationMap-NQFI5MJO.mjs → locationMap-QYCAHH7H.mjs} +3 -3
  178. package/dist/client/{newsletterForm-P2GETCQK.mjs → newsletterForm-NWHY5TBY.mjs} +3 -3
  179. package/dist/client/{productDetail-7NQ7O5IF.mjs → productDetail-FYDMU2CE.mjs} +7 -7
  180. package/dist/client/{productList-RX6ZJ7BL.mjs → productList-D76CGACQ.mjs} +7 -7
  181. package/dist/client/rendering/client.mjs +2990 -2470
  182. package/dist/client/rendering/islands.mjs +19 -19
  183. package/dist/client/rendering.mjs +3236 -2236
  184. package/dist/client/{shop-BHN5AKY6.mjs → shop-SOUACT5N.mjs} +7 -7
  185. package/dist/preview-next/before-render.mjs +117 -0
  186. package/dist/preview-next/client/runtime.mjs +5 -5
  187. package/dist/preview-next/middleware.mjs +117 -0
  188. package/dist/{sdk-runtime-X2LXQ5IC.mjs → sdk-runtime-XPVE3LBA.mjs} +6 -6
  189. package/dist/server/components.mjs +3115 -2484
  190. package/dist/server/config-template-validation.mjs +6 -2
  191. package/dist/server/config-validation.mjs +1961 -1580
  192. package/dist/server/config.mjs +1961 -1580
  193. package/dist/server/data.mjs +1762 -1352
  194. package/dist/server/index.mjs +266 -33
  195. package/dist/server/next/middleware.mjs +2 -2
  196. package/dist/server/next.mjs +3399 -2504
  197. package/dist/server/page-converter.mjs +1553 -1295
  198. package/dist/server/prebuild-loader.mjs +42 -23
  199. package/dist/server/prebuild.mjs +1 -1
  200. package/dist/server/rendering/server.mjs +3151 -2489
  201. package/dist/server/rendering.mjs +3363 -2555
  202. package/dist/server/routing.mjs +1877 -1388
  203. package/dist/server/server.mjs +2057 -1402
  204. package/dist/server/theme-bridge.mjs +597 -505
  205. package/dist/server/theme.mjs +5 -4
  206. package/dist/styles/index.css +499 -490
  207. package/package.json +6 -4
  208. package/dist/SdkPreviewModeRuntime-MJUSYUFB.mjs +0 -8
@@ -831,15 +831,16 @@ var joyStamp = defineButtonPersonality({
831
831
  // 700, matching the mockup's chunky button labels.
832
832
  typography: "heading",
833
833
  fontWeight: 700,
834
+ fontSize: "text-lg",
834
835
  borderWidth: 2,
835
836
  hoverTransform: "none",
836
837
  hoverColor: "none"
837
838
  },
838
839
  sizes: {
839
- sm: { padding: "0.625rem 1.25rem", fontSize: "text-sm" },
840
- md: { padding: "0.875rem 1.75rem", fontSize: "text-base" },
841
- lg: { padding: "1.125rem 2.25rem", fontSize: "text-lg" },
842
- xl: { padding: "1.25rem 2.75rem", fontSize: "text-xl" }
840
+ sm: { padding: "0.625rem 1.25rem", fontSize: "text-base" },
841
+ md: { padding: "0.875rem 1.75rem", fontSize: "text-lg" },
842
+ lg: { padding: "1.125rem 2.25rem", fontSize: "text-xl" },
843
+ xl: { padding: "1.25rem 2.75rem", fontSize: "text-2xl" }
843
844
  },
844
845
  variants: [
845
846
  {
@@ -1441,6 +1442,16 @@ var cardSystemSchema = z6.object({
1441
1442
  variants: z6.array(cardVariantSchema).min(1).max(3)
1442
1443
  });
1443
1444
 
1445
+ // ../theme-core/src/status/contextualColors.ts
1446
+ var STATUS_MUTED_COLOR_VAR = "--rb-status-muted-color";
1447
+ var DEFAULT_STATUS_MUTED_COLOR = "rgb(var(--tb-mutedText))";
1448
+ function statusMutedColorValue() {
1449
+ return `var(${STATUS_MUTED_COLOR_VAR}, ${DEFAULT_STATUS_MUTED_COLOR})`;
1450
+ }
1451
+ function statusMutedColorDeclaration() {
1452
+ return `color: ${statusMutedColorValue()};`;
1453
+ }
1454
+
1444
1455
  // ../theme-core/src/cards/core.ts
1445
1456
  var CORNER_RADIUS_MAP3 = {
1446
1457
  square: "0",
@@ -7227,7 +7238,7 @@ ${root} .status-error { color: rgb(var(--tb-destructive)); }
7227
7238
  ${root} .status-success { color: rgb(var(--tb-success)); }
7228
7239
  ${root} .status-warning { color: rgb(var(--tb-warning)); }
7229
7240
  ${root} .status-info { color: rgb(var(--tb-info)); }
7230
- ${root} .status-muted { color: rgb(var(--tb-mutedText)); }`);
7241
+ ${root} .status-muted { ${statusMutedColorDeclaration()} }`);
7231
7242
  cssBlocks.push(`/* Alert containers */
7232
7243
  ${root} .alert {
7233
7244
  padding: 1rem;
@@ -7423,6 +7434,34 @@ ${root} {
7423
7434
  /* Order summary */
7424
7435
  --er-summary-bg: rgba(var(--tb-primary), 0.1);
7425
7436
  --er-summary-border: rgb(var(--tb-border));
7437
+
7438
+ /* Shared registration-surface mappings (issue 1174).
7439
+ Route the shared --rb-reg-* contract through this block's documented
7440
+ Tier 3 vars so existing --er-* overrides keep working unchanged. */
7441
+ --rb-reg-radius: var(--er-radius);
7442
+ --rb-reg-border: var(--er-border);
7443
+ --rb-reg-border-hover: var(--er-border-hover);
7444
+ --rb-reg-border-selected: var(--er-border-selected);
7445
+ --rb-reg-bg-selected: var(--er-payment-bg-selected);
7446
+ --rb-reg-option-bg: var(--er-control-bg);
7447
+ --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
7448
+ --rb-reg-surface-bg: rgb(var(--tb-surface));
7449
+ --rb-reg-on-surface: var(--er-on-surface);
7450
+ --rb-reg-on-surface-muted: var(--er-on-surface-muted);
7451
+ --rb-reg-on-surface-subtle: var(--er-on-surface-subtle);
7452
+ --rb-reg-on-surface-faint: var(--er-on-surface-faint);
7453
+ --rb-reg-check-bg: var(--er-check-bg);
7454
+ --rb-reg-check-text: var(--er-check-text);
7455
+ --rb-reg-step-active: var(--er-step-active);
7456
+ --rb-reg-step-completed: var(--er-step-completed);
7457
+ --rb-reg-step-inactive: var(--er-step-inactive);
7458
+ --rb-reg-step-text: var(--er-step-text);
7459
+ --rb-reg-step-text-active: var(--er-step-text-active);
7460
+ --rb-reg-step-connector: var(--er-step-connector);
7461
+ --rb-reg-summary-bg: var(--er-surface-muted);
7462
+ --rb-reg-summary-border: var(--er-border);
7463
+ --rb-reg-focus-ring: var(--er-focus-ring);
7464
+ --rb-reg-shell-line: var(--er-shell-line);
7426
7465
  }
7427
7466
  `;
7428
7467
  }
@@ -7555,25 +7594,40 @@ ${root} {
7555
7594
  --ab-info-bg: rgba(var(--tb-info), 0.1);
7556
7595
  --ab-info-text: rgb(var(--tb-info));
7557
7596
 
7558
- /* Loading/muted states */
7597
+ /* Muted summary state */
7559
7598
  --ab-muted-bg: rgba(var(--tb-text), 0.05);
7560
- --ab-muted-text: rgba(var(--tb-text), 0.6);
7561
- --ab-spinner-color: rgb(var(--tb-primary));
7562
7599
 
7563
- /* Form elements */
7564
- --ab-input-border: rgb(var(--tb-border));
7600
+ /* Focus ring used by shared registration-surface controls */
7565
7601
  --ab-input-focus-ring: rgba(var(--tb-primary), 0.3);
7566
7602
 
7567
- /* Buttons */
7568
- --ab-btn-primary-bg: rgb(var(--tb-primary));
7569
- --ab-btn-primary-text: rgb(var(--tb-background));
7570
- --ab-btn-primary-hover: rgba(var(--tb-primary), 0.9);
7571
- --ab-btn-secondary-border: rgb(var(--tb-border));
7572
- --ab-btn-secondary-hover: rgba(var(--tb-text), 0.05);
7573
-
7574
- /* Text opacity levels */
7575
- --ab-text-muted-opacity: 0.6;
7576
- --ab-text-faint-opacity: 0.4;
7603
+ /* Shared registration-surface mappings (issue 1174).
7604
+ Route the shared --rb-reg-* contract through this block's Tier 3 vars
7605
+ (palette tokens where no --ab-* var exists) so --ab-* overrides keep
7606
+ working as the block adopts the shared classes. */
7607
+ --rb-reg-radius: var(--ab-card-radius, var(--rb-block-radius));
7608
+ --rb-reg-border: var(--ab-card-border);
7609
+ --rb-reg-border-hover: var(--ab-card-border-hover);
7610
+ --rb-reg-border-selected: var(--ab-card-border-selected);
7611
+ --rb-reg-bg-selected: var(--ab-card-bg-selected);
7612
+ --rb-reg-option-bg: transparent;
7613
+ --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
7614
+ --rb-reg-surface-bg: rgb(var(--tb-surface));
7615
+ --rb-reg-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
7616
+ --rb-reg-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
7617
+ --rb-reg-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
7618
+ --rb-reg-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
7619
+ --rb-reg-check-bg: var(--ab-check-bg);
7620
+ --rb-reg-check-text: var(--ab-check-text);
7621
+ --rb-reg-step-active: rgb(var(--tb-primary));
7622
+ --rb-reg-step-completed: rgb(var(--tb-success));
7623
+ --rb-reg-step-inactive: rgb(var(--tb-mutedText));
7624
+ --rb-reg-step-text: rgb(255 255 255);
7625
+ --rb-reg-step-text-active: rgb(var(--tb-primaryText, 255 255 255));
7626
+ --rb-reg-step-connector: rgba(var(--tb-border), 0.5);
7627
+ --rb-reg-summary-bg: var(--ab-muted-bg);
7628
+ --rb-reg-summary-border: var(--ab-card-border);
7629
+ --rb-reg-focus-ring: var(--ab-input-focus-ring);
7630
+ --rb-reg-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
7577
7631
  }
7578
7632
  `;
7579
7633
  }
@@ -7864,6 +7918,35 @@ ${root} {
7864
7918
  /* Summary */
7865
7919
  --cr-summary-bg: rgba(var(--tb-primary), 0.1);
7866
7920
  --cr-summary-border: rgb(var(--tb-border));
7921
+
7922
+ /* Shared registration-surface mappings (issue 1174).
7923
+ Route the shared --rb-reg-* contract through this block's Tier 3 vars
7924
+ (palette tokens where no --cr-* var exists) so existing --cr-* overrides
7925
+ keep working unchanged. */
7926
+ --rb-reg-radius: var(--rb-block-radius);
7927
+ --rb-reg-border: var(--cr-border);
7928
+ --rb-reg-border-hover: var(--cr-border-hover);
7929
+ --rb-reg-border-selected: var(--cr-border-selected);
7930
+ --rb-reg-bg-selected: var(--cr-payment-bg-selected);
7931
+ --rb-reg-option-bg: rgb(var(--tb-background));
7932
+ --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
7933
+ --rb-reg-surface-bg: rgb(var(--tb-surface));
7934
+ --rb-reg-on-surface: var(--cr-on-surface);
7935
+ --rb-reg-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
7936
+ --rb-reg-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
7937
+ --rb-reg-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
7938
+ --rb-reg-check-bg: var(--cr-check-bg);
7939
+ --rb-reg-check-text: var(--cr-check-text);
7940
+ --rb-reg-step-active: var(--cr-step-active);
7941
+ --rb-reg-step-completed: var(--cr-step-completed);
7942
+ --rb-reg-step-inactive: var(--cr-step-inactive);
7943
+ --rb-reg-step-text: var(--cr-step-text);
7944
+ --rb-reg-step-text-active: var(--cr-step-text-active);
7945
+ --rb-reg-step-connector: var(--cr-step-connector);
7946
+ --rb-reg-summary-bg: var(--cr-summary-bg);
7947
+ --rb-reg-summary-border: var(--cr-summary-border);
7948
+ --rb-reg-focus-ring: var(--cr-focus-ring);
7949
+ --rb-reg-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
7867
7950
  }
7868
7951
  `;
7869
7952
  }
@@ -11216,13 +11299,36 @@ var containerResponsiveThemeCss = `/*
11216
11299
  */
11217
11300
 
11218
11301
  /* =============================================================================
11219
- * Shared: Registration Terminal State Icons
11220
- * Used by event-registration and course-registration blocks.
11302
+ * Shared: Registration Surface (issue 1174)
11303
+ *
11304
+ * Wizard-surface primitives shared by the event-registration,
11305
+ * course-registration and appointment-booking blocks: surface container,
11306
+ * selectable option cards, step indicator, wizard actions row, on-surface
11307
+ * text ramp, layout stacks, summary box and skeleton shell lines.
11308
+ *
11309
+ * Uses:
11310
+ * - Tier 1 vars: --tb-* (from theme palette) as inline fallbacks
11311
+ * - Tier 2 vars: --rb-block-radius, --rb-block-transition (from theme scope)
11312
+ * - Shared vars: --rb-reg-* (mapped per block by the Tier 3 var generators;
11313
+ * canonical name list in blocks/registrationSurfaceVars.ts)
11314
+ *
11315
+ * Defaults intentionally match the event-registration (issue 1089) values; blocks
11316
+ * that need to preserve a different look override in their own block CSS,
11317
+ * which is imported after this file (cascade order is the override contract \u2014
11318
+ * all selectors here are zero-specificity \`:where()\`).
11319
+ *
11320
+ * Layout-only \`.rb-state-icon\` rules (formerly registration-shared.css) live
11321
+ * here too; block CSS provides the \`.rb-state-icon--{variant}\` colors.
11221
11322
  *
11222
- * Layout rules only \u2014 block-specific colors are defined in each block's CSS
11223
- * via scoped \`.rb-state-icon--{variant}\` rules.
11323
+ * Naming: component-like primitives follow the existing bare \`rb-\` shared
11324
+ * precedent (\`.rb-state-icon\`, \`.rb-tile\`): \`.rb-option-card\`, \`.rb-step-*\`,
11325
+ * \`.rb-wizard-actions\`, \`.rb-on-surface\`, \`.rb-shell-*\`. Container/layout
11326
+ * pieces that would otherwise collide with the global \`.rb-*\` utility layer
11327
+ * are namespaced \`rb-reg-*\` (\`.rb-reg-surface\`, \`.rb-reg-stack\`, ...). All of
11328
+ * them are scoped to the three registration blocks either way.
11224
11329
  * ============================================================================= */
11225
11330
 
11331
+ /* Terminal state icon (layout only \u2014 colors are per-block) */
11226
11332
  :where(.theme-scope) .rb-state-icon {
11227
11333
  width: 4rem;
11228
11334
  height: 4rem;
@@ -11238,6 +11344,273 @@ var containerResponsiveThemeCss = `/*
11238
11344
  height: 2rem;
11239
11345
  }
11240
11346
 
11347
+ /* Surface container */
11348
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
11349
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
11350
+ border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
11351
+ padding: clamp(1rem, 2vw, 1.5rem);
11352
+ background: var(--rb-reg-surface-bg, rgb(var(--tb-surface, 248 250 252)));
11353
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
11354
+ transition: border-color var(--rb-block-transition, 150ms) ease;
11355
+ width: 100%;
11356
+ max-width: 800px;
11357
+ margin-inline: 0;
11358
+ }
11359
+
11360
+ /* Selectable option card */
11361
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card {
11362
+ position: relative;
11363
+ display: flex;
11364
+ align-items: flex-start;
11365
+ gap: 0.75rem;
11366
+ padding: 1rem;
11367
+ border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
11368
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
11369
+ background: var(--rb-reg-option-bg, transparent);
11370
+ color: inherit;
11371
+ cursor: pointer;
11372
+ text-align: left;
11373
+ transition: border-color var(--rb-block-transition, 150ms) ease,
11374
+ background-color var(--rb-block-transition, 150ms) ease,
11375
+ box-shadow var(--rb-block-transition, 150ms) ease;
11376
+ }
11377
+
11378
+ :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"]) {
11379
+ border-color: var(--rb-reg-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
11380
+ box-shadow: var(--rb-reg-option-hover-shadow, 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08));
11381
+ }
11382
+
11383
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
11384
+ outline: 2px solid var(--rb-reg-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
11385
+ outline-offset: 2px;
11386
+ }
11387
+
11388
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
11389
+ border-color: var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
11390
+ background-color: var(--rb-reg-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.08));
11391
+ box-shadow: 0 0 0 1px var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
11392
+ }
11393
+
11394
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled {
11395
+ cursor: not-allowed;
11396
+ opacity: 0.7;
11397
+ }
11398
+
11399
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled:hover {
11400
+ border-color: var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
11401
+ box-shadow: none;
11402
+ }
11403
+
11404
+ /* Check indicator */
11405
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check {
11406
+ flex-shrink: 0;
11407
+ width: 1.25rem;
11408
+ height: 1.25rem;
11409
+ border-radius: 50%;
11410
+ background: var(--rb-reg-check-bg, rgb(var(--tb-primary, 17 24 39)));
11411
+ display: flex;
11412
+ align-items: center;
11413
+ justify-content: center;
11414
+ }
11415
+
11416
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
11417
+ width: 0.75rem;
11418
+ height: 0.75rem;
11419
+ color: var(--rb-reg-check-text, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
11420
+ }
11421
+
11422
+ /* Step indicator */
11423
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
11424
+ margin-bottom: 1.5rem;
11425
+ }
11426
+
11427
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps {
11428
+ display: flex;
11429
+ align-items: center;
11430
+ justify-content: center;
11431
+ gap: 0.5rem;
11432
+ list-style: none;
11433
+ padding: 0;
11434
+ margin: 0;
11435
+ }
11436
+
11437
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step {
11438
+ display: flex;
11439
+ align-items: center;
11440
+ gap: 0.5rem;
11441
+ }
11442
+
11443
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle {
11444
+ width: 1.75rem;
11445
+ height: 1.75rem;
11446
+ border-radius: 50%;
11447
+ display: flex;
11448
+ align-items: center;
11449
+ justify-content: center;
11450
+ font-size: 0.75rem;
11451
+ font-weight: 600;
11452
+ background: var(--rb-reg-step-inactive, rgb(var(--tb-mutedText, 100 116 139)));
11453
+ color: var(--rb-reg-step-text, rgb(var(--tb-primaryForeground, 255 255 255)));
11454
+ transition: background-color var(--rb-block-transition, 150ms) ease;
11455
+ }
11456
+
11457
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
11458
+ background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
11459
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
11460
+ }
11461
+
11462
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
11463
+ background: var(--rb-reg-step-completed, rgb(var(--tb-success, 22 163 74)));
11464
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
11465
+ }
11466
+
11467
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-check {
11468
+ width: 0.75rem;
11469
+ height: 0.75rem;
11470
+ }
11471
+
11472
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-connector {
11473
+ width: 2rem;
11474
+ height: 2px;
11475
+ background: var(--rb-reg-step-connector, rgba(var(--tb-border, 226 232 240), 0.5));
11476
+ }
11477
+
11478
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
11479
+ font-size: 0.75rem;
11480
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
11481
+ display: none;
11482
+ }
11483
+
11484
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
11485
+ font-weight: 500;
11486
+ }
11487
+
11488
+ @container rb-site (min-width: 640px) {
11489
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
11490
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
11491
+ display: inline;
11492
+ }
11493
+ }
11494
+ }
11495
+
11496
+ /* Wizard actions row */
11497
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions {
11498
+ display: flex;
11499
+ justify-content: space-between;
11500
+ align-items: center;
11501
+ gap: 1rem;
11502
+ margin-top: 1.5rem;
11503
+ }
11504
+
11505
+ /* When there's only one action (no back button), push it to the right */
11506
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions > :only-child {
11507
+ margin-inline-start: auto;
11508
+ }
11509
+
11510
+ /* On-surface text ramp */
11511
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface {
11512
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
11513
+ }
11514
+
11515
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
11516
+ color: var(--rb-reg-on-surface-muted, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.7));
11517
+ }
11518
+
11519
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
11520
+ color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
11521
+ }
11522
+
11523
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
11524
+ color: var(--rb-reg-on-surface-faint, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.5));
11525
+ }
11526
+
11527
+ /* Layout stacks */
11528
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack {
11529
+ display: flex;
11530
+ flex-direction: column;
11531
+ gap: 1rem;
11532
+ }
11533
+
11534
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack--sm {
11535
+ gap: 0.75rem;
11536
+ }
11537
+
11538
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row {
11539
+ display: flex;
11540
+ align-items: center;
11541
+ gap: 1rem;
11542
+ }
11543
+
11544
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row--between {
11545
+ justify-content: space-between;
11546
+ align-items: flex-start;
11547
+ }
11548
+
11549
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-grid {
11550
+ display: grid;
11551
+ gap: 0.75rem;
11552
+ }
11553
+
11554
+ /* Summary box */
11555
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-summary {
11556
+ padding: 1rem;
11557
+ border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.75);
11558
+ border: 1px solid var(--rb-reg-summary-border, rgb(var(--tb-border, 226 232 240)));
11559
+ background: var(--rb-reg-summary-bg, rgba(var(--tb-muted, 241 245 249), 0.42));
11560
+ }
11561
+
11562
+ /* Skeleton shell lines */
11563
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line {
11564
+ height: 0.75rem;
11565
+ border-radius: 9999px;
11566
+ background: linear-gradient(
11567
+ 90deg,
11568
+ var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22)),
11569
+ rgba(var(--tb-primary, 17 24 39), 0.12),
11570
+ var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22))
11571
+ );
11572
+ }
11573
+
11574
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--lg {
11575
+ width: min(26rem, 82%);
11576
+ }
11577
+
11578
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--md {
11579
+ width: min(19rem, 68%);
11580
+ }
11581
+
11582
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--sm {
11583
+ width: min(14rem, 52%);
11584
+ }
11585
+
11586
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--xs {
11587
+ width: min(10rem, 42%);
11588
+ }
11589
+
11590
+ /* Skeleton block (rectangular placeholder, pulses) */
11591
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
11592
+ height: 2.5rem;
11593
+ width: 100%;
11594
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
11595
+ background: var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22));
11596
+ animation: rb-reg-pulse 1.5s ease-in-out infinite;
11597
+ }
11598
+
11599
+ @keyframes rb-reg-pulse {
11600
+ 0%, 100% {
11601
+ opacity: 1;
11602
+ }
11603
+ 50% {
11604
+ opacity: 0.5;
11605
+ }
11606
+ }
11607
+
11608
+ @media (prefers-reduced-motion: reduce) {
11609
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
11610
+ animation: none;
11611
+ }
11612
+ }
11613
+
11241
11614
  /* =============================================================================
11242
11615
  * Block: Event Registration (pilot #76)
11243
11616
  * Uses CSS vars: --er-* (Tier 3) and --rb-block-* (Tier 2)
@@ -11261,18 +11634,9 @@ var containerResponsiveThemeCss = `/*
11261
11634
  --er-on-surface-disabled-detail: rgba(var(--tb-onSurface, var(--tb-text)), 0.68);
11262
11635
  }
11263
11636
 
11264
- /* Container */
11265
- :where(.theme-scope) :where([data-block="event-registration"]) .er-container {
11266
- border-radius: var(--rb-block-radius);
11267
- border: 1px solid var(--er-border);
11268
- padding: clamp(1rem, 2vw, 1.5rem);
11269
- background: rgb(var(--tb-surface));
11270
- color: var(--er-on-surface);
11271
- transition: border-color var(--rb-block-transition) ease;
11272
- width: 100%;
11273
- max-width: 800px;
11274
- margin-inline: 0;
11275
- }
11637
+ /* Container: styled by the shared .rb-reg-surface (registration-surface.css);
11638
+ .er-container remains in markup as a hook and for the overlay/embedded
11639
+ variants below. */
11276
11640
 
11277
11641
  /* SSR shell / required-island fallback */
11278
11642
  :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
@@ -11317,32 +11681,8 @@ var containerResponsiveThemeCss = `/*
11317
11681
  padding: 1rem;
11318
11682
  }
11319
11683
 
11320
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line {
11321
- height: 0.75rem;
11322
- border-radius: 9999px;
11323
- background: linear-gradient(
11324
- 90deg,
11325
- var(--er-shell-line),
11326
- rgba(var(--tb-primary), 0.12),
11327
- var(--er-shell-line)
11328
- );
11329
- }
11330
-
11331
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--lg {
11332
- width: min(26rem, 82%);
11333
- }
11334
-
11335
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--md {
11336
- width: min(19rem, 68%);
11337
- }
11338
-
11339
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--sm {
11340
- width: min(14rem, 52%);
11341
- }
11342
-
11343
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--xs {
11344
- width: min(10rem, 42%);
11345
- }
11684
+ /* Shell skeleton lines: styled by the shared .rb-shell-line family
11685
+ (registration-surface.css); legacy classes remain in markup as hooks. */
11346
11686
 
11347
11687
  :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__summary {
11348
11688
  align-items: center;
@@ -11419,13 +11759,8 @@ var containerResponsiveThemeCss = `/*
11419
11759
  color: var(--er-capacity-soldout-text);
11420
11760
  }
11421
11761
 
11422
- /* Selected event summary */
11423
- :where(.theme-scope) :where([data-block="event-registration"]) .er-event-summary {
11424
- padding: 1rem;
11425
- border-radius: calc(var(--rb-block-radius) * 0.75);
11426
- border: 1px solid var(--er-border);
11427
- background: var(--er-surface-muted);
11428
- }
11762
+ /* Selected event summary: superseded by the shared .rb-reg-summary
11763
+ (registration-surface.css); no markup emitted .er-event-summary anymore. */
11429
11764
 
11430
11765
  /* Ticket counter */
11431
11766
  :where(.theme-scope) :where([data-block="event-registration"]) .er-ticket-counter-group {
@@ -11631,7 +11966,7 @@ var containerResponsiveThemeCss = `/*
11631
11966
  opacity: 1;
11632
11967
  }
11633
11968
 
11634
- /* State icon color variants (layout from registration-shared.css) */
11969
+ /* State icon color variants (layout from registration-surface.css) */
11635
11970
  :where(.theme-scope) :where([data-block="event-registration"]) .rb-state-icon--success {
11636
11971
  background: var(--er-success-bg);
11637
11972
  color: var(--er-success-text);
@@ -11787,16 +12122,8 @@ var containerResponsiveThemeCss = `/*
11787
12122
  text-align: center;
11788
12123
  }
11789
12124
 
11790
- /* Layout */
11791
- :where(.theme-scope) :where([data-block="event-registration"]) .er-stack {
11792
- display: flex;
11793
- flex-direction: column;
11794
- gap: 1rem;
11795
- }
11796
-
11797
- :where(.theme-scope) :where([data-block="event-registration"]) .er-stack--sm {
11798
- gap: 0.75rem;
11799
- }
12125
+ /* Layout stacks/rows: styled by the shared .rb-reg-stack / .rb-reg-row
12126
+ (registration-surface.css); legacy classes remain in markup as hooks. */
11800
12127
 
11801
12128
  /* Event/date selection rows */
11802
12129
  :where(.theme-scope) :where([data-block="event-registration"]) .er-event-grid {
@@ -11805,17 +12132,6 @@ var containerResponsiveThemeCss = `/*
11805
12132
  gap: 0;
11806
12133
  }
11807
12134
 
11808
- :where(.theme-scope) :where([data-block="event-registration"]) .er-row {
11809
- display: flex;
11810
- align-items: center;
11811
- gap: 1rem;
11812
- }
11813
-
11814
- :where(.theme-scope) :where([data-block="event-registration"]) .er-row--between {
11815
- justify-content: space-between;
11816
- align-items: flex-start;
11817
- }
11818
-
11819
12135
  :where(.theme-scope) :where([data-block="event-registration"]) .er-center {
11820
12136
  text-align: center;
11821
12137
  padding: 2rem;
@@ -11827,18 +12143,8 @@ var containerResponsiveThemeCss = `/*
11827
12143
  margin-bottom: 1rem;
11828
12144
  }
11829
12145
 
11830
- :where(.theme-scope) :where([data-block="event-registration"]) .er-actions {
11831
- display: flex;
11832
- justify-content: space-between;
11833
- align-items: center;
11834
- gap: 1rem;
11835
- margin-top: 1.5rem;
11836
- }
11837
-
11838
- /* When there's only one button (no back), push to the right */
11839
- :where(.theme-scope) :where([data-block="event-registration"]) .er-actions > :only-child {
11840
- margin-inline-start: auto;
11841
- }
12146
+ /* Actions row: styled by the shared .rb-wizard-actions (registration-surface.css);
12147
+ .er-actions remains in markup as a hook. */
11842
12148
 
11843
12149
  :where(.theme-scope) :where([data-block="event-registration"]) .er-button-with-spinner {
11844
12150
  display: inline-flex;
@@ -12090,23 +12396,8 @@ var containerResponsiveThemeCss = `/*
12090
12396
  color: var(--er-on-surface-faint);
12091
12397
  }
12092
12398
 
12093
- /* Checkmark indicator */
12094
- :where(.theme-scope) :where([data-block="event-registration"]) .er-check {
12095
- flex-shrink: 0;
12096
- width: 1.25rem;
12097
- height: 1.25rem;
12098
- border-radius: 50%;
12099
- background: var(--er-check-bg);
12100
- display: flex;
12101
- align-items: center;
12102
- justify-content: center;
12103
- }
12104
-
12105
- :where(.theme-scope) :where([data-block="event-registration"]) .er-check svg {
12106
- width: 0.75rem;
12107
- height: 0.75rem;
12108
- color: var(--er-check-text);
12109
- }
12399
+ /* Checkmark indicator: styled by the shared .rb-option-check
12400
+ (registration-surface.css); .er-check remains in markup as a hook. */
12110
12401
 
12111
12402
  /* Payment summary */
12112
12403
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-summary {
@@ -12154,78 +12445,12 @@ var containerResponsiveThemeCss = `/*
12154
12445
  margin-bottom: 1.5rem;
12155
12446
  }
12156
12447
 
12157
- :where(.theme-scope) :where([data-block="event-registration"]) .er-steps {
12158
- display: flex;
12159
- align-items: center;
12160
- justify-content: center;
12161
- gap: 0.5rem;
12162
- list-style: none;
12163
- padding: 0;
12164
- margin: 0;
12165
- }
12166
-
12167
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step {
12168
- display: flex;
12169
- align-items: center;
12170
- gap: 0.5rem;
12171
- }
12172
-
12173
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle {
12174
- width: 1.75rem;
12175
- height: 1.75rem;
12176
- border-radius: 50%;
12177
- display: flex;
12178
- align-items: center;
12179
- justify-content: center;
12180
- font-size: 0.75rem;
12181
- font-weight: 600;
12182
- background: var(--er-step-inactive);
12183
- color: var(--er-step-text);
12184
- transition: background-color var(--rb-block-transition) ease;
12185
- }
12186
-
12187
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle--active {
12188
- background: var(--er-step-active);
12189
- color: var(--er-step-text-active);
12190
- }
12191
-
12192
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle--completed {
12193
- background: var(--er-step-completed);
12194
- color: var(--er-step-text-active);
12195
- }
12196
-
12197
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-check {
12198
- width: 0.75rem;
12199
- height: 0.75rem;
12200
- }
12201
-
12202
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-connector {
12203
- width: 2rem;
12204
- height: 2px;
12205
- background: var(--er-step-connector);
12206
- }
12207
-
12208
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-connector--completed {
12209
- background: var(--er-step-connector);
12210
- }
12211
-
12212
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label {
12213
- font-size: 0.75rem;
12214
- color: var(--er-on-surface);
12215
- display: none;
12216
- }
12217
-
12218
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label--active {
12219
- font-weight: 500;
12220
- }
12221
-
12222
- @container rb-site (min-width: 640px) {
12223
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
12224
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label {
12225
- display: inline;
12226
- }
12227
- }
12228
- }
12448
+ /* Step indicator internals: styled by the shared .rb-steps / .rb-step-*
12449
+ family (registration-surface.css) via the --rb-reg-step-* mappings in the
12450
+ event-registration var generator; er-* classes remain in markup as hooks.
12451
+ Note: .er-steps-nav above is intentionally retained \u2014 its source position
12452
+ keeps the wizard's 1.5rem step margin winning over the SSR shell's
12453
+ 1.25rem .er-registration-shell__steps override. */
12229
12454
 
12230
12455
  /* Sticky order summary */
12231
12456
  :where(.theme-scope) :where([data-block="event-registration"]) .er-summary {
@@ -14458,69 +14683,34 @@ var containerResponsiveThemeCss = `/*
14458
14683
 
14459
14684
  /* =============================================================================
14460
14685
  * Block: Appointment Booking
14686
+ *
14687
+ * Structural styling comes from the shared registration-surface layer
14688
+ * (registration-surface.css): surface container, option cards + check,
14689
+ * step indicator, wizard actions, on-surface text ramp, stacks, summary box
14690
+ * and skeleton shell. Colors flow through the --rb-reg-* contract, mapped
14691
+ * from this block's --ab-* Tier 3 vars by its var generator.
14692
+ *
14693
+ * Inputs use the theme-generated form-* classes; feedback boxes use the
14694
+ * theme-generated alert / alert-{tone} classes. Only genuinely
14695
+ * booking-specific rules live here.
14696
+ *
14461
14697
  * Uses:
14462
- * - Tier 1 vars: --tb-border, --tb-text, --tb-primary (from theme palette)
14463
- * - Tier 2 vars: --rb-block-radius, --rb-block-transition (from theme scope)
14698
+ * - Tier 1 vars: --tb-* (from theme palette)
14464
14699
  * - Tier 3 vars: --ab-* (from appointment-booking var generator)
14465
14700
  * =============================================================================
14466
14701
  */
14467
14702
 
14468
- /* Main container */
14469
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-container {
14470
- width: 100%;
14471
- }
14472
-
14473
- /* Stack layout utilities */
14474
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack {
14475
- display: flex;
14476
- flex-direction: column;
14477
- gap: 1.5rem;
14478
- }
14479
-
14480
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack--sm {
14481
- display: flex;
14482
- flex-direction: column;
14483
- gap: 0.75rem;
14484
- }
14485
-
14486
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack--xs {
14487
- display: flex;
14488
- flex-direction: column;
14489
- gap: 0.5rem;
14490
- }
14491
-
14492
- /* Row layout */
14493
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-row {
14494
- display: flex;
14495
- align-items: center;
14496
- gap: 0.75rem;
14497
- }
14498
-
14499
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-row--between {
14500
- justify-content: space-between;
14501
- }
14502
-
14503
- /* Grid layout */
14504
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-grid {
14505
- display: grid;
14506
- gap: 0.75rem;
14507
- }
14508
-
14509
- /* Center layout */
14510
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-center {
14511
- text-align: center;
14512
- padding: 2rem;
14513
- }
14514
-
14515
- /* Typography */
14703
+ /* Typography helpers */
14516
14704
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-title {
14517
14705
  font-size: 1.5rem;
14518
- font-weight: 700;
14706
+ font-weight: 600;
14707
+ line-height: 1.3;
14519
14708
  }
14520
14709
 
14521
14710
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-subtitle {
14522
- font-size: 0.875rem;
14523
- font-weight: 500;
14711
+ font-size: 0.9375rem;
14712
+ font-weight: 600;
14713
+ line-height: 1.3;
14524
14714
  }
14525
14715
 
14526
14716
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text {
@@ -14531,211 +14721,111 @@ var containerResponsiveThemeCss = `/*
14531
14721
  font-size: 0.75rem;
14532
14722
  }
14533
14723
 
14534
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--muted {
14535
- opacity: var(--ab-text-muted-opacity, 0.6);
14536
- }
14537
-
14538
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--faint {
14539
- opacity: var(--ab-text-faint-opacity, 0.4);
14540
- }
14541
-
14542
- /* Selection cards (service, resource, time slot) */
14543
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card {
14544
- position: relative;
14545
- padding: 1rem;
14546
- border: 2px solid var(--ab-card-border, rgb(var(--tb-border, 226 232 240)));
14547
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
14548
- text-align: left;
14549
- background: transparent;
14550
- cursor: pointer;
14551
- transition: border-color var(--rb-block-transition, 150ms) ease, background-color var(--rb-block-transition, 150ms) ease;
14552
- }
14553
-
14554
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card:hover {
14555
- border-color: var(--ab-card-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
14556
- }
14557
-
14558
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card--selected {
14559
- border-color: var(--ab-card-border-selected, rgb(var(--tb-primary, 17 24 39)));
14560
- background-color: var(--ab-card-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.05));
14561
- }
14562
-
14563
- /* Checkmark indicator */
14564
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-check {
14565
- flex-shrink: 0;
14566
- width: 1.25rem;
14567
- height: 1.25rem;
14568
- border-radius: 50%;
14569
- background-color: var(--ab-check-bg, rgb(var(--tb-primary, 17 24 39)));
14570
- display: flex;
14571
- align-items: center;
14572
- justify-content: center;
14573
- }
14574
-
14575
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-check svg {
14576
- width: 0.75rem;
14577
- height: 0.75rem;
14578
- color: var(--ab-check-text, rgb(var(--tb-background, 255 255 255)));
14579
- }
14580
-
14581
- /* Info box (service summary) */
14582
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-info-box {
14583
- padding: 1rem;
14584
- border: 1px solid var(--ab-card-border, rgb(var(--tb-border, 226 232 240)));
14585
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
14586
- background-color: var(--ab-muted-bg, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
14724
+ /* Centered state (loading / terminal panels) */
14725
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-center {
14726
+ text-align: center;
14727
+ padding: 2rem;
14587
14728
  }
14588
14729
 
14589
- /* Alert states */
14590
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert {
14591
- padding: 0.75rem 1rem;
14592
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
14593
- font-size: 0.875rem;
14730
+ /* Terminal state title (below the state icon) */
14731
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-terminal-title {
14732
+ margin: 0.75rem 0 0.5rem 0;
14733
+ font-size: 1.125rem;
14734
+ font-weight: 700;
14594
14735
  }
14595
14736
 
14596
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--success {
14597
- background-color: var(--ab-success-bg, rgba(var(--tb-success, 22 163 74), 0.1));
14737
+ /* State icon color variants (layout from registration-surface.css) */
14738
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--success {
14739
+ background: var(--ab-success-bg, rgba(var(--tb-success, 22 163 74), 0.1));
14598
14740
  color: var(--ab-success-text, rgb(var(--tb-success, 22 163 74)));
14599
14741
  }
14600
14742
 
14601
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--error {
14602
- background-color: var(--ab-error-bg, rgba(var(--tb-destructive, 220 38 38), 0.1));
14743
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--error {
14744
+ background: var(--ab-error-bg, rgba(var(--tb-destructive, 220 38 38), 0.1));
14603
14745
  color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
14604
14746
  }
14605
14747
 
14606
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--warning {
14607
- background-color: var(--ab-warning-bg, rgba(var(--tb-warning, 245 158 11), 0.1));
14608
- color: var(--ab-warning-text, rgb(var(--tb-warning, 245 158 11)));
14609
- }
14610
-
14611
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--info {
14612
- background-color: var(--ab-info-bg, rgba(var(--tb-info, 14 165 233), 0.1));
14748
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--info {
14749
+ background: var(--ab-info-bg, rgba(var(--tb-info, 14 165 233), 0.1));
14613
14750
  color: var(--ab-info-text, rgb(var(--tb-info, 14 165 233)));
14614
14751
  }
14615
14752
 
14616
- /* Form elements */
14617
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-label {
14618
- display: block;
14619
- font-size: 0.875rem;
14620
- font-weight: 500;
14621
- margin-bottom: 0.5rem;
14753
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--warning {
14754
+ background: var(--ab-warning-bg, rgba(var(--tb-warning, 245 158 11), 0.1));
14755
+ color: var(--ab-warning-text, rgb(var(--tb-warning, 245 158 11)));
14622
14756
  }
14623
14757
 
14624
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-required {
14625
- color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
14626
- margin-left: 0.125rem;
14758
+ /* Payment option summary rows (label/value lines inside an option card) */
14759
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-option-rows {
14760
+ display: grid;
14761
+ gap: 0.125rem;
14627
14762
  }
14628
14763
 
14629
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-input,
14630
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-select,
14631
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-textarea {
14632
- width: 100%;
14633
- padding: 0.5rem 0.75rem;
14634
- border: 1px solid var(--ab-input-border, rgb(var(--tb-border, 226 232 240)));
14635
- border-radius: var(--ab-input-radius, var(--rb-input-radius, var(--radius-control, var(--rb-block-radius, 1rem))));
14636
- background: transparent;
14637
- font-size: 0.875rem;
14638
- transition: border-color var(--rb-block-transition, 150ms) ease, box-shadow var(--rb-block-transition, 150ms) ease;
14764
+ /* Date/time pill grids (selection pills extend .rb-option-card) */
14765
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-grid {
14766
+ display: flex;
14767
+ flex-wrap: wrap;
14768
+ gap: 0.5rem;
14639
14769
  }
14640
14770
 
14641
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-input:focus,
14642
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-select:focus,
14643
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-textarea:focus {
14644
- outline: none;
14645
- border-color: var(--ab-card-border-selected, rgb(var(--tb-primary, 17 24 39)));
14646
- box-shadow: 0 0 0 3px var(--ab-input-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
14771
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-date-pill {
14772
+ flex-direction: column;
14773
+ align-items: center;
14774
+ gap: 0.125rem;
14775
+ padding: 0.5rem 0.875rem;
14776
+ min-width: 4.25rem;
14777
+ text-align: center;
14647
14778
  }
14648
14779
 
14649
- /* Buttons */
14650
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn {
14651
- display: inline-flex;
14780
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-time-pill {
14652
14781
  align-items: center;
14653
14782
  justify-content: center;
14654
- padding: 0.5rem 1.5rem;
14655
- border-radius: var(--ab-button-radius, var(--rb-button-radius, var(--rb-block-radius, 1rem)));
14783
+ padding: 0.5rem 0.875rem;
14784
+ min-width: 5.5rem;
14656
14785
  font-size: 0.875rem;
14657
14786
  font-weight: 500;
14658
- cursor: pointer;
14659
- transition: background-color var(--rb-block-transition, 150ms) ease, border-color var(--rb-block-transition, 150ms) ease;
14660
- }
14661
-
14662
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--primary {
14663
- flex: 1;
14664
- background-color: var(--ab-btn-primary-bg, rgb(var(--tb-primary, 17 24 39)));
14665
- color: var(--ab-btn-primary-text, rgb(var(--tb-primaryForeground, 255 255 255)));
14666
- border: none;
14667
- }
14668
-
14669
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--primary:hover:not(:disabled) {
14670
- background-color: var(--ab-btn-primary-hover, rgba(var(--tb-primary, 17 24 39), 0.9));
14671
- }
14672
-
14673
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--secondary {
14674
- background: transparent;
14675
- border: 1px solid var(--ab-btn-secondary-border, rgb(var(--tb-border, 226 232 240)));
14676
- }
14677
-
14678
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--secondary:hover:not(:disabled) {
14679
- background-color: var(--ab-btn-secondary-hover, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
14680
- }
14681
-
14682
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--link {
14683
- background: transparent;
14684
- border: none;
14685
- padding: 0;
14686
- text-decoration: underline;
14687
- }
14688
-
14689
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--link:hover {
14690
- text-decoration: none;
14691
- }
14692
-
14693
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn:disabled {
14694
- opacity: 0.5;
14695
- cursor: not-allowed;
14696
- }
14697
-
14698
- /* Actions row */
14699
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-actions {
14700
- display: flex;
14701
- gap: 0.75rem;
14702
- margin-top: 1.5rem;
14787
+ text-align: center;
14703
14788
  }
14704
14789
 
14705
- /* Skeleton loading */
14706
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-skeleton {
14707
- height: 2.5rem;
14708
- width: 100%;
14709
- background-color: var(--ab-muted-bg, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
14710
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
14711
- animation: ab-pulse 1.5s ease-in-out infinite;
14790
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-caption {
14791
+ font-size: 0.6875rem;
14792
+ font-weight: 600;
14793
+ letter-spacing: 0;
14794
+ line-height: 1.2;
14795
+ text-transform: uppercase;
14796
+ color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
14712
14797
  }
14713
14798
 
14714
- @keyframes ab-pulse {
14715
- 0%, 100% {
14716
- opacity: 1;
14717
- }
14718
- 50% {
14719
- opacity: 0.5;
14720
- }
14799
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-value {
14800
+ font-size: 1.125rem;
14801
+ font-weight: 600;
14802
+ line-height: 1.2;
14721
14803
  }
14722
14804
 
14723
- /* Field wrapper */
14724
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-field {
14725
- display: flex;
14726
- flex-direction: column;
14727
- gap: 0.5rem;
14805
+ /* SSR shell skeleton (mirrors the hydrated layout to reduce hydration jump) */
14806
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-shell {
14807
+ min-height: 18rem;
14728
14808
  }
14729
14809
 
14730
- /* Altcha wrapper */
14731
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-altcha {
14732
- margin-top: 1rem;
14810
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-shell-button {
14811
+ display: inline-flex;
14812
+ min-height: 2.5rem;
14813
+ align-items: center;
14814
+ justify-content: center;
14815
+ border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.6);
14816
+ background: rgb(var(--tb-primary, 17 24 39));
14817
+ color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
14818
+ padding: 0.625rem 1rem;
14819
+ font-size: 0.875rem;
14820
+ font-weight: 600;
14821
+ line-height: 1.2;
14822
+ text-align: center;
14823
+ white-space: nowrap;
14733
14824
  }
14734
14825
 
14735
- /* Link button (inline text link) */
14826
+ /* Inline text-link button (e.g. "Load more dates") */
14736
14827
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-link {
14737
14828
  display: inline;
14738
- margin-left: 0.5rem;
14739
14829
  color: rgb(var(--tb-primary, 17 24 39));
14740
14830
  background: none;
14741
14831
  border: none;
@@ -14749,91 +14839,9 @@ var containerResponsiveThemeCss = `/*
14749
14839
  text-decoration: none;
14750
14840
  }
14751
14841
 
14752
- /* =============================================================================
14753
- * Form Block (fb-*)
14754
- *
14755
- * Uses:
14756
- * - Tier 1 vars: --tb-border, --tb-surface, --tb-success, --tb-destructive
14757
- * - Tier 2 vars: --rb-block-radius
14758
- * - Tier 3 vars: --fb-success-*, --fb-error-*, --fb-empty-*
14759
- *
14760
- * Note: Form input styling (form-input, form-select, etc.) is handled by
14761
- * the input CSS generator. These styles are for form container/state only.
14762
- * ============================================================================= */
14763
-
14764
- /* Form container */
14765
- :where(.theme-scope) :where([data-block="form"]) .fb-form {
14766
- display: flex;
14767
- flex-direction: column;
14768
- gap: 1rem;
14769
- }
14770
-
14771
- /* Two-column row (opt-in per field via schema layout) */
14772
- :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
14773
- display: grid;
14774
- grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
14775
- gap: 1rem;
14776
- }
14777
-
14778
- /* Field wrapper */
14779
- :where(.theme-scope) :where([data-block="form"]) .fb-field {
14780
- display: flex;
14781
- flex-direction: column;
14782
- gap: 0.25rem;
14783
- }
14784
-
14785
- /* Fieldset (for radio groups) */
14786
- :where(.theme-scope) :where([data-block="form"]) .fb-fieldset {
14787
- display: flex;
14788
- flex-direction: column;
14789
- gap: 0.5rem;
14790
- border: none;
14791
- padding: 0;
14792
- margin: 0;
14793
- }
14794
-
14795
- /* Inline field (checkbox, radio with label) */
14796
- :where(.theme-scope) :where([data-block="form"]) .fb-inline {
14797
- display: flex;
14798
- align-items: center;
14799
- gap: 0.5rem;
14800
- }
14801
-
14802
- /* Success state */
14803
- :where(.theme-scope) :where([data-block="form"]) .fb-success {
14804
- background-color: var(--fb-success-bg);
14805
- color: var(--fb-success-text);
14806
- border: 1px solid var(--fb-success-border);
14807
- border-radius: var(--rb-block-radius);
14808
- padding: 1rem;
14809
- font-size: 0.875rem;
14810
- }
14811
-
14812
- /* Error banner */
14813
- :where(.theme-scope) :where([data-block="form"]) .fb-error {
14814
- background-color: var(--fb-error-bg);
14815
- color: var(--fb-error-text);
14816
- border: 1px solid var(--fb-error-border);
14817
- border-radius: var(--rb-block-radius);
14818
- padding: 0.75rem;
14819
- font-size: 0.875rem;
14820
- margin-bottom: 0.5rem;
14821
- }
14822
-
14823
- /* Empty state (no form data) */
14824
- :where(.theme-scope) :where([data-block="form"]) .fb-empty {
14825
- background-color: var(--fb-empty-bg);
14826
- color: var(--fb-empty-text);
14827
- border: 1px dashed var(--fb-empty-border);
14828
- border-radius: var(--rb-block-radius);
14829
- padding: 1.5rem;
14830
- font-size: 0.875rem;
14831
- text-align: center;
14832
- }
14833
-
14834
- /* Form actions (submit button container) */
14835
- :where(.theme-scope) :where([data-block="form"]) .fb-actions {
14836
- margin-top: 0.5rem;
14842
+ /* Altcha wrapper */
14843
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-altcha {
14844
+ margin-top: 1rem;
14837
14845
  }
14838
14846
 
14839
14847
  /* =============================================================================
@@ -15091,6 +15099,93 @@ var containerResponsiveThemeCss = `/*
15091
15099
  color: var(--section-text-color, rgb(var(--tb-text)));
15092
15100
  }
15093
15101
 
15102
+ /* =============================================================================
15103
+ * Form Block (fb-*)
15104
+ *
15105
+ * Uses:
15106
+ * - Tier 1 vars: --tb-border, --tb-surface, --tb-success, --tb-destructive
15107
+ * - Tier 2 vars: --rb-block-radius
15108
+ * - Tier 3 vars: --fb-success-*, --fb-error-*, --fb-empty-*
15109
+ *
15110
+ * Note: Form input styling (form-input, form-select, etc.) is handled by
15111
+ * the input CSS generator. These styles are for form container/state only.
15112
+ * ============================================================================= */
15113
+
15114
+ /* Form container */
15115
+ :where(.theme-scope) :where([data-block="form"]) .fb-form {
15116
+ display: flex;
15117
+ flex-direction: column;
15118
+ gap: 1rem;
15119
+ }
15120
+
15121
+ /* Two-column row (opt-in per field via schema layout) */
15122
+ :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
15123
+ display: grid;
15124
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
15125
+ gap: 1rem;
15126
+ }
15127
+
15128
+ /* Field wrapper */
15129
+ :where(.theme-scope) :where([data-block="form"]) .fb-field {
15130
+ display: flex;
15131
+ flex-direction: column;
15132
+ gap: 0.25rem;
15133
+ }
15134
+
15135
+ /* Fieldset (for radio groups) */
15136
+ :where(.theme-scope) :where([data-block="form"]) .fb-fieldset {
15137
+ display: flex;
15138
+ flex-direction: column;
15139
+ gap: 0.5rem;
15140
+ border: none;
15141
+ padding: 0;
15142
+ margin: 0;
15143
+ }
15144
+
15145
+ /* Inline field (checkbox, radio with label) */
15146
+ :where(.theme-scope) :where([data-block="form"]) .fb-inline {
15147
+ display: flex;
15148
+ align-items: center;
15149
+ gap: 0.5rem;
15150
+ }
15151
+
15152
+ /* Success state */
15153
+ :where(.theme-scope) :where([data-block="form"]) .fb-success {
15154
+ background-color: var(--fb-success-bg);
15155
+ color: var(--fb-success-text);
15156
+ border: 1px solid var(--fb-success-border);
15157
+ border-radius: var(--rb-block-radius);
15158
+ padding: 1rem;
15159
+ font-size: 0.875rem;
15160
+ }
15161
+
15162
+ /* Error banner */
15163
+ :where(.theme-scope) :where([data-block="form"]) .fb-error {
15164
+ background-color: var(--fb-error-bg);
15165
+ color: var(--fb-error-text);
15166
+ border: 1px solid var(--fb-error-border);
15167
+ border-radius: var(--rb-block-radius);
15168
+ padding: 0.75rem;
15169
+ font-size: 0.875rem;
15170
+ margin-bottom: 0.5rem;
15171
+ }
15172
+
15173
+ /* Empty state (no form data) */
15174
+ :where(.theme-scope) :where([data-block="form"]) .fb-empty {
15175
+ background-color: var(--fb-empty-bg);
15176
+ color: var(--fb-empty-text);
15177
+ border: 1px dashed var(--fb-empty-border);
15178
+ border-radius: var(--rb-block-radius);
15179
+ padding: 1.5rem;
15180
+ font-size: 0.875rem;
15181
+ text-align: center;
15182
+ }
15183
+
15184
+ /* Form actions (submit button container) */
15185
+ :where(.theme-scope) :where([data-block="form"]) .fb-actions {
15186
+ margin-top: 0.5rem;
15187
+ }
15188
+
15094
15189
  /* =============================================================================
15095
15190
  * Block-Level Override Utilities
15096
15191
  *
@@ -16707,14 +16802,11 @@ var containerResponsiveThemeCss = `/*
16707
16802
  --cr-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
16708
16803
  }
16709
16804
 
16710
- /* Container */
16805
+ /* Container: base styling comes from the shared .rb-reg-surface
16806
+ (registration-surface.css); these overrides preserve course
16807
+ registration's pre-extraction look (fixed padding, centered). */
16711
16808
  :where(.theme-scope) :where([data-block="course-registration"]) .cr-container {
16712
- border-radius: var(--rb-block-radius);
16713
- border: 1px solid var(--cr-border);
16714
16809
  padding: 1.5rem;
16715
- background: rgb(var(--tb-surface));
16716
- color: var(--cr-on-surface);
16717
- max-width: 50rem; /* 800px */
16718
16810
  margin-inline: auto;
16719
16811
  }
16720
16812
 
@@ -17391,7 +17483,7 @@ var containerResponsiveThemeCss = `/*
17391
17483
  padding: 2rem 1rem;
17392
17484
  }
17393
17485
 
17394
- /* State icon color variants (layout from registration-shared.css) */
17486
+ /* State icon color variants (layout from registration-surface.css) */
17395
17487
  :where(.theme-scope) :where([data-block="course-registration"]) .rb-state-icon--success {
17396
17488
  background: var(--cr-success-bg);
17397
17489
  color: var(--cr-success-text);