@riverbankcms/sdk 0.64.0 → 0.67.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 (78) hide show
  1. package/dist/_dts/api/src/aiPlayground.d.ts +18 -11
  2. package/dist/_dts/api/src/apiEndpointTypes.d.ts +12 -0
  3. package/dist/_dts/api/src/bookingOperations.d.ts +1 -1
  4. package/dist/_dts/api/src/endpoints.d.ts +25 -0
  5. package/dist/_dts/api/src/sdkConfig/contracts.d.ts +0 -40
  6. package/dist/_dts/api/src/sdkContracts.d.ts +1 -1
  7. package/dist/_dts/api/src/siteMembers.d.ts +1 -1
  8. package/dist/_dts/api/src/siteOperations.d.ts +1 -1
  9. package/dist/_dts/billing/src/plans/types.d.ts +1 -1
  10. package/dist/_dts/blocks/src/bindings/index.d.ts +1 -1
  11. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  12. package/dist/_dts/blocks/src/system/transforms/registry/formatting.d.ts +1 -0
  13. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  14. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +81 -0
  15. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +7 -3
  16. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  17. package/dist/_dts/sdk/src/cli/commands/push/execute/footer.d.ts +33 -0
  18. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +2 -1
  19. package/dist/_dts/sdk/src/cli/env.d.ts +2 -1
  20. package/dist/_dts/sdk/src/cli/merge-remote/entryMergePush.d.ts +2 -1
  21. package/dist/_dts/sdk/src/cli/site-commands/commandKeys.d.ts +13 -0
  22. package/dist/_dts/sdk/src/cli/site-commands/commandRuntime.d.ts +114 -0
  23. package/dist/_dts/sdk/src/cli/site-commands/entryCommands.d.ts +26 -48
  24. package/dist/_dts/sdk/src/cli/site-commands/footerCommands.d.ts +50 -0
  25. package/dist/_dts/sdk/src/cli/site-commands/formCommands.d.ts +57 -0
  26. package/dist/_dts/sdk/src/cli/site-commands/index.d.ts +5 -0
  27. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +57 -0
  28. package/dist/_dts/sdk/src/cli/site-commands/pageCommands.d.ts +83 -0
  29. package/dist/_dts/sdk/src/cli/site-commands/pushExecution.d.ts +67 -14
  30. package/dist/_dts/sdk/src/cli/sync/executor.d.ts +10 -28
  31. package/dist/_dts/sdk/src/cli/sync/index.d.ts +1 -1
  32. package/dist/_dts/sdk/src/config/dashboard-validation.d.ts +0 -48
  33. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  34. package/dist/_dts/sdk/src/version.d.ts +1 -1
  35. package/dist/_dts/site-commands/src/adapter.d.ts +2 -2
  36. package/dist/_dts/site-commands/src/commands.d.ts +410 -13
  37. package/dist/_dts/site-commands/src/domain.d.ts +3 -3
  38. package/dist/_dts/site-commands/src/exposure.d.ts +41 -0
  39. package/dist/_dts/site-commands/src/index.d.ts +1 -0
  40. package/dist/_dts/site-commands/src/metadata.d.ts +93 -2
  41. package/dist/_dts/site-commands/src/planner.d.ts +13 -6
  42. package/dist/_dts/site-commands/src/refs.d.ts +13 -1
  43. package/dist/_dts/theme-core/src/palette/utils/index.d.ts +1 -0
  44. package/dist/_dts/theme-core/src/palette/utils/onColor.d.ts +2 -0
  45. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +83 -0
  46. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +2 -1
  47. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +89 -12
  48. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +8 -2
  49. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  50. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +3 -2
  51. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -6
  52. package/dist/_dts/ui/src/callout.d.ts +1 -1
  53. package/dist/cli/index.mjs +4290 -2513
  54. package/dist/client/client.mjs +598 -372
  55. package/dist/client/hooks.mjs +311 -123
  56. package/dist/client/rendering/client.mjs +209 -68
  57. package/dist/client/rendering/islands.mjs +281 -150
  58. package/dist/client/rendering.mjs +416 -190
  59. package/dist/preview-next/before-render.mjs +61 -13
  60. package/dist/preview-next/client/runtime.mjs +930 -376
  61. package/dist/preview-next/middleware.mjs +61 -13
  62. package/dist/server/components.mjs +526 -325
  63. package/dist/server/config-validation.mjs +313 -125
  64. package/dist/server/config.mjs +313 -125
  65. package/dist/server/data.mjs +311 -123
  66. package/dist/server/index.mjs +78 -16
  67. package/dist/server/next.mjs +527 -326
  68. package/dist/server/page-converter.mjs +159 -41
  69. package/dist/server/prebuild.mjs +1 -1
  70. package/dist/server/rendering/server.mjs +526 -325
  71. package/dist/server/rendering.mjs +526 -325
  72. package/dist/server/routing.mjs +392 -131
  73. package/dist/server/server.mjs +312 -124
  74. package/dist/server/theme-bridge.mjs +155 -48
  75. package/package.json +1 -1
  76. package/dist/_dts/path-utils/src/index.d.ts +0 -8
  77. package/dist/_dts/path-utils/src/redirectPaths.d.ts +0 -26
  78. package/dist/_dts/path-utils/src/safeAppPath.d.ts +0 -26
@@ -46,6 +46,17 @@ function fallbackBinding(...sources) {
46
46
  // src/config/validation.ts
47
47
  import { z as z68 } from "zod";
48
48
 
49
+ // ../api/src/apiEndpointTypes.ts
50
+ function blockedDemoMutationPolicy(classification, publicMessage) {
51
+ if (publicMessage.trim() === "") {
52
+ throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
53
+ }
54
+ return {
55
+ classification,
56
+ publicMessage
57
+ };
58
+ }
59
+
49
60
  // ../api/src/cache-tags.ts
50
61
  var TAG_TEMPLATES = {
51
62
  siteCollection: "riverbank:site",
@@ -76,6 +87,18 @@ var TAG_TEMPLATES = {
76
87
  };
77
88
 
78
89
  // ../api/src/endpoints.ts
90
+ var DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy(
91
+ "blocked-hidden",
92
+ "This action is not available in demo sites."
93
+ );
94
+ var DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy(
95
+ "blocked-disabled",
96
+ "This setting is disabled in demo sites."
97
+ );
98
+ var DEMO_MUTATION_INTERNAL_ONLY = blockedDemoMutationPolicy(
99
+ "internal-only",
100
+ "This internal operation is not available in demo sites."
101
+ );
79
102
  var ENDPOINT_DEFINITIONS = {
80
103
  // AI endpoints - no cache due to dynamic nature
81
104
  aiContentUpdateChat: {
@@ -192,7 +215,8 @@ var ENDPOINT_DEFINITIONS = {
192
215
  path: "/sites/{siteId}/ai/generate",
193
216
  method: "POST",
194
217
  auth: "user",
195
- responseKind: "json"
218
+ responseKind: "json",
219
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
196
220
  },
197
221
  getOnboardingPreviewStatus: {
198
222
  path: "/public/sites/{siteId}/onboarding/preview-status",
@@ -213,7 +237,8 @@ var ENDPOINT_DEFINITIONS = {
213
237
  method: "POST",
214
238
  auth: "user",
215
239
  errors: [],
216
- responseKind: "json"
240
+ responseKind: "json",
241
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
217
242
  },
218
243
  goLiveSite: {
219
244
  path: "/sites/{siteId}/launch/go-live",
@@ -282,20 +307,23 @@ var ENDPOINT_DEFINITIONS = {
282
307
  path: "/sites/{siteId}/ai/site-wizard/goals",
283
308
  method: "POST",
284
309
  auth: "user",
285
- responseKind: "json"
310
+ responseKind: "json",
311
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
286
312
  },
287
313
  aiSiteWizardIntakeTriage: {
288
314
  path: "/sites/{siteId}/ai/site-wizard/intake-triage",
289
315
  method: "POST",
290
316
  auth: "user",
291
- responseKind: "json"
317
+ responseKind: "json",
318
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
292
319
  },
293
320
  aiSiteWizardTelemetry: {
294
321
  path: "/sites/{siteId}/ai/site-wizard/telemetry",
295
322
  method: "POST",
296
323
  auth: "user",
297
324
  errors: [],
298
- responseKind: "json"
325
+ responseKind: "json",
326
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
299
327
  },
300
328
  // Admin SEO
301
329
  listGscPropertiesAdmin: {
@@ -502,7 +530,7 @@ var ENDPOINT_DEFINITIONS = {
502
530
  responseKind: "json",
503
531
  errors: ["resource:not_found", "server:internal_error"]
504
532
  },
505
- // Ops (event hosts/admins)
533
+ // Ops (staff event operators/admins)
506
534
  opsListUpcomingEventOccurrences: {
507
535
  path: "/ops/sites/{siteId}/events",
508
536
  method: "GET",
@@ -520,6 +548,7 @@ var ENDPOINT_DEFINITIONS = {
520
548
  method: "POST",
521
549
  auth: "user",
522
550
  responseKind: "json",
551
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
523
552
  errors: [
524
553
  "validation:invalid_input",
525
554
  "auth:forbidden",
@@ -532,6 +561,7 @@ var ENDPOINT_DEFINITIONS = {
532
561
  method: "POST",
533
562
  auth: "user",
534
563
  responseKind: "json",
564
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
535
565
  errors: [
536
566
  "validation:invalid_input",
537
567
  "auth:forbidden",
@@ -550,6 +580,7 @@ var ENDPOINT_DEFINITIONS = {
550
580
  method: "POST",
551
581
  auth: "user",
552
582
  responseKind: "json",
583
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
553
584
  errors: [
554
585
  "validation:invalid_input",
555
586
  "auth:forbidden",
@@ -583,6 +614,7 @@ var ENDPOINT_DEFINITIONS = {
583
614
  method: "POST",
584
615
  auth: "user",
585
616
  responseKind: "json",
617
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
586
618
  errors: [
587
619
  "validation:invalid_input",
588
620
  "auth:forbidden",
@@ -611,7 +643,8 @@ var ENDPOINT_DEFINITIONS = {
611
643
  method: "POST",
612
644
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings],
613
645
  auth: "user",
614
- responseKind: "json"
646
+ responseKind: "json",
647
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
615
648
  },
616
649
  previewEmailTemplate: {
617
650
  path: "/sites/{siteId}/settings/emails/preview",
@@ -662,14 +695,16 @@ var ENDPOINT_DEFINITIONS = {
662
695
  method: "POST",
663
696
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
664
697
  auth: "user",
665
- responseKind: "json"
698
+ responseKind: "json",
699
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
666
700
  },
667
701
  createNewsletterSubscribersImportUploadUrl: {
668
702
  path: "/sites/{siteId}/newsletter/subscribers/import-url",
669
703
  method: "POST",
670
704
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
671
705
  auth: "user",
672
- responseKind: "json"
706
+ responseKind: "json",
707
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
673
708
  },
674
709
  exportNewsletterSubscribersCsv: {
675
710
  path: "/sites/{siteId}/newsletter/subscribers/export.csv",
@@ -866,14 +901,16 @@ var ENDPOINT_DEFINITIONS = {
866
901
  method: "POST",
867
902
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
868
903
  auth: "user",
869
- responseKind: "json"
904
+ responseKind: "json",
905
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
870
906
  },
871
907
  testSendNewsletterCampaign: {
872
908
  path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
873
909
  method: "POST",
874
910
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
875
911
  auth: "user",
876
- responseKind: "json"
912
+ responseKind: "json",
913
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
877
914
  },
878
915
  listNewsletterSendJobs: {
879
916
  path: "/sites/{siteId}/newsletter/jobs",
@@ -1561,7 +1598,8 @@ var ENDPOINT_DEFINITIONS = {
1561
1598
  method: "DELETE",
1562
1599
  tags: ["site", "site-{siteId}"],
1563
1600
  auth: "user",
1564
- responseKind: "json"
1601
+ responseKind: "json",
1602
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1565
1603
  },
1566
1604
  listSiteMembers: {
1567
1605
  path: "/sites/{siteId}/members",
@@ -2017,7 +2055,8 @@ var ENDPOINT_DEFINITIONS = {
2017
2055
  method: "POST",
2018
2056
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
2019
2057
  auth: "user",
2020
- responseKind: "json"
2058
+ responseKind: "json",
2059
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
2021
2060
  },
2022
2061
  updateSiteGeneralSettings: {
2023
2062
  path: "/sites/{siteId}/settings/general",
@@ -4256,6 +4295,7 @@ var ENDPOINT_DEFINITIONS = {
4256
4295
  method: "POST",
4257
4296
  tags: ["site-{siteId}"],
4258
4297
  auth: "user",
4298
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
4259
4299
  errors: [
4260
4300
  "validation:invalid_input",
4261
4301
  "auth:forbidden",
@@ -4270,6 +4310,7 @@ var ENDPOINT_DEFINITIONS = {
4270
4310
  method: "POST",
4271
4311
  tags: ["site-{siteId}"],
4272
4312
  auth: "user",
4313
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
4273
4314
  errors: [
4274
4315
  "validation:invalid_input",
4275
4316
  "auth:forbidden",
@@ -4579,6 +4620,7 @@ var ENDPOINT_DEFINITIONS = {
4579
4620
  tags: ["site-{siteId}", "passes-{siteId}"],
4580
4621
  auth: "user",
4581
4622
  responseKind: "json",
4623
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4582
4624
  errors: ["validation:invalid_input", "server:internal_error"]
4583
4625
  },
4584
4626
  getBookingPass: {
@@ -4594,6 +4636,7 @@ var ENDPOINT_DEFINITIONS = {
4594
4636
  tags: ["site-{siteId}", "passes-{siteId}"],
4595
4637
  auth: "user",
4596
4638
  responseKind: "json",
4639
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4597
4640
  errors: [
4598
4641
  "validation:invalid_input",
4599
4642
  "resource:not_found",
@@ -4606,6 +4649,7 @@ var ENDPOINT_DEFINITIONS = {
4606
4649
  tags: ["site-{siteId}", "passes-{siteId}"],
4607
4650
  auth: "user",
4608
4651
  responseKind: "json",
4652
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4609
4653
  errors: [
4610
4654
  "validation:invalid_input",
4611
4655
  "resource:not_found",
@@ -4661,6 +4705,7 @@ var ENDPOINT_DEFINITIONS = {
4661
4705
  tags: ["site-{siteId}", "memberships-{siteId}"],
4662
4706
  auth: "user",
4663
4707
  responseKind: "json",
4708
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4664
4709
  errors: ["validation:invalid_input", "server:internal_error"]
4665
4710
  },
4666
4711
  getBookingMembership: {
@@ -4676,6 +4721,7 @@ var ENDPOINT_DEFINITIONS = {
4676
4721
  tags: ["site-{siteId}", "memberships-{siteId}"],
4677
4722
  auth: "user",
4678
4723
  responseKind: "json",
4724
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4679
4725
  errors: [
4680
4726
  "validation:invalid_input",
4681
4727
  "resource:not_found",
@@ -4688,6 +4734,7 @@ var ENDPOINT_DEFINITIONS = {
4688
4734
  tags: ["site-{siteId}", "memberships-{siteId}"],
4689
4735
  auth: "user",
4690
4736
  responseKind: "json",
4737
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4691
4738
  errors: [
4692
4739
  "validation:invalid_input",
4693
4740
  "resource:not_found",
@@ -4904,6 +4951,7 @@ var ENDPOINT_DEFINITIONS = {
4904
4951
  tags: ["site-{siteId}", "customers-{siteId}"],
4905
4952
  auth: "user",
4906
4953
  responseKind: "json",
4954
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
4907
4955
  errors: [
4908
4956
  "validation:invalid_input",
4909
4957
  "auth:forbidden",
@@ -6492,6 +6540,7 @@ var ALLOWED_TRANSFORM_IDS = [
6492
6540
  "date.formatShort",
6493
6541
  "array.length",
6494
6542
  "value.jsonArray",
6543
+ "value.csv",
6495
6544
  "array.marqueeLoop",
6496
6545
  // Layout (layout.ts)
6497
6546
  "layout.maxWidthClass",
@@ -7261,8 +7310,7 @@ var dashboardNavVisibilityBaseSchema = z5.object({
7261
7310
  var dashboardNavVisibilityRolesSchema = z5.object({
7262
7311
  administrator: dashboardNavVisibilityBaseSchema.optional(),
7263
7312
  editor: dashboardNavVisibilityBaseSchema.optional(),
7264
- team_member: dashboardNavVisibilityBaseSchema.optional(),
7265
- event_host: dashboardNavVisibilityBaseSchema.optional()
7313
+ team_member: dashboardNavVisibilityBaseSchema.optional()
7266
7314
  }).strip().optional();
7267
7315
  var dashboardNavVisibilitySchema = dashboardNavVisibilityBaseSchema.extend({
7268
7316
  roles: dashboardNavVisibilityRolesSchema
@@ -7783,6 +7831,21 @@ var appointmentSetupServiceDraftSchema = z7.object({
7783
7831
  timezone: z7.string().trim().min(1).nullable(),
7784
7832
  payment: appointmentSetupPaymentDraftSchema,
7785
7833
  assignment: appointmentSetupServiceAssignmentDraftSchema
7834
+ }).superRefine((service, ctx) => {
7835
+ if (service.payment.priceType === "paid" && (service.priceAmount === null || service.priceAmount <= 0)) {
7836
+ ctx.addIssue({
7837
+ code: "custom",
7838
+ path: ["priceAmount"],
7839
+ message: "Paid appointment services need a positive price."
7840
+ });
7841
+ }
7842
+ if (service.payment.priceType === "free" && service.priceAmount !== null && service.priceAmount > 0) {
7843
+ ctx.addIssue({
7844
+ code: "custom",
7845
+ path: ["priceAmount"],
7846
+ message: "Free appointment services cannot carry a positive price."
7847
+ });
7848
+ }
7786
7849
  });
7787
7850
  var appointmentSetupPractitionerDraftSchema = z7.object({
7788
7851
  ref: appointmentSetupRefSchema,
@@ -8200,6 +8263,71 @@ function registerManifest(manifest) {
8200
8263
  return manifest;
8201
8264
  }
8202
8265
 
8266
+ // ../theme-core/src/palette/utils/colorConversion.ts
8267
+ var mod = (a, n) => (a % n + n) % n;
8268
+ var deg = (x) => mod(x, 360);
8269
+ function hexToRgb(hex) {
8270
+ const h = hex.replace(/^#/, "");
8271
+ const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
8272
+ if (m.length !== 6) throw new Error("Bad hex");
8273
+ const int = parseInt(m, 16);
8274
+ return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
8275
+ }
8276
+ function srgbToLinear(u) {
8277
+ const x = u / 255;
8278
+ return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
8279
+ }
8280
+ function rgbToHsl(r, g, b) {
8281
+ const R = r / 255, G = g / 255, B = b / 255;
8282
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
8283
+ const d = max - min;
8284
+ let h = 0;
8285
+ if (d !== 0) {
8286
+ switch (max) {
8287
+ case R:
8288
+ h = (G - B) / d + (G < B ? 6 : 0);
8289
+ break;
8290
+ case G:
8291
+ h = (B - R) / d + 2;
8292
+ break;
8293
+ case B:
8294
+ h = (R - G) / d + 4;
8295
+ break;
8296
+ }
8297
+ h *= 60;
8298
+ }
8299
+ const l = (max + min) / 2;
8300
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
8301
+ return { h, s, l };
8302
+ }
8303
+ function srgbToOklab(r, g, b) {
8304
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
8305
+ const l = 0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B;
8306
+ const m = 0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B;
8307
+ const s = 0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B;
8308
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
8309
+ const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
8310
+ const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
8311
+ const b2 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
8312
+ return { L, a, b: b2 };
8313
+ }
8314
+ function oklabToOklch(L, a, b) {
8315
+ const C = Math.sqrt(a * a + b * b);
8316
+ const h = C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI);
8317
+ return { L, C, h };
8318
+ }
8319
+ function featuresFromHex(hex) {
8320
+ const { r, g, b } = hexToRgb(hex);
8321
+ const { h, s, l } = rgbToHsl(r, g, b);
8322
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
8323
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
8324
+ const max = Math.max(r, g, b);
8325
+ const v = max / 255;
8326
+ const Y = 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);
8327
+ const chroma = s;
8328
+ return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };
8329
+ }
8330
+
8203
8331
  // ../theme-core/src/site-styles/appearancePresetResolution.ts
8204
8332
  function assertValidOptionGroups(preset2) {
8205
8333
  preset2.optionGroups?.forEach((group) => {
@@ -11729,6 +11857,9 @@ var curatedSiteStyleIdValues = [
11729
11857
  "site-style:bright-community",
11730
11858
  "site-style:quiet-luxury",
11731
11859
  "site-style:practical-services",
11860
+ "site-style:quiet-practice",
11861
+ "site-style:personal-retreat-journal",
11862
+ "site-style:tactile-workshop",
11732
11863
  "site-style:modern-wellness",
11733
11864
  "site-style:bold-launch",
11734
11865
  "site-style:south-west-twerk-school"
@@ -11811,7 +11942,8 @@ function defineCuratedSiteStyle(input) {
11811
11942
  name: input.name,
11812
11943
  description: input.description,
11813
11944
  generationBrief: input.generationBrief,
11814
- selectionKeywords: input.selectionKeywords ?? [],
11945
+ selectionKeywordRules: input.selectionKeywordRules ?? [],
11946
+ siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
11815
11947
  template: {
11816
11948
  id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
11817
11949
  name: input.name,
@@ -11955,12 +12087,13 @@ var curatedSiteStyles = [
11955
12087
  name: "Quiet Luxury",
11956
12088
  description: "Minimal, confident, and refined for premium experiences and private services.",
11957
12089
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
11958
- selectionKeywords: [
11959
- "luxury",
11960
- "premium",
11961
- "boutique",
11962
- "bespoke",
11963
- "exclusive"
12090
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
12091
+ selectionKeywordRules: [
12092
+ { kind: "word", value: "luxury" },
12093
+ { kind: "word", value: "premium" },
12094
+ { kind: "word", value: "boutique" },
12095
+ { kind: "word", value: "bespoke" },
12096
+ { kind: "word", value: "exclusive" }
11964
12097
  ],
11965
12098
  tokenRecipes: {
11966
12099
  palette: "high-contrast",
@@ -11989,13 +12122,14 @@ var curatedSiteStyles = [
11989
12122
  name: "Practical Services",
11990
12123
  description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
11991
12124
  generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
11992
- selectionKeywords: [
11993
- "repair",
11994
- "plumb",
11995
- "electric",
11996
- "cleaning",
11997
- "landscap",
11998
- "contractor"
12125
+ siteCreatorSelection: { kind: "primary_goal_support" },
12126
+ selectionKeywordRules: [
12127
+ { kind: "word", value: "repair" },
12128
+ { kind: "substring", value: "plumb" },
12129
+ { kind: "substring", value: "electric" },
12130
+ { kind: "word", value: "cleaning" },
12131
+ { kind: "substring", value: "landscap" },
12132
+ { kind: "substring", value: "contractor" }
11999
12133
  ],
12000
12134
  tokenRecipes: {
12001
12135
  palette: "brand-led",
@@ -12046,18 +12180,134 @@ var curatedSiteStyles = [
12046
12180
  paletteChoice("warm-neutral-forest")
12047
12181
  ]
12048
12182
  }),
12183
+ defineCuratedSiteStyle({
12184
+ id: "site-style:quiet-practice",
12185
+ name: "Quiet Practice",
12186
+ description: "Grounded, calm, and practical for small appointment-first practices.",
12187
+ 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.",
12188
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
12189
+ selectionKeywordRules: [
12190
+ { kind: "substring", value: "massage" },
12191
+ { kind: "word", value: "bodywork" },
12192
+ { kind: "phrase", value: "appointment practice" },
12193
+ { kind: "phrase", value: "appointment-first" },
12194
+ { kind: "substring", value: "practitioner" },
12195
+ { kind: "substring", value: "therap" },
12196
+ { kind: "substring", value: "clinic" },
12197
+ { kind: "phrase", value: "wellness practice" }
12198
+ ],
12199
+ tokenRecipes: {
12200
+ palette: "soft-natural",
12201
+ contrast: "standard",
12202
+ radius: "soft",
12203
+ shadow: "subtle",
12204
+ typography: "clean-sans",
12205
+ spacing: "regular",
12206
+ motion: "subtle"
12207
+ },
12208
+ compositionBudget: quietBudget,
12209
+ recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
12210
+ buttonPersonalityChoices: [
12211
+ buttonChoice("pebble"),
12212
+ buttonChoice("soft-pill"),
12213
+ buttonChoice("editorial-link")
12214
+ ],
12215
+ paletteVariantChoices: [
12216
+ paletteChoice("soft-natural-stone"),
12217
+ paletteChoice("soft-natural-sage"),
12218
+ paletteChoice("warm-neutral-clay")
12219
+ ]
12220
+ }),
12221
+ defineCuratedSiteStyle({
12222
+ id: "site-style:personal-retreat-journal",
12223
+ name: "Personal Retreat Journal",
12224
+ description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
12225
+ 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.",
12226
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
12227
+ selectionKeywordRules: [
12228
+ { kind: "substring", value: "retreat" },
12229
+ { kind: "phrase", value: "solo practitioner" },
12230
+ { kind: "phrase", value: "personal brand" },
12231
+ { kind: "substring", value: "teacher" },
12232
+ { kind: "substring", value: "coach" },
12233
+ { kind: "phrase", value: "retreat resources" },
12234
+ { kind: "substring", value: "journal" }
12235
+ ],
12236
+ tokenRecipes: {
12237
+ palette: "warm-neutral",
12238
+ contrast: "standard",
12239
+ radius: "soft",
12240
+ shadow: "subtle",
12241
+ typography: "serif-editorial",
12242
+ spacing: "airy",
12243
+ motion: "subtle"
12244
+ },
12245
+ compositionBudget: balancedBudget,
12246
+ recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
12247
+ buttonPersonalityChoices: [
12248
+ buttonChoice("editorial-link"),
12249
+ buttonChoice("soft-pill"),
12250
+ buttonChoice("brushed-wash")
12251
+ ],
12252
+ paletteVariantChoices: [
12253
+ paletteChoice("warm-neutral-forest"),
12254
+ paletteChoice("warm-neutral-clay"),
12255
+ paletteChoice("soft-natural-stone")
12256
+ ]
12257
+ }),
12258
+ defineCuratedSiteStyle({
12259
+ id: "site-style:tactile-workshop",
12260
+ name: "Tactile Workshop",
12261
+ description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
12262
+ 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.",
12263
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
12264
+ selectionKeywordRules: [
12265
+ { kind: "substring", value: "ceramic" },
12266
+ { kind: "word", value: "pottery" },
12267
+ { kind: "phrase", value: "maker studio" },
12268
+ { kind: "phrase", value: "craft class" },
12269
+ { kind: "phrase", value: "craft workshop" },
12270
+ { kind: "word", value: "clay" },
12271
+ { kind: "word", value: "kiln" }
12272
+ ],
12273
+ tokenRecipes: {
12274
+ palette: "brand-led",
12275
+ contrast: "standard",
12276
+ radius: "soft",
12277
+ shadow: "subtle",
12278
+ typography: "friendly-sans",
12279
+ spacing: "regular",
12280
+ motion: "subtle"
12281
+ },
12282
+ compositionBudget: balancedBudget,
12283
+ recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12284
+ recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
12285
+ buttonPersonalityChoices: [
12286
+ buttonChoice("pebble"),
12287
+ buttonChoice("confident-chip"),
12288
+ buttonChoice("ink-stamp"),
12289
+ buttonChoice("editorial-link")
12290
+ ],
12291
+ paletteVariantChoices: [
12292
+ paletteChoice("brand-led-warm"),
12293
+ paletteChoice("brand-led-cool"),
12294
+ paletteChoice("soft-natural-watercolor"),
12295
+ paletteChoice("warm-neutral-clay")
12296
+ ]
12297
+ }),
12049
12298
  defineCuratedSiteStyle({
12050
12299
  id: "site-style:bold-launch",
12051
12300
  name: "Bold Launch",
12052
12301
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
12053
12302
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
12054
- selectionKeywords: [
12055
- "launch",
12056
- "campaign",
12057
- "preorder",
12058
- "pre-order",
12059
- "waitlist",
12060
- "drop"
12303
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
12304
+ selectionKeywordRules: [
12305
+ { kind: "substring", value: "launch" },
12306
+ { kind: "substring", value: "campaign" },
12307
+ { kind: "word", value: "preorder" },
12308
+ { kind: "phrase", value: "pre-order" },
12309
+ { kind: "substring", value: "waitlist" },
12310
+ { kind: "word", value: "drop" }
12061
12311
  ],
12062
12312
  tokenRecipes: {
12063
12313
  palette: "high-contrast",
@@ -12088,15 +12338,6 @@ var curatedSiteStyles = [
12088
12338
  name: "South West Twerk School",
12089
12339
  description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
12090
12340
  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.",
12091
- selectionKeywords: [
12092
- "dance",
12093
- "classes",
12094
- "workshop",
12095
- "school",
12096
- "movement",
12097
- "performance",
12098
- "community"
12099
- ],
12100
12341
  tokenRecipes: {
12101
12342
  palette: "brand-led",
12102
12343
  contrast: "maximum",
@@ -12403,25 +12644,19 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
12403
12644
  "muted-band": {
12404
12645
  background: {
12405
12646
  type: "color",
12406
- color: "muted",
12407
- textColor: "text",
12408
- headingColor: "text"
12647
+ color: "muted"
12409
12648
  }
12410
12649
  },
12411
12650
  "accent-band": {
12412
12651
  background: {
12413
12652
  type: "color",
12414
- color: "primary",
12415
- textColor: "primaryForeground",
12416
- headingColor: "primaryForeground"
12653
+ color: "primary"
12417
12654
  }
12418
12655
  },
12419
12656
  "brand-depth-band": {
12420
12657
  background: {
12421
12658
  type: "color",
12422
- color: "primary-800",
12423
- textColor: "primaryForeground",
12424
- headingColor: "primaryForeground"
12659
+ color: "primary-800"
12425
12660
  }
12426
12661
  },
12427
12662
  "hero-image": {
@@ -18518,6 +18753,16 @@ var jsonArrayTransform = {
18518
18753
  return "";
18519
18754
  }
18520
18755
  };
18756
+ var csvTransform = {
18757
+ id: "value.csv",
18758
+ kind: "formatter",
18759
+ summary: "Normalize a string or array of strings into a comma-separated list",
18760
+ run: (value) => {
18761
+ const rawValues = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
18762
+ const normalized = rawValues.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean);
18763
+ return normalized.length > 0 ? Array.from(new Set(normalized)).join(",") : "";
18764
+ }
18765
+ };
18521
18766
  var marqueeLoopOptionsSchema = z36.object({
18522
18767
  minItems: z36.number().int().min(1).default(10)
18523
18768
  });
@@ -18543,6 +18788,7 @@ var formattingTransforms = [
18543
18788
  dateFormatShort,
18544
18789
  arrayLengthTransform,
18545
18790
  jsonArrayTransform,
18791
+ csvTransform,
18546
18792
  marqueeLoopTransform
18547
18793
  ];
18548
18794
 
@@ -19026,73 +19272,6 @@ var uiTransforms = [
19026
19272
 
19027
19273
  // ../blocks/src/system/transforms/registry/layout.ts
19028
19274
  import { z as z38 } from "zod";
19029
-
19030
- // ../theme-core/src/palette/utils/colorConversion.ts
19031
- var mod = (a, n) => (a % n + n) % n;
19032
- var deg = (x) => mod(x, 360);
19033
- function hexToRgb(hex) {
19034
- const h = hex.replace(/^#/, "");
19035
- const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
19036
- if (m.length !== 6) throw new Error("Bad hex");
19037
- const int = parseInt(m, 16);
19038
- return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
19039
- }
19040
- function srgbToLinear(u) {
19041
- const x = u / 255;
19042
- return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
19043
- }
19044
- function rgbToHsl(r, g, b) {
19045
- const R = r / 255, G = g / 255, B = b / 255;
19046
- const max = Math.max(R, G, B), min = Math.min(R, G, B);
19047
- const d = max - min;
19048
- let h = 0;
19049
- if (d !== 0) {
19050
- switch (max) {
19051
- case R:
19052
- h = (G - B) / d + (G < B ? 6 : 0);
19053
- break;
19054
- case G:
19055
- h = (B - R) / d + 2;
19056
- break;
19057
- case B:
19058
- h = (R - G) / d + 4;
19059
- break;
19060
- }
19061
- h *= 60;
19062
- }
19063
- const l = (max + min) / 2;
19064
- const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
19065
- return { h, s, l };
19066
- }
19067
- function srgbToOklab(r, g, b) {
19068
- const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
19069
- const l = 0.4122214708 * R + 0.5363325363 * G + 0.0514459929 * B;
19070
- const m = 0.2119034982 * R + 0.6806995451 * G + 0.1073969566 * B;
19071
- const s = 0.0883024619 * R + 0.2817188376 * G + 0.6299787005 * B;
19072
- const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
19073
- const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
19074
- const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
19075
- const b2 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
19076
- return { L, a, b: b2 };
19077
- }
19078
- function oklabToOklch(L, a, b) {
19079
- const C = Math.sqrt(a * a + b * b);
19080
- const h = C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI);
19081
- return { L, C, h };
19082
- }
19083
- function featuresFromHex(hex) {
19084
- const { r, g, b } = hexToRgb(hex);
19085
- const { h, s, l } = rgbToHsl(r, g, b);
19086
- const { L, a, b: b2 } = srgbToOklab(r, g, b);
19087
- const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
19088
- const max = Math.max(r, g, b);
19089
- const v = max / 255;
19090
- const Y = 0.2126 * srgbToLinear(r) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b);
19091
- const chroma = s;
19092
- return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };
19093
- }
19094
-
19095
- // ../blocks/src/system/transforms/registry/layout.ts
19096
19275
  var joinClasses4 = (parts) => parts.filter(
19097
19276
  (part) => typeof part === "string" && part.trim().length > 0
19098
19277
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -23773,7 +23952,12 @@ var eventListingBlockDefinition = {
23773
23952
  detailLevel: "listing",
23774
23953
  kind: { $bind: { from: "content.kind" } },
23775
23954
  eventSurface: { $bind: { from: "content.eventSurface" } },
23776
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
23955
+ eventPresets: {
23956
+ $bind: {
23957
+ from: "content.filterEventPresets",
23958
+ transforms: [{ id: "value.csv" }]
23959
+ }
23960
+ },
23777
23961
  scheduleScope: { $bind: { from: "content.scheduleScope" } }
23778
23962
  },
23779
23963
  mode: "server"
@@ -24525,7 +24709,12 @@ var eventCalendarBlockDefinition = {
24525
24709
  // Pass filter params if configured
24526
24710
  kind: { $bind: { from: "content.kind" } },
24527
24711
  eventSurface: { $bind: { from: "content.eventSurface" } },
24528
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
24712
+ eventPresets: {
24713
+ $bind: {
24714
+ from: "content.filterEventPresets",
24715
+ transforms: [{ id: "value.csv" }]
24716
+ }
24717
+ },
24529
24718
  scheduleScope: { $bind: { from: "content.scheduleScope" } },
24530
24719
  categoryIds: { $bind: { from: "content.filterCategoryIds" } },
24531
24720
  staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
@@ -30120,8 +30309,7 @@ var dashboardNavVisibilityBaseSchema2 = z66.object({
30120
30309
  var dashboardNavVisibilityRolesSchema2 = z66.object({
30121
30310
  administrator: dashboardNavVisibilityBaseSchema2.optional(),
30122
30311
  editor: dashboardNavVisibilityBaseSchema2.optional(),
30123
- team_member: dashboardNavVisibilityBaseSchema2.optional(),
30124
- event_host: dashboardNavVisibilityBaseSchema2.optional()
30312
+ team_member: dashboardNavVisibilityBaseSchema2.optional()
30125
30313
  }).strip().optional();
30126
30314
  var dashboardNavVisibilitySchema2 = dashboardNavVisibilityBaseSchema2.extend({
30127
30315
  roles: dashboardNavVisibilityRolesSchema2