@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
@@ -595,7 +595,7 @@ var ENDPOINT_DEFINITIONS = {
595
595
  method: "GET",
596
596
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
597
597
  auth: "user",
598
- responseKind: "text"
598
+ responseKind: "blob"
599
599
  },
600
600
  getNewsletterSubscriber: {
601
601
  path: "/sites/{siteId}/newsletter/subscribers/{subscriberId}",
@@ -926,12 +926,7 @@ var ENDPOINT_DEFINITIONS = {
926
926
  ],
927
927
  auth: "user",
928
928
  responseKind: "json",
929
- errors: [
930
- "validation:invalid_input",
931
- "resource:not_found",
932
- "resource:conflict",
933
- "server:internal_error"
934
- ]
929
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
935
930
  },
936
931
  unpublishTeamMemberProfile: {
937
932
  path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
@@ -1184,6 +1179,13 @@ var ENDPOINT_DEFINITIONS = {
1184
1179
  auth: "user",
1185
1180
  responseKind: "json"
1186
1181
  },
1182
+ exportBookingAppointmentsCsv: {
1183
+ path: "/sites/{siteId}/bookings/appointments/export.csv",
1184
+ method: "GET",
1185
+ auth: "user",
1186
+ errors: [],
1187
+ responseKind: "blob"
1188
+ },
1187
1189
  createAppointment: {
1188
1190
  path: "/sites/{siteId}/bookings/appointments",
1189
1191
  method: "POST",
@@ -1311,6 +1313,13 @@ var ENDPOINT_DEFINITIONS = {
1311
1313
  auth: "user",
1312
1314
  responseKind: "json"
1313
1315
  },
1316
+ exportCourseEnrollmentsCsv: {
1317
+ path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
1318
+ method: "GET",
1319
+ auth: "user",
1320
+ errors: [],
1321
+ responseKind: "blob"
1322
+ },
1314
1323
  listCourseWaitlist: {
1315
1324
  path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist",
1316
1325
  method: "GET",
@@ -2069,6 +2078,63 @@ var ENDPOINT_DEFINITIONS = {
2069
2078
  auth: "user",
2070
2079
  responseKind: "json"
2071
2080
  },
2081
+ updateRegisteredDomainContact: {
2082
+ path: "/domains/{domainId}/registrar/contact",
2083
+ method: "POST",
2084
+ errors: [
2085
+ "validation:invalid_input",
2086
+ "resource:not_found",
2087
+ "auth:forbidden",
2088
+ "external:service_error",
2089
+ "external:registrar_orphaned_contact_profile",
2090
+ "server:internal_error"
2091
+ ],
2092
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2093
+ auth: "user",
2094
+ responseKind: "json"
2095
+ },
2096
+ setRegisteredDomainPrivacy: {
2097
+ path: "/domains/{domainId}/registrar/privacy",
2098
+ method: "POST",
2099
+ errors: [
2100
+ "validation:invalid_input",
2101
+ "resource:not_found",
2102
+ "auth:forbidden",
2103
+ "external:service_error",
2104
+ "server:internal_error"
2105
+ ],
2106
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2107
+ auth: "user",
2108
+ responseKind: "json"
2109
+ },
2110
+ setRegisteredDomainAutoRenew: {
2111
+ path: "/domains/{domainId}/registrar/auto-renew",
2112
+ method: "POST",
2113
+ errors: [
2114
+ "validation:invalid_input",
2115
+ "resource:not_found",
2116
+ "auth:forbidden",
2117
+ "external:service_error",
2118
+ "server:internal_error"
2119
+ ],
2120
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2121
+ auth: "user",
2122
+ responseKind: "json"
2123
+ },
2124
+ getRegisteredDomainRenewalPosture: {
2125
+ path: "/domains/{domainId}/registrar/renewal",
2126
+ method: "GET",
2127
+ errors: [
2128
+ "validation:invalid_input",
2129
+ "resource:not_found",
2130
+ "auth:forbidden",
2131
+ "external:service_error",
2132
+ "server:internal_error"
2133
+ ],
2134
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2135
+ auth: "user",
2136
+ responseKind: "json"
2137
+ },
2072
2138
  retryDomainVercel: {
2073
2139
  path: "/domains/{domainId}/vercel",
2074
2140
  method: "POST",
@@ -2616,6 +2682,14 @@ var ENDPOINT_DEFINITIONS = {
2616
2682
  auth: "user",
2617
2683
  responseKind: "json"
2618
2684
  },
2685
+ exportSeoPagesCsv: {
2686
+ path: "/sites/{siteId}/seo/pages",
2687
+ method: "GET",
2688
+ tags: ["site-{siteId}", "seo-pages-{siteId}"],
2689
+ auth: "user",
2690
+ responseKind: "blob",
2691
+ errors: []
2692
+ },
2619
2693
  getSeoQueries: {
2620
2694
  path: "/sites/{siteId}/seo/queries",
2621
2695
  method: "GET",
@@ -2624,6 +2698,14 @@ var ENDPOINT_DEFINITIONS = {
2624
2698
  auth: "user",
2625
2699
  responseKind: "json"
2626
2700
  },
2701
+ exportSeoQueriesCsv: {
2702
+ path: "/sites/{siteId}/seo/queries",
2703
+ method: "GET",
2704
+ tags: ["site-{siteId}", "seo-queries-{siteId}"],
2705
+ auth: "user",
2706
+ responseKind: "blob",
2707
+ errors: []
2708
+ },
2627
2709
  getPerformanceOverview: {
2628
2710
  path: "/sites/{siteId}/performance/overview",
2629
2711
  method: "GET",
@@ -2672,7 +2754,12 @@ var ENDPOINT_DEFINITIONS = {
2672
2754
  path: "/media/{assetId}/canonical-crop",
2673
2755
  method: "POST",
2674
2756
  tags: ["media", "media-{assetId}"],
2675
- errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"],
2757
+ errors: [
2758
+ "validation:invalid_input",
2759
+ "resource:not_found",
2760
+ "resource:conflict",
2761
+ "server:internal_error"
2762
+ ],
2676
2763
  auth: "user",
2677
2764
  responseKind: "json"
2678
2765
  },
@@ -3004,7 +3091,7 @@ var ENDPOINT_DEFINITIONS = {
3004
3091
  method: "GET",
3005
3092
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3006
3093
  auth: "user",
3007
- responseKind: "text"
3094
+ responseKind: "blob"
3008
3095
  },
3009
3096
  // Public submit
3010
3097
  submitForm: {
@@ -3887,6 +3974,14 @@ var ENDPOINT_DEFINITIONS = {
3887
3974
  auth: "user",
3888
3975
  responseKind: "json"
3889
3976
  },
3977
+ exportEventSeriesAttendeesCsv: {
3978
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/attendees/export.csv",
3979
+ method: "GET",
3980
+ tags: ["site-{siteId}", "event-series-{seriesId}"],
3981
+ auth: "user",
3982
+ errors: [],
3983
+ responseKind: "blob"
3984
+ },
3890
3985
  listEventSeriesWaitlist: {
3891
3986
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3892
3987
  method: "GET",
@@ -4450,6 +4545,14 @@ var ENDPOINT_DEFINITIONS = {
4450
4545
  auth: "user",
4451
4546
  responseKind: "json"
4452
4547
  },
4548
+ exportBookingCustomersCsv: {
4549
+ path: "/sites/{siteId}/bookings/customers/export.csv",
4550
+ method: "GET",
4551
+ tags: ["site-{siteId}", "customers-{siteId}"],
4552
+ auth: "user",
4553
+ errors: [],
4554
+ responseKind: "blob"
4555
+ },
4453
4556
  createBookingCustomer: {
4454
4557
  path: "/sites/{siteId}/bookings/customers",
4455
4558
  method: "POST",
@@ -4477,6 +4580,21 @@ var ENDPOINT_DEFINITIONS = {
4477
4580
  "server:internal_error"
4478
4581
  ]
4479
4582
  },
4583
+ rectifyBookingParticipantIdentity: {
4584
+ path: "/sites/{siteId}/bookings/participants/{participantId}/identity",
4585
+ method: "PATCH",
4586
+ tags: ["site-{siteId}", "customers-{siteId}"],
4587
+ auth: "user",
4588
+ responseKind: "json",
4589
+ errors: [
4590
+ "validation:invalid_input",
4591
+ "auth:forbidden",
4592
+ "resource:not_found",
4593
+ "resource:already_exists",
4594
+ "resource:conflict",
4595
+ "server:internal_error"
4596
+ ]
4597
+ },
4480
4598
  listCustomerPasses: {
4481
4599
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4482
4600
  method: "GET",
@@ -4611,13 +4729,46 @@ var ENDPOINT_DEFINITIONS = {
4611
4729
  auth: "user",
4612
4730
  responseKind: "json"
4613
4731
  },
4732
+ exportMoneyPaymentsCsv: {
4733
+ path: "/sites/{siteId}/bookings/money/payments/export.csv",
4734
+ method: "GET",
4735
+ tags: ["site-{siteId}", "bookings", "money-payments-{siteId}"],
4736
+ errors: [],
4737
+ auth: "user",
4738
+ responseKind: "blob"
4739
+ },
4740
+ exportMoneyBreakdownsCsv: {
4741
+ path: "/sites/{siteId}/bookings/money/report/breakdowns/export.csv",
4742
+ method: "GET",
4743
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4744
+ errors: [],
4745
+ auth: "user",
4746
+ responseKind: "blob"
4747
+ },
4748
+ exportMoneyTimeSeriesCsv: {
4749
+ path: "/sites/{siteId}/bookings/money/report/time-series/export.csv",
4750
+ method: "GET",
4751
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4752
+ errors: [],
4753
+ auth: "user",
4754
+ responseKind: "blob"
4755
+ },
4614
4756
  listBookingActivity: {
4615
4757
  path: "/sites/{siteId}/bookings/activity",
4616
4758
  method: "GET",
4617
4759
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4760
+ errors: [],
4618
4761
  auth: "user",
4619
4762
  responseKind: "json"
4620
4763
  },
4764
+ exportBookingActivityCsv: {
4765
+ path: "/sites/{siteId}/bookings/activity/export.csv",
4766
+ method: "GET",
4767
+ tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4768
+ errors: [],
4769
+ auth: "user",
4770
+ responseKind: "blob"
4771
+ },
4621
4772
  // Site logs
4622
4773
  listSiteActivityLogs: {
4623
4774
  path: "/sites/{siteId}/logs/activity",
@@ -4769,13 +4920,6 @@ var ENDPOINT_DEFINITIONS = {
4769
4920
  auth: "user",
4770
4921
  responseKind: "blob"
4771
4922
  },
4772
- exportSeoCsv: {
4773
- path: "/sites/{siteId}/seo/export",
4774
- method: "GET",
4775
- tags: ["site-{siteId}", "seo"],
4776
- auth: "user",
4777
- responseKind: "blob"
4778
- },
4779
4923
  // Admin site cost (for admin panel)
4780
4924
  adminSiteCost: {
4781
4925
  path: "/admin/sites/{siteId}/cost",
@@ -6914,6 +7058,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
6914
7058
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
6915
7059
  "missing_amount",
6916
7060
  "amount_exceeds_remaining",
7061
+ "credit_refunds_disabled",
7062
+ "missing_credit_customer",
6917
7063
  "deposit_refund_override_required",
6918
7064
  "refund_revoke_requires_full_line_refund",
6919
7065
  "unified_order_link_required"
@@ -7533,12 +7679,29 @@ function defineFrameCapability(capability) {
7533
7679
  function defineBlockDesignCapability(capability) {
7534
7680
  return {
7535
7681
  ...capability,
7536
- kind: "designed"
7682
+ kind: "designed",
7683
+ sectionHeights: capability.sectionHeights ?? ["default"],
7684
+ imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7685
+ imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7686
+ testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"]
7537
7687
  };
7538
7688
  }
7539
7689
 
7540
7690
  // ../theme-core/src/site-styles/appearancePresets.ts
7691
+ function assertValidOptionGroups(preset2) {
7692
+ preset2.optionGroups?.forEach((group) => {
7693
+ const selectedOption = group.options.find(
7694
+ (option) => option.id === group.selectedOptionId
7695
+ );
7696
+ if (!selectedOption) {
7697
+ throw new Error(
7698
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7699
+ );
7700
+ }
7701
+ });
7702
+ }
7541
7703
  function defineBlockAppearancePreset(preset2) {
7704
+ assertValidOptionGroups(preset2);
7542
7705
  return preset2;
7543
7706
  }
7544
7707
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7551,13 +7714,122 @@ var appearancePresets = [
7551
7714
  target: "hero",
7552
7715
  label: "Immersive image hero",
7553
7716
  blockKinds: ["block.hero"],
7717
+ constraints: {
7718
+ layoutFamilies: ["centered", "compact"]
7719
+ },
7720
+ design: {
7721
+ sectionSurface: "hero-image",
7722
+ contentFrame: plainFrame,
7723
+ itemSurface: "none",
7724
+ transitionAfter: "soft-fade-short",
7725
+ emphasis: "high",
7726
+ sectionHeight: "hero",
7727
+ imageSurfaceTreatment: { kind: "neutral-wash" }
7728
+ }
7729
+ }),
7730
+ defineBlockAppearancePreset({
7731
+ kind: "block-design",
7732
+ id: "hero-brand-scrim",
7733
+ target: "hero",
7734
+ label: "Brand scrim image hero",
7735
+ blockKinds: ["block.hero"],
7736
+ constraints: {
7737
+ layoutFamilies: ["centered", "compact"]
7738
+ },
7739
+ optionGroups: [
7740
+ {
7741
+ id: "image-surface-treatment",
7742
+ label: "Treatment",
7743
+ selectedOptionId: "brand-scrim-primary",
7744
+ options: [
7745
+ {
7746
+ id: "brand-scrim-primary",
7747
+ label: "Brand scrim",
7748
+ designPatch: {
7749
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7750
+ }
7751
+ },
7752
+ {
7753
+ id: "neutral-scrim",
7754
+ label: "Neutral scrim",
7755
+ designPatch: {
7756
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7757
+ }
7758
+ }
7759
+ ]
7760
+ }
7761
+ ],
7762
+ layoutPatches: [
7763
+ {
7764
+ constraints: {
7765
+ layoutVariantKeys: ["micro"]
7766
+ },
7767
+ designPatch: {
7768
+ sectionHeight: "banner"
7769
+ }
7770
+ }
7771
+ ],
7772
+ design: {
7773
+ sectionSurface: "hero-image",
7774
+ contentFrame: plainFrame,
7775
+ itemSurface: "none",
7776
+ transitionAfter: "soft-fade-short",
7777
+ emphasis: "high",
7778
+ sectionHeight: "immersive",
7779
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7780
+ }
7781
+ }),
7782
+ defineBlockAppearancePreset({
7783
+ kind: "block-design",
7784
+ id: "hero-brand-scrim-fixed-frame",
7785
+ target: "hero",
7786
+ label: "Fixed-frame brand scrim hero",
7787
+ blockKinds: ["block.hero"],
7788
+ constraints: {
7789
+ layoutFamilies: ["centered", "compact"]
7790
+ },
7791
+ optionGroups: [
7792
+ {
7793
+ id: "image-surface-treatment",
7794
+ label: "Treatment",
7795
+ selectedOptionId: "brand-scrim-primary",
7796
+ options: [
7797
+ {
7798
+ id: "brand-scrim-primary",
7799
+ label: "Brand scrim",
7800
+ designPatch: {
7801
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7802
+ }
7803
+ },
7804
+ {
7805
+ id: "neutral-scrim",
7806
+ label: "Neutral scrim",
7807
+ designPatch: {
7808
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7809
+ }
7810
+ }
7811
+ ]
7812
+ }
7813
+ ],
7814
+ layoutPatches: [
7815
+ {
7816
+ constraints: {
7817
+ layoutVariantKeys: ["micro"]
7818
+ },
7819
+ designPatch: {
7820
+ sectionHeight: "banner"
7821
+ }
7822
+ }
7823
+ ],
7554
7824
  design: {
7555
7825
  sectionSurface: "hero-image",
7556
7826
  contentFrame: plainFrame,
7557
7827
  itemSurface: "none",
7558
7828
  transitionAfter: "soft-fade-short",
7559
7829
  emphasis: "high",
7560
- heroLegibility: "scrim-gradient"
7830
+ sectionHeight: "immersive",
7831
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7832
+ imageSurfaceMotion: "fixed-frame"
7561
7833
  }
7562
7834
  }),
7563
7835
  defineBlockAppearancePreset({
@@ -7574,17 +7846,26 @@ var appearancePresets = [
7574
7846
  emphasis: "high"
7575
7847
  }
7576
7848
  }),
7849
+ defineBlockAppearancePreset({
7850
+ kind: "block-design",
7851
+ id: "body-text-editorial-intro",
7852
+ target: "body-text",
7853
+ label: "Editorial intro copy",
7854
+ blockKinds: ["block.body-text"],
7855
+ design: {
7856
+ sectionSurface: "base",
7857
+ contentFrame: plainFrame,
7858
+ itemSurface: "none",
7859
+ transitionAfter: "soft-fade-short",
7860
+ emphasis: "high"
7861
+ }
7862
+ }),
7577
7863
  defineBlockAppearancePreset({
7578
7864
  kind: "block-design",
7579
7865
  id: "offerings-calm-list",
7580
7866
  target: "offerings",
7581
7867
  label: "Calm offerings list",
7582
- blockKinds: [
7583
- "block.event-listing",
7584
- "block.event-calendar",
7585
- "block.event-spotlight",
7586
- "block.product-list"
7587
- ],
7868
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7588
7869
  design: {
7589
7870
  sectionSurface: "muted-band",
7590
7871
  contentFrame: plainFrame,
@@ -7663,6 +7944,35 @@ var appearancePresets = [
7663
7944
  emphasis: "high"
7664
7945
  }
7665
7946
  }),
7947
+ defineBlockAppearancePreset({
7948
+ kind: "block-design",
7949
+ id: "testimonials-dark-proof",
7950
+ target: "testimonials",
7951
+ label: "Dark proof panel",
7952
+ blockKinds: ["block.testimonials"],
7953
+ design: {
7954
+ sectionSurface: "accent-band",
7955
+ contentFrame: panelFrame("raised"),
7956
+ itemSurface: "raised",
7957
+ transitionAfter: "soft-fade-short",
7958
+ emphasis: "high"
7959
+ }
7960
+ }),
7961
+ defineBlockAppearancePreset({
7962
+ kind: "block-design",
7963
+ id: "testimonials-accent-quote-proof",
7964
+ target: "testimonials",
7965
+ label: "Accent quote proof",
7966
+ blockKinds: ["block.testimonials"],
7967
+ design: {
7968
+ sectionSurface: "accent-band",
7969
+ contentFrame: plainFrame,
7970
+ itemSurface: "raised",
7971
+ transitionAfter: "soft-fade-short",
7972
+ emphasis: "high",
7973
+ testimonialCardTreatment: "accent-quote"
7974
+ }
7975
+ }),
7666
7976
  defineBlockAppearancePreset({
7667
7977
  kind: "block-design",
7668
7978
  id: "faq-contained-help",
@@ -7691,6 +8001,20 @@ var appearancePresets = [
7691
8001
  emphasis: "medium"
7692
8002
  }
7693
8003
  }),
8004
+ defineBlockAppearancePreset({
8005
+ kind: "block-design",
8006
+ id: "contact-form-dark-card",
8007
+ target: "contact-form",
8008
+ label: "Dark form card",
8009
+ blockKinds: ["block.form"],
8010
+ design: {
8011
+ sectionSurface: "accent-band",
8012
+ contentFrame: panelFrame("raised"),
8013
+ itemSurface: "none",
8014
+ transitionAfter: "soft-fade-short",
8015
+ emphasis: "high"
8016
+ }
8017
+ }),
7694
8018
  defineBlockAppearancePreset({
7695
8019
  kind: "block-design",
7696
8020
  id: "cta-accent-band",
@@ -7710,9 +8034,33 @@ var appearancePresets = [
7710
8034
  id: "header-clean-base",
7711
8035
  target: "site-header",
7712
8036
  label: "Clean base header",
7713
- chrome: {
7714
- surface: "base",
7715
- emphasis: "medium"
8037
+ header: {
8038
+ surface: {
8039
+ kind: "neutral-solid",
8040
+ token: "surface",
8041
+ textColorToken: "text"
8042
+ },
8043
+ navTreatment: "minimal",
8044
+ dropdownTreatment: "surface",
8045
+ ctaTreatment: "default",
8046
+ behavior: "default"
8047
+ }
8048
+ }),
8049
+ defineSiteChromeAppearancePreset({
8050
+ kind: "site-chrome",
8051
+ id: "site-header-brand-solid-inverted-cta",
8052
+ target: "site-header",
8053
+ label: "Brand solid header with inverted CTA",
8054
+ header: {
8055
+ surface: {
8056
+ kind: "brand-solid",
8057
+ token: "primary",
8058
+ textColorToken: "primaryForeground"
8059
+ },
8060
+ navTreatment: "uppercase-underline",
8061
+ dropdownTreatment: "matched-solid",
8062
+ ctaTreatment: "inverted",
8063
+ behavior: "sticky-shrink"
7716
8064
  }
7717
8065
  }),
7718
8066
  defineSiteChromeAppearancePreset({
@@ -7720,10 +8068,31 @@ var appearancePresets = [
7720
8068
  id: "footer-muted-grounding",
7721
8069
  target: "site-footer",
7722
8070
  label: "Muted grounding footer",
7723
- chrome: {
8071
+ footer: {
8072
+ kind: "grounding",
7724
8073
  surface: "muted-band",
7725
8074
  emphasis: "low"
7726
8075
  }
8076
+ }),
8077
+ defineSiteChromeAppearancePreset({
8078
+ kind: "site-chrome",
8079
+ id: "site-footer-brand-two-band",
8080
+ target: "site-footer",
8081
+ label: "Two-band brand footer",
8082
+ footer: {
8083
+ kind: "brand-two-band",
8084
+ surface: {
8085
+ token: "primary",
8086
+ shade: "800",
8087
+ textColorToken: "primaryForeground"
8088
+ },
8089
+ bottomBand: {
8090
+ token: "primary",
8091
+ shade: "900",
8092
+ textColorToken: "primaryForeground"
8093
+ },
8094
+ emphasis: "high"
8095
+ }
7727
8096
  })
7728
8097
  ];
7729
8098
 
@@ -8383,6 +8752,111 @@ var pebble = defineButtonPersonality({
8383
8752
  }
8384
8753
  });
8385
8754
 
8755
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
8756
+ var showtimePill = defineButtonPersonality({
8757
+ id: "showtime-pill",
8758
+ name: "Showtime Pill",
8759
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
8760
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
8761
+ buttonSystem: {
8762
+ global: {
8763
+ cornerStyle: "pill",
8764
+ shadow: "low",
8765
+ textTransform: "uppercase",
8766
+ fontWeight: 700,
8767
+ borderWidth: 2,
8768
+ hoverTransform: "lift",
8769
+ hoverColor: "darken",
8770
+ typography: "body",
8771
+ paddingPreset: "spacious",
8772
+ italic: false
8773
+ },
8774
+ sizes: {
8775
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
8776
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
8777
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
8778
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
8779
+ },
8780
+ variants: [
8781
+ {
8782
+ id: "primary",
8783
+ name: "Primary",
8784
+ enabled: true,
8785
+ priority: 1,
8786
+ background: { type: "solid", colorToken: "primary" },
8787
+ textColorToken: "background",
8788
+ borderRadius: "rounded-full",
8789
+ effects: {
8790
+ hover: [{ effectId: "pop" }]
8791
+ }
8792
+ },
8793
+ {
8794
+ id: "secondary",
8795
+ name: "Secondary",
8796
+ enabled: true,
8797
+ priority: 2,
8798
+ background: { type: "transparent" },
8799
+ textColorToken: "primary",
8800
+ borderRadius: "rounded-full",
8801
+ border: { widthClass: "border-2", colorToken: "primary" },
8802
+ effects: {
8803
+ hover: [{ effectId: "pop" }]
8804
+ }
8805
+ },
8806
+ {
8807
+ id: "hero",
8808
+ name: "Hero",
8809
+ enabled: true,
8810
+ priority: 1,
8811
+ background: { type: "solid", colorToken: "secondary" },
8812
+ textColorToken: "primary",
8813
+ borderRadius: "rounded-full",
8814
+ effects: {
8815
+ hover: [{ effectId: "pop" }]
8816
+ }
8817
+ },
8818
+ {
8819
+ id: "header",
8820
+ name: "Header",
8821
+ enabled: true,
8822
+ priority: 2,
8823
+ background: { type: "solid", colorToken: "background" },
8824
+ textColorToken: "primary",
8825
+ borderRadius: "rounded-full",
8826
+ border: { widthClass: "border-2", colorToken: "primary" },
8827
+ effects: {
8828
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8829
+ }
8830
+ },
8831
+ {
8832
+ id: "outline",
8833
+ name: "Outline",
8834
+ enabled: true,
8835
+ priority: 3,
8836
+ background: { type: "transparent" },
8837
+ textColorToken: "primary",
8838
+ borderRadius: "rounded-full",
8839
+ border: { widthClass: "border-2", colorToken: "primary" },
8840
+ effects: {
8841
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8842
+ }
8843
+ },
8844
+ {
8845
+ id: "ghost",
8846
+ name: "Ghost",
8847
+ enabled: true,
8848
+ priority: 3,
8849
+ background: { type: "transparent" },
8850
+ textColorToken: "primary",
8851
+ borderRadius: "rounded-full",
8852
+ effects: {
8853
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8854
+ }
8855
+ }
8856
+ ]
8857
+ }
8858
+ });
8859
+
8386
8860
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8387
8861
  var softPill = defineButtonPersonality({
8388
8862
  id: "soft-pill",
@@ -8463,7 +8937,8 @@ var buttonPersonalities = [
8463
8937
  editorialLink,
8464
8938
  pebble,
8465
8939
  inkStamp,
8466
- brushedWash
8940
+ brushedWash,
8941
+ showtimePill
8467
8942
  ];
8468
8943
  var personalitiesById = new Map(
8469
8944
  buttonPersonalities.map((p) => [p.id, p])
@@ -8994,14 +9469,7 @@ var proseLinkStyleSchema = z21.object({
8994
9469
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
8995
9470
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
8996
9471
  });
8997
- var semanticSpacingSchema = z21.enum([
8998
- "none",
8999
- "compact",
9000
- "cozy",
9001
- "medium",
9002
- "comfortable",
9003
- "spacious"
9004
- ]);
9472
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9005
9473
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9006
9474
  var boxBackgroundOverlaySchema = z21.object({
9007
9475
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9018,6 +9486,7 @@ var boxBackgroundSchema = z21.object({
9018
9486
  scale: z21.string().nullable().optional(),
9019
9487
  position: z21.string().nullable().optional(),
9020
9488
  opacity: z21.number().min(0).max(1).nullable().optional(),
9489
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9021
9490
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9022
9491
  textColor: z21.string().nullable().optional(),
9023
9492
  headingColor: z21.string().nullable().optional()
@@ -9025,7 +9494,7 @@ var boxBackgroundSchema = z21.object({
9025
9494
  var sectionStylesOverrideSchema = z21.object({
9026
9495
  background: boxBackgroundSchema.nullable().optional(),
9027
9496
  spacing: semanticSpacingSchema.nullable().optional(),
9028
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9497
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9029
9498
  });
9030
9499
  var containerStylesOverrideSchema = z21.object({
9031
9500
  background: boxBackgroundSchema.nullable().optional(),
@@ -9044,7 +9513,8 @@ var cardStylesOverrideSchema = z21.object({
9044
9513
  border: cardBorderOverrideSchema.nullable().optional(),
9045
9514
  spacing: semanticSpacingSchema.nullable().optional(),
9046
9515
  raised: z21.boolean().nullable().optional(),
9047
- rounded: boxRoundedSchema.nullable().optional()
9516
+ rounded: boxRoundedSchema.nullable().optional(),
9517
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9048
9518
  });
9049
9519
  var blockStyleOverridesSchema = z21.object({
9050
9520
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9119,15 +9589,7 @@ var inputStyle = z21.object({
9119
9589
  });
9120
9590
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9121
9591
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9122
- var headerNavStyle = z21.enum([
9123
- "minimal",
9124
- "underline",
9125
- "underline-grow",
9126
- "capsule",
9127
- "scale",
9128
- "frosted",
9129
- "solid"
9130
- ]);
9592
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9131
9593
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9132
9594
  var headerMaxWidth = z21.enum(["container", "full"]);
9133
9595
  var headerContainerSchema = z21.object({
@@ -9181,6 +9643,7 @@ var dropdownStyleSchema = z21.object({
9181
9643
  // optional = no override (browser default)
9182
9644
  }).optional();
9183
9645
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9646
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9184
9647
  var navContainerSchema = z21.object({
9185
9648
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9186
9649
  tint: z21.string().nullable().optional(),
@@ -9199,7 +9662,10 @@ var headerSchema = z21.object({
9199
9662
  shrinkOnScroll: z21.boolean(),
9200
9663
  maxWidth: headerMaxWidth,
9201
9664
  logoOverride: mediaSchema.nullable().optional(),
9202
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9665
+ background: headerBackgroundSchema.default({
9666
+ type: "color",
9667
+ color: "surface"
9668
+ }),
9203
9669
  textColor: z21.string().nullable().optional(),
9204
9670
  // Site title and general header text
9205
9671
  navStyle: headerNavStyle,
@@ -9219,6 +9685,13 @@ var headerSchema = z21.object({
9219
9685
  navLinkStyle: navLinkStyleSchema.optional(),
9220
9686
  // CTA button spacing (desktop left margin)
9221
9687
  ctaGap: headerCtaGapSchema.optional(),
9688
+ // Semantic CTA treatment for header/nav CTA buttons. The Theme V2 compiler
9689
+ // materializes this to ctaVariant against the active button personality.
9690
+ ctaTreatment: headerCtaTreatmentSchema.optional(),
9691
+ // Optional theme-level CTA variant for header/nav CTA buttons.
9692
+ // Internal runtime bridge for the block renderer; prefer ctaTreatment in
9693
+ // authored Theme V2 concepts.
9694
+ ctaVariant: z21.string().min(1).optional(),
9222
9695
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9223
9696
  dropdownStyle: dropdownStyleSchema
9224
9697
  });
@@ -9275,7 +9748,10 @@ var footerSchema = z21.object({
9275
9748
  variant: footerVariant,
9276
9749
  maxWidth: footerMaxWidth,
9277
9750
  showLogoText: z21.boolean().optional(),
9278
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9751
+ background: headerBackgroundSchema.default({
9752
+ type: "color",
9753
+ color: "surface"
9754
+ }),
9279
9755
  // Footer nav styling (independent from header)
9280
9756
  navStyle: headerNavStyle.default("minimal"),
9281
9757
  navColor: z21.string().nullable().optional(),
@@ -9297,17 +9773,7 @@ var layoutSchema = z21.object({
9297
9773
  desktop: containerPaddingPresetSchema.optional()
9298
9774
  }).optional()
9299
9775
  }).optional();
9300
- var heroTypographySizeSchema = z21.enum([
9301
- "sm",
9302
- "base",
9303
- "lg",
9304
- "xl",
9305
- "2xl",
9306
- "3xl",
9307
- "4xl",
9308
- "5xl",
9309
- "6xl"
9310
- ]);
9776
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9311
9777
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9312
9778
  var heroResponsiveTypographySchema = z21.object({
9313
9779
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9332,6 +9798,13 @@ var heroTypographySchema = z21.object({
9332
9798
  var heroSchema = z21.object({
9333
9799
  typography: heroTypographySchema.optional()
9334
9800
  }).optional();
9801
+ var bodyTextIntroTypographySizeSchema = z21.enum(["default", "editorial"]);
9802
+ var bodyTextSchema = z21.object({
9803
+ intro: z21.object({
9804
+ paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
9805
+ headingSize: bodyTextIntroTypographySizeSchema.optional()
9806
+ }).optional()
9807
+ }).optional();
9335
9808
  var gradientsSchema = z21.object({
9336
9809
  button: z21.string().min(1).nullable().optional(),
9337
9810
  hero: z21.string().min(1).nullable().optional(),
@@ -9353,6 +9826,7 @@ var themeSchema = z21.object({
9353
9826
  gradients: gradientsSchema.optional(),
9354
9827
  layout: layoutSchema,
9355
9828
  hero: heroSchema,
9829
+ bodyText: bodyTextSchema,
9356
9830
  header: headerSchema,
9357
9831
  footer: footerSchema,
9358
9832
  buttons: buttonSystemSchema.optional(),
@@ -9376,10 +9850,7 @@ var themeSchema = z21.object({
9376
9850
  ).optional(),
9377
9851
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9378
9852
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9379
- blockOverrides: z21.record(
9380
- z21.string(),
9381
- blockThemeOverrideSchema
9382
- ).optional(),
9853
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9383
9854
  // Structured custom CSS rules
9384
9855
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9385
9856
  customCssRules: customCssRulesSchema,
@@ -9550,6 +10021,28 @@ var brandLedJewel = definePaletteVariant({
9550
10021
  { name: "border", hex: "#a8a29e" }
9551
10022
  ]
9552
10023
  });
10024
+ var brandLedBurgundyGold = definePaletteVariant({
10025
+ id: "brand-led-burgundy-gold",
10026
+ name: "Brand-led \u2014 Burgundy Gold",
10027
+ description: "Deep burgundy with warm gold accents and soft neutral grounds.",
10028
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
10029
+ mode: "light",
10030
+ colors: [
10031
+ { name: "primary", hex: "#7c2e38" },
10032
+ { name: "secondary", hex: "#d4af37" },
10033
+ { name: "accent", hex: "#b8e19a" },
10034
+ { name: "success", hex: "#10b981" },
10035
+ { name: "warning", hex: "#f59e0b" },
10036
+ { name: "destructive", hex: "#ef4444" },
10037
+ { name: "background", hex: "#f1dfd0" },
10038
+ { name: "surface", hex: "#f5e6db" },
10039
+ { name: "surfaceAlt", hex: "#f8ece3" },
10040
+ { name: "muted", hex: "#c9b8a8" },
10041
+ { name: "text", hex: "#400000" },
10042
+ { name: "primaryForeground", hex: "#ffffff" },
10043
+ { name: "border", hex: "#c9b8a8" }
10044
+ ]
10045
+ });
9553
10046
 
9554
10047
  // ../theme-core/src/palette/variants/high-contrast.ts
9555
10048
  var highContrastInk = definePaletteVariant({
@@ -9761,6 +10254,7 @@ var paletteVariants = [
9761
10254
  brandLedCool,
9762
10255
  brandLedWarm,
9763
10256
  brandLedJewel,
10257
+ brandLedBurgundyGold,
9764
10258
  // Warm-neutral family
9765
10259
  warmNeutralClay,
9766
10260
  warmNeutralCream,
@@ -9836,7 +10330,8 @@ var curatedSiteStyleIdValues = [
9836
10330
  "site-style:quiet-luxury",
9837
10331
  "site-style:practical-services",
9838
10332
  "site-style:modern-wellness",
9839
- "site-style:bold-launch"
10333
+ "site-style:bold-launch",
10334
+ "site-style:south-west-twerk-school"
9840
10335
  ];
9841
10336
  var quietBudget = {
9842
10337
  accentDensity: "low",
@@ -9891,6 +10386,8 @@ function defineCuratedSiteStyle(input) {
9891
10386
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
9892
10387
  supportedTransitions: generatedDesignOptionCatalog.transitions
9893
10388
  },
10389
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10390
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
9894
10391
  buttonPersonalityChoices: input.buttonPersonalityChoices,
9895
10392
  paletteVariantChoices: input.paletteVariantChoices
9896
10393
  };
@@ -10137,6 +10634,101 @@ var curatedSiteStyles = [
10137
10634
  paletteChoice("brand-led-jewel"),
10138
10635
  paletteChoice("brand-led-warm")
10139
10636
  ]
10637
+ }),
10638
+ defineCuratedSiteStyle({
10639
+ id: "site-style:south-west-twerk-school",
10640
+ name: "South West Twerk School",
10641
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
10642
+ 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.",
10643
+ selectionKeywords: [
10644
+ "dance",
10645
+ "classes",
10646
+ "workshop",
10647
+ "school",
10648
+ "movement",
10649
+ "performance",
10650
+ "community"
10651
+ ],
10652
+ tokenRecipes: {
10653
+ palette: "brand-led",
10654
+ contrast: "maximum",
10655
+ radius: "soft",
10656
+ shadow: "layered",
10657
+ typography: "clean-sans",
10658
+ spacing: "airy",
10659
+ motion: "expressive"
10660
+ },
10661
+ compositionBudget: expressiveBudget,
10662
+ themeOverrides: {
10663
+ typography: {
10664
+ body: {
10665
+ family: "Manrope, system-ui, sans-serif",
10666
+ size: "lg",
10667
+ weight: "regular",
10668
+ lineHeight: "relaxed",
10669
+ letterSpacing: "normal"
10670
+ },
10671
+ headings: {
10672
+ default: {
10673
+ family: '"TAN - PEARL", sans-serif',
10674
+ weight: "bold",
10675
+ lineHeight: "normal",
10676
+ letterSpacing: "tight",
10677
+ colorToken: "primary",
10678
+ italic: null,
10679
+ case: null
10680
+ },
10681
+ h1: {
10682
+ size: "xl",
10683
+ weight: "bold",
10684
+ lineHeight: "normal",
10685
+ letterSpacing: "tight",
10686
+ italic: null
10687
+ },
10688
+ h2: {
10689
+ size: "lg",
10690
+ weight: "bold",
10691
+ lineHeight: "normal",
10692
+ letterSpacing: "normal",
10693
+ italic: null
10694
+ },
10695
+ h3: {
10696
+ size: "md",
10697
+ weight: "bold",
10698
+ lineHeight: "normal",
10699
+ letterSpacing: "normal",
10700
+ italic: null
10701
+ }
10702
+ },
10703
+ scale: "balanced"
10704
+ },
10705
+ bodyText: {
10706
+ intro: {
10707
+ paragraphSize: "editorial",
10708
+ headingSize: "editorial"
10709
+ }
10710
+ }
10711
+ },
10712
+ recommendedAppearancePresetIds: [
10713
+ "site-header-brand-solid-inverted-cta",
10714
+ "site-footer-brand-two-band",
10715
+ "hero-brand-scrim-fixed-frame",
10716
+ "body-text-editorial-intro",
10717
+ "testimonials-accent-quote-proof",
10718
+ "contact-form-dark-card"
10719
+ ],
10720
+ buttonPersonalityChoices: [
10721
+ buttonChoice("showtime-pill"),
10722
+ buttonChoice("confident-chip"),
10723
+ buttonChoice("ink-stamp"),
10724
+ buttonChoice("brushed-wash")
10725
+ ],
10726
+ paletteVariantChoices: [
10727
+ paletteChoice("brand-led-burgundy-gold"),
10728
+ paletteChoice("brand-led-jewel"),
10729
+ paletteChoice("brand-led-warm"),
10730
+ paletteChoice("high-contrast-ink")
10731
+ ]
10140
10732
  })
10141
10733
  ];
10142
10734
  var curatedSiteStylesById = new Map(
@@ -10181,6 +10773,40 @@ var heroLegibilityStrategySchema = z23.enum([
10181
10773
  "scrim-gradient",
10182
10774
  "solid-panel"
10183
10775
  ]);
10776
+ var sectionHeightIntentSchema = z23.enum([
10777
+ "default",
10778
+ "banner",
10779
+ "hero",
10780
+ "immersive"
10781
+ ]);
10782
+ var imageSurfaceTreatmentIntensitySchema = z23.enum(["soft", "balanced", "strong"]);
10783
+ var imageSurfaceMotionSchema = z23.enum(["static", "fixed-frame"]);
10784
+ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
10785
+ z23.object({ kind: z23.literal("none") }).strict(),
10786
+ z23.object({
10787
+ kind: z23.literal("brand-scrim"),
10788
+ token: z23.enum(["primary", "secondary", "accent"]),
10789
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10790
+ }).strict(),
10791
+ z23.object({
10792
+ kind: z23.literal("brand-wash"),
10793
+ token: z23.enum(["primary", "secondary", "accent"]),
10794
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10795
+ }).strict(),
10796
+ z23.object({
10797
+ kind: z23.literal("neutral-scrim"),
10798
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10799
+ }).strict(),
10800
+ z23.object({
10801
+ kind: z23.literal("neutral-wash"),
10802
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10803
+ }).strict(),
10804
+ z23.object({
10805
+ kind: z23.literal("solid-panel"),
10806
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10807
+ }).strict()
10808
+ ]);
10809
+ var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
10184
10810
  function uniqueNonEmpty(values) {
10185
10811
  const uniqueValues = [...new Set(values)];
10186
10812
  const firstValue = uniqueValues[0];
@@ -10219,7 +10845,11 @@ var blockDesignPlanSchema = z23.object({
10219
10845
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10220
10846
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10221
10847
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10222
- heroLegibility: heroLegibilityStrategySchema.optional()
10848
+ sectionHeight: sectionHeightIntentSchema.optional(),
10849
+ heroLegibility: heroLegibilityStrategySchema.optional(),
10850
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
10851
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
10852
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10223
10853
  }).strict();
10224
10854
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10225
10855
  z23.object({
@@ -11645,6 +12275,7 @@ var SEMANTIC_SPACING_VALUES = [
11645
12275
  ];
11646
12276
  var SECTION_MIN_HEIGHT_VALUES = [
11647
12277
  "none",
12278
+ "banner",
11648
12279
  "hero",
11649
12280
  "immersive"
11650
12281
  ];
@@ -11672,6 +12303,7 @@ var CONTAINER_SPACING_MAP = {
11672
12303
  };
11673
12304
  var SECTION_MIN_HEIGHT_MAP = {
11674
12305
  none: "",
12306
+ banner: "rb-section-min-h-banner",
11675
12307
  hero: "rb-section-min-h-hero",
11676
12308
  immersive: "rb-section-min-h-immersive"
11677
12309
  };
@@ -12462,6 +13094,9 @@ var boxStylesCompositeTransform = {
12462
13094
  classes.push(roundedResult);
12463
13095
  }
12464
13096
  }
13097
+ if (input.treatment === "accent-quote") {
13098
+ classes.push("rb-card-treatment-accent-quote");
13099
+ }
12465
13100
  return classes.join(" ").trim() || "";
12466
13101
  }
12467
13102
  };
@@ -12559,7 +13194,7 @@ var sectionClassNameTransform = {
12559
13194
  minHeight = input.minHeight;
12560
13195
  } else if (true) {
12561
13196
  console.warn(
12562
- `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, hero, immersive.`
13197
+ `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, banner, hero, immersive.`
12563
13198
  );
12564
13199
  }
12565
13200
  }
@@ -12882,23 +13517,6 @@ function styledCard(children, opts, ...mods) {
12882
13517
  );
12883
13518
  }
12884
13519
 
12885
- // ../blocks/src/system/node/fragments/typography.ts
12886
- function mergeClassName(base, extra) {
12887
- return [base, extra ?? ""].filter(Boolean).join(" ");
12888
- }
12889
- function captionText(opts, ...mods) {
12890
- const {
12891
- as: asProp,
12892
- className: classNameProp,
12893
- color,
12894
- ...rest
12895
- } = opts ?? {};
12896
- const as = asProp ?? "p";
12897
- const className = mergeClassName("rb-caption", classNameProp);
12898
- const style = textColorStyle(color ?? "mutedText");
12899
- return text({ ...rest, as, className, style }, ...mods);
12900
- }
12901
-
12902
13520
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
12903
13521
  function joinClasses(...parts) {
12904
13522
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -13803,18 +14421,17 @@ function buildAttributionNodes() {
13803
14421
  const name = text(
13804
14422
  {
13805
14423
  as: "strong",
13806
- className: "rb-block",
13807
- style: textColorStyle("text")
14424
+ className: "rb-block"
13808
14425
  },
13809
14426
  bind("testimonial.content.name", { fallback: "Anonymous" })
13810
14427
  );
13811
- const jobTitle = captionText(
13812
- null,
14428
+ const jobTitle = text(
14429
+ { as: "p", className: "rb-caption" },
13813
14430
  when("testimonial.content.jobTitle"),
13814
14431
  bind("testimonial.content.jobTitle")
13815
14432
  );
13816
- const company = captionText(
13817
- null,
14433
+ const company = text(
14434
+ { as: "p", className: "rb-caption" },
13818
14435
  when("testimonial.content.company"),
13819
14436
  bind("testimonial.content.company")
13820
14437
  );
@@ -13848,8 +14465,7 @@ function buildTestimonialCard(...mods) {
13848
14465
  );
13849
14466
  const body = richText(
13850
14467
  {
13851
- className: "rb-prose rb-max-w-none",
13852
- style: textColorStyle("text")
14468
+ className: "rb-prose rb-max-w-none"
13853
14469
  },
13854
14470
  bind("testimonial.content.body"),
13855
14471
  when("testimonial.content.body")
@@ -15479,6 +16095,7 @@ function heroContentCard(children, gap) {
15479
16095
  return styledContainer({
15480
16096
  bindFrom: "_contentCardStyles",
15481
16097
  constrainWidth: false,
16098
+ baseClassName: "rb-relative rb-isolate",
15482
16099
  rootType: "stack",
15483
16100
  rootProps: {
15484
16101
  gap
@@ -15509,6 +16126,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15509
16126
  function heroContainerStack(children, gap) {
15510
16127
  return styledContainer({
15511
16128
  rootType: "stack",
16129
+ baseClassName: "rb-relative rb-isolate",
15512
16130
  rootProps: {
15513
16131
  gap: "none",
15514
16132
  justify: {
@@ -16727,7 +17345,7 @@ function resolveHeroVerticalAlignment(content) {
16727
17345
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
16728
17346
  const sectionStyles = asPartialObject(content._sectionStyles);
16729
17347
  const minHeight = sectionStyles?.minHeight;
16730
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17348
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
16731
17349
  const variant = resolveHeroVariant(content);
16732
17350
  if (variant === "split" || variant === "splitReverse") return "center";
16733
17351
  return "top";
@@ -17485,6 +18103,26 @@ var footerSplitNavSingleClassTransform = {
17485
18103
  ]);
17486
18104
  }
17487
18105
  };
18106
+ var footerSplitMainClassSchema = z35.object({
18107
+ base: z35.string().optional(),
18108
+ reverseClass: z35.string().optional()
18109
+ });
18110
+ var footerSplitMainClassTransform = {
18111
+ id: "layout.footerSplitMainClass",
18112
+ kind: "string",
18113
+ summary: "Compose split-footer main row classes from footer logo placement",
18114
+ schema: footerSplitMainClassSchema,
18115
+ run: (value, options) => {
18116
+ const logo = asPartialObject(value);
18117
+ const placement = logo?.placement ?? "right";
18118
+ const shouldPlaceLogoFirst = placement === "left" || placement === "above";
18119
+ 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";
18120
+ return joinClasses4([
18121
+ options.base ?? baseClass,
18122
+ shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null
18123
+ ]);
18124
+ }
18125
+ };
17488
18126
  var footerLogoClassSchema = z35.object({
17489
18127
  base: z35.string().optional()
17490
18128
  });
@@ -17495,14 +18133,11 @@ var footerLogoClassTransform = {
17495
18133
  schema: footerLogoClassSchema,
17496
18134
  run: (value, options) => {
17497
18135
  const logo = asPartialObject(value);
17498
- const placement = logo?.placement ?? "right";
17499
18136
  const align = logo?.align ?? "end";
17500
18137
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17501
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17502
18138
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
17503
18139
  return joinClasses4([
17504
18140
  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",
17505
- orderClass,
17506
18141
  selfAlignClass,
17507
18142
  hiddenClass
17508
18143
  ]);
@@ -17557,6 +18192,7 @@ var layoutTransforms = [
17557
18192
  footerBottomBarContainerClassTransform,
17558
18193
  footerBottomBarStyleTransform,
17559
18194
  footerSplitNavSingleClassTransform,
18195
+ footerSplitMainClassTransform,
17560
18196
  footerLogoClassTransform,
17561
18197
  footerLogoMediaClassTransform,
17562
18198
  footerLogoTextVisibleTransform
@@ -17833,7 +18469,7 @@ var createNavRow = (className, align = "end") => navRow({
17833
18469
  var headerCta = ctaButton({
17834
18470
  basePath: "menu.ctaItem",
17835
18471
  whenPath: "menu.ctaItem.label",
17836
- variantPath: "menu.ctaItem.variant",
18472
+ variantPath: "$root.theme.header.ctaVariant",
17837
18473
  linkPath: "menu.ctaItem.link",
17838
18474
  sizeFallback: "sm",
17839
18475
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -17841,7 +18477,7 @@ var headerCta = ctaButton({
17841
18477
  var mobileCta = ctaButton({
17842
18478
  basePath: "menu.ctaItem",
17843
18479
  whenPath: "menu.ctaItem.label",
17844
- variantPath: "menu.ctaItem.variant",
18480
+ variantPath: "$root.theme.header.ctaVariant",
17845
18481
  linkPath: "menu.ctaItem.link",
17846
18482
  sizeFallback: "md",
17847
18483
  className: "nav-mobile-cta rb-w-full"
@@ -18302,7 +18938,13 @@ var splitFooterLayout = stack(
18302
18938
  [
18303
18939
  inline(
18304
18940
  {
18305
- 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"
18941
+ className: {
18942
+ $bind: {
18943
+ from: "$root.theme.footer.logo",
18944
+ transforms: [{ id: "layout.footerSplitMainClass" }],
18945
+ 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"
18946
+ }
18947
+ }
18306
18948
  },
18307
18949
  [
18308
18950
  stack(
@@ -20390,7 +21032,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20390
21032
  run: z47.object({
20391
21033
  courseId: z47.string(),
20392
21034
  seriesId: z47.string(),
20393
- runSlug: z47.string()
21035
+ runSlug: z47.string(),
21036
+ runName: z47.string().nullable()
20394
21037
  })
20395
21038
  }),
20396
21039
  z47.object({
@@ -26337,6 +26980,34 @@ function panelCapable() {
26337
26980
  itemSurfaces: "unsupported"
26338
26981
  });
26339
26982
  }
26983
+ var heroSectionHeights = [
26984
+ "default",
26985
+ "banner",
26986
+ "hero",
26987
+ "immersive"
26988
+ ];
26989
+ var heroImageSurfaceTreatments = [
26990
+ "none",
26991
+ "brand-scrim",
26992
+ "brand-wash",
26993
+ "neutral-scrim",
26994
+ "neutral-wash",
26995
+ "solid-panel"
26996
+ ];
26997
+ var heroImageSurfaceMotions = [
26998
+ "static",
26999
+ "fixed-frame"
27000
+ ];
27001
+ function heroCapable() {
27002
+ return declareBlockDesignCapability({
27003
+ sectionSurfaces: "supported",
27004
+ contentFrames: ["plain", "panel"],
27005
+ itemSurfaces: "unsupported",
27006
+ sectionHeights: heroSectionHeights,
27007
+ imageSurfaceTreatments: heroImageSurfaceTreatments,
27008
+ imageSurfaceMotions: heroImageSurfaceMotions
27009
+ });
27010
+ }
26340
27011
  function plainItemsCapable() {
26341
27012
  return declareBlockDesignCapability({
26342
27013
  sectionSurfaces: "supported",
@@ -26453,7 +27124,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26453
27124
  };
26454
27125
  }
26455
27126
  var systemBlockDefinitionsRaw = [
26456
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27127
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26457
27128
  flow: heroFlow,
26458
27129
  layoutProfiles: [
26459
27130
  layoutProfile({
@@ -26557,7 +27228,12 @@ var systemBlockDefinitionsRaw = [
26557
27228
  flow: siteChromeFlow,
26558
27229
  layoutProfiles: []
26559
27230
  })),
26560
- withDesignCapability("block.testimonials", testimonialsBlockDefinition, panelAndItemsCapable(), defineBlockDesignMetadata({
27231
+ withDesignCapability("block.testimonials", testimonialsBlockDefinition, declareBlockDesignCapability({
27232
+ sectionSurfaces: "supported",
27233
+ contentFrames: ["plain", "panel"],
27234
+ itemSurfaces: "supported",
27235
+ testimonialCardTreatments: ["default", "accent-quote"]
27236
+ }), defineBlockDesignMetadata({
26561
27237
  flow: proofFlow,
26562
27238
  layoutProfiles: [
26563
27239
  layoutProfile({
@@ -26869,8 +27545,15 @@ function parseOpacity(value) {
26869
27545
  }
26870
27546
  return opacity <= 1 ? opacity : opacity / 100;
26871
27547
  }
26872
- function appendOptionalClasses(baseClassName, optionalClassName) {
26873
- return optionalClassName ? `${baseClassName} ${optionalClassName}` : baseClassName;
27548
+ function backgroundMotionClassNames(input) {
27549
+ return input.motion === "fixed-frame" ? "rb-bg-motion-fixed-frame" : "";
27550
+ }
27551
+ function appendBackgroundMediaClasses(baseClassName, input) {
27552
+ return [
27553
+ baseClassName,
27554
+ backgroundMotionClassNames(input),
27555
+ backgroundVideoMobileClassNames(input)
27556
+ ].filter(Boolean).join(" ");
26874
27557
  }
26875
27558
  var resolveImageStyleTransform = {
26876
27559
  id: "background.resolveImageStyle",
@@ -26947,9 +27630,9 @@ var resolveImageClassNameTransform = {
26947
27630
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
26948
27631
  const position = isString(input.position) ? input.position.trim() : null;
26949
27632
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
26950
- return appendOptionalClasses(
27633
+ return appendBackgroundMediaClasses(
26951
27634
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
26952
- backgroundVideoMobileClassNames(input)
27635
+ input
26953
27636
  );
26954
27637
  }
26955
27638
  let needsAnchoring = false;
@@ -26962,18 +27645,18 @@ var resolveImageClassNameTransform = {
26962
27645
  }
26963
27646
  }
26964
27647
  if (!needsAnchoring) {
26965
- return appendOptionalClasses(
27648
+ return appendBackgroundMediaClasses(
26966
27649
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
26967
- backgroundVideoMobileClassNames(input)
27650
+ input
26968
27651
  );
26969
27652
  }
26970
27653
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
26971
27654
  const isCustom = position && !isPreset;
26972
27655
  if (isCustom) {
26973
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27656
+ return appendBackgroundMediaClasses(baseClass, input);
26974
27657
  }
26975
27658
  const anchorClasses = getAnchorClasses(position);
26976
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27659
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
26977
27660
  }
26978
27661
  };
26979
27662
  var resolveOverlayStyleTransform = {