@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
@@ -3208,13 +3208,36 @@
3208
3208
 
3209
3209
 
3210
3210
  /* =============================================================================
3211
- * Shared: Registration Terminal State Icons
3212
- * Used by event-registration and course-registration blocks.
3211
+ * Shared: Registration Surface (issue 1174)
3213
3212
  *
3214
- * Layout rules only — block-specific colors are defined in each block's CSS
3215
- * via scoped `.rb-state-icon--{variant}` rules.
3213
+ * Wizard-surface primitives shared by the event-registration,
3214
+ * course-registration and appointment-booking blocks: surface container,
3215
+ * selectable option cards, step indicator, wizard actions row, on-surface
3216
+ * text ramp, layout stacks, summary box and skeleton shell lines.
3217
+ *
3218
+ * Uses:
3219
+ * - Tier 1 vars: --tb-* (from theme palette) as inline fallbacks
3220
+ * - Tier 2 vars: --rb-block-radius, --rb-block-transition (from theme scope)
3221
+ * - Shared vars: --rb-reg-* (mapped per block by the Tier 3 var generators;
3222
+ * canonical name list in blocks/registrationSurfaceVars.ts)
3223
+ *
3224
+ * Defaults intentionally match the event-registration (issue 1089) values; blocks
3225
+ * that need to preserve a different look override in their own block CSS,
3226
+ * which is imported after this file (cascade order is the override contract —
3227
+ * all selectors here are zero-specificity `:where()`).
3228
+ *
3229
+ * Layout-only `.rb-state-icon` rules (formerly registration-shared.css) live
3230
+ * here too; block CSS provides the `.rb-state-icon--{variant}` colors.
3231
+ *
3232
+ * Naming: component-like primitives follow the existing bare `rb-` shared
3233
+ * precedent (`.rb-state-icon`, `.rb-tile`): `.rb-option-card`, `.rb-step-*`,
3234
+ * `.rb-wizard-actions`, `.rb-on-surface`, `.rb-shell-*`. Container/layout
3235
+ * pieces that would otherwise collide with the global `.rb-*` utility layer
3236
+ * are namespaced `rb-reg-*` (`.rb-reg-surface`, `.rb-reg-stack`, ...). All of
3237
+ * them are scoped to the three registration blocks either way.
3216
3238
  * ============================================================================= */
3217
3239
 
3240
+ /* Terminal state icon (layout only — colors are per-block) */
3218
3241
  :where(.theme-scope) .rb-state-icon {
3219
3242
  width: 4rem;
3220
3243
  height: 4rem;
@@ -3230,6 +3253,271 @@
3230
3253
  height: 2rem;
3231
3254
  }
3232
3255
 
