@riverbankcms/sdk 0.60.11 → 0.60.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +10 -7
  2. package/dist/_dts/api/src/accessAdmin.d.ts +102 -0
  3. package/dist/_dts/api/src/bookingConfig.d.ts +31 -1
  4. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +38 -1
  5. package/dist/_dts/api/src/bookingOperations.d.ts +3 -0
  6. package/dist/_dts/api/src/bookingRecords.d.ts +45 -0
  7. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +4 -4
  8. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +1 -5
  9. package/dist/_dts/api/src/common/envelope.d.ts +1 -1
  10. package/dist/_dts/api/src/communications.d.ts +1 -1
  11. package/dist/_dts/api/src/contentRuntime.d.ts +1 -1
  12. package/dist/_dts/api/src/domains.d.ts +14 -13
  13. package/dist/_dts/api/src/endpoints.d.ts +121 -9
  14. package/dist/_dts/api/src/index.d.ts +3 -2
  15. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +1 -0
  16. package/dist/_dts/api/src/seoEndpoints.d.ts +2 -0
  17. package/dist/_dts/api/src/siteAssets.d.ts +0 -10
  18. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +15 -1
  19. package/dist/_dts/api/src/types.d.ts +1 -1
  20. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  21. package/dist/_dts/blocks/src/index.d.ts +1 -0
  22. package/dist/_dts/blocks/src/portal/types.d.ts +1 -1
  23. package/dist/_dts/blocks/src/server.d.ts +1 -0
  24. package/dist/_dts/blocks/src/subroutes/fold.d.ts +40 -0
  25. package/dist/_dts/blocks/src/subroutes/formatDate.d.ts +12 -0
  26. package/dist/_dts/blocks/src/subroutes/index.d.ts +3 -0
  27. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +32 -0
  28. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +3 -1
  29. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +2 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +1 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/spacing.d.ts +2 -1
  33. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +5 -0
  34. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +5 -1
  35. package/dist/_dts/core/src/booking-refunds.d.ts +8 -0
  36. package/dist/_dts/core/src/participant-identity.d.ts +1 -1
  37. package/dist/_dts/core/src/participants.d.ts +19 -7
  38. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +284 -96
  39. package/dist/_dts/db/src/schemas/forms.d.ts +135 -24
  40. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -3
  41. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +3 -3
  42. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +3 -3
  43. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +3 -3
  44. package/dist/_dts/preview-next/src/client/preview/SubrouteNoticePanel.d.ts +13 -0
  45. package/dist/_dts/preview-next/src/client/preview/subrouteNotice.d.ts +26 -0
  46. package/dist/_dts/sdk/src/contracts/page.d.ts +1 -0
  47. package/dist/_dts/sdk/src/public-api/contracts.d.ts +2 -1
  48. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -0
  49. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +4 -5
  50. package/dist/_dts/sdk/src/version.d.ts +1 -1
  51. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  52. package/dist/_dts/theme-core/src/buttons/personalities/showtime-pill.d.ts +17 -0
  53. package/dist/_dts/theme-core/src/buttons/types.d.ts +1 -1
  54. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  55. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +66 -30
  56. package/dist/_dts/theme-core/src/palette/variants/brand-led.d.ts +16 -0
  57. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  58. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  59. package/dist/_dts/theme-core/src/schema.d.ts +174 -6
  60. package/dist/_dts/theme-core/src/site-styles/appearancePresets.d.ts +328 -15
  61. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +54 -2
  62. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +124 -0
  63. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  64. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  65. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +21 -0
  66. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +2 -1
  67. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  68. package/dist/_dts/theme-core/src/site-styles/types.d.ts +135 -2
  69. package/dist/_dts/ui/src/badge.d.ts +1 -1
  70. package/dist/_dts/ui/src/button.d.ts +1 -1
  71. package/dist/cli/index.mjs +801 -115
  72. package/dist/client/bookings.mjs +115 -1
  73. package/dist/client/client.mjs +905 -166
  74. package/dist/client/hooks.mjs +794 -111
  75. package/dist/client/rendering/client.mjs +179 -39
  76. package/dist/client/rendering/islands.mjs +179 -38
  77. package/dist/client/rendering.mjs +904 -165
  78. package/dist/preview-next/before-render.mjs +160 -16
  79. package/dist/preview-next/client/runtime.mjs +1674 -260
  80. package/dist/preview-next/middleware.mjs +160 -16
  81. package/dist/server/components.mjs +895 -165
  82. package/dist/server/config-validation.mjs +794 -111
  83. package/dist/server/config.mjs +794 -111
  84. package/dist/server/data.mjs +794 -111
  85. package/dist/server/index.mjs +163 -17
  86. package/dist/server/next.mjs +898 -167
  87. package/dist/server/page-converter.mjs +589 -82
  88. package/dist/server/prebuild.mjs +1 -1
  89. package/dist/server/rendering/server.mjs +895 -165
  90. package/dist/server/rendering.mjs +895 -165
  91. package/dist/server/routing.mjs +828 -117
  92. package/dist/server/server.mjs +795 -112
  93. package/dist/server/theme-bridge.mjs +216 -39
  94. package/dist/server/theme.mjs +139 -37
  95. package/dist/styles/index.css +44 -2
  96. package/package.json +1 -1
