@riverbankcms/sdk 0.64.0 → 0.68.0

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 (126) hide show
  1. package/README.md +21 -11
  2. package/dist/_dts/api/src/aiPlayground.d.ts +75 -20
  3. package/dist/_dts/api/src/apiEndpointTypes.d.ts +12 -0
  4. package/dist/_dts/api/src/billing.d.ts +7 -40
  5. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +4 -1
  6. package/dist/_dts/api/src/bookingOperations.d.ts +33 -2
  7. package/dist/_dts/api/src/endpoints.d.ts +32 -0
  8. package/dist/_dts/api/src/public/types.d.ts +1 -1
  9. package/dist/_dts/api/src/sdkConfig/contracts.d.ts +0 -40
  10. package/dist/_dts/api/src/sdkContracts.d.ts +1 -1
  11. package/dist/_dts/api/src/siteMembers.d.ts +1 -1
  12. package/dist/_dts/api/src/siteOperations.d.ts +1 -1
  13. package/dist/_dts/billing/src/components/index.d.ts +426 -0
  14. package/dist/_dts/billing/src/plans/types.d.ts +1 -1
  15. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -0
  16. package/dist/_dts/blocks/src/bindings/index.d.ts +1 -1
  17. package/dist/_dts/blocks/src/client.d.ts +6 -0
  18. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  19. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.d.ts +1 -0
  20. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableSlots.d.ts +3 -1
  21. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +140 -0
  22. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +2 -0
  23. package/dist/_dts/blocks/src/system/runtime/hooks/useVisibleTabPolling.d.ts +10 -0
  24. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.default-ui.d.ts +8 -0
  25. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +484 -0
  26. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +5 -2
  27. package/dist/_dts/blocks/src/system/transforms/registry/formatting.d.ts +1 -0
  28. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  29. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +81 -0
  30. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +7 -3
  31. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  32. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -2
  33. package/dist/_dts/sdk/src/bookings/types.d.ts +2 -0
  34. package/dist/_dts/sdk/src/cli/commands/push/execute/footer.d.ts +33 -0
  35. package/dist/_dts/sdk/src/cli/commands/push/scopes/commandBackedDatedOfferingScope.d.ts +32 -0
  36. package/dist/_dts/sdk/src/cli/commands/push/scopes/types.d.ts +5 -1
  37. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +2 -1
  38. package/dist/_dts/sdk/src/cli/env.d.ts +2 -1
  39. package/dist/_dts/sdk/src/cli/merge-remote/entryMergePush.d.ts +2 -1
  40. package/dist/_dts/sdk/src/cli/site-commands/commandKeys.d.ts +13 -0
  41. package/dist/_dts/sdk/src/cli/site-commands/commandRuntime.d.ts +144 -0
  42. package/dist/_dts/sdk/src/cli/site-commands/commandRuntimeCompat.d.ts +21 -0
  43. package/dist/_dts/sdk/src/cli/site-commands/commandSurfaceDispatch.d.ts +27 -0
  44. package/dist/_dts/sdk/src/cli/site-commands/datedOfferingCommands.d.ts +56 -0
  45. package/dist/_dts/sdk/src/cli/site-commands/entryCommands.d.ts +29 -49
  46. package/dist/_dts/sdk/src/cli/site-commands/footerCommands.d.ts +56 -0
  47. package/dist/_dts/sdk/src/cli/site-commands/formCommands.d.ts +53 -0
  48. package/dist/_dts/sdk/src/cli/site-commands/index.d.ts +6 -0
  49. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +53 -0
  50. package/dist/_dts/sdk/src/cli/site-commands/pageCommands.d.ts +79 -0
  51. package/dist/_dts/sdk/src/cli/site-commands/pushExecution.d.ts +19 -20
  52. package/dist/_dts/sdk/src/cli/site-commands/pushExecutionPlan.d.ts +8 -0
  53. package/dist/_dts/sdk/src/cli/site-commands/pushExecutionTypes.d.ts +97 -0
  54. package/dist/_dts/sdk/src/cli/site-commands/residualSettingsTrimming.d.ts +15 -0
  55. package/dist/_dts/sdk/src/cli/sync/executor.d.ts +10 -28
  56. package/dist/_dts/sdk/src/cli/sync/index.d.ts +2 -1
  57. package/dist/_dts/sdk/src/cli/sync/syncResultAggregation.d.ts +4 -0
  58. package/dist/_dts/sdk/src/config/dashboard-validation.d.ts +0 -48
  59. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  60. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -0
  61. package/dist/_dts/sdk/src/theme-bridge/ThemeBridgeProvider.d.ts +4 -4
  62. package/dist/_dts/sdk/src/theme-bridge/generateCssVars.d.ts +4 -12
  63. package/dist/_dts/sdk/src/theme-bridge/index.d.ts +1 -1
  64. package/dist/_dts/sdk/src/theme-bridge/types.d.ts +17 -9
  65. package/dist/_dts/sdk/src/version.d.ts +1 -1
  66. package/dist/_dts/site-commands/src/adapter.d.ts +2 -2
  67. package/dist/_dts/site-commands/src/commands.d.ts +637 -13
  68. package/dist/_dts/site-commands/src/domain.d.ts +3 -3
  69. package/dist/_dts/site-commands/src/exposure.d.ts +41 -0
  70. package/dist/_dts/site-commands/src/index.d.ts +2 -0
  71. package/dist/_dts/site-commands/src/metadata.d.ts +159 -3
  72. package/dist/_dts/site-commands/src/planner.d.ts +13 -6
  73. package/dist/_dts/site-commands/src/refContributions.d.ts +1 -0
  74. package/dist/_dts/site-commands/src/refs.d.ts +19 -1
  75. package/dist/_dts/{sdk/src/cli/merge-remote → site-commands/src}/stableJson.d.ts +2 -0
  76. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  77. package/dist/_dts/theme-core/src/index.d.ts +1 -1
  78. package/dist/_dts/theme-core/src/palette/utils/index.d.ts +1 -0
  79. package/dist/_dts/theme-core/src/palette/utils/onColor.d.ts +2 -0
  80. package/dist/_dts/theme-core/src/runtime/buildThemeRuntimeFromBridge.d.ts +30 -23
  81. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +83 -0
  82. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +2 -1
  83. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +89 -12
  84. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +8 -2
  85. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  86. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +3 -2
  87. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -6
  88. package/dist/_dts/ui/src/callout.d.ts +1 -1
  89. package/dist/cli/index.mjs +4736 -2026
  90. package/dist/client/bookings.mjs +5107 -3348
  91. package/dist/client/client.mjs +4579 -3871
  92. package/dist/client/hooks.mjs +325 -123
  93. package/dist/client/rendering/client.mjs +4474 -3869
  94. package/dist/client/rendering/islands.mjs +4234 -3639
  95. package/dist/client/rendering.mjs +4508 -3798
  96. package/dist/preview-next/before-render.mjs +75 -13
  97. package/dist/preview-next/client/runtime.mjs +3700 -2644
  98. package/dist/preview-next/middleware.mjs +75 -13
  99. package/dist/server/components.mjs +698 -383
  100. package/dist/server/config-validation.mjs +327 -125
  101. package/dist/server/config.mjs +327 -125
  102. package/dist/server/data.mjs +325 -123
  103. package/dist/server/index.mjs +92 -16
  104. package/dist/server/next.mjs +692 -377
  105. package/dist/server/page-converter.mjs +159 -41
  106. package/dist/server/prebuild.mjs +1 -1
  107. package/dist/server/rendering/server.mjs +700 -383
  108. package/dist/server/rendering.mjs +700 -383
  109. package/dist/server/routing.mjs +406 -131
  110. package/dist/server/server.mjs +326 -124
  111. package/dist/server/theme-bridge.mjs +1226 -4697
  112. package/dist/styles/index.css +38 -38
  113. package/package.json +1 -1
  114. package/dist/_dts/blocks/src/system/runtime/components/booking/DateTimeSelectionStep.d.ts +0 -18
  115. package/dist/_dts/blocks/src/system/runtime/components/booking/PaymentOptionSelectionStep.d.ts +0 -9
  116. package/dist/_dts/blocks/src/system/runtime/components/booking/ServiceResourceSelector.d.ts +0 -44
  117. package/dist/_dts/blocks/src/system/runtime/components/booking/ServiceResourceSelector.state.d.ts +0 -23
  118. package/dist/_dts/blocks/src/system/runtime/components/booking/ServiceSelectionStep.d.ts +0 -18
  119. package/dist/_dts/blocks/src/system/runtime/components/booking/slotDisplay.d.ts +0 -2
  120. package/dist/_dts/blocks/src/system/runtime/components/multi-step/MultiStepForm.d.ts +0 -21
  121. package/dist/_dts/blocks/src/system/runtime/components/multi-step/useMultiStep.d.ts +0 -15
  122. package/dist/_dts/blocks/src/system/runtime/components/multi-step/useMultiStep.state.d.ts +0 -51
  123. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingSteps.d.ts +0 -22
  124. package/dist/_dts/path-utils/src/index.d.ts +0 -8
  125. package/dist/_dts/path-utils/src/redirectPaths.d.ts +0 -26
  126. package/dist/_dts/path-utils/src/safeAppPath.d.ts +0 -26