3256
+ /* Surface container */
3257
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
3258
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
3259
+ border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
3260
+ padding: clamp(1rem, 2vw, 1.5rem);
3261
+ background: var(--rb-reg-surface-bg, rgb(var(--tb-surface, 248 250 252)));
3262
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
3263
+ transition: border-color var(--rb-block-transition, 150ms) ease;
3264
+ width: 100%;
3265
+ max-width: 800px;
3266
+ margin-inline: 0;
3267
+ }
3268
+
3269
+ /* Selectable option card */
3270
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card {
3271
+ position: relative;
3272
+ display: flex;
3273
+ align-items: flex-start;
3274
+ gap: 0.75rem;
3275
+ padding: 1rem;
3276
+ border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
3277
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
3278
+ background: var(--rb-reg-option-bg, transparent);
3279
+ color: inherit;
3280
+ cursor: pointer;
3281
+ text-align: left;
3282
+ transition: border-color var(--rb-block-transition, 150ms) ease,
3283
+ background-color var(--rb-block-transition, 150ms) ease,
3284
+ box-shadow var(--rb-block-transition, 150ms) ease;
3285
+ }
3286
+
3287
+ :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"]) {
3288
+ border-color: var(--rb-reg-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
3289
+ box-shadow: var(--rb-reg-option-hover-shadow, 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08));
3290
+ }
3291
+
3292
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
3293
+ outline: 2px solid var(--rb-reg-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
3294
+ outline-offset: 2px;
3295
+ }
3296
+
3297
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
3298
+ border-color: var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
3299
+ background-color: var(--rb-reg-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.08));
3300
+ box-shadow: 0 0 0 1px var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
3301
+ }
3302
+
3303
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled {
3304
+ cursor: not-allowed;
3305
+ opacity: 0.7;
3306
+ }
3307
+
3308
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled:hover {
3309
+ border-color: var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
3310
+ box-shadow: none;
3311
+ }
3312
+
3313
+ /* Check indicator */
3314
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check {
3315
+ flex-shrink: 0;
3316
+ width: 1.25rem;
3317
+ height: 1.25rem;
3318
+ border-radius: 50%;
3319
+ background: var(--rb-reg-check-bg, rgb(var(--tb-primary, 17 24 39)));
3320
+ display: flex;
3321
+ align-items: center;
3322
+ justify-content: center;
3323
+ }
3324
+
3325
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
3326
+ width: 0.75rem;
3327
+ height: 0.75rem;
3328
+ color: var(--rb-reg-check-text, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
3329
+ }
3330
+
3331
+ /* Step indicator */
3332
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
3333
+ margin-bottom: 1.5rem;
3334
+ }
3335
+
3336
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps {
3337
+ display: flex;
3338
+ align-items: center;
3339
+ justify-content: center;
3340
+ gap: 0.5rem;
3341
+ list-style: none;
3342
+ padding: 0;
3343
+ margin: 0;
3344
+ }
3345
+
3346
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step {
3347
+ display: flex;
3348
+ align-items: center;
3349
+ gap: 0.5rem;
3350
+ }
3351
+
3352
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle {
3353
+ width: 1.75rem;
3354
+ height: 1.75rem;
3355
+ border-radius: 50%;
3356
+ display: flex;
3357
+ align-items: center;
3358
+ justify-content: center;
3359
+ font-size: 0.75rem;
3360
+ font-weight: 600;
3361
+ background: var(--rb-reg-step-inactive, rgb(var(--tb-mutedText, 100 116 139)));
3362
+ color: var(--rb-reg-step-text, rgb(var(--tb-primaryForeground, 255 255 255)));
3363
+ transition: background-color var(--rb-block-transition, 150ms) ease;
3364
+ }
3365
+
3366
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
3367
+ background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
3368
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
3369
+ }
3370
+
3371
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
3372
+ background: var(--rb-reg-step-completed, rgb(var(--tb-success, 22 163 74)));
3373
+ color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
3374
+ }
3375
+
3376
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-check {
3377
+ width: 0.75rem;
3378
+ height: 0.75rem;
3379
+ }
3380
+
3381
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-connector {
3382
+ width: 2rem;
3383
+ height: 2px;
3384
+ background: var(--rb-reg-step-connector, rgba(var(--tb-border, 226 232 240), 0.5));
3385
+ }
3386
+
3387
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
3388
+ font-size: 0.75rem;
3389
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
3390
+ display: none;
3391
+ }
3392
+
3393
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
3394
+ font-weight: 500;
3395
+ }
3396
+
3397
+ @media (min-width: 640px) {
3398
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
3399
+ display: inline;
3400
+ }
3401
+ }
3402
+
3403
+ /* Wizard actions row */
3404
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions {
3405
+ display: flex;
3406
+ justify-content: space-between;
3407
+ align-items: center;
3408
+ gap: 1rem;
3409
+ margin-top: 1.5rem;
3410
+ }
3411
+
3412
+ /* When there's only one action (no back button), push it to the right */
3413
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions > :only-child {
3414
+ margin-inline-start: auto;
3415
+ }
3416
+
3417
+ /* On-surface text ramp */
3418
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface {
3419
+ color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
3420
+ }
3421
+
3422
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
3423
+ color: var(--rb-reg-on-surface-muted, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.7));
3424
+ }
3425
+
3426
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
3427
+ color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
3428
+ }
3429
+
3430
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
3431
+ color: var(--rb-reg-on-surface-faint, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.5));
3432
+ }
3433
+
3434
+ /* Layout stacks */
3435
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack {
3436
+ display: flex;
3437
+ flex-direction: column;
3438
+ gap: 1rem;
3439
+ }
3440
+
3441
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack--sm {
3442
+ gap: 0.75rem;
3443
+ }
3444
+
3445
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row {
3446
+ display: flex;
3447
+ align-items: center;
3448
+ gap: 1rem;
3449
+ }
3450
+
3451
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row--between {
3452
+ justify-content: space-between;
3453
+ align-items: flex-start;
3454
+ }
3455
+
3456
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-grid {
3457
+ display: grid;
3458
+ gap: 0.75rem;
3459
+ }
3460
+
3461
+ /* Summary box */
3462
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-summary {
3463
+ padding: 1rem;
3464
+ border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.75);
3465
+ border: 1px solid var(--rb-reg-summary-border, rgb(var(--tb-border, 226 232 240)));
3466
+ background: var(--rb-reg-summary-bg, rgba(var(--tb-muted, 241 245 249), 0.42));
3467
+ }
3468
+
3469
+ /* Skeleton shell lines */
3470
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line {
3471
+ height: 0.75rem;
3472
+ border-radius: 9999px;
3473
+ background: linear-gradient(
3474
+ 90deg,
3475
+ var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22)),
3476
+ rgba(var(--tb-primary, 17 24 39), 0.12),
3477
+ var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22))
3478
+ );
3479
+ }
3480
+
3481
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--lg {
3482
+ width: min(26rem, 82%);
3483
+ }
3484
+
3485
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--md {
3486
+ width: min(19rem, 68%);
3487
+ }
3488
+
3489
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--sm {
3490
+ width: min(14rem, 52%);
3491
+ }
3492
+
3493
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--xs {
3494
+ width: min(10rem, 42%);
3495
+ }
3496
+
3497
+ /* Skeleton block (rectangular placeholder, pulses) */
3498
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
3499
+ height: 2.5rem;
3500
+ width: 100%;
3501
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
3502
+ background: var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22));
3503
+ animation: rb-reg-pulse 1.5s ease-in-out infinite;
3504
+ }
3505
+
3506
+ @keyframes rb-reg-pulse {
3507
+ 0%, 100% {
3508
+ opacity: 1;
3509
+ }
3510
+ 50% {
3511
+ opacity: 0.5;
3512
+ }
3513
+ }
3514
+
3515
+ @media (prefers-reduced-motion: reduce) {
3516
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
3517
+ animation: none;
3518
+ }
3519
+ }
3520
+
3233
3521
 