@@ -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",
@@ -2062,6 +2071,63 @@ var ENDPOINT_DEFINITIONS = {
2062
2071
  auth: "user",
2063
2072
  responseKind: "json"
2064
2073
  },
2074
+ updateRegisteredDomainContact: {
2075
+ path: "/domains/{domainId}/registrar/contact",
2076
+ method: "POST",
2077
+ errors: [
2078
+ "validation:invalid_input",
2079
+ "resource:not_found",
2080
+ "auth:forbidden",
2081
+ "external:service_error",
2082
+ "external:registrar_orphaned_contact_profile",
2083
+ "server:internal_error"
2084
+ ],
2085
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2086
+ auth: "user",
2087
+ responseKind: "json"
2088
+ },
2089
+ setRegisteredDomainPrivacy: {
2090
+ path: "/domains/{domainId}/registrar/privacy",
2091
+ method: "POST",
2092
+ errors: [
2093
+ "validation:invalid_input",
2094
+ "resource:not_found",
2095
+ "auth:forbidden",
2096
+ "external:service_error",
2097
+ "server:internal_error"
2098
+ ],
2099
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2100
+ auth: "user",
2101
+ responseKind: "json"
2102
+ },
2103
+ setRegisteredDomainAutoRenew: {
2104
+ path: "/domains/{domainId}/registrar/auto-renew",
2105
+ method: "POST",
2106
+ errors: [
2107
+ "validation:invalid_input",
2108
+ "resource:not_found",
2109
+ "auth:forbidden",
2110
+ "external:service_error",
2111
+ "server:internal_error"
2112
+ ],
2113
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2114
+ auth: "user",
2115
+ responseKind: "json"
2116
+ },
2117
+ getRegisteredDomainRenewalPosture: {
2118
+ path: "/domains/{domainId}/registrar/renewal",
2119
+ method: "GET",
2120
+ errors: [
2121
+ "validation:invalid_input",
2122
+ "resource:not_found",
2123
+ "auth:forbidden",
2124
+ "external:service_error",
2125
+ "server:internal_error"
2126
+ ],
2127
+ tags: ["domains", "domain-{domainId}", "domain-registrar"],
2128
+ auth: "user",
2129
+ responseKind: "json"
2130
+ },
2065
2131
  retryDomainVercel: {
2066
2132
  path: "/domains/{domainId}/vercel",
2067
2133
  method: "POST",
@@ -2609,6 +2675,14 @@ var ENDPOINT_DEFINITIONS = {
2609
2675
  auth: "user",
2610
2676
  responseKind: "json"
2611
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
+ },
2612
2686
  getSeoQueries: {
2613
2687
  path: "/sites/{siteId}/seo/queries",
2614
2688
  method: "GET",
@@ -2617,6 +2691,14 @@ var ENDPOINT_DEFINITIONS = {
2617
2691
  auth: "user",
2618
2692
  responseKind: "json"
2619
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
+ },
2620
2702
  getPerformanceOverview: {
2621
2703
  path: "/sites/{siteId}/performance/overview",
2622
2704
  method: "GET",
@@ -2665,7 +2747,12 @@ var ENDPOINT_DEFINITIONS = {
2665
2747
  path: "/media/{assetId}/canonical-crop",
2666
2748
  method: "POST",
2667
2749
  tags: ["media", "media-{assetId}"],
2668
- 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
+ ],
2669
2756
  auth: "user",
2670
2757
  responseKind: "json"
2671
2758
  },
@@ -2997,7 +3084,7 @@ var ENDPOINT_DEFINITIONS = {
2997
3084
  method: "GET",
2998
3085
  tags: [TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug],
2999
3086
  auth: "user",
3000
- responseKind: "text"
3087
+ responseKind: "blob"
3001
3088
  },
3002
3089
  // Public submit
3003
3090
  submitForm: {
@@ -3880,6 +3967,14 @@ var ENDPOINT_DEFINITIONS = {
3880
3967
  auth: "user",
3881
3968
  responseKind: "json"
3882
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
+ },
3883
3978
  listEventSeriesWaitlist: {
3884
3979
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
3885
3980
  method: "GET",
@@ -4443,6 +4538,14 @@ var ENDPOINT_DEFINITIONS = {
4443
4538
  auth: "user",
4444
4539
  responseKind: "json"
4445
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
+ },
4446
4549
  createBookingCustomer: {
4447
4550
  path: "/sites/{siteId}/bookings/customers",
4448
4551
  method: "POST",
@@ -4470,6 +4573,21 @@ var ENDPOINT_DEFINITIONS = {
4470
4573
  "server:internal_error"
4471
4574
  ]
4472
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
+ },
4473
4591
  listCustomerPasses: {
4474
4592
  path: "/sites/{siteId}/bookings/customers/{customerId}/passes",
4475
4593
  method: "GET",
@@ -4604,13 +4722,46 @@ var ENDPOINT_DEFINITIONS = {
4604
4722
  auth: "user",
4605
4723
  responseKind: "json"
4606
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
+ },
4607
4749
  listBookingActivity: {
4608
4750
  path: "/sites/{siteId}/bookings/activity",
4609
4751
  method: "GET",
4610
4752
  tags: ["site-{siteId}", "bookings", "activity-{siteId}"],
4753
+ errors: [],
4611
4754
  auth: "user",
4612
4755
  responseKind: "json"
4613
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
+ },
4614
4765
  // Site logs
4615
4766
  listSiteActivityLogs: {
4616
4767
  path: "/sites/{siteId}/logs/activity",
@@ -4762,13 +4913,6 @@ var ENDPOINT_DEFINITIONS = {
4762
4913
  auth: "user",
4763
4914
  responseKind: "blob"
4764
4915
  },
4765
- exportSeoCsv: {
4766
- path: "/sites/{siteId}/seo/export",
4767
- method: "GET",
4768
- tags: ["site-{siteId}", "seo"],
4769
- auth: "user",
4770
- responseKind: "blob"
4771
- },
4772
4916
  // Admin site cost (for admin panel)
4773
4917
  adminSiteCost: {
4774
4918
  path: "/admin/sites/{siteId}/cost",
@@ -6907,6 +7051,8 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
6907
7051
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
6908
7052
  "missing_amount",
6909
7053
  "amount_exceeds_remaining",
7054
+ "credit_refunds_disabled",
7055
+ "missing_credit_customer",
6910
7056
  "deposit_refund_override_required",
6911
7057
  "refund_revoke_requires_full_line_refund",
6912
7058
  "unified_order_link_required"
@@ -7526,12 +7672,29 @@ function defineFrameCapability(capability) {
7526
7672
  function defineBlockDesignCapability(capability) {
7527
7673
  return {
7528
7674
  ...capability,
7529
- 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"]
7530
7680
  };
7531
7681
  }
7532
7682
 
7533
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
+ }
7534
7696
  function defineBlockAppearancePreset(preset2) {
7697
+ assertValidOptionGroups(preset2);
7535
7698
  return preset2;
7536
7699
  }
7537
7700
  function defineSiteChromeAppearancePreset(preset2) {
@@ -7544,13 +7707,122 @@ var appearancePresets = [
7544
7707
  target: "hero",
7545
7708
  label: "Immersive image hero",
7546
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
+ ],
7765
+ design: {
7766
+ sectionSurface: "hero-image",
7767
+ contentFrame: plainFrame,
7768
+ itemSurface: "none",
7769
+ transitionAfter: "soft-fade-short",
7770
+ emphasis: "high",
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
+ ],
7547
7817
  design: {
7548
7818
  sectionSurface: "hero-image",
7549
7819
  contentFrame: plainFrame,
7550
7820
  itemSurface: "none",
7551
7821
  transitionAfter: "soft-fade-short",
7552
7822
  emphasis: "high",
7553
- heroLegibility: "scrim-gradient"
7823
+ sectionHeight: "immersive",
7824
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7825
+ imageSurfaceMotion: "fixed-frame"
7554
7826
  }
7555
7827
  }),
7556
7828
  defineBlockAppearancePreset({
@@ -7567,17 +7839,26 @@ var appearancePresets = [
7567
7839
  emphasis: "high"
7568
7840
  }
7569
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
+ }),
7570
7856
  defineBlockAppearancePreset({
7571
7857
  kind: "block-design",
7572
7858
  id: "offerings-calm-list",
7573
7859
  target: "offerings",
7574
7860
  label: "Calm offerings list",
7575
- blockKinds: [
7576
- "block.event-listing",
7577
- "block.event-calendar",
7578
- "block.event-spotlight",
7579
- "block.product-list"
7580
- ],
7861
+ blockKinds: ["block.event-listing", "block.event-calendar", "block.event-spotlight", "block.product-list"],
7581
7862
  design: {
7582
7863
  sectionSurface: "muted-band",
7583
7864
  contentFrame: plainFrame,
@@ -7656,6 +7937,35 @@ var appearancePresets = [
7656
7937
  emphasis: "high"
7657
7938
  }
7658
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
+ }),
7659
7969
  defineBlockAppearancePreset({
7660
7970
  kind: "block-design",
7661
7971
  id: "faq-contained-help",
@@ -7684,6 +7994,20 @@ var appearancePresets = [
7684
7994
  emphasis: "medium"
7685
7995
  }
7686
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
+ }),
7687
8011
  defineBlockAppearancePreset({
7688
8012
  kind: "block-design",
7689
8013
  id: "cta-accent-band",
@@ -7703,9 +8027,33 @@ var appearancePresets = [
7703
8027
  id: "header-clean-base",
7704
8028
  target: "site-header",
7705
8029
  label: "Clean base header",
7706
- chrome: {
7707
- surface: "base",
7708
- 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"
7709
8057
  }
7710
8058
  }),
7711
8059
  defineSiteChromeAppearancePreset({
@@ -7713,10 +8061,31 @@ var appearancePresets = [
7713
8061
  id: "footer-muted-grounding",
7714
8062
  target: "site-footer",
7715
8063
  label: "Muted grounding footer",
7716
- chrome: {
8064
+ footer: {
8065
+ kind: "grounding",
7717
8066
  surface: "muted-band",
7718
8067
  emphasis: "low"
7719
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
+ }
7720
8089
  })
7721
8090
  ];
7722
8091
 
@@ -8376,6 +8745,111 @@ var pebble = defineButtonPersonality({
8376
8745
  }
8377
8746
  });
8378
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
+
8379
8853
  // ../theme-core/src/buttons/personalities/soft-pill.ts
8380
8854
  var softPill = defineButtonPersonality({
8381
8855
  id: "soft-pill",
@@ -8456,7 +8930,8 @@ var buttonPersonalities = [
8456
8930
  editorialLink,
8457
8931
  pebble,
8458
8932
  inkStamp,
8459
- brushedWash
8933
+ brushedWash,
8934
+ showtimePill
8460
8935
  ];
8461
8936
  var personalitiesById = new Map(
8462
8937
  buttonPersonalities.map((p) => [p.id, p])
@@ -8987,14 +9462,7 @@ var proseLinkStyleSchema = z21.object({
8987
9462
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
8988
9463
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
8989
9464
  });
8990
- var semanticSpacingSchema = z21.enum([
8991
- "none",
8992
- "compact",
8993
- "cozy",
8994
- "medium",
8995
- "comfortable",
8996
- "spacious"
8997
- ]);
9465
+ var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
8998
9466
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
8999
9467
  var boxBackgroundOverlaySchema = z21.object({
9000
9468
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -9011,6 +9479,7 @@ var boxBackgroundSchema = z21.object({
9011
9479
  scale: z21.string().nullable().optional(),
9012
9480
  position: z21.string().nullable().optional(),
9013
9481
  opacity: z21.number().min(0).max(1).nullable().optional(),
9482
+ motion: z21.enum(["static", "fixed-frame"]).nullable().optional(),
9014
9483
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9015
9484
  textColor: z21.string().nullable().optional(),
9016
9485
  headingColor: z21.string().nullable().optional()
@@ -9018,7 +9487,7 @@ var boxBackgroundSchema = z21.object({
9018
9487
  var sectionStylesOverrideSchema = z21.object({
9019
9488
  background: boxBackgroundSchema.nullable().optional(),
9020
9489
  spacing: semanticSpacingSchema.nullable().optional(),
9021
- minHeight: z21.enum(["none", "hero", "immersive"]).nullable().optional()
9490
+ minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional()
9022
9491
  });
9023
9492
  var containerStylesOverrideSchema = z21.object({
9024
9493
  background: boxBackgroundSchema.nullable().optional(),
@@ -9037,7 +9506,8 @@ var cardStylesOverrideSchema = z21.object({
9037
9506
  border: cardBorderOverrideSchema.nullable().optional(),
9038
9507
  spacing: semanticSpacingSchema.nullable().optional(),
9039
9508
  raised: z21.boolean().nullable().optional(),
9040
- rounded: boxRoundedSchema.nullable().optional()
9509
+ rounded: boxRoundedSchema.nullable().optional(),
9510
+ treatment: z21.enum(["accent-quote"]).nullable().optional()
9041
9511
  });
9042
9512
  var blockStyleOverridesSchema = z21.object({
9043
9513
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9112,15 +9582,7 @@ var inputStyle = z21.object({
9112
9582
  });
9113
9583
  var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9114
9584
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
9115
- var headerNavStyle = z21.enum([
9116
- "minimal",
9117
- "underline",
9118
- "underline-grow",
9119
- "capsule",
9120
- "scale",
9121
- "frosted",
9122
- "solid"
9123
- ]);
9585
+ var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
9124
9586
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
9125
9587
  var headerMaxWidth = z21.enum(["container", "full"]);
9126
9588
  var headerContainerSchema = z21.object({
@@ -9174,6 +9636,7 @@ var dropdownStyleSchema = z21.object({
9174
9636
  // optional = no override (browser default)
9175
9637
  }).optional();
9176
9638
  var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9639
+ var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
9177
9640
  var navContainerSchema = z21.object({
9178
9641
  type: z21.enum(["none", "pill", "glass"]).default("none"),
9179
9642
  tint: z21.string().nullable().optional(),
@@ -9192,7 +9655,10 @@ var headerSchema = z21.object({
9192
9655
  shrinkOnScroll: z21.boolean(),
9193
9656
  maxWidth: headerMaxWidth,
9194
9657
  logoOverride: mediaSchema.nullable().optional(),
9195
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9658
+ background: headerBackgroundSchema.default({
9659
+ type: "color",
9660
+ color: "surface"
9661
+ }),
9196
9662
  textColor: z21.string().nullable().optional(),
9197
9663
  // Site title and general header text
9198
9664
  navStyle: headerNavStyle,
@@ -9212,6 +9678,13 @@ var headerSchema = z21.object({
9212
9678
  navLinkStyle: navLinkStyleSchema.optional(),
9213
9679
  // CTA button spacing (desktop left margin)
9214
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(),
9215
9688
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9216
9689
  dropdownStyle: dropdownStyleSchema
9217
9690
  });
@@ -9268,7 +9741,10 @@ var footerSchema = z21.object({
9268
9741
  variant: footerVariant,
9269
9742
  maxWidth: footerMaxWidth,
9270
9743
  showLogoText: z21.boolean().optional(),
9271
- background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9744
+ background: headerBackgroundSchema.default({
9745
+ type: "color",
9746
+ color: "surface"
9747
+ }),
9272
9748
  // Footer nav styling (independent from header)
9273
9749
  navStyle: headerNavStyle.default("minimal"),
9274
9750
  navColor: z21.string().nullable().optional(),
@@ -9290,17 +9766,7 @@ var layoutSchema = z21.object({
9290
9766
  desktop: containerPaddingPresetSchema.optional()
9291
9767
  }).optional()
9292
9768
  }).optional();
9293
- var heroTypographySizeSchema = z21.enum([
9294
- "sm",
9295
- "base",
9296
- "lg",
9297
- "xl",
9298
- "2xl",
9299
- "3xl",
9300
- "4xl",
9301
- "5xl",
9302
- "6xl"
9303
- ]);
9769
+ var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
9304
9770
  var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
9305
9771
  var heroResponsiveTypographySchema = z21.object({
9306
9772
  headlineSize: heroTypographySizeSchema.optional(),
@@ -9325,6 +9791,13 @@ var heroTypographySchema = z21.object({
9325
9791
  var heroSchema = z21.object({
9326
9792
  typography: heroTypographySchema.optional()
9327
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();
9328
9801
  var gradientsSchema = z21.object({
9329
9802
  button: z21.string().min(1).nullable().optional(),
9330
9803
  hero: z21.string().min(1).nullable().optional(),
@@ -9346,6 +9819,7 @@ var themeSchema = z21.object({
9346
9819
  gradients: gradientsSchema.optional(),
9347
9820
  layout: layoutSchema,
9348
9821
  hero: heroSchema,
9822
+ bodyText: bodyTextSchema,
9349
9823
  header: headerSchema,
9350
9824
  footer: footerSchema,
9351
9825
  buttons: buttonSystemSchema.optional(),
@@ -9369,10 +9843,7 @@ var themeSchema = z21.object({
9369
9843
  ).optional(),
9370
9844
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9371
9845
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9372
- blockOverrides: z21.record(
9373
- z21.string(),
9374
- blockThemeOverrideSchema
9375
- ).optional(),
9846
+ blockOverrides: z21.record(z21.string(), blockThemeOverrideSchema).optional(),
9376
9847
  // Structured custom CSS rules
9377
9848
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
9378
9849
  customCssRules: customCssRulesSchema,
@@ -9543,6 +10014,28 @@ var brandLedJewel = definePaletteVariant({
9543
10014
  { name: "border", hex: "#a8a29e" }
9544
10015
  ]
9545
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
+ });
9546
10039
 
9547
10040
  // ../theme-core/src/palette/variants/high-contrast.ts
9548
10041
  var highContrastInk = definePaletteVariant({
@@ -9754,6 +10247,7 @@ var paletteVariants = [
9754
10247
  brandLedCool,
9755
10248
  brandLedWarm,
9756
10249
  brandLedJewel,
10250
+ brandLedBurgundyGold,
9757
10251
  // Warm-neutral family
9758
10252
  warmNeutralClay,
9759
10253
  warmNeutralCream,
@@ -9829,7 +10323,8 @@ var curatedSiteStyleIdValues = [
9829
10323
  "site-style:quiet-luxury",
9830
10324
  "site-style:practical-services",
9831
10325
  "site-style:modern-wellness",
9832
- "site-style:bold-launch"
10326
+ "site-style:bold-launch",
10327
+ "site-style:south-west-twerk-school"
9833
10328
  ];
9834
10329
  var quietBudget = {
9835
10330
  accentDensity: "low",
@@ -9884,6 +10379,8 @@ function defineCuratedSiteStyle(input) {
9884
10379
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
9885
10380
  supportedTransitions: generatedDesignOptionCatalog.transitions
9886
10381
  },
10382
+ ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
10383
+ recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
9887
10384
  buttonPersonalityChoices: input.buttonPersonalityChoices,
9888
10385
  paletteVariantChoices: input.paletteVariantChoices
9889
10386
  };
@@ -10130,6 +10627,101 @@ var curatedSiteStyles = [
10130
10627
  paletteChoice("brand-led-jewel"),
10131
10628
  paletteChoice("brand-led-warm")
10132
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
+ ]
10133
10725
  })
10134
10726
  ];
10135
10727
  var curatedSiteStylesById = new Map(
@@ -10174,6 +10766,40 @@ var heroLegibilityStrategySchema = z23.enum([
10174
10766
  "scrim-gradient",
10175
10767
  "solid-panel"
10176
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"]);
10177
10803
  function uniqueNonEmpty(values) {
10178
10804
  const uniqueValues = [...new Set(values)];
10179
10805
  const firstValue = uniqueValues[0];
@@ -10212,7 +10838,11 @@ var blockDesignPlanSchema = z23.object({
10212
10838
  itemSurface: z23.enum(userDesignOptionCatalog.itemSurfaces),
10213
10839
  transitionAfter: z23.enum(userDesignOptionCatalog.transitions),
10214
10840
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
10215
- heroLegibility: heroLegibilityStrategySchema.optional()
10841
+ sectionHeight: sectionHeightIntentSchema.optional(),
10842
+ heroLegibility: heroLegibilityStrategySchema.optional(),
10843
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
10844
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
10845
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional()
10216
10846
  }).strict();
10217
10847
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
10218
10848
  z23.object({
@@ -11638,6 +12268,7 @@ var SEMANTIC_SPACING_VALUES = [
11638
12268
  ];
11639
12269
  var SECTION_MIN_HEIGHT_VALUES = [
11640
12270
  "none",
12271
+ "banner",
11641
12272
  "hero",
11642
12273
  "immersive"
11643
12274
  ];
@@ -11665,6 +12296,7 @@ var CONTAINER_SPACING_MAP = {
11665
12296
  };
11666
12297
  var SECTION_MIN_HEIGHT_MAP = {
11667
12298
  none: "",
12299
+ banner: "rb-section-min-h-banner",
11668
12300
  hero: "rb-section-min-h-hero",
11669
12301
  immersive: "rb-section-min-h-immersive"
11670
12302
  };
@@ -12455,6 +13087,9 @@ var boxStylesCompositeTransform = {
12455
13087
  classes.push(roundedResult);
12456
13088
  }
12457
13089
  }
13090
+ if (input.treatment === "accent-quote") {
13091
+ classes.push("rb-card-treatment-accent-quote");
13092
+ }
12458
13093
  return classes.join(" ").trim() || "";
12459
13094
  }
12460
13095
  };
@@ -12552,7 +13187,7 @@ var sectionClassNameTransform = {
12552
13187
  minHeight = input.minHeight;
12553
13188
  } else if (process.env.NODE_ENV !== "production") {
12554
13189
  console.warn(
12555
- `[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.`
12556
13191
  );
12557
13192
  }
12558
13193
  }
@@ -12875,23 +13510,6 @@ function styledCard(children, opts, ...mods) {
12875
13510
  );
12876
13511
  }
12877
13512
 
12878
- // ../blocks/src/system/node/fragments/typography.ts
12879
- function mergeClassName(base, extra) {
12880
- return [base, extra ?? ""].filter(Boolean).join(" ");
12881
- }
12882
- function captionText(opts, ...mods) {
12883
- const {
12884
- as: asProp,
12885
- className: classNameProp,
12886
- color,
12887
- ...rest
12888
- } = opts ?? {};
12889
- const as = asProp ?? "p";
12890
- const className = mergeClassName("rb-caption", classNameProp);
12891
- const style = textColorStyle(color ?? "mutedText");
12892
- return text({ ...rest, as, className, style }, ...mods);
12893
- }
12894
-
12895
13513
  // ../blocks/src/system/node/fragments/feedbackCallout.ts
12896
13514
  function joinClasses(...parts) {
12897
13515
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
@@ -13796,18 +14414,17 @@ function buildAttributionNodes() {
13796
14414
  const name = text(
13797
14415
  {
13798
14416
  as: "strong",
13799
- className: "rb-block",
13800
- style: textColorStyle("text")
14417
+ className: "rb-block"
13801
14418
  },
13802
14419
  bind("testimonial.content.name", { fallback: "Anonymous" })
13803
14420
  );
13804
- const jobTitle = captionText(
13805
- null,
14421
+ const jobTitle = text(
14422
+ { as: "p", className: "rb-caption" },
13806
14423
  when("testimonial.content.jobTitle"),
13807
14424
  bind("testimonial.content.jobTitle")
13808
14425
  );
13809
- const company = captionText(
13810
- null,
14426
+ const company = text(
14427
+ { as: "p", className: "rb-caption" },
13811
14428
  when("testimonial.content.company"),
13812
14429
  bind("testimonial.content.company")
13813
14430
  );
@@ -13841,8 +14458,7 @@ function buildTestimonialCard(...mods) {
13841
14458
  );
13842
14459
  const body = richText(
13843
14460
  {
13844
- className: "rb-prose rb-max-w-none",
13845
- style: textColorStyle("text")
14461
+ className: "rb-prose rb-max-w-none"
13846
14462
  },
13847
14463
  bind("testimonial.content.body"),
13848
14464
  when("testimonial.content.body")
@@ -15472,6 +16088,7 @@ function heroContentCard(children, gap) {
15472
16088
  return styledContainer({
15473
16089
  bindFrom: "_contentCardStyles",
15474
16090
  constrainWidth: false,
16091
+ baseClassName: "rb-relative rb-isolate",
15475
16092
  rootType: "stack",
15476
16093
  rootProps: {
15477
16094
  gap
@@ -15502,6 +16119,7 @@ function heroContentWrapper(children, gap, fallbackClassName) {
15502
16119
  function heroContainerStack(children, gap) {
15503
16120
  return styledContainer({
15504
16121
  rootType: "stack",
16122
+ baseClassName: "rb-relative rb-isolate",
15505
16123
  rootProps: {
15506
16124
  gap: "none",
15507
16125
  justify: {
@@ -16720,7 +17338,7 @@ function resolveHeroVerticalAlignment(content) {
16720
17338
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
16721
17339
  const sectionStyles = asPartialObject(content._sectionStyles);
16722
17340
  const minHeight = sectionStyles?.minHeight;
16723
- if (minHeight === "hero" || minHeight === "immersive") return "center";
17341
+ if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
16724
17342
  const variant = resolveHeroVariant(content);
16725
17343
  if (variant === "split" || variant === "splitReverse") return "center";
16726
17344
  return "top";
@@ -17478,6 +18096,26 @@ var footerSplitNavSingleClassTransform = {
17478
18096
  ]);
17479
18097
  }
17480
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
+ };
17481
18119
  var footerLogoClassSchema = z35.object({
17482
18120
  base: z35.string().optional()
17483
18121
  });
@@ -17488,14 +18126,11 @@ var footerLogoClassTransform = {
17488
18126
  schema: footerLogoClassSchema,
17489
18127
  run: (value, options) => {
17490
18128
  const logo = asPartialObject(value);
17491
- const placement = logo?.placement ?? "right";
17492
18129
  const align = logo?.align ?? "end";
17493
18130
  const hiddenClass = logo?.showLogo === false ? "rb-hidden" : null;
17494
- const orderClass = placement === "left" || placement === "above" ? "rb-md-order-first" : "rb-md-order-last";
17495
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";
17496
18132
  return joinClasses4([
17497
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",
17498
- orderClass,
17499
18134
  selfAlignClass,
17500
18135
  hiddenClass
17501
18136
  ]);
@@ -17550,6 +18185,7 @@ var layoutTransforms = [
17550
18185
  footerBottomBarContainerClassTransform,
17551
18186
  footerBottomBarStyleTransform,
17552
18187
  footerSplitNavSingleClassTransform,
18188
+ footerSplitMainClassTransform,
17553
18189
  footerLogoClassTransform,
17554
18190
  footerLogoMediaClassTransform,
17555
18191
  footerLogoTextVisibleTransform
@@ -17826,7 +18462,7 @@ var createNavRow = (className, align = "end") => navRow({
17826
18462
  var headerCta = ctaButton({
17827
18463
  basePath: "menu.ctaItem",
17828
18464
  whenPath: "menu.ctaItem.label",
17829
- variantPath: "menu.ctaItem.variant",
18465
+ variantPath: "$root.theme.header.ctaVariant",
17830
18466
  linkPath: "menu.ctaItem.link",
17831
18467
  sizeFallback: "sm",
17832
18468
  className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
@@ -17834,7 +18470,7 @@ var headerCta = ctaButton({
17834
18470
  var mobileCta = ctaButton({
17835
18471
  basePath: "menu.ctaItem",
17836
18472
  whenPath: "menu.ctaItem.label",
17837
- variantPath: "menu.ctaItem.variant",
18473
+ variantPath: "$root.theme.header.ctaVariant",
17838
18474
  linkPath: "menu.ctaItem.link",
17839
18475
  sizeFallback: "md",
17840
18476
  className: "nav-mobile-cta rb-w-full"
@@ -18295,7 +18931,13 @@ var splitFooterLayout = stack(
18295
18931
  [
18296
18932
  inline(
18297
18933
  {
18298
- 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
+ }
18299
18941
  },
18300
18942
  [
18301
18943
  stack(
@@ -20383,7 +21025,8 @@ var courseEntrySubrouteContextSchema = z47.union([
20383
21025
  run: z47.object({
20384
21026
  courseId: z47.string(),
20385
21027
  seriesId: z47.string(),
20386
- runSlug: z47.string()
21028
+ runSlug: z47.string(),
21029
+ runName: z47.string().nullable()
20387
21030
  })
20388
21031
  }),
20389
21032
  z47.object({
@@ -26330,6 +26973,34 @@ function panelCapable() {
26330
26973
  itemSurfaces: "unsupported"
26331
26974
  });
26332
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
+ }
26333
27004
  function plainItemsCapable() {
26334
27005
  return declareBlockDesignCapability({
26335
27006
  sectionSurfaces: "supported",
@@ -26446,7 +27117,7 @@ function withDesignCapability(blockKind, definition, designCapability, designMet
26446
27117
  };
26447
27118
  }
26448
27119
  var systemBlockDefinitionsRaw = [
26449
- withDesignCapability("block.hero", heroBlockDefinition, panelCapable(), defineBlockDesignMetadata({
27120
+ withDesignCapability("block.hero", heroBlockDefinition, heroCapable(), defineBlockDesignMetadata({
26450
27121
  flow: heroFlow,
26451
27122
  layoutProfiles: [
26452
27123
  layoutProfile({
@@ -26550,7 +27221,12 @@ var systemBlockDefinitionsRaw = [
26550
27221
  flow: siteChromeFlow,
26551
27222
  layoutProfiles: []
26552
27223
  })),
26553
- 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({
26554
27230
  flow: proofFlow,
26555
27231
  layoutProfiles: [
26556
27232
  layoutProfile({
@@ -26862,8 +27538,15 @@ function parseOpacity(value) {
26862
27538
  }
26863
27539
  return opacity <= 1 ? opacity : opacity / 100;
26864
27540
  }
26865
- function appendOptionalClasses(baseClassName, optionalClassName) {
26866
- 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(" ");
26867
27550
  }
26868
27551
  var resolveImageStyleTransform = {
26869
27552
  id: "background.resolveImageStyle",
@@ -26940,9 +27623,9 @@ var resolveImageClassNameTransform = {
26940
27623
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
26941
27624
  const position = isString(input.position) ? input.position.trim() : null;
26942
27625
  if (objectFit === "fill" || objectFit === "fit" || objectFit === null) {
26943
- return appendOptionalClasses(
27626
+ return appendBackgroundMediaClasses(
26944
27627
  `${baseClass} rb-inset-0 rb-h-full rb-w-full rb-object-${objectFit === "fit" ? "contain" : "cover"}`,
26945
- backgroundVideoMobileClassNames(input)
27628
+ input
26946
27629
  );
26947
27630
  }
26948
27631
  let needsAnchoring = false;
@@ -26955,18 +27638,18 @@ var resolveImageClassNameTransform = {
26955
27638
  }
26956
27639
  }
26957
27640
  if (!needsAnchoring) {
26958
- return appendOptionalClasses(
27641
+ return appendBackgroundMediaClasses(
26959
27642
  `${baseClass} rb-inset-0 rb-h-full rb-w-full`,
26960
- backgroundVideoMobileClassNames(input)
27643
+ input
26961
27644
  );
26962
27645
  }
26963
27646
  const isPreset = position && BACKGROUND_POSITION_PRESET_VALUES.includes(position);
26964
27647
  const isCustom = position && !isPreset;
26965
27648
  if (isCustom) {
26966
- return appendOptionalClasses(baseClass, backgroundVideoMobileClassNames(input));
27649
+ return appendBackgroundMediaClasses(baseClass, input);
26967
27650
  }
26968
27651
  const anchorClasses = getAnchorClasses(position);
26969
- return appendOptionalClasses(`${baseClass} ${anchorClasses}`, backgroundVideoMobileClassNames(input));
27652
+ return appendBackgroundMediaClasses(`${baseClass} ${anchorClasses}`, input);
26970
27653
  }
26971
27654
  };
26972
27655
  var resolveOverlayStyleTransform = {