@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
@@ -588,7 +588,7 @@ var ENDPOINT_DEFINITIONS = {
588
588
  method: "GET",
589
589
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
590
590
  auth: "user",
591
- responseKind: "text"
591
+ responseKind: "blob"
592
592
  },
593
593
  getNewsletterSubscriber: {
594
594
  path: "/sites/{siteId}/newsletter/subscribers/{subscriberId}",
@@ -919,12 +919,7 @@ var ENDPOINT_DEFINITIONS = {
919
919
  ],
920
920
  auth: "user",
921
921
  responseKind: "json",
922
- errors: [
923
- "validation:invalid_input",
924
- "resource:not_found",
925
- "resource:conflict",
926
- "server:internal_error"
927
- ]
922
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
928
923
  },
929
924
  unpublishTeamMemberProfile: {
930
925
  path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
@@ -1177,6 +1172,13 @@ var ENDPOINT_DEFINITIONS = {
1177
1172
  auth: "user",
1178
1173
  responseKind: "json"
1179
1174
  },
1175
+ exportBookingAppointmentsCsv: {
1176
+ path: "/sites/{siteId}/bookings/appointments/export.csv",
1177
+ method: "GET",
1178
+ auth: "user",
1179
+ errors: [],
1180
+ responseKind: "blob"
1181
+ },
1180
1182
  createAppointment: {
1181
1183
  path: "/sites/{siteId}/bookings/appointments",
1182
1184
  method: "POST",
@@ -1304,6 +1306,13 @@ var ENDPOINT_DEFINITIONS = {
1304
1306
  auth: "user",
1305
1307
  responseKind: "json"
1306
1308
  },
1309
+ exportCourseEnrollmentsCsv: {
1310
+ path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
1311
+ method: "GET",
1312
+ auth: "user",
1313
+ errors: [],
1314
+ responseKind: "blob"
1315
+ },
1307
1316
  listCourseWaitlist: {
1308
1317
  path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist",
1309
1318
  method: "GET",
@@ -2666,6 +2675,14 @@ var ENDPOINT_DEFINITIONS = {
2666
2675
  auth: "user",
2667
2676
  responseKind: "json"
2668
2677
  },
2678
+ exportSeoPagesCsv: {
2679
+ path: "/sites/{siteId}/seo/pages",
2680
+ method: "GET",
2681
+ tags: ["site-{siteId}", "seo-pages-{siteId}"],
2682
+ auth: "user",
2683
+ responseKind: "blob",
2684
+ errors: []
2685
+ },
2669
2686
  getSeoQueries: {
2670
2687
  path: "/sites/{siteId}/seo/queries",
2671
2688
  method: "GET",
@@ -2674,6 +2691,14 @@ var ENDPOINT_DEFINITIONS = {
2674
2691
  auth: "user",
2675
2692
  responseKind: "json"
2676
2693
  },
2694
+ exportSeoQueriesCsv: {
2695
+ path: "/sites/{siteId}/seo/queries",
2696
+ method: "GET",
2697
+ tags: ["site-{siteId}", "seo-queries-{siteId}"],
2698
+ auth: "user",
2699
+ responseKind: "blob",
2700
+ errors: []
2701
+ },
2677
2702
  getPerformanceOverview: {
2678
2703
  path: "/sites/{siteId}/performance/overview",
2679
2704
  method: "GET",
@@ -2722,7 +2747,12 @@ var ENDPOINT_DEFINITIONS = {
2722
2747
  path: "/media/{assetId}/canonical-crop",
2723
2748
  method: "POST",
2724
2749
  tags: ["media", "media-{assetId}"],
2725
- errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"],
2750
+ errors: [
2751
+ "validation:invalid_input",
2752
+ "resource:not_found",
2753
+ "resource:conflict",
2754
+ "server:internal_error"
2755
+ ],
2726
2756
  auth: "user",
2727
2757
  responseKind: "json"
2728
2758
  },
@@ -3054,7 +3084,7 @@ var ENDPOINT_DEFINITIONS = {
3054
3084
  method: "GET",
3055
3085
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
3056
3086
  auth: "user",
3057
- responseKind: "text"
3087
+ responseKind: "blob"
3058
3088
  },
3059
3089
  // Public submit
3060
3090
  submitForm: {
@@ -3937,6 +3967,14 @@ var ENDPOINT_DEFINITIONS = {
3937
3967
  auth: "user",
3938
3968
  responseKind: "json"
3939
3969
  },
3970
+ exportEventSeriesAttendeesCsv: {
3971
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/attendees/export.csv",
3972
+ method: "GET",
3973
+ tags: ["site-{siteId}", "event-series-{seriesId}"],
3974
+ auth: "user",
3975
+ errors: [],
3976
+ responseKind: "blob"
3977
+ },
3940
3978
  listEventSeriesWaitlist: {
3941
3979
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3942
3980
  method: "GET",
@@ -4500,6 +4538,14 @@ var ENDPOINT_DEFINITIONS = {
4500
4538
  auth: "user",
4501
4539
  responseKind: "json"
4502
4540
  },
4541
+ exportBookingCustomersCsv: {
4542
+ path: "/sites/{siteId}/bookings/customers/export.csv",
4543
+ method: "GET",
4544
+ tags: ["site-{siteId}", "customers-{siteId}"],
4545
+ auth: "user",
4546
+ errors: [],
4547
+ responseKind: "blob"
4548
+ },
4503
4549
  createBookingCustomer: {
4504
4550
  path: "/sites/{siteId}/bookings/customers",
4505
4551
  method: "POST",
@@ -4527,6 +4573,21 @@ var ENDPOINT_DEFINITIONS = {
4527
4573
  "server:internal_error"
4528
4574
  ]
4529
4575
  },
4576
+ rectifyBookingParticipantIdentity: {
4577
+ path: "/sites/{siteId}/bookings/participants/{participantId}/identity",
4578
+ method: "PATCH",
4579
+ tags: ["site-{siteId}", "customers-{siteId}"],
4580
+ auth: "user",
4581
+ responseKind: "json",
4582
+ errors: [
4583
+ "validation:invalid_input",
4584
+ "auth:forbidden",
4585
+ "resource:not_found",
4586
+ "resource:already_exists",
4587
+ "resource:conflict",
4588
+ "server:internal_error"
4589
+ ]
4590
+ },
4530
4591
  listCustomerPasses: {
4531
4592
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4532
4593
  method: "GET",
@@ -4661,13 +4722,46 @@ var ENDPOINT_DEFINITIONS = {
4661
4722
  auth: "user",
4662
4723
  responseKind: "json"
4663
4724
  },
4725
+ exportMoneyPaymentsCsv: {
4726
+ path: "/sites/{siteId}/bookings/money/payments/export.csv",
4727
+ method: "GET",
4728
+ tags: ["site-{siteId}", "bookings", "money-payments-{siteId}"],
4729
+ errors: [],
4730
+ auth: "user",
4731
+ responseKind: "blob"
4732
+ },
4733
+ exportMoneyBreakdownsCsv: {
4734
+ path: "/sites/{siteId}/bookings/money/report/breakdowns/export.csv",
4735
+ method: "GET",
4736
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4737
+ errors: [],
4738
+ auth: "user",
4739
+ responseKind: "blob"
4740
+ },
4741
+ exportMoneyTimeSeriesCsv: {
4742
+ path: "/sites/{siteId}/bookings/money/report/time-series/export.csv",
4743
+ method: "GET",
4744
+ tags: ["site-{siteId}", "bookings", "money-report-{siteId}"],
4745
+ errors: [],
4746
+ auth: "user",
4747
+ responseKind: "blob"
4748
+ },
4664
4749
  listBookingActivity: {
4665
4750
  path: "/sites/{siteId}/bookings/activity",
4666
4751
  method: "GET",
4667
4752
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4753
+ errors: [],
4668
4754
  auth: "user",
4669
4755
  responseKind: "json"
4670
4756
  },
4757
+ exportBookingActivityCsv: {
4758
+ path: "/sites/{siteId}/bookings/activity/export.csv",
4759
+ method: "GET",
4760
+ tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4761
+ errors: [],
4762
+ auth: "user",
4763
+ responseKind: "blob"
4764
+ },
4671
4765
  // Site logs
4672
4766
  listSiteActivityLogs: {
4673
4767
  path: "/sites/{siteId}/logs/activity",
@@ -4819,13 +4913,6 @@ var ENDPOINT_DEFINITIONS = {
4819
4913
  auth: "user",
4820
4914
  responseKind: "blob"
4821
4915
  },
4822
- exportSeoCsv: {
4823
- path: "/sites/{siteId}/seo/export",
4824
- method: "GET",
4825
- tags: ["site-{siteId}", "seo"],
4826
- auth: "user",
4827
- responseKind: "blob"
4828
- },
4829
4916
  // Admin site cost (for admin panel)
4830
4917
  adminSiteCost: {
4831
4918
  path: "/admin/sites/{siteId}/cost",
@@ -5826,68 +5913,6 @@ function toLocationCoordinates(value) {
5826
5913
  };
5827
5914
  }
5828
5915
 
5829
- // ../core/src/participant-identity.ts
5830
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD = {
5831
- participant_id: {
5832
- field: "participant_id",
5833
- role: "canonical_link",
5834
- canonicalSource: "booking_participants.id",
5835
- contractAction: "tighten_in_839",
5836
- notes: "Canonical person-subject link for a participation. #839 should enforce this once preflight is clean."
5837
- },
5838
- display_name: {
5839
- field: "display_name",
5840
- role: "contextual_snapshot",
5841
- canonicalSource: "booking_participants.display_name for live identity",
5842
- contractAction: "retain_as_snapshot",
5843
- notes: "Participation-time display context. Readers must not treat it as mutable live participant identity."
5844
- },
5845
- email: {
5846
- field: "email",
5847
- role: "contextual_snapshot",
5848
- canonicalSource: "booking_participants.email_normalized for live email identity",
5849
- contractAction: "retain_as_snapshot",
5850
- notes: "Participation-time contact snapshot used for notifications/context. Live identity belongs to the participant row."
5851
- },
5852
- email_normalized: {
5853
- field: "email_normalized",
5854
- role: "contextual_snapshot",
5855
- canonicalSource: "booking_participants.email_normalized for live email identity",
5856
- contractAction: "retain_as_snapshot",
5857
- notes: "Normalized snapshot/dedupe helper for the participation slot, not live person authority."
5858
- },
5859
- phone: {
5860
- field: "phone",
5861
- role: "contextual_snapshot",
5862
- canonicalSource: "booking_participants.phone for live phone identity",
5863
- contractAction: "retain_as_snapshot",
5864
- notes: "Participation-time phone context. Live identity belongs to the participant row."
5865
- },
5866
- identity_state: {
5867
- field: "identity_state",
5868
- role: "materialization_state",
5869
- canonicalSource: "booking_participants.identity_state for subject state",
5870
- contractAction: "review_for_later_contract_cleanup",
5871
- notes: "Slot materialization state: booker_supplied, contactable, portal_claimed, or staff_verified."
5872
- },
5873
- event_attendee_guest_id: {
5874
- field: "event_attendee_guest_id",
5875
- role: "compatibility_projection",
5876
- canonicalSource: "canonical participant slot plus #838 event guest compatibility projection",
5877
- contractAction: "retain_as_projection",
5878
- notes: "Compatibility FK for event guest read models. It is not person identity authority."
5879
- }
5880
- };
5881
- var PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATIONS = [
5882
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.participant_id,
5883
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.display_name,
5884
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email,
5885
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.email_normalized,
5886
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.phone,
5887
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.identity_state,
5888
- PARTICIPANT_PARTICIPATION_IDENTITY_FIELD_CLASSIFICATION_BY_FIELD.event_attendee_guest_id
5889
- ];
5890
-
5891
5916
  // ../media-core/src/transformRect.ts
5892
5917
  function isValidTransformRectStructure(rect) {
5893
5918
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -7026,6 +7051,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
7026
7051
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
7027
7052
  "missing_amount",
7028
7053
  "amount_exceeds_remaining",
7054
+ "credit_refunds_disabled",
7055
+ "missing_credit_customer",
7029
7056
  "deposit_refund_override_required",
7030
7057
  "refund_revoke_requires_full_line_refund",
7031
7058
  "unified_order_link_required"
@@ -7645,12 +7672,29 @@ function defineFrameCapability(capability) {
7645
7672
  function defineBlockDesignCapability(capability) {
7646
7673
  return {
7647
7674
  ...capability,
7648
- kind: "designed"
7675
+ kind: "designed",
7676
+ sectionHeights: capability.sectionHeights ?? ["default"],
7677
+ imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7678
+ imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7679
+ testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"]
7649
7680
  };
7650
7681
  }
7651
7682
 
7652
7683
  // ../theme-core/src/site-styles/appearancePresets.ts
7684
+ function assertValidOptionGroups(preset2) {
7685
+ preset2.optionGroups?.forEach((group) => {
7686
+ const selectedOption = group.options.find(
7687
+ (option) => option.id === group.selectedOptionId
7688
+ );
7689
+ if (!selectedOption) {
7690
+ throw new Error(
7691
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7692
+ );
7693
+ }
7694
+ });
7695
+ }
7653
7696
  function defineBlockAppearancePreset(preset2) {
7697
+ assertValidOptionGroups(preset2);
7654
7698
  return preset2;
7655
7699
  }
7656
7700
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7663,13 +7707,122 @@ var appearancePresets = [
7663
7707
  target: "hero",
7664
7708
  label: "Immersive image hero",
7665
7709
  blockKinds: ["block.hero"],
7710
+ constraints: {
7711
+ layoutFamilies: ["centered", "compact"]
7712
+ },
7713
+ design: {
7714
+ sectionSurface: "hero-image",
7715
+ contentFrame: plainFrame,
7716
+ itemSurface: "none",
7717
+ transitionAfter: "soft-fade-short",
7718
+ emphasis: "high",
7719
+ sectionHeight: "hero",
7720
+ imageSurfaceTreatment: { kind: "neutral-wash" }
7721
+ }
7722
+ }),
7723
+ defineBlockAppearancePreset({
7724
+ kind: "block-design",
7725
+ id: "hero-brand-scrim",
7726
+ target: "hero",
7727
+ label: "Brand scrim image hero",
7728
+ blockKinds: ["block.hero"],
7729
+ constraints: {
7730
+ layoutFamilies: ["centered", "compact"]
7731
+ },
7732
+ optionGroups: [
7733
+ {
7734
+ id: "image-surface-treatment",
7735
+ label: "Treatment",
7736
+ selectedOptionId: "brand-scrim-primary",
7737
+ options: [
7738
+ {
7739
+ id: "brand-scrim-primary",
7740
+ label: "Brand scrim",
7741
+ designPatch: {
7742
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7743
+ }
7744
+ },
7745
+ {
7746
+ id: "neutral-scrim",
7747
+ label: "Neutral scrim",
7748
+ designPatch: {
7749
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7750
+ }
7751
+ }
7752
+ ]
7753
+ }
7754
+ ],
7755
+ layoutPatches: [
7756
+ {
7757
+ constraints: {
7758
+ layoutVariantKeys: ["micro"]
7759
+ },
7760
+ designPatch: {
7761
+ sectionHeight: "banner"
7762
+ }
7763
+ }
7764
+ ],
7666
7765
  design: {
7667
7766
  sectionSurface: "hero-image",
7668
7767
  contentFrame: plainFrame,
7669
7768
  itemSurface: "none",
7670
7769
  transitionAfter: "soft-fade-short",
7671
7770
  emphasis: "high",
7672
- heroLegibility: "scrim-gradient"
7771
+ sectionHeight: "immersive",
7772
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7773
+ }
7774
+ }),
7775
+ defineBlockAppearancePreset({
7776
+ kind: "block-design",
7777
+ id: "hero-brand-scrim-fixed-frame",
7778
+ target: "hero",
7779
+ label: "Fixed-frame brand scrim hero",
7780
+ blockKinds: ["block.hero"],
7781
+ constraints: {
7782
+ layoutFamilies: ["centered", "compact"]
7783
+ },
7784
+ optionGroups: [
7785
+ {
7786
+ id: "image-surface-treatment",
7787
+ label: "Treatment",
7788
+ selectedOptionId: "brand-scrim-primary",
7789
+ options: [
7790
+ {
7791
+ id: "brand-scrim-primary",
7792
+ label: "Brand scrim",
7793
+ designPatch: {
7794
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7795
+ }
7796
+ },
7797
+ {
7798
+ id: "neutral-scrim",
7799
+ label: "Neutral scrim",
7800
+ designPatch: {
7801
+ imageSurfaceTreatment: { kind: "neutral-scrim" }
7802
+ }
7803
+ }
7804
+ ]
7805
+ }
7806
+ ],
7807
+ layoutPatches: [
7808
+ {
7809
+ constraints: {
7810
+ layoutVariantKeys: ["micro"]
7811
+ },
7812
+ designPatch: {
7813
+ sectionHeight: "banner"
7814
+ }
7815
+ }
7816
+ ],
7817
+ design: {
7818
+ sectionSurface: "hero-image",
7819
+ contentFrame: plainFrame,
7820
+ itemSurface: "none",
7821
+ transitionAfter: "soft-fade-short",
7822
+ emphasis: "high",
7823
+ sectionHeight: "immersive",
7824
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7825
+ imageSurfaceMotion: "fixed-frame"
7673
7826
  }
7674
7827
  }),
7675
7828
  defineBlockAppearancePreset({
@@ -7686,17 +7839,26 @@ var appearancePresets = [
7686
7839
  emphasis: "high"
7687
7840
  }
7688
7841
  }),
7842
+ defineBlockAppearancePreset({
7843
+ kind: "block-design",
7844
+ id: "body-text-editorial-intro",
7845
+ target: "body-text",
7846
+ label: "Editorial intro copy",
7847
+ blockKinds: ["block.body-text"],
7848
+ design: {
7849
+ sectionSurface: "base",
7850
+ contentFrame: plainFrame,
7851
+ itemSurface: "none",
7852
+ transitionAfter: "soft-fade-short",
7853
+ emphasis: "high"
7854
+ }
7855
+ }),
7689
7856
  defineBlockAppearancePreset({
7690
7857
  kind: "block-design",
7691
7858
  id: "offerings-calm-list",
7692
7859
  target: "offerings",
7693
7860
  label: "Calm offerings list",
7694
- blockKinds: [
7695
- "block.event-listing",
7696
- "block.event-calendar",
7697
- "block.event-spotlight",
7698
- "block.product-list"
7699
- ],
7861
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7700
7862
  design: {
7701
7863
  sectionSurface: "muted-band",
7702
7864
  contentFrame: plainFrame,
@@ -7775,6 +7937,35 @@ var appearancePresets = [
7775
7937
  emphasis: "high"
7776
7938
  }
7777
7939
  }),
7940
+ defineBlockAppearancePreset({
7941
+ kind: "block-design",
7942
+ id: "testimonials-dark-proof",
7943
+ target: "testimonials",
7944
+ label: "Dark proof panel",
7945
+ blockKinds: ["block.testimonials"],
7946
+ design: {
7947
+ sectionSurface: "accent-band",
7948
+ contentFrame: panelFrame("raised"),
7949
+ itemSurface: "raised",
7950
+ transitionAfter: "soft-fade-short",
7951
+ emphasis: "high"
7952
+ }
7953
+ }),
7954
+ defineBlockAppearancePreset({
7955
+ kind: "block-design",
7956
+ id: "testimonials-accent-quote-proof",
7957
+ target: "testimonials",
7958
+ label: "Accent quote proof",
7959
+ blockKinds: ["block.testimonials"],
7960
+ design: {
7961
+ sectionSurface: "accent-band",
7962
+ contentFrame: plainFrame,
7963
+ itemSurface: "raised",
7964
+ transitionAfter: "soft-fade-short",
7965
+ emphasis: "high",
7966
+ testimonialCardTreatment: "accent-quote"
7967
+ }
7968
+ }),
7778
7969
  defineBlockAppearancePreset({
7779
7970
  kind: "block-design",
7780
7971
  id: "faq-contained-help",
@@ -7803,6 +7994,20 @@ var appearancePresets = [
7803
7994
  emphasis: "medium"
7804
7995
  }
7805
7996
  }),
7997
+ defineBlockAppearancePreset({
7998
+ kind: "block-design",
7999
+ id: "contact-form-dark-card",
8000
+ target: "contact-form",
8001
+ label: "Dark form card",
8002
+ blockKinds: ["block.form"],
8003
+ design: {
8004
+ sectionSurface: "accent-band",
8005
+ contentFrame: panelFrame("raised"),
8006
+ itemSurface: "none",
8007
+ transitionAfter: "soft-fade-short",
8008
+ emphasis: "high"
8009
+ }
8010
+ }),
7806
8011
  defineBlockAppearancePreset({
7807
8012
  kind: "block-design",
7808
8013
  id: "cta-accent-band",
@@ -7822,9 +8027,33 @@ var appearancePresets = [
7822
8027
  id: "header-clean-base",
7823
8028
  target: "site-header",
7824
8029
  label: "Clean base header",
7825
- chrome: {
7826
- surface: "base",
7827
- emphasis: "medium"
8030
+ header: {
8031
+ surface: {
8032
+ kind: "neutral-solid",
8033
+ token: "surface",
8034
+ textColorToken: "text"
8035
+ },
8036
+ navTreatment: "minimal",
8037
+ dropdownTreatment: "surface",
8038
+ ctaTreatment: "default",
8039
+ behavior: "default"
8040
+ }
8041
+ }),
8042
+ defineSiteChromeAppearancePreset({
8043
+ kind: "site-chrome",
8044
+ id: "site-header-brand-solid-inverted-cta",
8045
+ target: "site-header",
8046
+ label: "Brand solid header with inverted CTA",
8047
+ header: {
8048
+ surface: {
8049
+ kind: "brand-solid",
8050
+ token: "primary",
8051
+ textColorToken: "primaryForeground"
8052
+ },
8053
+ navTreatment: "uppercase-underline",
8054
+ dropdownTreatment: "matched-solid",
8055
+ ctaTreatment: "inverted",
8056
+ behavior: "sticky-shrink"
7828
8057
  }
7829
8058
  }),
7830
8059
  defineSiteChromeAppearancePreset({
@@ -7832,10 +8061,31 @@ var appearancePresets = [
7832
8061
  id: "footer-muted-grounding",
7833
8062
  target: "site-footer",
7834
8063
  label: "Muted grounding footer",
7835
- chrome: {
8064
+ footer: {
8065
+ kind: "grounding",
7836
8066
  surface: "muted-band",
7837
8067
  emphasis: "low"
7838
8068
  }
8069
+ }),
8070
+ defineSiteChromeAppearancePreset({
8071
+ kind: "site-chrome",
8072
+ id: "site-footer-brand-two-band",
8073
+ target: "site-footer",
8074
+ label: "Two-band brand footer",
8075
+ footer: {
8076
+ kind: "brand-two-band",
8077
+ surface: {
8078
+ token: "primary",
8079
+ shade: "800",
8080
+ textColorToken: "primaryForeground"
8081
+ },
8082
+ bottomBand: {
8083
+ token: "primary",
8084
+ shade: "900",
8085
+ textColorToken: "primaryForeground"
8086
+ },
8087
+ emphasis: "high"
8088
+ }
7839
8089
  })
7840
8090
  ];
7841
8091
 
@@ -8495,6 +8745,111 @@ var pebble = defineButtonPersonality({
8495
8745
  }
8496
8746
  });
8497
8747
 
8748
+ // ../theme-core/src/buttons/personalities/showtime-pill.ts
8749
+ var showtimePill = defineButtonPersonality({
8750
+ id: "showtime-pill",
8751
+ name: "Showtime Pill",
8752
+ description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
8753
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "modern" },
8754
+ buttonSystem: {
8755
+ global: {
8756
+ cornerStyle: "pill",
8757
+ shadow: "low",
8758
+ textTransform: "uppercase",
8759
+ fontWeight: 700,
8760
+ borderWidth: 2,
8761
+ hoverTransform: "lift",
8762
+ hoverColor: "darken",
8763
+ typography: "body",
8764
+ paddingPreset: "spacious",
8765
+ italic: false
8766
+ },
8767
+ sizes: {
8768
+ sm: { padding: "0.625rem 1.25rem", fontSize: "0.875rem" },
8769
+ md: { padding: "0.875rem 1.75rem", fontSize: "1rem" },
8770
+ lg: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" },
8771
+ xl: { padding: "1.125rem 2.25rem", fontSize: "1.125rem" }
8772
+ },
8773
+ variants: [
8774
+ {
8775
+ id: "primary",
8776
+ name: "Primary",
8777
+ enabled: true,
8778
+ priority: 1,
8779
+ background: { type: "solid", colorToken: "primary" },
8780
+ textColorToken: "background",
8781
+ borderRadius: "rounded-full",
8782
+ effects: {
8783
+ hover: [{ effectId: "pop" }]
8784
+ }
8785
+ },
8786
+ {
8787
+ id: "secondary",
8788
+ name: "Secondary",
8789
+ enabled: true,
8790
+ priority: 2,
8791
+ background: { type: "transparent" },
8792
+ textColorToken: "primary",
8793
+ borderRadius: "rounded-full",
8794
+ border: { widthClass: "border-2", colorToken: "primary" },
8795
+ effects: {
8796
+ hover: [{ effectId: "pop" }]
8797
+ }
8798
+ },
8799
+ {
8800
+ id: "hero",
8801
+ name: "Hero",
8802
+ enabled: true,
8803
+ priority: 1,
8804
+ background: { type: "solid", colorToken: "secondary" },
8805
+ textColorToken: "primary",
8806
+ borderRadius: "rounded-full",
8807
+ effects: {
8808
+ hover: [{ effectId: "pop" }]
8809
+ }
8810
+ },
8811
+ {
8812
+ id: "header",
8813
+ name: "Header",
8814
+ enabled: true,
8815
+ priority: 2,
8816
+ background: { type: "solid", colorToken: "background" },
8817
+ textColorToken: "primary",
8818
+ borderRadius: "rounded-full",
8819
+ border: { widthClass: "border-2", colorToken: "primary" },
8820
+ effects: {
8821
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8822
+ }
8823
+ },
8824
+ {
8825
+ id: "outline",
8826
+ name: "Outline",
8827
+ enabled: true,
8828
+ priority: 3,
8829
+ background: { type: "transparent" },
8830
+ textColorToken: "primary",
8831
+ borderRadius: "rounded-full",
8832
+ border: { widthClass: "border-2", colorToken: "primary" },
8833
+ effects: {
8834
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8835
+ }
8836
+ },
8837
+ {
8838
+ id: "ghost",
8839
+ name: "Ghost",
8840
+ enabled: true,
8841
+ priority: 3,
8842
+ background: { type: "transparent" },
8843
+ textColorToken: "primary",
8844
+ borderRadius: "rounded-full",
8845
+ effects: {
8846
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8847
+ }
8848
+ }
8849
+ ]
8850
+ }
8851
+ });
8852
+
8498
8853
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8499
8854
  var softPill = defineButtonPersonality({
8500
8855
  id: "soft-pill",
@@ -8575,7 +8930,8 @@ var buttonPersonalities = [
8575
8930
  editorialLink,
8576
8931
  pebble,
8577
8932
  inkStamp,
8578
- brushedWash
8933
+ brushedWash,
8934
+ showtimePill
8579
8935
  ];
8580
8936
  var personalitiesById = new Map(
8581
8937
  buttonPersonalities.map((p) => [p.id, p])
@@ -9106,14 +9462,7 @@ var proseLinkStyleSchema = z21.object({
9106
9462
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9107
9463
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9108
9464
  });
9109
- var semanticSpacingSchema = z21.enum([
9110
- "none",
9111
- "compact",
9112
- "cozy",
9113
- "medium",
9114
- "comfortable",
9115
- "spacious"
9116
- ]);
9465
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9117
9466
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9118
9467
  var boxBackgroundOverlaySchema = z21.object({
9119
9468
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9130,6 +9479,7 @@ var boxBackgroundSchema = z21.object({
9130
9479
  scale: z21.string().nullable().optional(),
9131
9480
  position: z21.string().nullable().optional(),
9132
9481
  opacity: z21.number().min(0).max(1).nullable().optional(),
9482
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9133
9483
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9134
9484
  textColor: z21.string().nullable().optional(),
9135
9485
  headingColor: z21.string().nullable().optional()
@@ -9137,7 +9487,7 @@ var boxBackgroundSchema = z21.object({
9137
9487
  var sectionStylesOverrideSchema = z21.object({
9138
9488
  background: boxBackgroundSchema.nullable().optional(),
9139
9489
  spacing: semanticSpacingSchema.nullable().optional(),
9140
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9490
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9141
9491
  });
9142
9492
  var containerStylesOverrideSchema = z21.object({
9143
9493
  background: boxBackgroundSchema.nullable().optional(),
@@ -9156,7 +9506,8 @@ var cardStylesOverrideSchema = z21.object({
9156
9506
  border: cardBorderOverrideSchema.nullable().optional(),
9157
9507
  spacing: semanticSpacingSchema.nullable().optional(),
9158
9508
  raised: z21.boolean().nullable().optional(),
9159
- rounded: boxRoundedSchema.nullable().optional()
9509
+ rounded: boxRoundedSchema.nullable().optional(),
9510
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9160
9511
  });
9161
9512
  var blockStyleOverridesSchema = z21.object({
9162
9513
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9231,15 +9582,7 @@ var inputStyle = z21.object({
9231
9582
  });
9232
9583
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9233
9584
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9234
- var headerNavStyle = z21.enum([
9235
- "minimal",
9236
- "underline",
9237
- "underline-grow",
9238
- "capsule",
9239
- "scale",
9240
- "frosted",
9241
- "solid"
9242
- ]);
9585
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9243
9586
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9244
9587
  var headerMaxWidth = z21.enum(["container", "full"]);
9245
9588
  var headerContainerSchema = z21.object({
@@ -9293,6 +9636,7 @@ var dropdownStyleSchema = z21.object({
9293
9636
  // optional = no override (browser default)
9294
9637
  }).optional();
9295
9638
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9639
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9296
9640
  var navContainerSchema = z21.object({
9297
9641
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9298
9642
  tint: z21.string().nullable().optional(),
@@ -9311,7 +9655,10 @@ var headerSchema = z21.object({
9311
9655
  shrinkOnScroll: z21.boolean(),
9312
9656
  maxWidth: headerMaxWidth,
9313
9657
  logoOverride: mediaSchema.nullable().optional(),
9314
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9658
+ background: headerBackgroundSchema.default({
9659
+ type: "color",
9660
+ color: "surface"
9661
+ }),
9315
9662
  textColor: z21.string().nullable().optional(),
9316
9663
  // Site title and general header text
9317
9664
  navStyle: headerNavStyle,
@@ -9331,6 +9678,13 @@ var headerSchema = z21.object({
9331
9678
  navLinkStyle: navLinkStyleSchema.optional(),
9332
9679
  // CTA button spacing (desktop left margin)
9333
9680
  ctaGap: headerCtaGapSchema.optional(),
9681
+ // Semantic CTA treatment for header/nav CTA buttons. The Theme V2 compiler
9682
+ // materializes this to ctaVariant against the active button personality.
9683
+ ctaTreatment: headerCtaTreatmentSchema.optional(),
9684
+ // Optional theme-level CTA variant for header/nav CTA buttons.
9685
+ // Internal runtime bridge for the block renderer; prefer ctaTreatment in
9686
+ // authored Theme V2 concepts.
9687
+ ctaVariant: z21.string().min(1).optional(),
9334
9688
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9335
9689
  dropdownStyle: dropdownStyleSchema
9336
9690
  });
@@ -9387,7 +9741,10 @@ var footerSchema = z21.object({
9387
9741
  variant: footerVariant,
9388
9742
  maxWidth: footerMaxWidth,
9389
9743
  showLogoText: z21.boolean().optional(),
9390
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9744
+ background: headerBackgroundSchema.default({
9745
+ type: "color",
9746
+ color: "surface"
9747
+ }),
9391
9748
  // Footer nav styling (independent from header)
9392
9749
  navStyle: headerNavStyle.default("minimal"),
9393
9750
  navColor: z21.string().nullable().optional(),
@@ -9409,17 +9766,7 @@ var layoutSchema = z21.object({
9409
9766
  desktop: containerPaddingPresetSchema.optional()
9410
9767
  }).optional()
9411
9768
  }).optional();
9412
- var heroTypographySizeSchema = z21.enum([
9413
- "sm",
9414
- "base",
9415
- "lg",
9416
- "xl",
9417
- "2xl",
9418
- "3xl",
9419
- "4xl",
9420
- "5xl",
9421
- "6xl"
9422
- ]);
9769
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9423
9770
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9424
9771
  var heroResponsiveTypographySchema = z21.object({
9425
9772
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9444,6 +9791,13 @@ var heroTypographySchema = z21.object({
9444
9791
  var heroSchema = z21.object({
9445
9792
  typography: heroTypographySchema.optional()
9446
9793
  }).optional();
9794
+ var bodyTextIntroTypographySizeSchema = z21.enum(["default", "editorial"]);
9795
+ var bodyTextSchema = z21.object({
9796
+ intro: z21.object({
9797
+ paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
9798
+ headingSize: bodyTextIntroTypographySizeSchema.optional()
9799
+ }).optional()
9800
+ }).optional();
9447
9801
  var gradientsSchema = z21.object({
9448
9802
  button: z21.string().min(1).nullable().optional(),
9449
9803
  hero: z21.string().min(1).nullable().optional(),
@@ -9465,6 +9819,7 @@ var themeSchema = z21.object({
9465
9819
  gradients: gradientsSchema.optional(),
9466
9820
  layout: layoutSchema,
9467
9821
  hero: heroSchema,
9822
+ bodyText: bodyTextSchema,
9468
9823
  header: headerSchema,
9469
9824
  footer: footerSchema,
9470
9825
  buttons: buttonSystemSchema.optional(),
@@ -9488,10 +9843,7 @@ var themeSchema = z21.object({
9488
9843
  ).optional(),
9489
9844
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9490
9845
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9491
- blockOverrides: z21.record(
9492
- z21.string(),
9493
- blockThemeOverrideSchema
9494
- ).optional(),
9846
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9495
9847
  // Structured custom CSS rules
9496
9848
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9497
9849
  customCssRules: customCssRulesSchema,
@@ -9662,6 +10014,28 @@ var brandLedJewel = definePaletteVariant({
9662
10014
  { name: "border", hex: "#a8a29e" }
9663
10015
  ]
9664
10016
  });
10017
+ var brandLedBurgundyGold = definePaletteVariant({
10018
+ id: "brand-led-burgundy-gold",
10019
+ name: "Brand-led \u2014 Burgundy Gold",
10020
+ description: "Deep burgundy with warm gold accents and soft neutral grounds.",
10021
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
10022
+ mode: "light",
10023
+ colors: [
10024
+ { name: "primary", hex: "#7c2e38" },
10025
+ { name: "secondary", hex: "#d4af37" },
10026
+ { name: "accent", hex: "#b8e19a" },
10027
+ { name: "success", hex: "#10b981" },
10028
+ { name: "warning", hex: "#f59e0b" },
10029
+ { name: "destructive", hex: "#ef4444" },
10030
+ { name: "background", hex: "#f1dfd0" },
10031
+ { name: "surface", hex: "#f5e6db" },
10032
+ { name: "surfaceAlt", hex: "#f8ece3" },
10033
+ { name: "muted", hex: "#c9b8a8" },
10034
+ { name: "text", hex: "#400000" },
10035
+ { name: "primaryForeground", hex: "#ffffff" },
10036
+ { name: "border", hex: "#c9b8a8" }
10037
+ ]
10038
+ });
9665
10039
 
9666
10040
  // ../theme-core/src/palette/variants/high-contrast.ts
9667
10041
  var highContrastInk = definePaletteVariant({
@@ -9873,6 +10247,7 @@ var paletteVariants = [
9873
10247
  brandLedCool,
9874
10248
  brandLedWarm,
9875
10249
  brandLedJewel,
10250
+ brandLedBurgundyGold,
9876
10251
  // Warm-neutral family
9877
10252
  warmNeutralClay,
9878
10253
  warmNeutralCream,
@@ -9948,7 +10323,8 @@ var curatedSiteStyleIdValues = [
9948
10323
  "site-style:quiet-luxury",
9949
10324
  "site-style:practical-services",
9950
10325
  "site-style:modern-wellness",
9951
- "site-style:bold-launch"
10326
+ "site-style:bold-launch",
10327
+ "site-style:south-west-twerk-school"
9952
10328
  ];
9953
10329
  var quietBudget = {
9954
10330
  accentDensity: "low",
@@ -10003,6 +10379,8 @@ function defineCuratedSiteStyle(input) {
10003
10379
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
10004
10380
  supportedTransitions: generatedDesignOptionCatalog.transitions
10005
10381
  },
10382
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10383
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
10006
10384
  buttonPersonalityChoices: input.buttonPersonalityChoices,
10007
10385
  paletteVariantChoices: input.paletteVariantChoices
10008
10386
  };
@@ -10249,6 +10627,101 @@ var curatedSiteStyles = [
10249
10627
  paletteChoice("brand-led-jewel"),
10250
10628
  paletteChoice("brand-led-warm")
10251
10629
  ]
10630
+ }),
10631
+ defineCuratedSiteStyle({
10632
+ id: "site-style:south-west-twerk-school",
10633
+ name: "South West Twerk School",
10634
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
10635
+ 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.",
10636
+ selectionKeywords: [
10637
+ "dance",
10638
+ "classes",
10639
+ "workshop",
10640
+ "school",
10641
+ "movement",
10642
+ "performance",
10643
+ "community"
10644
+ ],
10645
+ tokenRecipes: {
10646
+ palette: "brand-led",
10647
+ contrast: "maximum",
10648
+ radius: "soft",
10649
+ shadow: "layered",
10650
+ typography: "clean-sans",
10651
+ spacing: "airy",
10652
+ motion: "expressive"
10653
+ },
10654
+ compositionBudget: expressiveBudget,
10655
+ themeOverrides: {
10656
+ typography: {
10657
+ body: {
10658
+ family: "Manrope, system-ui, sans-serif",
10659
+ size: "lg",
10660
+ weight: "regular",
10661
+ lineHeight: "relaxed",
10662
+ letterSpacing: "normal"
10663
+ },
10664
+ headings: {
10665
+ default: {
10666
+ family: '"TAN - PEARL", sans-serif',
10667
+ weight: "bold",
10668
+ lineHeight: "normal",
10669
+ letterSpacing: "tight",
10670
+ colorToken: "primary",
10671
+ italic: null,
10672
+ case: null
10673
+ },
10674
+ h1: {
10675
+ size: "xl",
10676
+ weight: "bold",
10677
+ lineHeight: "normal",
10678
+ letterSpacing: "tight",
10679
+ italic: null
10680
+ },
10681
+ h2: {
10682
+ size: "lg",
10683
+ weight: "bold",
10684
+ lineHeight: "normal",
10685
+ letterSpacing: "normal",
10686
+ italic: null
10687
+ },
10688
+ h3: {
10689
+ size: "md",
10690
+ weight: "bold",
10691
+ lineHeight: "normal",
10692
+ letterSpacing: "normal",
10693
+ italic: null
10694
+ }
10695
+ },
10696
+ scale: "balanced"
10697
+ },
10698
+ bodyText: {
10699
+ intro: {
10700
+ paragraphSize: "editorial",
10701
+ headingSize: "editorial"
10702
+ }
10703
+ }
10704
+ },
10705
+ recommendedAppearancePresetIds: [
10706
+ "site-header-brand-solid-inverted-cta",
10707
+ "site-footer-brand-two-band",
10708
+ "hero-brand-scrim-fixed-frame",
10709
+ "body-text-editorial-intro",
10710
+ "testimonials-accent-quote-proof",
10711
+ "contact-form-dark-card"
10712
+ ],
10713
+ buttonPersonalityChoices: [
10714
+ buttonChoice("showtime-pill"),
10715
+ buttonChoice("confident-chip"),
10716
+ buttonChoice("ink-stamp"),
10717
+ buttonChoice("brushed-wash")
10718
+ ],
10719
+ paletteVariantChoices: [
10720
+ paletteChoice("brand-led-burgundy-gold"),
10721
+ paletteChoice("brand-led-jewel"),
10722
+ paletteChoice("brand-led-warm"),
10723
+ paletteChoice("high-contrast-ink")
10724
+ ]
10252
10725
  })
10253
10726
  ];
10254
10727
  var curatedSiteStylesById = new Map(
@@ -10293,6 +10766,40 @@ var heroLegibilityStrategySchema = z23.enum([
10293
10766
  "scrim-gradient",
10294
10767
  "solid-panel"
10295
10768
  ]);
10769
+ var sectionHeightIntentSchema = z23.enum([
10770
+ "default",
10771
+ "banner",
10772
+ "hero",
10773
+ "immersive"
10774
+ ]);
10775
+ var imageSurfaceTreatmentIntensitySchema = z23.enum(["soft", "balanced", "strong"]);
10776
+ var imageSurfaceMotionSchema = z23.enum(["static", "fixed-frame"]);
10777
+ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
10778
+ z23.object({ kind: z23.literal("none") }).strict(),
10779
+ z23.object({
10780
+ kind: z23.literal("brand-scrim"),
10781
+ token: z23.enum(["primary", "secondary", "accent"]),
10782
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10783
+ }).strict(),
10784
+ z23.object({
10785
+ kind: z23.literal("brand-wash"),
10786
+ token: z23.enum(["primary", "secondary", "accent"]),
10787
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10788
+ }).strict(),
10789
+ z23.object({
10790
+ kind: z23.literal("neutral-scrim"),
10791
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10792
+ }).strict(),
10793
+ z23.object({
10794
+ kind: z23.literal("neutral-wash"),
10795
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10796
+ }).strict(),
10797
+ z23.object({
10798
+ kind: z23.literal("solid-panel"),
10799
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
10800
+ }).strict()
10801
+ ]);
10802
+ var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
10296
10803
  function uniqueNonEmpty(values) {
10297
10804
  const uniqueValues = [...new Set(values)];
10298
10805
  const firstValue = uniqueValues[0];
@@ -10331,7 +10838,11 @@ var blockDesignPlanSchema = z23.object({
10331
10838
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10332
10839
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10333
10840
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10334
- heroLegibility: heroLegibilityStrategySchema.optional()
10841
+ sectionHeight: sectionHeightIntentSchema.optional(),
10842
+ heroLegibility: heroLegibilityStrategySchema.optional(),
10843
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
10844
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
10845
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10335
10846
  }).strict();
10336
10847
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10337
10848
  z23.object({
@@ -11757,6 +12268,7 @@ var SEMANTIC_SPACING_VALUES = [
11757
12268
  ];
11758
12269
  var SECTION_MIN_HEIGHT_VALUES = [
11759
12270
  "none",
12271
+ "banner",
11760
12272
  "hero",
11761
12273
  "immersive"
11762
12274
  ];
@@ -11784,6 +12296,7 @@ var CONTAINER_SPACING_MAP = {
11784
12296
  };
11785
12297
  var SECTION_MIN_HEIGHT_MAP = {
11786
12298
  none: "",
12299
+ banner: "rb-section-min-h-banner",
11787
12300
  hero: "rb-section-min-h-hero",
11788
12301
  immersive: "rb-section-min-h-immersive"
11789
12302
  };
@@ -12574,6 +13087,9 @@ var boxStylesCompositeTransform = {
12574
13087
  classes.push(roundedResult);
12575
13088
  }
12576
13089
  }
13090
+ if (input.treatment === "accent-quote") {
13091
+ classes.push("rb-card-treatment-accent-quote");
13092
+ }
12577
13093
  return classes.join(" ").trim() || "";
12578
13094
  }
12579
13095
  };
@@ -12671,7 +13187,7 @@ var sectionClassNameTransform = {
12671
13187
  minHeight = input.minHeight;
12672
13188
  } else if (process.env.NODE_ENV !== "production") {
12673
13189
  console.warn(
12674
- `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, hero, immersive.`
13190
+ `[sectionStyles] Invalid minHeight value in _sectionStyles: "${input.minHeight}". Expected one of: none, banner, hero, immersive.`
12675
13191
  );
12676
13192
  }
12677
13193
  }
@@ -12994,23 +13510,6 @@ function styledCard(children, opts, ...mods) {
12994
13510
  );
12995
13511
  }
12996
13512
 
12997
- // ../blocks/src/system/node/fragments/typography.ts
12998
- function mergeClassName(base, extra) {
12999
- return [base, extra ?? ""].filter(Boolean).join(" ");
13000
- }
13001
- function captionText(opts, ...mods) {
13002
- const {
13003
- as: asProp,
13004
- className: classNameProp,
13005
- color,
13006
- ...rest
13007
- } = opts ?? {};
13008
- const as = asProp ?? "p";
13009
- const className = mergeClassName("rb-caption", classNameProp);
13010
- const style = textColorStyle(color ?? "mutedText");
13011
- return text({ ...rest, as, className, style }, ...mods);
13012
- }
13013
-
13014
13513
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
13015
13514
  function joinClasses(...parts) {
13016
13515
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -13915,18 +14414,17 @@ function buildAttributionNodes() {
13915
14414
  const name = text(
13916
14415
  {
13917
14416
  as: "strong",
13918
- className: "rb-block",
13919
- style: textColorStyle("text")
14417
+ className: "rb-block"
13920
14418
  },
13921
14419
  bind("testimonial.content.name", { fallback: "Anonymous" })
13922
14420
  );
13923
- const jobTitle = captionText(
13924
- null,
14421
+ const jobTitle = text(
14422
+ { as: "p", className: "rb-caption" },
13925
14423
  when("testimonial.content.jobTitle"),
13926
14424
  bind("testimonial.content.jobTitle")
13927
14425
  );
13928
- const company = captionText(
13929
- null,
14426
+ const company = text(
14427
+ { as: "p", className: "rb-caption" },
13930
14428
  when("testimonial.content.company"),
13931
14429
  bind("testimonial.content.company")
13932
14430
  );
@@ -13960,8 +14458,7 @@ function buildTestimonialCard(...mods) {
13960
14458
  );
13961
14459
  const body = richText(
13962
14460
  {
13963
- className: "rb-prose rb-max-w-none",
13964
- style: textColorStyle("text")
14461
+ className: "rb-prose rb-max-w-none"
13965
14462
  },
13966
14463
  bind("testimonial.content.body"),
13967
14464
  when("testimonial.content.body")
@@ -15591,6 +16088,7 @@ function heroContentCard(children, gap) {
15591
16088
  return styledContainer({
15592
16089
  bindFrom: "_contentCardStyles",
15593
16090
  constrainWidth: false,
16091
+ baseClassName: "rb-relative rb-isolate",
15594
16092
  rootType: "stack",
15595
16093
  rootProps: {
15596
16094
  gap
@@ -15621,6 +16119,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15621
16119
  function heroContainerStack(children, gap) {
15622
16120
  return styledContainer({
15623
16121
  rootType: "stack",
16122
+ baseClassName: "rb-relative rb-isolate",
15624
16123
  rootProps: {
15625
16124
  gap: "none",
15626
16125
  justify: {
@@ -16839,7 +17338,7 @@ function resolveHeroVerticalAlignment(content) {
16839
17338
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
16840
17339
  const sectionStyles = asPartialObject(content._sectionStyles);
16841
17340
  const minHeight = sectionStyles?.minHeight;
16842
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17341
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
16843
17342
  const variant = resolveHeroVariant(content);
16844
17343
  if (variant === "split" || variant === "splitReverse") return "center";
16845
17344
  return "top";
@@ -17597,6 +18096,26 @@ var footerSplitNavSingleClassTransform = {
17597
18096
  ]);
17598
18097
  }
17599
18098
  };
18099
+ var footerSplitMainClassSchema = z35.object({
18100
+ base: z35.string().optional(),
18101
+ reverseClass: z35.string().optional()
18102
+ });
18103
+ var footerSplitMainClassTransform = {
18104
+ id: "layout.footerSplitMainClass",
18105
+ kind: "string",
18106
+ summary: "Compose split-footer main row classes from footer logo placement",
18107
+ schema: footerSplitMainClassSchema,
18108
+ run: (value, options) => {
18109
+ const logo = asPartialObject(value);
18110
+ const placement = logo?.placement ?? "right";
18111
+ const shouldPlaceLogoFirst = placement === "left" || placement === "above";
18112
+ 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";
18113
+ return joinClasses4([
18114
+ options.base ?? baseClass,
18115
+ shouldPlaceLogoFirst ? options.reverseClass ?? "rb-md-flex-row-reverse" : null
18116
+ ]);
18117
+ }
18118
+ };
17600
18119
  var footerLogoClassSchema = z35.object({
17601
18120
  base: z35.string().optional()
17602
18121
  });
@@ -17607,14 +18126,11 @@ var footerLogoClassTransform = {
17607
18126
  schema: footerLogoClassSchema,
17608
18127
  run: (value, options) => {
17609
18128
  const logo = asPartialObject(value);
17610
- const placement = logo?.placement ?? "right";
17611
18129
  const align = logo?.align ?? "end";
17612
18130
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17613
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17614
18131
  const selfAlignClass = align === "start" ? "rb-self-start rb-text-left" : align === "center" ? "rb-self-center rb-text-center" : "rb-self-end rb-text-right";
17615
18132
  return joinClasses4([
17616
18133
  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",
17617
- orderClass,
17618
18134
  selfAlignClass,
17619
18135
  hiddenClass
17620
18136
  ]);
@@ -17669,6 +18185,7 @@ var layoutTransforms = [
17669
18185
  footerBottomBarContainerClassTransform,
17670
18186
  footerBottomBarStyleTransform,
17671
18187
  footerSplitNavSingleClassTransform,
18188
+ footerSplitMainClassTransform,
17672
18189
  footerLogoClassTransform,
17673
18190
  footerLogoMediaClassTransform,
17674
18191
  footerLogoTextVisibleTransform
@@ -17945,7 +18462,7 @@ var createNavRow = (className, align = "end") => navRow({
17945
18462
  var headerCta = ctaButton({
17946
18463
  basePath: "menu.ctaItem",
17947
18464
  whenPath: "menu.ctaItem.label",
17948
- variantPath: "menu.ctaItem.variant",
18465
+ variantPath: "$root.theme.header.ctaVariant",
17949
18466
  linkPath: "menu.ctaItem.link",
17950
18467
  sizeFallback: "sm",
17951
18468
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -17953,7 +18470,7 @@ var headerCta = ctaButton({
17953
18470
  var mobileCta = ctaButton({
17954
18471
  basePath: "menu.ctaItem",
17955
18472
  whenPath: "menu.ctaItem.label",
17956
- variantPath: "menu.ctaItem.variant",
18473
+ variantPath: "$root.theme.header.ctaVariant",
17957
18474
  linkPath: "menu.ctaItem.link",
17958
18475
  sizeFallback: "md",
17959
18476
  className: "nav-mobile-cta rb-w-full"
@@ -18414,7 +18931,13 @@ var splitFooterLayout = stack(
18414
18931
  [
18415
18932
  inline(
18416
18933
  {
18417
- 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"
18934
+ className: {
18935
+ $bind: {
18936
+ from: "$root.theme.footer.logo",
18937
+ transforms: [{ id: "layout.footerSplitMainClass" }],
18938
+ 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"
18939
+ }
18940
+ }
18418
18941
  },
18419
18942
  [
18420
18943
  stack(
@@ -20502,7 +21025,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20502
21025
  run: z47.object({
20503
21026
  courseId: z47.string(),
20504
21027
  seriesId: z47.string(),
20505
- runSlug: z47.string()
21028
+ runSlug: z47.string(),
21029
+ runName: z47.string().nullable()
20506
21030
  })
20507
21031
  }),
20508
21032
  z47.object({
@@ -26449,6 +26973,34 @@ function panelCapable() {
26449
26973
  itemSurfaces: "unsupported"
26450
26974
  });
26451
26975
  }
26976
+ var heroSectionHeights = [
26977
+ "default",
26978
+ "banner",
26979
+ "hero",
26980
+ "immersive"
26981
+ ];
26982
+ var heroImageSurfaceTreatments = [
26983
+ "none",
26984
+ "brand-scrim",
26985
+ "brand-wash",
26986
+ "neutral-scrim",
26987
+ "neutral-wash",
26988
+ "solid-panel"
26989
+ ];
26990
+ var heroImageSurfaceMotions = [
26991
+ "static",
26992
+ "fixed-frame"
26993
+ ];
26994
+ function heroCapable() {
26995
+ return declareBlockDesignCapability({
26996
+ sectionSurfaces: "supported",
26997
+ contentFrames: ["plain", "panel"],
26998
+ itemSurfaces: "unsupported",
26999
+ sectionHeights: heroSectionHeights,
27000
+ imageSurfaceTreatments: heroImageSurfaceTreatments,
27001
+ imageSurfaceMotions: heroImageSurfaceMotions
27002
+ });
27003
+ }
26452
27004
  function plainItemsCapable() {
26453
27005
  return declareBlockDesignCapability({
26454
27006
  sectionSurfaces: "supported",
@@ -26565,7 +27117,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26565
27117
  };
26566
27118
  }
26567
27119
  var systemBlockDefinitionsRaw = [
26568
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27120
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26569
27121
  flow: heroFlow,
26570
27122
  layoutProfiles: [
26571
27123
  layoutProfile({
@@ -26669,7 +27221,12 @@ var systemBlockDefinitionsRaw = [
26669
27221
  flow: siteChromeFlow,
26670
27222
  layoutProfiles: []
26671
27223
  })),
26672
- withDesignCapability("block.testimonials", testimonialsBlockDefinition, panelAndItemsCapable(), defineBlockDesignMetadata({
27224
+ withDesignCapability("block.testimonials", testimonialsBlockDefinition, declareBlockDesignCapability({
27225
+ sectionSurfaces: "supported",
27226
+ contentFrames: ["plain", "panel"],
27227
+ itemSurfaces: "supported",
27228
+ testimonialCardTreatments: ["default", "accent-quote"]
27229
+ }), defineBlockDesignMetadata({
26673
27230
  flow: proofFlow,
26674
27231
  layoutProfiles: [
26675
27232
  layoutProfile({
@@ -26981,8 +27538,15 @@ function parseOpacity(value) {
26981
27538
  }
26982
27539
  return opacity <= 1 ? opacity : opacity / 100;
26983
27540
  }
26984
- function appendOptionalClasses(baseClassName, optionalClassName) {
26985
- return optionalClassName ? `${baseClassName} ${optionalClassName}` : baseClassName;
27541
+ function backgroundMotionClassNames(input) {
27542
+ return input.motion === "fixed-frame" ? "rb-bg-motion-fixed-frame" : "";
27543
+ }
27544
+ function appendBackgroundMediaClasses(baseClassName, input) {
27545
+ return [
27546
+ baseClassName,
27547
+ backgroundMotionClassNames(input),
27548
+ backgroundVideoMobileClassNames(input)
27549
+ ].filter(Boolean).join(" ");
26986
27550
  }
26987
27551
  var resolveImageStyleTransform = {
26988
27552
  id: "background.resolveImageStyle",
@@ -27059,9 +27623,9 @@ var resolveImageClassNameTransform = {
27059
27623
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
27060
27624
  const position = isString(input.position) ? input.position.trim() : null;
27061
27625
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
27062
- return appendOptionalClasses(
27626
+ return appendBackgroundMediaClasses(
27063
27627
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
27064
- backgroundVideoMobileClassNames(input)
27628
+ input
27065
27629
  );
27066
27630
  }
27067
27631
  let needsAnchoring = false;
@@ -27074,18 +27638,18 @@ var resolveImageClassNameTransform = {
27074
27638
  }
27075
27639
  }
27076
27640
  if (!needsAnchoring) {
27077
- return appendOptionalClasses(
27641
+ return appendBackgroundMediaClasses(
27078
27642
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
27079
- backgroundVideoMobileClassNames(input)
27643
+ input
27080
27644
  );
27081
27645
  }
27082
27646
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
27083
27647
  const isCustom = position && !isPreset;
27084
27648
  if (isCustom) {
27085
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27649
+ return appendBackgroundMediaClasses(baseClass, input);
27086
27650
  }
27087
27651
  const anchorClasses = getAnchorClasses(position);
27088
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27652
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
27089
27653
  }
27090
27654
  };
27091
27655
  var resolveOverlayStyleTransform = {