3234
3522
  /* =============================================================================
3235
3523
  * Block: Event Registration (pilot #76)
@@ -3254,18 +3542,9 @@
3254
3542
  --er-on-surface-disabled-detail: rgba(var(--tb-onSurface, var(--tb-text)), 0.68);
3255
3543
  }
3256
3544
 
3257
- /* Container */
3258
- :where(.theme-scope) :where([data-block="event-registration"]) .er-container {
3259
- border-radius: var(--rb-block-radius);
3260
- border: 1px solid var(--er-border);
3261
- padding: clamp(1rem, 2vw, 1.5rem);
3262
- background: rgb(var(--tb-surface));
3263
- color: var(--er-on-surface);
3264
- transition: border-color var(--rb-block-transition) ease;
3265
- width: 100%;
3266
- max-width: 800px;
3267
- margin-inline: 0;
3268
- }
3545
+ /* Container: styled by the shared .rb-reg-surface (registration-surface.css);
3546
+ .er-container remains in markup as a hook and for the overlay/embedded
3547
+ variants below. */
3269
3548
 
3270
3549
  /* SSR shell / required-island fallback */
3271
3550
  :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
@@ -3310,32 +3589,8 @@
3310
3589
  padding: 1rem;
3311
3590
  }
3312
3591
 
3313
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line {
3314
- height: 0.75rem;
3315
- border-radius: 9999px;
3316
- background: linear-gradient(
3317
- 90deg,
3318
- var(--er-shell-line),
3319
- rgba(var(--tb-primary), 0.12),
3320
- var(--er-shell-line)
3321
- );
3322
- }
3323
-
3324
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--lg {
3325
- width: min(26rem, 82%);
3326
- }
3327
-
3328
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--md {
3329
- width: min(19rem, 68%);
3330
- }
3331
-
3332
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--sm {
3333
- width: min(14rem, 52%);
3334
- }
3335
-
3336
- :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--xs {
3337
- width: min(10rem, 42%);
3338
- }
3592
+ /* Shell skeleton lines: styled by the shared .rb-shell-line family
3593
+ (registration-surface.css); legacy classes remain in markup as hooks. */
3339
3594
 
3340
3595
  :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__summary {
3341
3596
  align-items: center;
@@ -3412,13 +3667,8 @@
3412
3667
  color: var(--er-capacity-soldout-text);
3413
3668
  }
3414
3669
 
3415
- /* Selected event summary */
3416
- :where(.theme-scope) :where([data-block="event-registration"]) .er-event-summary {
3417
- padding: 1rem;
3418
- border-radius: calc(var(--rb-block-radius) * 0.75);
3419
- border: 1px solid var(--er-border);
3420
- background: var(--er-surface-muted);
3421
- }
3670
+ /* Selected event summary: superseded by the shared .rb-reg-summary
3671
+ (registration-surface.css); no markup emitted .er-event-summary anymore. */
3422
3672
 
3423
3673
  /* Ticket counter */
3424
3674
  :where(.theme-scope) :where([data-block="event-registration"]) .er-ticket-counter-group {
@@ -3622,7 +3872,7 @@
3622
3872
  opacity: 1;
3623
3873
  }
3624
3874
 
3625
- /* State icon color variants (layout from registration-shared.css) */
3875
+ /* State icon color variants (layout from registration-surface.css) */
3626
3876
  :where(.theme-scope) :where([data-block="event-registration"]) .rb-state-icon--success {
3627
3877
  background: var(--er-success-bg);
3628
3878
  color: var(--er-success-text);
@@ -3778,16 +4028,8 @@
3778
4028
  text-align: center;
3779
4029
  }
3780
4030
 
3781
- /* Layout */
3782
- :where(.theme-scope) :where([data-block="event-registration"]) .er-stack {
3783
- display: flex;
3784
- flex-direction: column;
3785
- gap: 1rem;
3786
- }
3787
-
3788
- :where(.theme-scope) :where([data-block="event-registration"]) .er-stack--sm {
3789
- gap: 0.75rem;
3790
- }
4031
+ /* Layout stacks/rows: styled by the shared .rb-reg-stack / .rb-reg-row
4032
+ (registration-surface.css); legacy classes remain in markup as hooks. */
3791
4033
 
3792
4034
  /* Event/date selection rows */
3793
4035
  :where(.theme-scope) :where([data-block="event-registration"]) .er-event-grid {
@@ -3796,17 +4038,6 @@
3796
4038
  gap: 0;
3797
4039
  }
3798
4040
 
3799
- :where(.theme-scope) :where([data-block="event-registration"]) .er-row {
3800
- display: flex;
3801
- align-items: center;
3802
- gap: 1rem;
3803
- }
3804
-
3805
- :where(.theme-scope) :where([data-block="event-registration"]) .er-row--between {
3806
- justify-content: space-between;
3807
- align-items: flex-start;
3808
- }
3809
-
3810
4041
  :where(.theme-scope) :where([data-block="event-registration"]) .er-center {
3811
4042
  text-align: center;
3812
4043
  padding: 2rem;
@@ -3818,18 +4049,8 @@
3818
4049
  margin-bottom: 1rem;
3819
4050
  }
3820
4051
 
3821
- :where(.theme-scope) :where([data-block="event-registration"]) .er-actions {
3822
- display: flex;
3823
- justify-content: space-between;
3824
- align-items: center;
3825
- gap: 1rem;
3826
- margin-top: 1.5rem;
3827
- }
3828
-
3829
- /* When there's only one button (no back), push to the right */
3830
- :where(.theme-scope) :where([data-block="event-registration"]) .er-actions > :only-child {
3831
- margin-inline-start: auto;
3832
- }
4052
+ /* Actions row: styled by the shared .rb-wizard-actions (registration-surface.css);
4053
+ .er-actions remains in markup as a hook. */
3833
4054
 
