@riverbankcms/sdk 0.60.11 → 0.60.14

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 (96) hide show
  1. package/README.md +10 -7
  2. package/dist/_dts/api/src/accessAdmin.d.ts +102 -0
  3. package/dist/_dts/api/src/bookingConfig.d.ts +31 -1
  4. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +38 -1
  5. package/dist/_dts/api/src/bookingOperations.d.ts +3 -0
  6. package/dist/_dts/api/src/bookingRecords.d.ts +45 -0
  7. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +4 -4
  8. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +1 -5
  9. package/dist/_dts/api/src/common/envelope.d.ts +1 -1
  10. package/dist/_dts/api/src/communications.d.ts +1 -1
  11. package/dist/_dts/api/src/contentRuntime.d.ts +1 -1
  12. package/dist/_dts/api/src/domains.d.ts +14 -13
  13. package/dist/_dts/api/src/endpoints.d.ts +121 -9
  14. package/dist/_dts/api/src/index.d.ts +3 -2
  15. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +1 -0
  16. package/dist/_dts/api/src/seoEndpoints.d.ts +2 -0
  17. package/dist/_dts/api/src/siteAssets.d.ts +0 -10
  18. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +15 -1
  19. package/dist/_dts/api/src/types.d.ts +1 -1
  20. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  21. package/dist/_dts/blocks/src/index.d.ts +1 -0
  22. package/dist/_dts/blocks/src/portal/types.d.ts +1 -1
  23. package/dist/_dts/blocks/src/server.d.ts +1 -0
  24. package/dist/_dts/blocks/src/subroutes/fold.d.ts +40 -0
  25. package/dist/_dts/blocks/src/subroutes/formatDate.d.ts +12 -0
  26. package/dist/_dts/blocks/src/subroutes/index.d.ts +3 -0
  27. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +32 -0
  28. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +3 -1
  29. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +2 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +1 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/spacing.d.ts +2 -1
  33. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +5 -0
  34. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +5 -1
  35. package/dist/_dts/core/src/booking-refunds.d.ts +8 -0
  36. package/dist/_dts/core/src/participant-identity.d.ts +1 -1
  37. package/dist/_dts/core/src/participants.d.ts +19 -7
  38. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +284 -96
  39. package/dist/_dts/db/src/schemas/forms.d.ts +135 -24
  40. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -3
  41. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +3 -3
  42. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +3 -3
  43. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +3 -3
  44. package/dist/_dts/preview-next/src/client/preview/SubrouteNoticePanel.d.ts +13 -0
  45. package/dist/_dts/preview-next/src/client/preview/subrouteNotice.d.ts +26 -0
  46. package/dist/_dts/sdk/src/contracts/page.d.ts +1 -0
  47. package/dist/_dts/sdk/src/public-api/contracts.d.ts +2 -1
  48. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -0
  49. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +4 -5
  50. package/dist/_dts/sdk/src/version.d.ts +1 -1
  51. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  52. package/dist/_dts/theme-core/src/buttons/personalities/showtime-pill.d.ts +17 -0
  53. package/dist/_dts/theme-core/src/buttons/types.d.ts +1 -1
  54. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  55. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +66 -30
  56. package/dist/_dts/theme-core/src/palette/variants/brand-led.d.ts +16 -0
  57. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  58. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  59. package/dist/_dts/theme-core/src/schema.d.ts +174 -6
  60. package/dist/_dts/theme-core/src/site-styles/appearancePresets.d.ts +328 -15
  61. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +54 -2
  62. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +124 -0
  63. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  64. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  65. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +21 -0
  66. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +2 -1
  67. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  68. package/dist/_dts/theme-core/src/site-styles/types.d.ts +135 -2
  69. package/dist/_dts/ui/src/badge.d.ts +1 -1
  70. package/dist/_dts/ui/src/button.d.ts +1 -1
  71. package/dist/cli/index.mjs +801 -115
  72. package/dist/client/bookings.mjs +115 -1
  73. package/dist/client/client.mjs +905 -166
  74. package/dist/client/hooks.mjs +794 -111
  75. package/dist/client/rendering/client.mjs +179 -39
  76. package/dist/client/rendering/islands.mjs +179 -38
  77. package/dist/client/rendering.mjs +904 -165
  78. package/dist/preview-next/before-render.mjs +160 -16
  79. package/dist/preview-next/client/runtime.mjs +1674 -260
  80. package/dist/preview-next/middleware.mjs +160 -16
  81. package/dist/server/components.mjs +895 -165
  82. package/dist/server/config-validation.mjs +794 -111
  83. package/dist/server/config.mjs +794 -111
  84. package/dist/server/data.mjs +794 -111
  85. package/dist/server/index.mjs +163 -17
  86. package/dist/server/next.mjs +898 -167
  87. package/dist/server/page-converter.mjs +589 -82
  88. package/dist/server/prebuild.mjs +1 -1
  89. package/dist/server/rendering/server.mjs +895 -165
  90. package/dist/server/rendering.mjs +895 -165
  91. package/dist/server/routing.mjs +828 -117
  92. package/dist/server/server.mjs +795 -112
  93. package/dist/server/theme-bridge.mjs +216 -39
  94. package/dist/server/theme.mjs +139 -37
  95. package/dist/styles/index.css +44 -2
  96. package/package.json +1 -1
@@ -643,7 +643,7 @@ var ENDPOINT_DEFINITIONS = {
643
643
  method: "GET",
644
644
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
645
645
  auth: "user",
646
- responseKind: "text"
646
+ responseKind: "blob"
647
647
  },
648
648
  getNewsletterSubscriber: {
649
649
  path: "/sites/{siteId}/newsletter/subscribers/{subscriberId}",
@@ -974,12 +974,7 @@ var ENDPOINT_DEFINITIONS = {
974
974
  ],
975
975
  auth: "user",
976
976
  responseKind: "json",
977
- errors: [
978
- "validation:invalid_input",
979
- "resource:not_found",
980
- "resource:conflict",
981
- "server:internal_error"
982
- ]
977
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
983
978
  },
