@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
@@ -595,7 +595,7 @@ var ENDPOINT_DEFINITIONS = {
595
595
  method: "GET",
596
596
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
597
597
  auth: "user",
598
- responseKind: "text"
598
+ responseKind: "blob"
599
599
  },
600
600
  getNewsletterSubscriber: {
601
601
  path: "/sites/{siteId}/newsletter/subscribers/{subscriberId}",
@@ -926,12 +926,7 @@ var ENDPOINT_DEFINITIONS = {
926
926
  ],
927
927
  auth: "user",
928
928
  responseKind: "json",
929
- errors: [
930
- "validation:invalid_input",
931
- "resource:not_found",
932
- "resource:conflict",
933
- "server:internal_error"
934
- ]
929
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
935
930
  },
936
931
  unpublishTeamMemberProfile: {
937
932
  path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
@@ -1184,6 +1179,13 @@ var ENDPOINT_DEFINITIONS = {
1184
1179
  auth: "user",
1185
1180
  responseKind: "json"
1186
1181
  },
1182
+ exportBookingAppointmentsCsv: {
1183
+ path: "/sites/{siteId}/bookings/appointments/export.csv",
1184
+ method: "GET",
1185
+ auth: "user",
1186
+ errors: [],
1187
+ responseKind: "blob"
1188
+ },
1187
1189
  createAppointment: {
1188
1190
  path: "/sites/{siteId}/bookings/appointments",
1189
1191
  method: "POST",
@@ -1311,6 +1313,13 @@ var ENDPOINT_DEFINITIONS = {
1311
1313
  auth: "user",
1312
1314
  responseKind: "json"
1313
1315
  },
1316
+ exportCourseEnrollmentsCsv: {
1317
+ path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
1318
+ method: "GET",
1319
+ auth: "user",
1320
+ errors: [],
1321
+ responseKind: "blob"
1322
+ },
1314
1323
  listCourseWaitlist: {
1315
1324
  path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist",
1316
1325
  method: "GET",
@@ -2673,6 +2682,14 @@ var ENDPOINT_DEFINITIONS = {
2673
2682
  auth: "user",
2674
2683
  responseKind: "json"
2675
2684
  },
2685
+ exportSeoPagesCsv: {
2686
+ path: "/sites/{siteId}/seo/pages",
2687
+ method: "GET",
2688
+ tags: ["site-{siteId}", "seo-pages-{siteId}"],
2689
+ auth: "user",
2690
+ responseKind: "blob",
2691
+ errors: []
2692
+ },
2676
2693
  getSeoQueries: {
2677
2694
  path: "/sites/{siteId}/seo/queries",
2678
2695
  method: "GET",
@@ -2681,6 +2698,14 @@ var ENDPOINT_DEFINITIONS = {
2681
2698
  auth: "user",
2682
2699
  responseKind: "json"
2683
2700
  },
2701
+ exportSeoQueriesCsv: {
2702
+ path: "/sites/{siteId}/seo/queries",
2703
+ method: "GET",
2704
+ tags: ["site-{siteId}", "seo-queries-{siteId}"],
2705
+ auth: "user",
2706
+ responseKind: "blob",
2707
+ errors: []
2708
+ },
2684
2709
  getPerformanceOverview: {
2685
2710
  path: "/sites/{siteId}/performance/overview",
2686
2711
  method: "GET",
@@ -2729,7 +2754,12 @@ var ENDPOINT_DEFINITIONS = {
2729
2754
  path: "/media/{assetId}/canonical-crop",
2730
2755
  method: "POST",
2731
2756
  tags: ["media", "media-{assetId}"],
2732
- errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"],
2757
+ errors: [
2758
+ "validation:invalid_input",
2759
+ "resource:not_found",
2760
+ "resource:conflict",
2761
+ "server:internal_error"
2762
+ ],
2733
2763
  auth: "user",
2734
2764
  responseKind: "json"
2735
2765
  },
@@ -3061,7 +3091,7 @@ var ENDPOINT_DEFINITIONS = {
3061
3091
  method: "GET",
3062
3092
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3063
3093
  auth: "user",
3064
- responseKind: "text"
3094
+ responseKind: "blob"
3065
3095
  },
3066
3096
  // Public submit
3067
3097
  submitForm: {
@@ -3944,6 +3974,14 @@ var ENDPOINT_DEFINITIONS = {
3944
3974
  auth: "user",
3945
3975
  responseKind: "json"
3946
3976
  },
3977
+ exportEventSeriesAttendeesCsv: {
3978
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/attendees/export.csv",
3979
+ method: "GET",
3980
+ tags: ["site-{siteId}", "event-series-{seriesId}"],
3981
+ auth: "user",
3982
+ errors: [],
3983
+ responseKind: "blob"
3984
+ },
3947
3985
  listEventSeriesWaitlist: {
3948
3986
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3949
3987
  method: "GET",
@@ -4507,6 +4545,14 @@ var ENDPOINT_DEFINITIONS = {
4507
4545
  auth: "user",
4508
4546
  responseKind: "json"
4509
4547
  },
4548
+ exportBookingCustomersCsv: {
4549
+ path: "/sites/{siteId}/bookings/customers/export.csv",
4550
+ method: "GET",
4551
+ tags: ["site-{siteId}", "customers-{siteId}"],
4552
+ auth: "user",
4553
+ errors: [],
4554
+ responseKind: "blob"
4555
+ },
4510
4556
  createBookingCustomer: {
4511
4557
  path: "/sites/{siteId}/bookings/customers",
4512
4558
  method: "POST",
@@ -4534,6 +4580,21 @@ var ENDPOINT_DEFINITIONS = {
4534
4580
  "server:internal_error"
4535
4581
  ]
4536
4582
  },
4583
+ rectifyBookingParticipantIdentity: {
4584
+ path: "/sites/{siteId}/bookings/participants/{participantId}/identity",
4585
+ method: "PATCH",
4586
+ tags: ["site-{siteId}", "customers-{siteId}"],
4587
+ auth: "user",
4588
+ responseKind: "json",
4589
+ errors: [
4590
+ "validation:invalid_input",
4591
+ "auth:forbidden",
4592
+ "resource:not_found",
4593
+ "resource:already_exists",
4594
+ "resource:conflict",
4595
+ "server:internal_error"
4596
+ ]
4597
+ },
4537
4598
  listCustomerPasses: {
4538
4599
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4539
4600
  method: "GET",
@@ -4668,13 +4729,46 @@ var ENDPOINT_DEFINITIONS = {
4668
4729
  auth: "user",
4669
4730
  responseKind: "json"
4670
4731
  },
4732
+ exportMoneyPaymentsCsv: {
4733
+ path: "/sites/{siteId}/bookings/money/payments/export.csv",
4734
+ method: "GET",
4735
+ tags: ["site-{siteId}", "bookings", "money-payments-{siteId}"],
4736
+ errors: [],
4737
+ auth: "user",
4738
+ responseKind: "blob"
4739
+ },
4740
+ exportMoneyBreakdownsCsv: {
4741
+ path: "/sites/{siteId}/bookings/money/report/breakdowns/export.csv",
4742
+ method: "GET",
4743
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4744
+ errors: [],
4745
+ auth: "user",
4746
+ responseKind: "blob"
4747
+ },
4748
+ exportMoneyTimeSeriesCsv: {
4749
+ path: "/sites/{siteId}/bookings/money/report/time-series/export.csv",
4750
+ method: "GET",
4751
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4752
+ errors: [],
4753
+ auth: "user",
4754
+ responseKind: "blob"
4755
+ },
4671
4756
  listBookingActivity: {
4672
4757
  path: "/sites/{siteId}/bookings/activity",
4673
4758
  method: "GET",
4674
4759
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4760
+ errors: [],
4675
4761
  auth: "user",
4676
4762
  responseKind: "json"
4677
4763
  },
4764
+ exportBookingActivityCsv: {
4765
+ path: "/sites/{siteId}/bookings/activity/export.csv",
4766
+ method: "GET",
4767
+ tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4768
+ errors: [],
4769
+ auth: "user",
4770
+ responseKind: "blob"
4771
+ },
4678
4772
  // Site logs
4679
4773
  listSiteActivityLogs: {
4680
4774
  path: "/sites/{siteId}/logs/activity",
@@ -4826,13 +4920,6 @@ var ENDPOINT_DEFINITIONS = {
4826
4920
  auth: "user",
4827
4921
  responseKind: "blob"
4828
4922
  },
4829
- exportSeoCsv: {
4830
- path: "/sites/{siteId}/seo/export",
4831
- method: "GET",
4832
- tags: ["site-{siteId}", "seo"],
4833
- auth: "user",
4834
- responseKind: "blob"
4835
- },
4836
4923
  // Admin site cost (for admin panel)
4837
4924
  adminSiteCost: {
4838
4925
  path: "/admin/sites/{siteId}/cost",
@@ -5833,68 +5920,6 @@ function toLocationCoordinates(value) {
5833
5920
  };
5834
5921
  }
5835
5922
 
5836
- // ../core/src/participant-identity.ts
5837
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD = {
5838
- participant_id: {
5839
- field: "participant_id",
5840
- role: "canonical_link",
5841
- canonicalSource: "booking_participants.id",
5842
- contractAction: "tighten_in_839",
5843
- notes: "Canonical person-subject link for a participation. #839 should enforce this once preflight is clean."
5844
- },
5845
- display_name: {
5846
- field: "display_name",
5847
- role: "contextual_snapshot",
5848
- canonicalSource: "booking_participants.display_name for live identity",
5849
- contractAction: "retain_as_snapshot",
5850
- notes: "Participation-time display context. Readers must not treat it as mutable live participant identity."
5851
- },
5852
- email: {
5853
- field: "email",
5854
- role: "contextual_snapshot",
5855
- canonicalSource: "booking_participants.email_normalized for live email identity",
5856
- contractAction: "retain_as_snapshot",
5857
- notes: "Participation-time contact snapshot used for notifications/context. Live identity belongs to the participant row."
5858
- },
5859
- email_normalized: {
5860
- field: "email_normalized",
5861
- role: "contextual_snapshot",
5862
- canonicalSource: "booking_participants.email_normalized for live email identity",
5863
- contractAction: "retain_as_snapshot",
5864
- notes: "Normalized snapshot/dedupe helper for the participation slot, not live person authority."
5865
- },
5866
- phone: {
5867
- field: "phone",
5868
- role: "contextual_snapshot",
5869
- canonicalSource: "booking_participants.phone for live phone identity",
5870
- contractAction: "retain_as_snapshot",
5871
- notes: "Participation-time phone context. Live identity belongs to the participant row."
5872
- },
5873
- identity_state: {
5874
- field: "identity_state",
5875
- role: "materialization_state",
5876
- canonicalSource: "booking_participants.identity_state for subject state",
5877
- contractAction: "review_for_later_contract_cleanup",
5878
- notes: "Slot materialization state: booker_supplied, contactable, portal_claimed, or staff_verified."
5879
- },
5880
- event_attendee_guest_id: {
5881
- field: "event_attendee_guest_id",
5882
- role: "compatibility_projection",
5883
- canonicalSource: "canonical participant slot plus #838 event guest compatibility projection",
5884
- contractAction: "retain_as_projection",
5885
- notes: "Compatibility FK for event guest read models. It is not person identity authority."
5886
- }
5887
- };
5888
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS = [
5889
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.participant_id,
5890
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.display_name,
5891
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email,
5892
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email_normalized,
5893
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.phone,
5894
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.identity_state,
5895
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.event_attendee_guest_id
5896
- ];
5897
-
5898
5923
  // ../media-core/src/transformRect.ts
5899
5924
  function isValidTransformRectStructure(rect) {
5900
5925
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7033,6 +7058,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
7033
7058
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
7034
7059
  "missing_amount",
7035
7060
  "amount_exceeds_remaining",
7061
+ "credit_refunds_disabled",
7062
+ "missing_credit_customer",
7036
7063
  "deposit_refund_override_required",
7037
7064
  "refund_revoke_requires_full_line_refund",
7038
7065
  "unified_order_link_required"
@@ -7652,12 +7679,29 @@ function defineFrameCapability(capability) {
7652
7679
  function defineBlockDesignCapability(capability) {
7653
7680
  return {
7654
7681
  ...capability,
7655
- kind: "designed"
7682
+ kind: "designed",
7683
+ sectionHeights: capability.sectionHeights ?? ["default"],
7684
+ imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7685
+ imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7686
+ testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"]
7656
7687
  };
7657
7688
  }
7658
7689
 
7659
7690
  // ../theme-core/src/site-styles/appearancePresets.ts
7691
+ function assertValidOptionGroups(preset2) {
7692
+ preset2.optionGroups?.forEach((group) => {
7693
+ const selectedOption = group.options.find(
7694
+ (option) => option.id === group.selectedOptionId
7695
+ );
7696
+ if (!selectedOption) {
7697
+ throw new Error(
7698
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7699
+ );
7700
+ }
7701
+ });
7702
+ }
7660
7703
  function defineBlockAppearancePreset(preset2) {
7704
+ assertValidOptionGroups(preset2);
7661
7705
  return preset2;
7662
7706
  }
7663
7707
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7670,13 +7714,122 @@ var appearancePresets = [
7670
7714
  target: "hero",
7671
7715
  label: "Immersive image hero",
7672
7716
  blockKinds: ["block.hero"],
7717
+ constraints: {
7718
+ layoutFamilies: ["centered", "compact"]
7719
+ },
7720
+ design: {
7721
+ sectionSurface: "hero-image",
7722
+ contentFrame: plainFrame,
7723
+ itemSurface: "none",
7724
+ transitionAfter: "soft-fade-short",
7725
+ emphasis: "high",
7726
+ sectionHeight: "hero",
7727
+ imageSurfaceTreatment: { kind: "neutral-wash" }
7728
+ }
7729
+ }),
7730
+ defineBlockAppearancePreset({
7731
+ kind: "block-design",
7732
+ id: "hero-brand-scrim",
7733
+ target: "hero",
7734
+ label: "Brand scrim image hero",
7735
+ blockKinds: ["block.hero"],
7736
+ constraints: {
7737
+ layoutFamilies: ["centered", "compact"]
7738
+ },
7739
+ optionGroups: [
7740
+ {
7741
+ id: "image-surface-treatment",
7742
+ label: "Treatment",
7743
+ selectedOptionId: "brand-scrim-primary",
7744
+ options: [
7745
+ {
7746
+ id: "brand-scrim-primary",
7747
+ label: "Brand scrim",
7748
+ designPatch: {
7749
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7750
+ }
7751
+ },
7752
+ {
7753
+ id: "neutral-scrim",
7754
+ label: "Neutral scrim",
7755
+ designPatch: {
7756
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7757
+ }
7758
+ }
7759
+ ]
7760
+ }
7761
+ ],
7762
+ layoutPatches: [
7763
+ {
7764
+ constraints: {
7765
+ layoutVariantKeys: ["micro"]
7766
+ },
7767
+ designPatch: {
7768
+ sectionHeight: "banner"
7769
+ }
7770
+ }
7771
+ ],
7673
7772
  design: {
7674
7773
  sectionSurface: "hero-image",
7675
7774
  contentFrame: plainFrame,
7676
7775
  itemSurface: "none",
7677
7776
  transitionAfter: "soft-fade-short",
7678
7777
  emphasis: "high",
7679
- heroLegibility: "scrim-gradient"
7778
+ sectionHeight: "immersive",
7779
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7780
+ }
7781
+ }),
7782
+ defineBlockAppearancePreset({
7783
+ kind: "block-design",
7784
+ id: "hero-brand-scrim-fixed-frame",
7785
+ target: "hero",
7786
+ label: "Fixed-frame brand scrim hero",
7787
+ blockKinds: ["block.hero"],
7788
+ constraints: {
7789
+ layoutFamilies: ["centered", "compact"]
7790
+ },
7791
+ optionGroups: [
7792
+ {
7793
+ id: "image-surface-treatment",
7794
+ label: "Treatment",
7795
+ selectedOptionId: "brand-scrim-primary",
7796
+ options: [
7797
+ {
7798
+ id: "brand-scrim-primary",
7799
+ label: "Brand scrim",
7800
+ designPatch: {
7801
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7802
+ }
7803
+ },
7804
+ {
7805
+ id: "neutral-scrim",
7806
+ label: "Neutral scrim",
7807
+ designPatch: {
7808
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7809
+ }
7810
+ }
7811
+ ]
7812
+ }
7813
+ ],
7814
+ layoutPatches: [
7815
+ {
7816
+ constraints: {
7817
+ layoutVariantKeys: ["micro"]
7818
+ },
7819
+ designPatch: {
7820
+ sectionHeight: "banner"
7821
+ }
7822
+ }
7823
+ ],
7824
+ design: {
7825
+ sectionSurface: "hero-image",
7826
+ contentFrame: plainFrame,
7827
+ itemSurface: "none",
7828
+ transitionAfter: "soft-fade-short",
7829
+ emphasis: "high",
7830
+ sectionHeight: "immersive",
7831
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7832
+ imageSurfaceMotion: "fixed-frame"
7680
7833
  }
7681
7834
  }),
7682
7835
  defineBlockAppearancePreset({
@@ -7693,17 +7846,26 @@ var appearancePresets = [
7693
7846
  emphasis: "high"
7694
7847
  }
7695
7848
  }),
7849
+ defineBlockAppearancePreset({
7850
+ kind: "block-design",
7851
+ id: "body-text-editorial-intro",
7852
+ target: "body-text",
7853
+ label: "Editorial intro copy",
7854
+ blockKinds: ["block.body-text"],
7855
+ design: {
7856
+ sectionSurface: "base",
7857
+ contentFrame: plainFrame,
7858
+ itemSurface: "none",
7859
+ transitionAfter: "soft-fade-short",
7860
+ emphasis: "high"
7861
+ }
7862
+ }),
7696
7863
  defineBlockAppearancePreset({
7697
7864
  kind: "block-design",
7698
7865
  id: "offerings-calm-list",
7699
7866
  target: "offerings",
7700
7867
  label: "Calm offerings list",
7701
- blockKinds: [
7702
- "block.event-listing",
7703
- "block.event-calendar",
7704
- "block.event-spotlight",
7705
- "block.product-list"
7706
- ],
7868
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7707
7869
  design: {
7708
7870
  sectionSurface: "muted-band",
7709
7871
  contentFrame: plainFrame,
@@ -7782,6 +7944,35 @@ var appearancePresets = [
7782
7944
  emphasis: "high"
7783
7945
  }
7784
7946
  }),
7947
+ defineBlockAppearancePreset({
7948
+ kind: "block-design",
7949
+ id: "testimonials-dark-proof",
7950
+ target: "testimonials",
7951
+ label: "Dark proof panel",
7952
+ blockKinds: ["block.testimonials"],
7953
+ design: {
7954
+ sectionSurface: "accent-band",
7955
+ contentFrame: panelFrame("raised"),
7956
+ itemSurface: "raised",
7957
+ transitionAfter: "soft-fade-short",
7958
+ emphasis: "high"
7959
+ }
7960
+ }),
7961
+ defineBlockAppearancePreset({
7962
+ kind: "block-design",
7963
+ id: "testimonials-accent-quote-proof",
7964
+ target: "testimonials",
7965
+ label: "Accent quote proof",
7966
+ blockKinds: ["block.testimonials"],
7967
+ design: {
7968
+ sectionSurface: "accent-band",
7969
+ contentFrame: plainFrame,
7970
+ itemSurface: "raised",
7971
+ transitionAfter: "soft-fade-short",
7972
+ emphasis: "high",
7973
+ testimonialCardTreatment: "accent-quote"
7974
+ }
7975
+ }),
7785
7976
  defineBlockAppearancePreset({
7786
7977
  kind: "block-design",
7787
7978
  id: "faq-contained-help",
@@ -7810,6 +8001,20 @@ var appearancePresets = [
7810
8001
  emphasis: "medium"
7811
8002
  }
7812
8003
  }),
8004
+ defineBlockAppearancePreset({
8005
+ kind: "block-design",
8006
+ id: "contact-form-dark-card",
8007
+ target: "contact-form",
8008
+ label: "Dark form card",
8009
+ blockKinds: ["block.form"],
8010
+ design: {
8011
+ sectionSurface: "accent-band",
8012
+ contentFrame: panelFrame("raised"),
8013
+ itemSurface: "none",
8014
+ transitionAfter: "soft-fade-short",
8015
+ emphasis: "high"
8016
+ }
8017
+ }),
7813
8018
  defineBlockAppearancePreset({
7814
8019
  kind: "block-design",
7815
8020
  id: "cta-accent-band",
@@ -7829,9 +8034,33 @@ var appearancePresets = [
7829
8034
  id: "header-clean-base",
7830
8035
  target: "site-header",
7831
8036
  label: "Clean base header",
7832
- chrome: {
7833
- surface: "base",
7834
- emphasis: "medium"
8037
+ header: {
8038
+ surface: {
8039
+ kind: "neutral-solid",
8040
+ token: "surface",
8041
+ textColorToken: "text"
8042
+ },
8043
+ navTreatment: "minimal",
8044
+ dropdownTreatment: "surface",
8045
+ ctaTreatment: "default",
8046
+ behavior: "default"
8047
+ }
8048
+ }),
8049
+ defineSiteChromeAppearancePreset({
8050
+ kind: "site-chrome",
8051
+ id: "site-header-brand-solid-inverted-cta",
8052
+ target: "site-header",
8053
+ label: "Brand solid header with inverted CTA",
8054
+ header: {
8055
+ surface: {
8056
+ kind: "brand-solid",
8057
+ token: "primary",
8058
+ textColorToken: "primaryForeground"
8059
+ },
8060
+ navTreatment: "uppercase-underline",
8061
+ dropdownTreatment: "matched-solid",
8062
+ ctaTreatment: "inverted",
8063
+ behavior: "sticky-shrink"
7835
8064
  }
7836
8065
  }),
7837
8066
  defineSiteChromeAppearancePreset({
@@ -7839,10 +8068,31 @@ var appearancePresets = [
7839
8068
  id: "footer-muted-grounding",
7840
8069
  target: "site-footer",
7841
8070
  label: "Muted grounding footer",
7842
- chrome: {
8071
+ footer: {
8072
+ kind: "grounding",
7843
8073
  surface: "muted-band",
7844
8074
  emphasis: "low"
7845
8075
  }
8076
+ }),
8077
+ defineSiteChromeAppearancePreset({
8078
+ kind: "site-chrome",
8079
+ id: "site-footer-brand-two-band",
8080
+ target: "site-footer",
8081
+ label: "Two-band brand footer",
8082
+ footer: {
8083
+ kind: "brand-two-band",
8084
+ surface: {
8085
+ token: "primary",
8086
+ shade: "800",
8087
+ textColorToken: "primaryForeground"
8088
+ },
8089
+ bottomBand: {
8090
+ token: "primary",
8091
+ shade: "900",
8092
+ textColorToken: "primaryForeground"
8093
+ },
8094
+ emphasis: "high"
8095
+ }
7846
8096
  })
7847
8097
  ];
7848
8098
 
@@ -8502,6 +8752,111 @@ var pebble = defineButtonPersonality({
8502
8752
  }
8503
8753
  });
8504
8754
 
8755
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
8756
+ var showtimePill = defineButtonPersonality({
8757
+ id: "showtime-pill",
8758
+ name: "Showtime Pill",
8759
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
8760
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
8761
+ buttonSystem: {
8762
+ global: {
8763
+ cornerStyle: "pill",
8764
+ shadow: "low",
8765
+ textTransform: "uppercase",
8766
+ fontWeight: 700,
8767
+ borderWidth: 2,
8768
+ hoverTransform: "lift",
8769
+ hoverColor: "darken",
8770
+ typography: "body",
8771
+ paddingPreset: "spacious",
8772
+ italic: false
8773
+ },
8774
+ sizes: {
8775
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
8776
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
8777
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
8778
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
8779
+ },
8780
+ variants: [
8781
+ {
8782
+ id: "primary",
8783
+ name: "Primary",
8784
+ enabled: true,
8785
+ priority: 1,
8786
+ background: { type: "solid", colorToken: "primary" },
8787
+ textColorToken: "background",
8788
+ borderRadius: "rounded-full",
8789
+ effects: {
8790
+ hover: [{ effectId: "pop" }]
8791
+ }
8792
+ },
8793
+ {
8794
+ id: "secondary",
8795
+ name: "Secondary",
8796
+ enabled: true,
8797
+ priority: 2,
8798
+ background: { type: "transparent" },
8799
+ textColorToken: "primary",
8800
+ borderRadius: "rounded-full",
8801
+ border: { widthClass: "border-2", colorToken: "primary" },
8802
+ effects: {
8803
+ hover: [{ effectId: "pop" }]
8804
+ }
8805
+ },
8806
+ {
8807
+ id: "hero",
8808
+ name: "Hero",
8809
+ enabled: true,
8810
+ priority: 1,
8811
+ background: { type: "solid", colorToken: "secondary" },
8812
+ textColorToken: "primary",
8813
+ borderRadius: "rounded-full",
8814
+ effects: {
8815
+ hover: [{ effectId: "pop" }]
8816
+ }
8817
+ },
8818
+ {
8819
+ id: "header",
8820
+ name: "Header",
8821
+ enabled: true,
8822
+ priority: 2,
8823
+ background: { type: "solid", colorToken: "background" },
8824
+ textColorToken: "primary",
8825
+ borderRadius: "rounded-full",
8826
+ border: { widthClass: "border-2", colorToken: "primary" },
8827
+ effects: {
8828
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8829
+ }
8830
+ },
8831
+ {
8832
+ id: "outline",
8833
+ name: "Outline",
8834
+ enabled: true,
8835
+ priority: 3,
8836
+ background: { type: "transparent" },
8837
+ textColorToken: "primary",
8838
+ borderRadius: "rounded-full",
8839
+ border: { widthClass: "border-2", colorToken: "primary" },
8840
+ effects: {
8841
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8842
+ }
8843
+ },
8844
+ {
8845
+ id: "ghost",
8846
+ name: "Ghost",
8847
+ enabled: true,
8848
+ priority: 3,
8849
+ background: { type: "transparent" },
8850
+ textColorToken: "primary",
8851
+ borderRadius: "rounded-full",
8852
+ effects: {
8853
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8854
+ }
8855
+ }
8856
+ ]
8857
+ }
8858
+ });
8859
+
8505
8860
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8506
8861
  var softPill = defineButtonPersonality({
8507
8862
  id: "soft-pill",
@@ -8582,7 +8937,8 @@ var buttonPersonalities = [
8582
8937
  editorialLink,
8583
8938
  pebble,
8584
8939
  inkStamp,
8585
- brushedWash
8940
+ brushedWash,
8941
+ showtimePill
8586
8942
  ];
8587
8943
  var personalitiesById = new Map(
8588
8944
  buttonPersonalities.map((p) => [p.id, p])
@@ -9113,14 +9469,7 @@ var proseLinkStyleSchema = z21.object({
9113
9469
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9114
9470
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9115
9471
  });
9116
- var semanticSpacingSchema = z21.enum([
9117
- "none",
9118
- "compact",
9119
- "cozy",
9120
- "medium",
9121
- "comfortable",
9122
- "spacious"
9123
- ]);
9472
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9124
9473
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9125
9474
  var boxBackgroundOverlaySchema = z21.object({
9126
9475
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9137,6 +9486,7 @@ var boxBackgroundSchema = z21.object({
9137
9486
  scale: z21.string().nullable().optional(),
9138
9487
  position: z21.string().nullable().optional(),
9139
9488
  opacity: z21.number().min(0).max(1).nullable().optional(),
9489
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9140
9490
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9141
9491
  textColor: z21.string().nullable().optional(),
9142
9492
  headingColor: z21.string().nullable().optional()
@@ -9144,7 +9494,7 @@ var boxBackgroundSchema = z21.object({
9144
9494
  var sectionStylesOverrideSchema = z21.object({
9145
9495
  background: boxBackgroundSchema.nullable().optional(),
9146
9496
  spacing: semanticSpacingSchema.nullable().optional(),
9147
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9497
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9148
9498
  });
9149
9499
  var containerStylesOverrideSchema = z21.object({
9150
9500
  background: boxBackgroundSchema.nullable().optional(),
@@ -9163,7 +9513,8 @@ var cardStylesOverrideSchema = z21.object({
9163
9513
  border: cardBorderOverrideSchema.nullable().optional(),
9164
9514
  spacing: semanticSpacingSchema.nullable().optional(),
9165
9515
  raised: z21.boolean().nullable().optional(),
9166
- rounded: boxRoundedSchema.nullable().optional()
9516
+ rounded: boxRoundedSchema.nullable().optional(),
9517
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9167
9518
  });
9168
9519
  var blockStyleOverridesSchema = z21.object({
9169
9520
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9238,15 +9589,7 @@ var inputStyle = z21.object({
9238
9589
  });
9239
9590
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9240
9591
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9241
- var headerNavStyle = z21.enum([
9242
- "minimal",
9243
- "underline",
9244
- "underline-grow",
9245
- "capsule",
9246
- "scale",
9247
- "frosted",
9248
- "solid"
9249
- ]);
9592
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9250
9593
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9251
9594
  var headerMaxWidth = z21.enum(["container", "full"]);
9252
9595
  var headerContainerSchema = z21.object({
@@ -9300,6 +9643,7 @@ var dropdownStyleSchema = z21.object({
9300
9643
  // optional = no override (browser default)
9301
9644
  }).optional();
9302
9645
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9646
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9303
9647
  var navContainerSchema = z21.object({
9304
9648
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9305
9649
  tint: z21.string().nullable().optional(),
@@ -9318,7 +9662,10 @@ var headerSchema = z21.object({
9318
9662
  shrinkOnScroll: z21.boolean(),
9319
9663
  maxWidth: headerMaxWidth,
9320
9664
  logoOverride: mediaSchema.nullable().optional(),
9321
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9665
+ background: headerBackgroundSchema.default({
9666
+ type: "color",
9667
+ color: "surface"
9668
+ }),
9322
9669
  textColor: z21.string().nullable().optional(),
9323
9670
  // Site title and general header text
9324
9671
  navStyle: headerNavStyle,
@@ -9338,6 +9685,13 @@ var headerSchema = z21.object({
9338
9685
  navLinkStyle: navLinkStyleSchema.optional(),
9339
9686
  // CTA button spacing (desktop left margin)
9340
9687
  ctaGap: headerCtaGapSchema.optional(),
9688
+ // Semantic CTA treatment for header/nav CTA buttons. The Theme V2 compiler
9689
+ // materializes this to ctaVariant against the active button personality.
9690
+ ctaTreatment: headerCtaTreatmentSchema.optional(),
9691
+ // Optional theme-level CTA variant for header/nav CTA buttons.
9692
+ // Internal runtime bridge for the block renderer; prefer ctaTreatment in
9693
+ // authored Theme V2 concepts.
9694
+ ctaVariant: z21.string().min(1).optional(),
9341
9695
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9342
9696
  dropdownStyle: dropdownStyleSchema
9343
9697
  });
@@ -9394,7 +9748,10 @@ var footerSchema = z21.object({
9394
9748
  variant: footerVariant,
9395
9749
  maxWidth: footerMaxWidth,
9396
9750
  showLogoText: z21.boolean().optional(),
9397
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9751
+ background: headerBackgroundSchema.default({
9752
+ type: "color",
9753
+ color: "surface"
9754
+ }),
9398
9755
  // Footer nav styling (independent from header)
9399
9756
  navStyle: headerNavStyle.default("minimal"),
9400
9757
  navColor: z21.string().nullable().optional(),
@@ -9416,17 +9773,7 @@ var layoutSchema = z21.object({
9416
9773
  desktop: containerPaddingPresetSchema.optional()
9417
9774
  }).optional()
9418
9775
  }).optional();
9419
- var heroTypographySizeSchema = z21.enum([
9420
- "sm",
9421
- "base",
9422
- "lg",
9423
- "xl",
9424
- "2xl",
9425
- "3xl",
9426
- "4xl",
9427
- "5xl",
9428
- "6xl"
9429
- ]);
9776
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9430
9777
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9431
9778
  var heroResponsiveTypographySchema = z21.object({
9432
9779
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9451,6 +9798,13 @@ var heroTypographySchema = z21.object({
9451
9798
  var heroSchema = z21.object({
9452
9799
  typography: heroTypographySchema.optional()
9453
9800
  }).optional();
9801
+ var bodyTextIntroTypographySizeSchema = z21.enum(["default", "editorial"]);
9802
+ var bodyTextSchema = z21.object({
9803
+ intro: z21.object({
9804
+ paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
9805
+ headingSize: bodyTextIntroTypographySizeSchema.optional()
9806
+ }).optional()
9807
+ }).optional();
9454
9808
  var gradientsSchema = z21.object({
9455
9809
  button: z21.string().min(1).nullable().optional(),
9456
9810
  hero: z21.string().min(1).nullable().optional(),
@@ -9472,6 +9826,7 @@ var themeSchema = z21.object({
9472
9826
  gradients: gradientsSchema.optional(),
9473
9827
  layout: layoutSchema,
9474
9828
  hero: heroSchema,
9829
+ bodyText: bodyTextSchema,
9475
9830
  header: headerSchema,
9476
9831
  footer: footerSchema,
9477
9832
  buttons: buttonSystemSchema.optional(),
@@ -9495,10 +9850,7 @@ var themeSchema = z21.object({
9495
9850
  ).optional(),
9496
9851
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9497
9852
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9498
- blockOverrides: z21.record(
9499
- z21.string(),
9500
- blockThemeOverrideSchema
9501
- ).optional(),
9853
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9502
9854
  // Structured custom CSS rules
9503
9855
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9504
9856
  customCssRules: customCssRulesSchema,
@@ -9669,6 +10021,28 @@ var brandLedJewel = definePaletteVariant({
9669
10021
  { name: "border", hex: "#a8a29e" }
9670
10022
  ]
9671
10023
  });
10024
+ var brandLedBurgundyGold = definePaletteVariant({
10025
+ id: "brand-led-burgundy-gold",
10026
+ name: "Brand-led \u2014 Burgundy Gold",
10027
+ description: "Deep burgundy with warm gold accents and soft neutral grounds.",
10028
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
10029
+ mode: "light",
10030
+ colors: [
10031
+ { name: "primary", hex: "#7c2e38" },
10032
+ { name: "secondary", hex: "#d4af37" },
10033
+ { name: "accent", hex: "#b8e19a" },
10034
+ { name: "success", hex: "#10b981" },
10035
+ { name: "warning", hex: "#f59e0b" },
10036
+ { name: "destructive", hex: "#ef4444" },
10037
+ { name: "background", hex: "#f1dfd0" },
10038
+ { name: "surface", hex: "#f5e6db" },
10039
+ { name: "surfaceAlt", hex: "#f8ece3" },
10040
+ { name: "muted", hex: "#c9b8a8" },
10041
+ { name: "text", hex: "#400000" },
10042
+ { name: "primaryForeground", hex: "#ffffff" },
10043
+ { name: "border", hex: "#c9b8a8" }
10044
+ ]
10045
+ });
9672
10046
 
9673
10047
  // ../theme-core/src/palette/variants/high-contrast.ts
9674
10048
  var highContrastInk = definePaletteVariant({
@@ -9880,6 +10254,7 @@ var paletteVariants = [
9880
10254
  brandLedCool,
9881
10255
  brandLedWarm,
9882
10256
  brandLedJewel,
10257
+ brandLedBurgundyGold,
9883
10258
  // Warm-neutral family
9884
10259
  warmNeutralClay,
9885
10260
  warmNeutralCream,
@@ -9955,7 +10330,8 @@ var curatedSiteStyleIdValues = [
9955
10330
  "site-style:quiet-luxury",
9956
10331
  "site-style:practical-services",
9957
10332
  "site-style:modern-wellness",
9958
- "site-style:bold-launch"
10333
+ "site-style:bold-launch",
10334
+ "site-style:south-west-twerk-school"
9959
10335
  ];
9960
10336
  var quietBudget = {
9961
10337
  accentDensity: "low",
@@ -10010,6 +10386,8 @@ function defineCuratedSiteStyle(input) {
10010
10386
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
10011
10387
  supportedTransitions: generatedDesignOptionCatalog.transitions
10012
10388
  },
10389
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10390
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10013
10391
  buttonPersonalityChoices: input.buttonPersonalityChoices,
10014
10392
  paletteVariantChoices: input.paletteVariantChoices
10015
10393
  };
@@ -10256,6 +10634,101 @@ var curatedSiteStyles = [
10256
10634
  paletteChoice("brand-led-jewel"),
10257
10635
  paletteChoice("brand-led-warm")
10258
10636
  ]
10637
+ }),
10638
+ defineCuratedSiteStyle({
10639
+ id: "site-style:south-west-twerk-school",
10640
+ name: "South West Twerk School",
10641
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
10642
+ generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
10643
+ selectionKeywords: [
10644
+ "dance",
10645
+ "classes",
10646
+ "workshop",
10647
+ "school",
10648
+ "movement",
10649
+ "performance",
10650
+ "community"
10651
+ ],
10652
+ tokenRecipes: {
10653
+ palette: "brand-led",
10654
+ contrast: "maximum",
10655
+ radius: "soft",
10656
+ shadow: "layered",
10657
+ typography: "clean-sans",
10658
+ spacing: "airy",
10659
+ motion: "expressive"
10660
+ },
10661
+ compositionBudget: expressiveBudget,
10662
+ themeOverrides: {
10663
+ typography: {
10664
+ body: {
10665
+ family: "Manrope, system-ui, sans-serif",
10666
+ size: "lg",
10667
+ weight: "regular",
10668
+ lineHeight: "relaxed",
10669
+ letterSpacing: "normal"
10670
+ },
10671
+ headings: {
10672
+ default: {
10673
+ family: '"TAN - PEARL", sans-serif',
10674
+ weight: "bold",
10675
+ lineHeight: "normal",
10676
+ letterSpacing: "tight",
10677
+ colorToken: "primary",
10678
+ italic: null,
10679
+ case: null
10680
+ },
10681
+ h1: {
10682
+ size: "xl",
10683
+ weight: "bold",
10684
+ lineHeight: "normal",
10685
+ letterSpacing: "tight",
10686
+ italic: null
10687
+ },
10688
+ h2: {
10689
+ size: "lg",
10690
+ weight: "bold",
10691
+ lineHeight: "normal",
10692
+ letterSpacing: "normal",
10693
+ italic: null
10694
+ },
10695
+ h3: {
10696
+ size: "md",
10697
+ weight: "bold",
10698
+ lineHeight: "normal",
10699
+ letterSpacing: "normal",
10700
+ italic: null
10701
+ }
10702
+ },
10703
+ scale: "balanced"
10704
+ },
10705
+ bodyText: {
10706
+ intro: {
10707
+ paragraphSize: "editorial",
10708
+ headingSize: "editorial"
10709
+ }
10710
+ }
10711
+ },
10712
+ recommendedAppearancePresetIds: [
10713
+ "site-header-brand-solid-inverted-cta",
10714
+ "site-footer-brand-two-band",
10715
+ "hero-brand-scrim-fixed-frame",
10716
+ "body-text-editorial-intro",
10717
+ "testimonials-accent-quote-proof",
10718
+ "contact-form-dark-card"
10719
+ ],
10720
+ buttonPersonalityChoices: [
10721
+ buttonChoice("showtime-pill"),
10722
+ buttonChoice("confident-chip"),
10723
+ buttonChoice("ink-stamp"),
10724
+ buttonChoice("brushed-wash")
10725
+ ],
10726
+ paletteVariantChoices: [
10727
+ paletteChoice("brand-led-burgundy-gold"),
10728
+ paletteChoice("brand-led-jewel"),
10729
+ paletteChoice("brand-led-warm"),
10730
+ paletteChoice("high-contrast-ink")
10731
+ ]
10259
10732
  })
10260
10733
  ];
10261
10734
  var curatedSiteStylesById = new Map(
@@ -10300,6 +10773,40 @@ var heroLegibilityStrategySchema = z23.enum([
10300
10773
  "scrim-gradient",
10301
10774
  "solid-panel"
10302
10775
  ]);
10776
+ var sectionHeightIntentSchema = z23.enum([
10777
+ "default",
10778
+ "banner",
10779
+ "hero",
10780
+ "immersive"
10781
+ ]);
10782
+ var imageSurfaceTreatmentIntensitySchema = z23.enum(["soft", "balanced", "strong"]);
10783
+ var imageSurfaceMotionSchema = z23.enum(["static", "fixed-frame"]);
10784
+ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
10785
+ z23.object({ kind: z23.literal("none") }).strict(),
10786
+ z23.object({
10787
+ kind: z23.literal("brand-scrim"),
10788
+ token: z23.enum(["primary", "secondary", "accent"]),
10789
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10790
+ }).strict(),
10791
+ z23.object({
10792
+ kind: z23.literal("brand-wash"),
10793
+ token: z23.enum(["primary", "secondary", "accent"]),
10794
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10795
+ }).strict(),
10796
+ z23.object({
10797
+ kind: z23.literal("neutral-scrim"),
10798
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10799
+ }).strict(),
10800
+ z23.object({
10801
+ kind: z23.literal("neutral-wash"),
10802
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10803
+ }).strict(),
10804
+ z23.object({
10805
+ kind: z23.literal("solid-panel"),
10806
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10807
+ }).strict()
10808
+ ]);
10809
+ var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
10303
10810
  function uniqueNonEmpty(values) {
10304
10811
  const uniqueValues = [...new Set(values)];
10305
10812
  const firstValue = uniqueValues[0];
@@ -10338,7 +10845,11 @@ var blockDesignPlanSchema = z23.object({
10338
10845
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10339
10846
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10340
10847
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10341
- heroLegibility: heroLegibilityStrategySchema.optional()
10848
+ sectionHeight: sectionHeightIntentSchema.optional(),
10849
+ heroLegibility: heroLegibilityStrategySchema.optional(),
10850
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
10851
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
10852
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10342
10853
  }).strict();
10343
10854
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10344
10855
  z23.object({
@@ -11764,6 +12275,7 @@ var SEMANTIC_SPACING_VALUES = [
11764
12275
  ];
11765
12276
  var SECTION_MIN_HEIGHT_VALUES = [
11766
12277
  "none",
12278
+ "banner",
11767
12279
  "hero",
11768
12280
  "immersive"
11769
12281
  ];
@@ -11791,6 +12303,7 @@ var CONTAINER_SPACING_MAP = {
11791
12303
  };
11792
12304
  var SECTION_MIN_HEIGHT_MAP = {
11793
12305
  none: "",
12306
+ banner: "rb-section-min-h-banner",
11794
12307
  hero: "rb-section-min-h-hero",
11795
12308
  immersive: "rb-section-min-h-immersive"
11796
12309
  };
@@ -12581,6 +13094,9 @@ var boxStylesCompositeTransform = {
12581
13094
  classes.push(roundedResult);
12582
13095
  }
12583
13096
  }
13097
+ if (input.treatment === "accent-quote") {
13098
+ classes.push("rb-card-treatment-accent-quote");
13099
+ }
12584
13100
  return classes.join(" ").trim() || "";
12585
13101
  }
12586
13102
  };
@@ -12678,7 +13194,7 @@ var sectionClassNameTransform = {
12678
13194
  minHeight = input.minHeight;
12679
13195
  } else if (true) {
12680
13196
  console.warn(
12681
- `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, hero, immersive.`
13197
+ `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, banner, hero, immersive.`
12682
13198
  );
12683
13199
  }
12684
13200
  }
@@ -13001,23 +13517,6 @@ function styledCard(children, opts, ...mods) {
13001
13517
  );
13002
13518
  }
13003
13519
 
13004
- // ../blocks/src/system/node/fragments/typography.ts
13005
- function mergeClassName(base, extra) {
13006
- return [base, extra ?? ""].filter(Boolean).join(" ");
13007
- }
13008
- function captionText(opts, ...mods) {
13009
- const {
13010
- as: asProp,
13011
- className: classNameProp,
13012
- color,
13013
- ...rest
13014
- } = opts ?? {};
13015
- const as = asProp ?? "p";
13016
- const className = mergeClassName("rb-caption", classNameProp);
13017
- const style = textColorStyle(color ?? "mutedText");
13018
- return text({ ...rest, as, className, style }, ...mods);
13019
- }
13020
-
13021
13520
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
13022
13521
  function joinClasses(...parts) {
13023
13522
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -13922,18 +14421,17 @@ function buildAttributionNodes() {
13922
14421
  const name = text(
13923
14422
  {
13924
14423
  as: "strong",
13925
- className: "rb-block",
13926
- style: textColorStyle("text")
14424
+ className: "rb-block"
13927
14425
  },
13928
14426
  bind("testimonial.content.name", { fallback: "Anonymous" })
13929
14427
  );
13930
- const jobTitle = captionText(
13931
- null,
14428
+ const jobTitle = text(
14429
+ { as: "p", className: "rb-caption" },
13932
14430
  when("testimonial.content.jobTitle"),
13933
14431
  bind("testimonial.content.jobTitle")
13934
14432
  );
13935
- const company = captionText(
13936
- null,
14433
+ const company = text(
14434
+ { as: "p", className: "rb-caption" },
13937
14435
  when("testimonial.content.company"),
13938
14436
  bind("testimonial.content.company")
13939
14437
  );
@@ -13967,8 +14465,7 @@ function buildTestimonialCard(...mods) {
13967
14465
  );
13968
14466
  const body = richText(
13969
14467
  {
13970
- className: "rb-prose rb-max-w-none",
13971
- style: textColorStyle("text")
14468
+ className: "rb-prose rb-max-w-none"
13972
14469
  },
13973
14470
  bind("testimonial.content.body"),
13974
14471
  when("testimonial.content.body")
@@ -15598,6 +16095,7 @@ function heroContentCard(children, gap) {
15598
16095
  return styledContainer({
15599
16096
  bindFrom: "_contentCardStyles",
15600
16097
  constrainWidth: false,
16098
+ baseClassName: "rb-relative rb-isolate",
15601
16099
  rootType: "stack",
15602
16100
  rootProps: {
15603
16101
  gap
@@ -15628,6 +16126,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15628
16126
  function heroContainerStack(children, gap) {
15629
16127
  return styledContainer({
15630
16128
  rootType: "stack",
16129
+ baseClassName: "rb-relative rb-isolate",
15631
16130
  rootProps: {
15632
16131
  gap: "none",
15633
16132
  justify: {
@@ -16846,7 +17345,7 @@ function resolveHeroVerticalAlignment(content) {
16846
17345
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
16847
17346
  const sectionStyles = asPartialObject(content._sectionStyles);
16848
17347
  const minHeight = sectionStyles?.minHeight;
16849
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17348
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
16850
17349
  const variant = resolveHeroVariant(content);
16851
17350
  if (variant === "split" || variant === "splitReverse") return "center";
16852
17351
  return "top";
@@ -17604,6 +18103,26 @@ var footerSplitNavSingleClassTransform = {
17604
18103
  ]);
17605
18104
  }
17606
18105
  };
18106
+ var footerSplitMainClassSchema = z35.object({
18107
+ base: z35.string().optional(),
18108
+ reverseClass: z35.string().optional()
18109
+ });
18110
+ var footerSplitMainClassTransform = {
18111
+ id: "layout.footerSplitMainClass",
18112
+ kind: "string",
18113
+ summary: "Compose split-footer main row classes from footer logo placement",
18114
+ schema: footerSplitMainClassSchema,
18115
+ run: (value, options) => {
18116
+ const logo = asPartialObject(value);
18117
+ const placement = logo?.placement ?? "right";
18118
+ const shouldPlaceLogoFirst = placement === "left" || placement === "above";
18119
+ const baseClass = shouldPlaceLogoFirst ? "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-end rb-gap-8 rb-md-flex-row rb-md-items-end" : "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end";
18120
+ return joinClasses4([
18121
+ options.base ?? baseClass,
18122
+ shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null
18123
+ ]);
18124
+ }
18125
+ };
17607
18126
  var footerLogoClassSchema = z35.object({
17608
18127
  base: z35.string().optional()
17609
18128
  });
@@ -17614,14 +18133,11 @@ var footerLogoClassTransform = {
17614
18133
  schema: footerLogoClassSchema,
17615
18134
  run: (value, options) => {
17616
18135
  const logo = asPartialObject(value);
17617
- const placement = logo?.placement ?? "right";
17618
18136
  const align = logo?.align ?? "end";
17619
18137
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17620
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17621
18138
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
17622
18139
  return joinClasses4([
17623
18140
  options.base ?? "footer-logo rb-inline-flex rb-items-center rb-justify-end rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80",
17624
- orderClass,
17625
18141
  selfAlignClass,
17626
18142
  hiddenClass
17627
18143
  ]);
@@ -17676,6 +18192,7 @@ var layoutTransforms = [
17676
18192
  footerBottomBarContainerClassTransform,
17677
18193
  footerBottomBarStyleTransform,
17678
18194
  footerSplitNavSingleClassTransform,
18195
+ footerSplitMainClassTransform,
17679
18196
  footerLogoClassTransform,
17680
18197
  footerLogoMediaClassTransform,
17681
18198
  footerLogoTextVisibleTransform
@@ -17952,7 +18469,7 @@ var createNavRow = (className, align = "end") => navRow({
17952
18469
  var headerCta = ctaButton({
17953
18470
  basePath: "menu.ctaItem",
17954
18471
  whenPath: "menu.ctaItem.label",
17955
- variantPath: "menu.ctaItem.variant",
18472
+ variantPath: "$root.theme.header.ctaVariant",
17956
18473
  linkPath: "menu.ctaItem.link",
17957
18474
  sizeFallback: "sm",
17958
18475
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -17960,7 +18477,7 @@ var headerCta = ctaButton({
17960
18477
  var mobileCta = ctaButton({
17961
18478
  basePath: "menu.ctaItem",
17962
18479
  whenPath: "menu.ctaItem.label",
17963
- variantPath: "menu.ctaItem.variant",
18480
+ variantPath: "$root.theme.header.ctaVariant",
17964
18481
  linkPath: "menu.ctaItem.link",
17965
18482
  sizeFallback: "md",
17966
18483
  className: "nav-mobile-cta rb-w-full"
@@ -18421,7 +18938,13 @@ var splitFooterLayout = stack(
18421
18938
  [
18422
18939
  inline(
18423
18940
  {
18424
- className: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
18941
+ className: {
18942
+ $bind: {
18943
+ from: "$root.theme.footer.logo",
18944
+ transforms: [{ id: "layout.footerSplitMainClass" }],
18945
+ fallback: "rb-flex rb-w-full rb-flex-col rb-items-start rb-justify-between rb-gap-8 rb-md-flex-row rb-md-items-end"
18946
+ }
18947
+ }
18425
18948
  },
18426
18949
  [
18427
18950
  stack(
@@ -20509,7 +21032,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20509
21032
  run: z47.object({
20510
21033
  courseId: z47.string(),
20511
21034
  seriesId: z47.string(),
20512
- runSlug: z47.string()
21035
+ runSlug: z47.string(),
21036
+ runName: z47.string().nullable()
20513
21037
  })
20514
21038
  }),
20515
21039
  z47.object({
@@ -26456,6 +26980,34 @@ function panelCapable() {
26456
26980
  itemSurfaces: "unsupported"
26457
26981
  });
26458
26982
  }
26983
+ var heroSectionHeights = [
26984
+ "default",
26985
+ "banner",
26986
+ "hero",
26987
+ "immersive"
26988
+ ];
26989
+ var heroImageSurfaceTreatments = [
26990
+ "none",
26991
+ "brand-scrim",
26992
+ "brand-wash",
26993
+ "neutral-scrim",
26994
+ "neutral-wash",
26995
+ "solid-panel"
26996
+ ];
26997
+ var heroImageSurfaceMotions = [
26998
+ "static",
26999
+ "fixed-frame"
27000
+ ];
27001
+ function heroCapable() {
27002
+ return declareBlockDesignCapability({
27003
+ sectionSurfaces: "supported",
27004
+ contentFrames: ["plain", "panel"],
27005
+ itemSurfaces: "unsupported",
27006
+ sectionHeights: heroSectionHeights,
27007
+ imageSurfaceTreatments: heroImageSurfaceTreatments,
27008
+ imageSurfaceMotions: heroImageSurfaceMotions
27009
+ });
27010
+ }
26459
27011
  function plainItemsCapable() {
26460
27012
  return declareBlockDesignCapability({
26461
27013
  sectionSurfaces: "supported",
@@ -26572,7 +27124,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26572
27124
  };
26573
27125
  }
26574
27126
  var systemBlockDefinitionsRaw = [
26575
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27127
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26576
27128
  flow: heroFlow,
26577
27129
  layoutProfiles: [
26578
27130
  layoutProfile({
@@ -26676,7 +27228,12 @@ var systemBlockDefinitionsRaw = [
26676
27228
  flow: siteChromeFlow,
26677
27229
  layoutProfiles: []
26678
27230
  })),
26679
- withDesignCapability("block.testimonials", testimonialsBlockDefinition, panelAndItemsCapable(), defineBlockDesignMetadata({
27231
+ withDesignCapability("block.testimonials", testimonialsBlockDefinition, declareBlockDesignCapability({
27232
+ sectionSurfaces: "supported",
27233
+ contentFrames: ["plain", "panel"],
27234
+ itemSurfaces: "supported",
27235
+ testimonialCardTreatments: ["default", "accent-quote"]
27236
+ }), defineBlockDesignMetadata({
26680
27237
  flow: proofFlow,
26681
27238
  layoutProfiles: [
26682
27239
  layoutProfile({
@@ -26988,8 +27545,15 @@ function parseOpacity(value) {
26988
27545
  }
26989
27546
  return opacity <= 1 ? opacity : opacity / 100;
26990
27547
  }
26991
- function appendOptionalClasses(baseClassName, optionalClassName) {
26992
- return optionalClassName ? `${baseClassName} ${optionalClassName}` : baseClassName;
27548
+ function backgroundMotionClassNames(input) {
27549
+ return input.motion === "fixed-frame" ? "rb-bg-motion-fixed-frame" : "";
27550
+ }
27551
+ function appendBackgroundMediaClasses(baseClassName, input) {
27552
+ return [
27553
+ baseClassName,
27554
+ backgroundMotionClassNames(input),
27555
+ backgroundVideoMobileClassNames(input)
27556
+ ].filter(Boolean).join(" ");
26993
27557
  }
26994
27558
  var resolveImageStyleTransform = {
26995
27559
  id: "background.resolveImageStyle",
@@ -27066,9 +27630,9 @@ var resolveImageClassNameTransform = {
27066
27630
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
27067
27631
  const position = isString(input.position) ? input.position.trim() : null;
27068
27632
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
27069
- return appendOptionalClasses(
27633
+ return appendBackgroundMediaClasses(
27070
27634
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
27071
- backgroundVideoMobileClassNames(input)
27635
+ input
27072
27636
  );
27073
27637
  }
27074
27638
  let needsAnchoring = false;
@@ -27081,18 +27645,18 @@ var resolveImageClassNameTransform = {
27081
27645
  }
27082
27646
  }
27083
27647
  if (!needsAnchoring) {
27084
- return appendOptionalClasses(
27648
+ return appendBackgroundMediaClasses(
27085
27649
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
27086
- backgroundVideoMobileClassNames(input)
27650
+ input
27087
27651
  );
27088
27652
  }
27089
27653
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
27090
27654
  const isCustom = position && !isPreset;
27091
27655
  if (isCustom) {
27092
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27656
+ return appendBackgroundMediaClasses(baseClass, input);
27093
27657
  }
27094
27658
  const anchorClasses = getAnchorClasses(position);
27095
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27659
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
27096
27660
  }
27097
27661
  };
27098
27662
  var resolveOverlayStyleTransform = {