3834
4055
  :where(.theme-scope) :where([data-block="event-registration"]) .er-button-with-spinner {
3835
4056
  display: inline-flex;
@@ -4081,23 +4302,8 @@
4081
4302
  color: var(--er-on-surface-faint);
4082
4303
  }
4083
4304
 
4084
- /* Checkmark indicator */
4085
- :where(.theme-scope) :where([data-block="event-registration"]) .er-check {
4086
- flex-shrink: 0;
4087
- width: 1.25rem;
4088
- height: 1.25rem;
4089
- border-radius: 50%;
4090
- background: var(--er-check-bg);
4091
- display: flex;
4092
- align-items: center;
4093
- justify-content: center;
4094
- }
4095
-
4096
- :where(.theme-scope) :where([data-block="event-registration"]) .er-check svg {
4097
- width: 0.75rem;
4098
- height: 0.75rem;
4099
- color: var(--er-check-text);
4100
- }
4305
+ /* Checkmark indicator: styled by the shared .rb-option-check
4306
+ (registration-surface.css); .er-check remains in markup as a hook. */
4101
4307
 
4102
4308
  /* Payment summary */
4103
4309
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-summary {
@@ -4143,76 +4349,12 @@
4143
4349
  margin-bottom: 1.5rem;
4144
4350
  }
4145
4351
 
4146
- :where(.theme-scope) :where([data-block="event-registration"]) .er-steps {
4147
- display: flex;
4148
- align-items: center;
4149
- justify-content: center;
4150
- gap: 0.5rem;
4151
- list-style: none;
4152
- padding: 0;
4153
- margin: 0;
4154
- }
4155
-
4156
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step {
4157
- display: flex;
4158
- align-items: center;
4159
- gap: 0.5rem;
4160
- }
4161
-
4162
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle {
4163
- width: 1.75rem;
4164
- height: 1.75rem;
4165
- border-radius: 50%;
4166
- display: flex;
4167
- align-items: center;
4168
- justify-content: center;
4169
- font-size: 0.75rem;
4170
- font-weight: 600;
4171
- background: var(--er-step-inactive);
4172
- color: var(--er-step-text);
4173
- transition: background-color var(--rb-block-transition) ease;
4174
- }
4175
-
4176
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle--active {
4177
- background: var(--er-step-active);
4178
- color: var(--er-step-text-active);
4179
- }
4180
-
4181
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-circle--completed {
4182
- background: var(--er-step-completed);
4183
- color: var(--er-step-text-active);
4184
- }
4185
-
4186
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-check {
4187
- width: 0.75rem;
4188
- height: 0.75rem;
4189
- }
4190
-
4191
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-connector {
4192
- width: 2rem;
4193
- height: 2px;
4194
- background: var(--er-step-connector);
4195
- }
4196
-
4197
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-connector--completed {
4198
- background: var(--er-step-connector);
4199
- }
4200
-
4201
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label {
4202
- font-size: 0.75rem;
4203
- color: var(--er-on-surface);
4204
- display: none;
4205
- }
4206
-
4207
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label--active {
4208
- font-weight: 500;
4209
- }
4210
-
4211
- @media (min-width: 640px) {
4212
- :where(.theme-scope) :where([data-block="event-registration"]) .er-step-label {
4213
- display: inline;
4214
- }
4215
- }
4352
+ /* Step indicator internals: styled by the shared .rb-steps / .rb-step-*
4353
+ family (registration-surface.css) via the --rb-reg-step-* mappings in the
4354
+ event-registration var generator; er-* classes remain in markup as hooks.
4355
+ Note: .er-steps-nav above is intentionally retained — its source position
4356
+ keeps the wizard's 1.5rem step margin winning over the SSR shell's
4357
+ 1.25rem .er-registration-shell__steps override. */
4216
4358
 
4217
4359
  /* Sticky order summary */
4218
4360
  :where(.theme-scope) :where([data-block="event-registration"]) .er-summary {
@@ -6436,69 +6578,34 @@
6436
6578
 
6437
6579
  /* =============================================================================
6438
6580
  * Block: Appointment Booking
6581
+ *
6582
+ * Structural styling comes from the shared registration-surface layer
6583
+ * (registration-surface.css): surface container, option cards + check,
6584
+ * step indicator, wizard actions, on-surface text ramp, stacks, summary box
6585
+ * and skeleton shell. Colors flow through the --rb-reg-* contract, mapped
6586
+ * from this block's --ab-* Tier 3 vars by its var generator.
6587
+ *
6588
+ * Inputs use the theme-generated form-* classes; feedback boxes use the
6589
+ * theme-generated alert / alert-{tone} classes. Only genuinely
6590
+ * booking-specific rules live here.
6591
+ *
6439
6592
  * Uses:
6440
- * - Tier 1 vars: --tb-border, --tb-text, --tb-primary (from theme palette)
6441
- * - Tier 2 vars: --rb-block-radius, --rb-block-transition (from theme scope)
6593
+ * - Tier 1 vars: --tb-* (from theme palette)
6442
6594
  * - Tier 3 vars: --ab-* (from appointment-booking var generator)
6443
6595
  * =============================================================================
6444
6596
  */
6445
6597
 
6446
- /* Main container */
6447
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-container {
6448
- width: 100%;
6449
- }
6450
-
6451
- /* Stack layout utilities */
6452
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack {
6453
- display: flex;
6454
- flex-direction: column;
6455
- gap: 1.5rem;
6456
- }
6457
-
6458
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack--sm {
6459
- display: flex;
6460
- flex-direction: column;
6461
- gap: 0.75rem;
6462
- }
6463
-
6464
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-stack--xs {
6465
- display: flex;
6466
- flex-direction: column;
6467
- gap: 0.5rem;
6468
- }
6469
-
6470
- /* Row layout */
6471
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-row {
6472
- display: flex;
6473
- align-items: center;
6474
- gap: 0.75rem;
6475
- }
6476
-
6477
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-row--between {
6478
- justify-content: space-between;
6479
- }
6480
-
6481
- /* Grid layout */
6482
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-grid {
6483
- display: grid;
6484
- gap: 0.75rem;
6485
- }
6486
-
6487
- /* Center layout */
6488
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-center {
6489
- text-align: center;
6490
- padding: 2rem;
6491
- }
6492
-
6493
- /* Typography */
6598
+ /* Typography helpers */
6494
6599
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-title {
6495
6600
  font-size: 1.5rem;
6496
- font-weight: 700;
6601
+ font-weight: 600;
6602
+ line-height: 1.3;
6497
6603
  }
6498
6604
 
6499
6605
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-subtitle {
6500
- font-size: 0.875rem;
6501
- font-weight: 500;
6606
+ font-size: 0.9375rem;
6607
+ font-weight: 600;
6608
+ line-height: 1.3;
6502
6609
  }
6503
6610
 
6504
6611
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text {
@@ -6509,211 +6616,111 @@
6509
6616
  font-size: 0.75rem;
6510
6617
  }
6511
6618
 
6512
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--muted {
6513
- opacity: var(--ab-text-muted-opacity, 0.6);
6514
- }
6515
-
6516
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-text--faint {
6517
- opacity: var(--ab-text-faint-opacity, 0.4);
6518
- }
6519
-
6520
- /* Selection cards (service, resource, time slot) */
6521
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card {
6522
- position: relative;
6523
- padding: 1rem;
6524
- border: 2px solid var(--ab-card-border, rgb(var(--tb-border, 226 232 240)));
6525
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
6526
- text-align: left;
6527
- background: transparent;
6528
- cursor: pointer;
6529
- transition: border-color var(--rb-block-transition, 150ms) ease, background-color var(--rb-block-transition, 150ms) ease;
6530
- }
6531
-
6532
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card:hover {
6533
- border-color: var(--ab-card-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
6534
- }
6535
-
6536
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-card--selected {
6537
- border-color: var(--ab-card-border-selected, rgb(var(--tb-primary, 17 24 39)));
6538
- background-color: var(--ab-card-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.05));
6539
- }
6540
-
6541
- /* Checkmark indicator */
6542
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-check {
6543
- flex-shrink: 0;
6544
- width: 1.25rem;
6545
- height: 1.25rem;
6546
- border-radius: 50%;
6547
- background-color: var(--ab-check-bg, rgb(var(--tb-primary, 17 24 39)));
6548
- display: flex;
6549
- align-items: center;
6550
- justify-content: center;
6551
- }
6552
-
6553
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-check svg {
6554
- width: 0.75rem;
6555
- height: 0.75rem;
6556
- color: var(--ab-check-text, rgb(var(--tb-background, 255 255 255)));
6557
- }
6558
-
6559
- /* Info box (service summary) */
6560
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-info-box {
6561
- padding: 1rem;
6562
- border: 1px solid var(--ab-card-border, rgb(var(--tb-border, 226 232 240)));
6563
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
6564
- background-color: var(--ab-muted-bg, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
6565
- }
6566
-
6567
- /* Alert states */
6568
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert {
6569
- padding: 0.75rem 1rem;
6570
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
6571
- font-size: 0.875rem;
6572
- }
6573
-
6574
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--success {
6575
- background-color: var(--ab-success-bg, rgba(var(--tb-success, 22 163 74), 0.1));
6576
- color: var(--ab-success-text, rgb(var(--tb-success, 22 163 74)));
6577
- }
6578
-
6579
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--error {
6580
- background-color: var(--ab-error-bg, rgba(var(--tb-destructive, 220 38 38), 0.1));
6581
- color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
6582
- }
6583
-
6584
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--warning {
6585
- background-color: var(--ab-warning-bg, rgba(var(--tb-warning, 245 158 11), 0.1));
6586
- color: var(--ab-warning-text, rgb(var(--tb-warning, 245 158 11)));
6587
- }
6588
-
6589
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-alert--info {
6590
- background-color: var(--ab-info-bg, rgba(var(--tb-info, 14 165 233), 0.1));
6591
- color: var(--ab-info-text, rgb(var(--tb-info, 14 165 233)));
6592
- }
6593
-
6594
- /* Form elements */
6595
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-label {
6596
- display: block;
6597
- font-size: 0.875rem;
6598
- font-weight: 500;
6599
- margin-bottom: 0.5rem;
6600
- }
6601
-
6602
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-required {
6603
- color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
6604
- margin-left: 0.125rem;
6605
- }
6606
-
6607
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-input,
6608
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-select,
6609
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-textarea {
6610
- width: 100%;
6611
- padding: 0.5rem 0.75rem;
6612
- border: 1px solid var(--ab-input-border, rgb(var(--tb-border, 226 232 240)));
6613
- border-radius: var(--ab-input-radius, var(--rb-input-radius, var(--radius-control, var(--rb-block-radius, 1rem))));
6614
- background: transparent;
6615
- font-size: 0.875rem;
6616
- transition: border-color var(--rb-block-transition, 150ms) ease, box-shadow var(--rb-block-transition, 150ms) ease;
6617
- }
6618
-
6619
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-input:focus,
6620
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-select:focus,
6621
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-textarea:focus {
6622
- outline: none;
6623
- border-color: var(--ab-card-border-selected, rgb(var(--tb-primary, 17 24 39)));
6624
- box-shadow: 0 0 0 3px var(--ab-input-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
6619
+ /* Centered state (loading / terminal panels) */
6620
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-center {
6621
+ text-align: center;
6622
+ padding: 2rem;
6625
6623
  }
6626
6624
 
6627
- /* Buttons */
6628
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn {
6629
- display: inline-flex;
6630
- align-items: center;
6631
- justify-content: center;
6632
- padding: 0.5rem 1.5rem;
6633
- border-radius: var(--ab-button-radius, var(--rb-button-radius, var(--rb-block-radius, 1rem)));
6634
- font-size: 0.875rem;
6635
- font-weight: 500;
6636
- cursor: pointer;
6637
- transition: background-color var(--rb-block-transition, 150ms) ease, border-color var(--rb-block-transition, 150ms) ease;
6625
+ /* Terminal state title (below the state icon) */
6626
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-terminal-title {
6627
+ margin: 0.75rem 0 0.5rem 0;
6628
+ font-size: 1.125rem;
6629
+ font-weight: 700;
6638
6630
  }
6639
6631
 
6640
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--primary {
6641
- flex: 1;
6642
- background-color: var(--ab-btn-primary-bg, rgb(var(--tb-primary, 17 24 39)));
6643
- color: var(--ab-btn-primary-text, rgb(var(--tb-primaryForeground, 255 255 255)));
6644
- border: none;
6632
+ /* State icon color variants (layout from registration-surface.css) */
6633
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--success {
6634
+ background: var(--ab-success-bg, rgba(var(--tb-success, 22 163 74), 0.1));
6635
+ color: var(--ab-success-text, rgb(var(--tb-success, 22 163 74)));
6645
6636
  }
6646
6637
 
6647
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--primary:hover:not(:disabled) {
6648
- background-color: var(--ab-btn-primary-hover, rgba(var(--tb-primary, 17 24 39), 0.9));
6638
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--error {
6639
+ background: var(--ab-error-bg, rgba(var(--tb-destructive, 220 38 38), 0.1));
6640
+ color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
6649
6641
  }
6650
6642
 
6651
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--secondary {
6652
- background: transparent;
6653
- border: 1px solid var(--ab-btn-secondary-border, rgb(var(--tb-border, 226 232 240)));
6643
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--info {
6644
+ background: var(--ab-info-bg, rgba(var(--tb-info, 14 165 233), 0.1));
6645
+ color: var(--ab-info-text, rgb(var(--tb-info, 14 165 233)));
6654
6646
  }
6655
6647
 
6656
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--secondary:hover:not(:disabled) {
6657
- background-color: var(--ab-btn-secondary-hover, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
6648
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--warning {
6649
+ background: var(--ab-warning-bg, rgba(var(--tb-warning, 245 158 11), 0.1));
6650
+ color: var(--ab-warning-text, rgb(var(--tb-warning, 245 158 11)));
6658
6651
  }
6659
6652
 
6660
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--link {
6661
- background: transparent;
6662
- border: none;
6663
- padding: 0;
6664
- text-decoration: underline;
6653
+ /* Payment option summary rows (label/value lines inside an option card) */
6654
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-option-rows {
6655
+ display: grid;
6656
+ gap: 0.125rem;
6665
6657
  }
6666
6658
 
6667
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn--link:hover {
6668
- text-decoration: none;
6659
+ /* Date/time pill grids (selection pills extend .rb-option-card) */
6660
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-grid {
6661
+ display: flex;
6662
+ flex-wrap: wrap;
6663
+ gap: 0.5rem;
6669
6664
  }
6670
6665
 
6671
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-btn:disabled {
6672
- opacity: 0.5;
6673
- cursor: not-allowed;
6666
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-date-pill {
6667
+ flex-direction: column;
6668
+ align-items: center;
6669
+ gap: 0.125rem;
6670
+ padding: 0.5rem 0.875rem;
6671
+ min-width: 4.25rem;
6672
+ text-align: center;
6674
6673
  }
6675
6674
 
6676
- /* Actions row */
6677
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-actions {
6678
- display: flex;
6679
- gap: 0.75rem;
6680
- margin-top: 1.5rem;
6675
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-time-pill {
6676
+ align-items: center;
6677
+ justify-content: center;
6678
+ padding: 0.5rem 0.875rem;
6679
+ min-width: 5.5rem;
6680
+ font-size: 0.875rem;
6681
+ font-weight: 500;
6682
+ text-align: center;
6681
6683
  }
6682
6684
 
6683
- /* Skeleton loading */
6684
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-skeleton {
6685
- height: 2.5rem;
6686
- width: 100%;
6687
- background-color: var(--ab-muted-bg, rgba(var(--tb-foreground, var(--tb-text, 15 23 42)), 0.05));
6688
- border-radius: var(--ab-card-radius, var(--rb-block-radius, 1rem));
6689
- animation: ab-pulse 1.5s ease-in-out infinite;
6685
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-caption {
6686
+ font-size: 0.6875rem;
6687
+ font-weight: 600;
6688
+ letter-spacing: 0;
6689
+ line-height: 1.2;
6690
+ text-transform: uppercase;
6691
+ color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
6690
6692
  }
6691
6693
 
6692
- @keyframes ab-pulse {
6693
- 0%, 100% {
6694
- opacity: 1;
6695
- }
6696
- 50% {
6697
- opacity: 0.5;
6698
- }
6694
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-value {
6695
+ font-size: 1.125rem;
6696
+ font-weight: 600;
6697
+ line-height: 1.2;
6699
6698
  }
6700
6699
 
6701
- /* Field wrapper */
6702
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-field {
6703
- display: flex;
6704
- flex-direction: column;
6705
- gap: 0.5rem;
6700
+ /* SSR shell skeleton (mirrors the hydrated layout to reduce hydration jump) */
6701
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-shell {
6702
+ min-height: 18rem;
6706
6703
  }
6707
6704
 
6708
- /* Altcha wrapper */
6709
- :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-altcha {
6710
- margin-top: 1rem;
6705
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-shell-button {
6706
+ display: inline-flex;
6707
+ min-height: 2.5rem;
6708
+ align-items: center;
6709
+ justify-content: center;
6710
+ border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.6);
6711
+ background: rgb(var(--tb-primary, 17 24 39));
6712
+ color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
6713
+ padding: 0.625rem 1rem;
6714
+ font-size: 0.875rem;
6715
+ font-weight: 600;
6716
+ line-height: 1.2;
6717
+ text-align: center;
6718
+ white-space: nowrap;
6711
6719
  }
6712
6720
 
6713
- /* Link button (inline text link) */
6721
+ /* Inline text-link button (e.g. "Load more dates") */
6714
6722
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-link {
6715
6723
  display: inline;
6716
- margin-left: 0.5rem;
6717
6724
  color: rgb(var(--tb-primary, 17 24 39));
6718
6725
  background: none;
6719
6726
  border: none;
@@ -6727,91 +6734,9 @@
6727
6734
  text-decoration: none;
6728
6735
  }
6729
6736
 
6730
- /* =============================================================================
6731
- * Form Block (fb-*)
6732
- *
6733
- * Uses:
6734
- * - Tier 1 vars: --tb-border, --tb-surface, --tb-success, --tb-destructive
6735
- * - Tier 2 vars: --rb-block-radius
6736
- * - Tier 3 vars: --fb-success-*, --fb-error-*, --fb-empty-*
6737
- *
6738
- * Note: Form input styling (form-input, form-select, etc.) is handled by
6739
- * the input CSS generator. These styles are for form container/state only.
6740
- * ============================================================================= */
6741
-
6742
- /* Form container */
6743
- :where(.theme-scope) :where([data-block="form"]) .fb-form {
6744
- display: flex;
6745
- flex-direction: column;
6746
- gap: 1rem;
6747
- }
6748
-
6749
- /* Two-column row (opt-in per field via schema layout) */
6750
- :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
6751
- display: grid;
6752
- grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
6753
- gap: 1rem;
6754
- }
6755
-
6756
- /* Field wrapper */
6757
- :where(.theme-scope) :where([data-block="form"]) .fb-field {
6758
- display: flex;
6759
- flex-direction: column;
6760
- gap: 0.25rem;
6761
- }
6762
-
6763
- /* Fieldset (for radio groups) */
6764
- :where(.theme-scope) :where([data-block="form"]) .fb-fieldset {
6765
- display: flex;
6766
- flex-direction: column;
6767
- gap: 0.5rem;
6768
- border: none;
6769
- padding: 0;
6770
- margin: 0;
6771
- }
6772
-
6773
- /* Inline field (checkbox, radio with label) */
6774
- :where(.theme-scope) :where([data-block="form"]) .fb-inline {
6775
- display: flex;
6776
- align-items: center;
6777
- gap: 0.5rem;
6778
- }
6779
-
6780
- /* Success state */
6781
- :where(.theme-scope) :where([data-block="form"]) .fb-success {
6782
- background-color: var(--fb-success-bg);
6783
- color: var(--fb-success-text);
6784
- border: 1px solid var(--fb-success-border);
6785
- border-radius: var(--rb-block-radius);
6786
- padding: 1rem;
6787
- font-size: 0.875rem;
6788
- }
6789
-
6790
- /* Error banner */
6791
- :where(.theme-scope) :where([data-block="form"]) .fb-error {
6792
- background-color: var(--fb-error-bg);
6793
- color: var(--fb-error-text);
6794
- border: 1px solid var(--fb-error-border);
6795
- border-radius: var(--rb-block-radius);
6796
- padding: 0.75rem;
6797
- font-size: 0.875rem;
6798
- margin-bottom: 0.5rem;
6799
- }
6800
-
6801
- /* Empty state (no form data) */
6802
- :where(.theme-scope) :where([data-block="form"]) .fb-empty {
6803
- background-color: var(--fb-empty-bg);
6804
- color: var(--fb-empty-text);
6805
- border: 1px dashed var(--fb-empty-border);
6806
- border-radius: var(--rb-block-radius);
6807
- padding: 1.5rem;
6808
- font-size: 0.875rem;
6809
- text-align: center;
6810
- }
6811
-
6812
- /* Form actions (submit button container) */
6813
- :where(.theme-scope) :where([data-block="form"]) .fb-actions {
6814
- margin-top: 0.5rem;
6737
+ /* Altcha wrapper */
6738
+ :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-altcha {
6739
+ margin-top: 1rem;
6815
6740
  }
6816
6741
 
6817
6742
 
@@ -7072,6 +6997,93 @@
7072
6997
  color: var(--section-text-color, rgb(var(--tb-text)));
7073
6998
  }
7074
6999
 
7000
+ /* =============================================================================
7001
+ * Form Block (fb-*)
7002
+ *
7003
+ * Uses:
7004
+ * - Tier 1 vars: --tb-border, --tb-surface, --tb-success, --tb-destructive
7005
+ * - Tier 2 vars: --rb-block-radius
7006
+ * - Tier 3 vars: --fb-success-*, --fb-error-*, --fb-empty-*
7007
+ *
7008
+ * Note: Form input styling (form-input, form-select, etc.) is handled by
7009
+ * the input CSS generator. These styles are for form container/state only.
7010
+ * ============================================================================= */
7011
+
7012
+ /* Form container */
7013
+ :where(.theme-scope) :where([data-block="form"]) .fb-form {
7014
+ display: flex;
7015
+ flex-direction: column;
7016
+ gap: 1rem;
7017
+ }
7018
+
7019
+ /* Two-column row (opt-in per field via schema layout) */
7020
+ :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
7021
+ display: grid;
7022
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
7023
+ gap: 1rem;
7024
+ }
7025
+
7026
+ /* Field wrapper */
7027
+ :where(.theme-scope) :where([data-block="form"]) .fb-field {
7028
+ display: flex;
7029
+ flex-direction: column;
7030
+ gap: 0.25rem;
7031
+ }
7032
+
7033
+ /* Fieldset (for radio groups) */
7034
+ :where(.theme-scope) :where([data-block="form"]) .fb-fieldset {
7035
+ display: flex;
7036
+ flex-direction: column;
7037
+ gap: 0.5rem;
7038
+ border: none;
7039
+ padding: 0;
7040
+ margin: 0;
7041
+ }
7042
+
7043
+ /* Inline field (checkbox, radio with label) */
7044
+ :where(.theme-scope) :where([data-block="form"]) .fb-inline {
7045
+ display: flex;
7046
+ align-items: center;
7047
+ gap: 0.5rem;
7048
+ }
7049
+
7050
+ /* Success state */
7051
+ :where(.theme-scope) :where([data-block="form"]) .fb-success {
7052
+ background-color: var(--fb-success-bg);
7053
+ color: var(--fb-success-text);
7054
+ border: 1px solid var(--fb-success-border);
7055
+ border-radius: var(--rb-block-radius);
7056
+ padding: 1rem;
7057
+ font-size: 0.875rem;
7058
+ }
7059
+
7060
+ /* Error banner */
7061
+ :where(.theme-scope) :where([data-block="form"]) .fb-error {
7062
+ background-color: var(--fb-error-bg);
7063
+ color: var(--fb-error-text);
7064
+ border: 1px solid var(--fb-error-border);
7065
+ border-radius: var(--rb-block-radius);
7066
+ padding: 0.75rem;
7067
+ font-size: 0.875rem;
7068
+ margin-bottom: 0.5rem;
7069
+ }
7070
+
7071
+ /* Empty state (no form data) */
7072
+ :where(.theme-scope) :where([data-block="form"]) .fb-empty {
7073
+ background-color: var(--fb-empty-bg);
7074
+ color: var(--fb-empty-text);
7075
+ border: 1px dashed var(--fb-empty-border);
7076
+ border-radius: var(--rb-block-radius);
7077
+ padding: 1.5rem;
7078
+ font-size: 0.875rem;
7079
+ text-align: center;
7080
+ }
7081
+
7082
+ /* Form actions (submit button container) */
7083
+ :where(.theme-scope) :where([data-block="form"]) .fb-actions {
7084
+ margin-top: 0.5rem;
7085
+ }
7086
+
7075
7087
  /* =============================================================================
7076
7088
  * Block-Level Override Utilities
7077
7089
  *
@@ -8690,14 +8702,11 @@
8690
8702
  --cr-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
8691
8703
  }
8692
8704
 
8693
- /* Container */
8705
+ /* Container: base styling comes from the shared .rb-reg-surface
8706
+ (registration-surface.css); these overrides preserve course
8707
+ registration's pre-extraction look (fixed padding, centered). */
8694
8708
  :where(.theme-scope) :where([data-block="course-registration"]) .cr-container {
8695
- border-radius: var(--rb-block-radius);
8696
- border: 1px solid var(--cr-border);
8697
8709
  padding: 1.5rem;
8698
- background: rgb(var(--tb-surface));
8699
- color: var(--cr-on-surface);
8700
- max-width: 50rem; /* 800px */
8701
8710
  margin-inline: auto;
8702
8711
  }
8703
8712
 
@@ -9368,7 +9377,7 @@
9368
9377
  padding: 2rem 1rem;
9369
9378
  }
9370
9379
 
9371
- /* State icon color variants (layout from registration-shared.css) */
9380
+ /* State icon color variants (layout from registration-surface.css) */
9372
9381
  :where(.theme-scope) :where([data-block="course-registration"]) .rb-state-icon--success {
9373
9382
  background: var(--cr-success-bg);
9374
9383
  color: var(--cr-success-text);