@@ -5,6 +5,17 @@ import { use } from "react";
5
5
  // src/rendering/hooks/usePage.ts
6
6
  import { useState, useEffect } from "react";
7
7
 
8
+ // ../api/src/apiEndpointTypes.ts
9
+ function blockedDemoMutationPolicy(classification, publicMessage) {
10
+ if (publicMessage.trim() === "") {
11
+ throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
12
+ }
13
+ return {
14
+ classification,
15
+ publicMessage
16
+ };
17
+ }
18
+
8
19
  // ../api/src/cache-tags.ts
9
20
  var TAG_TEMPLATES = {
10
21
  siteCollection: "riverbank:site",
@@ -35,6 +46,18 @@ var TAG_TEMPLATES = {
35
46
  };
36
47
 
37
48
  // ../api/src/endpoints.ts
49
+ var DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy(
50
+ "blocked-hidden",
51
+ "This action is not available in demo sites."
52
+ );
53
+ var DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy(
54
+ "blocked-disabled",
55
+ "This setting is disabled in demo sites."
56
+ );
57
+ var DEMO_MUTATION_INTERNAL_ONLY = blockedDemoMutationPolicy(
58
+ "internal-only",
59
+ "This internal operation is not available in demo sites."
60
+ );
38
61
  var ENDPOINT_DEFINITIONS = {
39
62
  // AI endpoints - no cache due to dynamic nature
40
63
  aiContentUpdateChat: {
@@ -151,7 +174,8 @@ var ENDPOINT_DEFINITIONS = {
151
174
  path: "/sites/{siteId}/ai/generate",
152
175
  method: "POST",
153
176
  auth: "user",
154
- responseKind: "json"
177
+ responseKind: "json",
178
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
155
179
  },
156
180
  getOnboardingPreviewStatus: {
157
181
  path: "/public/sites/{siteId}/onboarding/preview-status",
@@ -172,7 +196,8 @@ var ENDPOINT_DEFINITIONS = {
172
196
  method: "POST",
173
197
  auth: "user",
174
198
  errors: [],
175
- responseKind: "json"
199
+ responseKind: "json",
200
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
176
201
  },
177
202
  goLiveSite: {
178
203
  path: "/sites/{siteId}/launch/go-live",
@@ -241,20 +266,23 @@ var ENDPOINT_DEFINITIONS = {
241
266
  path: "/sites/{siteId}/ai/site-wizard/goals",
242
267
  method: "POST",
243
268
  auth: "user",
244
- responseKind: "json"
269
+ responseKind: "json",
270
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
245
271
  },
246
272
  aiSiteWizardIntakeTriage: {
247
273
  path: "/sites/{siteId}/ai/site-wizard/intake-triage",
248
274
  method: "POST",
249
275
  auth: "user",
250
- responseKind: "json"
276
+ responseKind: "json",
277
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
251
278
  },
252
279
  aiSiteWizardTelemetry: {
253
280
  path: "/sites/{siteId}/ai/site-wizard/telemetry",
254
281
  method: "POST",
255
282
  auth: "user",
256
283
  errors: [],
257
- responseKind: "json"
284
+ responseKind: "json",
285
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
258
286
  },
259
287
  // Admin SEO
260
288
  listGscPropertiesAdmin: {
@@ -461,7 +489,7 @@ var ENDPOINT_DEFINITIONS = {
461
489
  responseKind: "json",
462
490
  errors: ["resource:not_found", "server:internal_error"]
463
491
  },
464
- // Ops (event hosts/admins)
492
+ // Ops (staff event operators/admins)
465
493
  opsListUpcomingEventOccurrences: {
466
494
  path: "/ops/sites/{siteId}/events",
467
495
  method: "GET",
@@ -479,6 +507,7 @@ var ENDPOINT_DEFINITIONS = {
479
507
  method: "POST",
480
508
  auth: "user",
481
509
  responseKind: "json",
510
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
482
511
  errors: [
483
512
  "validation:invalid_input",
484
513
  "auth:forbidden",
@@ -491,6 +520,7 @@ var ENDPOINT_DEFINITIONS = {
491
520
  method: "POST",
492
521
  auth: "user",
493
522
  responseKind: "json",
523
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
494
524
  errors: [
495
525
  "validation:invalid_input",
496
526
  "auth:forbidden",
@@ -509,6 +539,7 @@ var ENDPOINT_DEFINITIONS = {
509
539
  method: "POST",
510
540
  auth: "user",
511
541
  responseKind: "json",
542
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
512
543
  errors: [
513
544
  "validation:invalid_input",
514
545
  "auth:forbidden",
@@ -542,6 +573,7 @@ var ENDPOINT_DEFINITIONS = {
542
573
  method: "POST",
543
574
  auth: "user",
544
575
  responseKind: "json",
576
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
545
577
  errors: [
546
578
  "validation:invalid_input",
547
579
  "auth:forbidden",
@@ -570,7 +602,8 @@ var ENDPOINT_DEFINITIONS = {
570
602
  method: "POST",
571
603
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings],
572
604
  auth: "user",
573
- responseKind: "json"
605
+ responseKind: "json",
606
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
574
607
  },
575
608
  previewEmailTemplate: {
576
609
  path: "/sites/{siteId}/settings/emails/preview",
@@ -621,14 +654,16 @@ var ENDPOINT_DEFINITIONS = {
621
654
  method: "POST",
622
655
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
623
656
  auth: "user",
624
- responseKind: "json"
657
+ responseKind: "json",
658
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
625
659
  },
626
660
  createNewsletterSubscribersImportUploadUrl: {
627
661
  path: "/sites/{siteId}/newsletter/subscribers/import-url",
628
662
  method: "POST",
629
663
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
630
664
  auth: "user",
631
- responseKind: "json"
665
+ responseKind: "json",
666
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
632
667
  },
633
668
  exportNewsletterSubscribersCsv: {
634
669
  path: "/sites/{siteId}/newsletter/subscribers/export.csv",
@@ -825,14 +860,16 @@ var ENDPOINT_DEFINITIONS = {
825
860
  method: "POST",
826
861
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
827
862
  auth: "user",
828
- responseKind: "json"
863
+ responseKind: "json",
864
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
829
865
  },
830
866
  testSendNewsletterCampaign: {
831
867
  path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
832
868
  method: "POST",
833
869
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
834
870
  auth: "user",
835
- responseKind: "json"
871
+ responseKind: "json",
872
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
836
873
  },
837
874
  listNewsletterSendJobs: {
838
875
  path: "/sites/{siteId}/newsletter/jobs",
@@ -880,6 +917,20 @@ var ENDPOINT_DEFINITIONS = {
880
917
  responseKind: "json",
881
918
  errors: ["validation:invalid_input", "billing:plan_limit_exceeded", "server:internal_error"]
882
919
  },
920
+ createAppointmentResourceWithAccountAccess: {
921
+ path: "/sites/{siteId}/bookings/resources/account-access",
922
+ method: "POST",
923
+ auth: "user",
924
+ responseKind: "json",
925
+ errors: [
926
+ "validation:invalid_input",
927
+ "auth:forbidden",
928
+ "billing:plan_limit_exceeded",
929
+ "resource:conflict",
930
+ "resource:not_found",
931
+ "server:internal_error"
932
+ ]
933
+ },
883
934
  getAppointmentResource: {
884
935
  path: "/sites/{siteId}/bookings/resources/{resourceId}",
885
936
  method: "GET",
@@ -1520,7 +1571,8 @@ var ENDPOINT_DEFINITIONS = {
1520
1571
  method: "DELETE",
1521
1572
  tags: ["site", "site-{siteId}"],
1522
1573
  auth: "user",
1523
- responseKind: "json"
1574
+ responseKind: "json",
1575
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1524
1576
  },
1525
1577
  listSiteMembers: {
1526
1578
  path: "/sites/{siteId}/members",
@@ -1976,7 +2028,8 @@ var ENDPOINT_DEFINITIONS = {
1976
2028
  method: "POST",
1977
2029
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
1978
2030
  auth: "user",
1979
- responseKind: "json"
2031
+ responseKind: "json",
2032
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1980
2033
  },
1981
2034
  updateSiteGeneralSettings: {
1982
2035
  path: "/sites/{siteId}/settings/general",
@@ -4215,6 +4268,7 @@ var ENDPOINT_DEFINITIONS = {
4215
4268
  method: "POST",
4216
4269
  tags: ["site-{siteId}"],
4217
4270
  auth: "user",
4271
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
4218
4272
  errors: [
4219
4273
  "validation:invalid_input",
4220
4274
  "auth:forbidden",
@@ -4229,6 +4283,7 @@ var ENDPOINT_DEFINITIONS = {
4229
4283
  method: "POST",
4230
4284
  tags: ["site-{siteId}"],
4231
4285
  auth: "user",
4286
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
4232
4287
  errors: [
4233
4288
  "validation:invalid_input",
4234
4289
  "auth:forbidden",
@@ -4538,6 +4593,7 @@ var ENDPOINT_DEFINITIONS = {
4538
4593
  tags: ["site-{siteId}", "passes-{siteId}"],
4539
4594
  auth: "user",
4540
4595
  responseKind: "json",
4596
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4541
4597
  errors: ["validation:invalid_input", "server:internal_error"]
4542
4598
  },
4543
4599
  getBookingPass: {
@@ -4553,6 +4609,7 @@ var ENDPOINT_DEFINITIONS = {
4553
4609
  tags: ["site-{siteId}", "passes-{siteId}"],
4554
4610
  auth: "user",
4555
4611
  responseKind: "json",
4612
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4556
4613
  errors: [
4557
4614
  "validation:invalid_input",
4558
4615
  "resource:not_found",
@@ -4565,6 +4622,7 @@ var ENDPOINT_DEFINITIONS = {
4565
4622
  tags: ["site-{siteId}", "passes-{siteId}"],
4566
4623
  auth: "user",
4567
4624
  responseKind: "json",
4625
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4568
4626
  errors: [
4569
4627
  "validation:invalid_input",
4570
4628
  "resource:not_found",
@@ -4620,6 +4678,7 @@ var ENDPOINT_DEFINITIONS = {
4620
4678
  tags: ["site-{siteId}", "memberships-{siteId}"],
4621
4679
  auth: "user",
4622
4680
  responseKind: "json",
4681
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4623
4682
  errors: ["validation:invalid_input", "server:internal_error"]
4624
4683
  },
4625
4684
  getBookingMembership: {
@@ -4635,6 +4694,7 @@ var ENDPOINT_DEFINITIONS = {
4635
4694
  tags: ["site-{siteId}", "memberships-{siteId}"],
4636
4695
  auth: "user",
4637
4696
  responseKind: "json",
4697
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4638
4698
  errors: [
4639
4699
  "validation:invalid_input",
4640
4700
  "resource:not_found",
@@ -4647,6 +4707,7 @@ var ENDPOINT_DEFINITIONS = {
4647
4707
  tags: ["site-{siteId}", "memberships-{siteId}"],
4648
4708
  auth: "user",
4649
4709
  responseKind: "json",
4710
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4650
4711
  errors: [
4651
4712
  "validation:invalid_input",
4652
4713
  "resource:not_found",
@@ -4863,6 +4924,7 @@ var ENDPOINT_DEFINITIONS = {
4863
4924
  tags: ["site-{siteId}", "customers-{siteId}"],
4864
4925
  auth: "user",
4865
4926
  responseKind: "json",
4927
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4866
4928
  errors: [
4867
4929
  "validation:invalid_input",
4868
4930
  "auth:forbidden",
@@ -7122,8 +7184,7 @@ var dashboardNavVisibilityBaseSchema = z5.object({
7122
7184
  var dashboardNavVisibilityRolesSchema = z5.object({
7123
7185
  administrator: dashboardNavVisibilityBaseSchema.optional(),
7124
7186
  editor: dashboardNavVisibilityBaseSchema.optional(),
7125
- team_member: dashboardNavVisibilityBaseSchema.optional(),
7126
- event_host: dashboardNavVisibilityBaseSchema.optional()
7187
+ team_member: dashboardNavVisibilityBaseSchema.optional()
7127
7188
  }).strip().optional();
7128
7189
  var dashboardNavVisibilitySchema = dashboardNavVisibilityBaseSchema.extend({
7129
7190
  roles: dashboardNavVisibilityRolesSchema
@@ -7644,6 +7705,21 @@ var appointmentSetupServiceDraftSchema = z7.object({
7644
7705
  timezone: z7.string().trim().min(1).nullable(),
7645
7706
  payment: appointmentSetupPaymentDraftSchema,
7646
7707
  assignment: appointmentSetupServiceAssignmentDraftSchema
7708
+ }).superRefine((service, ctx) => {
7709
+ if (service.payment.priceType === "paid" && (service.priceAmount === null || service.priceAmount <= 0)) {
7710
+ ctx.addIssue({
7711
+ code: "custom",
7712
+ path: ["priceAmount"],
7713
+ message: "Paid appointment services need a positive price."
7714
+ });
7715
+ }
7716
+ if (service.payment.priceType === "free" && service.priceAmount !== null && service.priceAmount > 0) {
7717
+ ctx.addIssue({
7718
+ code: "custom",
7719
+ path: ["priceAmount"],
7720
+ message: "Free appointment services cannot carry a positive price."
7721
+ });
7722
+ }
7647
7723
  });
7648
7724
  var appointmentSetupPractitionerDraftSchema = z7.object({
7649
7725
  ref: appointmentSetupRefSchema,
@@ -8016,6 +8092,71 @@ function registerManifest(manifest) {
8016
8092
  return manifest;
8017
8093
  }
8018
8094
 
8095
+ // ../theme-core/src/palette/utils/colorConversion.ts
8096
+ var mod = (a, n) => (a % n + n) % n;
8097
+ var deg = (x) => mod(x, 360);
8098
+ function hexToRgb(hex) {
8099
+ const h = hex.replace(/^#/, "");
8100
+ const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
8101
+ if (m.length !== 6) throw new Error("Bad hex");
8102
+ const int = parseInt(m, 16);
8103
+ return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
8104
+ }
8105
+ function srgbToLinear(u) {
8106
+ const x = u / 255;
8107
+ return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
8108
+ }
8109
+ function rgbToHsl(r, g, b) {
8110
+ const R = r / 255, G = g / 255, B = b / 255;
8111
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
8112
+ const d = max - min;
8113
+ let h = 0;
8114
+ if (d !== 0) {
8115
+ switch (max) {
8116
+ case R:
8117
+ h = (G - B) / d + (G < B ? 6 : 0);
8118
+ break;
8119
+ case G:
8120
+ h = (B - R) / d + 2;
8121
+ break;
8122
+ case B:
8123
+ h = (R - G) / d + 4;
8124
+ break;
8125
+ }
8126
+ h *= 60;
8127
+ }
8128
+ const l = (max + min) / 2;
8129
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
8130
+ return { h, s, l };
8131
+ }
8132
+ function srgbToOklab(r, g, b) {
8133
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
8134
+ const l = 0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B;
8135
+ const m = 0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B;
8136
+ const s = 0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B;
8137
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
8138
+ const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
8139
+ const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
8140
+ const b2 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
8141
+ return { L, a, b: b2 };
8142
+ }
8143
+ function oklabToOklch(L, a, b) {
8144
+ const C = Math.sqrt(a * a + b * b);
8145
+ const h = C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI);
8146
+ return { L, C, h };
8147
+ }
8148
+ function featuresFromHex(hex) {
8149
+ const { r, g, b } = hexToRgb(hex);
8150
+ const { h, s, l } = rgbToHsl(r, g, b);
8151
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
8152
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
8153
+ const max = Math.max(r, g, b);
8154
+ const v = max / 255;
8155
+ const Y = 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);
8156
+ const chroma = s;
8157
+ return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };
8158
+ }
8159
+
8019
8160
  // ../theme-core/src/site-styles/appearancePresetResolution.ts
8020
8161
  function assertValidOptionGroups(preset2) {
8021
8162
  preset2.optionGroups?.forEach((group) => {
@@ -11545,6 +11686,9 @@ var curatedSiteStyleIdValues = [
11545
11686
  "site-style:bright-community",
11546
11687
  "site-style:quiet-luxury",
11547
11688
  "site-style:practical-services",
11689
+ "site-style:quiet-practice",
11690
+ "site-style:personal-retreat-journal",
11691
+ "site-style:tactile-workshop",
11548
11692
  "site-style:modern-wellness",
11549
11693
  "site-style:bold-launch",
11550
11694
  "site-style:south-west-twerk-school"
@@ -11627,7 +11771,8 @@ function defineCuratedSiteStyle(input) {
11627
11771
  name: input.name,
11628
11772
  description: input.description,
11629
11773
  generationBrief: input.generationBrief,
11630
- selectionKeywords: input.selectionKeywords ?? [],
11774
+ selectionKeywordRules: input.selectionKeywordRules ?? [],
11775
+ siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
11631
11776
  template: {
11632
11777
  id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
11633
11778
  name: input.name,
@@ -11771,12 +11916,13 @@ var curatedSiteStyles = [
11771
11916
  name: "Quiet Luxury",
11772
11917
  description: "Minimal, confident, and refined for premium experiences and private services.",
11773
11918
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
11774
- selectionKeywords: [
11775
- "luxury",
11776
- "premium",
11777
- "boutique",
11778
- "bespoke",
11779
- "exclusive"
11919
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
11920
+ selectionKeywordRules: [
11921
+ { kind: "word", value: "luxury" },
11922
+ { kind: "word", value: "premium" },
11923
+ { kind: "word", value: "boutique" },
11924
+ { kind: "word", value: "bespoke" },
11925
+ { kind: "word", value: "exclusive" }
11780
11926
  ],
11781
11927
  tokenRecipes: {
11782
11928
  palette: "high-contrast",
@@ -11805,13 +11951,14 @@ var curatedSiteStyles = [
11805
11951
  name: "Practical Services",
11806
11952
  description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
11807
11953
  generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
11808
- selectionKeywords: [
11809
- "repair",
11810
- "plumb",
11811
- "electric",
11812
- "cleaning",
11813
- "landscap",
11814
- "contractor"
11954
+ siteCreatorSelection: { kind: "primary_goal_support" },
11955
+ selectionKeywordRules: [
11956
+ { kind: "word", value: "repair" },
11957
+ { kind: "substring", value: "plumb" },
11958
+ { kind: "substring", value: "electric" },
11959
+ { kind: "word", value: "cleaning" },
11960
+ { kind: "substring", value: "landscap" },
11961
+ { kind: "substring", value: "contractor" }
11815
11962
  ],
11816
11963
  tokenRecipes: {
11817
11964
  palette: "brand-led",
@@ -11862,18 +12009,134 @@ var curatedSiteStyles = [
11862
12009
  paletteChoice("warm-neutral-forest")
11863
12010
  ]
11864
12011
  }),
12012
+ defineCuratedSiteStyle({
12013
+ id: "site-style:quiet-practice",
12014
+ name: "Quiet Practice",
12015
+ description: "Grounded, calm, and practical for small appointment-first practices.",
12016
+ generationBrief: "Make services, practitioner trust, preparation notes, and booking routes easy to scan. Keep the tone warm and specific, with quiet confidence rather than spa cliches or medical claims.",
12017
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
12018
+ selectionKeywordRules: [
12019
+ { kind: "substring", value: "massage" },
12020
+ { kind: "word", value: "bodywork" },
12021
+ { kind: "phrase", value: "appointment practice" },
12022
+ { kind: "phrase", value: "appointment-first" },
12023
+ { kind: "substring", value: "practitioner" },
12024
+ { kind: "substring", value: "therap" },
12025
+ { kind: "substring", value: "clinic" },
12026
+ { kind: "phrase", value: "wellness practice" }
12027
+ ],
12028
+ tokenRecipes: {
12029
+ palette: "soft-natural",
12030
+ contrast: "standard",
12031
+ radius: "soft",
12032
+ shadow: "subtle",
12033
+ typography: "clean-sans",
12034
+ spacing: "regular",
12035
+ motion: "subtle"
12036
+ },
12037
+ compositionBudget: quietBudget,
12038
+ recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
12039
+ buttonPersonalityChoices: [
12040
+ buttonChoice("pebble"),
12041
+ buttonChoice("soft-pill"),
12042
+ buttonChoice("editorial-link")
12043
+ ],
12044
+ paletteVariantChoices: [
12045
+ paletteChoice("soft-natural-stone"),
12046
+ paletteChoice("soft-natural-sage"),
12047
+ paletteChoice("warm-neutral-clay")
12048
+ ]
12049
+ }),
12050
+ defineCuratedSiteStyle({
12051
+ id: "site-style:personal-retreat-journal",
12052
+ name: "Personal Retreat Journal",
12053
+ description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
12054
+ generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
12055
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
12056
+ selectionKeywordRules: [
12057
+ { kind: "substring", value: "retreat" },
12058
+ { kind: "phrase", value: "solo practitioner" },
12059
+ { kind: "phrase", value: "personal brand" },
12060
+ { kind: "substring", value: "teacher" },
12061
+ { kind: "substring", value: "coach" },
12062
+ { kind: "phrase", value: "retreat resources" },
12063
+ { kind: "substring", value: "journal" }
12064
+ ],
12065
+ tokenRecipes: {
12066
+ palette: "warm-neutral",
12067
+ contrast: "standard",
12068
+ radius: "soft",
12069
+ shadow: "subtle",
12070
+ typography: "serif-editorial",
12071
+ spacing: "airy",
12072
+ motion: "subtle"
12073
+ },
12074
+ compositionBudget: balancedBudget,
12075
+ recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
12076
+ buttonPersonalityChoices: [
12077
+ buttonChoice("editorial-link"),
12078
+ buttonChoice("soft-pill"),
12079
+ buttonChoice("brushed-wash")
12080
+ ],
12081
+ paletteVariantChoices: [
12082
+ paletteChoice("warm-neutral-forest"),
12083
+ paletteChoice("warm-neutral-clay"),
12084
+ paletteChoice("soft-natural-stone")
12085
+ ]
12086
+ }),
12087
+ defineCuratedSiteStyle({
12088
+ id: "site-style:tactile-workshop",
12089
+ name: "Tactile Workshop",
12090
+ description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
12091
+ generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
12092
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
12093
+ selectionKeywordRules: [
12094
+ { kind: "substring", value: "ceramic" },
12095
+ { kind: "word", value: "pottery" },
12096
+ { kind: "phrase", value: "maker studio" },
12097
+ { kind: "phrase", value: "craft class" },
12098
+ { kind: "phrase", value: "craft workshop" },
12099
+ { kind: "word", value: "clay" },
12100
+ { kind: "word", value: "kiln" }
12101
+ ],
12102
+ tokenRecipes: {
12103
+ palette: "brand-led",
12104
+ contrast: "standard",
12105
+ radius: "soft",
12106
+ shadow: "subtle",
12107
+ typography: "friendly-sans",
12108
+ spacing: "regular",
12109
+ motion: "subtle"
12110
+ },
12111
+ compositionBudget: balancedBudget,
12112
+ recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12113
+ recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12114
+ buttonPersonalityChoices: [
12115
+ buttonChoice("pebble"),
12116
+ buttonChoice("confident-chip"),
12117
+ buttonChoice("ink-stamp"),
12118
+ buttonChoice("editorial-link")
12119
+ ],
12120
+ paletteVariantChoices: [
12121
+ paletteChoice("brand-led-warm"),
12122
+ paletteChoice("brand-led-cool"),
12123
+ paletteChoice("soft-natural-watercolor"),
12124
+ paletteChoice("warm-neutral-clay")
12125
+ ]
12126
+ }),
11865
12127
  defineCuratedSiteStyle({
11866
12128
  id: "site-style:bold-launch",
11867
12129
  name: "Bold Launch",
11868
12130
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
11869
12131
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
11870
- selectionKeywords: [
11871
- "launch",
11872
- "campaign",
11873
- "preorder",
11874
- "pre-order",
11875
- "waitlist",
11876
- "drop"
12132
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
12133
+ selectionKeywordRules: [
12134
+ { kind: "substring", value: "launch" },
12135
+ { kind: "substring", value: "campaign" },
12136
+ { kind: "word", value: "preorder" },
12137
+ { kind: "phrase", value: "pre-order" },
12138
+ { kind: "substring", value: "waitlist" },
12139
+ { kind: "word", value: "drop" }
11877
12140
  ],
11878
12141
  tokenRecipes: {
11879
12142
  palette: "high-contrast",
@@ -11904,15 +12167,6 @@ var curatedSiteStyles = [
11904
12167
  name: "South West Twerk School",
11905
12168
  description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
11906
12169
  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.",
11907
- selectionKeywords: [
11908
- "dance",
11909
- "classes",
11910
- "workshop",
11911
- "school",
11912
- "movement",
11913
- "performance",
11914
- "community"
11915
- ],
11916
12170
  tokenRecipes: {
11917
12171
  palette: "brand-led",
11918
12172
  contrast: "maximum",
@@ -12219,25 +12473,19 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
12219
12473
  "muted-band": {
12220
12474
  background: {
12221
12475
  type: "color",
12222
- color: "muted",
12223
- textColor: "text",
12224
- headingColor: "text"
12476
+ color: "muted"
12225
12477
  }
12226
12478
  },
12227
12479
  "accent-band": {
12228
12480
  background: {
12229
12481
  type: "color",
12230
- color: "primary",
12231
- textColor: "primaryForeground",
12232
- headingColor: "primaryForeground"
12482
+ color: "primary"
12233
12483
  }
12234
12484
  },
12235
12485
  "brand-depth-band": {
12236
12486
  background: {
12237
12487
  type: "color",
12238
- color: "primary-800",
12239
- textColor: "primaryForeground",
12240
- headingColor: "primaryForeground"
12488
+ color: "primary-800"
12241
12489
  }
12242
12490
  },
12243
12491
  "hero-image": {
@@ -18345,6 +18593,16 @@ var jsonArrayTransform = {
18345
18593
  return "";
18346
18594
  }
18347
18595
  };
18596
+ var csvTransform = {
18597
+ id: "value.csv",
18598
+ kind: "formatter",
18599
+ summary: "Normalize a string or array of strings into a comma-separated list",
18600
+ run: (value) => {
18601
+ const rawValues = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
18602
+ const normalized = rawValues.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean);
18603
+ return normalized.length > 0 ? Array.from(new Set(normalized)).join(",") : "";
18604
+ }
18605
+ };
18348
18606
  var marqueeLoopOptionsSchema = z36.object({
18349
18607
  minItems: z36.number().int().min(1).default(10)
18350
18608
  });
@@ -18370,6 +18628,7 @@ var formattingTransforms = [
18370
18628
  dateFormatShort,
18371
18629
  arrayLengthTransform,
18372
18630
  jsonArrayTransform,
18631
+ csvTransform,
18373
18632
  marqueeLoopTransform
18374
18633
  ];
18375
18634
 
@@ -18853,73 +19112,6 @@ var uiTransforms = [
18853
19112
 
18854
19113
  // ../blocks/src/system/transforms/registry/layout.ts
18855
19114
  import { z as z38 } from "zod";
18856
-
18857
- // ../theme-core/src/palette/utils/colorConversion.ts
18858
- var mod = (a, n) => (a % n + n) % n;
18859
- var deg = (x) => mod(x, 360);
18860
- function hexToRgb(hex) {
18861
- const h = hex.replace(/^#/, "");
18862
- const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
18863
- if (m.length !== 6) throw new Error("Bad hex");
18864
- const int = parseInt(m, 16);
18865
- return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
18866
- }
18867
- function srgbToLinear(u) {
18868
- const x = u / 255;
18869
- return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
18870
- }
18871
- function rgbToHsl(r, g, b) {
18872
- const R = r / 255, G = g / 255, B = b / 255;
18873
- const max = Math.max(R, G, B), min = Math.min(R, G, B);
18874
- const d = max - min;
18875
- let h = 0;
18876
- if (d !== 0) {
18877
- switch (max) {
18878
- case R:
18879
- h = (G - B) / d + (G < B ? 6 : 0);
18880
- break;
18881
- case G:
18882
- h = (B - R) / d + 2;
18883
- break;
18884
- case B:
18885
- h = (R - G) / d + 4;
18886
- break;
18887
- }
18888
- h *= 60;
18889
- }
18890
- const l = (max + min) / 2;
18891
- const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
18892
- return { h, s, l };
18893
- }
18894
- function srgbToOklab(r, g, b) {
18895
- const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
18896
- const l = 0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B;
18897
- const m = 0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B;
18898
- const s = 0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B;
18899
- const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
18900
- const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
18901
- const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
18902
- const b2 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
18903
- return { L, a, b: b2 };
18904
- }
18905
- function oklabToOklch(L, a, b) {
18906
- const C = Math.sqrt(a * a + b * b);
18907
- const h = C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI);
18908
- return { L, C, h };
18909
- }
18910
- function featuresFromHex(hex) {
18911
- const { r, g, b } = hexToRgb(hex);
18912
- const { h, s, l } = rgbToHsl(r, g, b);
18913
- const { L, a, b: b2 } = srgbToOklab(r, g, b);
18914
- const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
18915
- const max = Math.max(r, g, b);
18916
- const v = max / 255;
18917
- const Y = 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);
18918
- const chroma = s;
18919
- return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };
18920
- }
18921
-
18922
- // ../blocks/src/system/transforms/registry/layout.ts
18923
19115
  var joinClasses4 = (parts) => parts.filter(
18924
19116
  (part) => typeof part === "string" && part.trim().length > 0
18925
19117
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -23603,7 +23795,12 @@ var eventListingBlockDefinition = {
23603
23795
  detailLevel: "listing",
23604
23796
  kind: { $bind: { from: "content.kind" } },
23605
23797
  eventSurface: { $bind: { from: "content.eventSurface" } },
23606
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
23798
+ eventPresets: {
23799
+ $bind: {
23800
+ from: "content.filterEventPresets",
23801
+ transforms: [{ id: "value.csv" }]
23802
+ }
23803
+ },
23607
23804
  scheduleScope: { $bind: { from: "content.scheduleScope" } }
23608
23805
  },
23609
23806
  mode: "server"
@@ -24355,7 +24552,12 @@ var eventCalendarBlockDefinition = {
24355
24552
  // Pass filter params if configured
24356
24553
  kind: { $bind: { from: "content.kind" } },
24357
24554
  eventSurface: { $bind: { from: "content.eventSurface" } },
24358
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
24555
+ eventPresets: {
24556
+ $bind: {
24557
+ from: "content.filterEventPresets",
24558
+ transforms: [{ id: "value.csv" }]
24559
+ }
24560
+ },
24359
24561
  scheduleScope: { $bind: { from: "content.scheduleScope" } },
24360
24562
  categoryIds: { $bind: { from: "content.filterCategoryIds" } },
24361
24563
  staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },