@riverbankcms/sdk 0.60.12 → 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 (91) hide show
  1. package/README.md +10 -7
  2. package/dist/_dts/api/src/bookingConfig.d.ts +31 -1
  3. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +38 -1
  4. package/dist/_dts/api/src/bookingOperations.d.ts +3 -0
  5. package/dist/_dts/api/src/bookingRecords.d.ts +45 -0
  6. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +4 -4
  7. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +1 -5
  8. package/dist/_dts/api/src/communications.d.ts +1 -1
  9. package/dist/_dts/api/src/contentRuntime.d.ts +1 -1
  10. package/dist/_dts/api/src/endpoints.d.ts +89 -9
  11. package/dist/_dts/api/src/index.d.ts +2 -1
  12. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +1 -0
  13. package/dist/_dts/api/src/seoEndpoints.d.ts +2 -0
  14. package/dist/_dts/api/src/siteAssets.d.ts +0 -10
  15. package/dist/_dts/api/src/types.d.ts +1 -1
  16. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  17. package/dist/_dts/blocks/src/index.d.ts +1 -0
  18. package/dist/_dts/blocks/src/portal/types.d.ts +1 -1
  19. package/dist/_dts/blocks/src/server.d.ts +1 -0
  20. package/dist/_dts/blocks/src/subroutes/fold.d.ts +40 -0
  21. package/dist/_dts/blocks/src/subroutes/formatDate.d.ts +12 -0
  22. package/dist/_dts/blocks/src/subroutes/index.d.ts +3 -0
  23. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +32 -0
  24. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +3 -1
  25. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +2 -0
  26. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +1 -0
  27. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +1 -0
  28. package/dist/_dts/blocks/src/system/spacing.d.ts +2 -1
  29. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +5 -0
  30. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +5 -1
  31. package/dist/_dts/core/src/booking-refunds.d.ts +8 -0
  32. package/dist/_dts/core/src/participant-identity.d.ts +1 -73
  33. package/dist/_dts/core/src/participants.d.ts +19 -7
  34. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +188 -36
  35. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -3
  36. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +3 -3
  37. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +3 -3
  38. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +3 -3
  39. package/dist/_dts/preview-next/src/client/preview/SubrouteNoticePanel.d.ts +13 -0
  40. package/dist/_dts/preview-next/src/client/preview/subrouteNotice.d.ts +26 -0
  41. package/dist/_dts/sdk/src/contracts/page.d.ts +1 -0
  42. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -0
  43. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -0
  44. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +4 -5
  45. package/dist/_dts/sdk/src/version.d.ts +1 -1
  46. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  47. package/dist/_dts/theme-core/src/buttons/personalities/showtime-pill.d.ts +17 -0
  48. package/dist/_dts/theme-core/src/buttons/types.d.ts +1 -1
  49. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  50. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +66 -30
  51. package/dist/_dts/theme-core/src/palette/variants/brand-led.d.ts +16 -0
  52. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  53. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  54. package/dist/_dts/theme-core/src/schema.d.ts +174 -6
  55. package/dist/_dts/theme-core/src/site-styles/appearancePresets.d.ts +328 -15
  56. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +54 -2
  57. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +124 -0
  58. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  59. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  60. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +21 -0
  61. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +2 -1
  62. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  63. package/dist/_dts/theme-core/src/site-styles/types.d.ts +135 -2
  64. package/dist/_dts/ui/src/badge.d.ts +1 -1
  65. package/dist/_dts/ui/src/button.d.ts +1 -1
  66. package/dist/cli/index.mjs +744 -176
  67. package/dist/client/bookings.mjs +115 -63
  68. package/dist/client/client.mjs +848 -227
  69. package/dist/client/hooks.mjs +737 -173
  70. package/dist/client/rendering/client.mjs +179 -100
  71. package/dist/client/rendering/islands.mjs +179 -99
  72. package/dist/client/rendering.mjs +847 -226
  73. package/dist/preview-next/before-render.mjs +103 -16
  74. package/dist/preview-next/client/runtime.mjs +1615 -319
  75. package/dist/preview-next/middleware.mjs +103 -16
  76. package/dist/server/components.mjs +838 -227
  77. package/dist/server/config-validation.mjs +737 -173
  78. package/dist/server/config.mjs +737 -173
  79. package/dist/server/data.mjs +737 -173
  80. package/dist/server/index.mjs +106 -79
  81. package/dist/server/next.mjs +841 -229
  82. package/dist/server/page-converter.mjs +589 -144
  83. package/dist/server/prebuild.mjs +1 -1
  84. package/dist/server/rendering/server.mjs +838 -227
  85. package/dist/server/rendering.mjs +838 -227
  86. package/dist/server/routing.mjs +771 -178
  87. package/dist/server/server.mjs +738 -174
  88. package/dist/server/theme-bridge.mjs +216 -39
  89. package/dist/server/theme.mjs +139 -37
  90. package/dist/styles/index.css +44 -2
  91. package/package.json +1 -1
@@ -636,7 +636,7 @@ var ENDPOINT_DEFINITIONS = {
636
636
  method: "GET",
637
637
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
638
638
  auth: "user",
639
- responseKind: "text"
639
+ responseKind: "blob"
640
640
  },
641
641
  getNewsletterSubscriber: {
642
642
  path: "/sites/{siteId}/newsletter/subscribers/{subscriberId}",
@@ -967,12 +967,7 @@ var ENDPOINT_DEFINITIONS = {
967
967
  ],
968
968
  auth: "user",
969
969
  responseKind: "json",
970
- errors: [
971
- "validation:invalid_input",
972
- "resource:not_found",
973
- "resource:conflict",
974
- "server:internal_error"
975
- ]
970
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
976
971
  },
977
972
  unpublishTeamMemberProfile: {
978
973
  path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
@@ -1225,6 +1220,13 @@ var ENDPOINT_DEFINITIONS = {
1225
1220
  auth: "user",
1226
1221
  responseKind: "json"
1227
1222
  },
1223
+ exportBookingAppointmentsCsv: {
1224
+ path: "/sites/{siteId}/bookings/appointments/export.csv",
1225
+ method: "GET",
1226
+ auth: "user",
1227
+ errors: [],
1228
+ responseKind: "blob"
1229
+ },
1228
1230
  createAppointment: {
1229
1231
  path: "/sites/{siteId}/bookings/appointments",
1230
1232
  method: "POST",
@@ -1352,6 +1354,13 @@ var ENDPOINT_DEFINITIONS = {
1352
1354
  auth: "user",
1353
1355
  responseKind: "json"
1354
1356
  },
1357
+ exportCourseEnrollmentsCsv: {
1358
+ path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
1359
+ method: "GET",
1360
+ auth: "user",
1361
+ errors: [],
1362
+ responseKind: "blob"
1363
+ },
1355
1364
  listCourseWaitlist: {
1356
1365
  path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist",
1357
1366
  method: "GET",
@@ -2714,6 +2723,14 @@ var ENDPOINT_DEFINITIONS = {
2714
2723
  auth: "user",
2715
2724
  responseKind: "json"
2716
2725
  },
2726
+ exportSeoPagesCsv: {
2727
+ path: "/sites/{siteId}/seo/pages",
2728
+ method: "GET",
2729
+ tags: ["site-{siteId}", "seo-pages-{siteId}"],
2730
+ auth: "user",
2731
+ responseKind: "blob",
2732
+ errors: []
2733
+ },
2717
2734
  getSeoQueries: {
2718
2735
  path: "/sites/{siteId}/seo/queries",
2719
2736
  method: "GET",
@@ -2722,6 +2739,14 @@ var ENDPOINT_DEFINITIONS = {
2722
2739
  auth: "user",
2723
2740
  responseKind: "json"
2724
2741
  },
2742
+ exportSeoQueriesCsv: {
2743
+ path: "/sites/{siteId}/seo/queries",
2744
+ method: "GET",
2745
+ tags: ["site-{siteId}", "seo-queries-{siteId}"],
2746
+ auth: "user",
2747
+ responseKind: "blob",
2748
+ errors: []
2749
+ },
2725
2750
  getPerformanceOverview: {
2726
2751
  path: "/sites/{siteId}/performance/overview",
2727
2752
  method: "GET",
@@ -2770,7 +2795,12 @@ var ENDPOINT_DEFINITIONS = {
2770
2795
  path: "/media/{assetId}/canonical-crop",
2771
2796
  method: "POST",
2772
2797
  tags: ["media", "media-{assetId}"],
2773
- errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"],
2798
+ errors: [
2799
+ "validation:invalid_input",
2800
+ "resource:not_found",
2801
+ "resource:conflict",
2802
+ "server:internal_error"
2803
+ ],
2774
2804
  auth: "user",
2775
2805
  responseKind: "json"
2776
2806
  },
@@ -3102,7 +3132,7 @@ var ENDPOINT_DEFINITIONS = {
3102
3132
  method: "GET",
3103
3133
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3104
3134
  auth: "user",
3105
- responseKind: "text"
3135
+ responseKind: "blob"
3106
3136
  },
3107
3137
  // Public submit
3108
3138
  submitForm: {
@@ -3985,6 +4015,14 @@ var ENDPOINT_DEFINITIONS = {
3985
4015
  auth: "user",
3986
4016
  responseKind: "json"
3987
4017
  },
4018
+ exportEventSeriesAttendeesCsv: {
4019
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/attendees/export.csv",
4020
+ method: "GET",
4021
+ tags: ["site-{siteId}", "event-series-{seriesId}"],
4022
+ auth: "user",
4023
+ errors: [],
4024
+ responseKind: "blob"
4025
+ },
3988
4026
  listEventSeriesWaitlist: {
3989
4027
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3990
4028
  method: "GET",
@@ -4548,6 +4586,14 @@ var ENDPOINT_DEFINITIONS = {
4548
4586
  auth: "user",
4549
4587
  responseKind: "json"
4550
4588
  },
4589
+ exportBookingCustomersCsv: {
4590
+ path: "/sites/{siteId}/bookings/customers/export.csv",
4591
+ method: "GET",
4592
+ tags: ["site-{siteId}", "customers-{siteId}"],
4593
+ auth: "user",
4594
+ errors: [],
4595
+ responseKind: "blob"
4596
+ },
4551
4597
  createBookingCustomer: {
4552
4598
  path: "/sites/{siteId}/bookings/customers",
4553
4599
  method: "POST",
@@ -4575,6 +4621,21 @@ var ENDPOINT_DEFINITIONS = {
4575
4621
  "server:internal_error"
4576
4622
  ]
4577
4623
  },
4624
+ rectifyBookingParticipantIdentity: {
4625
+ path: "/sites/{siteId}/bookings/participants/{participantId}/identity",
4626
+ method: "PATCH",
4627
+ tags: ["site-{siteId}", "customers-{siteId}"],
4628
+ auth: "user",
4629
+ responseKind: "json",
4630
+ errors: [
4631
+ "validation:invalid_input",
4632
+ "auth:forbidden",
4633
+ "resource:not_found",
4634
+ "resource:already_exists",
4635
+ "resource:conflict",
4636
+ "server:internal_error"
4637
+ ]
4638
+ },
4578
4639
  listCustomerPasses: {
4579
4640
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4580
4641
  method: "GET",
@@ -4709,13 +4770,46 @@ var ENDPOINT_DEFINITIONS = {
4709
4770
  auth: "user",
4710
4771
  responseKind: "json"
4711
4772
  },
4773
+ exportMoneyPaymentsCsv: {
4774
+ path: "/sites/{siteId}/bookings/money/payments/export.csv",
4775
+ method: "GET",
4776
+ tags: ["site-{siteId}", "bookings", "money-payments-{siteId}"],
4777
+ errors: [],
4778
+ auth: "user",
4779
+ responseKind: "blob"
4780
+ },
4781
+ exportMoneyBreakdownsCsv: {
4782
+ path: "/sites/{siteId}/bookings/money/report/breakdowns/export.csv",
4783
+ method: "GET",
4784
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4785
+ errors: [],
4786
+ auth: "user",
4787
+ responseKind: "blob"
4788
+ },
4789
+ exportMoneyTimeSeriesCsv: {
4790
+ path: "/sites/{siteId}/bookings/money/report/time-series/export.csv",
4791
+ method: "GET",
4792
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4793
+ errors: [],
4794
+ auth: "user",
4795
+ responseKind: "blob"
4796
+ },
4712
4797
  listBookingActivity: {
4713
4798
  path: "/sites/{siteId}/bookings/activity",
4714
4799
  method: "GET",
4715
4800
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4801
+ errors: [],
4716
4802
  auth: "user",
4717
4803
  responseKind: "json"
4718
4804
  },
4805
+ exportBookingActivityCsv: {
4806
+ path: "/sites/{siteId}/bookings/activity/export.csv",
4807
+ method: "GET",
4808
+ tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4809
+ errors: [],
4810
+ auth: "user",
4811
+ responseKind: "blob"
4812
+ },
4719
4813
  // Site logs
4720
4814
  listSiteActivityLogs: {
4721
4815
  path: "/sites/{siteId}/logs/activity",
@@ -4867,13 +4961,6 @@ var ENDPOINT_DEFINITIONS = {
4867
4961
  auth: "user",
4868
4962
  responseKind: "blob"
4869
4963
  },
4870
- exportSeoCsv: {
4871
- path: "/sites/{siteId}/seo/export",
4872
- method: "GET",
4873
- tags: ["site-{siteId}", "seo"],
4874
- auth: "user",
4875
- responseKind: "blob"
4876
- },
4877
4964
  // Admin site cost (for admin panel)
4878
4965
  adminSiteCost: {
4879
4966
  path: "/admin/sites/{siteId}/cost",
@@ -5874,68 +5961,6 @@ function toLocationCoordinates(value) {
5874
5961
  };
5875
5962
  }
5876
5963
 
5877
- // ../core/src/participant-identity.ts
5878
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD = {
5879
- participant_id: {
5880
- field: "participant_id",
5881
- role: "canonical_link",
5882
- canonicalSource: "booking_participants.id",
5883
- contractAction: "tighten_in_839",
5884
- notes: "Canonical person-subject link for a participation. #839 should enforce this once preflight is clean."
5885
- },
5886
- display_name: {
5887
- field: "display_name",
5888
- role: "contextual_snapshot",
5889
- canonicalSource: "booking_participants.display_name for live identity",
5890
- contractAction: "retain_as_snapshot",
5891
- notes: "Participation-time display context. Readers must not treat it as mutable live participant identity."
5892
- },
5893
- email: {
5894
- field: "email",
5895
- role: "contextual_snapshot",
5896
- canonicalSource: "booking_participants.email_normalized for live email identity",
5897
- contractAction: "retain_as_snapshot",
5898
- notes: "Participation-time contact snapshot used for notifications/context. Live identity belongs to the participant row."
5899
- },
5900
- email_normalized: {
5901
- field: "email_normalized",
5902
- role: "contextual_snapshot",
5903
- canonicalSource: "booking_participants.email_normalized for live email identity",
5904
- contractAction: "retain_as_snapshot",
5905
- notes: "Normalized snapshot/dedupe helper for the participation slot, not live person authority."
5906
- },
5907
- phone: {
5908
- field: "phone",
5909
- role: "contextual_snapshot",
5910
- canonicalSource: "booking_participants.phone for live phone identity",
5911
- contractAction: "retain_as_snapshot",
5912
- notes: "Participation-time phone context. Live identity belongs to the participant row."
5913
- },
5914
- identity_state: {
5915
- field: "identity_state",
5916
- role: "materialization_state",
5917
- canonicalSource: "booking_participants.identity_state for subject state",
5918
- contractAction: "review_for_later_contract_cleanup",
5919
- notes: "Slot materialization state: booker_supplied, contactable, portal_claimed, or staff_verified."
5920
- },
5921
- event_attendee_guest_id: {
5922
- field: "event_attendee_guest_id",
5923
- role: "compatibility_projection",
5924
- canonicalSource: "canonical participant slot plus #838 event guest compatibility projection",
5925
- contractAction: "retain_as_projection",
5926
- notes: "Compatibility FK for event guest read models. It is not person identity authority."
5927
- }
5928
- };
5929
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS = [
5930
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.participant_id,
5931
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.display_name,
5932
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email,
5933
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email_normalized,
5934
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.phone,
5935
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.identity_state,
5936
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.event_attendee_guest_id
5937
- ];
5938
-
5939
5964
  // ../media-core/src/transformRect.ts
5940
5965
  function isValidTransformRectStructure(rect) {
5941
5966
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7172,6 +7197,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
7172
7197
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
7173
7198
  "missing_amount",
7174
7199
  "amount_exceeds_remaining",
7200
+ "credit_refunds_disabled",
7201
+ "missing_credit_customer",
7175
7202
  "deposit_refund_override_required",
7176
7203
  "refund_revoke_requires_full_line_refund",
7177
7204
  "unified_order_link_required"
@@ -7836,12 +7863,29 @@ function defineFrameCapability(capability) {
7836
7863
  function defineBlockDesignCapability(capability) {
7837
7864
  return {
7838
7865
  ...capability,
7839
- kind: "designed"
7866
+ kind: "designed",
7867
+ sectionHeights: capability.sectionHeights ?? ["default"],
7868
+ imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7869
+ imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7870
+ testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"]
7840
7871
  };
7841
7872
  }
7842
7873
 
7843
7874
  // ../theme-core/src/site-styles/appearancePresets.ts
7875
+ function assertValidOptionGroups(preset2) {
7876
+ preset2.optionGroups?.forEach((group) => {
7877
+ const selectedOption = group.options.find(
7878
+ (option) => option.id === group.selectedOptionId
7879
+ );
7880
+ if (!selectedOption) {
7881
+ throw new Error(
7882
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7883
+ );
7884
+ }
7885
+ });
7886
+ }
7844
7887
  function defineBlockAppearancePreset(preset2) {
7888
+ assertValidOptionGroups(preset2);
7845
7889
  return preset2;
7846
7890
  }
7847
7891
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7854,13 +7898,122 @@ var appearancePresets = [
7854
7898
  target: "hero",
7855
7899
  label: "Immersive image hero",
7856
7900
  blockKinds: ["block.hero"],
7901
+ constraints: {
7902
+ layoutFamilies: ["centered", "compact"]
7903
+ },
7904
+ design: {
7905
+ sectionSurface: "hero-image",
7906
+ contentFrame: plainFrame,
7907
+ itemSurface: "none",
7908
+ transitionAfter: "soft-fade-short",
7909
+ emphasis: "high",
7910
+ sectionHeight: "hero",
7911
+ imageSurfaceTreatment: { kind: "neutral-wash" }
7912
+ }
7913
+ }),
7914
+ defineBlockAppearancePreset({
7915
+ kind: "block-design",
7916
+ id: "hero-brand-scrim",
7917
+ target: "hero",
7918
+ label: "Brand scrim image hero",
7919
+ blockKinds: ["block.hero"],
7920
+ constraints: {
7921
+ layoutFamilies: ["centered", "compact"]
7922
+ },
7923
+ optionGroups: [
7924
+ {
7925
+ id: "image-surface-treatment",
7926
+ label: "Treatment",
7927
+ selectedOptionId: "brand-scrim-primary",
7928
+ options: [
7929
+ {
7930
+ id: "brand-scrim-primary",
7931
+ label: "Brand scrim",
7932
+ designPatch: {
7933
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7934
+ }
7935
+ },
7936
+ {
7937
+ id: "neutral-scrim",
7938
+ label: "Neutral scrim",
7939
+ designPatch: {
7940
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7941
+ }
7942
+ }
7943
+ ]
7944
+ }
7945
+ ],
7946
+ layoutPatches: [
7947
+ {
7948
+ constraints: {
7949
+ layoutVariantKeys: ["micro"]
7950
+ },
7951
+ designPatch: {
7952
+ sectionHeight: "banner"
7953
+ }
7954
+ }
7955
+ ],
7857
7956
  design: {
7858
7957
  sectionSurface: "hero-image",
7859
7958
  contentFrame: plainFrame,
7860
7959
  itemSurface: "none",
7861
7960
  transitionAfter: "soft-fade-short",
7862
7961
  emphasis: "high",
7863
- heroLegibility: "scrim-gradient"
7962
+ sectionHeight: "immersive",
7963
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7964
+ }
7965
+ }),
7966
+ defineBlockAppearancePreset({
7967
+ kind: "block-design",
7968
+ id: "hero-brand-scrim-fixed-frame",
7969
+ target: "hero",
7970
+ label: "Fixed-frame brand scrim hero",
7971
+ blockKinds: ["block.hero"],
7972
+ constraints: {
7973
+ layoutFamilies: ["centered", "compact"]
7974
+ },
7975
+ optionGroups: [
7976
+ {
7977
+ id: "image-surface-treatment",
7978
+ label: "Treatment",
7979
+ selectedOptionId: "brand-scrim-primary",
7980
+ options: [
7981
+ {
7982
+ id: "brand-scrim-primary",
7983
+ label: "Brand scrim",
7984
+ designPatch: {
7985
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7986
+ }
7987
+ },
7988
+ {
7989
+ id: "neutral-scrim",
7990
+ label: "Neutral scrim",
7991
+ designPatch: {
7992
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7993
+ }
7994
+ }
7995
+ ]
7996
+ }
7997
+ ],
7998
+ layoutPatches: [
7999
+ {
8000
+ constraints: {
8001
+ layoutVariantKeys: ["micro"]
8002
+ },
8003
+ designPatch: {
8004
+ sectionHeight: "banner"
8005
+ }
8006
+ }
8007
+ ],
8008
+ design: {
8009
+ sectionSurface: "hero-image",
8010
+ contentFrame: plainFrame,
8011
+ itemSurface: "none",
8012
+ transitionAfter: "soft-fade-short",
8013
+ emphasis: "high",
8014
+ sectionHeight: "immersive",
8015
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
8016
+ imageSurfaceMotion: "fixed-frame"
7864
8017
  }
7865
8018
  }),
7866
8019
  defineBlockAppearancePreset({
@@ -7877,17 +8030,26 @@ var appearancePresets = [
7877
8030
  emphasis: "high"
7878
8031
  }
7879
8032
  }),
8033
+ defineBlockAppearancePreset({
8034
+ kind: "block-design",
8035
+ id: "body-text-editorial-intro",
8036
+ target: "body-text",
8037
+ label: "Editorial intro copy",
8038
+ blockKinds: ["block.body-text"],
8039
+ design: {
8040
+ sectionSurface: "base",
8041
+ contentFrame: plainFrame,
8042
+ itemSurface: "none",
8043
+ transitionAfter: "soft-fade-short",
8044
+ emphasis: "high"
8045
+ }
8046
+ }),
7880
8047
  defineBlockAppearancePreset({
7881
8048
  kind: "block-design",
7882
8049
  id: "offerings-calm-list",
7883
8050
  target: "offerings",
7884
8051
  label: "Calm offerings list",
7885
- blockKinds: [
7886
- "block.event-listing",
7887
- "block.event-calendar",
7888
- "block.event-spotlight",
7889
- "block.product-list"
7890
- ],
8052
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7891
8053
  design: {
7892
8054
  sectionSurface: "muted-band",
7893
8055
  contentFrame: plainFrame,
@@ -7966,6 +8128,35 @@ var appearancePresets = [
7966
8128
  emphasis: "high"
7967
8129
  }
7968
8130
  }),
8131
+ defineBlockAppearancePreset({
8132
+ kind: "block-design",
8133
+ id: "testimonials-dark-proof",
8134
+ target: "testimonials",
8135
+ label: "Dark proof panel",
8136
+ blockKinds: ["block.testimonials"],
8137
+ design: {
8138
+ sectionSurface: "accent-band",
8139
+ contentFrame: panelFrame("raised"),
8140
+ itemSurface: "raised",
8141
+ transitionAfter: "soft-fade-short",
8142
+ emphasis: "high"
8143
+ }
8144
+ }),
8145
+ defineBlockAppearancePreset({
8146
+ kind: "block-design",
8147
+ id: "testimonials-accent-quote-proof",
8148
+ target: "testimonials",
8149
+ label: "Accent quote proof",
8150
+ blockKinds: ["block.testimonials"],
8151
+ design: {
8152
+ sectionSurface: "accent-band",
8153
+ contentFrame: plainFrame,
8154
+ itemSurface: "raised",
8155
+ transitionAfter: "soft-fade-short",
8156
+ emphasis: "high",
8157
+ testimonialCardTreatment: "accent-quote"
8158
+ }
8159
+ }),
7969
8160
  defineBlockAppearancePreset({
7970
8161
  kind: "block-design",
7971
8162
  id: "faq-contained-help",
@@ -7994,6 +8185,20 @@ var appearancePresets = [
7994
8185
  emphasis: "medium"
7995
8186
  }
7996
8187
  }),
8188
+ defineBlockAppearancePreset({
8189
+ kind: "block-design",
8190
+ id: "contact-form-dark-card",
8191
+ target: "contact-form",
8192
+ label: "Dark form card",
8193
+ blockKinds: ["block.form"],
8194
+ design: {
8195
+ sectionSurface: "accent-band",
8196
+ contentFrame: panelFrame("raised"),
8197
+ itemSurface: "none",
8198
+ transitionAfter: "soft-fade-short",
8199
+ emphasis: "high"
8200
+ }
8201
+ }),
7997
8202
  defineBlockAppearancePreset({
7998
8203
  kind: "block-design",
7999
8204
  id: "cta-accent-band",
@@ -8013,9 +8218,33 @@ var appearancePresets = [
8013
8218
  id: "header-clean-base",
8014
8219
  target: "site-header",
8015
8220
  label: "Clean base header",
8016
- chrome: {
8017
- surface: "base",
8018
- emphasis: "medium"
8221
+ header: {
8222
+ surface: {
8223
+ kind: "neutral-solid",
8224
+ token: "surface",
8225
+ textColorToken: "text"
8226
+ },
8227
+ navTreatment: "minimal",
8228
+ dropdownTreatment: "surface",
8229
+ ctaTreatment: "default",
8230
+ behavior: "default"
8231
+ }
8232
+ }),
8233
+ defineSiteChromeAppearancePreset({
8234
+ kind: "site-chrome",
8235
+ id: "site-header-brand-solid-inverted-cta",
8236
+ target: "site-header",
8237
+ label: "Brand solid header with inverted CTA",
8238
+ header: {
8239
+ surface: {
8240
+ kind: "brand-solid",
8241
+ token: "primary",
8242
+ textColorToken: "primaryForeground"
8243
+ },
8244
+ navTreatment: "uppercase-underline",
8245
+ dropdownTreatment: "matched-solid",
8246
+ ctaTreatment: "inverted",
8247
+ behavior: "sticky-shrink"
8019
8248
  }
8020
8249
  }),
8021
8250
  defineSiteChromeAppearancePreset({
@@ -8023,10 +8252,31 @@ var appearancePresets = [
8023
8252
  id: "footer-muted-grounding",
8024
8253
  target: "site-footer",
8025
8254
  label: "Muted grounding footer",
8026
- chrome: {
8255
+ footer: {
8256
+ kind: "grounding",
8027
8257
  surface: "muted-band",
8028
8258
  emphasis: "low"
8029
8259
  }
8260
+ }),
8261
+ defineSiteChromeAppearancePreset({
8262
+ kind: "site-chrome",
8263
+ id: "site-footer-brand-two-band",
8264
+ target: "site-footer",
8265
+ label: "Two-band brand footer",
8266
+ footer: {
8267
+ kind: "brand-two-band",
8268
+ surface: {
8269
+ token: "primary",
8270
+ shade: "800",
8271
+ textColorToken: "primaryForeground"
8272
+ },
8273
+ bottomBand: {
8274
+ token: "primary",
8275
+ shade: "900",
8276
+ textColorToken: "primaryForeground"
8277
+ },
8278
+ emphasis: "high"
8279
+ }
8030
8280
  })
8031
8281
  ];
8032
8282
 
@@ -8686,6 +8936,111 @@ var pebble = defineButtonPersonality({
8686
8936
  }
8687
8937
  });
8688
8938
 
8939
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
8940
+ var showtimePill = defineButtonPersonality({
8941
+ id: "showtime-pill",
8942
+ name: "Showtime Pill",
8943
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
8944
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
8945
+ buttonSystem: {
8946
+ global: {
8947
+ cornerStyle: "pill",
8948
+ shadow: "low",
8949
+ textTransform: "uppercase",
8950
+ fontWeight: 700,
8951
+ borderWidth: 2,
8952
+ hoverTransform: "lift",
8953
+ hoverColor: "darken",
8954
+ typography: "body",
8955
+ paddingPreset: "spacious",
8956
+ italic: false
8957
+ },
8958
+ sizes: {
8959
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
8960
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
8961
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
8962
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
8963
+ },
8964
+ variants: [
8965
+ {
8966
+ id: "primary",
8967
+ name: "Primary",
8968
+ enabled: true,
8969
+ priority: 1,
8970
+ background: { type: "solid", colorToken: "primary" },
8971
+ textColorToken: "background",
8972
+ borderRadius: "rounded-full",
8973
+ effects: {
8974
+ hover: [{ effectId: "pop" }]
8975
+ }
8976
+ },
8977
+ {
8978
+ id: "secondary",
8979
+ name: "Secondary",
8980
+ enabled: true,
8981
+ priority: 2,
8982
+ background: { type: "transparent" },
8983
+ textColorToken: "primary",
8984
+ borderRadius: "rounded-full",
8985
+ border: { widthClass: "border-2", colorToken: "primary" },
8986
+ effects: {
8987
+ hover: [{ effectId: "pop" }]
8988
+ }
8989
+ },
8990
+ {
8991
+ id: "hero",
8992
+ name: "Hero",
8993
+ enabled: true,
8994
+ priority: 1,
8995
+ background: { type: "solid", colorToken: "secondary" },
8996
+ textColorToken: "primary",
8997
+ borderRadius: "rounded-full",
8998
+ effects: {
8999
+ hover: [{ effectId: "pop" }]
9000
+ }
9001
+ },
9002
+ {
9003
+ id: "header",
9004
+ name: "Header",
9005
+ enabled: true,
9006
+ priority: 2,
9007
+ background: { type: "solid", colorToken: "background" },
9008
+ textColorToken: "primary",
9009
+ borderRadius: "rounded-full",
9010
+ border: { widthClass: "border-2", colorToken: "primary" },
9011
+ effects: {
9012
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9013
+ }
9014
+ },
9015
+ {
9016
+ id: "outline",
9017
+ name: "Outline",
9018
+ enabled: true,
9019
+ priority: 3,
9020
+ background: { type: "transparent" },
9021
+ textColorToken: "primary",
9022
+ borderRadius: "rounded-full",
9023
+ border: { widthClass: "border-2", colorToken: "primary" },
9024
+ effects: {
9025
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
9026
+ }
9027
+ },
9028
+ {
9029
+ id: "ghost",
9030
+ name: "Ghost",
9031
+ enabled: true,
9032
+ priority: 3,
9033
+ background: { type: "transparent" },
9034
+ textColorToken: "primary",
9035
+ borderRadius: "rounded-full",
9036
+ effects: {
9037
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9038
+ }
9039
+ }
9040
+ ]
9041
+ }
9042
+ });
9043
+
8689
9044
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8690
9045
  var softPill = defineButtonPersonality({
8691
9046
  id: "soft-pill",
@@ -8766,7 +9121,8 @@ var buttonPersonalities = [
8766
9121
  editorialLink,
8767
9122
  pebble,
8768
9123
  inkStamp,
8769
- brushedWash
9124
+ brushedWash,
9125
+ showtimePill
8770
9126
  ];
8771
9127
  var personalitiesById = new Map(
8772
9128
  buttonPersonalities.map((p) => [p.id, p])
@@ -9297,14 +9653,7 @@ var proseLinkStyleSchema = z21.object({
9297
9653
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9298
9654
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9299
9655
  });
9300
- var semanticSpacingSchema = z21.enum([
9301
- "none",
9302
- "compact",
9303
- "cozy",
9304
- "medium",
9305
- "comfortable",
9306
- "spacious"
9307
- ]);
9656
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9308
9657
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9309
9658
  var boxBackgroundOverlaySchema = z21.object({
9310
9659
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9321,6 +9670,7 @@ var boxBackgroundSchema = z21.object({
9321
9670
  scale: z21.string().nullable().optional(),
9322
9671
  position: z21.string().nullable().optional(),
9323
9672
  opacity: z21.number().min(0).max(1).nullable().optional(),
9673
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9324
9674
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9325
9675
  textColor: z21.string().nullable().optional(),
9326
9676
  headingColor: z21.string().nullable().optional()
@@ -9328,7 +9678,7 @@ var boxBackgroundSchema = z21.object({
9328
9678
  var sectionStylesOverrideSchema = z21.object({
9329
9679
  background: boxBackgroundSchema.nullable().optional(),
9330
9680
  spacing: semanticSpacingSchema.nullable().optional(),
9331
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9681
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9332
9682
  });
9333
9683
  var containerStylesOverrideSchema = z21.object({
9334
9684
  background: boxBackgroundSchema.nullable().optional(),
@@ -9347,7 +9697,8 @@ var cardStylesOverrideSchema = z21.object({
9347
9697
  border: cardBorderOverrideSchema.nullable().optional(),
9348
9698
  spacing: semanticSpacingSchema.nullable().optional(),
9349
9699
  raised: z21.boolean().nullable().optional(),
9350
- rounded: boxRoundedSchema.nullable().optional()
9700
+ rounded: boxRoundedSchema.nullable().optional(),
9701
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9351
9702
  });
9352
9703
  var blockStyleOverridesSchema = z21.object({
9353
9704
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9422,15 +9773,7 @@ var inputStyle = z21.object({
9422
9773
  });
9423
9774
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9424
9775
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9425
- var headerNavStyle = z21.enum([
9426
- "minimal",
9427
- "underline",
9428
- "underline-grow",
9429
- "capsule",
9430
- "scale",
9431
- "frosted",
9432
- "solid"
9433
- ]);
9776
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9434
9777
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9435
9778
  var headerMaxWidth = z21.enum(["container", "full"]);
9436
9779
  var headerContainerSchema = z21.object({
@@ -9484,6 +9827,7 @@ var dropdownStyleSchema = z21.object({
9484
9827
  // optional = no override (browser default)
9485
9828
  }).optional();
9486
9829
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9830
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9487
9831
  var navContainerSchema = z21.object({
9488
9832
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9489
9833
  tint: z21.string().nullable().optional(),
@@ -9502,7 +9846,10 @@ var headerSchema = z21.object({
9502
9846
  shrinkOnScroll: z21.boolean(),
9503
9847
  maxWidth: headerMaxWidth,
9504
9848
  logoOverride: mediaSchema.nullable().optional(),
9505
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9849
+ background: headerBackgroundSchema.default({
9850
+ type: "color",
9851
+ color: "surface"
9852
+ }),
9506
9853
  textColor: z21.string().nullable().optional(),
9507
9854
  // Site title and general header text
9508
9855
  navStyle: headerNavStyle,
@@ -9522,6 +9869,13 @@ var headerSchema = z21.object({
9522
9869
  navLinkStyle: navLinkStyleSchema.optional(),
9523
9870
  // CTA button spacing (desktop left margin)
9524
9871
  ctaGap: headerCtaGapSchema.optional(),
9872
+ // Semantic CTA treatment for header/nav CTA buttons. The Theme V2 compiler
9873
+ // materializes this to ctaVariant against the active button personality.
9874
+ ctaTreatment: headerCtaTreatmentSchema.optional(),
9875
+ // Optional theme-level CTA variant for header/nav CTA buttons.
9876
+ // Internal runtime bridge for the block renderer; prefer ctaTreatment in
9877
+ // authored Theme V2 concepts.
9878
+ ctaVariant: z21.string().min(1).optional(),
9525
9879
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9526
9880
  dropdownStyle: dropdownStyleSchema
9527
9881
  });
@@ -9578,7 +9932,10 @@ var footerSchema = z21.object({
9578
9932
  variant: footerVariant,
9579
9933
  maxWidth: footerMaxWidth,
9580
9934
  showLogoText: z21.boolean().optional(),
9581
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9935
+ background: headerBackgroundSchema.default({
9936
+ type: "color",
9937
+ color: "surface"
9938
+ }),
9582
9939
  // Footer nav styling (independent from header)
9583
9940
  navStyle: headerNavStyle.default("minimal"),
9584
9941
  navColor: z21.string().nullable().optional(),
@@ -9600,17 +9957,7 @@ var layoutSchema = z21.object({
9600
9957
  desktop: containerPaddingPresetSchema.optional()
9601
9958
  }).optional()
9602
9959
  }).optional();
9603
- var heroTypographySizeSchema = z21.enum([
9604
- "sm",
9605
- "base",
9606
- "lg",
9607
- "xl",
9608
- "2xl",
9609
- "3xl",
9610
- "4xl",
9611
- "5xl",
9612
- "6xl"
9613
- ]);
9960
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9614
9961
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9615
9962
  var heroResponsiveTypographySchema = z21.object({
9616
9963
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9635,6 +9982,13 @@ var heroTypographySchema = z21.object({
9635
9982
  var heroSchema = z21.object({
9636
9983
  typography: heroTypographySchema.optional()
9637
9984
  }).optional();
9985
+ var bodyTextIntroTypographySizeSchema = z21.enum(["default", "editorial"]);
9986
+ var bodyTextSchema = z21.object({
9987
+ intro: z21.object({
9988
+ paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
9989
+ headingSize: bodyTextIntroTypographySizeSchema.optional()
9990
+ }).optional()
9991
+ }).optional();
9638
9992
  var gradientsSchema = z21.object({
9639
9993
  button: z21.string().min(1).nullable().optional(),
9640
9994
  hero: z21.string().min(1).nullable().optional(),
@@ -9656,6 +10010,7 @@ var themeSchema = z21.object({
9656
10010
  gradients: gradientsSchema.optional(),
9657
10011
  layout: layoutSchema,
9658
10012
  hero: heroSchema,
10013
+ bodyText: bodyTextSchema,
9659
10014
  header: headerSchema,
9660
10015
  footer: footerSchema,
9661
10016
  buttons: buttonSystemSchema.optional(),
@@ -9679,10 +10034,7 @@ var themeSchema = z21.object({
9679
10034
  ).optional(),
9680
10035
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9681
10036
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9682
- blockOverrides: z21.record(
9683
- z21.string(),
9684
- blockThemeOverrideSchema
9685
- ).optional(),
10037
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9686
10038
  // Structured custom CSS rules
9687
10039
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9688
10040
  customCssRules: customCssRulesSchema,
@@ -9853,6 +10205,28 @@ var brandLedJewel = definePaletteVariant({
9853
10205
  { name: "border", hex: "#a8a29e" }
9854
10206
  ]
9855
10207
  });
10208
+ var brandLedBurgundyGold = definePaletteVariant({
10209
+ id: "brand-led-burgundy-gold",
10210
+ name: "Brand-led \u2014 Burgundy Gold",
10211
+ description: "Deep burgundy with warm gold accents and soft neutral grounds.",
10212
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
10213
+ mode: "light",
10214
+ colors: [
10215
+ { name: "primary", hex: "#7c2e38" },
10216
+ { name: "secondary", hex: "#d4af37" },
10217
+ { name: "accent", hex: "#b8e19a" },
10218
+ { name: "success", hex: "#10b981" },
10219
+ { name: "warning", hex: "#f59e0b" },
10220
+ { name: "destructive", hex: "#ef4444" },
10221
+ { name: "background", hex: "#f1dfd0" },
10222
+ { name: "surface", hex: "#f5e6db" },
10223
+ { name: "surfaceAlt", hex: "#f8ece3" },
10224
+ { name: "muted", hex: "#c9b8a8" },
10225
+ { name: "text", hex: "#400000" },
10226
+ { name: "primaryForeground", hex: "#ffffff" },
10227
+ { name: "border", hex: "#c9b8a8" }
10228
+ ]
10229
+ });
9856
10230
 
9857
10231
  // ../theme-core/src/palette/variants/high-contrast.ts
9858
10232
  var highContrastInk = definePaletteVariant({
@@ -10064,6 +10438,7 @@ var paletteVariants = [
10064
10438
  brandLedCool,
10065
10439
  brandLedWarm,
10066
10440
  brandLedJewel,
10441
+ brandLedBurgundyGold,
10067
10442
  // Warm-neutral family
10068
10443
  warmNeutralClay,
10069
10444
  warmNeutralCream,
@@ -10139,7 +10514,8 @@ var curatedSiteStyleIdValues = [
10139
10514
  "site-style:quiet-luxury",
10140
10515
  "site-style:practical-services",
10141
10516
  "site-style:modern-wellness",
10142
- "site-style:bold-launch"
10517
+ "site-style:bold-launch",
10518
+ "site-style:south-west-twerk-school"
10143
10519
  ];
10144
10520
  var quietBudget = {
10145
10521
  accentDensity: "low",
@@ -10194,6 +10570,8 @@ function defineCuratedSiteStyle(input) {
10194
10570
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
10195
10571
  supportedTransitions: generatedDesignOptionCatalog.transitions
10196
10572
  },
10573
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10574
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10197
10575
  buttonPersonalityChoices: input.buttonPersonalityChoices,
10198
10576
  paletteVariantChoices: input.paletteVariantChoices
10199
10577
  };
@@ -10440,6 +10818,101 @@ var curatedSiteStyles = [
10440
10818
  paletteChoice("brand-led-jewel"),
10441
10819
  paletteChoice("brand-led-warm")
10442
10820
  ]
10821
+ }),
10822
+ defineCuratedSiteStyle({
10823
+ id: "site-style:south-west-twerk-school",
10824
+ name: "South West Twerk School",
10825
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
10826
+ generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
10827
+ selectionKeywords: [
10828
+ "dance",
10829
+ "classes",
10830
+ "workshop",
10831
+ "school",
10832
+ "movement",
10833
+ "performance",
10834
+ "community"
10835
+ ],
10836
+ tokenRecipes: {
10837
+ palette: "brand-led",
10838
+ contrast: "maximum",
10839
+ radius: "soft",
10840
+ shadow: "layered",
10841
+ typography: "clean-sans",
10842
+ spacing: "airy",
10843
+ motion: "expressive"
10844
+ },
10845
+ compositionBudget: expressiveBudget,
10846
+ themeOverrides: {
10847
+ typography: {
10848
+ body: {
10849
+ family: "Manrope, system-ui, sans-serif",
10850
+ size: "lg",
10851
+ weight: "regular",
10852
+ lineHeight: "relaxed",
10853
+ letterSpacing: "normal"
10854
+ },
10855
+ headings: {
10856
+ default: {
10857
+ family: '"TAN - PEARL", sans-serif',
10858
+ weight: "bold",
10859
+ lineHeight: "normal",
10860
+ letterSpacing: "tight",
10861
+ colorToken: "primary",
10862
+ italic: null,
10863
+ case: null
10864
+ },
10865
+ h1: {
10866
+ size: "xl",
10867
+ weight: "bold",
10868
+ lineHeight: "normal",
10869
+ letterSpacing: "tight",
10870
+ italic: null
10871
+ },
10872
+ h2: {
10873
+ size: "lg",
10874
+ weight: "bold",
10875
+ lineHeight: "normal",
10876
+ letterSpacing: "normal",
10877
+ italic: null
10878
+ },
10879
+ h3: {
10880
+ size: "md",
10881
+ weight: "bold",
10882
+ lineHeight: "normal",
10883
+ letterSpacing: "normal",
10884
+ italic: null
10885
+ }
10886
+ },
10887
+ scale: "balanced"
10888
+ },
10889
+ bodyText: {
10890
+ intro: {
10891
+ paragraphSize: "editorial",
10892
+ headingSize: "editorial"
10893
+ }
10894
+ }
10895
+ },
10896
+ recommendedAppearancePresetIds: [
10897
+ "site-header-brand-solid-inverted-cta",
10898
+ "site-footer-brand-two-band",
10899
+ "hero-brand-scrim-fixed-frame",
10900
+ "body-text-editorial-intro",
10901
+ "testimonials-accent-quote-proof",
10902
+ "contact-form-dark-card"
10903
+ ],
10904
+ buttonPersonalityChoices: [
10905
+ buttonChoice("showtime-pill"),
10906
+ buttonChoice("confident-chip"),
10907
+ buttonChoice("ink-stamp"),
10908
+ buttonChoice("brushed-wash")
10909
+ ],
10910
+ paletteVariantChoices: [
10911
+ paletteChoice("brand-led-burgundy-gold"),
10912
+ paletteChoice("brand-led-jewel"),
10913
+ paletteChoice("brand-led-warm"),
10914
+ paletteChoice("high-contrast-ink")
10915
+ ]
10443
10916
  })
10444
10917
  ];
10445
10918
  var curatedSiteStylesById = new Map(
@@ -10484,6 +10957,40 @@ var heroLegibilityStrategySchema = z23.enum([
10484
10957
  "scrim-gradient",
10485
10958
  "solid-panel"
10486
10959
  ]);
10960
+ var sectionHeightIntentSchema = z23.enum([
10961
+ "default",
10962
+ "banner",
10963
+ "hero",
10964
+ "immersive"
10965
+ ]);
10966
+ var imageSurfaceTreatmentIntensitySchema = z23.enum(["soft", "balanced", "strong"]);
10967
+ var imageSurfaceMotionSchema = z23.enum(["static", "fixed-frame"]);
10968
+ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
10969
+ z23.object({ kind: z23.literal("none") }).strict(),
10970
+ z23.object({
10971
+ kind: z23.literal("brand-scrim"),
10972
+ token: z23.enum(["primary", "secondary", "accent"]),
10973
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10974
+ }).strict(),
10975
+ z23.object({
10976
+ kind: z23.literal("brand-wash"),
10977
+ token: z23.enum(["primary", "secondary", "accent"]),
10978
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10979
+ }).strict(),
10980
+ z23.object({
10981
+ kind: z23.literal("neutral-scrim"),
10982
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10983
+ }).strict(),
10984
+ z23.object({
10985
+ kind: z23.literal("neutral-wash"),
10986
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10987
+ }).strict(),
10988
+ z23.object({
10989
+ kind: z23.literal("solid-panel"),
10990
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10991
+ }).strict()
10992
+ ]);
10993
+ var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
10487
10994
  function uniqueNonEmpty(values) {
10488
10995
  const uniqueValues = [...new Set(values)];
10489
10996
  const firstValue = uniqueValues[0];
@@ -10522,7 +11029,11 @@ var blockDesignPlanSchema = z23.object({
10522
11029
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10523
11030
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10524
11031
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10525
- heroLegibility: heroLegibilityStrategySchema.optional()
11032
+ sectionHeight: sectionHeightIntentSchema.optional(),
11033
+ heroLegibility: heroLegibilityStrategySchema.optional(),
11034
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
11035
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
11036
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10526
11037
  }).strict();
10527
11038
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10528
11039
  z23.object({
@@ -11948,6 +12459,7 @@ var SEMANTIC_SPACING_VALUES = [
11948
12459
  ];
11949
12460
  var SECTION_MIN_HEIGHT_VALUES = [
11950
12461
  "none",
12462
+ "banner",
11951
12463
  "hero",
11952
12464
  "immersive"
11953
12465
  ];
@@ -11975,6 +12487,7 @@ var CONTAINER_SPACING_MAP = {
11975
12487
  };
11976
12488
  var SECTION_MIN_HEIGHT_MAP = {
11977
12489
  none: "",
12490
+ banner: "rb-section-min-h-banner",
11978
12491
  hero: "rb-section-min-h-hero",
11979
12492
  immersive: "rb-section-min-h-immersive"
11980
12493
  };
@@ -12754,6 +13267,9 @@ var boxStylesCompositeTransform = {
12754
13267
  classes.push(roundedResult);
12755
13268
  }
12756
13269
  }
13270
+ if (input.treatment === "accent-quote") {
13271
+ classes.push("rb-card-treatment-accent-quote");
13272
+ }
12757
13273
  return classes.join(" ").trim() || "";
12758
13274
  }
12759
13275
  };
@@ -12851,7 +13367,7 @@ var sectionClassNameTransform = {
12851
13367
  minHeight = input.minHeight;
12852
13368
  } else if (process.env.NODE_ENV !== "production") {
12853
13369
  console.warn(
12854
- `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, hero, immersive.`
13370
+ `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, banner, hero, immersive.`
12855
13371
  );
12856
13372
  }
12857
13373
  }
@@ -13174,23 +13690,6 @@ function styledCard(children, opts, ...mods) {
13174
13690
  );
13175
13691
  }
13176
13692
 
13177
- // ../blocks/src/system/node/fragments/typography.ts
13178
- function mergeClassName(base, extra) {
13179
- return [base, extra ?? ""].filter(Boolean).join(" ");
13180
- }
13181
- function captionText(opts, ...mods) {
13182
- const {
13183
- as: asProp,
13184
- className: classNameProp,
13185
- color,
13186
- ...rest
13187
- } = opts ?? {};
13188
- const as = asProp ?? "p";
13189
- const className = mergeClassName("rb-caption", classNameProp);
13190
- const style = textColorStyle(color ?? "mutedText");
13191
- return text({ ...rest, as, className, style }, ...mods);
13192
- }
13193
-
13194
13693
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
13195
13694
  function joinClasses(...parts) {
13196
13695
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -14095,18 +14594,17 @@ function buildAttributionNodes() {
14095
14594
  const name = text(
14096
14595
  {
14097
14596
  as: "strong",
14098
- className: "rb-block",
14099
- style: textColorStyle("text")
14597
+ className: "rb-block"
14100
14598
  },
14101
14599
  bind("testimonial.content.name", { fallback: "Anonymous" })
14102
14600
  );
14103
- const jobTitle = captionText(
14104
- null,
14601
+ const jobTitle = text(
14602
+ { as: "p", className: "rb-caption" },
14105
14603
  when("testimonial.content.jobTitle"),
14106
14604
  bind("testimonial.content.jobTitle")
14107
14605
  );
14108
- const company = captionText(
14109
- null,
14606
+ const company = text(
14607
+ { as: "p", className: "rb-caption" },
14110
14608
  when("testimonial.content.company"),
14111
14609
  bind("testimonial.content.company")
14112
14610
  );
@@ -14140,8 +14638,7 @@ function buildTestimonialCard(...mods) {
14140
14638
  );
14141
14639
  const body = richText(
14142
14640
  {
14143
- className: "rb-prose rb-max-w-none",
14144
- style: textColorStyle("text")
14641
+ className: "rb-prose rb-max-w-none"
14145
14642
  },
14146
14643
  bind("testimonial.content.body"),
14147
14644
  when("testimonial.content.body")
@@ -15771,6 +16268,7 @@ function heroContentCard(children, gap) {
15771
16268
  return styledContainer({
15772
16269
  bindFrom: "_contentCardStyles",
15773
16270
  constrainWidth: false,
16271
+ baseClassName: "rb-relative rb-isolate",
15774
16272
  rootType: "stack",
15775
16273
  rootProps: {
15776
16274
  gap
@@ -15801,6 +16299,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15801
16299
  function heroContainerStack(children, gap) {
15802
16300
  return styledContainer({
15803
16301
  rootType: "stack",
16302
+ baseClassName: "rb-relative rb-isolate",
15804
16303
  rootProps: {
15805
16304
  gap: "none",
15806
16305
  justify: {
@@ -17019,7 +17518,7 @@ function resolveHeroVerticalAlignment(content) {
17019
17518
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
17020
17519
  const sectionStyles = asPartialObject(content._sectionStyles);
17021
17520
  const minHeight = sectionStyles?.minHeight;
17022
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17521
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
17023
17522
  const variant = resolveHeroVariant(content);
17024
17523
  if (variant === "split" || variant === "splitReverse") return "center";
17025
17524
  return "top";
@@ -17777,6 +18276,26 @@ var footerSplitNavSingleClassTransform = {
17777
18276
  ]);
17778
18277
  }
17779
18278
  };
18279
+ var footerSplitMainClassSchema = z35.object({
18280
+ base: z35.string().optional(),
18281
+ reverseClass: z35.string().optional()
18282
+ });
18283
+ var footerSplitMainClassTransform = {
18284
+ id: "layout.footerSplitMainClass",
18285
+ kind: "string",
18286
+ summary: "Compose split-footer main row classes from footer logo placement",
18287
+ schema: footerSplitMainClassSchema,
18288
+ run: (value, options) => {
18289
+ const logo = asPartialObject(value);
18290
+ const placement = logo?.placement ?? "right";
18291
+ const shouldPlaceLogoFirst = placement === "left" || placement === "above";
18292
+ const baseClass = shouldPlaceLogoFirst ? "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-end rb-gap-8 rb-md-flex-row rb-md-items-end" : "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end";
18293
+ return joinClasses4([
18294
+ options.base ?? baseClass,
18295
+ shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null
18296
+ ]);
18297
+ }
18298
+ };
17780
18299
  var footerLogoClassSchema = z35.object({
17781
18300
  base: z35.string().optional()
17782
18301
  });
@@ -17787,14 +18306,11 @@ var footerLogoClassTransform = {
17787
18306
  schema: footerLogoClassSchema,
17788
18307
  run: (value, options) => {
17789
18308
  const logo = asPartialObject(value);
17790
- const placement = logo?.placement ?? "right";
17791
18309
  const align = logo?.align ?? "end";
17792
18310
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17793
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17794
18311
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
17795
18312
  return joinClasses4([
17796
18313
  options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80",
17797
- orderClass,
17798
18314
  selfAlignClass,
17799
18315
  hiddenClass
17800
18316
  ]);
@@ -17849,6 +18365,7 @@ var layoutTransforms = [
17849
18365
  footerBottomBarContainerClassTransform,
17850
18366
  footerBottomBarStyleTransform,
17851
18367
  footerSplitNavSingleClassTransform,
18368
+ footerSplitMainClassTransform,
17852
18369
  footerLogoClassTransform,
17853
18370
  footerLogoMediaClassTransform,
17854
18371
  footerLogoTextVisibleTransform
@@ -18122,7 +18639,7 @@ var createNavRow = (className, align = "end") => navRow({
18122
18639
  var headerCta = ctaButton({
18123
18640
  basePath: "menu.ctaItem",
18124
18641
  whenPath: "menu.ctaItem.label",
18125
- variantPath: "menu.ctaItem.variant",
18642
+ variantPath: "$root.theme.header.ctaVariant",
18126
18643
  linkPath: "menu.ctaItem.link",
18127
18644
  sizeFallback: "sm",
18128
18645
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -18130,7 +18647,7 @@ var headerCta = ctaButton({
18130
18647
  var mobileCta = ctaButton({
18131
18648
  basePath: "menu.ctaItem",
18132
18649
  whenPath: "menu.ctaItem.label",
18133
- variantPath: "menu.ctaItem.variant",
18650
+ variantPath: "$root.theme.header.ctaVariant",
18134
18651
  linkPath: "menu.ctaItem.link",
18135
18652
  sizeFallback: "md",
18136
18653
  className: "nav-mobile-cta rb-w-full"
@@ -18591,7 +19108,13 @@ var splitFooterLayout = stack(
18591
19108
  [
18592
19109
  inline(
18593
19110
  {
18594
- className: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
19111
+ className: {
19112
+ $bind: {
19113
+ from: "$root.theme.footer.logo",
19114
+ transforms: [{ id: "layout.footerSplitMainClass" }],
19115
+ fallback: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
19116
+ }
19117
+ }
18595
19118
  },
18596
19119
  [
18597
19120
  stack(
@@ -20679,7 +21202,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20679
21202
  run: z47.object({
20680
21203
  courseId: z47.string(),
20681
21204
  seriesId: z47.string(),
20682
- runSlug: z47.string()
21205
+ runSlug: z47.string(),
21206
+ runName: z47.string().nullable()
20683
21207
  })
20684
21208
  }),
20685
21209
  z47.object({
@@ -26626,6 +27150,34 @@ function panelCapable() {
26626
27150
  itemSurfaces: "unsupported"
26627
27151
  });
26628
27152
  }
27153
+ var heroSectionHeights = [
27154
+ "default",
27155
+ "banner",
27156
+ "hero",
27157
+ "immersive"
27158
+ ];
27159
+ var heroImageSurfaceTreatments = [
27160
+ "none",
27161
+ "brand-scrim",
27162
+ "brand-wash",
27163
+ "neutral-scrim",
27164
+ "neutral-wash",
27165
+ "solid-panel"
27166
+ ];
27167
+ var heroImageSurfaceMotions = [
27168
+ "static",
27169
+ "fixed-frame"
27170
+ ];
27171
+ function heroCapable() {
27172
+ return declareBlockDesignCapability({
27173
+ sectionSurfaces: "supported",
27174
+ contentFrames: ["plain", "panel"],
27175
+ itemSurfaces: "unsupported",
27176
+ sectionHeights: heroSectionHeights,
27177
+ imageSurfaceTreatments: heroImageSurfaceTreatments,
27178
+ imageSurfaceMotions: heroImageSurfaceMotions
27179
+ });
27180
+ }
26629
27181
  function plainItemsCapable() {
26630
27182
  return declareBlockDesignCapability({
26631
27183
  sectionSurfaces: "supported",
@@ -26742,7 +27294,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26742
27294
  };
26743
27295
  }
26744
27296
  var systemBlockDefinitionsRaw = [
26745
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27297
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26746
27298
  flow: heroFlow,
26747
27299
  layoutProfiles: [
26748
27300
  layoutProfile({
@@ -26846,7 +27398,12 @@ var systemBlockDefinitionsRaw = [
26846
27398
  flow: siteChromeFlow,
26847
27399
  layoutProfiles: []
26848
27400
  })),
26849
- withDesignCapability("block.testimonials", testimonialsBlockDefinition, panelAndItemsCapable(), defineBlockDesignMetadata({
27401
+ withDesignCapability("block.testimonials", testimonialsBlockDefinition, declareBlockDesignCapability({
27402
+ sectionSurfaces: "supported",
27403
+ contentFrames: ["plain", "panel"],
27404
+ itemSurfaces: "supported",
27405
+ testimonialCardTreatments: ["default", "accent-quote"]
27406
+ }), defineBlockDesignMetadata({
26850
27407
  flow: proofFlow,
26851
27408
  layoutProfiles: [
26852
27409
  layoutProfile({
@@ -27088,8 +27645,15 @@ function parseOpacity(value) {
27088
27645
  }
27089
27646
  return opacity <= 1 ? opacity : opacity / 100;
27090
27647
  }
27091
- function appendOptionalClasses(baseClassName, optionalClassName) {
27092
- return optionalClassName ? `${baseClassName} ${optionalClassName}` : baseClassName;
27648
+ function backgroundMotionClassNames(input) {
27649
+ return input.motion === "fixed-frame" ? "rb-bg-motion-fixed-frame" : "";
27650
+ }
27651
+ function appendBackgroundMediaClasses(baseClassName, input) {
27652
+ return [
27653
+ baseClassName,
27654
+ backgroundMotionClassNames(input),
27655
+ backgroundVideoMobileClassNames(input)
27656
+ ].filter(Boolean).join(" ");
27093
27657
  }
27094
27658
  var resolveImageStyleTransform = {
27095
27659
  id: "background.resolveImageStyle",
@@ -27166,9 +27730,9 @@ var resolveImageClassNameTransform = {
27166
27730
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
27167
27731
  const position = isString(input.position) ? input.position.trim() : null;
27168
27732
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
27169
- return appendOptionalClasses(
27733
+ return appendBackgroundMediaClasses(
27170
27734
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
27171
- backgroundVideoMobileClassNames(input)
27735
+ input
27172
27736
  );
27173
27737
  }
27174
27738
  let needsAnchoring = false;
@@ -27181,18 +27745,18 @@ var resolveImageClassNameTransform = {
27181
27745
  }
27182
27746
  }
27183
27747
  if (!needsAnchoring) {
27184
- return appendOptionalClasses(
27748
+ return appendBackgroundMediaClasses(
27185
27749
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
27186
- backgroundVideoMobileClassNames(input)
27750
+ input
27187
27751
  );
27188
27752
  }
27189
27753
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
27190
27754
  const isCustom = position && !isPreset;
27191
27755
  if (isCustom) {
27192
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27756
+ return appendBackgroundMediaClasses(baseClass, input);
27193
27757
  }
27194
27758
  const anchorClasses = getAnchorClasses(position);
27195
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27759
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
27196
27760
  }
27197
27761
  };
27198
27762
  var resolveOverlayStyleTransform = {