@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
@@ -8,6 +8,22 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
+ // ../api/src/apiEndpointTypes.ts
12
+ function blockedDemoMutationPolicy(classification, publicMessage) {
13
+ if (publicMessage.trim() === "") {
14
+ throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
15
+ }
16
+ return {
17
+ classification,
18
+ publicMessage
19
+ };
20
+ }
21
+ var init_apiEndpointTypes = __esm({
22
+ "../api/src/apiEndpointTypes.ts"() {
23
+ "use strict";
24
+ }
25
+ });
26
+
11
27
  // ../api/src/cache-tags.ts
12
28
  var TAG_TEMPLATES;
13
29
  var init_cache_tags = __esm({
@@ -44,11 +60,24 @@ var init_cache_tags = __esm({
44
60
  });
45
61
 
46
62
  // ../api/src/endpoints.ts
47
- var ENDPOINT_DEFINITIONS;
63
+ var DEMO_MUTATION_BLOCKED_HIDDEN, DEMO_MUTATION_BLOCKED_DISABLED, DEMO_MUTATION_INTERNAL_ONLY, ENDPOINT_DEFINITIONS;
48
64
  var init_endpoints = __esm({
49
65
  "../api/src/endpoints.ts"() {
50
66
  "use strict";
67
+ init_apiEndpointTypes();
51
68
  init_cache_tags();
69
+ DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy(
70
+ "blocked-hidden",
71
+ "This action is not available in demo sites."
72
+ );
73
+ DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy(
74
+ "blocked-disabled",
75
+ "This setting is disabled in demo sites."
76
+ );
77
+ DEMO_MUTATION_INTERNAL_ONLY = blockedDemoMutationPolicy(
78
+ "internal-only",
79
+ "This internal operation is not available in demo sites."
80
+ );
52
81
  ENDPOINT_DEFINITIONS = {
53
82
  // AI endpoints - no cache due to dynamic nature
54
83
  aiContentUpdateChat: {
@@ -165,7 +194,8 @@ var init_endpoints = __esm({
165
194
  path: "/sites/{siteId}/ai/generate",
166
195
  method: "POST",
167
196
  auth: "user",
168
- responseKind: "json"
197
+ responseKind: "json",
198
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
169
199
  },
170
200
  getOnboardingPreviewStatus: {
171
201
  path: "/public/sites/{siteId}/onboarding/preview-status",
@@ -186,7 +216,8 @@ var init_endpoints = __esm({
186
216
  method: "POST",
187
217
  auth: "user",
188
218
  errors: [],
189
- responseKind: "json"
219
+ responseKind: "json",
220
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
190
221
  },
191
222
  goLiveSite: {
192
223
  path: "/sites/{siteId}/launch/go-live",
@@ -255,20 +286,23 @@ var init_endpoints = __esm({
255
286
  path: "/sites/{siteId}/ai/site-wizard/goals",
256
287
  method: "POST",
257
288
  auth: "user",
258
- responseKind: "json"
289
+ responseKind: "json",
290
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
259
291
  },
260
292
  aiSiteWizardIntakeTriage: {
261
293
  path: "/sites/{siteId}/ai/site-wizard/intake-triage",
262
294
  method: "POST",
263
295
  auth: "user",
264
- responseKind: "json"
296
+ responseKind: "json",
297
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
265
298
  },
266
299
  aiSiteWizardTelemetry: {
267
300
  path: "/sites/{siteId}/ai/site-wizard/telemetry",
268
301
  method: "POST",
269
302
  auth: "user",
270
303
  errors: [],
271
- responseKind: "json"
304
+ responseKind: "json",
305
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
272
306
  },
273
307
  // Admin SEO
274
308
  listGscPropertiesAdmin: {
@@ -475,7 +509,7 @@ var init_endpoints = __esm({
475
509
  responseKind: "json",
476
510
  errors: ["resource:not_found", "server:internal_error"]
477
511
  },
478
- // Ops (event hosts/admins)
512
+ // Ops (staff event operators/admins)
479
513
  opsListUpcomingEventOccurrences: {
480
514
  path: "/ops/sites/{siteId}/events",
481
515
  method: "GET",
@@ -493,6 +527,7 @@ var init_endpoints = __esm({
493
527
  method: "POST",
494
528
  auth: "user",
495
529
  responseKind: "json",
530
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
496
531
  errors: [
497
532
  "validation:invalid_input",
498
533
  "auth:forbidden",
@@ -505,6 +540,7 @@ var init_endpoints = __esm({
505
540
  method: "POST",
506
541
  auth: "user",
507
542
  responseKind: "json",
543
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
508
544
  errors: [
509
545
  "validation:invalid_input",
510
546
  "auth:forbidden",
@@ -523,6 +559,7 @@ var init_endpoints = __esm({
523
559
  method: "POST",
524
560
  auth: "user",
525
561
  responseKind: "json",
562
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
526
563
  errors: [
527
564
  "validation:invalid_input",
528
565
  "auth:forbidden",
@@ -556,6 +593,7 @@ var init_endpoints = __esm({
556
593
  method: "POST",
557
594
  auth: "user",
558
595
  responseKind: "json",
596
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
559
597
  errors: [
560
598
  "validation:invalid_input",
561
599
  "auth:forbidden",
@@ -584,7 +622,8 @@ var init_endpoints = __esm({
584
622
  method: "POST",
585
623
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings],
586
624
  auth: "user",
587
- responseKind: "json"
625
+ responseKind: "json",
626
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
588
627
  },
589
628
  previewEmailTemplate: {
590
629
  path: "/sites/{siteId}/settings/emails/preview",
@@ -635,14 +674,16 @@ var init_endpoints = __esm({
635
674
  method: "POST",
636
675
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
637
676
  auth: "user",
638
- responseKind: "json"
677
+ responseKind: "json",
678
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
639
679
  },
640
680
  createNewsletterSubscribersImportUploadUrl: {
641
681
  path: "/sites/{siteId}/newsletter/subscribers/import-url",
642
682
  method: "POST",
643
683
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
644
684
  auth: "user",
645
- responseKind: "json"
685
+ responseKind: "json",
686
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
646
687
  },
647
688
  exportNewsletterSubscribersCsv: {
648
689
  path: "/sites/{siteId}/newsletter/subscribers/export.csv",
@@ -839,14 +880,16 @@ var init_endpoints = __esm({
839
880
  method: "POST",
840
881
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
841
882
  auth: "user",
842
- responseKind: "json"
883
+ responseKind: "json",
884
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
843
885
  },
844
886
  testSendNewsletterCampaign: {
845
887
  path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
846
888
  method: "POST",
847
889
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
848
890
  auth: "user",
849
- responseKind: "json"
891
+ responseKind: "json",
892
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
850
893
  },
851
894
  listNewsletterSendJobs: {
852
895
  path: "/sites/{siteId}/newsletter/jobs",
@@ -894,6 +937,20 @@ var init_endpoints = __esm({
894
937
  responseKind: "json",
895
938
  errors: ["validation:invalid_input", "billing:plan_limit_exceeded", "server:internal_error"]
896
939
  },
940
+ createAppointmentResourceWithAccountAccess: {
941
+ path: "/sites/{siteId}/bookings/resources/account-access",
942
+ method: "POST",
943
+ auth: "user",
944
+ responseKind: "json",
945
+ errors: [
946
+ "validation:invalid_input",
947
+ "auth:forbidden",
948
+ "billing:plan_limit_exceeded",
949
+ "resource:conflict",
950
+ "resource:not_found",
951
+ "server:internal_error"
952
+ ]
953
+ },
897
954
  getAppointmentResource: {
898
955
  path: "/sites/{siteId}/bookings/resources/{resourceId}",
899
956
  method: "GET",
@@ -1534,7 +1591,8 @@ var init_endpoints = __esm({
1534
1591
  method: "DELETE",
1535
1592
  tags: ["site", "site-{siteId}"],
1536
1593
  auth: "user",
1537
- responseKind: "json"
1594
+ responseKind: "json",
1595
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1538
1596
  },
1539
1597
  listSiteMembers: {
1540
1598
  path: "/sites/{siteId}/members",
@@ -1990,7 +2048,8 @@ var init_endpoints = __esm({
1990
2048
  method: "POST",
1991
2049
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
1992
2050
  auth: "user",
1993
- responseKind: "json"
2051
+ responseKind: "json",
2052
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1994
2053
  },
1995
2054
  updateSiteGeneralSettings: {
1996
2055
  path: "/sites/{siteId}/settings/general",
@@ -4229,6 +4288,7 @@ var init_endpoints = __esm({
4229
4288
  method: "POST",
4230
4289
  tags: ["site-{siteId}"],
4231
4290
  auth: "user",
4291
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
4232
4292
  errors: [
4233
4293
  "validation:invalid_input",
4234
4294
  "auth:forbidden",
@@ -4243,6 +4303,7 @@ var init_endpoints = __esm({
4243
4303
  method: "POST",
4244
4304
  tags: ["site-{siteId}"],
4245
4305
  auth: "user",
4306
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
4246
4307
  errors: [
4247
4308
  "validation:invalid_input",
4248
4309
  "auth:forbidden",
@@ -4552,6 +4613,7 @@ var init_endpoints = __esm({
4552
4613
  tags: ["site-{siteId}", "passes-{siteId}"],
4553
4614
  auth: "user",
4554
4615
  responseKind: "json",
4616
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4555
4617
  errors: ["validation:invalid_input", "server:internal_error"]
4556
4618
  },
4557
4619
  getBookingPass: {
@@ -4567,6 +4629,7 @@ var init_endpoints = __esm({
4567
4629
  tags: ["site-{siteId}", "passes-{siteId}"],
4568
4630
  auth: "user",
4569
4631
  responseKind: "json",
4632
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4570
4633
  errors: [
4571
4634
  "validation:invalid_input",
4572
4635
  "resource:not_found",
@@ -4579,6 +4642,7 @@ var init_endpoints = __esm({
4579
4642
  tags: ["site-{siteId}", "passes-{siteId}"],
4580
4643
  auth: "user",
4581
4644
  responseKind: "json",
4645
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4582
4646
  errors: [
4583
4647
  "validation:invalid_input",
4584
4648
  "resource:not_found",
@@ -4634,6 +4698,7 @@ var init_endpoints = __esm({
4634
4698
  tags: ["site-{siteId}", "memberships-{siteId}"],
4635
4699
  auth: "user",
4636
4700
  responseKind: "json",
4701
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4637
4702
  errors: ["validation:invalid_input", "server:internal_error"]
4638
4703
  },
4639
4704
  getBookingMembership: {
@@ -4649,6 +4714,7 @@ var init_endpoints = __esm({
4649
4714
  tags: ["site-{siteId}", "memberships-{siteId}"],
4650
4715
  auth: "user",
4651
4716
  responseKind: "json",
4717
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4652
4718
  errors: [
4653
4719
  "validation:invalid_input",
4654
4720
  "resource:not_found",
@@ -4661,6 +4727,7 @@ var init_endpoints = __esm({
4661
4727
  tags: ["site-{siteId}", "memberships-{siteId}"],
4662
4728
  auth: "user",
4663
4729
  responseKind: "json",
4730
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4664
4731
  errors: [
4665
4732
  "validation:invalid_input",
4666
4733
  "resource:not_found",
@@ -4877,6 +4944,7 @@ var init_endpoints = __esm({
4877
4944
  tags: ["site-{siteId}", "customers-{siteId}"],
4878
4945
  auth: "user",
4879
4946
  responseKind: "json",
4947
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4880
4948
  errors: [
4881
4949
  "validation:invalid_input",
4882
4950
  "auth:forbidden",
@@ -6950,6 +7018,7 @@ var init_validation_constants = __esm({
6950
7018
  "date.formatShort",
6951
7019
  "array.length",
6952
7020
  "value.jsonArray",
7021
+ "value.csv",
6953
7022
  "array.marqueeLoop",
6954
7023
  // Layout (layout.ts)
6955
7024
  "layout.maxWidthClass",
@@ -7768,8 +7837,7 @@ var init_contracts2 = __esm({
7768
7837
  dashboardNavVisibilityRolesSchema = z5.object({
7769
7838
  administrator: dashboardNavVisibilityBaseSchema.optional(),
7770
7839
  editor: dashboardNavVisibilityBaseSchema.optional(),
7771
- team_member: dashboardNavVisibilityBaseSchema.optional(),
7772
- event_host: dashboardNavVisibilityBaseSchema.optional()
7840
+ team_member: dashboardNavVisibilityBaseSchema.optional()
7773
7841
  }).strip().optional();
7774
7842
  dashboardNavVisibilitySchema = dashboardNavVisibilityBaseSchema.extend({
7775
7843
  roles: dashboardNavVisibilityRolesSchema
@@ -8406,6 +8474,21 @@ var init_appointmentSetup = __esm({
8406
8474
  timezone: z7.string().trim().min(1).nullable(),
8407
8475
  payment: appointmentSetupPaymentDraftSchema,
8408
8476
  assignment: appointmentSetupServiceAssignmentDraftSchema
8477
+ }).superRefine((service, ctx) => {
8478
+ if (service.payment.priceType === "paid" && (service.priceAmount === null || service.priceAmount <= 0)) {
8479
+ ctx.addIssue({
8480
+ code: "custom",
8481
+ path: ["priceAmount"],
8482
+ message: "Paid appointment services need a positive price."
8483
+ });
8484
+ }
8485
+ if (service.payment.priceType === "free" && service.priceAmount !== null && service.priceAmount > 0) {
8486
+ ctx.addIssue({
8487
+ code: "custom",
8488
+ path: ["priceAmount"],
8489
+ message: "Free appointment services cannot carry a positive price."
8490
+ });
8491
+ }
8409
8492
  });
8410
8493
  appointmentSetupPractitionerDraftSchema = z7.object({
8411
8494
  ref: appointmentSetupRefSchema,
@@ -9078,6 +9161,101 @@ var init_manifest = __esm({
9078
9161
  }
9079
9162
  });
9080
9163
 
9164
+ // ../theme-core/src/palette/utils/colorConversion.ts
9165
+ function hexToRgb(hex) {
9166
+ const h = hex.replace(/^#/, "");
9167
+ const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
9168
+ if (m.length !== 6) throw new Error("Bad hex");
9169
+ const int = parseInt(m, 16);
9170
+ return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
9171
+ }
9172
+ function srgbToLinear(u) {
9173
+ const x = u / 255;
9174
+ return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
9175
+ }
9176
+ function rgbToHsl(r, g, b) {
9177
+ const R = r / 255, G = g / 255, B = b / 255;
9178
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
9179
+ const d = max - min;
9180
+ let h = 0;
9181
+ if (d !== 0) {
9182
+ switch (max) {
9183
+ case R:
9184
+ h = (G - B) / d + (G < B ? 6 : 0);
9185
+ break;
9186
+ case G:
9187
+ h = (B - R) / d + 2;
9188
+ break;
9189
+ case B:
9190
+ h = (R - G) / d + 4;
9191
+ break;
9192
+ }
9193
+ h *= 60;
9194
+ }
9195
+ const l = (max + min) / 2;
9196
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
9197
+ return { h, s, l };
9198
+ }
9199
+ function srgbToOklab(r, g, b) {
9200
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
9201
+ const l = 0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B;
9202
+ const m = 0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B;
9203
+ const s = 0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B;
9204
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
9205
+ const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
9206
+ const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
9207
+ const b2 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
9208
+ return { L, a, b: b2 };
9209
+ }
9210
+ function oklabToOklch(L, a, b) {
9211
+ const C = Math.sqrt(a * a + b * b);
9212
+ const h = C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI);
9213
+ return { L, C, h };
9214
+ }
9215
+ function featuresFromHex(hex) {
9216
+ const { r, g, b } = hexToRgb(hex);
9217
+ const { h, s, l } = rgbToHsl(r, g, b);
9218
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
9219
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
9220
+ const max = Math.max(r, g, b);
9221
+ const v = max / 255;
9222
+ const Y = 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);
9223
+ const chroma = s;
9224
+ return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };
9225
+ }
9226
+ var mod, deg;
9227
+ var init_colorConversion = __esm({
9228
+ "../theme-core/src/palette/utils/colorConversion.ts"() {
9229
+ "use strict";
9230
+ mod = (a, n) => (a % n + n) % n;
9231
+ deg = (x) => mod(x, 360);
9232
+ }
9233
+ });
9234
+
9235
+ // ../theme-core/src/palette/utils/contrast.ts
9236
+ var init_contrast = __esm({
9237
+ "../theme-core/src/palette/utils/contrast.ts"() {
9238
+ "use strict";
9239
+ init_colorConversion();
9240
+ }
9241
+ });
9242
+
9243
+ // ../theme-core/src/palette/utils/onColor.ts
9244
+ var init_onColor = __esm({
9245
+ "../theme-core/src/palette/utils/onColor.ts"() {
9246
+ "use strict";
9247
+ }
9248
+ });
9249
+
9250
+ // ../theme-core/src/site-styles/accessibleSurfaces.ts
9251
+ var init_accessibleSurfaces = __esm({
9252
+ "../theme-core/src/site-styles/accessibleSurfaces.ts"() {
9253
+ "use strict";
9254
+ init_contrast();
9255
+ init_onColor();
9256
+ }
9257
+ });
9258
+
9081
9259
  // ../theme-core/src/site-styles/appearancePresetResolution.ts
9082
9260
  function assertValidOptionGroups(preset2) {
9083
9261
  preset2.optionGroups?.forEach((group) => {
@@ -11075,7 +11253,7 @@ var init_constants = __esm({
11075
11253
  });
11076
11254
 
11077
11255
  // ../theme-core/src/buttons/utils/contrast.ts
11078
- var init_contrast = __esm({
11256
+ var init_contrast2 = __esm({
11079
11257
  "../theme-core/src/buttons/utils/contrast.ts"() {
11080
11258
  "use strict";
11081
11259
  }
@@ -11085,7 +11263,7 @@ var init_contrast = __esm({
11085
11263
  var init_generateDefaultButtonSystem = __esm({
11086
11264
  "../theme-core/src/buttons/generateDefaultButtonSystem.ts"() {
11087
11265
  "use strict";
11088
- init_contrast();
11266
+ init_contrast2();
11089
11267
  }
11090
11268
  });
11091
11269
 
@@ -13227,7 +13405,8 @@ function defineCuratedSiteStyle(input) {
13227
13405
  name: input.name,
13228
13406
  description: input.description,
13229
13407
  generationBrief: input.generationBrief,
13230
- selectionKeywords: input.selectionKeywords ?? [],
13408
+ selectionKeywordRules: input.selectionKeywordRules ?? [],
13409
+ siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
13231
13410
  template: {
13232
13411
  id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
13233
13412
  name: input.name,
@@ -13272,6 +13451,9 @@ var init_curatedSiteStyles = __esm({
13272
13451
  "site-style:bright-community",
13273
13452
  "site-style:quiet-luxury",
13274
13453
  "site-style:practical-services",
13454
+ "site-style:quiet-practice",
13455
+ "site-style:personal-retreat-journal",
13456
+ "site-style:tactile-workshop",
13275
13457
  "site-style:modern-wellness",
13276
13458
  "site-style:bold-launch",
13277
13459
  "site-style:south-west-twerk-school"
@@ -13455,12 +13637,13 @@ var init_curatedSiteStyles = __esm({
13455
13637
  name: "Quiet Luxury",
13456
13638
  description: "Minimal, confident, and refined for premium experiences and private services.",
13457
13639
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
13458
- selectionKeywords: [
13459
- "luxury",
13460
- "premium",
13461
- "boutique",
13462
- "bespoke",
13463
- "exclusive"
13640
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
13641
+ selectionKeywordRules: [
13642
+ { kind: "word", value: "luxury" },
13643
+ { kind: "word", value: "premium" },
13644
+ { kind: "word", value: "boutique" },
13645
+ { kind: "word", value: "bespoke" },
13646
+ { kind: "word", value: "exclusive" }
13464
13647
  ],
13465
13648
  tokenRecipes: {
13466
13649
  palette: "high-contrast",
@@ -13489,13 +13672,14 @@ var init_curatedSiteStyles = __esm({
13489
13672
  name: "Practical Services",
13490
13673
  description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
13491
13674
  generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
13492
- selectionKeywords: [
13493
- "repair",
13494
- "plumb",
13495
- "electric",
13496
- "cleaning",
13497
- "landscap",
13498
- "contractor"
13675
+ siteCreatorSelection: { kind: "primary_goal_support" },
13676
+ selectionKeywordRules: [
13677
+ { kind: "word", value: "repair" },
13678
+ { kind: "substring", value: "plumb" },
13679
+ { kind: "substring", value: "electric" },
13680
+ { kind: "word", value: "cleaning" },
13681
+ { kind: "substring", value: "landscap" },
13682
+ { kind: "substring", value: "contractor" }
13499
13683
  ],
13500
13684
  tokenRecipes: {
13501
13685
  palette: "brand-led",
@@ -13546,18 +13730,134 @@ var init_curatedSiteStyles = __esm({
13546
13730
  paletteChoice("warm-neutral-forest")
13547
13731
  ]
13548
13732
  }),
13733
+ defineCuratedSiteStyle({
13734
+ id: "site-style:quiet-practice",
13735
+ name: "Quiet Practice",
13736
+ description: "Grounded, calm, and practical for small appointment-first practices.",
13737
+ 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.",
13738
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
13739
+ selectionKeywordRules: [
13740
+ { kind: "substring", value: "massage" },
13741
+ { kind: "word", value: "bodywork" },
13742
+ { kind: "phrase", value: "appointment practice" },
13743
+ { kind: "phrase", value: "appointment-first" },
13744
+ { kind: "substring", value: "practitioner" },
13745
+ { kind: "substring", value: "therap" },
13746
+ { kind: "substring", value: "clinic" },
13747
+ { kind: "phrase", value: "wellness practice" }
13748
+ ],
13749
+ tokenRecipes: {
13750
+ palette: "soft-natural",
13751
+ contrast: "standard",
13752
+ radius: "soft",
13753
+ shadow: "subtle",
13754
+ typography: "clean-sans",
13755
+ spacing: "regular",
13756
+ motion: "subtle"
13757
+ },
13758
+ compositionBudget: quietBudget,
13759
+ recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
13760
+ buttonPersonalityChoices: [
13761
+ buttonChoice("pebble"),
13762
+ buttonChoice("soft-pill"),
13763
+ buttonChoice("editorial-link")
13764
+ ],
13765
+ paletteVariantChoices: [
13766
+ paletteChoice("soft-natural-stone"),
13767
+ paletteChoice("soft-natural-sage"),
13768
+ paletteChoice("warm-neutral-clay")
13769
+ ]
13770
+ }),
13771
+ defineCuratedSiteStyle({
13772
+ id: "site-style:personal-retreat-journal",
13773
+ name: "Personal Retreat Journal",
13774
+ description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
13775
+ 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.",
13776
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
13777
+ selectionKeywordRules: [
13778
+ { kind: "substring", value: "retreat" },
13779
+ { kind: "phrase", value: "solo practitioner" },
13780
+ { kind: "phrase", value: "personal brand" },
13781
+ { kind: "substring", value: "teacher" },
13782
+ { kind: "substring", value: "coach" },
13783
+ { kind: "phrase", value: "retreat resources" },
13784
+ { kind: "substring", value: "journal" }
13785
+ ],
13786
+ tokenRecipes: {
13787
+ palette: "warm-neutral",
13788
+ contrast: "standard",
13789
+ radius: "soft",
13790
+ shadow: "subtle",
13791
+ typography: "serif-editorial",
13792
+ spacing: "airy",
13793
+ motion: "subtle"
13794
+ },
13795
+ compositionBudget: balancedBudget,
13796
+ recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
13797
+ buttonPersonalityChoices: [
13798
+ buttonChoice("editorial-link"),
13799
+ buttonChoice("soft-pill"),
13800
+ buttonChoice("brushed-wash")
13801
+ ],
13802
+ paletteVariantChoices: [
13803
+ paletteChoice("warm-neutral-forest"),
13804
+ paletteChoice("warm-neutral-clay"),
13805
+ paletteChoice("soft-natural-stone")
13806
+ ]
13807
+ }),
13808
+ defineCuratedSiteStyle({
13809
+ id: "site-style:tactile-workshop",
13810
+ name: "Tactile Workshop",
13811
+ description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
13812
+ 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.",
13813
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
13814
+ selectionKeywordRules: [
13815
+ { kind: "substring", value: "ceramic" },
13816
+ { kind: "word", value: "pottery" },
13817
+ { kind: "phrase", value: "maker studio" },
13818
+ { kind: "phrase", value: "craft class" },
13819
+ { kind: "phrase", value: "craft workshop" },
13820
+ { kind: "word", value: "clay" },
13821
+ { kind: "word", value: "kiln" }
13822
+ ],
13823
+ tokenRecipes: {
13824
+ palette: "brand-led",
13825
+ contrast: "standard",
13826
+ radius: "soft",
13827
+ shadow: "subtle",
13828
+ typography: "friendly-sans",
13829
+ spacing: "regular",
13830
+ motion: "subtle"
13831
+ },
13832
+ compositionBudget: balancedBudget,
13833
+ recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
13834
+ recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
13835
+ buttonPersonalityChoices: [
13836
+ buttonChoice("pebble"),
13837
+ buttonChoice("confident-chip"),
13838
+ buttonChoice("ink-stamp"),
13839
+ buttonChoice("editorial-link")
13840
+ ],
13841
+ paletteVariantChoices: [
13842
+ paletteChoice("brand-led-warm"),
13843
+ paletteChoice("brand-led-cool"),
13844
+ paletteChoice("soft-natural-watercolor"),
13845
+ paletteChoice("warm-neutral-clay")
13846
+ ]
13847
+ }),
13549
13848
  defineCuratedSiteStyle({
13550
13849
  id: "site-style:bold-launch",
13551
13850
  name: "Bold Launch",
13552
13851
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
13553
13852
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
13554
- selectionKeywords: [
13555
- "launch",
13556
- "campaign",
13557
- "preorder",
13558
- "pre-order",
13559
- "waitlist",
13560
- "drop"
13853
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
13854
+ selectionKeywordRules: [
13855
+ { kind: "substring", value: "launch" },
13856
+ { kind: "substring", value: "campaign" },
13857
+ { kind: "word", value: "preorder" },
13858
+ { kind: "phrase", value: "pre-order" },
13859
+ { kind: "substring", value: "waitlist" },
13860
+ { kind: "word", value: "drop" }
13561
13861
  ],
13562
13862
  tokenRecipes: {
13563
13863
  palette: "high-contrast",
@@ -13588,15 +13888,6 @@ var init_curatedSiteStyles = __esm({
13588
13888
  name: "South West Twerk School",
13589
13889
  description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
13590
13890
  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.",
13591
- selectionKeywords: [
13592
- "dance",
13593
- "classes",
13594
- "workshop",
13595
- "school",
13596
- "movement",
13597
- "performance",
13598
- "community"
13599
- ],
13600
13891
  tokenRecipes: {
13601
13892
  palette: "brand-led",
13602
13893
  contrast: "maximum",
@@ -13782,6 +14073,43 @@ var init_modern_minimal = __esm({
13782
14073
  }
13783
14074
  });
13784
14075
 
14076
+ // ../theme-core/src/palette/generateShades.ts
14077
+ var init_generateShades = __esm({
14078
+ "../theme-core/src/palette/generateShades.ts"() {
14079
+ "use strict";
14080
+ init_colorConversion();
14081
+ }
14082
+ });
14083
+
14084
+ // ../theme-core/src/palette/neutralScale.ts
14085
+ var init_neutralScale = __esm({
14086
+ "../theme-core/src/palette/neutralScale.ts"() {
14087
+ "use strict";
14088
+ init_colorConversion();
14089
+ }
14090
+ });
14091
+
14092
+ // ../theme-core/src/palette/utils/textColor.ts
14093
+ var init_textColor = __esm({
14094
+ "../theme-core/src/palette/utils/textColor.ts"() {
14095
+ "use strict";
14096
+ init_colorConversion();
14097
+ init_contrast();
14098
+ }
14099
+ });
14100
+
14101
+ // ../theme-core/src/palette/expandPalette.ts
14102
+ var init_expandPalette = __esm({
14103
+ "../theme-core/src/palette/expandPalette.ts"() {
14104
+ "use strict";
14105
+ init_generateShades();
14106
+ init_neutralScale();
14107
+ init_colorConversion();
14108
+ init_textColor();
14109
+ init_onColor();
14110
+ }
14111
+ });
14112
+
13785
14113
  // ../theme-core/src/site-styles/rawStyleFields.ts
13786
14114
  var themeV2RuntimeStyleFieldNames, themeV2BlockSpecificRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNameSet;
13787
14115
  var init_rawStyleFields = __esm({
@@ -13965,35 +14293,31 @@ var init_runtimeCompiler = __esm({
13965
14293
  "use strict";
13966
14294
  init_schema3();
13967
14295
  init_modern_minimal();
14296
+ init_expandPalette();
13968
14297
  init_personalities();
13969
14298
  init_variants();
13970
14299
  init_designState();
13971
14300
  init_types3();
14301
+ init_accessibleSurfaces();
13972
14302
  defaultDesignRuntimeRules = defineDesignRuntimeRules({
13973
14303
  sectionSurfaces: {
13974
14304
  base: {},
13975
14305
  "muted-band": {
13976
14306
  background: {
13977
14307
  type: "color",
13978
- color: "muted",
13979
- textColor: "text",
13980
- headingColor: "text"
14308
+ color: "muted"
13981
14309
  }
13982
14310
  },
13983
14311
  "accent-band": {
13984
14312
  background: {
13985
14313
  type: "color",
13986
- color: "primary",
13987
- textColor: "primaryForeground",
13988
- headingColor: "primaryForeground"
14314
+ color: "primary"
13989
14315
  }
13990
14316
  },
13991
14317
  "brand-depth-band": {
13992
14318
  background: {
13993
14319
  type: "color",
13994
- color: "primary-800",
13995
- textColor: "primaryForeground",
13996
- headingColor: "primaryForeground"
14320
+ color: "primary-800"
13997
14321
  }
13998
14322
  },
13999
14323
  "hero-image": {
@@ -14459,6 +14783,7 @@ var init_tokenRecipes = __esm({
14459
14783
  var init_site_styles = __esm({
14460
14784
  "../theme-core/src/site-styles/index.ts"() {
14461
14785
  "use strict";
14786
+ init_accessibleSurfaces();
14462
14787
  init_appearancePresets();
14463
14788
  init_blockFlow();
14464
14789
  init_compositionBudget();
@@ -21126,7 +21451,7 @@ var init_faq = __esm({
21126
21451
 
21127
21452
  // ../blocks/src/system/transforms/registry/formatting.ts
21128
21453
  import { z as z38 } from "zod";
21129
- var uppercaseTransform, fallbackTransform, dateFormatShort, arrayLengthTransform, jsonArrayTransform, marqueeLoopOptionsSchema, marqueeLoopTransform, formattingTransforms;
21454
+ var uppercaseTransform, fallbackTransform, dateFormatShort, arrayLengthTransform, jsonArrayTransform, csvTransform, marqueeLoopOptionsSchema, marqueeLoopTransform, formattingTransforms;
21130
21455
  var init_formatting = __esm({
21131
21456
  "../blocks/src/system/transforms/registry/formatting.ts"() {
21132
21457
  "use strict";
@@ -21187,6 +21512,16 @@ var init_formatting = __esm({
21187
21512
  return "";
21188
21513
  }
21189
21514
  };
21515
+ csvTransform = {
21516
+ id: "value.csv",
21517
+ kind: "formatter",
21518
+ summary: "Normalize a string or array of strings into a comma-separated list",
21519
+ run: (value) => {
21520
+ const rawValues = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
21521
+ const normalized = rawValues.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean);
21522
+ return normalized.length > 0 ? Array.from(new Set(normalized)).join(",") : "";
21523
+ }
21524
+ };
21190
21525
  marqueeLoopOptionsSchema = z38.object({
21191
21526
  minItems: z38.number().int().min(1).default(10)
21192
21527
  });
@@ -21212,6 +21547,7 @@ var init_formatting = __esm({
21212
21547
  dateFormatShort,
21213
21548
  arrayLengthTransform,
21214
21549
  jsonArrayTransform,
21550
+ csvTransform,
21215
21551
  marqueeLoopTransform
21216
21552
  ];
21217
21553
  }
@@ -21706,77 +22042,6 @@ var init_ui = __esm({
21706
22042
  }
21707
22043
  });
21708
22044
 
21709
- // ../theme-core/src/palette/utils/colorConversion.ts
21710
- function hexToRgb(hex) {
21711
- const h = hex.replace(/^#/, "");
21712
- const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
21713
- if (m.length !== 6) throw new Error("Bad hex");
21714
- const int = parseInt(m, 16);
21715
- return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
21716
- }
21717
- function srgbToLinear(u) {
21718
- const x = u / 255;
21719
- return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
21720
- }
21721
- function rgbToHsl(r, g, b) {
21722
- const R = r / 255, G = g / 255, B = b / 255;
21723
- const max = Math.max(R, G, B), min = Math.min(R, G, B);
21724
- const d = max - min;
21725
- let h = 0;
21726
- if (d !== 0) {
21727
- switch (max) {
21728
- case R:
21729
- h = (G - B) / d + (G < B ? 6 : 0);
21730
- break;
21731
- case G:
21732
- h = (B - R) / d + 2;
21733
- break;
21734
- case B:
21735
- h = (R - G) / d + 4;
21736
- break;
21737
- }
21738
- h *= 60;
21739
- }
21740
- const l = (max + min) / 2;
21741
- const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
21742
- return { h, s, l };
21743
- }
21744
- function srgbToOklab(r, g, b) {
21745
- const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
21746
- const l = 0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B;
21747
- const m = 0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B;
21748
- const s = 0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B;
21749
- const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
21750
- const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
21751
- const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
21752
- const b2 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
21753
- return { L, a, b: b2 };
21754
- }
21755
- function oklabToOklch(L, a, b) {
21756
- const C = Math.sqrt(a * a + b * b);
21757
- const h = C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI);
21758
- return { L, C, h };
21759
- }
21760
- function featuresFromHex(hex) {
21761
- const { r, g, b } = hexToRgb(hex);
21762
- const { h, s, l } = rgbToHsl(r, g, b);
21763
- const { L, a, b: b2 } = srgbToOklab(r, g, b);
21764
- const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
21765
- const max = Math.max(r, g, b);
21766
- const v = max / 255;
21767
- const Y = 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);
21768
- const chroma = s;
21769
- return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };
21770
- }
21771
- var mod, deg;
21772
- var init_colorConversion = __esm({
21773
- "../theme-core/src/palette/utils/colorConversion.ts"() {
21774
- "use strict";
21775
- mod = (a, n) => (a % n + n) % n;
21776
- deg = (x) => mod(x, 360);
21777
- }
21778
- });
21779
-
21780
22045
  // ../blocks/src/system/transforms/registry/layout.ts
21781
22046
  import { z as z40 } from "zod";
21782
22047
  function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "surface") {
@@ -26871,7 +27136,12 @@ var init_event_listing = __esm({
26871
27136
  detailLevel: "listing",
26872
27137
  kind: { $bind: { from: "content.kind" } },
26873
27138
  eventSurface: { $bind: { from: "content.eventSurface" } },
26874
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
27139
+ eventPresets: {
27140
+ $bind: {
27141
+ from: "content.filterEventPresets",
27142
+ transforms: [{ id: "value.csv" }]
27143
+ }
27144
+ },
26875
27145
  scheduleScope: { $bind: { from: "content.scheduleScope" } }
26876
27146
  },
26877
27147
  mode: "server"
@@ -27651,7 +27921,12 @@ var init_event_calendar = __esm({
27651
27921
  // Pass filter params if configured
27652
27922
  kind: { $bind: { from: "content.kind" } },
27653
27923
  eventSurface: { $bind: { from: "content.eventSurface" } },
27654
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
27924
+ eventPresets: {
27925
+ $bind: {
27926
+ from: "content.filterEventPresets",
27927
+ transforms: [{ id: "value.csv" }]
27928
+ }
27929
+ },
27655
27930
  scheduleScope: { $bind: { from: "content.scheduleScope" } },
27656
27931
  categoryIds: { $bind: { from: "content.filterCategoryIds" } },
27657
27932
  staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },