@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
@@ -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",
@@ -2669,6 +2678,14 @@ var ENDPOINT_DEFINITIONS = {
2669
2678
  auth: "user",
2670
2679
  responseKind: "json"
2671
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
+ },
2672
2689
  getSeoQueries: {
2673
2690
  path: "/sites/{siteId}/seo/queries",
2674
2691
  method: "GET",
@@ -2677,6 +2694,14 @@ var ENDPOINT_DEFINITIONS = {
2677
2694
  auth: "user",
2678
2695
  responseKind: "json"
2679
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
+ },
2680
2705
  getPerformanceOverview: {
2681
2706
  path: "/sites/{siteId}/performance/overview",
2682
2707
  method: "GET",
@@ -2725,7 +2750,12 @@ var ENDPOINT_DEFINITIONS = {
2725
2750
  path: "/media/{assetId}/canonical-crop",
2726
2751
  method: "POST",
2727
2752
  tags: ["media", "media-{assetId}"],
2728
- 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
+ ],
2729
2759
  auth: "user",
2730
2760
  responseKind: "json"
2731
2761
  },
@@ -3057,7 +3087,7 @@ var ENDPOINT_DEFINITIONS = {
3057
3087
  method: "GET",
3058
3088
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3059
3089
  auth: "user",
3060
- responseKind: "text"
3090
+ responseKind: "blob"
3061
3091
  },
3062
3092
  // Public submit
3063
3093
  submitForm: {
@@ -3940,6 +3970,14 @@ var ENDPOINT_DEFINITIONS = {
3940
3970
  auth: "user",
3941
3971
  responseKind: "json"
3942
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
+ },
3943
3981
  listEventSeriesWaitlist: {
3944
3982
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3945
3983
  method: "GET",
@@ -4503,6 +4541,14 @@ var ENDPOINT_DEFINITIONS = {
4503
4541
  auth: "user",
4504
4542
  responseKind: "json"
4505
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
+ },
4506
4552
  createBookingCustomer: {
4507
4553
  path: "/sites/{siteId}/bookings/customers",
4508
4554
  method: "POST",
@@ -4530,6 +4576,21 @@ var ENDPOINT_DEFINITIONS = {
4530
4576
  "server:internal_error"
4531
4577
  ]
4532
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
+ },
4533
4594
  listCustomerPasses: {
4534
4595
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4535
4596
  method: "GET",
@@ -4664,13 +4725,46 @@ var ENDPOINT_DEFINITIONS = {
4664
4725
  auth: "user",
4665
4726
  responseKind: "json"
4666
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
+ },
4667
4752
  listBookingActivity: {
4668
4753
  path: "/sites/{siteId}/bookings/activity",
4669
4754
  method: "GET",
4670
4755
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4756
+ errors: [],
4671
4757
  auth: "user",
4672
4758
  responseKind: "json"
4673
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
+ },
4674
4768
  // Site logs
4675
4769
  listSiteActivityLogs: {
4676
4770
  path: "/sites/{siteId}/logs/activity",
@@ -4822,13 +4916,6 @@ var ENDPOINT_DEFINITIONS = {
4822
4916
  auth: "user",
4823
4917
  responseKind: "blob"
4824
4918
  },
4825
- exportSeoCsv: {
4826
- path: "/sites/{siteId}/seo/export",
4827
- method: "GET",
4828
- tags: ["site-{siteId}", "seo"],
4829
- auth: "user",
4830
- responseKind: "blob"
4831
- },
4832
4919
  // Admin site cost (for admin panel)
4833
4920
  adminSiteCost: {
4834
4921
  path: "/admin/sites/{siteId}/cost",
@@ -5829,68 +5916,6 @@ function toLocationCoordinates(value) {
5829
5916
  };
5830
5917
  }
5831
5918
 
5832
- // ../core/src/participant-identity.ts
5833
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD = {
5834
- participant_id: {
5835
- field: "participant_id",
5836
- role: "canonical_link",
5837
- canonicalSource: "booking_participants.id",
5838
- contractAction: "tighten_in_839",
5839
- notes: "Canonical person-subject link for a participation. #839 should enforce this once preflight is clean."
5840
- },
5841
- display_name: {
5842
- field: "display_name",
5843
- role: "contextual_snapshot",
5844
- canonicalSource: "booking_participants.display_name for live identity",
5845
- contractAction: "retain_as_snapshot",
5846
- notes: "Participation-time display context. Readers must not treat it as mutable live participant identity."
5847
- },
5848
- email: {
5849
- field: "email",
5850
- role: "contextual_snapshot",
5851
- canonicalSource: "booking_participants.email_normalized for live email identity",
5852
- contractAction: "retain_as_snapshot",
5853
- notes: "Participation-time contact snapshot used for notifications/context. Live identity belongs to the participant row."
5854
- },
5855
- email_normalized: {
5856
- field: "email_normalized",
5857
- role: "contextual_snapshot",
5858
- canonicalSource: "booking_participants.email_normalized for live email identity",
5859
- contractAction: "retain_as_snapshot",
5860
- notes: "Normalized snapshot/dedupe helper for the participation slot, not live person authority."
5861
- },
5862
- phone: {
5863
- field: "phone",
5864
- role: "contextual_snapshot",
5865
- canonicalSource: "booking_participants.phone for live phone identity",
5866
- contractAction: "retain_as_snapshot",
5867
- notes: "Participation-time phone context. Live identity belongs to the participant row."
5868
- },
5869
- identity_state: {
5870
- field: "identity_state",
5871
- role: "materialization_state",
5872
- canonicalSource: "booking_participants.identity_state for subject state",
5873
- contractAction: "review_for_later_contract_cleanup",
5874
- notes: "Slot materialization state: booker_supplied, contactable, portal_claimed, or staff_verified."
5875
- },
5876
- event_attendee_guest_id: {
5877
- field: "event_attendee_guest_id",
5878
- role: "compatibility_projection",
5879
- canonicalSource: "canonical participant slot plus #838 event guest compatibility projection",
5880
- contractAction: "retain_as_projection",
5881
- notes: "Compatibility FK for event guest read models. It is not person identity authority."
5882
- }
5883
- };
5884
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS = [
5885
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.participant_id,
5886
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.display_name,
5887
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email,
5888
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email_normalized,
5889
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.phone,
5890
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.identity_state,
5891
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.event_attendee_guest_id
5892
- ];
5893
-
5894
5919
  // ../media-core/src/transformRect.ts
5895
5920
  function isValidTransformRectStructure(rect) {
5896
5921
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7127,6 +7152,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
7127
7152
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
7128
7153
  "missing_amount",
7129
7154
  "amount_exceeds_remaining",
7155
+ "credit_refunds_disabled",
7156
+ "missing_credit_customer",
7130
7157
  "deposit_refund_override_required",
7131
7158
  "refund_revoke_requires_full_line_refund",
7132
7159
  "unified_order_link_required"
@@ -7791,12 +7818,29 @@ function defineFrameCapability(capability) {
7791
7818
  function defineBlockDesignCapability(capability) {
7792
7819
  return {
7793
7820
  ...capability,
7794
- 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"]
7795
7826
  };
7796
7827
  }
7797
7828
 
7798
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
+ }
7799
7842
  function defineBlockAppearancePreset(preset2) {
7843
+ assertValidOptionGroups(preset2);
7800
7844
  return preset2;
7801
7845
  }
7802
7846
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7809,13 +7853,122 @@ var appearancePresets = [
7809
7853
  target: "hero",
7810
7854
  label: "Immersive image hero",
7811
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
+ ],
7812
7911
  design: {
7813
7912
  sectionSurface: "hero-image",
7814
7913
  contentFrame: plainFrame,
7815
7914
  itemSurface: "none",
7816
7915
  transitionAfter: "soft-fade-short",
7817
7916
  emphasis: "high",
7818
- heroLegibility: "scrim-gradient"
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
+ ],
7963
+ design: {
7964
+ sectionSurface: "hero-image",
7965
+ contentFrame: plainFrame,
7966
+ itemSurface: "none",
7967
+ transitionAfter: "soft-fade-short",
7968
+ emphasis: "high",
7969
+ sectionHeight: "immersive",
7970
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7971
+ imageSurfaceMotion: "fixed-frame"
7819
7972
  }
7820
7973
  }),
7821
7974
  defineBlockAppearancePreset({
@@ -7832,17 +7985,26 @@ var appearancePresets = [
7832
7985
  emphasis: "high"
7833
7986
  }
7834
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
+ }),
7835
8002
  defineBlockAppearancePreset({
7836
8003
  kind: "block-design",
7837
8004
  id: "offerings-calm-list",
7838
8005
  target: "offerings",
7839
8006
  label: "Calm offerings list",
7840
- blockKinds: [
7841
- "block.event-listing",
7842
- "block.event-calendar",
7843
- "block.event-spotlight",
7844
- "block.product-list"
7845
- ],
8007
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7846
8008
  design: {
7847
8009
  sectionSurface: "muted-band",
7848
8010
  contentFrame: plainFrame,
@@ -7921,6 +8083,35 @@ var appearancePresets = [
7921
8083
  emphasis: "high"
7922
8084
  }
7923
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
+ }),
7924
8115
  defineBlockAppearancePreset({
7925
8116
  kind: "block-design",
7926
8117
  id: "faq-contained-help",
@@ -7949,6 +8140,20 @@ var appearancePresets = [
7949
8140
  emphasis: "medium"
7950
8141
  }
7951
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
+ }),
7952
8157
  defineBlockAppearancePreset({
7953
8158
  kind: "block-design",
7954
8159
  id: "cta-accent-band",
@@ -7968,9 +8173,33 @@ var appearancePresets = [
7968
8173
  id: "header-clean-base",
7969
8174
  target: "site-header",
7970
8175
  label: "Clean base header",
7971
- chrome: {
7972
- surface: "base",
7973
- 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"
7974
8203
  }
7975
8204
  }),
7976
8205
  defineSiteChromeAppearancePreset({
@@ -7978,10 +8207,31 @@ var appearancePresets = [
7978
8207
  id: "footer-muted-grounding",
7979
8208
  target: "site-footer",
7980
8209
  label: "Muted grounding footer",
7981
- chrome: {
8210
+ footer: {
8211
+ kind: "grounding",
7982
8212
  surface: "muted-band",
7983
8213
  emphasis: "low"
7984
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
+ }
7985
8235
  })
7986
8236
  ];
7987
8237
 
@@ -8641,6 +8891,111 @@ var pebble = defineButtonPersonality({
8641
8891
  }
8642
8892
  });
8643
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
+
8644
8999
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8645
9000
  var softPill = defineButtonPersonality({
8646
9001
  id: "soft-pill",
@@ -8721,7 +9076,8 @@ var buttonPersonalities = [
8721
9076
  editorialLink,
8722
9077
  pebble,
8723
9078
  inkStamp,
8724
- brushedWash
9079
+ brushedWash,
9080
+ showtimePill
8725
9081
  ];
8726
9082
  var personalitiesById = new Map(
8727
9083
  buttonPersonalities.map((p) => [p.id, p])
@@ -9252,14 +9608,7 @@ var proseLinkStyleSchema = z21.object({
9252
9608
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9253
9609
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9254
9610
  });
9255
- var semanticSpacingSchema = z21.enum([
9256
- "none",
9257
- "compact",
9258
- "cozy",
9259
- "medium",
9260
- "comfortable",
9261
- "spacious"
9262
- ]);
9611
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9263
9612
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9264
9613
  var boxBackgroundOverlaySchema = z21.object({
9265
9614
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9276,6 +9625,7 @@ var boxBackgroundSchema = z21.object({
9276
9625
  scale: z21.string().nullable().optional(),
9277
9626
  position: z21.string().nullable().optional(),
9278
9627
  opacity: z21.number().min(0).max(1).nullable().optional(),
9628
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9279
9629
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9280
9630
  textColor: z21.string().nullable().optional(),
9281
9631
  headingColor: z21.string().nullable().optional()
@@ -9283,7 +9633,7 @@ var boxBackgroundSchema = z21.object({
9283
9633
  var sectionStylesOverrideSchema = z21.object({
9284
9634
  background: boxBackgroundSchema.nullable().optional(),
9285
9635
  spacing: semanticSpacingSchema.nullable().optional(),
9286
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9636
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9287
9637
  });
9288
9638
  var containerStylesOverrideSchema = z21.object({
9289
9639
  background: boxBackgroundSchema.nullable().optional(),
@@ -9302,7 +9652,8 @@ var cardStylesOverrideSchema = z21.object({
9302
9652
  border: cardBorderOverrideSchema.nullable().optional(),
9303
9653
  spacing: semanticSpacingSchema.nullable().optional(),
9304
9654
  raised: z21.boolean().nullable().optional(),
9305
- rounded: boxRoundedSchema.nullable().optional()
9655
+ rounded: boxRoundedSchema.nullable().optional(),
9656
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9306
9657
  });
9307
9658
  var blockStyleOverridesSchema = z21.object({
9308
9659
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9377,15 +9728,7 @@ var inputStyle = z21.object({
9377
9728
  });
9378
9729
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9379
9730
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9380
- var headerNavStyle = z21.enum([
9381
- "minimal",
9382
- "underline",
9383
- "underline-grow",
9384
- "capsule",
9385
- "scale",
9386
- "frosted",
9387
- "solid"
9388
- ]);
9731
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9389
9732
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9390
9733
  var headerMaxWidth = z21.enum(["container", "full"]);
9391
9734
  var headerContainerSchema = z21.object({
@@ -9439,6 +9782,7 @@ var dropdownStyleSchema = z21.object({
9439
9782
  // optional = no override (browser default)
9440
9783
  }).optional();
9441
9784
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9785
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9442
9786
  var navContainerSchema = z21.object({
9443
9787
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9444
9788
  tint: z21.string().nullable().optional(),
@@ -9457,7 +9801,10 @@ var headerSchema = z21.object({
9457
9801
  shrinkOnScroll: z21.boolean(),
9458
9802
  maxWidth: headerMaxWidth,
9459
9803
  logoOverride: mediaSchema.nullable().optional(),
9460
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9804
+ background: headerBackgroundSchema.default({
9805
+ type: "color",
9806
+ color: "surface"
9807
+ }),
9461
9808
  textColor: z21.string().nullable().optional(),
9462
9809
  // Site title and general header text
9463
9810
  navStyle: headerNavStyle,
@@ -9477,6 +9824,13 @@ var headerSchema = z21.object({
9477
9824
  navLinkStyle: navLinkStyleSchema.optional(),
9478
9825
  // CTA button spacing (desktop left margin)
9479
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(),
9480
9834
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9481
9835
  dropdownStyle: dropdownStyleSchema
9482
9836
  });
@@ -9533,7 +9887,10 @@ var footerSchema = z21.object({
9533
9887
  variant: footerVariant,
9534
9888
  maxWidth: footerMaxWidth,
9535
9889
  showLogoText: z21.boolean().optional(),
9536
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9890
+ background: headerBackgroundSchema.default({
9891
+ type: "color",
9892
+ color: "surface"
9893
+ }),
9537
9894
  // Footer nav styling (independent from header)
9538
9895
  navStyle: headerNavStyle.default("minimal"),
9539
9896
  navColor: z21.string().nullable().optional(),
@@ -9555,17 +9912,7 @@ var layoutSchema = z21.object({
9555
9912
  desktop: containerPaddingPresetSchema.optional()
9556
9913
  }).optional()
9557
9914
  }).optional();
9558
- var heroTypographySizeSchema = z21.enum([
9559
- "sm",
9560
- "base",
9561
- "lg",
9562
- "xl",
9563
- "2xl",
9564
- "3xl",
9565
- "4xl",
9566
- "5xl",
9567
- "6xl"
9568
- ]);
9915
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9569
9916
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9570
9917
  var heroResponsiveTypographySchema = z21.object({
9571
9918
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9590,6 +9937,13 @@ var heroTypographySchema = z21.object({
9590
9937
  var heroSchema = z21.object({
9591
9938
  typography: heroTypographySchema.optional()
9592
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();
9593
9947
  var gradientsSchema = z21.object({
9594
9948
  button: z21.string().min(1).nullable().optional(),
9595
9949
  hero: z21.string().min(1).nullable().optional(),
@@ -9611,6 +9965,7 @@ var themeSchema = z21.object({
9611
9965
  gradients: gradientsSchema.optional(),
9612
9966
  layout: layoutSchema,
9613
9967
  hero: heroSchema,
9968
+ bodyText: bodyTextSchema,
9614
9969
  header: headerSchema,
9615
9970
  footer: footerSchema,
9616
9971
  buttons: buttonSystemSchema.optional(),
@@ -9634,10 +9989,7 @@ var themeSchema = z21.object({
9634
9989
  ).optional(),
9635
9990
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9636
9991
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9637
- blockOverrides: z21.record(
9638
- z21.string(),
9639
- blockThemeOverrideSchema
9640
- ).optional(),
9992
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9641
9993
  // Structured custom CSS rules
9642
9994
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9643
9995
  customCssRules: customCssRulesSchema,
@@ -9808,6 +10160,28 @@ var brandLedJewel = definePaletteVariant({
9808
10160
  { name: "border", hex: "#a8a29e" }
9809
10161
  ]
9810
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
+ });
9811
10185
 
9812
10186
  // ../theme-core/src/palette/variants/high-contrast.ts
9813
10187
  var highContrastInk = definePaletteVariant({
@@ -10019,6 +10393,7 @@ var paletteVariants = [
10019
10393
  brandLedCool,
10020
10394
  brandLedWarm,
10021
10395
  brandLedJewel,
10396
+ brandLedBurgundyGold,
10022
10397
  // Warm-neutral family
10023
10398
  warmNeutralClay,
10024
10399
  warmNeutralCream,
@@ -10094,7 +10469,8 @@ var curatedSiteStyleIdValues = [
10094
10469
  "site-style:quiet-luxury",
10095
10470
  "site-style:practical-services",
10096
10471
  "site-style:modern-wellness",
10097
- "site-style:bold-launch"
10472
+ "site-style:bold-launch",
10473
+ "site-style:south-west-twerk-school"
10098
10474
  ];
10099
10475
  var quietBudget = {
10100
10476
  accentDensity: "low",
@@ -10149,6 +10525,8 @@ function defineCuratedSiteStyle(input) {
10149
10525
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
10150
10526
  supportedTransitions: generatedDesignOptionCatalog.transitions
10151
10527
  },
10528
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10529
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10152
10530
  buttonPersonalityChoices: input.buttonPersonalityChoices,
10153
10531
  paletteVariantChoices: input.paletteVariantChoices
10154
10532
  };
@@ -10395,6 +10773,101 @@ var curatedSiteStyles = [
10395
10773
  paletteChoice("brand-led-jewel"),
10396
10774
  paletteChoice("brand-led-warm")
10397
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
+ ]
10398
10871
  })
10399
10872
  ];
10400
10873
  var curatedSiteStylesById = new Map(
@@ -10439,6 +10912,40 @@ var heroLegibilityStrategySchema = z23.enum([
10439
10912
  "scrim-gradient",
10440
10913
  "solid-panel"
10441
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"]);
10442
10949
  function uniqueNonEmpty(values) {
10443
10950
  const uniqueValues = [...new Set(values)];
10444
10951
  const firstValue = uniqueValues[0];
@@ -10477,7 +10984,11 @@ var blockDesignPlanSchema = z23.object({
10477
10984
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10478
10985
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10479
10986
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10480
- heroLegibility: heroLegibilityStrategySchema.optional()
10987
+ sectionHeight: sectionHeightIntentSchema.optional(),
10988
+ heroLegibility: heroLegibilityStrategySchema.optional(),
10989
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
10990
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
10991
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10481
10992
  }).strict();
10482
10993
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10483
10994
  z23.object({
@@ -11903,6 +12414,7 @@ var SEMANTIC_SPACING_VALUES = [
11903
12414
  ];
11904
12415
  var SECTION_MIN_HEIGHT_VALUES = [
11905
12416
  "none",
12417
+ "banner",
11906
12418
  "hero",
11907
12419
  "immersive"
11908
12420
  ];
@@ -11930,6 +12442,7 @@ var CONTAINER_SPACING_MAP = {
11930
12442
  };
11931
12443
  var SECTION_MIN_HEIGHT_MAP = {
11932
12444
  none: "",
12445
+ banner: "rb-section-min-h-banner",
11933
12446
  hero: "rb-section-min-h-hero",
11934
12447
  immersive: "rb-section-min-h-immersive"
11935
12448
  };
@@ -12709,6 +13222,9 @@ var boxStylesCompositeTransform = {
12709
13222
  classes.push(roundedResult);
12710
13223
  }
12711
13224
  }
13225
+ if (input.treatment === "accent-quote") {
13226
+ classes.push("rb-card-treatment-accent-quote");
13227
+ }
12712
13228
  return classes.join(" ").trim() || "";
12713
13229
  }
12714
13230
  };
@@ -12806,7 +13322,7 @@ var sectionClassNameTransform = {
12806
13322
  minHeight = input.minHeight;
12807
13323
  } else if (process.env.NODE_ENV !== "production") {
12808
13324
  console.warn(
12809
- `[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.`
12810
13326
  );
12811
13327
  }
12812
13328
  }
@@ -13129,23 +13645,6 @@ function styledCard(children, opts, ...mods) {
13129
13645
  );
13130
13646
  }
13131
13647
 
13132
- // ../blocks/src/system/node/fragments/typography.ts
13133
- function mergeClassName(base, extra) {
13134
- return [base, extra ?? ""].filter(Boolean).join(" ");
13135
- }
13136
- function captionText(opts, ...mods) {
13137
- const {
13138
- as: asProp,
13139
- className: classNameProp,
13140
- color,
13141
- ...rest
13142
- } = opts ?? {};
13143
- const as = asProp ?? "p";
13144
- const className = mergeClassName("rb-caption", classNameProp);
13145
- const style = textColorStyle(color ?? "mutedText");
13146
- return text({ ...rest, as, className, style }, ...mods);
13147
- }
13148
-
13149
13648
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
13150
13649
  function joinClasses(...parts) {
13151
13650
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -14050,18 +14549,17 @@ function buildAttributionNodes() {
14050
14549
  const name = text(
14051
14550
  {
14052
14551
  as: "strong",
14053
- className: "rb-block",
14054
- style: textColorStyle("text")
14552
+ className: "rb-block"
14055
14553
  },
14056
14554
  bind("testimonial.content.name", { fallback: "Anonymous" })
14057
14555
  );
14058
- const jobTitle = captionText(
14059
- null,
14556
+ const jobTitle = text(
14557
+ { as: "p", className: "rb-caption" },
14060
14558
  when("testimonial.content.jobTitle"),
14061
14559
  bind("testimonial.content.jobTitle")
14062
14560
  );
14063
- const company = captionText(
14064
- null,
14561
+ const company = text(
14562
+ { as: "p", className: "rb-caption" },
14065
14563
  when("testimonial.content.company"),
14066
14564
  bind("testimonial.content.company")
14067
14565
  );
@@ -14095,8 +14593,7 @@ function buildTestimonialCard(...mods) {
14095
14593
  );
14096
14594
  const body = richText(
14097
14595
  {
14098
- className: "rb-prose rb-max-w-none",
14099
- style: textColorStyle("text")
14596
+ className: "rb-prose rb-max-w-none"
14100
14597
  },
14101
14598
  bind("testimonial.content.body"),
14102
14599
  when("testimonial.content.body")
@@ -15726,6 +16223,7 @@ function heroContentCard(children, gap) {
15726
16223
  return styledContainer({
15727
16224
  bindFrom: "_contentCardStyles",
15728
16225
  constrainWidth: false,
16226
+ baseClassName: "rb-relative rb-isolate",
15729
16227
  rootType: "stack",
15730
16228
  rootProps: {
15731
16229
  gap
@@ -15756,6 +16254,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15756
16254
  function heroContainerStack(children, gap) {
15757
16255
  return styledContainer({
15758
16256
  rootType: "stack",
16257
+ baseClassName: "rb-relative rb-isolate",
15759
16258
  rootProps: {
15760
16259
  gap: "none",
15761
16260
  justify: {
@@ -16974,7 +17473,7 @@ function resolveHeroVerticalAlignment(content) {
16974
17473
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
16975
17474
  const sectionStyles = asPartialObject(content._sectionStyles);
16976
17475
  const minHeight = sectionStyles?.minHeight;
16977
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17476
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
16978
17477
  const variant = resolveHeroVariant(content);
16979
17478
  if (variant === "split" || variant === "splitReverse") return "center";
16980
17479
  return "top";
@@ -17732,6 +18231,26 @@ var footerSplitNavSingleClassTransform = {
17732
18231
  ]);
17733
18232
  }
17734
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
+ };
17735
18254
  var footerLogoClassSchema = z35.object({
17736
18255
  base: z35.string().optional()
17737
18256
  });
@@ -17742,14 +18261,11 @@ var footerLogoClassTransform = {
17742
18261
  schema: footerLogoClassSchema,
17743
18262
  run: (value, options) => {
17744
18263
  const logo = asPartialObject(value);
17745
- const placement = logo?.placement ?? "right";
17746
18264
  const align = logo?.align ?? "end";
17747
18265
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17748
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17749
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";
17750
18267
  return joinClasses4([
17751
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",
17752
- orderClass,
17753
18269
  selfAlignClass,
17754
18270
  hiddenClass
17755
18271
  ]);
@@ -17804,6 +18320,7 @@ var layoutTransforms = [
17804
18320
  footerBottomBarContainerClassTransform,
17805
18321
  footerBottomBarStyleTransform,
17806
18322
  footerSplitNavSingleClassTransform,
18323
+ footerSplitMainClassTransform,
17807
18324
  footerLogoClassTransform,
17808
18325
  footerLogoMediaClassTransform,
17809
18326
  footerLogoTextVisibleTransform
@@ -18077,7 +18594,7 @@ var createNavRow = (className, align = "end") => navRow({
18077
18594
  var headerCta = ctaButton({
18078
18595
  basePath: "menu.ctaItem",
18079
18596
  whenPath: "menu.ctaItem.label",
18080
- variantPath: "menu.ctaItem.variant",
18597
+ variantPath: "$root.theme.header.ctaVariant",
18081
18598
  linkPath: "menu.ctaItem.link",
18082
18599
  sizeFallback: "sm",
18083
18600
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -18085,7 +18602,7 @@ var headerCta = ctaButton({
18085
18602
  var mobileCta = ctaButton({
18086
18603
  basePath: "menu.ctaItem",
18087
18604
  whenPath: "menu.ctaItem.label",
18088
- variantPath: "menu.ctaItem.variant",
18605
+ variantPath: "$root.theme.header.ctaVariant",
18089
18606
  linkPath: "menu.ctaItem.link",
18090
18607
  sizeFallback: "md",
18091
18608
  className: "nav-mobile-cta rb-w-full"
@@ -18546,7 +19063,13 @@ var splitFooterLayout = stack(
18546
19063
  [
18547
19064
  inline(
18548
19065
  {
18549
- 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
+ }
18550
19073
  },
18551
19074
  [
18552
19075
  stack(
@@ -20634,7 +21157,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20634
21157
  run: z47.object({
20635
21158
  courseId: z47.string(),
20636
21159
  seriesId: z47.string(),
20637
- runSlug: z47.string()
21160
+ runSlug: z47.string(),
21161
+ runName: z47.string().nullable()
20638
21162
  })
20639
21163
  }),
20640
21164
  z47.object({
@@ -26581,6 +27105,34 @@ function panelCapable() {
26581
27105
  itemSurfaces: "unsupported"
26582
27106
  });
26583
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
+ }
26584
27136
  function plainItemsCapable() {
26585
27137
  return declareBlockDesignCapability({
26586
27138
  sectionSurfaces: "supported",
@@ -26697,7 +27249,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26697
27249
  };
26698
27250
  }
26699
27251
  var systemBlockDefinitionsRaw = [
26700
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27252
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26701
27253
  flow: heroFlow,
26702
27254
  layoutProfiles: [
26703
27255
  layoutProfile({
@@ -26801,7 +27353,12 @@ var systemBlockDefinitionsRaw = [
26801
27353
  flow: siteChromeFlow,
26802
27354
  layoutProfiles: []
26803
27355
  })),
26804
- 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({
26805
27362
  flow: proofFlow,
26806
27363
  layoutProfiles: [
26807
27364
  layoutProfile({
@@ -27043,8 +27600,15 @@ function parseOpacity(value) {
27043
27600
  }
27044
27601
  return opacity <= 1 ? opacity : opacity / 100;
27045
27602
  }
27046
- function appendOptionalClasses(baseClassName, optionalClassName) {
27047
- 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(" ");
27048
27612
  }
27049
27613
  var resolveImageStyleTransform = {
27050
27614
  id: "background.resolveImageStyle",
@@ -27121,9 +27685,9 @@ var resolveImageClassNameTransform = {
27121
27685
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
27122
27686
  const position = isString(input.position) ? input.position.trim() : null;
27123
27687
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
27124
- return appendOptionalClasses(
27688
+ return appendBackgroundMediaClasses(
27125
27689
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
27126
- backgroundVideoMobileClassNames(input)
27690
+ input
27127
27691
  );
27128
27692
  }
27129
27693
  let needsAnchoring = false;
@@ -27136,18 +27700,18 @@ var resolveImageClassNameTransform = {
27136
27700
  }
27137
27701
  }
27138
27702
  if (!needsAnchoring) {
27139
- return appendOptionalClasses(
27703
+ return appendBackgroundMediaClasses(
27140
27704
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
27141
- backgroundVideoMobileClassNames(input)
27705
+ input
27142
27706
  );
27143
27707
  }
27144
27708
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
27145
27709
  const isCustom = position && !isPreset;
27146
27710
  if (isCustom) {
27147
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27711
+ return appendBackgroundMediaClasses(baseClass, input);
27148
27712
  }
27149
27713
  const anchorClasses = getAnchorClasses(position);
27150
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27714
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
27151
27715
  }
27152
27716
  };
27153
27717
  var resolveOverlayStyleTransform = {