984
979
  unpublishTeamMemberProfile: {
985
980
  path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
@@ -1232,6 +1227,13 @@ var ENDPOINT_DEFINITIONS = {
1232
1227
  auth: "user",
1233
1228
  responseKind: "json"
1234
1229
  },
1230
+ exportBookingAppointmentsCsv: {
1231
+ path: "/sites/{siteId}/bookings/appointments/export.csv",
1232
+ method: "GET",
1233
+ auth: "user",
1234
+ errors: [],
1235
+ responseKind: "blob"
1236
+ },
1235
1237
  createAppointment: {
1236
1238
  path: "/sites/{siteId}/bookings/appointments",
1237
1239
  method: "POST",
@@ -1359,6 +1361,13 @@ var ENDPOINT_DEFINITIONS = {
1359
1361
  auth: "user",
1360
1362
  responseKind: "json"
1361
1363
  },
1364
+ exportCourseEnrollmentsCsv: {
1365
+ path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
1366
+ method: "GET",
1367
+ auth: "user",
1368
+ errors: [],
1369
+ responseKind: "blob"
1370
+ },
1362
1371
  listCourseWaitlist: {
1363
1372
  path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist",
1364
1373
  method: "GET",
@@ -2117,6 +2126,63 @@ var ENDPOINT_DEFINITIONS = {
2117
2126
  auth: "user",
2118
2127
  responseKind: "json"
2119
2128
  },
2129
+ updateRegisteredDomainContact: {
2130
+ path: "/domains/{domainId}/registrar/contact",
2131
+ method: "POST",
2132
+ errors: [
2133
+ "validation:invalid_input",
2134
+ "resource:not_found",
2135
+ "auth:forbidden",
2136
+ "external:service_error",
2137
+ "external:registrar_orphaned_contact_profile",
2138
+ "server:internal_error"
2139
+ ],
2140
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2141
+ auth: "user",
2142
+ responseKind: "json"
2143
+ },
2144
+ setRegisteredDomainPrivacy: {
2145
+ path: "/domains/{domainId}/registrar/privacy",
2146
+ method: "POST",
2147
+ errors: [
2148
+ "validation:invalid_input",
2149
+ "resource:not_found",
2150
+ "auth:forbidden",
2151
+ "external:service_error",
2152
+ "server:internal_error"
2153
+ ],
2154
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2155
+ auth: "user",
2156
+ responseKind: "json"
2157
+ },
2158
+ setRegisteredDomainAutoRenew: {
2159
+ path: "/domains/{domainId}/registrar/auto-renew",
2160
+ method: "POST",
2161
+ errors: [
2162
+ "validation:invalid_input",
2163
+ "resource:not_found",
2164
+ "auth:forbidden",
2165
+ "external:service_error",
2166
+ "server:internal_error"
2167
+ ],
2168
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2169
+ auth: "user",
2170
+ responseKind: "json"
2171
+ },
2172
+ getRegisteredDomainRenewalPosture: {
2173
+ path: "/domains/{domainId}/registrar/renewal",
2174
+ method: "GET",
2175
+ errors: [
2176
+ "validation:invalid_input",
2177
+ "resource:not_found",
2178
+ "auth:forbidden",
2179
+ "external:service_error",
2180
+ "server:internal_error"
2181
+ ],
2182
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2183
+ auth: "user",
2184
+ responseKind: "json"
2185
+ },
2120
2186
  retryDomainVercel: {
2121
2187
  path: "/domains/{domainId}/vercel",
2122
2188
  method: "POST",
@@ -2664,6 +2730,14 @@ var ENDPOINT_DEFINITIONS = {
2664
2730
  auth: "user",
2665
2731
  responseKind: "json"
2666
2732
  },
2733
+ exportSeoPagesCsv: {
2734
+ path: "/sites/{siteId}/seo/pages",
2735
+ method: "GET",
2736
+ tags: ["site-{siteId}", "seo-pages-{siteId}"],
2737
+ auth: "user",
2738
+ responseKind: "blob",
2739
+ errors: []
2740
+ },
2667
2741
  getSeoQueries: {
2668
2742
  path: "/sites/{siteId}/seo/queries",
2669
2743
  method: "GET",
@@ -2672,6 +2746,14 @@ var ENDPOINT_DEFINITIONS = {
2672
2746
  auth: "user",
2673
2747
  responseKind: "json"
2674
2748
  },
2749
+ exportSeoQueriesCsv: {
2750
+ path: "/sites/{siteId}/seo/queries",
2751
+ method: "GET",
2752
+ tags: ["site-{siteId}", "seo-queries-{siteId}"],
2753
+ auth: "user",
2754
+ responseKind: "blob",
2755
+ errors: []
2756
+ },
2675
2757
  getPerformanceOverview: {
2676
2758
  path: "/sites/{siteId}/performance/overview",
2677
2759
  method: "GET",
@@ -2720,7 +2802,12 @@ var ENDPOINT_DEFINITIONS = {
2720
2802
  path: "/media/{assetId}/canonical-crop",
2721
2803
  method: "POST",
2722
2804
  tags: ["media", "media-{assetId}"],
2723
- errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"],
2805
+ errors: [
2806
+ "validation:invalid_input",
2807
+ "resource:not_found",
2808
+ "resource:conflict",
2809
+ "server:internal_error"
2810
+ ],
2724
2811
  auth: "user",
2725
2812
  responseKind: "json"
2726
2813
  },
@@ -3052,7 +3139,7 @@ var ENDPOINT_DEFINITIONS = {
3052
3139
  method: "GET",
3053
3140
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3054
3141
  auth: "user",
3055
- responseKind: "text"
3142
+ responseKind: "blob"
3056
3143
  },
3057
3144
  // Public submit
3058
3145
  submitForm: {
@@ -3935,6 +4022,14 @@ var ENDPOINT_DEFINITIONS = {
3935
4022
  auth: "user",
3936
4023
  responseKind: "json"
3937
4024
  },
4025
+ exportEventSeriesAttendeesCsv: {
4026
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/attendees/export.csv",
4027
+ method: "GET",
4028
+ tags: ["site-{siteId}", "event-series-{seriesId}"],
4029
+ auth: "user",
4030
+ errors: [],
4031
+ responseKind: "blob"
4032
+ },
3938
4033
  listEventSeriesWaitlist: {
3939
4034
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3940
4035
  method: "GET",
@@ -4498,6 +4593,14 @@ var ENDPOINT_DEFINITIONS = {
4498
4593
  auth: "user",
4499
4594
  responseKind: "json"
4500
4595
  },
4596
+ exportBookingCustomersCsv: {
4597
+ path: "/sites/{siteId}/bookings/customers/export.csv",
4598
+ method: "GET",
4599
+ tags: ["site-{siteId}", "customers-{siteId}"],
4600
+ auth: "user",
4601
+ errors: [],
4602
+ responseKind: "blob"
4603
+ },
4501
4604
  createBookingCustomer: {
4502
4605
  path: "/sites/{siteId}/bookings/customers",
4503
4606
  method: "POST",
@@ -4525,6 +4628,21 @@ var ENDPOINT_DEFINITIONS = {
4525
4628
  "server:internal_error"
4526
4629
  ]
4527
4630
  },
4631
+ rectifyBookingParticipantIdentity: {
4632
+ path: "/sites/{siteId}/bookings/participants/{participantId}/identity",
4633
+ method: "PATCH",
4634
+ tags: ["site-{siteId}", "customers-{siteId}"],
4635
+ auth: "user",
4636
+ responseKind: "json",
4637
+ errors: [
4638
+ "validation:invalid_input",
4639
+ "auth:forbidden",
4640
+ "resource:not_found",
4641
+ "resource:already_exists",
4642
+ "resource:conflict",
4643
+ "server:internal_error"
4644
+ ]
4645
+ },
4528
4646
  listCustomerPasses: {
4529
4647
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4530
4648
  method: "GET",
@@ -4659,13 +4777,46 @@ var ENDPOINT_DEFINITIONS = {
4659
4777
  auth: "user",
4660
4778
  responseKind: "json"
4661
4779
  },
4780
+ exportMoneyPaymentsCsv: {
4781
+ path: "/sites/{siteId}/bookings/money/payments/export.csv",
4782
+ method: "GET",
4783
+ tags: ["site-{siteId}", "bookings", "money-payments-{siteId}"],
4784
+ errors: [],
4785
+ auth: "user",
4786
+ responseKind: "blob"
4787
+ },
4788
+ exportMoneyBreakdownsCsv: {
4789
+ path: "/sites/{siteId}/bookings/money/report/breakdowns/export.csv",
4790
+ method: "GET",
4791
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4792
+ errors: [],
4793
+ auth: "user",
4794
+ responseKind: "blob"
4795
+ },
4796
+ exportMoneyTimeSeriesCsv: {
4797
+ path: "/sites/{siteId}/bookings/money/report/time-series/export.csv",
4798
+ method: "GET",
4799
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4800
+ errors: [],
4801
+ auth: "user",
4802
+ responseKind: "blob"
4803
+ },
4662
4804
  listBookingActivity: {
4663
4805
  path: "/sites/{siteId}/bookings/activity",
4664
4806
  method: "GET",
4665
4807
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4808
+ errors: [],
4666
4809
  auth: "user",
4667
4810
  responseKind: "json"
4668
4811
  },
4812
+ exportBookingActivityCsv: {
4813
+ path: "/sites/{siteId}/bookings/activity/export.csv",
4814
+ method: "GET",
4815
+ tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4816
+ errors: [],
4817
+ auth: "user",
4818
+ responseKind: "blob"
4819
+ },
4669
4820
  // Site logs
4670
4821
  listSiteActivityLogs: {
4671
4822
  path: "/sites/{siteId}/logs/activity",
@@ -4817,13 +4968,6 @@ var ENDPOINT_DEFINITIONS = {
4817
4968
  auth: "user",
4818
4969
  responseKind: "blob"
4819
4970
  },
4820
- exportSeoCsv: {
4821
- path: "/sites/{siteId}/seo/export",
4822
- method: "GET",
4823
- tags: ["site-{siteId}", "seo"],
4824
- auth: "user",
4825
- responseKind: "blob"
4826
- },
4827
4971
  // Admin site cost (for admin panel)
4828
4972
  adminSiteCost: {
4829
4973
  path: "/admin/sites/{siteId}/cost",
@@ -6262,7 +6406,7 @@ var SimpleCache = class {
6262
6406
  };
6263
6407
 
6264
6408
  // src/version.ts
6265
- var SDK_VERSION = "0.60.11";
6409
+ var SDK_VERSION = "0.60.14";
6266
6410
 
6267
6411
  // src/client/error.ts
6268
6412
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -8691,6 +8835,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
8691
8835
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
8692
8836
  "missing_amount",
8693
8837
  "amount_exceeds_remaining",
8838
+ "credit_refunds_disabled",
8839
+ "missing_credit_customer",
8694
8840
  "deposit_refund_override_required",
8695
8841
  "refund_revoke_requires_full_line_refund",
8696
8842
  "unified_order_link_required"
@@ -9275,12 +9421,29 @@ function defineFrameCapability(capability) {
9275
9421
  function defineBlockDesignCapability(capability) {
9276
9422
  return {
9277
9423
  ...capability,
9278
- kind: "designed"
9424
+ kind: "designed",
9425
+ sectionHeights: capability.sectionHeights ?? ["default"],
9426
+ imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
9427
+ imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
9428
+ testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"]
9279
9429
  };
9280
9430
  }
9281
9431
 
9282
9432
  // ../theme-core/src/site-styles/appearancePresets.ts
9433
+ function assertValidOptionGroups(preset2) {
9434
+ preset2.optionGroups?.forEach((group) => {
9435
+ const selectedOption = group.options.find(
9436
+ (option) => option.id === group.selectedOptionId
9437
+ );
9438
+ if (!selectedOption) {
9439
+ throw new Error(
9440
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
9441
+ );
9442
+ }
9443
+ });
9444
+ }
9283
9445
  function defineBlockAppearancePreset(preset2) {
9446
+ assertValidOptionGroups(preset2);
9284
9447
  return preset2;
9285
9448
  }
9286
9449
  function defineSiteChromeAppearancePreset(preset2) {
@@ -9293,13 +9456,122 @@ var appearancePresets = [
9293
9456
  target: "hero",
9294
9457
  label: "Immersive image hero",
9295
9458
  blockKinds: ["block.hero"],
9459
+ constraints: {
9460
+ layoutFamilies: ["centered", "compact"]
9461
+ },
9462
+ design: {
9463
+ sectionSurface: "hero-image",
9464
+ contentFrame: plainFrame,
9465
+ itemSurface: "none",
9466
+ transitionAfter: "soft-fade-short",
9467
+ emphasis: "high",
9468
+ sectionHeight: "hero",
9469
+ imageSurfaceTreatment: { kind: "neutral-wash" }
9470
+ }
9471
+ }),
9472
+ defineBlockAppearancePreset({
9473
+ kind: "block-design",
9474
+ id: "hero-brand-scrim",
9475
+ target: "hero",
9476
+ label: "Brand scrim image hero",
9477
+ blockKinds: ["block.hero"],
9478
+ constraints: {
9479
+ layoutFamilies: ["centered", "compact"]
9480
+ },
9481
+ optionGroups: [
9482
+ {
9483
+ id: "image-surface-treatment",
9484
+ label: "Treatment",
9485
+ selectedOptionId: "brand-scrim-primary",
9486
+ options: [
9487
+ {
9488
+ id: "brand-scrim-primary",
9489
+ label: "Brand scrim",
9490
+ designPatch: {
9491
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
9492
+ }
9493
+ },
9494
+ {
9495
+ id: "neutral-scrim",
9496
+ label: "Neutral scrim",
9497
+ designPatch: {
9498
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
9499
+ }
9500
+ }
9501
+ ]
9502
+ }
9503
+ ],
9504
+ layoutPatches: [
9505
+ {
9506
+ constraints: {
9507
+ layoutVariantKeys: ["micro"]
9508
+ },
9509
+ designPatch: {
9510
+ sectionHeight: "banner"
9511
+ }
9512
+ }
9513
+ ],
9514
+ design: {
9515
+ sectionSurface: "hero-image",
9516
+ contentFrame: plainFrame,
9517
+ itemSurface: "none",
9518
+ transitionAfter: "soft-fade-short",
9519
+ emphasis: "high",
9520
+ sectionHeight: "immersive",
9521
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
9522
+ }
9523
+ }),
9524
+ defineBlockAppearancePreset({
9525
+ kind: "block-design",
9526
+ id: "hero-brand-scrim-fixed-frame",
9527
+ target: "hero",
9528
+ label: "Fixed-frame brand scrim hero",
9529
+ blockKinds: ["block.hero"],
9530
+ constraints: {
9531
+ layoutFamilies: ["centered", "compact"]
9532
+ },
9533
+ optionGroups: [
9534
+ {
9535
+ id: "image-surface-treatment",
9536
+ label: "Treatment",
9537
+ selectedOptionId: "brand-scrim-primary",
9538
+ options: [
9539
+ {
9540
+ id: "brand-scrim-primary",
9541
+ label: "Brand scrim",
9542
+ designPatch: {
9543
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
9544
+ }
9545
+ },
9546
+ {
9547
+ id: "neutral-scrim",
9548
+ label: "Neutral scrim",
9549
+ designPatch: {
9550
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
9551
+ }
9552
+ }
9553
+ ]
9554
+ }
9555
+ ],
9556
+ layoutPatches: [
9557
+ {
9558
+ constraints: {
9559
+ layoutVariantKeys: ["micro"]
9560
+ },
9561
+ designPatch: {
9562
+ sectionHeight: "banner"
9563
+ }
9564
+ }
9565
+ ],
9296
9566
  design: {
9297
9567
  sectionSurface: "hero-image",
9298
9568
  contentFrame: plainFrame,
9299
9569
  itemSurface: "none",
9300
9570
  transitionAfter: "soft-fade-short",
9301
9571
  emphasis: "high",
9302
- heroLegibility: "scrim-gradient"
9572
+ sectionHeight: "immersive",
9573
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
9574
+ imageSurfaceMotion: "fixed-frame"
9303
9575
  }
9304
9576
  }),
9305
9577
  defineBlockAppearancePreset({
@@ -9316,17 +9588,26 @@ var appearancePresets = [
9316
9588
  emphasis: "high"
9317
9589
  }
9318
9590
  }),
9591
+ defineBlockAppearancePreset({
9592
+ kind: "block-design",
9593
+ id: "body-text-editorial-intro",
9594
+ target: "body-text",
9595
+ label: "Editorial intro copy",
9596
+ blockKinds: ["block.body-text"],
9597
+ design: {
9598
+ sectionSurface: "base",
9599
+ contentFrame: plainFrame,
9600
+ itemSurface: "none",
9601
+ transitionAfter: "soft-fade-short",
9602
+ emphasis: "high"
9603
+ }
9604
+ }),
9319
9605
  defineBlockAppearancePreset({
9320
9606
  kind: "block-design",
9321
9607
  id: "offerings-calm-list",
9322
9608
  target: "offerings",
9323
9609
  label: "Calm offerings list",
9324
- blockKinds: [
9325
- "block.event-listing",
9326
- "block.event-calendar",
9327
- "block.event-spotlight",
9328
- "block.product-list"
9329
- ],
9610
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
9330
9611
  design: {
9331
9612
  sectionSurface: "muted-band",
9332
9613
  contentFrame: plainFrame,
@@ -9405,6 +9686,35 @@ var appearancePresets = [
9405
9686
  emphasis: "high"
9406
9687
  }
9407
9688
  }),
9689
+ defineBlockAppearancePreset({
9690
+ kind: "block-design",
9691
+ id: "testimonials-dark-proof",
9692
+ target: "testimonials",
9693
+ label: "Dark proof panel",
9694
+ blockKinds: ["block.testimonials"],
9695
+ design: {
9696
+ sectionSurface: "accent-band",
9697
+ contentFrame: panelFrame("raised"),
9698
+ itemSurface: "raised",
9699
+ transitionAfter: "soft-fade-short",
9700
+ emphasis: "high"
9701
+ }
9702
+ }),
9703
+ defineBlockAppearancePreset({
9704
+ kind: "block-design",
9705
+ id: "testimonials-accent-quote-proof",
9706
+ target: "testimonials",
9707
+ label: "Accent quote proof",
9708
+ blockKinds: ["block.testimonials"],
9709
+ design: {
9710
+ sectionSurface: "accent-band",
9711
+ contentFrame: plainFrame,
9712
+ itemSurface: "raised",
9713
+ transitionAfter: "soft-fade-short",
9714
+ emphasis: "high",
9715
+ testimonialCardTreatment: "accent-quote"
9716
+ }
9717
+ }),
9408
9718
  defineBlockAppearancePreset({
9409
9719
  kind: "block-design",
9410
9720
  id: "faq-contained-help",
@@ -9433,6 +9743,20 @@ var appearancePresets = [
9433
9743
  emphasis: "medium"
9434
9744
  }
9435
9745
  }),
9746
+ defineBlockAppearancePreset({
9747
+ kind: "block-design",
9748
+ id: "contact-form-dark-card",
9749
+ target: "contact-form",
9750
+ label: "Dark form card",
9751
+ blockKinds: ["block.form"],
9752
+ design: {
9753
+ sectionSurface: "accent-band",
9754
+ contentFrame: panelFrame("raised"),
9755
+ itemSurface: "none",
9756
+ transitionAfter: "soft-fade-short",
9757
+ emphasis: "high"
9758
+ }
9759
+ }),
9436
9760
  defineBlockAppearancePreset({
9437
9761
  kind: "block-design",
9438
9762
  id: "cta-accent-band",
@@ -9452,9 +9776,33 @@ var appearancePresets = [
9452
9776
  id: "header-clean-base",
9453
9777
  target: "site-header",
9454
9778
  label: "Clean base header",
9455
- chrome: {
9456
- surface: "base",
9457
- emphasis: "medium"
9779
+ header: {
9780
+ surface: {
9781
+ kind: "neutral-solid",
9782
+ token: "surface",
9783
+ textColorToken: "text"
9784
+ },
9785
+ navTreatment: "minimal",
9786
+ dropdownTreatment: "surface",
9787
+ ctaTreatment: "default",
9788
+ behavior: "default"
9789
+ }
9790
+ }),
9791
+ defineSiteChromeAppearancePreset({
9792
+ kind: "site-chrome",
9793
+ id: "site-header-brand-solid-inverted-cta",
9794
+ target: "site-header",
9795
+ label: "Brand solid header with inverted CTA",
9796
+ header: {
9797
+ surface: {
9798
+ kind: "brand-solid",
9799
+ token: "primary",
9800
+ textColorToken: "primaryForeground"
9801
+ },
9802
+ navTreatment: "uppercase-underline",
9803
+ dropdownTreatment: "matched-solid",
9804
+ ctaTreatment: "inverted",
9805
+ behavior: "sticky-shrink"
9458
9806
  }
9459
9807
  }),
9460
9808
  defineSiteChromeAppearancePreset({
@@ -9462,10 +9810,31 @@ var appearancePresets = [
9462
9810
  id: "footer-muted-grounding",
9463
9811
  target: "site-footer",
9464
9812
  label: "Muted grounding footer",
9465
- chrome: {
9813
+ footer: {
9814
+ kind: "grounding",
9466
9815
  surface: "muted-band",
9467
9816
  emphasis: "low"
9468
9817
  }
9818
+ }),
9819
+ defineSiteChromeAppearancePreset({
9820
+ kind: "site-chrome",
9821
+ id: "site-footer-brand-two-band",
9822
+ target: "site-footer",
9823
+ label: "Two-band brand footer",
9824
+ footer: {
9825
+ kind: "brand-two-band",
9826
+ surface: {
9827
+ token: "primary",
9828
+ shade: "800",
9829
+ textColorToken: "primaryForeground"
9830
+ },
9831
+ bottomBand: {
9832
+ token: "primary",
9833
+ shade: "900",
9834
+ textColorToken: "primaryForeground"
9835
+ },
9836
+ emphasis: "high"
9837
+ }
9469
9838
  })
9470
9839
  ];
9471
9840
 
@@ -10125,6 +10494,111 @@ var pebble = defineButtonPersonality({
10125
10494
  }
10126
10495
  });
10127
10496
 
10497
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
10498
+ var showtimePill = defineButtonPersonality({
10499
+ id: "showtime-pill",
10500
+ name: "Showtime Pill",
10501
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10502
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
10503
+ buttonSystem: {
10504
+ global: {
10505
+ cornerStyle: "pill",
10506
+ shadow: "low",
10507
+ textTransform: "uppercase",
10508
+ fontWeight: 700,
10509
+ borderWidth: 2,
10510
+ hoverTransform: "lift",
10511
+ hoverColor: "darken",
10512
+ typography: "body",
10513
+ paddingPreset: "spacious",
10514
+ italic: false
10515
+ },
10516
+ sizes: {
10517
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
10518
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
10519
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
10520
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
10521
+ },
10522
+ variants: [
10523
+ {
10524
+ id: "primary",
10525
+ name: "Primary",
10526
+ enabled: true,
10527
+ priority: 1,
10528
+ background: { type: "solid", colorToken: "primary" },
10529
+ textColorToken: "background",
10530
+ borderRadius: "rounded-full",
10531
+ effects: {
10532
+ hover: [{ effectId: "pop" }]
10533
+ }
10534
+ },
10535
+ {
10536
+ id: "secondary",
10537
+ name: "Secondary",
10538
+ enabled: true,
10539
+ priority: 2,
10540
+ background: { type: "transparent" },
10541
+ textColorToken: "primary",
10542
+ borderRadius: "rounded-full",
10543
+ border: { widthClass: "border-2", colorToken: "primary" },
10544
+ effects: {
10545
+ hover: [{ effectId: "pop" }]
10546
+ }
10547
+ },
10548
+ {
10549
+ id: "hero",
10550
+ name: "Hero",
10551
+ enabled: true,
10552
+ priority: 1,
10553
+ background: { type: "solid", colorToken: "secondary" },
10554
+ textColorToken: "primary",
10555
+ borderRadius: "rounded-full",
10556
+ effects: {
10557
+ hover: [{ effectId: "pop" }]
10558
+ }
10559
+ },
10560
+ {
10561
+ id: "header",
10562
+ name: "Header",
10563
+ enabled: true,
10564
+ priority: 2,
10565
+ background: { type: "solid", colorToken: "background" },
10566
+ textColorToken: "primary",
10567
+ borderRadius: "rounded-full",
10568
+ border: { widthClass: "border-2", colorToken: "primary" },
10569
+ effects: {
10570
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10571
+ }
10572
+ },
10573
+ {
10574
+ id: "outline",
10575
+ name: "Outline",
10576
+ enabled: true,
10577
+ priority: 3,
10578
+ background: { type: "transparent" },
10579
+ textColorToken: "primary",
10580
+ borderRadius: "rounded-full",
10581
+ border: { widthClass: "border-2", colorToken: "primary" },
10582
+ effects: {
10583
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
10584
+ }
10585
+ },
10586
+ {
10587
+ id: "ghost",
10588
+ name: "Ghost",
10589
+ enabled: true,
10590
+ priority: 3,
10591
+ background: { type: "transparent" },
10592
+ textColorToken: "primary",
10593
+ borderRadius: "rounded-full",
10594
+ effects: {
10595
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10596
+ }
10597
+ }
10598
+ ]
10599
+ }
10600
+ });
10601
+
10128
10602
  // ../theme-core/src/buttons/personalities/soft-pill.ts
10129
10603
  var softPill = defineButtonPersonality({
10130
10604
  id: "soft-pill",
@@ -10205,7 +10679,8 @@ var buttonPersonalities = [
10205
10679
  editorialLink,
10206
10680
  pebble,
10207
10681
  inkStamp,
10208
- brushedWash
10682
+ brushedWash,
10683
+ showtimePill
10209
10684
  ];
10210
10685
  var personalitiesById = new Map(
10211
10686
  buttonPersonalities.map((p) => [p.id, p])
@@ -10736,14 +11211,7 @@ var proseLinkStyleSchema = z21.object({
10736
11211
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
10737
11212
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
10738
11213
  });
10739
- var semanticSpacingSchema = z21.enum([
10740
- "none",
10741
- "compact",
10742
- "cozy",
10743
- "medium",
10744
- "comfortable",
10745
- "spacious"
10746
- ]);
11214
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
10747
11215
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
10748
11216
  var boxBackgroundOverlaySchema = z21.object({
10749
11217
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -10760,6 +11228,7 @@ var boxBackgroundSchema = z21.object({
10760
11228
  scale: z21.string().nullable().optional(),
10761
11229
  position: z21.string().nullable().optional(),
10762
11230
  opacity: z21.number().min(0).max(1).nullable().optional(),
11231
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
10763
11232
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
10764
11233
  textColor: z21.string().nullable().optional(),
10765
11234
  headingColor: z21.string().nullable().optional()
@@ -10767,7 +11236,7 @@ var boxBackgroundSchema = z21.object({
10767
11236
  var sectionStylesOverrideSchema = z21.object({
10768
11237
  background: boxBackgroundSchema.nullable().optional(),
10769
11238
  spacing: semanticSpacingSchema.nullable().optional(),
10770
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
11239
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
10771
11240
  });
10772
11241
  var containerStylesOverrideSchema = z21.object({
10773
11242
  background: boxBackgroundSchema.nullable().optional(),
@@ -10786,7 +11255,8 @@ var cardStylesOverrideSchema = z21.object({
10786
11255
  border: cardBorderOverrideSchema.nullable().optional(),
10787
11256
  spacing: semanticSpacingSchema.nullable().optional(),
10788
11257
  raised: z21.boolean().nullable().optional(),
10789
- rounded: boxRoundedSchema.nullable().optional()
11258
+ rounded: boxRoundedSchema.nullable().optional(),
11259
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
10790
11260
  });
10791
11261
  var blockStyleOverridesSchema = z21.object({
10792
11262
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -10861,15 +11331,7 @@ var inputStyle = z21.object({
10861
11331
  });
10862
11332
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
10863
11333
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
10864
- var headerNavStyle = z21.enum([
10865
- "minimal",
10866
- "underline",
10867
- "underline-grow",
10868
- "capsule",
10869
- "scale",
10870
- "frosted",
10871
- "solid"
10872
- ]);
11334
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
10873
11335
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
10874
11336
  var headerMaxWidth = z21.enum(["container", "full"]);
10875
11337
  var headerContainerSchema = z21.object({
@@ -10923,6 +11385,7 @@ var dropdownStyleSchema = z21.object({
10923
11385
  // optional = no override (browser default)
10924
11386
  }).optional();
10925
11387
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11388
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
10926
11389
  var navContainerSchema = z21.object({
10927
11390
  type: z21.enum(["none", "pill", "glass"]).default("none"),
10928
11391
  tint: z21.string().nullable().optional(),
@@ -10941,7 +11404,10 @@ var headerSchema = z21.object({
10941
11404
  shrinkOnScroll: z21.boolean(),
10942
11405
  maxWidth: headerMaxWidth,
10943
11406
  logoOverride: mediaSchema.nullable().optional(),
10944
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
11407
+ background: headerBackgroundSchema.default({
11408
+ type: "color",
11409
+ color: "surface"
11410
+ }),
10945
11411
  textColor: z21.string().nullable().optional(),
10946
11412
  // Site title and general header text
10947
11413
  navStyle: headerNavStyle,
@@ -10961,6 +11427,13 @@ var headerSchema = z21.object({
10961
11427
  navLinkStyle: navLinkStyleSchema.optional(),
10962
11428
  // CTA button spacing (desktop left margin)
10963
11429
  ctaGap: headerCtaGapSchema.optional(),
11430
+ // Semantic CTA treatment for header/nav CTA buttons. The Theme V2 compiler
11431
+ // materializes this to ctaVariant against the active button personality.
11432
+ ctaTreatment: headerCtaTreatmentSchema.optional(),
11433
+ // Optional theme-level CTA variant for header/nav CTA buttons.
11434
+ // Internal runtime bridge for the block renderer; prefer ctaTreatment in
11435
+ // authored Theme V2 concepts.
11436
+ ctaVariant: z21.string().min(1).optional(),
10964
11437
  // Dropdown menu styling (nav dropdowns and mobile drawer)
10965
11438
  dropdownStyle: dropdownStyleSchema
10966
11439
  });
@@ -11017,7 +11490,10 @@ var footerSchema = z21.object({
11017
11490
  variant: footerVariant,
11018
11491
  maxWidth: footerMaxWidth,
11019
11492
  showLogoText: z21.boolean().optional(),
11020
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
11493
+ background: headerBackgroundSchema.default({
11494
+ type: "color",
11495
+ color: "surface"
11496
+ }),
11021
11497
  // Footer nav styling (independent from header)
11022
11498
  navStyle: headerNavStyle.default("minimal"),
11023
11499
  navColor: z21.string().nullable().optional(),
@@ -11039,17 +11515,7 @@ var layoutSchema = z21.object({
11039
11515
  desktop: containerPaddingPresetSchema.optional()
11040
11516
  }).optional()
11041
11517
  }).optional();
11042
- var heroTypographySizeSchema = z21.enum([
11043
- "sm",
11044
- "base",
11045
- "lg",
11046
- "xl",
11047
- "2xl",
11048
- "3xl",
11049
- "4xl",
11050
- "5xl",
11051
- "6xl"
11052
- ]);
11518
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
11053
11519
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
11054
11520
  var heroResponsiveTypographySchema = z21.object({
11055
11521
  headlineSize: heroTypographySizeSchema.optional(),
@@ -11074,6 +11540,13 @@ var heroTypographySchema = z21.object({
11074
11540
  var heroSchema = z21.object({
11075
11541
  typography: heroTypographySchema.optional()
11076
11542
  }).optional();
11543
+ var bodyTextIntroTypographySizeSchema = z21.enum(["default", "editorial"]);
11544
+ var bodyTextSchema = z21.object({
11545
+ intro: z21.object({
11546
+ paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
11547
+ headingSize: bodyTextIntroTypographySizeSchema.optional()
11548
+ }).optional()
11549
+ }).optional();
11077
11550
  var gradientsSchema = z21.object({
11078
11551
  button: z21.string().min(1).nullable().optional(),
11079
11552
  hero: z21.string().min(1).nullable().optional(),
@@ -11095,6 +11568,7 @@ var themeSchema = z21.object({
11095
11568
  gradients: gradientsSchema.optional(),
11096
11569
  layout: layoutSchema,
11097
11570
  hero: heroSchema,
11571
+ bodyText: bodyTextSchema,
11098
11572
  header: headerSchema,
11099
11573
  footer: footerSchema,
11100
11574
  buttons: buttonSystemSchema.optional(),
@@ -11118,10 +11592,7 @@ var themeSchema = z21.object({
11118
11592
  ).optional(),
11119
11593
  // Structured block-kind theme overrides (v1: typography prose-link style only)
11120
11594
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
11121
- blockOverrides: z21.record(
11122
- z21.string(),
11123
- blockThemeOverrideSchema
11124
- ).optional(),
11595
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
11125
11596
  // Structured custom CSS rules
11126
11597
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
11127
11598
  customCssRules: customCssRulesSchema,
@@ -11292,6 +11763,28 @@ var brandLedJewel = definePaletteVariant({
11292
11763
  { name: "border", hex: "#a8a29e" }
11293
11764
  ]
11294
11765
  });
11766
+ var brandLedBurgundyGold = definePaletteVariant({
11767
+ id: "brand-led-burgundy-gold",
11768
+ name: "Brand-led \u2014 Burgundy Gold",
11769
+ description: "Deep burgundy with warm gold accents and soft neutral grounds.",
11770
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
11771
+ mode: "light",
11772
+ colors: [
11773
+ { name: "primary", hex: "#7c2e38" },
11774
+ { name: "secondary", hex: "#d4af37" },
11775
+ { name: "accent", hex: "#b8e19a" },
11776
+ { name: "success", hex: "#10b981" },
11777
+ { name: "warning", hex: "#f59e0b" },
11778
+ { name: "destructive", hex: "#ef4444" },
11779
+ { name: "background", hex: "#f1dfd0" },
11780
+ { name: "surface", hex: "#f5e6db" },
11781
+ { name: "surfaceAlt", hex: "#f8ece3" },
11782
+ { name: "muted", hex: "#c9b8a8" },
11783
+ { name: "text", hex: "#400000" },
11784
+ { name: "primaryForeground", hex: "#ffffff" },
11785
+ { name: "border", hex: "#c9b8a8" }
11786
+ ]
11787
+ });
11295
11788
 
11296
11789
  // ../theme-core/src/palette/variants/high-contrast.ts
11297
11790
  var highContrastInk = definePaletteVariant({
@@ -11503,6 +11996,7 @@ var paletteVariants = [
11503
11996
  brandLedCool,
11504
11997
  brandLedWarm,
11505
11998
  brandLedJewel,
11999
+ brandLedBurgundyGold,
11506
12000
  // Warm-neutral family
11507
12001
  warmNeutralClay,
11508
12002
  warmNeutralCream,
@@ -11578,7 +12072,8 @@ var curatedSiteStyleIdValues = [
11578
12072
  "site-style:quiet-luxury",
11579
12073
  "site-style:practical-services",
11580
12074
  "site-style:modern-wellness",
11581
- "site-style:bold-launch"
12075
+ "site-style:bold-launch",
12076
+ "site-style:south-west-twerk-school"
11582
12077
  ];
11583
12078
  var quietBudget = {
11584
12079
  accentDensity: "low",
@@ -11633,6 +12128,8 @@ function defineCuratedSiteStyle(input) {
11633
12128
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
11634
12129
  supportedTransitions: generatedDesignOptionCatalog.transitions
11635
12130
  },
12131
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12132
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
11636
12133
  buttonPersonalityChoices: input.buttonPersonalityChoices,
11637
12134
  paletteVariantChoices: input.paletteVariantChoices
11638
12135
  };
@@ -11879,6 +12376,101 @@ var curatedSiteStyles = [
11879
12376
  paletteChoice("brand-led-jewel"),
11880
12377
  paletteChoice("brand-led-warm")
11881
12378
  ]
12379
+ }),
12380
+ defineCuratedSiteStyle({
12381
+ id: "site-style:south-west-twerk-school",
12382
+ name: "South West Twerk School",
12383
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
12384
+ generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
12385
+ selectionKeywords: [
12386
+ "dance",
12387
+ "classes",
12388
+ "workshop",
12389
+ "school",
12390
+ "movement",
12391
+ "performance",
12392
+ "community"
12393
+ ],
12394
+ tokenRecipes: {
12395
+ palette: "brand-led",
12396
+ contrast: "maximum",
12397
+ radius: "soft",
12398
+ shadow: "layered",
12399
+ typography: "clean-sans",
12400
+ spacing: "airy",
12401
+ motion: "expressive"
12402
+ },
12403
+ compositionBudget: expressiveBudget,
12404
+ themeOverrides: {
12405
+ typography: {
12406
+ body: {
12407
+ family: "Manrope, system-ui, sans-serif",
12408
+ size: "lg",
12409
+ weight: "regular",
12410
+ lineHeight: "relaxed",
12411
+ letterSpacing: "normal"
12412
+ },
12413
+ headings: {
12414
+ default: {
12415
+ family: '"TAN - PEARL", sans-serif',
12416
+ weight: "bold",
12417
+ lineHeight: "normal",
12418
+ letterSpacing: "tight",
12419
+ colorToken: "primary",
12420
+ italic: null,
12421
+ case: null
12422
+ },
12423
+ h1: {
12424
+ size: "xl",
12425
+ weight: "bold",
12426
+ lineHeight: "normal",
12427
+ letterSpacing: "tight",
12428
+ italic: null
12429
+ },
12430
+ h2: {
12431
+ size: "lg",
12432
+ weight: "bold",
12433
+ lineHeight: "normal",
12434
+ letterSpacing: "normal",
12435
+ italic: null
12436
+ },
12437
+ h3: {
12438
+ size: "md",
12439
+ weight: "bold",
12440
+ lineHeight: "normal",
12441
+ letterSpacing: "normal",
12442
+ italic: null
12443
+ }
12444
+ },
12445
+ scale: "balanced"
12446
+ },
12447
+ bodyText: {
12448
+ intro: {
12449
+ paragraphSize: "editorial",
12450
+ headingSize: "editorial"
12451
+ }
12452
+ }
12453
+ },
12454
+ recommendedAppearancePresetIds: [
12455
+ "site-header-brand-solid-inverted-cta",
12456
+ "site-footer-brand-two-band",
12457
+ "hero-brand-scrim-fixed-frame",
12458
+ "body-text-editorial-intro",
12459
+ "testimonials-accent-quote-proof",
12460
+ "contact-form-dark-card"
12461
+ ],
12462
+ buttonPersonalityChoices: [
12463
+ buttonChoice("showtime-pill"),
12464
+ buttonChoice("confident-chip"),
12465
+ buttonChoice("ink-stamp"),
12466
+ buttonChoice("brushed-wash")
12467
+ ],
12468
+ paletteVariantChoices: [
12469
+ paletteChoice("brand-led-burgundy-gold"),
12470
+ paletteChoice("brand-led-jewel"),
12471
+ paletteChoice("brand-led-warm"),
12472
+ paletteChoice("high-contrast-ink")
12473
+ ]
11882
12474
  })
11883
12475
  ];
11884
12476
  var curatedSiteStylesById = new Map(
@@ -11923,6 +12515,40 @@ var heroLegibilityStrategySchema = z23.enum([
11923
12515
  "scrim-gradient",
11924
12516
  "solid-panel"
11925
12517
  ]);
12518
+ var sectionHeightIntentSchema = z23.enum([
12519
+ "default",
12520
+ "banner",
12521
+ "hero",
12522
+ "immersive"
12523
+ ]);
12524
+ var imageSurfaceTreatmentIntensitySchema = z23.enum(["soft", "balanced", "strong"]);
12525
+ var imageSurfaceMotionSchema = z23.enum(["static", "fixed-frame"]);
12526
+ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
12527
+ z23.object({ kind: z23.literal("none") }).strict(),
12528
+ z23.object({
12529
+ kind: z23.literal("brand-scrim"),
12530
+ token: z23.enum(["primary", "secondary", "accent"]),
12531
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
12532
+ }).strict(),
12533
+ z23.object({
12534
+ kind: z23.literal("brand-wash"),
12535
+ token: z23.enum(["primary", "secondary", "accent"]),
12536
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
12537
+ }).strict(),
12538
+ z23.object({
12539
+ kind: z23.literal("neutral-scrim"),
12540
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
12541
+ }).strict(),
12542
+ z23.object({
12543
+ kind: z23.literal("neutral-wash"),
12544
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
12545
+ }).strict(),
12546
+ z23.object({
12547
+ kind: z23.literal("solid-panel"),
12548
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
12549
+ }).strict()
12550
+ ]);
12551
+ var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
11926
12552
  function uniqueNonEmpty(values) {
11927
12553
  const uniqueValues = [...new Set(values)];
11928
12554
  const firstValue = uniqueValues[0];
@@ -11961,7 +12587,11 @@ var blockDesignPlanSchema = z23.object({
11961
12587
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
11962
12588
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
11963
12589
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
11964
- heroLegibility: heroLegibilityStrategySchema.optional()
12590
+ sectionHeight: sectionHeightIntentSchema.optional(),
12591
+ heroLegibility: heroLegibilityStrategySchema.optional(),
12592
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
12593
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
12594
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
11965
12595
  }).strict();
11966
12596
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
11967
12597
  z23.object({
@@ -13387,6 +14017,7 @@ var SEMANTIC_SPACING_VALUES = [
13387
14017
  ];
13388
14018
  var SECTION_MIN_HEIGHT_VALUES = [
13389
14019
  "none",
14020
+ "banner",
13390
14021
  "hero",
13391
14022
  "immersive"
13392
14023
  ];
@@ -13414,6 +14045,7 @@ var CONTAINER_SPACING_MAP = {
13414
14045
  };
13415
14046
  var SECTION_MIN_HEIGHT_MAP = {
13416
14047
  none: "",
14048
+ banner: "rb-section-min-h-banner",
13417
14049
  hero: "rb-section-min-h-hero",
13418
14050
  immersive: "rb-section-min-h-immersive"
13419
14051
  };
@@ -14204,6 +14836,9 @@ var boxStylesCompositeTransform = {
14204
14836
  classes.push(roundedResult);
14205
14837
  }
14206
14838
  }
14839
+ if (input.treatment === "accent-quote") {
14840
+ classes.push("rb-card-treatment-accent-quote");
14841
+ }
14207
14842
  return classes.join(" ").trim() || "";
14208
14843
  }
14209
14844
  };
@@ -14301,7 +14936,7 @@ var sectionClassNameTransform = {
14301
14936
  minHeight = input.minHeight;
14302
14937
  } else if (process.env.NODE_ENV !== "production") {
14303
14938
  console.warn(
14304
- `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, hero, immersive.`
14939
+ `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, banner, hero, immersive.`
14305
14940
  );
14306
14941
  }
14307
14942
  }
@@ -14624,23 +15259,6 @@ function styledCard(children, opts, ...mods) {
14624
15259
  );
14625
15260
  }
14626
15261
 
14627
- // ../blocks/src/system/node/fragments/typography.ts
14628
- function mergeClassName(base, extra) {
14629
- return [base, extra ?? ""].filter(Boolean).join(" ");
14630
- }
14631
- function captionText(opts, ...mods) {
14632
- const {
14633
- as: asProp,
14634
- className: classNameProp,
14635
- color,
14636
- ...rest
14637
- } = opts ?? {};
14638
- const as = asProp ?? "p";
14639
- const className = mergeClassName("rb-caption", classNameProp);
14640
- const style = textColorStyle(color ?? "mutedText");
14641
- return text({ ...rest, as, className, style }, ...mods);
14642
- }
14643
-
14644
15262
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
14645
15263
  function joinClasses(...parts) {
14646
15264
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -15545,18 +16163,17 @@ function buildAttributionNodes() {
15545
16163
  const name = text(
15546
16164
  {
15547
16165
  as: "strong",
15548
- className: "rb-block",
15549
- style: textColorStyle("text")
16166
+ className: "rb-block"
15550
16167
  },
15551
16168
  bind("testimonial.content.name", { fallback: "Anonymous" })
15552
16169
  );
15553
- const jobTitle = captionText(
15554
- null,
16170
+ const jobTitle = text(
16171
+ { as: "p", className: "rb-caption" },
15555
16172
  when("testimonial.content.jobTitle"),
15556
16173
  bind("testimonial.content.jobTitle")
15557
16174
  );
15558
- const company = captionText(
15559
- null,
16175
+ const company = text(
16176
+ { as: "p", className: "rb-caption" },
15560
16177
  when("testimonial.content.company"),
15561
16178
  bind("testimonial.content.company")
15562
16179
  );
@@ -15590,8 +16207,7 @@ function buildTestimonialCard(...mods) {
15590
16207
  );
15591
16208
  const body = richText(
15592
16209
  {
15593
- className: "rb-prose rb-max-w-none",
15594
- style: textColorStyle("text")
16210
+ className: "rb-prose rb-max-w-none"
15595
16211
  },
15596
16212
  bind("testimonial.content.body"),
15597
16213
  when("testimonial.content.body")
@@ -17221,6 +17837,7 @@ function heroContentCard(children, gap) {
17221
17837
  return styledContainer({
17222
17838
  bindFrom: "_contentCardStyles",
17223
17839
  constrainWidth: false,
17840
+ baseClassName: "rb-relative rb-isolate",
17224
17841
  rootType: "stack",
17225
17842
  rootProps: {
17226
17843
  gap
@@ -17251,6 +17868,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
17251
17868
  function heroContainerStack(children, gap) {
17252
17869
  return styledContainer({
17253
17870
  rootType: "stack",
17871
+ baseClassName: "rb-relative rb-isolate",
17254
17872
  rootProps: {
17255
17873
  gap: "none",
17256
17874
  justify: {
@@ -18469,7 +19087,7 @@ function resolveHeroVerticalAlignment(content) {
18469
19087
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
18470
19088
  const sectionStyles = asPartialObject(content._sectionStyles);
18471
19089
  const minHeight = sectionStyles?.minHeight;
18472
- if (minHeight === "hero" || minHeight === "immersive") return "center";
19090
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
18473
19091
  const variant = resolveHeroVariant(content);
18474
19092
  if (variant === "split" || variant === "splitReverse") return "center";
18475
19093
  return "top";
@@ -19227,6 +19845,26 @@ var footerSplitNavSingleClassTransform = {
19227
19845
  ]);
19228
19846
  }
19229
19847
  };
19848
+ var footerSplitMainClassSchema = z35.object({
19849
+ base: z35.string().optional(),
19850
+ reverseClass: z35.string().optional()
19851
+ });
19852
+ var footerSplitMainClassTransform = {
19853
+ id: "layout.footerSplitMainClass",
19854
+ kind: "string",
19855
+ summary: "Compose split-footer main row classes from footer logo placement",
19856
+ schema: footerSplitMainClassSchema,
19857
+ run: (value, options) => {
19858
+ const logo = asPartialObject(value);
19859
+ const placement = logo?.placement ?? "right";
19860
+ const shouldPlaceLogoFirst = placement === "left" || placement === "above";
19861
+ const baseClass = shouldPlaceLogoFirst ? "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-end rb-gap-8 rb-md-flex-row rb-md-items-end" : "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end";
19862
+ return joinClasses4([
19863
+ options.base ?? baseClass,
19864
+ shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null
19865
+ ]);
19866
+ }
19867
+ };
19230
19868
  var footerLogoClassSchema = z35.object({
19231
19869
  base: z35.string().optional()
19232
19870
  });
@@ -19237,14 +19875,11 @@ var footerLogoClassTransform = {
19237
19875
  schema: footerLogoClassSchema,
19238
19876
  run: (value, options) => {
19239
19877
  const logo = asPartialObject(value);
19240
- const placement = logo?.placement ?? "right";
19241
19878
  const align = logo?.align ?? "end";
19242
19879
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
19243
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
19244
19880
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
19245
19881
  return joinClasses4([
19246
19882
  options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80",
19247
- orderClass,
19248
19883
  selfAlignClass,
19249
19884
  hiddenClass
19250
19885
  ]);
@@ -19299,6 +19934,7 @@ var layoutTransforms = [
19299
19934
  footerBottomBarContainerClassTransform,
19300
19935
  footerBottomBarStyleTransform,
19301
19936
  footerSplitNavSingleClassTransform,
19937
+ footerSplitMainClassTransform,
19302
19938
  footerLogoClassTransform,
19303
19939
  footerLogoMediaClassTransform,
19304
19940
  footerLogoTextVisibleTransform
@@ -19575,7 +20211,7 @@ var createNavRow = (className, align = "end") => navRow({
19575
20211
  var headerCta = ctaButton({
19576
20212
  basePath: "menu.ctaItem",
19577
20213
  whenPath: "menu.ctaItem.label",
19578
- variantPath: "menu.ctaItem.variant",
20214
+ variantPath: "$root.theme.header.ctaVariant",
19579
20215
  linkPath: "menu.ctaItem.link",
19580
20216
  sizeFallback: "sm",
19581
20217
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -19583,7 +20219,7 @@ var headerCta = ctaButton({
19583
20219
  var mobileCta = ctaButton({
19584
20220
  basePath: "menu.ctaItem",
19585
20221
  whenPath: "menu.ctaItem.label",
19586
- variantPath: "menu.ctaItem.variant",
20222
+ variantPath: "$root.theme.header.ctaVariant",
19587
20223
  linkPath: "menu.ctaItem.link",
19588
20224
  sizeFallback: "md",
19589
20225
  className: "nav-mobile-cta rb-w-full"
@@ -20044,7 +20680,13 @@ var splitFooterLayout = stack(
20044
20680
  [
20045
20681
  inline(
20046
20682
  {
20047
- className: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
20683
+ className: {
20684
+ $bind: {
20685
+ from: "$root.theme.footer.logo",
20686
+ transforms: [{ id: "layout.footerSplitMainClass" }],
20687
+ fallback: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
20688
+ }
20689
+ }
20048
20690
  },
20049
20691
  [
20050
20692
  stack(
@@ -22132,7 +22774,8 @@ var courseEntrySubrouteContextSchema = z47.union([
22132
22774
  run: z47.object({
22133
22775
  courseId: z47.string(),
22134
22776
  seriesId: z47.string(),
22135
- runSlug: z47.string()
22777
+ runSlug: z47.string(),
22778
+ runName: z47.string().nullable()
22136
22779
  })
22137
22780
  }),
22138
22781
  z47.object({
@@ -28079,6 +28722,34 @@ function panelCapable() {
28079
28722
  itemSurfaces: "unsupported"
28080
28723
  });
28081
28724
  }
28725
+ var heroSectionHeights = [
28726
+ "default",
28727
+ "banner",
28728
+ "hero",
28729
+ "immersive"
28730
+ ];
28731
+ var heroImageSurfaceTreatments = [
28732
+ "none",
28733
+ "brand-scrim",
28734
+ "brand-wash",
28735
+ "neutral-scrim",
28736
+ "neutral-wash",
28737
+ "solid-panel"
28738
+ ];
28739
+ var heroImageSurfaceMotions = [
28740
+ "static",
28741
+ "fixed-frame"
28742
+ ];
28743
+ function heroCapable() {
28744
+ return declareBlockDesignCapability({
28745
+ sectionSurfaces: "supported",
28746
+ contentFrames: ["plain", "panel"],
28747
+ itemSurfaces: "unsupported",
28748
+ sectionHeights: heroSectionHeights,
28749
+ imageSurfaceTreatments: heroImageSurfaceTreatments,
28750
+ imageSurfaceMotions: heroImageSurfaceMotions
28751
+ });
28752
+ }
28082
28753
  function plainItemsCapable() {
28083
28754
  return declareBlockDesignCapability({
28084
28755
  sectionSurfaces: "supported",
@@ -28195,7 +28866,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
28195
28866
  };
28196
28867
  }
28197
28868
  var systemBlockDefinitionsRaw = [
28198
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
28869
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
28199
28870
  flow: heroFlow,
28200
28871
  layoutProfiles: [
28201
28872
  layoutProfile({
@@ -28299,7 +28970,12 @@ var systemBlockDefinitionsRaw = [
28299
28970
  flow: siteChromeFlow,
28300
28971
  layoutProfiles: []
28301
28972
  })),
28302
- withDesignCapability("block.testimonials", testimonialsBlockDefinition, panelAndItemsCapable(), defineBlockDesignMetadata({
28973
+ withDesignCapability("block.testimonials", testimonialsBlockDefinition, declareBlockDesignCapability({
28974
+ sectionSurfaces: "supported",
28975
+ contentFrames: ["plain", "panel"],
28976
+ itemSurfaces: "supported",
28977
+ testimonialCardTreatments: ["default", "accent-quote"]
28978
+ }), defineBlockDesignMetadata({
28303
28979
  flow: proofFlow,
28304
28980
  layoutProfiles: [
28305
28981
  layoutProfile({
@@ -28611,8 +29287,15 @@ function parseOpacity(value) {
28611
29287
  }
28612
29288
  return opacity <= 1 ? opacity : opacity / 100;
28613
29289
  }
28614
- function appendOptionalClasses(baseClassName, optionalClassName) {
28615
- return optionalClassName ? `${baseClassName} ${optionalClassName}` : baseClassName;
29290
+ function backgroundMotionClassNames(input) {
29291
+ return input.motion === "fixed-frame" ? "rb-bg-motion-fixed-frame" : "";
29292
+ }
29293
+ function appendBackgroundMediaClasses(baseClassName, input) {
29294
+ return [
29295
+ baseClassName,
29296
+ backgroundMotionClassNames(input),
29297
+ backgroundVideoMobileClassNames(input)
29298
+ ].filter(Boolean).join(" ");
28616
29299
  }
28617
29300
  var resolveImageStyleTransform = {
28618
29301
  id: "background.resolveImageStyle",
@@ -28689,9 +29372,9 @@ var resolveImageClassNameTransform = {
28689
29372
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
28690
29373
  const position = isString(input.position) ? input.position.trim() : null;
28691
29374
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
28692
- return appendOptionalClasses(
29375
+ return appendBackgroundMediaClasses(
28693
29376
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
28694
- backgroundVideoMobileClassNames(input)
29377
+ input
28695
29378
  );
28696
29379
  }
28697
29380
  let needsAnchoring = false;
@@ -28704,18 +29387,18 @@ var resolveImageClassNameTransform = {
28704
29387
  }
28705
29388
  }
28706
29389
  if (!needsAnchoring) {
28707
- return appendOptionalClasses(
29390
+ return appendBackgroundMediaClasses(
28708
29391
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
28709
- backgroundVideoMobileClassNames(input)
29392
+ input
28710
29393
  );
28711
29394
  }
28712
29395
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
28713
29396
  const isCustom = position && !isPreset;
28714
29397
  if (isCustom) {
28715
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
29398
+ return appendBackgroundMediaClasses(baseClass, input);
28716
29399
  }
28717
29400
  const anchorClasses = getAnchorClasses(position);
28718
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
29401
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
28719
29402
  }
28720
29403
  };
28721
29404
  var resolveOverlayStyleTransform = {