@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
@@ -591,7 +591,7 @@ var ENDPOINT_DEFINITIONS = {
591
591
  method: "GET",
592
592
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
593
593
  auth: "user",
594
- responseKind: "text"
594
+ responseKind: "blob"
595
595
  },
596
596
  getNewsletterSubscriber: {
597
597
  path: "/sites/{siteId}/newsletter/subscribers/{subscriberId}",
@@ -922,12 +922,7 @@ var ENDPOINT_DEFINITIONS = {
922
922
  ],
923
923
  auth: "user",
924
924
  responseKind: "json",
925
- errors: [
926
- "validation:invalid_input",
927
- "resource:not_found",
928
- "resource:conflict",
929
- "server:internal_error"
930
- ]
925
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
931
926
  },
932
927
  unpublishTeamMemberProfile: {
933
928
  path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
@@ -1180,6 +1175,13 @@ var ENDPOINT_DEFINITIONS = {
1180
1175
  auth: "user",
1181
1176
  responseKind: "json"
1182
1177
  },
1178
+ exportBookingAppointmentsCsv: {
1179
+ path: "/sites/{siteId}/bookings/appointments/export.csv",
1180
+ method: "GET",
1181
+ auth: "user",
1182
+ errors: [],
1183
+ responseKind: "blob"
1184
+ },
1183
1185
  createAppointment: {
1184
1186
  path: "/sites/{siteId}/bookings/appointments",
1185
1187
  method: "POST",
@@ -1307,6 +1309,13 @@ var ENDPOINT_DEFINITIONS = {
1307
1309
  auth: "user",
1308
1310
  responseKind: "json"
1309
1311
  },
1312
+ exportCourseEnrollmentsCsv: {
1313
+ path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
1314
+ method: "GET",
1315
+ auth: "user",
1316
+ errors: [],
1317
+ responseKind: "blob"
1318
+ },
1310
1319
  listCourseWaitlist: {
1311
1320
  path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist",
1312
1321
  method: "GET",
@@ -2065,6 +2074,63 @@ var ENDPOINT_DEFINITIONS = {
2065
2074
  auth: "user",
2066
2075
  responseKind: "json"
2067
2076
  },
2077
+ updateRegisteredDomainContact: {
2078
+ path: "/domains/{domainId}/registrar/contact",
2079
+ method: "POST",
2080
+ errors: [
2081
+ "validation:invalid_input",
2082
+ "resource:not_found",
2083
+ "auth:forbidden",
2084
+ "external:service_error",
2085
+ "external:registrar_orphaned_contact_profile",
2086
+ "server:internal_error"
2087
+ ],
2088
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2089
+ auth: "user",
2090
+ responseKind: "json"
2091
+ },
2092
+ setRegisteredDomainPrivacy: {
2093
+ path: "/domains/{domainId}/registrar/privacy",
2094
+ method: "POST",
2095
+ errors: [
2096
+ "validation:invalid_input",
2097
+ "resource:not_found",
2098
+ "auth:forbidden",
2099
+ "external:service_error",
2100
+ "server:internal_error"
2101
+ ],
2102
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2103
+ auth: "user",
2104
+ responseKind: "json"
2105
+ },
2106
+ setRegisteredDomainAutoRenew: {
2107
+ path: "/domains/{domainId}/registrar/auto-renew",
2108
+ method: "POST",
2109
+ errors: [
2110
+ "validation:invalid_input",
2111
+ "resource:not_found",
2112
+ "auth:forbidden",
2113
+ "external:service_error",
2114
+ "server:internal_error"
2115
+ ],
2116
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2117
+ auth: "user",
2118
+ responseKind: "json"
2119
+ },
2120
+ getRegisteredDomainRenewalPosture: {
2121
+ path: "/domains/{domainId}/registrar/renewal",
2122
+ method: "GET",
2123
+ errors: [
2124
+ "validation:invalid_input",
2125
+ "resource:not_found",
2126
+ "auth:forbidden",
2127
+ "external:service_error",
2128
+ "server:internal_error"
2129
+ ],
2130
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2131
+ auth: "user",
2132
+ responseKind: "json"
2133
+ },
2068
2134
  retryDomainVercel: {
2069
2135
  path: "/domains/{domainId}/vercel",
2070
2136
  method: "POST",
@@ -2612,6 +2678,14 @@ var ENDPOINT_DEFINITIONS = {
2612
2678
  auth: "user",
2613
2679
  responseKind: "json"
2614
2680
  },
2681
+ exportSeoPagesCsv: {
2682
+ path: "/sites/{siteId}/seo/pages",
2683
+ method: "GET",
2684
+ tags: ["site-{siteId}", "seo-pages-{siteId}"],
2685
+ auth: "user",
2686
+ responseKind: "blob",
2687
+ errors: []
2688
+ },
2615
2689
  getSeoQueries: {
2616
2690
  path: "/sites/{siteId}/seo/queries",
2617
2691
  method: "GET",
@@ -2620,6 +2694,14 @@ var ENDPOINT_DEFINITIONS = {
2620
2694
  auth: "user",
2621
2695
  responseKind: "json"
2622
2696
  },
2697
+ exportSeoQueriesCsv: {
2698
+ path: "/sites/{siteId}/seo/queries",
2699
+ method: "GET",
2700
+ tags: ["site-{siteId}", "seo-queries-{siteId}"],
2701
+ auth: "user",
2702
+ responseKind: "blob",
2703
+ errors: []
2704
+ },
2623
2705
  getPerformanceOverview: {
2624
2706
  path: "/sites/{siteId}/performance/overview",
2625
2707
  method: "GET",
@@ -2668,7 +2750,12 @@ var ENDPOINT_DEFINITIONS = {
2668
2750
  path: "/media/{assetId}/canonical-crop",
2669
2751
  method: "POST",
2670
2752
  tags: ["media", "media-{assetId}"],
2671
- errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"],
2753
+ errors: [
2754
+ "validation:invalid_input",
2755
+ "resource:not_found",
2756
+ "resource:conflict",
2757
+ "server:internal_error"
2758
+ ],
2672
2759
  auth: "user",
2673
2760
  responseKind: "json"
2674
2761
  },
@@ -3000,7 +3087,7 @@ var ENDPOINT_DEFINITIONS = {
3000
3087
  method: "GET",
3001
3088
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3002
3089
  auth: "user",
3003
- responseKind: "text"
3090
+ responseKind: "blob"
3004
3091
  },
3005
3092
  // Public submit
3006
3093
  submitForm: {
@@ -3883,6 +3970,14 @@ var ENDPOINT_DEFINITIONS = {
3883
3970
  auth: "user",
3884
3971
  responseKind: "json"
3885
3972
  },
3973
+ exportEventSeriesAttendeesCsv: {
3974
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/attendees/export.csv",
3975
+ method: "GET",
3976
+ tags: ["site-{siteId}", "event-series-{seriesId}"],
3977
+ auth: "user",
3978
+ errors: [],
3979
+ responseKind: "blob"
3980
+ },
3886
3981
  listEventSeriesWaitlist: {
3887
3982
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3888
3983
  method: "GET",
@@ -4446,6 +4541,14 @@ var ENDPOINT_DEFINITIONS = {
4446
4541
  auth: "user",
4447
4542
  responseKind: "json"
4448
4543
  },
4544
+ exportBookingCustomersCsv: {
4545
+ path: "/sites/{siteId}/bookings/customers/export.csv",
4546
+ method: "GET",
4547
+ tags: ["site-{siteId}", "customers-{siteId}"],
4548
+ auth: "user",
4549
+ errors: [],
4550
+ responseKind: "blob"
4551
+ },
4449
4552
  createBookingCustomer: {
4450
4553
  path: "/sites/{siteId}/bookings/customers",
4451
4554
  method: "POST",
@@ -4473,6 +4576,21 @@ var ENDPOINT_DEFINITIONS = {
4473
4576
  "server:internal_error"
4474
4577
  ]
4475
4578
  },
4579
+ rectifyBookingParticipantIdentity: {
4580
+ path: "/sites/{siteId}/bookings/participants/{participantId}/identity",
4581
+ method: "PATCH",
4582
+ tags: ["site-{siteId}", "customers-{siteId}"],
4583
+ auth: "user",
4584
+ responseKind: "json",
4585
+ errors: [
4586
+ "validation:invalid_input",
4587
+ "auth:forbidden",
4588
+ "resource:not_found",
4589
+ "resource:already_exists",
4590
+ "resource:conflict",
4591
+ "server:internal_error"
4592
+ ]
4593
+ },
4476
4594
  listCustomerPasses: {
4477
4595
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4478
4596
  method: "GET",
@@ -4607,13 +4725,46 @@ var ENDPOINT_DEFINITIONS = {
4607
4725
  auth: "user",
4608
4726
  responseKind: "json"
4609
4727
  },
4728
+ exportMoneyPaymentsCsv: {
4729
+ path: "/sites/{siteId}/bookings/money/payments/export.csv",
4730
+ method: "GET",
4731
+ tags: ["site-{siteId}", "bookings", "money-payments-{siteId}"],
4732
+ errors: [],
4733
+ auth: "user",
4734
+ responseKind: "blob"
4735
+ },
4736
+ exportMoneyBreakdownsCsv: {
4737
+ path: "/sites/{siteId}/bookings/money/report/breakdowns/export.csv",
4738
+ method: "GET",
4739
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4740
+ errors: [],
4741
+ auth: "user",
4742
+ responseKind: "blob"
4743
+ },
4744
+ exportMoneyTimeSeriesCsv: {
4745
+ path: "/sites/{siteId}/bookings/money/report/time-series/export.csv",
4746
+ method: "GET",
4747
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4748
+ errors: [],
4749
+ auth: "user",
4750
+ responseKind: "blob"
4751
+ },
4610
4752
  listBookingActivity: {
4611
4753
  path: "/sites/{siteId}/bookings/activity",
4612
4754
  method: "GET",
4613
4755
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4756
+ errors: [],
4614
4757
  auth: "user",
4615
4758
  responseKind: "json"
4616
4759
  },
4760
+ exportBookingActivityCsv: {
4761
+ path: "/sites/{siteId}/bookings/activity/export.csv",
4762
+ method: "GET",
4763
+ tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4764
+ errors: [],
4765
+ auth: "user",
4766
+ responseKind: "blob"
4767
+ },
4617
4768
  // Site logs
4618
4769
  listSiteActivityLogs: {
4619
4770
  path: "/sites/{siteId}/logs/activity",
@@ -4765,13 +4916,6 @@ var ENDPOINT_DEFINITIONS = {
4765
4916
  auth: "user",
4766
4917
  responseKind: "blob"
4767
4918
  },
4768
- exportSeoCsv: {
4769
- path: "/sites/{siteId}/seo/export",
4770
- method: "GET",
4771
- tags: ["site-{siteId}", "seo"],
4772
- auth: "user",
4773
- responseKind: "blob"
4774
- },
4775
4919
  // Admin site cost (for admin panel)
4776
4920
  adminSiteCost: {
4777
4921
  path: "/admin/sites/{siteId}/cost",
@@ -7008,6 +7152,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
7008
7152
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
7009
7153
  "missing_amount",
7010
7154
  "amount_exceeds_remaining",
7155
+ "credit_refunds_disabled",
7156
+ "missing_credit_customer",
7011
7157
  "deposit_refund_override_required",
7012
7158
  "refund_revoke_requires_full_line_refund",
7013
7159
  "unified_order_link_required"
@@ -7672,12 +7818,29 @@ function defineFrameCapability(capability) {
7672
7818
  function defineBlockDesignCapability(capability) {
7673
7819
  return {
7674
7820
  ...capability,
7675
- kind: "designed"
7821
+ kind: "designed",
7822
+ sectionHeights: capability.sectionHeights ?? ["default"],
7823
+ imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7824
+ imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7825
+ testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"]
7676
7826
  };
7677
7827
  }
7678
7828
 
7679
7829
  // ../theme-core/src/site-styles/appearancePresets.ts
7830
+ function assertValidOptionGroups(preset2) {
7831
+ preset2.optionGroups?.forEach((group) => {
7832
+ const selectedOption = group.options.find(
7833
+ (option) => option.id === group.selectedOptionId
7834
+ );
7835
+ if (!selectedOption) {
7836
+ throw new Error(
7837
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7838
+ );
7839
+ }
7840
+ });
7841
+ }
7680
7842
  function defineBlockAppearancePreset(preset2) {
7843
+ assertValidOptionGroups(preset2);
7681
7844
  return preset2;
7682
7845
  }
7683
7846
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7690,13 +7853,122 @@ var appearancePresets = [
7690
7853
  target: "hero",
7691
7854
  label: "Immersive image hero",
7692
7855
  blockKinds: ["block.hero"],
7856
+ constraints: {
7857
+ layoutFamilies: ["centered", "compact"]
7858
+ },
7859
+ design: {
7860
+ sectionSurface: "hero-image",
7861
+ contentFrame: plainFrame,
7862
+ itemSurface: "none",
7863
+ transitionAfter: "soft-fade-short",
7864
+ emphasis: "high",
7865
+ sectionHeight: "hero",
7866
+ imageSurfaceTreatment: { kind: "neutral-wash" }
7867
+ }
7868
+ }),
7869
+ defineBlockAppearancePreset({
7870
+ kind: "block-design",
7871
+ id: "hero-brand-scrim",
7872
+ target: "hero",
7873
+ label: "Brand scrim image hero",
7874
+ blockKinds: ["block.hero"],
7875
+ constraints: {
7876
+ layoutFamilies: ["centered", "compact"]
7877
+ },
7878
+ optionGroups: [
7879
+ {
7880
+ id: "image-surface-treatment",
7881
+ label: "Treatment",
7882
+ selectedOptionId: "brand-scrim-primary",
7883
+ options: [
7884
+ {
7885
+ id: "brand-scrim-primary",
7886
+ label: "Brand scrim",
7887
+ designPatch: {
7888
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7889
+ }
7890
+ },
7891
+ {
7892
+ id: "neutral-scrim",
7893
+ label: "Neutral scrim",
7894
+ designPatch: {
7895
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7896
+ }
7897
+ }
7898
+ ]
7899
+ }
7900
+ ],
7901
+ layoutPatches: [
7902
+ {
7903
+ constraints: {
7904
+ layoutVariantKeys: ["micro"]
7905
+ },
7906
+ designPatch: {
7907
+ sectionHeight: "banner"
7908
+ }
7909
+ }
7910
+ ],
7911
+ design: {
7912
+ sectionSurface: "hero-image",
7913
+ contentFrame: plainFrame,
7914
+ itemSurface: "none",
7915
+ transitionAfter: "soft-fade-short",
7916
+ emphasis: "high",
7917
+ sectionHeight: "immersive",
7918
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7919
+ }
7920
+ }),
7921
+ defineBlockAppearancePreset({
7922
+ kind: "block-design",
7923
+ id: "hero-brand-scrim-fixed-frame",
7924
+ target: "hero",
7925
+ label: "Fixed-frame brand scrim hero",
7926
+ blockKinds: ["block.hero"],
7927
+ constraints: {
7928
+ layoutFamilies: ["centered", "compact"]
7929
+ },
7930
+ optionGroups: [
7931
+ {
7932
+ id: "image-surface-treatment",
7933
+ label: "Treatment",
7934
+ selectedOptionId: "brand-scrim-primary",
7935
+ options: [
7936
+ {
7937
+ id: "brand-scrim-primary",
7938
+ label: "Brand scrim",
7939
+ designPatch: {
7940
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7941
+ }
7942
+ },
7943
+ {
7944
+ id: "neutral-scrim",
7945
+ label: "Neutral scrim",
7946
+ designPatch: {
7947
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7948
+ }
7949
+ }
7950
+ ]
7951
+ }
7952
+ ],
7953
+ layoutPatches: [
7954
+ {
7955
+ constraints: {
7956
+ layoutVariantKeys: ["micro"]
7957
+ },
7958
+ designPatch: {
7959
+ sectionHeight: "banner"
7960
+ }
7961
+ }
7962
+ ],
7693
7963
  design: {
7694
7964
  sectionSurface: "hero-image",
7695
7965
  contentFrame: plainFrame,
7696
7966
  itemSurface: "none",
7697
7967
  transitionAfter: "soft-fade-short",
7698
7968
  emphasis: "high",
7699
- heroLegibility: "scrim-gradient"
7969
+ sectionHeight: "immersive",
7970
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7971
+ imageSurfaceMotion: "fixed-frame"
7700
7972
  }
7701
7973
  }),
7702
7974
  defineBlockAppearancePreset({
@@ -7713,17 +7985,26 @@ var appearancePresets = [
7713
7985
  emphasis: "high"
7714
7986
  }
7715
7987
  }),
7988
+ defineBlockAppearancePreset({
7989
+ kind: "block-design",
7990
+ id: "body-text-editorial-intro",
7991
+ target: "body-text",
7992
+ label: "Editorial intro copy",
7993
+ blockKinds: ["block.body-text"],
7994
+ design: {
7995
+ sectionSurface: "base",
7996
+ contentFrame: plainFrame,
7997
+ itemSurface: "none",
7998
+ transitionAfter: "soft-fade-short",
7999
+ emphasis: "high"
8000
+ }
8001
+ }),
7716
8002
  defineBlockAppearancePreset({
7717
8003
  kind: "block-design",
7718
8004
  id: "offerings-calm-list",
7719
8005
  target: "offerings",
7720
8006
  label: "Calm offerings list",
7721
- blockKinds: [
7722
- "block.event-listing",
7723
- "block.event-calendar",
7724
- "block.event-spotlight",
7725
- "block.product-list"
7726
- ],
8007
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7727
8008
  design: {
7728
8009
  sectionSurface: "muted-band",
7729
8010
  contentFrame: plainFrame,
@@ -7802,6 +8083,35 @@ var appearancePresets = [
7802
8083
  emphasis: "high"
7803
8084
  }
7804
8085
  }),
8086
+ defineBlockAppearancePreset({
8087
+ kind: "block-design",
8088
+ id: "testimonials-dark-proof",
8089
+ target: "testimonials",
8090
+ label: "Dark proof panel",
8091
+ blockKinds: ["block.testimonials"],
8092
+ design: {
8093
+ sectionSurface: "accent-band",
8094
+ contentFrame: panelFrame("raised"),
8095
+ itemSurface: "raised",
8096
+ transitionAfter: "soft-fade-short",
8097
+ emphasis: "high"
8098
+ }
8099
+ }),
8100
+ defineBlockAppearancePreset({
8101
+ kind: "block-design",
8102
+ id: "testimonials-accent-quote-proof",
8103
+ target: "testimonials",
8104
+ label: "Accent quote proof",
8105
+ blockKinds: ["block.testimonials"],
8106
+ design: {
8107
+ sectionSurface: "accent-band",
8108
+ contentFrame: plainFrame,
8109
+ itemSurface: "raised",
8110
+ transitionAfter: "soft-fade-short",
8111
+ emphasis: "high",
8112
+ testimonialCardTreatment: "accent-quote"
8113
+ }
8114
+ }),
7805
8115
  defineBlockAppearancePreset({
7806
8116
  kind: "block-design",
7807
8117
  id: "faq-contained-help",
@@ -7830,6 +8140,20 @@ var appearancePresets = [
7830
8140
  emphasis: "medium"
7831
8141
  }
7832
8142
  }),
8143
+ defineBlockAppearancePreset({
8144
+ kind: "block-design",
8145
+ id: "contact-form-dark-card",
8146
+ target: "contact-form",
8147
+ label: "Dark form card",
8148
+ blockKinds: ["block.form"],
8149
+ design: {
8150
+ sectionSurface: "accent-band",
8151
+ contentFrame: panelFrame("raised"),
8152
+ itemSurface: "none",
8153
+ transitionAfter: "soft-fade-short",
8154
+ emphasis: "high"
8155
+ }
8156
+ }),
7833
8157
  defineBlockAppearancePreset({
7834
8158
  kind: "block-design",
7835
8159
  id: "cta-accent-band",
@@ -7849,9 +8173,33 @@ var appearancePresets = [
7849
8173
  id: "header-clean-base",
7850
8174
  target: "site-header",
7851
8175
  label: "Clean base header",
7852
- chrome: {
7853
- surface: "base",
7854
- emphasis: "medium"
8176
+ header: {
8177
+ surface: {
8178
+ kind: "neutral-solid",
8179
+ token: "surface",
8180
+ textColorToken: "text"
8181
+ },
8182
+ navTreatment: "minimal",
8183
+ dropdownTreatment: "surface",
8184
+ ctaTreatment: "default",
8185
+ behavior: "default"
8186
+ }
8187
+ }),
8188
+ defineSiteChromeAppearancePreset({
8189
+ kind: "site-chrome",
8190
+ id: "site-header-brand-solid-inverted-cta",
8191
+ target: "site-header",
8192
+ label: "Brand solid header with inverted CTA",
8193
+ header: {
8194
+ surface: {
8195
+ kind: "brand-solid",
8196
+ token: "primary",
8197
+ textColorToken: "primaryForeground"
8198
+ },
8199
+ navTreatment: "uppercase-underline",
8200
+ dropdownTreatment: "matched-solid",
8201
+ ctaTreatment: "inverted",
8202
+ behavior: "sticky-shrink"
7855
8203
  }
7856
8204
  }),
7857
8205
  defineSiteChromeAppearancePreset({
@@ -7859,10 +8207,31 @@ var appearancePresets = [
7859
8207
  id: "footer-muted-grounding",
7860
8208
  target: "site-footer",
7861
8209
  label: "Muted grounding footer",
7862
- chrome: {
8210
+ footer: {
8211
+ kind: "grounding",
7863
8212
  surface: "muted-band",
7864
8213
  emphasis: "low"
7865
8214
  }
8215
+ }),
8216
+ defineSiteChromeAppearancePreset({
8217
+ kind: "site-chrome",
8218
+ id: "site-footer-brand-two-band",
8219
+ target: "site-footer",
8220
+ label: "Two-band brand footer",
8221
+ footer: {
8222
+ kind: "brand-two-band",
8223
+ surface: {
8224
+ token: "primary",
8225
+ shade: "800",
8226
+ textColorToken: "primaryForeground"
8227
+ },
8228
+ bottomBand: {
8229
+ token: "primary",
8230
+ shade: "900",
8231
+ textColorToken: "primaryForeground"
8232
+ },
8233
+ emphasis: "high"
8234
+ }
7866
8235
  })
7867
8236
  ];
7868
8237
 
@@ -8522,6 +8891,111 @@ var pebble = defineButtonPersonality({
8522
8891
  }
8523
8892
  });
8524
8893
 
8894
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
8895
+ var showtimePill = defineButtonPersonality({
8896
+ id: "showtime-pill",
8897
+ name: "Showtime Pill",
8898
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
8899
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
8900
+ buttonSystem: {
8901
+ global: {
8902
+ cornerStyle: "pill",
8903
+ shadow: "low",
8904
+ textTransform: "uppercase",
8905
+ fontWeight: 700,
8906
+ borderWidth: 2,
8907
+ hoverTransform: "lift",
8908
+ hoverColor: "darken",
8909
+ typography: "body",
8910
+ paddingPreset: "spacious",
8911
+ italic: false
8912
+ },
8913
+ sizes: {
8914
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
8915
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
8916
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
8917
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
8918
+ },
8919
+ variants: [
8920
+ {
8921
+ id: "primary",
8922
+ name: "Primary",
8923
+ enabled: true,
8924
+ priority: 1,
8925
+ background: { type: "solid", colorToken: "primary" },
8926
+ textColorToken: "background",
8927
+ borderRadius: "rounded-full",
8928
+ effects: {
8929
+ hover: [{ effectId: "pop" }]
8930
+ }
8931
+ },
8932
+ {
8933
+ id: "secondary",
8934
+ name: "Secondary",
8935
+ enabled: true,
8936
+ priority: 2,
8937
+ background: { type: "transparent" },
8938
+ textColorToken: "primary",
8939
+ borderRadius: "rounded-full",
8940
+ border: { widthClass: "border-2", colorToken: "primary" },
8941
+ effects: {
8942
+ hover: [{ effectId: "pop" }]
8943
+ }
8944
+ },
8945
+ {
8946
+ id: "hero",
8947
+ name: "Hero",
8948
+ enabled: true,
8949
+ priority: 1,
8950
+ background: { type: "solid", colorToken: "secondary" },
8951
+ textColorToken: "primary",
8952
+ borderRadius: "rounded-full",
8953
+ effects: {
8954
+ hover: [{ effectId: "pop" }]
8955
+ }
8956
+ },
8957
+ {
8958
+ id: "header",
8959
+ name: "Header",
8960
+ enabled: true,
8961
+ priority: 2,
8962
+ background: { type: "solid", colorToken: "background" },
8963
+ textColorToken: "primary",
8964
+ borderRadius: "rounded-full",
8965
+ border: { widthClass: "border-2", colorToken: "primary" },
8966
+ effects: {
8967
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8968
+ }
8969
+ },
8970
+ {
8971
+ id: "outline",
8972
+ name: "Outline",
8973
+ enabled: true,
8974
+ priority: 3,
8975
+ background: { type: "transparent" },
8976
+ textColorToken: "primary",
8977
+ borderRadius: "rounded-full",
8978
+ border: { widthClass: "border-2", colorToken: "primary" },
8979
+ effects: {
8980
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8981
+ }
8982
+ },
8983
+ {
8984
+ id: "ghost",
8985
+ name: "Ghost",
8986
+ enabled: true,
8987
+ priority: 3,
8988
+ background: { type: "transparent" },
8989
+ textColorToken: "primary",
8990
+ borderRadius: "rounded-full",
8991
+ effects: {
8992
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8993
+ }
8994
+ }
8995
+ ]
8996
+ }
8997
+ });
8998
+
8525
8999
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8526
9000
  var softPill = defineButtonPersonality({
8527
9001
  id: "soft-pill",
@@ -8602,7 +9076,8 @@ var buttonPersonalities = [
8602
9076
  editorialLink,
8603
9077
  pebble,
8604
9078
  inkStamp,
8605
- brushedWash
9079
+ brushedWash,
9080
+ showtimePill
8606
9081
  ];
8607
9082
  var personalitiesById = new Map(
8608
9083
  buttonPersonalities.map((p) => [p.id, p])
@@ -9133,14 +9608,7 @@ var proseLinkStyleSchema = z21.object({
9133
9608
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9134
9609
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9135
9610
  });
9136
- var semanticSpacingSchema = z21.enum([
9137
- "none",
9138
- "compact",
9139
- "cozy",
9140
- "medium",
9141
- "comfortable",
9142
- "spacious"
9143
- ]);
9611
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9144
9612
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9145
9613
  var boxBackgroundOverlaySchema = z21.object({
9146
9614
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9157,6 +9625,7 @@ var boxBackgroundSchema = z21.object({
9157
9625
  scale: z21.string().nullable().optional(),
9158
9626
  position: z21.string().nullable().optional(),
9159
9627
  opacity: z21.number().min(0).max(1).nullable().optional(),
9628
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9160
9629
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9161
9630
  textColor: z21.string().nullable().optional(),
9162
9631
  headingColor: z21.string().nullable().optional()
@@ -9164,7 +9633,7 @@ var boxBackgroundSchema = z21.object({
9164
9633
  var sectionStylesOverrideSchema = z21.object({
9165
9634
  background: boxBackgroundSchema.nullable().optional(),
9166
9635
  spacing: semanticSpacingSchema.nullable().optional(),
9167
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9636
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9168
9637
  });
9169
9638
  var containerStylesOverrideSchema = z21.object({
9170
9639
  background: boxBackgroundSchema.nullable().optional(),
@@ -9183,7 +9652,8 @@ var cardStylesOverrideSchema = z21.object({
9183
9652
  border: cardBorderOverrideSchema.nullable().optional(),
9184
9653
  spacing: semanticSpacingSchema.nullable().optional(),
9185
9654
  raised: z21.boolean().nullable().optional(),
9186
- rounded: boxRoundedSchema.nullable().optional()
9655
+ rounded: boxRoundedSchema.nullable().optional(),
9656
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9187
9657
  });
9188
9658
  var blockStyleOverridesSchema = z21.object({
9189
9659
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9258,15 +9728,7 @@ var inputStyle = z21.object({
9258
9728
  });
9259
9729
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9260
9730
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9261
- var headerNavStyle = z21.enum([
9262
- "minimal",
9263
- "underline",
9264
- "underline-grow",
9265
- "capsule",
9266
- "scale",
9267
- "frosted",
9268
- "solid"
9269
- ]);
9731
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9270
9732
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9271
9733
  var headerMaxWidth = z21.enum(["container", "full"]);
9272
9734
  var headerContainerSchema = z21.object({
@@ -9320,6 +9782,7 @@ var dropdownStyleSchema = z21.object({
9320
9782
  // optional = no override (browser default)
9321
9783
  }).optional();
9322
9784
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9785
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9323
9786
  var navContainerSchema = z21.object({
9324
9787
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9325
9788
  tint: z21.string().nullable().optional(),
@@ -9338,7 +9801,10 @@ var headerSchema = z21.object({
9338
9801
  shrinkOnScroll: z21.boolean(),
9339
9802
  maxWidth: headerMaxWidth,
9340
9803
  logoOverride: mediaSchema.nullable().optional(),
9341
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9804
+ background: headerBackgroundSchema.default({
9805
+ type: "color",
9806
+ color: "surface"
9807
+ }),
9342
9808
  textColor: z21.string().nullable().optional(),
9343
9809
  // Site title and general header text
9344
9810
  navStyle: headerNavStyle,
@@ -9358,6 +9824,13 @@ var headerSchema = z21.object({
9358
9824
  navLinkStyle: navLinkStyleSchema.optional(),
9359
9825
  // CTA button spacing (desktop left margin)
9360
9826
  ctaGap: headerCtaGapSchema.optional(),
9827
+ // Semantic CTA treatment for header/nav CTA buttons. The Theme V2 compiler
9828
+ // materializes this to ctaVariant against the active button personality.
9829
+ ctaTreatment: headerCtaTreatmentSchema.optional(),
9830
+ // Optional theme-level CTA variant for header/nav CTA buttons.
9831
+ // Internal runtime bridge for the block renderer; prefer ctaTreatment in
9832
+ // authored Theme V2 concepts.
9833
+ ctaVariant: z21.string().min(1).optional(),
9361
9834
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9362
9835
  dropdownStyle: dropdownStyleSchema
9363
9836
  });
@@ -9414,7 +9887,10 @@ var footerSchema = z21.object({
9414
9887
  variant: footerVariant,
9415
9888
  maxWidth: footerMaxWidth,
9416
9889
  showLogoText: z21.boolean().optional(),
9417
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9890
+ background: headerBackgroundSchema.default({
9891
+ type: "color",
9892
+ color: "surface"
9893
+ }),
9418
9894
  // Footer nav styling (independent from header)
9419
9895
  navStyle: headerNavStyle.default("minimal"),
9420
9896
  navColor: z21.string().nullable().optional(),
@@ -9436,17 +9912,7 @@ var layoutSchema = z21.object({
9436
9912
  desktop: containerPaddingPresetSchema.optional()
9437
9913
  }).optional()
9438
9914
  }).optional();
9439
- var heroTypographySizeSchema = z21.enum([
9440
- "sm",
9441
- "base",
9442
- "lg",
9443
- "xl",
9444
- "2xl",
9445
- "3xl",
9446
- "4xl",
9447
- "5xl",
9448
- "6xl"
9449
- ]);
9915
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9450
9916
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9451
9917
  var heroResponsiveTypographySchema = z21.object({
9452
9918
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9471,6 +9937,13 @@ var heroTypographySchema = z21.object({
9471
9937
  var heroSchema = z21.object({
9472
9938
  typography: heroTypographySchema.optional()
9473
9939
  }).optional();
9940
+ var bodyTextIntroTypographySizeSchema = z21.enum(["default", "editorial"]);
9941
+ var bodyTextSchema = z21.object({
9942
+ intro: z21.object({
9943
+ paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
9944
+ headingSize: bodyTextIntroTypographySizeSchema.optional()
9945
+ }).optional()
9946
+ }).optional();
9474
9947
  var gradientsSchema = z21.object({
9475
9948
  button: z21.string().min(1).nullable().optional(),
9476
9949
  hero: z21.string().min(1).nullable().optional(),
@@ -9492,6 +9965,7 @@ var themeSchema = z21.object({
9492
9965
  gradients: gradientsSchema.optional(),
9493
9966
  layout: layoutSchema,
9494
9967
  hero: heroSchema,
9968
+ bodyText: bodyTextSchema,
9495
9969
  header: headerSchema,
9496
9970
  footer: footerSchema,
9497
9971
  buttons: buttonSystemSchema.optional(),
@@ -9515,10 +9989,7 @@ var themeSchema = z21.object({
9515
9989
  ).optional(),
9516
9990
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9517
9991
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9518
- blockOverrides: z21.record(
9519
- z21.string(),
9520
- blockThemeOverrideSchema
9521
- ).optional(),
9992
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9522
9993
  // Structured custom CSS rules
9523
9994
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9524
9995
  customCssRules: customCssRulesSchema,
@@ -9689,6 +10160,28 @@ var brandLedJewel = definePaletteVariant({
9689
10160
  { name: "border", hex: "#a8a29e" }
9690
10161
  ]
9691
10162
  });
10163
+ var brandLedBurgundyGold = definePaletteVariant({
10164
+ id: "brand-led-burgundy-gold",
10165
+ name: "Brand-led \u2014 Burgundy Gold",
10166
+ description: "Deep burgundy with warm gold accents and soft neutral grounds.",
10167
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
10168
+ mode: "light",
10169
+ colors: [
10170
+ { name: "primary", hex: "#7c2e38" },
10171
+ { name: "secondary", hex: "#d4af37" },
10172
+ { name: "accent", hex: "#b8e19a" },
10173
+ { name: "success", hex: "#10b981" },
10174
+ { name: "warning", hex: "#f59e0b" },
10175
+ { name: "destructive", hex: "#ef4444" },
10176
+ { name: "background", hex: "#f1dfd0" },
10177
+ { name: "surface", hex: "#f5e6db" },
10178
+ { name: "surfaceAlt", hex: "#f8ece3" },
10179
+ { name: "muted", hex: "#c9b8a8" },
10180
+ { name: "text", hex: "#400000" },
10181
+ { name: "primaryForeground", hex: "#ffffff" },
10182
+ { name: "border", hex: "#c9b8a8" }
10183
+ ]
10184
+ });
9692
10185
 
9693
10186
  // ../theme-core/src/palette/variants/high-contrast.ts
9694
10187
  var highContrastInk = definePaletteVariant({
@@ -9900,6 +10393,7 @@ var paletteVariants = [
9900
10393
  brandLedCool,
9901
10394
  brandLedWarm,
9902
10395
  brandLedJewel,
10396
+ brandLedBurgundyGold,
9903
10397
  // Warm-neutral family
9904
10398
  warmNeutralClay,
9905
10399
  warmNeutralCream,
@@ -9975,7 +10469,8 @@ var curatedSiteStyleIdValues = [
9975
10469
  "site-style:quiet-luxury",
9976
10470
  "site-style:practical-services",
9977
10471
  "site-style:modern-wellness",
9978
- "site-style:bold-launch"
10472
+ "site-style:bold-launch",
10473
+ "site-style:south-west-twerk-school"
9979
10474
  ];
9980
10475
  var quietBudget = {
9981
10476
  accentDensity: "low",
@@ -10030,6 +10525,8 @@ function defineCuratedSiteStyle(input) {
10030
10525
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
10031
10526
  supportedTransitions: generatedDesignOptionCatalog.transitions
10032
10527
  },
10528
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10529
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10033
10530
  buttonPersonalityChoices: input.buttonPersonalityChoices,
10034
10531
  paletteVariantChoices: input.paletteVariantChoices
10035
10532
  };
@@ -10276,6 +10773,101 @@ var curatedSiteStyles = [
10276
10773
  paletteChoice("brand-led-jewel"),
10277
10774
  paletteChoice("brand-led-warm")
10278
10775
  ]
10776
+ }),
10777
+ defineCuratedSiteStyle({
10778
+ id: "site-style:south-west-twerk-school",
10779
+ name: "South West Twerk School",
10780
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
10781
+ 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.",
10782
+ selectionKeywords: [
10783
+ "dance",
10784
+ "classes",
10785
+ "workshop",
10786
+ "school",
10787
+ "movement",
10788
+ "performance",
10789
+ "community"
10790
+ ],
10791
+ tokenRecipes: {
10792
+ palette: "brand-led",
10793
+ contrast: "maximum",
10794
+ radius: "soft",
10795
+ shadow: "layered",
10796
+ typography: "clean-sans",
10797
+ spacing: "airy",
10798
+ motion: "expressive"
10799
+ },
10800
+ compositionBudget: expressiveBudget,
10801
+ themeOverrides: {
10802
+ typography: {
10803
+ body: {
10804
+ family: "Manrope, system-ui, sans-serif",
10805
+ size: "lg",
10806
+ weight: "regular",
10807
+ lineHeight: "relaxed",
10808
+ letterSpacing: "normal"
10809
+ },
10810
+ headings: {
10811
+ default: {
10812
+ family: '"TAN - PEARL", sans-serif',
10813
+ weight: "bold",
10814
+ lineHeight: "normal",
10815
+ letterSpacing: "tight",
10816
+ colorToken: "primary",
10817
+ italic: null,
10818
+ case: null
10819
+ },
10820
+ h1: {
10821
+ size: "xl",
10822
+ weight: "bold",
10823
+ lineHeight: "normal",
10824
+ letterSpacing: "tight",
10825
+ italic: null
10826
+ },
10827
+ h2: {
10828
+ size: "lg",
10829
+ weight: "bold",
10830
+ lineHeight: "normal",
10831
+ letterSpacing: "normal",
10832
+ italic: null
10833
+ },
10834
+ h3: {
10835
+ size: "md",
10836
+ weight: "bold",
10837
+ lineHeight: "normal",
10838
+ letterSpacing: "normal",
10839
+ italic: null
10840
+ }
10841
+ },
10842
+ scale: "balanced"
10843
+ },
10844
+ bodyText: {
10845
+ intro: {
10846
+ paragraphSize: "editorial",
10847
+ headingSize: "editorial"
10848
+ }
10849
+ }
10850
+ },
10851
+ recommendedAppearancePresetIds: [
10852
+ "site-header-brand-solid-inverted-cta",
10853
+ "site-footer-brand-two-band",
10854
+ "hero-brand-scrim-fixed-frame",
10855
+ "body-text-editorial-intro",
10856
+ "testimonials-accent-quote-proof",
10857
+ "contact-form-dark-card"
10858
+ ],
10859
+ buttonPersonalityChoices: [
10860
+ buttonChoice("showtime-pill"),
10861
+ buttonChoice("confident-chip"),
10862
+ buttonChoice("ink-stamp"),
10863
+ buttonChoice("brushed-wash")
10864
+ ],
10865
+ paletteVariantChoices: [
10866
+ paletteChoice("brand-led-burgundy-gold"),
10867
+ paletteChoice("brand-led-jewel"),
10868
+ paletteChoice("brand-led-warm"),
10869
+ paletteChoice("high-contrast-ink")
10870
+ ]
10279
10871
  })
10280
10872
  ];
10281
10873
  var curatedSiteStylesById = new Map(
@@ -10320,6 +10912,40 @@ var heroLegibilityStrategySchema = z23.enum([
10320
10912
  "scrim-gradient",
10321
10913
  "solid-panel"
10322
10914
  ]);
10915
+ var sectionHeightIntentSchema = z23.enum([
10916
+ "default",
10917
+ "banner",
10918
+ "hero",
10919
+ "immersive"
10920
+ ]);
10921
+ var imageSurfaceTreatmentIntensitySchema = z23.enum(["soft", "balanced", "strong"]);
10922
+ var imageSurfaceMotionSchema = z23.enum(["static", "fixed-frame"]);
10923
+ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
10924
+ z23.object({ kind: z23.literal("none") }).strict(),
10925
+ z23.object({
10926
+ kind: z23.literal("brand-scrim"),
10927
+ token: z23.enum(["primary", "secondary", "accent"]),
10928
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10929
+ }).strict(),
10930
+ z23.object({
10931
+ kind: z23.literal("brand-wash"),
10932
+ token: z23.enum(["primary", "secondary", "accent"]),
10933
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10934
+ }).strict(),
10935
+ z23.object({
10936
+ kind: z23.literal("neutral-scrim"),
10937
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10938
+ }).strict(),
10939
+ z23.object({
10940
+ kind: z23.literal("neutral-wash"),
10941
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10942
+ }).strict(),
10943
+ z23.object({
10944
+ kind: z23.literal("solid-panel"),
10945
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10946
+ }).strict()
10947
+ ]);
10948
+ var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
10323
10949
  function uniqueNonEmpty(values) {
10324
10950
  const uniqueValues = [...new Set(values)];
10325
10951
  const firstValue = uniqueValues[0];
@@ -10358,7 +10984,11 @@ var blockDesignPlanSchema = z23.object({
10358
10984
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10359
10985
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10360
10986
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10361
- heroLegibility: heroLegibilityStrategySchema.optional()
10987
+ sectionHeight: sectionHeightIntentSchema.optional(),
10988
+ heroLegibility: heroLegibilityStrategySchema.optional(),
10989
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
10990
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
10991
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10362
10992
  }).strict();
10363
10993
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10364
10994
  z23.object({
@@ -11784,6 +12414,7 @@ var SEMANTIC_SPACING_VALUES = [
11784
12414
  ];
11785
12415
  var SECTION_MIN_HEIGHT_VALUES = [
11786
12416
  "none",
12417
+ "banner",
11787
12418
  "hero",
11788
12419
  "immersive"
11789
12420
  ];
@@ -11811,6 +12442,7 @@ var CONTAINER_SPACING_MAP = {
11811
12442
  };
11812
12443
  var SECTION_MIN_HEIGHT_MAP = {
11813
12444
  none: "",
12445
+ banner: "rb-section-min-h-banner",
11814
12446
  hero: "rb-section-min-h-hero",
11815
12447
  immersive: "rb-section-min-h-immersive"
11816
12448
  };
@@ -12590,6 +13222,9 @@ var boxStylesCompositeTransform = {
12590
13222
  classes.push(roundedResult);
12591
13223
  }
12592
13224
  }
13225
+ if (input.treatment === "accent-quote") {
13226
+ classes.push("rb-card-treatment-accent-quote");
13227
+ }
12593
13228
  return classes.join(" ").trim() || "";
12594
13229
  }
12595
13230
  };
@@ -12687,7 +13322,7 @@ var sectionClassNameTransform = {
12687
13322
  minHeight = input.minHeight;
12688
13323
  } else if (process.env.NODE_ENV !== "production") {
12689
13324
  console.warn(
12690
- `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, hero, immersive.`
13325
+ `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, banner, hero, immersive.`
12691
13326
  );
12692
13327
  }
12693
13328
  }
@@ -13010,23 +13645,6 @@ function styledCard(children, opts, ...mods) {
13010
13645
  );
13011
13646
  }
13012
13647
 
13013
- // ../blocks/src/system/node/fragments/typography.ts
13014
- function mergeClassName(base, extra) {
13015
- return [base, extra ?? ""].filter(Boolean).join(" ");
13016
- }
13017
- function captionText(opts, ...mods) {
13018
- const {
13019
- as: asProp,
13020
- className: classNameProp,
13021
- color,
13022
- ...rest
13023
- } = opts ?? {};
13024
- const as = asProp ?? "p";
13025
- const className = mergeClassName("rb-caption", classNameProp);
13026
- const style = textColorStyle(color ?? "mutedText");
13027
- return text({ ...rest, as, className, style }, ...mods);
13028
- }
13029
-
13030
13648
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
13031
13649
  function joinClasses(...parts) {
13032
13650
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -13931,18 +14549,17 @@ function buildAttributionNodes() {
13931
14549
  const name = text(
13932
14550
  {
13933
14551
  as: "strong",
13934
- className: "rb-block",
13935
- style: textColorStyle("text")
14552
+ className: "rb-block"
13936
14553
  },
13937
14554
  bind("testimonial.content.name", { fallback: "Anonymous" })
13938
14555
  );
13939
- const jobTitle = captionText(
13940
- null,
14556
+ const jobTitle = text(
14557
+ { as: "p", className: "rb-caption" },
13941
14558
  when("testimonial.content.jobTitle"),
13942
14559
  bind("testimonial.content.jobTitle")
13943
14560
  );
13944
- const company = captionText(
13945
- null,
14561
+ const company = text(
14562
+ { as: "p", className: "rb-caption" },
13946
14563
  when("testimonial.content.company"),
13947
14564
  bind("testimonial.content.company")
13948
14565
  );
@@ -13976,8 +14593,7 @@ function buildTestimonialCard(...mods) {
13976
14593
  );
13977
14594
  const body = richText(
13978
14595
  {
13979
- className: "rb-prose rb-max-w-none",
13980
- style: textColorStyle("text")
14596
+ className: "rb-prose rb-max-w-none"
13981
14597
  },
13982
14598
  bind("testimonial.content.body"),
13983
14599
  when("testimonial.content.body")
@@ -15607,6 +16223,7 @@ function heroContentCard(children, gap) {
15607
16223
  return styledContainer({
15608
16224
  bindFrom: "_contentCardStyles",
15609
16225
  constrainWidth: false,
16226
+ baseClassName: "rb-relative rb-isolate",
15610
16227
  rootType: "stack",
15611
16228
  rootProps: {
15612
16229
  gap
@@ -15637,6 +16254,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15637
16254
  function heroContainerStack(children, gap) {
15638
16255
  return styledContainer({
15639
16256
  rootType: "stack",
16257
+ baseClassName: "rb-relative rb-isolate",
15640
16258
  rootProps: {
15641
16259
  gap: "none",
15642
16260
  justify: {
@@ -16855,7 +17473,7 @@ function resolveHeroVerticalAlignment(content) {
16855
17473
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
16856
17474
  const sectionStyles = asPartialObject(content._sectionStyles);
16857
17475
  const minHeight = sectionStyles?.minHeight;
16858
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17476
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
16859
17477
  const variant = resolveHeroVariant(content);
16860
17478
  if (variant === "split" || variant === "splitReverse") return "center";
16861
17479
  return "top";
@@ -17613,6 +18231,26 @@ var footerSplitNavSingleClassTransform = {
17613
18231
  ]);
17614
18232
  }
17615
18233
  };
18234
+ var footerSplitMainClassSchema = z35.object({
18235
+ base: z35.string().optional(),
18236
+ reverseClass: z35.string().optional()
18237
+ });
18238
+ var footerSplitMainClassTransform = {
18239
+ id: "layout.footerSplitMainClass",
18240
+ kind: "string",
18241
+ summary: "Compose split-footer main row classes from footer logo placement",
18242
+ schema: footerSplitMainClassSchema,
18243
+ run: (value, options) => {
18244
+ const logo = asPartialObject(value);
18245
+ const placement = logo?.placement ?? "right";
18246
+ const shouldPlaceLogoFirst = placement === "left" || placement === "above";
18247
+ 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";
18248
+ return joinClasses4([
18249
+ options.base ?? baseClass,
18250
+ shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null
18251
+ ]);
18252
+ }
18253
+ };
17616
18254
  var footerLogoClassSchema = z35.object({
17617
18255
  base: z35.string().optional()
17618
18256
  });
@@ -17623,14 +18261,11 @@ var footerLogoClassTransform = {
17623
18261
  schema: footerLogoClassSchema,
17624
18262
  run: (value, options) => {
17625
18263
  const logo = asPartialObject(value);
17626
- const placement = logo?.placement ?? "right";
17627
18264
  const align = logo?.align ?? "end";
17628
18265
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17629
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17630
18266
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
17631
18267
  return joinClasses4([
17632
18268
  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",
17633
- orderClass,
17634
18269
  selfAlignClass,
17635
18270
  hiddenClass
17636
18271
  ]);
@@ -17685,6 +18320,7 @@ var layoutTransforms = [
17685
18320
  footerBottomBarContainerClassTransform,
17686
18321
  footerBottomBarStyleTransform,
17687
18322
  footerSplitNavSingleClassTransform,
18323
+ footerSplitMainClassTransform,
17688
18324
  footerLogoClassTransform,
17689
18325
  footerLogoMediaClassTransform,
17690
18326
  footerLogoTextVisibleTransform
@@ -17958,7 +18594,7 @@ var createNavRow = (className, align = "end") => navRow({
17958
18594
  var headerCta = ctaButton({
17959
18595
  basePath: "menu.ctaItem",
17960
18596
  whenPath: "menu.ctaItem.label",
17961
- variantPath: "menu.ctaItem.variant",
18597
+ variantPath: "$root.theme.header.ctaVariant",
17962
18598
  linkPath: "menu.ctaItem.link",
17963
18599
  sizeFallback: "sm",
17964
18600
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -17966,7 +18602,7 @@ var headerCta = ctaButton({
17966
18602
  var mobileCta = ctaButton({
17967
18603
  basePath: "menu.ctaItem",
17968
18604
  whenPath: "menu.ctaItem.label",
17969
- variantPath: "menu.ctaItem.variant",
18605
+ variantPath: "$root.theme.header.ctaVariant",
17970
18606
  linkPath: "menu.ctaItem.link",
17971
18607
  sizeFallback: "md",
17972
18608
  className: "nav-mobile-cta rb-w-full"
@@ -18427,7 +19063,13 @@ var splitFooterLayout = stack(
18427
19063
  [
18428
19064
  inline(
18429
19065
  {
18430
- 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"
19066
+ className: {
19067
+ $bind: {
19068
+ from: "$root.theme.footer.logo",
19069
+ transforms: [{ id: "layout.footerSplitMainClass" }],
19070
+ 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"
19071
+ }
19072
+ }
18431
19073
  },
18432
19074
  [
18433
19075
  stack(
@@ -20515,7 +21157,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20515
21157
  run: z47.object({
20516
21158
  courseId: z47.string(),
20517
21159
  seriesId: z47.string(),
20518
- runSlug: z47.string()
21160
+ runSlug: z47.string(),
21161
+ runName: z47.string().nullable()
20519
21162
  })
20520
21163
  }),
20521
21164
  z47.object({
@@ -26462,6 +27105,34 @@ function panelCapable() {
26462
27105
  itemSurfaces: "unsupported"
26463
27106
  });
26464
27107
  }
27108
+ var heroSectionHeights = [
27109
+ "default",
27110
+ "banner",
27111
+ "hero",
27112
+ "immersive"
27113
+ ];
27114
+ var heroImageSurfaceTreatments = [
27115
+ "none",
27116
+ "brand-scrim",
27117
+ "brand-wash",
27118
+ "neutral-scrim",
27119
+ "neutral-wash",
27120
+ "solid-panel"
27121
+ ];
27122
+ var heroImageSurfaceMotions = [
27123
+ "static",
27124
+ "fixed-frame"
27125
+ ];
27126
+ function heroCapable() {
27127
+ return declareBlockDesignCapability({
27128
+ sectionSurfaces: "supported",
27129
+ contentFrames: ["plain", "panel"],
27130
+ itemSurfaces: "unsupported",
27131
+ sectionHeights: heroSectionHeights,
27132
+ imageSurfaceTreatments: heroImageSurfaceTreatments,
27133
+ imageSurfaceMotions: heroImageSurfaceMotions
27134
+ });
27135
+ }
26465
27136
  function plainItemsCapable() {
26466
27137
  return declareBlockDesignCapability({
26467
27138
  sectionSurfaces: "supported",
@@ -26578,7 +27249,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26578
27249
  };
26579
27250
  }
26580
27251
  var systemBlockDefinitionsRaw = [
26581
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27252
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26582
27253
  flow: heroFlow,
26583
27254
  layoutProfiles: [
26584
27255
  layoutProfile({
@@ -26682,7 +27353,12 @@ var systemBlockDefinitionsRaw = [
26682
27353
  flow: siteChromeFlow,
26683
27354
  layoutProfiles: []
26684
27355
  })),
26685
- withDesignCapability("block.testimonials", testimonialsBlockDefinition, panelAndItemsCapable(), defineBlockDesignMetadata({
27356
+ withDesignCapability("block.testimonials", testimonialsBlockDefinition, declareBlockDesignCapability({
27357
+ sectionSurfaces: "supported",
27358
+ contentFrames: ["plain", "panel"],
27359
+ itemSurfaces: "supported",
27360
+ testimonialCardTreatments: ["default", "accent-quote"]
27361
+ }), defineBlockDesignMetadata({
26686
27362
  flow: proofFlow,
26687
27363
  layoutProfiles: [
26688
27364
  layoutProfile({
@@ -26924,8 +27600,15 @@ function parseOpacity(value) {
26924
27600
  }
26925
27601
  return opacity <= 1 ? opacity : opacity / 100;
26926
27602
  }
26927
- function appendOptionalClasses(baseClassName, optionalClassName) {
26928
- return optionalClassName ? `${baseClassName} ${optionalClassName}` : baseClassName;
27603
+ function backgroundMotionClassNames(input) {
27604
+ return input.motion === "fixed-frame" ? "rb-bg-motion-fixed-frame" : "";
27605
+ }
27606
+ function appendBackgroundMediaClasses(baseClassName, input) {
27607
+ return [
27608
+ baseClassName,
27609
+ backgroundMotionClassNames(input),
27610
+ backgroundVideoMobileClassNames(input)
27611
+ ].filter(Boolean).join(" ");
26929
27612
  }
26930
27613
  var resolveImageStyleTransform = {
26931
27614
  id: "background.resolveImageStyle",
@@ -27002,9 +27685,9 @@ var resolveImageClassNameTransform = {
27002
27685
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
27003
27686
  const position = isString(input.position) ? input.position.trim() : null;
27004
27687
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
27005
- return appendOptionalClasses(
27688
+ return appendBackgroundMediaClasses(
27006
27689
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
27007
- backgroundVideoMobileClassNames(input)
27690
+ input
27008
27691
  );
27009
27692
  }
27010
27693
  let needsAnchoring = false;
@@ -27017,18 +27700,18 @@ var resolveImageClassNameTransform = {
27017
27700
  }
27018
27701
  }
27019
27702
  if (!needsAnchoring) {
27020
- return appendOptionalClasses(
27703
+ return appendBackgroundMediaClasses(
27021
27704
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
27022
- backgroundVideoMobileClassNames(input)
27705
+ input
27023
27706
  );
27024
27707
  }
27025
27708
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
27026
27709
  const isCustom = position && !isPreset;
27027
27710
  if (isCustom) {
27028
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27711
+ return appendBackgroundMediaClasses(baseClass, input);
27029
27712
  }
27030
27713
  const anchorClasses = getAnchorClasses(position);
27031
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27714
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
27032
27715
  }
27033
27716
  };
27034
27717
  var resolveOverlayStyleTransform = {