@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
@@ -636,7 +636,7 @@ var ENDPOINT_DEFINITIONS = {
636
636
  method: "GET",
637
637
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
638
638
  auth: "user",
639
- responseKind: "text"
639
+ responseKind: "blob"
640
640
  },
641
641
  getNewsletterSubscriber: {
642
642
  path: "/sites/{siteId}/newsletter/subscribers/{subscriberId}",
@@ -967,12 +967,7 @@ var ENDPOINT_DEFINITIONS = {
967
967
  ],
968
968
  auth: "user",
969
969
  responseKind: "json",
970
- errors: [
971
- "validation:invalid_input",
972
- "resource:not_found",
973
- "resource:conflict",
974
- "server:internal_error"
975
- ]
970
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
976
971
  },
977
972
  unpublishTeamMemberProfile: {
978
973
  path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
@@ -1225,6 +1220,13 @@ var ENDPOINT_DEFINITIONS = {
1225
1220
  auth: "user",
1226
1221
  responseKind: "json"
1227
1222
  },
1223
+ exportBookingAppointmentsCsv: {
1224
+ path: "/sites/{siteId}/bookings/appointments/export.csv",
1225
+ method: "GET",
1226
+ auth: "user",
1227
+ errors: [],
1228
+ responseKind: "blob"
1229
+ },
1228
1230
  createAppointment: {
1229
1231
  path: "/sites/{siteId}/bookings/appointments",
1230
1232
  method: "POST",
@@ -1352,6 +1354,13 @@ var ENDPOINT_DEFINITIONS = {
1352
1354
  auth: "user",
1353
1355
  responseKind: "json"
1354
1356
  },
1357
+ exportCourseEnrollmentsCsv: {
1358
+ path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
1359
+ method: "GET",
1360
+ auth: "user",
1361
+ errors: [],
1362
+ responseKind: "blob"
1363
+ },
1355
1364
  listCourseWaitlist: {
1356
1365
  path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist",
1357
1366
  method: "GET",
@@ -2110,6 +2119,63 @@ var ENDPOINT_DEFINITIONS = {
2110
2119
  auth: "user",
2111
2120
  responseKind: "json"
2112
2121
  },
2122
+ updateRegisteredDomainContact: {
2123
+ path: "/domains/{domainId}/registrar/contact",
2124
+ method: "POST",
2125
+ errors: [
2126
+ "validation:invalid_input",
2127
+ "resource:not_found",
2128
+ "auth:forbidden",
2129
+ "external:service_error",
2130
+ "external:registrar_orphaned_contact_profile",
2131
+ "server:internal_error"
2132
+ ],
2133
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2134
+ auth: "user",
2135
+ responseKind: "json"
2136
+ },
2137
+ setRegisteredDomainPrivacy: {
2138
+ path: "/domains/{domainId}/registrar/privacy",
2139
+ method: "POST",
2140
+ errors: [
2141
+ "validation:invalid_input",
2142
+ "resource:not_found",
2143
+ "auth:forbidden",
2144
+ "external:service_error",
2145
+ "server:internal_error"
2146
+ ],
2147
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2148
+ auth: "user",
2149
+ responseKind: "json"
2150
+ },
2151
+ setRegisteredDomainAutoRenew: {
2152
+ path: "/domains/{domainId}/registrar/auto-renew",
2153
+ method: "POST",
2154
+ errors: [
2155
+ "validation:invalid_input",
2156
+ "resource:not_found",
2157
+ "auth:forbidden",
2158
+ "external:service_error",
2159
+ "server:internal_error"
2160
+ ],
2161
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2162
+ auth: "user",
2163
+ responseKind: "json"
2164
+ },
2165
+ getRegisteredDomainRenewalPosture: {
2166
+ path: "/domains/{domainId}/registrar/renewal",
2167
+ method: "GET",
2168
+ errors: [
2169
+ "validation:invalid_input",
2170
+ "resource:not_found",
2171
+ "auth:forbidden",
2172
+ "external:service_error",
2173
+ "server:internal_error"
2174
+ ],
2175
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2176
+ auth: "user",
2177
+ responseKind: "json"
2178
+ },
2113
2179
  retryDomainVercel: {
2114
2180
  path: "/domains/{domainId}/vercel",
2115
2181
  method: "POST",
@@ -2657,6 +2723,14 @@ var ENDPOINT_DEFINITIONS = {
2657
2723
  auth: "user",
2658
2724
  responseKind: "json"
2659
2725
  },
2726
+ exportSeoPagesCsv: {
2727
+ path: "/sites/{siteId}/seo/pages",
2728
+ method: "GET",
2729
+ tags: ["site-{siteId}", "seo-pages-{siteId}"],
2730
+ auth: "user",
2731
+ responseKind: "blob",
2732
+ errors: []
2733
+ },
2660
2734
  getSeoQueries: {
2661
2735
  path: "/sites/{siteId}/seo/queries",
2662
2736
  method: "GET",
@@ -2665,6 +2739,14 @@ var ENDPOINT_DEFINITIONS = {
2665
2739
  auth: "user",
2666
2740
  responseKind: "json"
2667
2741
  },
2742
+ exportSeoQueriesCsv: {
2743
+ path: "/sites/{siteId}/seo/queries",
2744
+ method: "GET",
2745
+ tags: ["site-{siteId}", "seo-queries-{siteId}"],
2746
+ auth: "user",
2747
+ responseKind: "blob",
2748
+ errors: []
2749
+ },
2668
2750
  getPerformanceOverview: {
2669
2751
  path: "/sites/{siteId}/performance/overview",
2670
2752
  method: "GET",
@@ -2713,7 +2795,12 @@ var ENDPOINT_DEFINITIONS = {
2713
2795
  path: "/media/{assetId}/canonical-crop",
2714
2796
  method: "POST",
2715
2797
  tags: ["media", "media-{assetId}"],
2716
- errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"],
2798
+ errors: [
2799
+ "validation:invalid_input",
2800
+ "resource:not_found",
2801
+ "resource:conflict",
2802
+ "server:internal_error"
2803
+ ],
2717
2804
  auth: "user",
2718
2805
  responseKind: "json"
2719
2806
  },
@@ -3045,7 +3132,7 @@ var ENDPOINT_DEFINITIONS = {
3045
3132
  method: "GET",
3046
3133
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3047
3134
  auth: "user",
3048
- responseKind: "text"
3135
+ responseKind: "blob"
3049
3136
  },
3050
3137
  // Public submit
3051
3138
  submitForm: {
@@ -3928,6 +4015,14 @@ var ENDPOINT_DEFINITIONS = {
3928
4015
  auth: "user",
3929
4016
  responseKind: "json"
3930
4017
  },
4018
+ exportEventSeriesAttendeesCsv: {
4019
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/attendees/export.csv",
4020
+ method: "GET",
4021
+ tags: ["site-{siteId}", "event-series-{seriesId}"],
4022
+ auth: "user",
4023
+ errors: [],
4024
+ responseKind: "blob"
4025
+ },
3931
4026
  listEventSeriesWaitlist: {
3932
4027
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3933
4028
  method: "GET",
@@ -4491,6 +4586,14 @@ var ENDPOINT_DEFINITIONS = {
4491
4586
  auth: "user",
4492
4587
  responseKind: "json"
4493
4588
  },
4589
+ exportBookingCustomersCsv: {
4590
+ path: "/sites/{siteId}/bookings/customers/export.csv",
4591
+ method: "GET",
4592
+ tags: ["site-{siteId}", "customers-{siteId}"],
4593
+ auth: "user",
4594
+ errors: [],
4595
+ responseKind: "blob"
4596
+ },
4494
4597
  createBookingCustomer: {
4495
4598
  path: "/sites/{siteId}/bookings/customers",
4496
4599
  method: "POST",
@@ -4518,6 +4621,21 @@ var ENDPOINT_DEFINITIONS = {
4518
4621
  "server:internal_error"
4519
4622
  ]
4520
4623
  },
4624
+ rectifyBookingParticipantIdentity: {
4625
+ path: "/sites/{siteId}/bookings/participants/{participantId}/identity",
4626
+ method: "PATCH",
4627
+ tags: ["site-{siteId}", "customers-{siteId}"],
4628
+ auth: "user",
4629
+ responseKind: "json",
4630
+ errors: [
4631
+ "validation:invalid_input",
4632
+ "auth:forbidden",
4633
+ "resource:not_found",
4634
+ "resource:already_exists",
4635
+ "resource:conflict",
4636
+ "server:internal_error"
4637
+ ]
4638
+ },
4521
4639
  listCustomerPasses: {
4522
4640
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4523
4641
  method: "GET",
@@ -4652,13 +4770,46 @@ var ENDPOINT_DEFINITIONS = {
4652
4770
  auth: "user",
4653
4771
  responseKind: "json"
4654
4772
  },
4773
+ exportMoneyPaymentsCsv: {
4774
+ path: "/sites/{siteId}/bookings/money/payments/export.csv",
4775
+ method: "GET",
4776
+ tags: ["site-{siteId}", "bookings", "money-payments-{siteId}"],
4777
+ errors: [],
4778
+ auth: "user",
4779
+ responseKind: "blob"
4780
+ },
4781
+ exportMoneyBreakdownsCsv: {
4782
+ path: "/sites/{siteId}/bookings/money/report/breakdowns/export.csv",
4783
+ method: "GET",
4784
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4785
+ errors: [],
4786
+ auth: "user",
4787
+ responseKind: "blob"
4788
+ },
4789
+ exportMoneyTimeSeriesCsv: {
4790
+ path: "/sites/{siteId}/bookings/money/report/time-series/export.csv",
4791
+ method: "GET",
4792
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4793
+ errors: [],
4794
+ auth: "user",
4795
+ responseKind: "blob"
4796
+ },
4655
4797
  listBookingActivity: {
4656
4798
  path: "/sites/{siteId}/bookings/activity",
4657
4799
  method: "GET",
4658
4800
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4801
+ errors: [],
4659
4802
  auth: "user",
4660
4803
  responseKind: "json"
4661
4804
  },
4805
+ exportBookingActivityCsv: {
4806
+ path: "/sites/{siteId}/bookings/activity/export.csv",
4807
+ method: "GET",
4808
+ tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4809
+ errors: [],
4810
+ auth: "user",
4811
+ responseKind: "blob"
4812
+ },
4662
4813
  // Site logs
4663
4814
  listSiteActivityLogs: {
4664
4815
  path: "/sites/{siteId}/logs/activity",
@@ -4810,13 +4961,6 @@ var ENDPOINT_DEFINITIONS = {
4810
4961
  auth: "user",
4811
4962
  responseKind: "blob"
4812
4963
  },
4813
- exportSeoCsv: {
4814
- path: "/sites/{siteId}/seo/export",
4815
- method: "GET",
4816
- tags: ["site-{siteId}", "seo"],
4817
- auth: "user",
4818
- responseKind: "blob"
4819
- },
4820
4964
  // Admin site cost (for admin panel)
4821
4965
  adminSiteCost: {
4822
4966
  path: "/admin/sites/{siteId}/cost",
@@ -7053,6 +7197,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
7053
7197
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
7054
7198
  "missing_amount",
7055
7199
  "amount_exceeds_remaining",
7200
+ "credit_refunds_disabled",
7201
+ "missing_credit_customer",
7056
7202
  "deposit_refund_override_required",
7057
7203
  "refund_revoke_requires_full_line_refund",
7058
7204
  "unified_order_link_required"
@@ -7717,12 +7863,29 @@ function defineFrameCapability(capability) {
7717
7863
  function defineBlockDesignCapability(capability) {
7718
7864
  return {
7719
7865
  ...capability,
7720
- kind: "designed"
7866
+ kind: "designed",
7867
+ sectionHeights: capability.sectionHeights ?? ["default"],
7868
+ imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7869
+ imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7870
+ testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"]
7721
7871
  };
7722
7872
  }
7723
7873
 
7724
7874
  // ../theme-core/src/site-styles/appearancePresets.ts
7875
+ function assertValidOptionGroups(preset2) {
7876
+ preset2.optionGroups?.forEach((group) => {
7877
+ const selectedOption = group.options.find(
7878
+ (option) => option.id === group.selectedOptionId
7879
+ );
7880
+ if (!selectedOption) {
7881
+ throw new Error(
7882
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7883
+ );
7884
+ }
7885
+ });
7886
+ }
7725
7887
  function defineBlockAppearancePreset(preset2) {
7888
+ assertValidOptionGroups(preset2);
7726
7889
  return preset2;
7727
7890
  }
7728
7891
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7735,13 +7898,122 @@ var appearancePresets = [
7735
7898
  target: "hero",
7736
7899
  label: "Immersive image hero",
7737
7900
  blockKinds: ["block.hero"],
7901
+ constraints: {
7902
+ layoutFamilies: ["centered", "compact"]
7903
+ },
7904
+ design: {
7905
+ sectionSurface: "hero-image",
7906
+ contentFrame: plainFrame,
7907
+ itemSurface: "none",
7908
+ transitionAfter: "soft-fade-short",
7909
+ emphasis: "high",
7910
+ sectionHeight: "hero",
7911
+ imageSurfaceTreatment: { kind: "neutral-wash" }
7912
+ }
7913
+ }),
7914
+ defineBlockAppearancePreset({
7915
+ kind: "block-design",
7916
+ id: "hero-brand-scrim",
7917
+ target: "hero",
7918
+ label: "Brand scrim image hero",
7919
+ blockKinds: ["block.hero"],
7920
+ constraints: {
7921
+ layoutFamilies: ["centered", "compact"]
7922
+ },
7923
+ optionGroups: [
7924
+ {
7925
+ id: "image-surface-treatment",
7926
+ label: "Treatment",
7927
+ selectedOptionId: "brand-scrim-primary",
7928
+ options: [
7929
+ {
7930
+ id: "brand-scrim-primary",
7931
+ label: "Brand scrim",
7932
+ designPatch: {
7933
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7934
+ }
7935
+ },
7936
+ {
7937
+ id: "neutral-scrim",
7938
+ label: "Neutral scrim",
7939
+ designPatch: {
7940
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7941
+ }
7942
+ }
7943
+ ]
7944
+ }
7945
+ ],
7946
+ layoutPatches: [
7947
+ {
7948
+ constraints: {
7949
+ layoutVariantKeys: ["micro"]
7950
+ },
7951
+ designPatch: {
7952
+ sectionHeight: "banner"
7953
+ }
7954
+ }
7955
+ ],
7956
+ design: {
7957
+ sectionSurface: "hero-image",
7958
+ contentFrame: plainFrame,
7959
+ itemSurface: "none",
7960
+ transitionAfter: "soft-fade-short",
7961
+ emphasis: "high",
7962
+ sectionHeight: "immersive",
7963
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7964
+ }
7965
+ }),
7966
+ defineBlockAppearancePreset({
7967
+ kind: "block-design",
7968
+ id: "hero-brand-scrim-fixed-frame",
7969
+ target: "hero",
7970
+ label: "Fixed-frame brand scrim hero",
7971
+ blockKinds: ["block.hero"],
7972
+ constraints: {
7973
+ layoutFamilies: ["centered", "compact"]
7974
+ },
7975
+ optionGroups: [
7976
+ {
7977
+ id: "image-surface-treatment",
7978
+ label: "Treatment",
7979
+ selectedOptionId: "brand-scrim-primary",
7980
+ options: [
7981
+ {
7982
+ id: "brand-scrim-primary",
7983
+ label: "Brand scrim",
7984
+ designPatch: {
7985
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7986
+ }
7987
+ },
7988
+ {
7989
+ id: "neutral-scrim",
7990
+ label: "Neutral scrim",
7991
+ designPatch: {
7992
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7993
+ }
7994
+ }
7995
+ ]
7996
+ }
7997
+ ],
7998
+ layoutPatches: [
7999
+ {
8000
+ constraints: {
8001
+ layoutVariantKeys: ["micro"]
8002
+ },
8003
+ designPatch: {
8004
+ sectionHeight: "banner"
8005
+ }
8006
+ }
8007
+ ],
7738
8008
  design: {
7739
8009
  sectionSurface: "hero-image",
7740
8010
  contentFrame: plainFrame,
7741
8011
  itemSurface: "none",
7742
8012
  transitionAfter: "soft-fade-short",
7743
8013
  emphasis: "high",
7744
- heroLegibility: "scrim-gradient"
8014
+ sectionHeight: "immersive",
8015
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
8016
+ imageSurfaceMotion: "fixed-frame"
7745
8017
  }
7746
8018
  }),
7747
8019
  defineBlockAppearancePreset({
@@ -7758,17 +8030,26 @@ var appearancePresets = [
7758
8030
  emphasis: "high"
7759
8031
  }
7760
8032
  }),
8033
+ defineBlockAppearancePreset({
8034
+ kind: "block-design",
8035
+ id: "body-text-editorial-intro",
8036
+ target: "body-text",
8037
+ label: "Editorial intro copy",
8038
+ blockKinds: ["block.body-text"],
8039
+ design: {
8040
+ sectionSurface: "base",
8041
+ contentFrame: plainFrame,
8042
+ itemSurface: "none",
8043
+ transitionAfter: "soft-fade-short",
8044
+ emphasis: "high"
8045
+ }
8046
+ }),
7761
8047
  defineBlockAppearancePreset({
7762
8048
  kind: "block-design",
7763
8049
  id: "offerings-calm-list",
7764
8050
  target: "offerings",
7765
8051
  label: "Calm offerings list",
7766
- blockKinds: [
7767
- "block.event-listing",
7768
- "block.event-calendar",
7769
- "block.event-spotlight",
7770
- "block.product-list"
7771
- ],
8052
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7772
8053
  design: {
7773
8054
  sectionSurface: "muted-band",
7774
8055
  contentFrame: plainFrame,
@@ -7847,6 +8128,35 @@ var appearancePresets = [
7847
8128
  emphasis: "high"
7848
8129
  }
7849
8130
  }),
8131
+ defineBlockAppearancePreset({
8132
+ kind: "block-design",
8133
+ id: "testimonials-dark-proof",
8134
+ target: "testimonials",
8135
+ label: "Dark proof panel",
8136
+ blockKinds: ["block.testimonials"],
8137
+ design: {
8138
+ sectionSurface: "accent-band",
8139
+ contentFrame: panelFrame("raised"),
8140
+ itemSurface: "raised",
8141
+ transitionAfter: "soft-fade-short",
8142
+ emphasis: "high"
8143
+ }
8144
+ }),
8145
+ defineBlockAppearancePreset({
8146
+ kind: "block-design",
8147
+ id: "testimonials-accent-quote-proof",
8148
+ target: "testimonials",
8149
+ label: "Accent quote proof",
8150
+ blockKinds: ["block.testimonials"],
8151
+ design: {
8152
+ sectionSurface: "accent-band",
8153
+ contentFrame: plainFrame,
8154
+ itemSurface: "raised",
8155
+ transitionAfter: "soft-fade-short",
8156
+ emphasis: "high",
8157
+ testimonialCardTreatment: "accent-quote"
8158
+ }
8159
+ }),
7850
8160
  defineBlockAppearancePreset({
7851
8161
  kind: "block-design",
7852
8162
  id: "faq-contained-help",
@@ -7875,6 +8185,20 @@ var appearancePresets = [
7875
8185
  emphasis: "medium"
7876
8186
  }
7877
8187
  }),
8188
+ defineBlockAppearancePreset({
8189
+ kind: "block-design",
8190
+ id: "contact-form-dark-card",
8191
+ target: "contact-form",
8192
+ label: "Dark form card",
8193
+ blockKinds: ["block.form"],
8194
+ design: {
8195
+ sectionSurface: "accent-band",
8196
+ contentFrame: panelFrame("raised"),
8197
+ itemSurface: "none",
8198
+ transitionAfter: "soft-fade-short",
8199
+ emphasis: "high"
8200
+ }
8201
+ }),
7878
8202
  defineBlockAppearancePreset({
7879
8203
  kind: "block-design",
7880
8204
  id: "cta-accent-band",
@@ -7894,9 +8218,33 @@ var appearancePresets = [
7894
8218
  id: "header-clean-base",
7895
8219
  target: "site-header",
7896
8220
  label: "Clean base header",
7897
- chrome: {
7898
- surface: "base",
7899
- emphasis: "medium"
8221
+ header: {
8222
+ surface: {
8223
+ kind: "neutral-solid",
8224
+ token: "surface",
8225
+ textColorToken: "text"
8226
+ },
8227
+ navTreatment: "minimal",
8228
+ dropdownTreatment: "surface",
8229
+ ctaTreatment: "default",
8230
+ behavior: "default"
8231
+ }
8232
+ }),
8233
+ defineSiteChromeAppearancePreset({
8234
+ kind: "site-chrome",
8235
+ id: "site-header-brand-solid-inverted-cta",
8236
+ target: "site-header",
8237
+ label: "Brand solid header with inverted CTA",
8238
+ header: {
8239
+ surface: {
8240
+ kind: "brand-solid",
8241
+ token: "primary",
8242
+ textColorToken: "primaryForeground"
8243
+ },
8244
+ navTreatment: "uppercase-underline",
8245
+ dropdownTreatment: "matched-solid",
8246
+ ctaTreatment: "inverted",
8247
+ behavior: "sticky-shrink"
7900
8248
  }
7901
8249
  }),
7902
8250
  defineSiteChromeAppearancePreset({
@@ -7904,10 +8252,31 @@ var appearancePresets = [
7904
8252
  id: "footer-muted-grounding",
7905
8253
  target: "site-footer",
7906
8254
  label: "Muted grounding footer",
7907
- chrome: {
8255
+ footer: {
8256
+ kind: "grounding",
7908
8257
  surface: "muted-band",
7909
8258
  emphasis: "low"
7910
8259
  }
8260
+ }),
8261
+ defineSiteChromeAppearancePreset({
8262
+ kind: "site-chrome",
8263
+ id: "site-footer-brand-two-band",
8264
+ target: "site-footer",
8265
+ label: "Two-band brand footer",
8266
+ footer: {
8267
+ kind: "brand-two-band",
8268
+ surface: {
8269
+ token: "primary",
8270
+ shade: "800",
8271
+ textColorToken: "primaryForeground"
8272
+ },
8273
+ bottomBand: {
8274
+ token: "primary",
8275
+ shade: "900",
8276
+ textColorToken: "primaryForeground"
8277
+ },
8278
+ emphasis: "high"
8279
+ }
7911
8280
  })
7912
8281
  ];
7913
8282
 
@@ -8567,6 +8936,111 @@ var pebble = defineButtonPersonality({
8567
8936
  }
8568
8937
  });
8569
8938
 
8939
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
8940
+ var showtimePill = defineButtonPersonality({
8941
+ id: "showtime-pill",
8942
+ name: "Showtime Pill",
8943
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
8944
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
8945
+ buttonSystem: {
8946
+ global: {
8947
+ cornerStyle: "pill",
8948
+ shadow: "low",
8949
+ textTransform: "uppercase",
8950
+ fontWeight: 700,
8951
+ borderWidth: 2,
8952
+ hoverTransform: "lift",
8953
+ hoverColor: "darken",
8954
+ typography: "body",
8955
+ paddingPreset: "spacious",
8956
+ italic: false
8957
+ },
8958
+ sizes: {
8959
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
8960
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
8961
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
8962
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
8963
+ },
8964
+ variants: [
8965
+ {
8966
+ id: "primary",
8967
+ name: "Primary",
8968
+ enabled: true,
8969
+ priority: 1,
8970
+ background: { type: "solid", colorToken: "primary" },
8971
+ textColorToken: "background",
8972
+ borderRadius: "rounded-full",
8973
+ effects: {
8974
+ hover: [{ effectId: "pop" }]
8975
+ }
8976
+ },
8977
+ {
8978
+ id: "secondary",
8979
+ name: "Secondary",
8980
+ enabled: true,
8981
+ priority: 2,
8982
+ background: { type: "transparent" },
8983
+ textColorToken: "primary",
8984
+ borderRadius: "rounded-full",
8985
+ border: { widthClass: "border-2", colorToken: "primary" },
8986
+ effects: {
8987
+ hover: [{ effectId: "pop" }]
8988
+ }
8989
+ },
8990
+ {
8991
+ id: "hero",
8992
+ name: "Hero",
8993
+ enabled: true,
8994
+ priority: 1,
8995
+ background: { type: "solid", colorToken: "secondary" },
8996
+ textColorToken: "primary",
8997
+ borderRadius: "rounded-full",
8998
+ effects: {
8999
+ hover: [{ effectId: "pop" }]
9000
+ }
9001
+ },
9002
+ {
9003
+ id: "header",
9004
+ name: "Header",
9005
+ enabled: true,
9006
+ priority: 2,
9007
+ background: { type: "solid", colorToken: "background" },
9008
+ textColorToken: "primary",
9009
+ borderRadius: "rounded-full",
9010
+ border: { widthClass: "border-2", colorToken: "primary" },
9011
+ effects: {
9012
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9013
+ }
9014
+ },
9015
+ {
9016
+ id: "outline",
9017
+ name: "Outline",
9018
+ enabled: true,
9019
+ priority: 3,
9020
+ background: { type: "transparent" },
9021
+ textColorToken: "primary",
9022
+ borderRadius: "rounded-full",
9023
+ border: { widthClass: "border-2", colorToken: "primary" },
9024
+ effects: {
9025
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
9026
+ }
9027
+ },
9028
+ {
9029
+ id: "ghost",
9030
+ name: "Ghost",
9031
+ enabled: true,
9032
+ priority: 3,
9033
+ background: { type: "transparent" },
9034
+ textColorToken: "primary",
9035
+ borderRadius: "rounded-full",
9036
+ effects: {
9037
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9038
+ }
9039
+ }
9040
+ ]
9041
+ }
9042
+ });
9043
+
8570
9044
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8571
9045
  var softPill = defineButtonPersonality({
8572
9046
  id: "soft-pill",
@@ -8647,7 +9121,8 @@ var buttonPersonalities = [
8647
9121
  editorialLink,
8648
9122
  pebble,
8649
9123
  inkStamp,
8650
- brushedWash
9124
+ brushedWash,
9125
+ showtimePill
8651
9126
  ];
8652
9127
  var personalitiesById = new Map(
8653
9128
  buttonPersonalities.map((p) => [p.id, p])
@@ -9178,14 +9653,7 @@ var proseLinkStyleSchema = z21.object({
9178
9653
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9179
9654
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9180
9655
  });
9181
- var semanticSpacingSchema = z21.enum([
9182
- "none",
9183
- "compact",
9184
- "cozy",
9185
- "medium",
9186
- "comfortable",
9187
- "spacious"
9188
- ]);
9656
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9189
9657
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9190
9658
  var boxBackgroundOverlaySchema = z21.object({
9191
9659
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9202,6 +9670,7 @@ var boxBackgroundSchema = z21.object({
9202
9670
  scale: z21.string().nullable().optional(),
9203
9671
  position: z21.string().nullable().optional(),
9204
9672
  opacity: z21.number().min(0).max(1).nullable().optional(),
9673
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9205
9674
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9206
9675
  textColor: z21.string().nullable().optional(),
9207
9676
  headingColor: z21.string().nullable().optional()
@@ -9209,7 +9678,7 @@ var boxBackgroundSchema = z21.object({
9209
9678
  var sectionStylesOverrideSchema = z21.object({
9210
9679
  background: boxBackgroundSchema.nullable().optional(),
9211
9680
  spacing: semanticSpacingSchema.nullable().optional(),
9212
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9681
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9213
9682
  });
9214
9683
  var containerStylesOverrideSchema = z21.object({
9215
9684
  background: boxBackgroundSchema.nullable().optional(),
@@ -9228,7 +9697,8 @@ var cardStylesOverrideSchema = z21.object({
9228
9697
  border: cardBorderOverrideSchema.nullable().optional(),
9229
9698
  spacing: semanticSpacingSchema.nullable().optional(),
9230
9699
  raised: z21.boolean().nullable().optional(),
9231
- rounded: boxRoundedSchema.nullable().optional()
9700
+ rounded: boxRoundedSchema.nullable().optional(),
9701
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9232
9702
  });
9233
9703
  var blockStyleOverridesSchema = z21.object({
9234
9704
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9303,15 +9773,7 @@ var inputStyle = z21.object({
9303
9773
  });
9304
9774
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9305
9775
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9306
- var headerNavStyle = z21.enum([
9307
- "minimal",
9308
- "underline",
9309
- "underline-grow",
9310
- "capsule",
9311
- "scale",
9312
- "frosted",
9313
- "solid"
9314
- ]);
9776
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9315
9777
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9316
9778
  var headerMaxWidth = z21.enum(["container", "full"]);
9317
9779
  var headerContainerSchema = z21.object({
@@ -9365,6 +9827,7 @@ var dropdownStyleSchema = z21.object({
9365
9827
  // optional = no override (browser default)
9366
9828
  }).optional();
9367
9829
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9830
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9368
9831
  var navContainerSchema = z21.object({
9369
9832
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9370
9833
  tint: z21.string().nullable().optional(),
@@ -9383,7 +9846,10 @@ var headerSchema = z21.object({
9383
9846
  shrinkOnScroll: z21.boolean(),
9384
9847
  maxWidth: headerMaxWidth,
9385
9848
  logoOverride: mediaSchema.nullable().optional(),
9386
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9849
+ background: headerBackgroundSchema.default({
9850
+ type: "color",
9851
+ color: "surface"
9852
+ }),
9387
9853
  textColor: z21.string().nullable().optional(),
9388
9854
  // Site title and general header text
9389
9855
  navStyle: headerNavStyle,
@@ -9403,6 +9869,13 @@ var headerSchema = z21.object({
9403
9869
  navLinkStyle: navLinkStyleSchema.optional(),
9404
9870
  // CTA button spacing (desktop left margin)
9405
9871
  ctaGap: headerCtaGapSchema.optional(),
9872
+ // Semantic CTA treatment for header/nav CTA buttons. The Theme V2 compiler
9873
+ // materializes this to ctaVariant against the active button personality.
9874
+ ctaTreatment: headerCtaTreatmentSchema.optional(),
9875
+ // Optional theme-level CTA variant for header/nav CTA buttons.
9876
+ // Internal runtime bridge for the block renderer; prefer ctaTreatment in
9877
+ // authored Theme V2 concepts.
9878
+ ctaVariant: z21.string().min(1).optional(),
9406
9879
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9407
9880
  dropdownStyle: dropdownStyleSchema
9408
9881
  });
@@ -9459,7 +9932,10 @@ var footerSchema = z21.object({
9459
9932
  variant: footerVariant,
9460
9933
  maxWidth: footerMaxWidth,
9461
9934
  showLogoText: z21.boolean().optional(),
9462
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9935
+ background: headerBackgroundSchema.default({
9936
+ type: "color",
9937
+ color: "surface"
9938
+ }),
9463
9939
  // Footer nav styling (independent from header)
9464
9940
  navStyle: headerNavStyle.default("minimal"),
9465
9941
  navColor: z21.string().nullable().optional(),
@@ -9481,17 +9957,7 @@ var layoutSchema = z21.object({
9481
9957
  desktop: containerPaddingPresetSchema.optional()
9482
9958
  }).optional()
9483
9959
  }).optional();
9484
- var heroTypographySizeSchema = z21.enum([
9485
- "sm",
9486
- "base",
9487
- "lg",
9488
- "xl",
9489
- "2xl",
9490
- "3xl",
9491
- "4xl",
9492
- "5xl",
9493
- "6xl"
9494
- ]);
9960
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9495
9961
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9496
9962
  var heroResponsiveTypographySchema = z21.object({
9497
9963
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9516,6 +9982,13 @@ var heroTypographySchema = z21.object({
9516
9982
  var heroSchema = z21.object({
9517
9983
  typography: heroTypographySchema.optional()
9518
9984
  }).optional();
9985
+ var bodyTextIntroTypographySizeSchema = z21.enum(["default", "editorial"]);
9986
+ var bodyTextSchema = z21.object({
9987
+ intro: z21.object({
9988
+ paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
9989
+ headingSize: bodyTextIntroTypographySizeSchema.optional()
9990
+ }).optional()
9991
+ }).optional();
9519
9992
  var gradientsSchema = z21.object({
9520
9993
  button: z21.string().min(1).nullable().optional(),
9521
9994
  hero: z21.string().min(1).nullable().optional(),
@@ -9537,6 +10010,7 @@ var themeSchema = z21.object({
9537
10010
  gradients: gradientsSchema.optional(),
9538
10011
  layout: layoutSchema,
9539
10012
  hero: heroSchema,
10013
+ bodyText: bodyTextSchema,
9540
10014
  header: headerSchema,
9541
10015
  footer: footerSchema,
9542
10016
  buttons: buttonSystemSchema.optional(),
@@ -9560,10 +10034,7 @@ var themeSchema = z21.object({
9560
10034
  ).optional(),
9561
10035
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9562
10036
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9563
- blockOverrides: z21.record(
9564
- z21.string(),
9565
- blockThemeOverrideSchema
9566
- ).optional(),
10037
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9567
10038
  // Structured custom CSS rules
9568
10039
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9569
10040
  customCssRules: customCssRulesSchema,
@@ -9734,6 +10205,28 @@ var brandLedJewel = definePaletteVariant({
9734
10205
  { name: "border", hex: "#a8a29e" }
9735
10206
  ]
9736
10207
  });
10208
+ var brandLedBurgundyGold = definePaletteVariant({
10209
+ id: "brand-led-burgundy-gold",
10210
+ name: "Brand-led \u2014 Burgundy Gold",
10211
+ description: "Deep burgundy with warm gold accents and soft neutral grounds.",
10212
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
10213
+ mode: "light",
10214
+ colors: [
10215
+ { name: "primary", hex: "#7c2e38" },
10216
+ { name: "secondary", hex: "#d4af37" },
10217
+ { name: "accent", hex: "#b8e19a" },
10218
+ { name: "success", hex: "#10b981" },
10219
+ { name: "warning", hex: "#f59e0b" },
10220
+ { name: "destructive", hex: "#ef4444" },
10221
+ { name: "background", hex: "#f1dfd0" },
10222
+ { name: "surface", hex: "#f5e6db" },
10223
+ { name: "surfaceAlt", hex: "#f8ece3" },
10224
+ { name: "muted", hex: "#c9b8a8" },
10225
+ { name: "text", hex: "#400000" },
10226
+ { name: "primaryForeground", hex: "#ffffff" },
10227
+ { name: "border", hex: "#c9b8a8" }
10228
+ ]
10229
+ });
9737
10230
 
9738
10231
  // ../theme-core/src/palette/variants/high-contrast.ts
9739
10232
  var highContrastInk = definePaletteVariant({
@@ -9945,6 +10438,7 @@ var paletteVariants = [
9945
10438
  brandLedCool,
9946
10439
  brandLedWarm,
9947
10440
  brandLedJewel,
10441
+ brandLedBurgundyGold,
9948
10442
  // Warm-neutral family
9949
10443
  warmNeutralClay,
9950
10444
  warmNeutralCream,
@@ -10020,7 +10514,8 @@ var curatedSiteStyleIdValues = [
10020
10514
  "site-style:quiet-luxury",
10021
10515
  "site-style:practical-services",
10022
10516
  "site-style:modern-wellness",
10023
- "site-style:bold-launch"
10517
+ "site-style:bold-launch",
10518
+ "site-style:south-west-twerk-school"
10024
10519
  ];
10025
10520
  var quietBudget = {
10026
10521
  accentDensity: "low",
@@ -10075,6 +10570,8 @@ function defineCuratedSiteStyle(input) {
10075
10570
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
10076
10571
  supportedTransitions: generatedDesignOptionCatalog.transitions
10077
10572
  },
10573
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10574
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10078
10575
  buttonPersonalityChoices: input.buttonPersonalityChoices,
10079
10576
  paletteVariantChoices: input.paletteVariantChoices
10080
10577
  };
@@ -10321,6 +10818,101 @@ var curatedSiteStyles = [
10321
10818
  paletteChoice("brand-led-jewel"),
10322
10819
  paletteChoice("brand-led-warm")
10323
10820
  ]
10821
+ }),
10822
+ defineCuratedSiteStyle({
10823
+ id: "site-style:south-west-twerk-school",
10824
+ name: "South West Twerk School",
10825
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
10826
+ 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.",
10827
+ selectionKeywords: [
10828
+ "dance",
10829
+ "classes",
10830
+ "workshop",
10831
+ "school",
10832
+ "movement",
10833
+ "performance",
10834
+ "community"
10835
+ ],
10836
+ tokenRecipes: {
10837
+ palette: "brand-led",
10838
+ contrast: "maximum",
10839
+ radius: "soft",
10840
+ shadow: "layered",
10841
+ typography: "clean-sans",
10842
+ spacing: "airy",
10843
+ motion: "expressive"
10844
+ },
10845
+ compositionBudget: expressiveBudget,
10846
+ themeOverrides: {
10847
+ typography: {
10848
+ body: {
10849
+ family: "Manrope, system-ui, sans-serif",
10850
+ size: "lg",
10851
+ weight: "regular",
10852
+ lineHeight: "relaxed",
10853
+ letterSpacing: "normal"
10854
+ },
10855
+ headings: {
10856
+ default: {
10857
+ family: '"TAN - PEARL", sans-serif',
10858
+ weight: "bold",
10859
+ lineHeight: "normal",
10860
+ letterSpacing: "tight",
10861
+ colorToken: "primary",
10862
+ italic: null,
10863
+ case: null
10864
+ },
10865
+ h1: {
10866
+ size: "xl",
10867
+ weight: "bold",
10868
+ lineHeight: "normal",
10869
+ letterSpacing: "tight",
10870
+ italic: null
10871
+ },
10872
+ h2: {
10873
+ size: "lg",
10874
+ weight: "bold",
10875
+ lineHeight: "normal",
10876
+ letterSpacing: "normal",
10877
+ italic: null
10878
+ },
10879
+ h3: {
10880
+ size: "md",
10881
+ weight: "bold",
10882
+ lineHeight: "normal",
10883
+ letterSpacing: "normal",
10884
+ italic: null
10885
+ }
10886
+ },
10887
+ scale: "balanced"
10888
+ },
10889
+ bodyText: {
10890
+ intro: {
10891
+ paragraphSize: "editorial",
10892
+ headingSize: "editorial"
10893
+ }
10894
+ }
10895
+ },
10896
+ recommendedAppearancePresetIds: [
10897
+ "site-header-brand-solid-inverted-cta",
10898
+ "site-footer-brand-two-band",
10899
+ "hero-brand-scrim-fixed-frame",
10900
+ "body-text-editorial-intro",
10901
+ "testimonials-accent-quote-proof",
10902
+ "contact-form-dark-card"
10903
+ ],
10904
+ buttonPersonalityChoices: [
10905
+ buttonChoice("showtime-pill"),
10906
+ buttonChoice("confident-chip"),
10907
+ buttonChoice("ink-stamp"),
10908
+ buttonChoice("brushed-wash")
10909
+ ],
10910
+ paletteVariantChoices: [
10911
+ paletteChoice("brand-led-burgundy-gold"),
10912
+ paletteChoice("brand-led-jewel"),
10913
+ paletteChoice("brand-led-warm"),
10914
+ paletteChoice("high-contrast-ink")
10915
+ ]
10324
10916
  })
10325
10917
  ];
10326
10918
  var curatedSiteStylesById = new Map(
@@ -10365,6 +10957,40 @@ var heroLegibilityStrategySchema = z23.enum([
10365
10957
  "scrim-gradient",
10366
10958
  "solid-panel"
10367
10959
  ]);
10960
+ var sectionHeightIntentSchema = z23.enum([
10961
+ "default",
10962
+ "banner",
10963
+ "hero",
10964
+ "immersive"
10965
+ ]);
10966
+ var imageSurfaceTreatmentIntensitySchema = z23.enum(["soft", "balanced", "strong"]);
10967
+ var imageSurfaceMotionSchema = z23.enum(["static", "fixed-frame"]);
10968
+ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
10969
+ z23.object({ kind: z23.literal("none") }).strict(),
10970
+ z23.object({
10971
+ kind: z23.literal("brand-scrim"),
10972
+ token: z23.enum(["primary", "secondary", "accent"]),
10973
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10974
+ }).strict(),
10975
+ z23.object({
10976
+ kind: z23.literal("brand-wash"),
10977
+ token: z23.enum(["primary", "secondary", "accent"]),
10978
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10979
+ }).strict(),
10980
+ z23.object({
10981
+ kind: z23.literal("neutral-scrim"),
10982
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10983
+ }).strict(),
10984
+ z23.object({
10985
+ kind: z23.literal("neutral-wash"),
10986
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10987
+ }).strict(),
10988
+ z23.object({
10989
+ kind: z23.literal("solid-panel"),
10990
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10991
+ }).strict()
10992
+ ]);
10993
+ var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
10368
10994
  function uniqueNonEmpty(values) {
10369
10995
  const uniqueValues = [...new Set(values)];
10370
10996
  const firstValue = uniqueValues[0];
@@ -10403,7 +11029,11 @@ var blockDesignPlanSchema = z23.object({
10403
11029
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10404
11030
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10405
11031
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10406
- heroLegibility: heroLegibilityStrategySchema.optional()
11032
+ sectionHeight: sectionHeightIntentSchema.optional(),
11033
+ heroLegibility: heroLegibilityStrategySchema.optional(),
11034
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
11035
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
11036
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10407
11037
  }).strict();
10408
11038
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10409
11039
  z23.object({
@@ -11829,6 +12459,7 @@ var SEMANTIC_SPACING_VALUES = [
11829
12459
  ];
11830
12460
  var SECTION_MIN_HEIGHT_VALUES = [
11831
12461
  "none",
12462
+ "banner",
11832
12463
  "hero",
11833
12464
  "immersive"
11834
12465
  ];
@@ -11856,6 +12487,7 @@ var CONTAINER_SPACING_MAP = {
11856
12487
  };
11857
12488
  var SECTION_MIN_HEIGHT_MAP = {
11858
12489
  none: "",
12490
+ banner: "rb-section-min-h-banner",
11859
12491
  hero: "rb-section-min-h-hero",
11860
12492
  immersive: "rb-section-min-h-immersive"
11861
12493
  };
@@ -12635,6 +13267,9 @@ var boxStylesCompositeTransform = {
12635
13267
  classes.push(roundedResult);
12636
13268
  }
12637
13269
  }
13270
+ if (input.treatment === "accent-quote") {
13271
+ classes.push("rb-card-treatment-accent-quote");
13272
+ }
12638
13273
  return classes.join(" ").trim() || "";
12639
13274
  }
12640
13275
  };
@@ -12732,7 +13367,7 @@ var sectionClassNameTransform = {
12732
13367
  minHeight = input.minHeight;
12733
13368
  } else if (process.env.NODE_ENV !== "production") {
12734
13369
  console.warn(
12735
- `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, hero, immersive.`
13370
+ `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, banner, hero, immersive.`
12736
13371
  );
12737
13372
  }
12738
13373
  }
@@ -13055,23 +13690,6 @@ function styledCard(children, opts, ...mods) {
13055
13690
  );
13056
13691
  }
13057
13692
 
13058
- // ../blocks/src/system/node/fragments/typography.ts
13059
- function mergeClassName(base, extra) {
13060
- return [base, extra ?? ""].filter(Boolean).join(" ");
13061
- }
13062
- function captionText(opts, ...mods) {
13063
- const {
13064
- as: asProp,
13065
- className: classNameProp,
13066
- color,
13067
- ...rest
13068
- } = opts ?? {};
13069
- const as = asProp ?? "p";
13070
- const className = mergeClassName("rb-caption", classNameProp);
13071
- const style = textColorStyle(color ?? "mutedText");
13072
- return text({ ...rest, as, className, style }, ...mods);
13073
- }
13074
-
13075
13693
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
13076
13694
  function joinClasses(...parts) {
13077
13695
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -13976,18 +14594,17 @@ function buildAttributionNodes() {
13976
14594
  const name = text(
13977
14595
  {
13978
14596
  as: "strong",
13979
- className: "rb-block",
13980
- style: textColorStyle("text")
14597
+ className: "rb-block"
13981
14598
  },
13982
14599
  bind("testimonial.content.name", { fallback: "Anonymous" })
13983
14600
  );
13984
- const jobTitle = captionText(
13985
- null,
14601
+ const jobTitle = text(
14602
+ { as: "p", className: "rb-caption" },
13986
14603
  when("testimonial.content.jobTitle"),
13987
14604
  bind("testimonial.content.jobTitle")
13988
14605
  );
13989
- const company = captionText(
13990
- null,
14606
+ const company = text(
14607
+ { as: "p", className: "rb-caption" },
13991
14608
  when("testimonial.content.company"),
13992
14609
  bind("testimonial.content.company")
13993
14610
  );
@@ -14021,8 +14638,7 @@ function buildTestimonialCard(...mods) {
14021
14638
  );
14022
14639
  const body = richText(
14023
14640
  {
14024
- className: "rb-prose rb-max-w-none",
14025
- style: textColorStyle("text")
14641
+ className: "rb-prose rb-max-w-none"
14026
14642
  },
14027
14643
  bind("testimonial.content.body"),
14028
14644
  when("testimonial.content.body")
@@ -15652,6 +16268,7 @@ function heroContentCard(children, gap) {
15652
16268
  return styledContainer({
15653
16269
  bindFrom: "_contentCardStyles",
15654
16270
  constrainWidth: false,
16271
+ baseClassName: "rb-relative rb-isolate",
15655
16272
  rootType: "stack",
15656
16273
  rootProps: {
15657
16274
  gap
@@ -15682,6 +16299,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15682
16299
  function heroContainerStack(children, gap) {
15683
16300
  return styledContainer({
15684
16301
  rootType: "stack",
16302
+ baseClassName: "rb-relative rb-isolate",
15685
16303
  rootProps: {
15686
16304
  gap: "none",
15687
16305
  justify: {
@@ -16900,7 +17518,7 @@ function resolveHeroVerticalAlignment(content) {
16900
17518
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
16901
17519
  const sectionStyles = asPartialObject(content._sectionStyles);
16902
17520
  const minHeight = sectionStyles?.minHeight;
16903
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17521
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
16904
17522
  const variant = resolveHeroVariant(content);
16905
17523
  if (variant === "split" || variant === "splitReverse") return "center";
16906
17524
  return "top";
@@ -17658,6 +18276,26 @@ var footerSplitNavSingleClassTransform = {
17658
18276
  ]);
17659
18277
  }
17660
18278
  };
18279
+ var footerSplitMainClassSchema = z35.object({
18280
+ base: z35.string().optional(),
18281
+ reverseClass: z35.string().optional()
18282
+ });
18283
+ var footerSplitMainClassTransform = {
18284
+ id: "layout.footerSplitMainClass",
18285
+ kind: "string",
18286
+ summary: "Compose split-footer main row classes from footer logo placement",
18287
+ schema: footerSplitMainClassSchema,
18288
+ run: (value, options) => {
18289
+ const logo = asPartialObject(value);
18290
+ const placement = logo?.placement ?? "right";
18291
+ const shouldPlaceLogoFirst = placement === "left" || placement === "above";
18292
+ 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";
18293
+ return joinClasses4([
18294
+ options.base ?? baseClass,
18295
+ shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null
18296
+ ]);
18297
+ }
18298
+ };
17661
18299
  var footerLogoClassSchema = z35.object({
17662
18300
  base: z35.string().optional()
17663
18301
  });
@@ -17668,14 +18306,11 @@ var footerLogoClassTransform = {
17668
18306
  schema: footerLogoClassSchema,
17669
18307
  run: (value, options) => {
17670
18308
  const logo = asPartialObject(value);
17671
- const placement = logo?.placement ?? "right";
17672
18309
  const align = logo?.align ?? "end";
17673
18310
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17674
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17675
18311
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
17676
18312
  return joinClasses4([
17677
18313
  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",
17678
- orderClass,
17679
18314
  selfAlignClass,
17680
18315
  hiddenClass
17681
18316
  ]);
@@ -17730,6 +18365,7 @@ var layoutTransforms = [
17730
18365
  footerBottomBarContainerClassTransform,
17731
18366
  footerBottomBarStyleTransform,
17732
18367
  footerSplitNavSingleClassTransform,
18368
+ footerSplitMainClassTransform,
17733
18369
  footerLogoClassTransform,
17734
18370
  footerLogoMediaClassTransform,
17735
18371
  footerLogoTextVisibleTransform
@@ -18003,7 +18639,7 @@ var createNavRow = (className, align = "end") => navRow({
18003
18639
  var headerCta = ctaButton({
18004
18640
  basePath: "menu.ctaItem",
18005
18641
  whenPath: "menu.ctaItem.label",
18006
- variantPath: "menu.ctaItem.variant",
18642
+ variantPath: "$root.theme.header.ctaVariant",
18007
18643
  linkPath: "menu.ctaItem.link",
18008
18644
  sizeFallback: "sm",
18009
18645
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -18011,7 +18647,7 @@ var headerCta = ctaButton({
18011
18647
  var mobileCta = ctaButton({
18012
18648
  basePath: "menu.ctaItem",
18013
18649
  whenPath: "menu.ctaItem.label",
18014
- variantPath: "menu.ctaItem.variant",
18650
+ variantPath: "$root.theme.header.ctaVariant",
18015
18651
  linkPath: "menu.ctaItem.link",
18016
18652
  sizeFallback: "md",
18017
18653
  className: "nav-mobile-cta rb-w-full"
@@ -18472,7 +19108,13 @@ var splitFooterLayout = stack(
18472
19108
  [
18473
19109
  inline(
18474
19110
  {
18475
- 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"
19111
+ className: {
19112
+ $bind: {
19113
+ from: "$root.theme.footer.logo",
19114
+ transforms: [{ id: "layout.footerSplitMainClass" }],
19115
+ 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"
19116
+ }
19117
+ }
18476
19118
  },
18477
19119
  [
18478
19120
  stack(
@@ -20560,7 +21202,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20560
21202
  run: z47.object({
20561
21203
  courseId: z47.string(),
20562
21204
  seriesId: z47.string(),
20563
- runSlug: z47.string()
21205
+ runSlug: z47.string(),
21206
+ runName: z47.string().nullable()
20564
21207
  })
20565
21208
  }),
20566
21209
  z47.object({
@@ -26507,6 +27150,34 @@ function panelCapable() {
26507
27150
  itemSurfaces: "unsupported"
26508
27151
  });
26509
27152
  }
27153
+ var heroSectionHeights = [
27154
+ "default",
27155
+ "banner",
27156
+ "hero",
27157
+ "immersive"
27158
+ ];
27159
+ var heroImageSurfaceTreatments = [
27160
+ "none",
27161
+ "brand-scrim",
27162
+ "brand-wash",
27163
+ "neutral-scrim",
27164
+ "neutral-wash",
27165
+ "solid-panel"
27166
+ ];
27167
+ var heroImageSurfaceMotions = [
27168
+ "static",
27169
+ "fixed-frame"
27170
+ ];
27171
+ function heroCapable() {
27172
+ return declareBlockDesignCapability({
27173
+ sectionSurfaces: "supported",
27174
+ contentFrames: ["plain", "panel"],
27175
+ itemSurfaces: "unsupported",
27176
+ sectionHeights: heroSectionHeights,
27177
+ imageSurfaceTreatments: heroImageSurfaceTreatments,
27178
+ imageSurfaceMotions: heroImageSurfaceMotions
27179
+ });
27180
+ }
26510
27181
  function plainItemsCapable() {
26511
27182
  return declareBlockDesignCapability({
26512
27183
  sectionSurfaces: "supported",
@@ -26623,7 +27294,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26623
27294
  };
26624
27295
  }
26625
27296
  var systemBlockDefinitionsRaw = [
26626
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27297
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26627
27298
  flow: heroFlow,
26628
27299
  layoutProfiles: [
26629
27300
  layoutProfile({
@@ -26727,7 +27398,12 @@ var systemBlockDefinitionsRaw = [
26727
27398
  flow: siteChromeFlow,
26728
27399
  layoutProfiles: []
26729
27400
  })),
26730
- withDesignCapability("block.testimonials", testimonialsBlockDefinition, panelAndItemsCapable(), defineBlockDesignMetadata({
27401
+ withDesignCapability("block.testimonials", testimonialsBlockDefinition, declareBlockDesignCapability({
27402
+ sectionSurfaces: "supported",
27403
+ contentFrames: ["plain", "panel"],
27404
+ itemSurfaces: "supported",
27405
+ testimonialCardTreatments: ["default", "accent-quote"]
27406
+ }), defineBlockDesignMetadata({
26731
27407
  flow: proofFlow,
26732
27408
  layoutProfiles: [
26733
27409
  layoutProfile({
@@ -26969,8 +27645,15 @@ function parseOpacity(value) {
26969
27645
  }
26970
27646
  return opacity <= 1 ? opacity : opacity / 100;
26971
27647
  }
26972
- function appendOptionalClasses(baseClassName, optionalClassName) {
26973
- return optionalClassName ? `${baseClassName} ${optionalClassName}` : baseClassName;
27648
+ function backgroundMotionClassNames(input) {
27649
+ return input.motion === "fixed-frame" ? "rb-bg-motion-fixed-frame" : "";
27650
+ }
27651
+ function appendBackgroundMediaClasses(baseClassName, input) {
27652
+ return [
27653
+ baseClassName,
27654
+ backgroundMotionClassNames(input),
27655
+ backgroundVideoMobileClassNames(input)
27656
+ ].filter(Boolean).join(" ");
26974
27657
  }
26975
27658
  var resolveImageStyleTransform = {
26976
27659
  id: "background.resolveImageStyle",
@@ -27047,9 +27730,9 @@ var resolveImageClassNameTransform = {
27047
27730
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
27048
27731
  const position = isString(input.position) ? input.position.trim() : null;
27049
27732
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
27050
- return appendOptionalClasses(
27733
+ return appendBackgroundMediaClasses(
27051
27734
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
27052
- backgroundVideoMobileClassNames(input)
27735
+ input
27053
27736
  );
27054
27737
  }
27055
27738
  let needsAnchoring = false;
@@ -27062,18 +27745,18 @@ var resolveImageClassNameTransform = {
27062
27745
  }
27063
27746
  }
27064
27747
  if (!needsAnchoring) {
27065
- return appendOptionalClasses(
27748
+ return appendBackgroundMediaClasses(
27066
27749
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
27067
- backgroundVideoMobileClassNames(input)
27750
+ input
27068
27751
  );
27069
27752
  }
27070
27753
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
27071
27754
  const isCustom = position && !isPreset;
27072
27755
  if (isCustom) {
27073
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27756
+ return appendBackgroundMediaClasses(baseClass, input);
27074
27757
  }
27075
27758
  const anchorClasses = getAnchorClasses(position);
27076
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27759
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
27077
27760
  }
27078
27761
  };
27079
27762
  var resolveOverlayStyleTransform = {