@riverbankcms/sdk 0.60.3 → 0.60.7

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/dist/_dts/api/src/appointmentSetup.d.ts +2 -2
  2. package/dist/_dts/api/src/bookingConfig.d.ts +6 -0
  3. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +45 -3
  4. package/dist/_dts/api/src/bookingOperations.d.ts +40 -3
  5. package/dist/_dts/api/src/bookingVerticals.d.ts +1 -0
  6. package/dist/_dts/api/src/courses.d.ts +1 -5
  7. package/dist/_dts/api/src/endpoints.d.ts +80 -1
  8. package/dist/_dts/api/src/index.d.ts +3 -2
  9. package/dist/_dts/api/src/navigation/contracts.d.ts +9 -9
  10. package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
  11. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +15 -1
  12. package/dist/_dts/api/src/resources.d.ts +1 -1
  13. package/dist/_dts/api/src/siteBanner.d.ts +8 -8
  14. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -39
  15. package/dist/_dts/api/src/siteOnboarding.d.ts +1 -0
  16. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +2 -0
  17. package/dist/_dts/api/src/teamMembers.d.ts +27 -0
  18. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +35 -29
  19. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +1 -5
  20. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +40 -34
  21. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +1 -5
  22. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +1 -1
  23. package/dist/_dts/blocks/src/system/blocks/products/shared.d.ts +2 -2
  24. package/dist/_dts/blocks/src/system/blocks/shared/bookingPaymentTerms.d.ts +9 -9
  25. package/dist/_dts/blocks/src/system/blocks/shared/teamMembers.d.ts +24 -0
  26. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +18 -8
  27. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  28. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  29. package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
  30. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +201 -201
  31. package/dist/_dts/blocks/src/system/manifest/validation.d.ts +2 -2
  32. package/dist/_dts/blocks/src/system/node/fragments/ctaButton.d.ts +2 -0
  33. package/dist/_dts/blocks/src/system/node/schema.d.ts +5 -5
  34. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +1 -1
  35. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +4 -4
  36. package/dist/_dts/blocks/src/system/runtime/shared/themedButtonClass.d.ts +11 -0
  37. package/dist/_dts/blocks/src/system/transforms/registry/ui.d.ts +1 -1
  38. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +3 -3
  39. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +10 -2
  40. package/dist/_dts/content-model/src/content-types/schema.d.ts +8 -8
  41. package/dist/_dts/content-model/src/metadataConfig.d.ts +1 -0
  42. package/dist/_dts/core/src/branded.d.ts +2 -0
  43. package/dist/_dts/core/src/participants.d.ts +32 -1
  44. package/dist/_dts/core/src/rectification.d.ts +79 -0
  45. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +130 -14
  46. package/dist/_dts/db/src/schemas/forms.d.ts +61 -61
  47. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +17 -15
  48. package/dist/_dts/sdk/src/client/types.d.ts +10 -2
  49. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  50. package/dist/_dts/sdk/src/config/validation.d.ts +40 -37
  51. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +17 -8
  52. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +1 -1
  53. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +19 -19
  54. package/dist/_dts/sdk/src/public-api/contracts.d.ts +87 -69
  55. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  56. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +2 -5
  57. package/dist/_dts/sdk/src/version.d.ts +1 -1
  58. package/dist/_dts/theme-core/src/accordions/types.d.ts +11 -11
  59. package/dist/_dts/theme-core/src/buttons/personalities/brushed-wash.d.ts +7 -2
  60. package/dist/_dts/theme-core/src/buttons/personalities/confident-chip.d.ts +7 -2
  61. package/dist/_dts/theme-core/src/buttons/personalities/editorial-link.d.ts +7 -2
  62. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +86 -5
  63. package/dist/_dts/theme-core/src/buttons/personalities/ink-stamp.d.ts +7 -2
  64. package/dist/_dts/theme-core/src/buttons/personalities/pebble.d.ts +7 -2
  65. package/dist/_dts/theme-core/src/buttons/personalities/soft-pill.d.ts +7 -2
  66. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +20 -20
  67. package/dist/_dts/theme-core/src/buttons/types.d.ts +27 -27
  68. package/dist/_dts/theme-core/src/cards/types.d.ts +17 -17
  69. package/dist/_dts/theme-core/src/inputs/types.d.ts +14 -14
  70. package/dist/_dts/theme-core/src/interactive/baseSchema.d.ts +2 -2
  71. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +438 -438
  72. package/dist/_dts/theme-core/src/navigation/types.d.ts +16 -16
  73. package/dist/_dts/theme-core/src/palette/variants/brand-led.d.ts +33 -9
  74. package/dist/_dts/theme-core/src/palette/variants/high-contrast.d.ts +33 -9
  75. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +200 -4
  76. package/dist/_dts/theme-core/src/palette/variants/soft-natural.d.ts +33 -9
  77. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +25 -25
  78. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +33 -9
  79. package/dist/_dts/theme-core/src/schema.d.ts +662 -662
  80. package/dist/_dts/theme-core/src/shared/componentStyles.d.ts +4 -4
  81. package/dist/_dts/theme-core/src/site-styles/curatedChoices.d.ts +27 -0
  82. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +48 -194
  83. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +15 -15
  84. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +7 -7
  85. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -1
  86. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +12 -14
  87. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +46 -0
  88. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +5 -5
  89. package/dist/_dts/ui/src/badge.d.ts +1 -1
  90. package/dist/_dts/ui/src/button-group.d.ts +1 -1
  91. package/dist/_dts/ui/src/button.d.ts +2 -2
  92. package/dist/_dts/ui/src/callout.d.ts +1 -1
  93. package/dist/_dts/ui/src/card.d.ts +1 -1
  94. package/dist/_dts/ui/src/palette/ColorChooserDialog.d.ts +47 -0
  95. package/dist/_dts/ui/src/palette/ColorSlotButton.d.ts +15 -0
  96. package/dist/_dts/ui/src/palette/ColorSwatchButton.d.ts +15 -0
  97. package/dist/_dts/ui/src/palette/PaletteTokenEditor.d.ts +50 -0
  98. package/dist/_dts/ui/src/palette/hex.d.ts +23 -0
  99. package/dist/_dts/ui/src/palette/index.d.ts +14 -0
  100. package/dist/_dts/ui/src/surface.d.ts +2 -2
  101. package/dist/_dts/ui/src/toggle.d.ts +4 -4
  102. package/dist/cli/index.mjs +1535 -1183
  103. package/dist/client/client.mjs +3944 -3454
  104. package/dist/client/hooks.mjs +2053 -1743
  105. package/dist/client/rendering/client.mjs +311 -167
  106. package/dist/client/rendering/islands.mjs +159 -73
  107. package/dist/client/rendering.mjs +1918 -1447
  108. package/dist/preview-next/before-render.mjs +147 -1
  109. package/dist/preview-next/client/runtime.mjs +2828 -2174
  110. package/dist/preview-next/middleware.mjs +147 -1
  111. package/dist/server/components.mjs +4311 -3928
  112. package/dist/server/config-validation.mjs +2201 -1906
  113. package/dist/server/config.mjs +2201 -1906
  114. package/dist/server/data.mjs +2053 -1743
  115. package/dist/server/index.mjs +171 -4
  116. package/dist/server/next.mjs +3442 -3024
  117. package/dist/server/page-converter.mjs +2109 -1962
  118. package/dist/server/prebuild.mjs +1 -1
  119. package/dist/server/rendering/server.mjs +4021 -3622
  120. package/dist/server/rendering.mjs +4021 -3622
  121. package/dist/server/routing.mjs +2377 -2058
  122. package/dist/server/server.mjs +2244 -1915
  123. package/dist/server/theme-bridge.mjs +130 -126
  124. package/dist/server/theme.mjs +131 -129
  125. package/package.json +1 -1
  126. package/dist/_dts/theme-core/src/site-styles/compatibility.d.ts +0 -109
@@ -905,13 +905,150 @@ var ENDPOINT_DEFINITIONS = {
905
905
  "server:internal_error"
906
906
  ]
907
907
  },
908
- deleteAppointmentResource: {
908
+ removeAppointmentResource: {
909
909
  path: "/sites/{siteId}/bookings/resources/{resourceId}",
910
910
  method: "DELETE",
911
911
  auth: "user",
912
912
  responseKind: "json",
913
913
  errors: ["resource:not_found", "server:internal_error"]
914
914
  },
915
+ createTeamMemberProfile: {
916
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile",
917
+ method: "POST",
918
+ auth: "user",
919
+ responseKind: "json",
920
+ errors: [
921
+ "validation:invalid_input",
922
+ "resource:not_found",
923
+ "resource:conflict",
924
+ "server:internal_error"
925
+ ]
926
+ },
927
+ updateTeamMemberProfilePolicy: {
928
+ path: "/sites/{siteId}/bookings/resources/profile-policy",
929
+ method: "PUT",
930
+ auth: "user",
931
+ responseKind: "json",
932
+ errors: ["validation:invalid_input", "server:internal_error"]
933
+ },
934
+ updateTeamMemberProfileContent: {
935
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/content",
936
+ method: "PUT",
937
+ tags: [
938
+ "site-{siteId}",
939
+ "content-{siteId}-team-member",
940
+ "content-entry-{entryId}"
941
+ ],
942
+ auth: "user",
943
+ responseKind: "json",
944
+ errors: [
945
+ "validation:invalid_input",
946
+ "resource:not_found",
947
+ "resource:conflict",
948
+ "server:internal_error"
949
+ ]
950
+ },
951
+ publishTeamMemberProfile: {
952
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/publish",
953
+ method: "POST",
954
+ tags: [
955
+ "site-{siteId}",
956
+ "content-{siteId}-team-member",
957
+ "content-entry-{entryId}"
958
+ ],
959
+ auth: "user",
960
+ responseKind: "json",
961
+ errors: [
962
+ "validation:invalid_input",
963
+ "resource:not_found",
964
+ "server:internal_error"
965
+ ]
966
+ },
967
+ discardTeamMemberProfileDraft: {
968
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/discard",
969
+ method: "POST",
970
+ tags: [
971
+ "site-{siteId}",
972
+ "content-{siteId}-team-member",
973
+ "content-entry-{entryId}"
974
+ ],
975
+ auth: "user",
976
+ responseKind: "json",
977
+ errors: [
978
+ "validation:invalid_input",
979
+ "resource:not_found",
980
+ "resource:conflict",
981
+ "server:internal_error"
982
+ ]
983
+ },
984
+ unpublishTeamMemberProfile: {
985
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
986
+ method: "POST",
987
+ tags: [
988
+ "site-{siteId}",
989
+ "content-{siteId}-team-member",
990
+ "content-entry-{entryId}"
991
+ ],
992
+ auth: "user",
993
+ responseKind: "json",
994
+ errors: [
995
+ "validation:invalid_input",
996
+ "resource:not_found",
997
+ "resource:conflict",
998
+ "server:internal_error"
999
+ ]
1000
+ },
1001
+ scheduleTeamMemberProfile: {
1002
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/schedule",
1003
+ method: "POST",
1004
+ tags: [
1005
+ "site-{siteId}",
1006
+ "content-{siteId}-team-member",
1007
+ "content-entry-{entryId}"
1008
+ ],
1009
+ auth: "user",
1010
+ responseKind: "json",
1011
+ errors: [
1012
+ "validation:invalid_input",
1013
+ "resource:not_found",
1014
+ "resource:conflict",
1015
+ "server:internal_error"
1016
+ ]
1017
+ },
1018
+ cancelScheduledTeamMemberProfile: {
1019
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/schedule",
1020
+ method: "DELETE",
1021
+ tags: [
1022
+ "site-{siteId}",
1023
+ "content-{siteId}-team-member",
1024
+ "content-entry-{entryId}"
1025
+ ],
1026
+ auth: "user",
1027
+ responseKind: "json",
1028
+ errors: [
1029
+ "validation:invalid_input",
1030
+ "resource:not_found",
1031
+ "resource:conflict",
1032
+ "server:internal_error"
1033
+ ]
1034
+ },
1035
+ updateTeamMemberProfileRouteMetadata: {
1036
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/routes/{routeId}/metadata",
1037
+ method: "PATCH",
1038
+ tags: [
1039
+ TAG_TEMPLATES.siteCollection,
1040
+ TAG_TEMPLATES.siteRoutableContent,
1041
+ TAG_TEMPLATES.routeById
1042
+ ],
1043
+ auth: "user",
1044
+ responseKind: "json",
1045
+ errors: [
1046
+ "validation:invalid_input",
1047
+ "resource:not_found",
1048
+ "resource:conflict",
1049
+ "server:internal_error"
1050
+ ]
1051
+ },
915
1052
  listAppointmentServices: {
916
1053
  path: "/sites/{siteId}/bookings/services",
917
1054
  method: "GET",
@@ -3285,6 +3422,15 @@ var ENDPOINT_DEFINITIONS = {
3285
3422
  auth: "public",
3286
3423
  responseKind: "json"
3287
3424
  },
3425
+ listPublicTeamMembers: {
3426
+ path: "/public/sites/{siteId}/team-members",
3427
+ method: "GET",
3428
+ revalidate: 60,
3429
+ tags: ["public-team-members-{siteId}"],
3430
+ errors: [],
3431
+ auth: "public",
3432
+ responseKind: "json"
3433
+ },
3288
3434
  getPublicCourse: {
3289
3435
  path: "/public/sites/{siteId}/courses/{courseId}",
3290
3436
  method: "GET",
@@ -6116,7 +6262,7 @@ var SimpleCache = class {
6116
6262
  };
6117
6263
 
6118
6264
  // src/version.ts
6119
- var SDK_VERSION = "0.60.3";
6265
+ var SDK_VERSION = "0.60.7";
6120
6266
 
6121
6267
  // src/client/error.ts
6122
6268
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -6910,19 +7056,20 @@ function createRiverbankClient(config) {
6910
7056
  }
6911
7057
  return {
6912
7058
  async getSite(params) {
6913
- const { slug, domain, id, signal, force } = params;
7059
+ const { slug, domain, id, signal, force, currentPath } = params;
6914
7060
  if (!slug && !domain && !id) {
6915
7061
  throw new Error(
6916
7062
  `getSite() requires at least one identifier: slug, domain, or id. Received: ${JSON.stringify(params)}`
6917
7063
  );
6918
7064
  }
6919
- const cacheKey = `site:${slug || domain || id}`;
7065
+ const cacheKey = `site:${slug || domain || id}:${currentPath ?? ""}`;
6920
7066
  const siteId = id || slug || domain;
6921
7067
  return resilientFetch(cacheKey, async (sig) => {
6922
7068
  const apiParams = {};
6923
7069
  if (params.slug) apiParams.slug = params.slug;
6924
7070
  if (params.domain) apiParams.domain = params.domain;
6925
7071
  if (params.id) apiParams.id = params.id;
7072
+ if (currentPath) apiParams.currentPath = currentPath;
6926
7073
  if (force) apiParams.force = "true";
6927
7074
  return await apiClient({
6928
7075
  endpoint: "getSite",
@@ -7154,6 +7301,24 @@ function createRiverbankClient(config) {
7154
7301
  return await apiClient({ endpoint: "listPublicCourses", params: apiParams, options: { signal: sig } });
7155
7302
  }, { signal });
7156
7303
  },
7304
+ async listPublicTeamMembers(params) {
7305
+ const { siteId, stage, signal } = params;
7306
+ if (!siteId) {
7307
+ throw new Error("listPublicTeamMembers() requires siteId");
7308
+ }
7309
+ const cacheKey = `public-team-members:${siteId}:${stage ?? ""}`;
7310
+ return resilientFetch(cacheKey, async (sig) => {
7311
+ const apiParams = {
7312
+ siteId,
7313
+ ...stage && { stage }
7314
+ };
7315
+ return await apiClient({
7316
+ endpoint: "listPublicTeamMembers",
7317
+ params: apiParams,
7318
+ options: { signal: sig }
7319
+ });
7320
+ }, { signal });
7321
+ },
7157
7322
  async listPublicProducts(params) {
7158
7323
  const { siteId, stage, categorySelector, signal } = params;
7159
7324
  if (!siteId) {
@@ -8191,6 +8356,7 @@ var SUPPORTED_LOADER_ENDPOINTS = [
8191
8356
  "listPublicEvents",
8192
8357
  "getPublicEventDetails",
8193
8358
  "listPublicCourses",
8359
+ "listPublicTeamMembers",
8194
8360
  "listPublicProducts",
8195
8361
  "listPublicPasses",
8196
8362
  "listPublicMemberships",
@@ -9407,1604 +9573,1012 @@ function assertUniqueLayoutProfileKeys(profiles) {
9407
9573
  }
9408
9574
  }
9409
9575
 
9410
- // ../theme-core/src/site-styles/compatibility.ts
9576
+ // ../theme-core/src/buttons/personalities/types.ts
9577
+ import { z as z11 } from "zod";
9578
+
9579
+ // ../theme-core/src/buttons/types.ts
9411
9580
  import { z as z9 } from "zod";
9581
+ var VARIANT_ROLES = [
9582
+ "primary",
9583
+ "secondary",
9584
+ "outline",
9585
+ "ghost",
9586
+ "link",
9587
+ "tertiary",
9588
+ "accent"
9589
+ ];
9590
+ var cornerStyleSchema = z9.enum(["square", "rounded", "pill"]);
9591
+ var shadowSizeSchema = z9.enum(["none", "low", "medium", "high"]);
9592
+ var textTransformSchema = z9.enum(["none", "uppercase", "lowercase", "capitalize"]);
9593
+ var fontWeightSchema = z9.union([z9.literal(500), z9.literal(600), z9.literal(700)]);
9594
+ var buttonTypographySchema = z9.enum(["body", "heading"]);
9595
+ var letterSpacingSchema = z9.enum(["tight", "normal", "loose"]);
9596
+ var hoverTransformSchema = z9.enum(["none", "lift", "scale", "press"]);
9597
+ var hoverColorSchema = z9.enum(["none", "brighten", "darken", "saturate", "token"]);
9598
+ var buttonPaddingPresetSchema = z9.enum(["compact", "default", "spacious"]);
9599
+ var gradientStyleSchema = z9.enum(["linear", "radial", "conic"]);
9600
+ var gradientSharpnessSchema = z9.enum(["smooth", "medium", "hard"]);
9601
+ var prioritySchema = z9.union([z9.literal(1), z9.literal(2), z9.literal(3)]);
9602
+ var variantRoleSchema = z9.enum(VARIANT_ROLES);
9603
+ var buttonSizeNameSchema = z9.enum(["sm", "md", "lg", "xl"]);
9604
+ var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
9605
+ var paddingShorthandSchema = z9.string().refine(
9606
+ (value) => {
9607
+ const parts = value.split(/\s+/).filter(Boolean);
9608
+ return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
9609
+ },
9610
+ {
9611
+ message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
9612
+ }
9613
+ );
9614
+ var buttonSizeConfigSchema = z9.object({
9615
+ padding: paddingShorthandSchema,
9616
+ fontSize: z9.string().optional()
9617
+ });
9618
+ var buttonSizesSchema = z9.object({
9619
+ sm: buttonSizeConfigSchema,
9620
+ md: buttonSizeConfigSchema,
9621
+ lg: buttonSizeConfigSchema,
9622
+ xl: buttonSizeConfigSchema.optional()
9623
+ }).transform(({ sm, md, lg, xl }) => ({
9624
+ sm,
9625
+ md,
9626
+ lg,
9627
+ xl: xl ?? lg
9628
+ }));
9629
+ var buttonGlobalSettingsSchema = z9.object({
9630
+ cornerStyle: cornerStyleSchema,
9631
+ cornerRadius: z9.number().min(0).max(24).optional(),
9632
+ shadow: shadowSizeSchema,
9633
+ textTransform: textTransformSchema,
9634
+ fontWeight: fontWeightSchema,
9635
+ /**
9636
+ * @deprecated Set per-variant via `variant.border.widthClass` instead.
9637
+ * Schema field is preserved so existing presets parse; the value is unread
9638
+ * by the current generator and will be removed once the legacy
9639
+ * `primitives/content/components/Button.tsx` slot exports are deleted.
9640
+ */
9641
+ borderWidth: z9.union([z9.literal(1), z9.literal(2), z9.literal(3)]),
9642
+ // === Family-level typography ===
9643
+ // Typography source (body or heading) — selects which theme typography pool to inherit
9644
+ typography: buttonTypographySchema.optional(),
9645
+ // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
9646
+ // Sized variants get this as default; fixed variants inherit unless they override.
9647
+ // Size class CSS may still override at run time for sized variants.
9648
+ fontSize: z9.string().optional(),
9649
+ // Letter spacing applied to all variants
9650
+ letterSpacing: letterSpacingSchema.optional(),
9651
+ // Italic style
9652
+ italic: z9.boolean().optional(),
9653
+ // Padding preset (applies to sized variants without a sizes config)
9654
+ paddingPreset: buttonPaddingPresetSchema.optional(),
9655
+ hoverTransform: hoverTransformSchema,
9656
+ hoverColor: hoverColorSchema,
9657
+ // When hoverColor is 'token', this specifies which token to use
9658
+ hoverColorToken: z9.string().optional(),
9659
+ // Gradient settings (if any variant uses gradients)
9660
+ gradientStyle: gradientStyleSchema.optional(),
9661
+ gradientAngle: z9.number().min(0).max(360).optional(),
9662
+ gradientSharpness: gradientSharpnessSchema.optional()
9663
+ });
9664
+ var gradientDirectionSchema = z9.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
9665
+ var buttonBackgroundSchema = z9.discriminatedUnion("type", [
9666
+ z9.object({ type: z9.literal("solid"), colorToken: z9.string() }),
9667
+ z9.object({
9668
+ type: z9.literal("gradient"),
9669
+ stops: z9.array(z9.string()).min(2),
9670
+ direction: gradientDirectionSchema
9671
+ }),
9672
+ z9.object({ type: z9.literal("transparent") })
9673
+ ]);
9674
+ var effectApplicationSchema = z9.object({
9675
+ effectId: z9.string(),
9676
+ options: z9.record(z9.string(), z9.any()).optional()
9677
+ });
9678
+ var buttonBorderSchema = z9.object({
9679
+ widthClass: z9.string(),
9680
+ colorToken: z9.string()
9681
+ });
9682
+ var variantShadowSchema = z9.object({
9683
+ elevation: z9.enum(["none", "low", "medium", "high"]),
9684
+ softness: z9.enum(["crisp", "soft", "hard"]).nullable(),
9685
+ position: z9.enum(["bottom", "bottom-right"]).default("bottom")
9686
+ });
9687
+ var variantEffectsSchema = z9.object({
9688
+ base: z9.array(effectApplicationSchema).optional(),
9689
+ hover: z9.array(effectApplicationSchema).optional(),
9690
+ active: z9.array(effectApplicationSchema).optional(),
9691
+ focus: z9.array(effectApplicationSchema).optional()
9692
+ });
9693
+ var variantSizeOverridesSchema = z9.object({
9694
+ sm: buttonSizeConfigSchema.optional(),
9695
+ md: buttonSizeConfigSchema.optional(),
9696
+ lg: buttonSizeConfigSchema.optional(),
9697
+ xl: buttonSizeConfigSchema.optional()
9698
+ });
9699
+ var buttonVariantSchema = z9.object({
9700
+ id: z9.string(),
9701
+ name: z9.string().min(1).max(20),
9702
+ enabled: z9.boolean(),
9703
+ priority: prioritySchema,
9704
+ // Base appearance (token-based)
9705
+ background: buttonBackgroundSchema,
9706
+ textColorToken: z9.string(),
9707
+ /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
9708
+ borderRadius: z9.string().optional(),
9709
+ // Optional shadow override (uses theme.shadow if not specified)
9710
+ shadow: variantShadowSchema.optional(),
9711
+ // Border (optional)
9712
+ border: buttonBorderSchema.optional(),
9713
+ // Hover background token (per-variant override, takes precedence over global hoverColorToken)
9714
+ hoverBackgroundToken: z9.string().optional(),
9715
+ // Effect composition
9716
+ effects: variantEffectsSchema.optional(),
9717
+ // Per-variant size overrides — see VariantSizeOverrides
9718
+ sizes: variantSizeOverridesSchema.optional()
9719
+ });
9720
+ var buttonSystemSchema = z9.object({
9721
+ global: buttonGlobalSettingsSchema,
9722
+ variants: z9.array(buttonVariantSchema).min(1).max(6),
9723
+ sizes: buttonSizesSchema.optional()
9724
+ });
9725
+
9726
+ // ../theme-core/src/site-styles/styleTags.ts
9727
+ import { z as z10 } from "zod";
9412
9728
  var STYLE_AXIS_VALUES = {
9413
9729
  tone: ["minimal", "classic", "bold"],
9414
9730
  energy: ["calm", "vibrant"],
9415
9731
  motion: ["subtle", "standard", "expressive"],
9416
9732
  era: ["editorial", "modern", "organic", "technical", "retro"]
9417
9733
  };
9418
- var styleTagsSchema = z9.object({
9419
- tone: z9.enum(STYLE_AXIS_VALUES.tone).optional(),
9420
- energy: z9.enum(STYLE_AXIS_VALUES.energy).optional(),
9421
- motion: z9.enum(STYLE_AXIS_VALUES.motion).optional(),
9422
- era: z9.enum(STYLE_AXIS_VALUES.era).optional()
9734
+ var styleTagsSchema = z10.object({
9735
+ tone: z10.enum(STYLE_AXIS_VALUES.tone).optional(),
9736
+ energy: z10.enum(STYLE_AXIS_VALUES.energy).optional(),
9737
+ motion: z10.enum(STYLE_AXIS_VALUES.motion).optional(),
9738
+ era: z10.enum(STYLE_AXIS_VALUES.era).optional()
9423
9739
  });
9424
9740
 
9425
- // ../theme-core/src/site-styles/sourceCatalogs.ts
9426
- var generatedContentFrames = [
9427
- plainFrame,
9428
- panelFrame("inset"),
9429
- panelFrame("raised"),
9430
- flushPanelFrame({ bleed: "start" })
9431
- ];
9432
- var userContentFrames = [
9433
- ...generatedContentFrames,
9434
- panelFrame("editorial"),
9435
- flushPanelFrame({ bleed: "end" }),
9436
- flushPanelFrame({ bleed: "both" })
9437
- ];
9438
- var generatedDesignOptionCatalog = {
9439
- source: "generated",
9440
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
9441
- contentFrames: generatedContentFrames,
9442
- itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
9443
- transitions: ["none", "soft-fade-short", "soft-fade-long"],
9444
- emphases: ["low", "medium", "high"],
9445
- detachedCustom: false
9446
- };
9447
- var userDesignOptionCatalog = {
9448
- source: "user",
9449
- sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
9450
- contentFrames: userContentFrames,
9451
- itemSurfaces: [
9452
- ...generatedDesignOptionCatalog.itemSurfaces,
9453
- "inset",
9454
- "editorial"
9455
- ],
9456
- transitions: [
9457
- ...generatedDesignOptionCatalog.transitions,
9458
- "wave-edge",
9459
- "angle-edge"
9460
- ],
9461
- emphases: generatedDesignOptionCatalog.emphases,
9462
- detachedCustom: false
9463
- };
9464
- var advancedDesignOptionCatalog = {
9465
- source: "advanced",
9466
- sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
9467
- contentFrames: userDesignOptionCatalog.contentFrames,
9468
- itemSurfaces: userDesignOptionCatalog.itemSurfaces,
9469
- transitions: userDesignOptionCatalog.transitions,
9470
- emphases: userDesignOptionCatalog.emphases,
9471
- detachedCustom: true
9472
- };
9473
-
9474
- // ../theme-core/src/site-styles/curatedSiteStyles.ts
9475
- var curatedSiteStyleIdValues = [
9476
- "site-style:calm-studio",
9477
- "site-style:clear-professional",
9478
- "site-style:warm-editorial",
9479
- "site-style:bright-community",
9480
- "site-style:quiet-luxury",
9481
- "site-style:practical-services",
9482
- "site-style:modern-wellness",
9483
- "site-style:bold-launch"
9484
- ];
9485
- var quietBudget = {
9486
- accentDensity: "low",
9487
- panelDensity: "medium",
9488
- transitionMix: "quiet",
9489
- primaryCtaLimit: 2,
9490
- mediaDensity: "medium",
9491
- decorativeRepetition: "low"
9492
- };
9493
- var balancedBudget = {
9494
- accentDensity: "medium",
9495
- panelDensity: "medium",
9496
- transitionMix: "balanced",
9497
- primaryCtaLimit: 3,
9498
- mediaDensity: "medium",
9499
- decorativeRepetition: "medium"
9500
- };
9501
- var expressiveBudget = {
9502
- accentDensity: "high",
9503
- panelDensity: "high",
9504
- transitionMix: "expressive",
9505
- primaryCtaLimit: 3,
9506
- mediaDensity: "high",
9507
- decorativeRepetition: "medium"
9508
- };
9509
- function uniqueContentFrameKinds() {
9510
- const kinds = [...new Set(
9511
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
9512
- )];
9513
- const firstKind = kinds[0];
9514
- if (!firstKind) {
9515
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
9741
+ // ../theme-core/src/buttons/personalities/types.ts
9742
+ function asButtonPersonalityId(value) {
9743
+ if (value.length === 0) {
9744
+ throw new Error("ButtonPersonalityId must be a non-empty string");
9516
9745
  }
9517
- return [firstKind, ...kinds.slice(1)];
9746
+ return value;
9518
9747
  }
9519
- var generatedContentFrameKinds = uniqueContentFrameKinds();
9520
- function defineCuratedSiteStyle(input) {
9748
+ var buttonPersonalityIdSchema = z11.string().min(1).transform((value) => asButtonPersonalityId(value));
9749
+ var buttonPersonalitySchema = z11.object({
9750
+ id: buttonPersonalityIdSchema,
9751
+ name: z11.string().min(1),
9752
+ description: z11.string().min(1),
9753
+ tags: styleTagsSchema,
9754
+ buttonSystem: buttonSystemSchema
9755
+ });
9756
+ function defineButtonPersonality(input) {
9521
9757
  return {
9522
- id: asSiteStyleId(input.id),
9758
+ id: asButtonPersonalityId(input.id),
9523
9759
  name: input.name,
9524
9760
  description: input.description,
9525
- generationBrief: input.generationBrief,
9526
- selectionKeywords: input.selectionKeywords ?? [],
9527
- template: {
9528
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
9529
- name: input.name,
9530
- version: 1,
9531
- tokenRecipes: input.tokenRecipes,
9532
- compositionBudget: input.compositionBudget,
9533
- supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
9534
- supportedContentFrames: generatedContentFrameKinds,
9535
- supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
9536
- supportedTransitions: generatedDesignOptionCatalog.transitions
9537
- },
9538
- // The library IDs are already branded at construction (`asButtonPersonalityId`
9539
- // / `asPaletteVariantId`); the closed-union input type guarantees only
9540
- // shipped IDs reach this branch.
9541
- defaultButtonPersonalityId: input.defaultButtonPersonalityId,
9542
- acceptedButtons: input.acceptedButtons,
9543
- defaultPaletteVariantId: input.defaultPaletteVariantId,
9544
- acceptedPalettes: input.acceptedPalettes
9761
+ tags: input.tags,
9762
+ buttonSystem: input.buttonSystem
9545
9763
  };
9546
9764
  }
9547
- var curatedSiteStyles = [
9548
- defineCuratedSiteStyle({
9549
- id: "site-style:calm-studio",
9550
- name: "Calm Studio",
9551
- description: "Soft, measured, and spacious for intimate appointment or class businesses.",
9552
- generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
9553
- tokenRecipes: {
9554
- palette: "soft-natural",
9555
- contrast: "standard",
9556
- radius: "soft",
9557
- shadow: "subtle",
9558
- typography: "friendly-sans",
9559
- spacing: "airy",
9560
- motion: "subtle"
9561
- },
9562
- compositionBudget: quietBudget,
9563
- defaultButtonPersonalityId: "soft-pill",
9564
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "editorial"] },
9565
- defaultPaletteVariantId: "soft-natural-sage",
9566
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
9567
- }),
9568
- defineCuratedSiteStyle({
9569
- id: "site-style:clear-professional",
9570
- name: "Clear Professional",
9571
- description: "Crisp, trustworthy, and direct for local services and consultancies.",
9572
- generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
9573
- tokenRecipes: {
9574
- palette: "brand-led",
9575
- contrast: "strong",
9576
- radius: "soft",
9577
- shadow: "subtle",
9578
- typography: "clean-sans",
9579
- spacing: "regular",
9580
- motion: "subtle"
9765
+
9766
+ // ../theme-core/src/buttons/personalities/brushed-wash.ts
9767
+ var brushedWash = defineButtonPersonality({
9768
+ id: "brushed-wash",
9769
+ name: "Brushed Wash",
9770
+ description: "Watercolour-gradient buttons with soft shadows and generous padding.",
9771
+ tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
9772
+ buttonSystem: {
9773
+ global: {
9774
+ cornerStyle: "rounded",
9775
+ shadow: "low",
9776
+ textTransform: "none",
9777
+ fontWeight: 500,
9778
+ borderWidth: 1,
9779
+ hoverTransform: "none",
9780
+ hoverColor: "none"
9581
9781
  },
9582
- compositionBudget: balancedBudget,
9583
- defaultButtonPersonalityId: "confident-chip",
9584
- acceptedButtons: { tone: ["minimal", "classic"], era: ["modern", "editorial"] },
9585
- defaultPaletteVariantId: "brand-led-cool",
9586
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["modern", "editorial"] }
9587
- }),
9588
- defineCuratedSiteStyle({
9589
- id: "site-style:warm-editorial",
9590
- name: "Warm Editorial",
9591
- description: "Story-led and textured for educators, makers, venues, and retreats.",
9592
- generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
9593
- tokenRecipes: {
9594
- palette: "warm-neutral",
9595
- contrast: "standard",
9596
- radius: "square",
9597
- shadow: "none",
9598
- typography: "serif-editorial",
9599
- spacing: "airy",
9600
- motion: "subtle"
9782
+ sizes: {
9783
+ sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
9784
+ md: { padding: "1rem 2.5rem" },
9785
+ lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
9786
+ xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
9601
9787
  },
9602
- compositionBudget: balancedBudget,
9603
- defaultButtonPersonalityId: "editorial-link",
9604
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
9605
- defaultPaletteVariantId: "warm-neutral-cream",
9606
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
9607
- }),
9608
- defineCuratedSiteStyle({
9609
- id: "site-style:bright-community",
9610
- name: "Bright Community",
9611
- description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
9612
- generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
9613
- tokenRecipes: {
9614
- palette: "brand-led",
9615
- contrast: "standard",
9616
- radius: "rounded",
9617
- shadow: "subtle",
9618
- typography: "friendly-sans",
9619
- spacing: "regular",
9620
- motion: "expressive"
9788
+ variants: [
9789
+ {
9790
+ id: "primary",
9791
+ name: "Primary",
9792
+ enabled: true,
9793
+ priority: 1,
9794
+ background: {
9795
+ type: "gradient",
9796
+ stops: ["primary", "accent"],
9797
+ direction: "to-r"
9798
+ },
9799
+ textColorToken: "primaryForeground",
9800
+ borderRadius: "rounded-lg",
9801
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
9802
+ effects: {
9803
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
9804
+ }
9805
+ },
9806
+ {
9807
+ id: "secondary",
9808
+ name: "Secondary",
9809
+ enabled: true,
9810
+ priority: 2,
9811
+ background: {
9812
+ type: "gradient",
9813
+ stops: ["secondary", "accent"],
9814
+ direction: "to-br"
9815
+ },
9816
+ textColorToken: "primaryForeground",
9817
+ borderRadius: "rounded-lg",
9818
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
9819
+ effects: {
9820
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
9821
+ }
9822
+ },
9823
+ {
9824
+ id: "outline",
9825
+ name: "Outline",
9826
+ enabled: true,
9827
+ priority: 3,
9828
+ background: { type: "transparent" },
9829
+ textColorToken: "primary",
9830
+ borderRadius: "rounded-lg",
9831
+ border: { widthClass: "border", colorToken: "primary" },
9832
+ effects: {
9833
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9834
+ }
9835
+ },
9836
+ {
9837
+ id: "ghost",
9838
+ name: "Ghost",
9839
+ enabled: true,
9840
+ priority: 3,
9841
+ background: { type: "transparent" },
9842
+ textColorToken: "text",
9843
+ borderRadius: "rounded-lg",
9844
+ effects: {
9845
+ hover: [
9846
+ { effectId: "background-on-hover", options: { colorToken: "surface" } }
9847
+ ]
9848
+ }
9849
+ }
9850
+ ]
9851
+ }
9852
+ });
9853
+
9854
+ // ../theme-core/src/buttons/personalities/confident-chip.ts
9855
+ var confidentChip = defineButtonPersonality({
9856
+ id: "confident-chip",
9857
+ name: "Confident Chip",
9858
+ description: "Mid-radius solid buttons with a crisp hover.",
9859
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
9860
+ buttonSystem: {
9861
+ global: {
9862
+ cornerStyle: "rounded",
9863
+ shadow: "medium",
9864
+ textTransform: "none",
9865
+ fontWeight: 600,
9866
+ borderWidth: 1,
9867
+ hoverTransform: "none",
9868
+ hoverColor: "none"
9621
9869
  },
9622
- compositionBudget: balancedBudget,
9623
- defaultButtonPersonalityId: "pebble",
9624
- acceptedButtons: { tone: ["classic", "bold"], era: ["organic", "modern"] },
9625
- defaultPaletteVariantId: "brand-led-warm",
9626
- acceptedPalettes: { tone: ["classic", "bold"], era: ["modern", "organic"] }
9627
- }),
9628
- defineCuratedSiteStyle({
9629
- id: "site-style:quiet-luxury",
9630
- name: "Quiet Luxury",
9631
- description: "Minimal, confident, and refined for premium experiences and private services.",
9632
- generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
9633
- selectionKeywords: [
9634
- "luxury",
9635
- "premium",
9636
- "boutique",
9637
- "bespoke",
9638
- "exclusive"
9639
- ],
9640
- tokenRecipes: {
9641
- palette: "high-contrast",
9642
- contrast: "strong",
9643
- radius: "square",
9870
+ variants: [
9871
+ {
9872
+ id: "primary",
9873
+ name: "Primary",
9874
+ enabled: true,
9875
+ priority: 1,
9876
+ background: { type: "solid", colorToken: "primary" },
9877
+ textColorToken: "primaryForeground",
9878
+ borderRadius: "rounded-md",
9879
+ shadow: { elevation: "medium", softness: "soft", position: "bottom" },
9880
+ effects: {
9881
+ hover: [{ effectId: "darken-background", options: { amount: 60 } }],
9882
+ active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
9883
+ }
9884
+ },
9885
+ {
9886
+ id: "secondary",
9887
+ name: "Secondary",
9888
+ enabled: true,
9889
+ priority: 2,
9890
+ background: { type: "solid", colorToken: "surface" },
9891
+ textColorToken: "text",
9892
+ borderRadius: "rounded-md",
9893
+ border: { widthClass: "border", colorToken: "border" },
9894
+ effects: {
9895
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
9896
+ }
9897
+ },
9898
+ {
9899
+ id: "outline",
9900
+ name: "Outline",
9901
+ enabled: true,
9902
+ priority: 3,
9903
+ background: { type: "transparent" },
9904
+ textColorToken: "primary",
9905
+ borderRadius: "rounded-md",
9906
+ border: { widthClass: "border", colorToken: "primary" },
9907
+ effects: {
9908
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9909
+ }
9910
+ },
9911
+ {
9912
+ id: "ghost",
9913
+ name: "Ghost",
9914
+ enabled: true,
9915
+ priority: 3,
9916
+ background: { type: "transparent" },
9917
+ textColorToken: "primary",
9918
+ borderRadius: "rounded-md",
9919
+ effects: {
9920
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9921
+ }
9922
+ }
9923
+ ]
9924
+ }
9925
+ });
9926
+
9927
+ // ../theme-core/src/buttons/personalities/editorial-link.ts
9928
+ var editorialLink = defineButtonPersonality({
9929
+ id: "editorial-link",
9930
+ name: "Editorial Link",
9931
+ description: "Link-style with a growing underline. Refined, typographic.",
9932
+ tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
9933
+ buttonSystem: {
9934
+ global: {
9935
+ cornerStyle: "square",
9644
9936
  shadow: "none",
9645
- typography: "classic-serif",
9646
- spacing: "airy",
9647
- motion: "none"
9648
- },
9649
- compositionBudget: quietBudget,
9650
- defaultButtonPersonalityId: "editorial-link",
9651
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
9652
- defaultPaletteVariantId: "high-contrast-charcoal",
9653
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
9654
- }),
9655
- defineCuratedSiteStyle({
9656
- id: "site-style:practical-services",
9657
- name: "Practical Services",
9658
- description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
9659
- generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
9660
- selectionKeywords: [
9661
- "repair",
9662
- "plumb",
9663
- "electric",
9664
- "cleaning",
9665
- "landscap",
9666
- "contractor"
9667
- ],
9668
- tokenRecipes: {
9669
- palette: "brand-led",
9670
- contrast: "maximum",
9671
- radius: "soft",
9672
- shadow: "subtle",
9673
- typography: "clean-sans",
9674
- spacing: "compact",
9675
- motion: "none"
9937
+ textTransform: "none",
9938
+ fontWeight: 500,
9939
+ borderWidth: 1,
9940
+ hoverTransform: "none",
9941
+ hoverColor: "none"
9676
9942
  },
9677
- compositionBudget: quietBudget,
9678
- defaultButtonPersonalityId: "confident-chip",
9679
- acceptedButtons: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] },
9680
- defaultPaletteVariantId: "brand-led-cool",
9681
- acceptedPalettes: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] }
9682
- }),
9683
- defineCuratedSiteStyle({
9684
- id: "site-style:modern-wellness",
9685
- name: "Modern Wellness",
9686
- description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
9687
- generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
9688
- tokenRecipes: {
9689
- palette: "soft-natural",
9690
- contrast: "standard",
9691
- radius: "rounded",
9692
- shadow: "subtle",
9693
- typography: "clean-sans",
9694
- spacing: "airy",
9695
- motion: "subtle"
9943
+ variants: [
9944
+ {
9945
+ id: "primary",
9946
+ name: "Primary",
9947
+ enabled: true,
9948
+ priority: 1,
9949
+ background: { type: "transparent" },
9950
+ textColorToken: "text",
9951
+ borderRadius: "rounded-none",
9952
+ shadow: { elevation: "none", softness: null, position: "bottom" },
9953
+ sizes: {
9954
+ sm: { padding: "0.25rem 0" },
9955
+ md: { padding: "0.5rem 0" },
9956
+ lg: { padding: "0.625rem 0" },
9957
+ xl: { padding: "0.75rem 0" }
9958
+ },
9959
+ effects: {
9960
+ base: [
9961
+ { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
9962
+ ]
9963
+ }
9964
+ },
9965
+ {
9966
+ id: "secondary",
9967
+ name: "Secondary",
9968
+ enabled: true,
9969
+ priority: 2,
9970
+ background: { type: "transparent" },
9971
+ textColorToken: "mutedText",
9972
+ borderRadius: "rounded-none",
9973
+ shadow: { elevation: "none", softness: null, position: "bottom" },
9974
+ sizes: {
9975
+ sm: { padding: "0.25rem 0" },
9976
+ md: { padding: "0.5rem 0" },
9977
+ lg: { padding: "0.625rem 0" },
9978
+ xl: { padding: "0.75rem 0" }
9979
+ },
9980
+ effects: {
9981
+ base: [
9982
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
9983
+ ]
9984
+ }
9985
+ },
9986
+ {
9987
+ id: "outline",
9988
+ name: "Outline",
9989
+ enabled: true,
9990
+ priority: 3,
9991
+ background: { type: "transparent" },
9992
+ textColorToken: "accent",
9993
+ borderRadius: "rounded-none",
9994
+ shadow: { elevation: "none", softness: null, position: "bottom" },
9995
+ sizes: {
9996
+ sm: { padding: "0.25rem 0" },
9997
+ md: { padding: "0.5rem 0" },
9998
+ lg: { padding: "0.625rem 0" },
9999
+ xl: { padding: "0.75rem 0" }
10000
+ },
10001
+ effects: {
10002
+ base: [
10003
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
10004
+ ]
10005
+ }
10006
+ },
10007
+ {
10008
+ id: "ghost",
10009
+ name: "Ghost",
10010
+ enabled: true,
10011
+ priority: 3,
10012
+ background: { type: "transparent" },
10013
+ textColorToken: "mutedText",
10014
+ borderRadius: "rounded-none",
10015
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10016
+ sizes: {
10017
+ sm: { padding: "0.25rem 0" },
10018
+ md: { padding: "0.5rem 0" },
10019
+ lg: { padding: "0.625rem 0" },
10020
+ xl: { padding: "0.75rem 0" }
10021
+ },
10022
+ effects: {
10023
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
10024
+ }
10025
+ }
10026
+ ]
10027
+ }
10028
+ });
10029
+
10030
+ // ../theme-core/src/buttons/personalities/ink-stamp.ts
10031
+ var inkStamp = defineButtonPersonality({
10032
+ id: "ink-stamp",
10033
+ name: "Ink Stamp",
10034
+ description: "Hand-stamped block-print buttons with a slight lift on hover.",
10035
+ tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
10036
+ buttonSystem: {
10037
+ global: {
10038
+ cornerStyle: "rounded",
10039
+ shadow: "none",
10040
+ textTransform: "uppercase",
10041
+ fontWeight: 600,
10042
+ borderWidth: 1,
10043
+ hoverTransform: "none",
10044
+ hoverColor: "none",
10045
+ letterSpacing: "loose"
9696
10046
  },
9697
- compositionBudget: balancedBudget,
9698
- defaultButtonPersonalityId: "soft-pill",
9699
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "modern"] },
9700
- defaultPaletteVariantId: "soft-natural-sage",
9701
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
9702
- }),
9703
- defineCuratedSiteStyle({
9704
- id: "site-style:bold-launch",
9705
- name: "Bold Launch",
9706
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
9707
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
9708
- selectionKeywords: [
9709
- "launch",
9710
- "campaign",
9711
- "preorder",
9712
- "pre-order",
9713
- "waitlist",
9714
- "drop"
9715
- ],
9716
- tokenRecipes: {
9717
- palette: "high-contrast",
9718
- contrast: "maximum",
9719
- radius: "pill",
9720
- shadow: "layered",
9721
- typography: "clean-sans",
9722
- spacing: "regular",
9723
- motion: "expressive"
10047
+ sizes: {
10048
+ sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
10049
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
10050
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
10051
+ xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
9724
10052
  },
9725
- compositionBudget: expressiveBudget,
9726
- defaultButtonPersonalityId: "ink-stamp",
9727
- acceptedButtons: { tone: ["classic", "bold"], era: ["editorial", "organic", "modern"] },
9728
- defaultPaletteVariantId: "high-contrast-monochrome",
9729
- acceptedPalettes: { tone: ["bold"], era: ["editorial", "modern"] }
9730
- })
10053
+ variants: [
10054
+ {
10055
+ id: "primary",
10056
+ name: "Primary",
10057
+ enabled: true,
10058
+ priority: 1,
10059
+ background: { type: "solid", colorToken: "primary" },
10060
+ textColorToken: "primaryForeground",
10061
+ borderRadius: "rounded-md",
10062
+ effects: {
10063
+ hover: [
10064
+ { effectId: "drop-shadow", options: { intensity: "medium" } },
10065
+ { effectId: "scale-up", options: { scale: "1.02" } }
10066
+ ],
10067
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10068
+ }
10069
+ },
10070
+ {
10071
+ id: "secondary",
10072
+ name: "Secondary",
10073
+ enabled: true,
10074
+ priority: 2,
10075
+ background: { type: "transparent" },
10076
+ textColorToken: "primary",
10077
+ borderRadius: "rounded-md",
10078
+ border: { widthClass: "border-2", colorToken: "primary" },
10079
+ effects: {
10080
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10081
+ }
10082
+ },
10083
+ {
10084
+ id: "outline",
10085
+ name: "Outline",
10086
+ enabled: true,
10087
+ priority: 3,
10088
+ background: { type: "transparent" },
10089
+ textColorToken: "text",
10090
+ borderRadius: "rounded-md",
10091
+ border: { widthClass: "border-2", colorToken: "border" },
10092
+ effects: {
10093
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10094
+ }
10095
+ },
10096
+ {
10097
+ id: "ghost",
10098
+ name: "Ghost",
10099
+ enabled: true,
10100
+ priority: 3,
10101
+ background: { type: "transparent" },
10102
+ textColorToken: "accent",
10103
+ borderRadius: "rounded-none",
10104
+ sizes: {
10105
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
10106
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
10107
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
10108
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
10109
+ },
10110
+ effects: {
10111
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
10112
+ }
10113
+ }
10114
+ ]
10115
+ }
10116
+ });
10117
+
10118
+ // ../theme-core/src/buttons/personalities/pebble.ts
10119
+ var pebble = defineButtonPersonality({
10120
+ id: "pebble",
10121
+ name: "Pebble",
10122
+ description: "Generous pill buttons with a soft hover lift.",
10123
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10124
+ buttonSystem: {
10125
+ global: {
10126
+ cornerStyle: "pill",
10127
+ shadow: "none",
10128
+ textTransform: "none",
10129
+ fontWeight: 500,
10130
+ borderWidth: 2,
10131
+ hoverTransform: "none",
10132
+ hoverColor: "none"
10133
+ },
10134
+ sizes: {
10135
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10136
+ md: { padding: "0.875rem 2.25rem" },
10137
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10138
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10139
+ },
10140
+ variants: [
10141
+ {
10142
+ id: "primary",
10143
+ name: "Primary",
10144
+ enabled: true,
10145
+ priority: 1,
10146
+ background: { type: "solid", colorToken: "primary" },
10147
+ textColorToken: "primaryForeground",
10148
+ borderRadius: "rounded-full",
10149
+ effects: {
10150
+ hover: [
10151
+ { effectId: "scale-up", options: { scale: "1.03" } },
10152
+ { effectId: "drop-shadow", options: { intensity: "medium" } }
10153
+ ]
10154
+ }
10155
+ },
10156
+ {
10157
+ id: "secondary",
10158
+ name: "Secondary",
10159
+ enabled: true,
10160
+ priority: 2,
10161
+ background: { type: "transparent" },
10162
+ textColorToken: "primary",
10163
+ borderRadius: "rounded-full",
10164
+ border: { widthClass: "border-2", colorToken: "accent" },
10165
+ effects: {
10166
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10167
+ }
10168
+ },
10169
+ {
10170
+ id: "outline",
10171
+ name: "Outline",
10172
+ enabled: true,
10173
+ priority: 3,
10174
+ background: { type: "transparent" },
10175
+ textColorToken: "text",
10176
+ borderRadius: "rounded-full",
10177
+ border: { widthClass: "border", colorToken: "border" },
10178
+ effects: {
10179
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10180
+ }
10181
+ },
10182
+ {
10183
+ id: "ghost",
10184
+ name: "Ghost",
10185
+ enabled: true,
10186
+ priority: 3,
10187
+ background: { type: "transparent" },
10188
+ textColorToken: "primary",
10189
+ borderRadius: "rounded-full",
10190
+ sizes: {
10191
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10192
+ md: { padding: "0.5rem 1rem" },
10193
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10194
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10195
+ },
10196
+ effects: {
10197
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10198
+ }
10199
+ }
10200
+ ]
10201
+ }
10202
+ });
10203
+
10204
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
10205
+ var softPill = defineButtonPersonality({
10206
+ id: "soft-pill",
10207
+ name: "Soft Pill",
10208
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10209
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
10210
+ buttonSystem: {
10211
+ global: {
10212
+ cornerStyle: "pill",
10213
+ shadow: "low",
10214
+ textTransform: "none",
10215
+ fontWeight: 500,
10216
+ borderWidth: 2,
10217
+ hoverTransform: "lift",
10218
+ hoverColor: "none"
10219
+ },
10220
+ variants: [
10221
+ {
10222
+ id: "primary",
10223
+ name: "Primary",
10224
+ enabled: true,
10225
+ priority: 1,
10226
+ background: { type: "solid", colorToken: "primary" },
10227
+ textColorToken: "primaryForeground",
10228
+ borderRadius: "rounded-full",
10229
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
10230
+ effects: {
10231
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
10232
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10233
+ }
10234
+ },
10235
+ {
10236
+ id: "secondary",
10237
+ name: "Secondary",
10238
+ enabled: true,
10239
+ priority: 2,
10240
+ background: { type: "transparent" },
10241
+ textColorToken: "primary",
10242
+ borderRadius: "rounded-full",
10243
+ border: { widthClass: "border-2", colorToken: "primary" },
10244
+ effects: {
10245
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10246
+ }
10247
+ },
10248
+ {
10249
+ id: "outline",
10250
+ name: "Outline",
10251
+ enabled: true,
10252
+ priority: 3,
10253
+ background: { type: "transparent" },
10254
+ textColorToken: "text",
10255
+ borderRadius: "rounded-full",
10256
+ border: { widthClass: "border", colorToken: "border" },
10257
+ effects: {
10258
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10259
+ }
10260
+ },
10261
+ {
10262
+ id: "ghost",
10263
+ name: "Ghost",
10264
+ enabled: true,
10265
+ priority: 3,
10266
+ background: { type: "transparent" },
10267
+ textColorToken: "text",
10268
+ borderRadius: "rounded-full",
10269
+ effects: {
10270
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10271
+ }
10272
+ }
10273
+ ]
10274
+ }
10275
+ });
10276
+
10277
+ // ../theme-core/src/buttons/personalities/index.ts
10278
+ var buttonPersonalities = [
10279
+ softPill,
10280
+ confidentChip,
10281
+ editorialLink,
10282
+ pebble,
10283
+ inkStamp,
10284
+ brushedWash
9731
10285
  ];
9732
- var curatedSiteStylesById = new Map(
9733
- curatedSiteStyles.map((style) => [style.id, style])
10286
+ var personalitiesById = new Map(
10287
+ buttonPersonalities.map((p) => [p.id, p])
9734
10288
  );
9735
10289
 
9736
- // ../theme-core/src/site-styles/designState.ts
9737
- import { z as z10 } from "zod";
9738
-
9739
- // ../theme-core/src/site-styles/rawStyleFields.ts
9740
- var themeV2RuntimeStyleFieldNames = [
9741
- "_frameStyles",
9742
- "_sectionStyles",
9743
- "_containerStyles",
9744
- "_cardStyles",
9745
- // styleGroup is legacy runtime transition wiring rather than a nested
9746
- // override object, but normal editors should still never see it directly.
9747
- "styleGroup"
9748
- ];
9749
- var themeV2BlockSpecificRawStyleFieldNames = [
9750
- "_contentCardStyles",
9751
- "_textCardStyles"
9752
- ];
9753
- var themeV2NormalEditorRawStyleFieldNames = [
9754
- ...themeV2RuntimeStyleFieldNames,
9755
- ...themeV2BlockSpecificRawStyleFieldNames
9756
- ];
9757
- var themeV2NormalEditorRawStyleFieldNameSet = new Set(
9758
- themeV2NormalEditorRawStyleFieldNames
9759
- );
9760
-
9761
- // ../theme-core/src/site-styles/designState.ts
9762
- var themeV2DesignStateSchemaVersion = 1;
9763
- var designResolutionPolicySchema = z10.enum(["generated", "user", "admin", "sdk"]);
9764
- var runtimeStyleFieldNameSchema = z10.enum(themeV2RuntimeStyleFieldNames);
9765
- var nonEmptyRuntimeStyleFieldNamesSchema = z10.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
9766
- fields3[0],
9767
- ...fields3.slice(1)
9768
- ]);
9769
- var heroLegibilityStrategySchema = z10.enum([
9770
- "none",
9771
- "scrim-gradient",
9772
- "solid-panel"
9773
- ]);
9774
- function uniqueNonEmpty(values) {
9775
- const uniqueValues = [...new Set(values)];
9776
- const firstValue = uniqueValues[0];
9777
- if (!firstValue) {
9778
- throw new Error("Expected at least one Theme V2 design state option.");
9779
- }
9780
- return [firstValue, ...uniqueValues.slice(1)];
9781
- }
9782
- var userPanelTreatments = uniqueNonEmpty(
9783
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
9784
- );
9785
- var userFlushTreatments = uniqueNonEmpty(
9786
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
9787
- );
9788
- var userFlushBleeds = uniqueNonEmpty(
9789
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
9790
- );
9791
- var contentFrameIntentSchema = z10.discriminatedUnion("kind", [
9792
- z10.object({ kind: z10.literal("plain") }).strict(),
9793
- z10.object({
9794
- kind: z10.literal("panel"),
9795
- treatment: z10.enum(userPanelTreatments)
9796
- }).strict(),
9797
- z10.object({
9798
- kind: z10.literal("flush-panel"),
9799
- treatment: z10.enum(userFlushTreatments),
9800
- bleed: z10.enum(userFlushBleeds)
9801
- }).strict()
9802
- ]);
9803
- var blockDesignPlanSchema = z10.object({
9804
- blockId: z10.string().min(1).transform(asDesignBlockId),
9805
- blockKind: z10.string().min(1),
9806
- purpose: z10.string().min(1),
9807
- sectionSurface: z10.enum(userDesignOptionCatalog.sectionSurfaces),
9808
- contentFrame: contentFrameIntentSchema,
9809
- itemSurface: z10.enum(userDesignOptionCatalog.itemSurfaces),
9810
- transitionAfter: z10.enum(userDesignOptionCatalog.transitions),
9811
- emphasis: z10.enum(userDesignOptionCatalog.emphases),
9812
- heroLegibility: heroLegibilityStrategySchema.optional()
9813
- }).strict();
9814
- var styleAuthoritySchema = z10.discriminatedUnion("kind", [
9815
- z10.object({
9816
- kind: z10.literal("theme-v2"),
9817
- source: designResolutionPolicySchema,
9818
- siteStyleId: z10.string().min(1).transform(asSiteStyleId),
9819
- templateId: z10.string().min(1).transform(asDesignSystemTemplateId),
9820
- templateVersion: z10.number().int().nonnegative(),
9821
- resolverVersion: z10.number().int().nonnegative()
9822
- }).strict(),
9823
- z10.object({
9824
- kind: z10.literal("legacy-raw"),
9825
- reason: z10.enum(["pre-theme-v2", "manual-runtime-fields"])
9826
- }).strict(),
9827
- z10.object({
9828
- kind: z10.literal("advanced-detached"),
9829
- reason: z10.literal("detached-custom-runtime-fields")
9830
- }).strict()
9831
- ]);
9832
- var blockRuntimeStyleAuthoritySchema = z10.object({
9833
- unit: z10.literal("block-runtime-fields"),
9834
- blockId: z10.string().min(1).transform(asDesignBlockId),
9835
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
9836
- authority: styleAuthoritySchema
9837
- }).strict();
9838
- var persistedPageDesignStateV1Schema = z10.object({
9839
- schemaVersion: z10.literal(themeV2DesignStateSchemaVersion),
9840
- siteStyleId: z10.string().min(1).transform(asSiteStyleId),
9841
- templateId: z10.string().min(1).transform(asDesignSystemTemplateId),
9842
- templateVersion: z10.number().int().nonnegative(),
9843
- resolverVersion: z10.number().int().nonnegative(),
9844
- rhythmPresetId: z10.string().min(1),
9845
- blocks: z10.array(blockDesignPlanSchema),
9846
- styleAuthorities: z10.array(blockRuntimeStyleAuthoritySchema)
9847
- }).strict();
9848
-
9849
- // ../theme-core/src/site-styles/generatedSchemas.ts
9850
- import { z as z11 } from "zod";
9851
- function uniqueNonEmpty2(values) {
9852
- const uniqueValues = [...new Set(values)];
9853
- const firstValue = uniqueValues[0];
9854
- if (!firstValue) {
9855
- throw new Error("Expected at least one generated schema option.");
9856
- }
9857
- return [firstValue, ...uniqueValues.slice(1)];
9858
- }
9859
- var generatedPanelTreatments = uniqueNonEmpty2(
9860
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
9861
- );
9862
- var generatedFlushTreatments = uniqueNonEmpty2(
9863
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
9864
- );
9865
- var generatedFlushBleeds = uniqueNonEmpty2(
9866
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
9867
- );
9868
- var generatedPanelFrameSchema = z11.object({
9869
- kind: z11.literal("panel"),
9870
- treatment: z11.enum(generatedPanelTreatments)
9871
- }).strict();
9872
- var generatedFlushPanelFrameSchema = z11.object({
9873
- kind: z11.literal("flush-panel"),
9874
- treatment: z11.enum(generatedFlushTreatments),
9875
- bleed: z11.enum(generatedFlushBleeds)
9876
- }).strict();
9877
- var generatedContentFrameIntentSchema = z11.discriminatedUnion("kind", [
9878
- z11.object({ kind: z11.literal("plain") }).strict(),
9879
- generatedPanelFrameSchema,
9880
- generatedFlushPanelFrameSchema
9881
- ]);
9882
- var generatedSiteStyleIdSchema = z11.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
9883
- function generatedChoiceSchema(valueSchema) {
9884
- return z11.discriminatedUnion("kind", [
9885
- z11.object({
9886
- source: z11.literal("generated"),
9887
- kind: z11.literal("auto")
9888
- }).strict(),
9889
- z11.object({
9890
- source: z11.literal("generated"),
9891
- kind: z11.literal("explicit"),
9892
- value: valueSchema
9893
- }).strict()
9894
- ]);
9895
- }
9896
- var generatedBlockDesignIntentSchema = z11.object({
9897
- sectionSurface: generatedChoiceSchema(
9898
- z11.enum(generatedDesignOptionCatalog.sectionSurfaces)
9899
- ),
9900
- contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
9901
- itemSurface: generatedChoiceSchema(
9902
- z11.enum(generatedDesignOptionCatalog.itemSurfaces)
9903
- ),
9904
- transitionAfter: generatedChoiceSchema(
9905
- z11.enum(generatedDesignOptionCatalog.transitions)
9906
- ),
9907
- emphasis: generatedChoiceSchema(
9908
- z11.enum(generatedDesignOptionCatalog.emphases)
9909
- )
9910
- }).strict();
9911
- var generatedMediaCompositionIntentSchema = z11.enum([
9912
- "none",
9913
- "supporting",
9914
- "dominant"
9915
- ]);
9916
- var generatedDecorativeCompositionIntentSchema = z11.enum([
9917
- "none",
9918
- "supporting"
9919
- ]);
9920
- var generatedHeroLegibilityStrategySchema = z11.enum([
9921
- "none",
9922
- "scrim-gradient"
9923
- ]);
9924
- var generatedBlockMediaIntentSchema = z11.object({
9925
- media: generatedMediaCompositionIntentSchema,
9926
- decorative: generatedDecorativeCompositionIntentSchema,
9927
- heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
9928
- }).strict();
9929
- var generatedBoundaryIntentSchema = z11.object({
9930
- transitionAfter: generatedChoiceSchema(
9931
- z11.enum(generatedDesignOptionCatalog.transitions)
9932
- )
9933
- }).strict();
9934
- var generatedPageDesignBlockIntentSchema = z11.object({
9935
- blockId: z11.string().min(1),
9936
- blockKind: z11.string().min(1),
9937
- purpose: z11.string().min(1),
9938
- design: generatedBlockDesignIntentSchema,
9939
- mediaIntent: generatedBlockMediaIntentSchema,
9940
- boundaryIntent: generatedBoundaryIntentSchema
9941
- }).strict();
9942
- var generatedPageDesignIntentSchema = z11.object({
9943
- siteStyleId: generatedSiteStyleIdSchema,
9944
- blocks: z11.array(generatedPageDesignBlockIntentSchema)
9945
- }).strict();
9946
-
9947
- // ../theme-core/src/site-styles/pageDesignIntent.ts
9948
- import { z as z12 } from "zod";
9949
- var pageDesignIntentSchemaVersion = 1;
9950
- var pageDesignUserPinnedAppearanceChoiceSchema = z12.object({
9951
- kind: z12.literal("user-pinned"),
9952
- value: z12.string().min(1).transform(asAppearancePresetId)
9953
- }).strict();
9954
- var pageDesignUserPinnedBoundaryChoiceSchema = z12.object({
9955
- kind: z12.literal("user-pinned"),
9956
- value: z12.string().min(1).transform(asBoundaryOptionId)
9957
- }).strict();
9958
- var pageDesignBlockLookPinSchema = z12.object({
9959
- blockId: z12.string().min(1).transform(asDesignBlockId),
9960
- blockKind: z12.string().min(1),
9961
- choice: pageDesignUserPinnedAppearanceChoiceSchema
9962
- }).strict();
9963
- var pageDesignBoundaryPinSchema = z12.object({
9964
- boundaryId: z12.string().min(1).transform(asDesignBoundaryId),
9965
- previousBlockId: z12.string().min(1).transform(asDesignBlockId),
9966
- nextBlockId: z12.string().min(1).transform(asDesignBlockId),
9967
- choice: pageDesignUserPinnedBoundaryChoiceSchema
9968
- }).strict().superRefine((pin, ctx) => {
9969
- const expectedBoundaryId = makeBoundaryId(
9970
- pin.previousBlockId,
9971
- pin.nextBlockId
9972
- );
9973
- if (pin.boundaryId !== expectedBoundaryId) {
9974
- ctx.addIssue({
9975
- code: z12.ZodIssueCode.custom,
9976
- path: ["boundaryId"],
9977
- message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
9978
- });
9979
- }
9980
- });
9981
- var pageDesignIntentV1Schema = z12.object({
9982
- schemaVersion: z12.literal(pageDesignIntentSchemaVersion),
9983
- siteStyleId: z12.string().min(1).transform(asSiteStyleId),
9984
- pageFlowPresetId: z12.string().min(1).transform(asPageFlowPresetId),
9985
- blockLookPins: z12.array(pageDesignBlockLookPinSchema),
9986
- boundaryPins: z12.array(pageDesignBoundaryPinSchema)
9987
- }).strict().superRefine((intent, ctx) => {
9988
- addDuplicateStringIssues(ctx, {
9989
- values: intent.blockLookPins.map((pin) => pin.blockId),
9990
- path: ["blockLookPins"],
9991
- label: "block Look pin"
9992
- });
9993
- addDuplicateStringIssues(ctx, {
9994
- values: intent.boundaryPins.map(
9995
- (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
9996
- ),
9997
- path: ["boundaryPins"],
9998
- label: "boundary pin"
9999
- });
10000
- });
10001
- function addDuplicateStringIssues(ctx, input) {
10002
- const seen = /* @__PURE__ */ new Set();
10003
- const duplicates = /* @__PURE__ */ new Set();
10004
- for (const value of input.values) {
10005
- if (seen.has(value)) {
10006
- duplicates.add(value);
10007
- }
10008
- seen.add(value);
10009
- }
10010
- for (const duplicate of duplicates) {
10011
- ctx.addIssue({
10012
- code: z12.ZodIssueCode.custom,
10013
- path: [...input.path],
10014
- message: `Duplicate ${input.label}: ${duplicate}.`
10015
- });
10016
- }
10017
- }
10018
- function boundaryKey(previousBlockId, nextBlockId) {
10019
- return makeBoundaryId(previousBlockId, nextBlockId);
10020
- }
10290
+ // ../theme-core/src/palette/variants/types.ts
10291
+ import { z as z23 } from "zod";
10021
10292
 
10022
10293
  // ../theme-core/src/schema.ts
10023
- import { z as z25 } from "zod";
10294
+ import { z as z22 } from "zod";
10024
10295
 
10025
10296
  // ../theme-core/src/lib/media.ts
10026
- import z13 from "zod";
10027
- var hotspotSchema = z13.object({
10028
- x: z13.number().min(0).max(1),
10029
- y: z13.number().min(0).max(1),
10030
- radius: z13.number().optional()
10031
- });
10032
- var rotationSchema = z13.union([z13.literal(0), z13.literal(90), z13.literal(180), z13.literal(270)]);
10033
- var rectSchema = z13.tuple([z13.number(), z13.number(), z13.number(), z13.number()]);
10034
- var aspectCropSchema = z13.object({
10035
- aspect: z13.preprocess((value) => value == null ? void 0 : value, z13.string().optional()),
10036
- rect: z13.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
10037
- hotspot: z13.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
10038
- rotation: z13.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
10039
- });
10040
- var transformSchema = z13.object({
10041
- aspectCrops: z13.preprocess((value) => {
10297
+ import z12 from "zod";
10298
+ var hotspotSchema = z12.object({
10299
+ x: z12.number().min(0).max(1),
10300
+ y: z12.number().min(0).max(1),
10301
+ radius: z12.number().optional()
10302
+ });
10303
+ var rotationSchema = z12.union([z12.literal(0), z12.literal(90), z12.literal(180), z12.literal(270)]);
10304
+ var rectSchema = z12.tuple([z12.number(), z12.number(), z12.number(), z12.number()]);
10305
+ var aspectCropSchema = z12.object({
10306
+ aspect: z12.preprocess((value) => value == null ? void 0 : value, z12.string().optional()),
10307
+ rect: z12.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
10308
+ hotspot: z12.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
10309
+ rotation: z12.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
10310
+ });
10311
+ var transformSchema = z12.object({
10312
+ aspectCrops: z12.preprocess((value) => {
10042
10313
  if (!value || typeof value !== "object" || Array.isArray(value)) {
10043
10314
  return void 0;
10044
10315
  }
10045
10316
  return value;
10046
- }, z13.record(z13.string(), aspectCropSchema.catch({}))).optional(),
10317
+ }, z12.record(z12.string(), aspectCropSchema.catch({}))).optional(),
10047
10318
  rect: rectSchema.optional(),
10048
10319
  hotspot: hotspotSchema.optional(),
10049
10320
  rotation: rotationSchema.optional()
10050
10321
  });
10051
- var mediaSchema = z13.object({
10052
- type: z13.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
10053
- purpose: z13.string().optional(),
10054
- placeholder: z13.boolean().default(true).optional(),
10055
- assetId: z13.string().optional(),
10056
- identifier: z13.string().optional(),
10057
- src: z13.string().optional(),
10058
- alt: z13.string().optional(),
10059
- filename: z13.string().optional(),
10060
- mimeType: z13.string().optional(),
10061
- width: z13.number().optional(),
10062
- height: z13.number().optional(),
10063
- storageBucket: z13.string().optional(),
10064
- storagePath: z13.string().optional(),
10322
+ var mediaSchema = z12.object({
10323
+ type: z12.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
10324
+ purpose: z12.string().optional(),
10325
+ placeholder: z12.boolean().default(true).optional(),
10326
+ assetId: z12.string().optional(),
10327
+ identifier: z12.string().optional(),
10328
+ src: z12.string().optional(),
10329
+ alt: z12.string().optional(),
10330
+ filename: z12.string().optional(),
10331
+ mimeType: z12.string().optional(),
10332
+ width: z12.number().optional(),
10333
+ height: z12.number().optional(),
10334
+ storageBucket: z12.string().optional(),
10335
+ storagePath: z12.string().optional(),
10065
10336
  transform: transformSchema.optional()
10066
10337
  });
10067
10338
 
10068
- // ../theme-core/src/buttons/types.ts
10069
- import { z as z14 } from "zod";
10070
- var VARIANT_ROLES = [
10071
- "primary",
10072
- "secondary",
10073
- "outline",
10074
- "ghost",
10075
- "link",
10076
- "tertiary",
10077
- "accent"
10078
- ];
10079
- var cornerStyleSchema = z14.enum(["square", "rounded", "pill"]);
10080
- var shadowSizeSchema = z14.enum(["none", "low", "medium", "high"]);
10081
- var textTransformSchema = z14.enum(["none", "uppercase", "lowercase", "capitalize"]);
10082
- var fontWeightSchema = z14.union([z14.literal(500), z14.literal(600), z14.literal(700)]);
10083
- var buttonTypographySchema = z14.enum(["body", "heading"]);
10084
- var letterSpacingSchema = z14.enum(["tight", "normal", "loose"]);
10085
- var hoverTransformSchema = z14.enum(["none", "lift", "scale", "press"]);
10086
- var hoverColorSchema = z14.enum(["none", "brighten", "darken", "saturate", "token"]);
10087
- var buttonPaddingPresetSchema = z14.enum(["compact", "default", "spacious"]);
10088
- var gradientStyleSchema = z14.enum(["linear", "radial", "conic"]);
10089
- var gradientSharpnessSchema = z14.enum(["smooth", "medium", "hard"]);
10090
- var prioritySchema = z14.union([z14.literal(1), z14.literal(2), z14.literal(3)]);
10091
- var variantRoleSchema = z14.enum(VARIANT_ROLES);
10092
- var buttonSizeNameSchema = z14.enum(["sm", "md", "lg", "xl"]);
10093
- var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
10094
- var paddingShorthandSchema = z14.string().refine(
10095
- (value) => {
10096
- const parts = value.split(/\s+/).filter(Boolean);
10097
- return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
10098
- },
10099
- {
10100
- message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
10101
- }
10102
- );
10103
- var buttonSizeConfigSchema = z14.object({
10104
- padding: paddingShorthandSchema,
10105
- fontSize: z14.string().optional()
10106
- });
10107
- var buttonSizesSchema = z14.object({
10108
- sm: buttonSizeConfigSchema,
10109
- md: buttonSizeConfigSchema,
10110
- lg: buttonSizeConfigSchema,
10111
- xl: buttonSizeConfigSchema.optional()
10112
- }).transform(({ sm, md, lg, xl }) => ({
10113
- sm,
10114
- md,
10115
- lg,
10116
- xl: xl ?? lg
10117
- }));
10118
- var buttonGlobalSettingsSchema = z14.object({
10119
- cornerStyle: cornerStyleSchema,
10120
- cornerRadius: z14.number().min(0).max(24).optional(),
10121
- shadow: shadowSizeSchema,
10122
- textTransform: textTransformSchema,
10123
- fontWeight: fontWeightSchema,
10124
- /**
10125
- * @deprecated Set per-variant via `variant.border.widthClass` instead.
10126
- * Schema field is preserved so existing presets parse; the value is unread
10127
- * by the current generator and will be removed once the legacy
10128
- * `primitives/content/components/Button.tsx` slot exports are deleted.
10129
- */
10130
- borderWidth: z14.union([z14.literal(1), z14.literal(2), z14.literal(3)]),
10131
- // === Family-level typography ===
10132
- // Typography source (body or heading) — selects which theme typography pool to inherit
10133
- typography: buttonTypographySchema.optional(),
10134
- // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
10135
- // Sized variants get this as default; fixed variants inherit unless they override.
10136
- // Size class CSS may still override at run time for sized variants.
10137
- fontSize: z14.string().optional(),
10138
- // Letter spacing applied to all variants
10139
- letterSpacing: letterSpacingSchema.optional(),
10140
- // Italic style
10141
- italic: z14.boolean().optional(),
10142
- // Padding preset (applies to sized variants without a sizes config)
10143
- paddingPreset: buttonPaddingPresetSchema.optional(),
10144
- hoverTransform: hoverTransformSchema,
10145
- hoverColor: hoverColorSchema,
10146
- // When hoverColor is 'token', this specifies which token to use
10147
- hoverColorToken: z14.string().optional(),
10148
- // Gradient settings (if any variant uses gradients)
10149
- gradientStyle: gradientStyleSchema.optional(),
10150
- gradientAngle: z14.number().min(0).max(360).optional(),
10151
- gradientSharpness: gradientSharpnessSchema.optional()
10152
- });
10153
- var gradientDirectionSchema = z14.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
10154
- var buttonBackgroundSchema = z14.discriminatedUnion("type", [
10155
- z14.object({ type: z14.literal("solid"), colorToken: z14.string() }),
10156
- z14.object({
10157
- type: z14.literal("gradient"),
10158
- stops: z14.array(z14.string()).min(2),
10159
- direction: gradientDirectionSchema
10339
+ // ../theme-core/src/buttons/generateButtonCss.ts
10340
+ var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
10341
+
10342
+ // ../theme-core/src/cards/types.ts
10343
+ import { z as z13 } from "zod";
10344
+ var cardSpacingSchema = z13.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
10345
+ var gradientDirectionSchema2 = z13.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
10346
+ var cardBackgroundSchema = z13.discriminatedUnion("type", [
10347
+ z13.object({ type: z13.literal("solid"), colorToken: z13.string() }),
10348
+ z13.object({
10349
+ type: z13.literal("gradient"),
10350
+ fromToken: z13.string(),
10351
+ toToken: z13.string(),
10352
+ direction: gradientDirectionSchema2
10160
10353
  }),
10161
- z14.object({ type: z14.literal("transparent") })
10354
+ z13.object({ type: z13.literal("transparent") })
10162
10355
  ]);
10163
- var effectApplicationSchema = z14.object({
10164
- effectId: z14.string(),
10165
- options: z14.record(z14.string(), z14.any()).optional()
10166
- });
10167
- var buttonBorderSchema = z14.object({
10168
- widthClass: z14.string(),
10169
- colorToken: z14.string()
10170
- });
10171
- var variantShadowSchema = z14.object({
10172
- elevation: z14.enum(["none", "low", "medium", "high"]),
10173
- softness: z14.enum(["crisp", "soft", "hard"]).nullable(),
10174
- position: z14.enum(["bottom", "bottom-right"]).default("bottom")
10175
- });
10176
- var variantEffectsSchema = z14.object({
10177
- base: z14.array(effectApplicationSchema).optional(),
10178
- hover: z14.array(effectApplicationSchema).optional(),
10179
- active: z14.array(effectApplicationSchema).optional(),
10180
- focus: z14.array(effectApplicationSchema).optional()
10181
- });
10182
- var variantSizeOverridesSchema = z14.object({
10183
- sm: buttonSizeConfigSchema.optional(),
10184
- md: buttonSizeConfigSchema.optional(),
10185
- lg: buttonSizeConfigSchema.optional(),
10186
- xl: buttonSizeConfigSchema.optional()
10187
- });
10188
- var buttonVariantSchema = z14.object({
10189
- id: z14.string(),
10190
- name: z14.string().min(1).max(20),
10191
- enabled: z14.boolean(),
10192
- priority: prioritySchema,
10193
- // Base appearance (token-based)
10194
- background: buttonBackgroundSchema,
10195
- textColorToken: z14.string(),
10196
- /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
10197
- borderRadius: z14.string().optional(),
10198
- // Optional shadow override (uses theme.shadow if not specified)
10199
- shadow: variantShadowSchema.optional(),
10356
+ var cardBorderSchema = z13.object({
10357
+ widthClass: z13.string(),
10358
+ colorToken: z13.string()
10359
+ });
10360
+ var cardVariantSchema = z13.object({
10361
+ id: z13.string(),
10362
+ name: z13.string().min(1).max(20),
10363
+ enabled: z13.boolean(),
10364
+ priority: z13.union([z13.literal(1), z13.literal(2), z13.literal(3)]),
10365
+ // Appearance (token-based)
10366
+ background: cardBackgroundSchema,
10367
+ spacing: cardSpacingSchema,
10368
+ // Optional overrides (uses theme defaults if not specified)
10369
+ shadow: z13.object({
10370
+ elevation: z13.enum(["none", "low", "medium", "high"]),
10371
+ softness: z13.enum(["crisp", "soft", "hard"]).nullable(),
10372
+ position: z13.enum(["bottom", "bottom-right"]).default("bottom")
10373
+ }).optional(),
10374
+ corners: z13.enum(["square", "soft", "rounded", "pill"]).optional(),
10200
10375
  // Border (optional)
10201
- border: buttonBorderSchema.optional(),
10202
- // Hover background token (per-variant override, takes precedence over global hoverColorToken)
10203
- hoverBackgroundToken: z14.string().optional(),
10204
- // Effect composition
10205
- effects: variantEffectsSchema.optional(),
10206
- // Per-variant size overrides — see VariantSizeOverrides
10207
- sizes: variantSizeOverridesSchema.optional()
10376
+ border: cardBorderSchema.optional()
10208
10377
  });
10209
- var buttonSystemSchema = z14.object({
10210
- global: buttonGlobalSettingsSchema,
10211
- variants: z14.array(buttonVariantSchema).min(1).max(6),
10212
- sizes: buttonSizesSchema.optional()
10378
+ var cardSystemSchema = z13.object({
10379
+ variants: z13.array(cardVariantSchema).min(1).max(3)
10213
10380
  });
10214
10381
 
10215
- // ../theme-core/src/buttons/generateButtonCss.ts
10216
- var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
10382
+ // ../theme-core/src/accordions/types.ts
10383
+ import { z as z14 } from "zod";
10384
+ var accordionIconSchema = z14.enum([
10385
+ "plus-minus",
10386
+ // + becomes - (swap or rotate 90°)
10387
+ "chevron",
10388
+ // › becomes ⌄ (rotate 90° or 180°)
10389
+ "caret",
10390
+ // ▸ becomes ▾ (rotate 90° or 180°)
10391
+ "arrow",
10392
+ // → becomes ↓ (rotate 90° or 180°)
10393
+ "circle-plus-minus"
10394
+ // ⊕ becomes ⊖ (swap with fade)
10395
+ ]);
10396
+ var accordionSystemSchema = z14.object({
10397
+ // Visual styling (solid color only - gradients can be added later if needed)
10398
+ background: z14.object({
10399
+ type: z14.literal("solid"),
10400
+ colorToken: z14.string()
10401
+ }),
10402
+ // Spacing (padding inside items)
10403
+ spacing: z14.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
10404
+ // Border radius (null = inherit from theme.corners)
10405
+ corners: z14.enum(["square", "soft", "rounded", "pill"]).nullable(),
10406
+ // Border styling (null = inherit from theme.border)
10407
+ border: z14.object({
10408
+ widthClass: z14.string(),
10409
+ // e.g., 'border', 'border-2', 'border-0'
10410
+ colorToken: z14.string()
10411
+ }).nullable(),
10412
+ // Shadow (null = inherit from theme.shadow)
10413
+ shadow: z14.object({
10414
+ elevation: z14.enum(["none", "low", "medium", "high"]),
10415
+ softness: z14.enum(["soft", "crisp", "hard"]).nullable(),
10416
+ position: z14.enum(["bottom", "bottom-right"])
10417
+ }).nullable(),
10418
+ // Icon style and animation
10419
+ icon: z14.object({
10420
+ style: accordionIconSchema,
10421
+ position: z14.enum(["left", "right"]),
10422
+ size: z14.enum(["sm", "md", "lg"])
10423
+ }),
10424
+ // Trigger (question) styling
10425
+ trigger: z14.object({
10426
+ textColorToken: z14.string(),
10427
+ fontWeight: z14.enum(["regular", "medium", "semibold", "bold"]).nullable()
10428
+ // null = inherit from theme
10429
+ }),
10430
+ // Hover state styling
10431
+ hover: z14.object({
10432
+ backgroundColorToken: z14.string().optional(),
10433
+ textColorToken: z14.string().optional(),
10434
+ borderColorToken: z14.string().optional()
10435
+ }),
10436
+ // Content (answer) styling
10437
+ content: z14.object({
10438
+ textColorToken: z14.string()
10439
+ })
10440
+ });
10217
10441
 
10218
- // ../theme-core/src/buttons/personalities/types.ts
10442
+ // ../theme-core/src/inputs/types.ts
10219
10443
  import { z as z15 } from "zod";
10220
- function asButtonPersonalityId(value) {
10221
- if (value.length === 0) {
10222
- throw new Error("ButtonPersonalityId must be a non-empty string");
10223
- }
10224
- return value;
10225
- }
10226
- var buttonPersonalityIdSchema = z15.string().min(1).transform((value) => asButtonPersonalityId(value));
10227
- var buttonPersonalitySchema = z15.object({
10228
- id: buttonPersonalityIdSchema,
10229
- name: z15.string().min(1),
10230
- description: z15.string().min(1),
10231
- tags: styleTagsSchema,
10232
- buttonSystem: buttonSystemSchema
10444
+ var inputSystemSchema = z15.object({
10445
+ // Base styling (applied to all inputs)
10446
+ base: z15.object({
10447
+ background: z15.union([
10448
+ z15.object({
10449
+ type: z15.literal("solid"),
10450
+ colorToken: z15.string()
10451
+ }),
10452
+ z15.object({
10453
+ type: z15.literal("transparent")
10454
+ })
10455
+ ]),
10456
+ textColorToken: z15.string(),
10457
+ border: z15.object({
10458
+ widthClass: z15.string(),
10459
+ // e.g., 'border', 'border-2'
10460
+ colorToken: z15.string(),
10461
+ style: z15.enum(["all", "underline"]).optional()
10462
+ }),
10463
+ corners: z15.enum(["square", "soft", "rounded", "pill"]).nullable(),
10464
+ // null = inherit from theme.corners
10465
+ shadow: z15.object({
10466
+ elevation: z15.enum(["none", "low", "medium"]),
10467
+ softness: z15.enum(["soft", "crisp", "hard"]).nullable()
10468
+ }).nullable(),
10469
+ spacing: z15.enum(["compact", "cozy", "medium", "comfortable"]),
10470
+ // padding inside inputs
10471
+ fontSize: z15.enum(["sm", "base", "lg"])
10472
+ }),
10473
+ // Label styling
10474
+ label: z15.object({
10475
+ textColorToken: z15.string(),
10476
+ fontWeight: z15.enum(["regular", "medium", "semibold", "bold", "black"]),
10477
+ fontSize: z15.enum(["2xs", "xs", "sm", "base"]),
10478
+ textTransform: z15.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
10479
+ letterSpacing: z15.enum(["normal", "wide", "wider", "widest"]).optional(),
10480
+ opacity: z15.number().min(0.2).max(1).optional()
10481
+ }),
10482
+ // Focus state
10483
+ focus: z15.object({
10484
+ ringColorToken: z15.string(),
10485
+ ringWidth: z15.enum(["0", "1", "2", "3"]),
10486
+ borderColorToken: z15.string().optional()
10487
+ // Change border color on focus
10488
+ }),
10489
+ // Error state (for validation feedback)
10490
+ error: z15.object({
10491
+ borderColorToken: z15.string(),
10492
+ textColorToken: z15.string()
10493
+ }),
10494
+ // Disabled state
10495
+ disabled: z15.object({
10496
+ backgroundColorToken: z15.string(),
10497
+ textColorToken: z15.string(),
10498
+ opacity: z15.number().min(0.3).max(0.7)
10499
+ })
10233
10500
  });
10234
- function defineButtonPersonality(input) {
10235
- return {
10236
- id: asButtonPersonalityId(input.id),
10237
- name: input.name,
10238
- description: input.description,
10239
- tags: input.tags,
10240
- buttonSystem: input.buttonSystem
10241
- };
10242
- }
10243
10501
 
10244
- // ../theme-core/src/buttons/personalities/brushed-wash.ts
10245
- var brushedWash = defineButtonPersonality({
10246
- id: "brushed-wash",
10247
- name: "Brushed Wash",
10248
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
10249
- tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
10250
- buttonSystem: {
10251
- global: {
10252
- cornerStyle: "rounded",
10253
- shadow: "low",
10254
- textTransform: "none",
10255
- fontWeight: 500,
10256
- borderWidth: 1,
10257
- hoverTransform: "none",
10258
- hoverColor: "none"
10259
- },
10260
- sizes: {
10261
- sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
10262
- md: { padding: "1rem 2.5rem" },
10263
- lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
10264
- xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
10265
- },
10266
- variants: [
10267
- {
10268
- id: "primary",
10269
- name: "Primary",
10270
- enabled: true,
10271
- priority: 1,
10272
- background: {
10273
- type: "gradient",
10274
- stops: ["primary", "accent"],
10275
- direction: "to-r"
10276
- },
10277
- textColorToken: "primaryForeground",
10278
- borderRadius: "rounded-lg",
10279
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
10280
- effects: {
10281
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
10282
- }
10283
- },
10284
- {
10285
- id: "secondary",
10286
- name: "Secondary",
10287
- enabled: true,
10288
- priority: 2,
10289
- background: {
10290
- type: "gradient",
10291
- stops: ["secondary", "accent"],
10292
- direction: "to-br"
10293
- },
10294
- textColorToken: "primaryForeground",
10295
- borderRadius: "rounded-lg",
10296
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
10297
- effects: {
10298
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
10299
- }
10300
- },
10301
- {
10302
- id: "outline",
10303
- name: "Outline",
10304
- enabled: true,
10305
- priority: 3,
10306
- background: { type: "transparent" },
10307
- textColorToken: "primary",
10308
- borderRadius: "rounded-lg",
10309
- border: { widthClass: "border", colorToken: "primary" },
10310
- effects: {
10311
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10312
- }
10313
- },
10314
- {
10315
- id: "ghost",
10316
- name: "Ghost",
10317
- enabled: true,
10318
- priority: 3,
10319
- background: { type: "transparent" },
10320
- textColorToken: "text",
10321
- borderRadius: "rounded-lg",
10322
- effects: {
10323
- hover: [
10324
- { effectId: "background-on-hover", options: { colorToken: "surface" } }
10325
- ]
10326
- }
10327
- }
10328
- ]
10329
- }
10502
+ // ../theme-core/src/gradients/types.ts
10503
+ import { z as z16 } from "zod";
10504
+ var gradientStopSchema = z16.object({
10505
+ color: z16.string(),
10506
+ // Theme color token name (e.g., 'primary-500')
10507
+ position: z16.number().min(0).max(100)
10508
+ // Percentage 0-100
10330
10509
  });
10331
-
10332
- // ../theme-core/src/buttons/personalities/confident-chip.ts
10333
- var confidentChip = defineButtonPersonality({
10334
- id: "confident-chip",
10335
- name: "Confident Chip",
10336
- description: "Mid-radius solid buttons with a crisp hover.",
10337
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
10338
- buttonSystem: {
10339
- global: {
10340
- cornerStyle: "rounded",
10341
- shadow: "medium",
10342
- textTransform: "none",
10343
- fontWeight: 600,
10344
- borderWidth: 1,
10345
- hoverTransform: "none",
10346
- hoverColor: "none"
10347
- },
10348
- variants: [
10349
- {
10350
- id: "primary",
10351
- name: "Primary",
10352
- enabled: true,
10353
- priority: 1,
10354
- background: { type: "solid", colorToken: "primary" },
10355
- textColorToken: "primaryForeground",
10356
- borderRadius: "rounded-md",
10357
- shadow: { elevation: "medium", softness: "soft", position: "bottom" },
10358
- effects: {
10359
- hover: [{ effectId: "darken-background", options: { amount: 60 } }],
10360
- active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
10361
- }
10362
- },
10363
- {
10364
- id: "secondary",
10365
- name: "Secondary",
10366
- enabled: true,
10367
- priority: 2,
10368
- background: { type: "solid", colorToken: "surface" },
10369
- textColorToken: "text",
10370
- borderRadius: "rounded-md",
10371
- border: { widthClass: "border", colorToken: "border" },
10372
- effects: {
10373
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
10374
- }
10375
- },
10376
- {
10377
- id: "outline",
10378
- name: "Outline",
10379
- enabled: true,
10380
- priority: 3,
10381
- background: { type: "transparent" },
10382
- textColorToken: "primary",
10383
- borderRadius: "rounded-md",
10384
- border: { widthClass: "border", colorToken: "primary" },
10385
- effects: {
10386
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10387
- }
10388
- },
10389
- {
10390
- id: "ghost",
10391
- name: "Ghost",
10392
- enabled: true,
10393
- priority: 3,
10394
- background: { type: "transparent" },
10395
- textColorToken: "primary",
10396
- borderRadius: "rounded-md",
10397
- effects: {
10398
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10399
- }
10400
- }
10401
- ]
10402
- }
10510
+ var gradientConfigSchema = z16.object({
10511
+ type: z16.enum(["linear", "radial"]),
10512
+ angle: z16.number().min(0).max(360).optional(),
10513
+ // For linear gradients (degrees)
10514
+ position: z16.string().optional(),
10515
+ // For radial gradients ('center', 'top left', etc.)
10516
+ stops: z16.array(gradientStopSchema).min(2)
10403
10517
  });
10404
10518
 
10405
- // ../theme-core/src/buttons/personalities/editorial-link.ts
10406
- var editorialLink = defineButtonPersonality({
10407
- id: "editorial-link",
10408
- name: "Editorial Link",
10409
- description: "Link-style with a growing underline. Refined, typographic.",
10410
- tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
10411
- buttonSystem: {
10412
- global: {
10413
- cornerStyle: "square",
10414
- shadow: "none",
10415
- textTransform: "none",
10416
- fontWeight: 500,
10417
- borderWidth: 1,
10418
- hoverTransform: "none",
10419
- hoverColor: "none"
10420
- },
10421
- variants: [
10422
- {
10423
- id: "primary",
10424
- name: "Primary",
10425
- enabled: true,
10426
- priority: 1,
10427
- background: { type: "transparent" },
10428
- textColorToken: "text",
10429
- borderRadius: "rounded-none",
10430
- shadow: { elevation: "none", softness: null, position: "bottom" },
10431
- sizes: {
10432
- sm: { padding: "0.25rem 0" },
10433
- md: { padding: "0.5rem 0" },
10434
- lg: { padding: "0.625rem 0" },
10435
- xl: { padding: "0.75rem 0" }
10436
- },
10437
- effects: {
10438
- base: [
10439
- { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
10440
- ]
10441
- }
10442
- },
10443
- {
10444
- id: "secondary",
10445
- name: "Secondary",
10446
- enabled: true,
10447
- priority: 2,
10448
- background: { type: "transparent" },
10449
- textColorToken: "mutedText",
10450
- borderRadius: "rounded-none",
10451
- shadow: { elevation: "none", softness: null, position: "bottom" },
10452
- sizes: {
10453
- sm: { padding: "0.25rem 0" },
10454
- md: { padding: "0.5rem 0" },
10455
- lg: { padding: "0.625rem 0" },
10456
- xl: { padding: "0.75rem 0" }
10457
- },
10458
- effects: {
10459
- base: [
10460
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
10461
- ]
10462
- }
10463
- },
10464
- {
10465
- id: "outline",
10466
- name: "Outline",
10467
- enabled: true,
10468
- priority: 3,
10469
- background: { type: "transparent" },
10470
- textColorToken: "accent",
10471
- borderRadius: "rounded-none",
10472
- shadow: { elevation: "none", softness: null, position: "bottom" },
10473
- sizes: {
10474
- sm: { padding: "0.25rem 0" },
10475
- md: { padding: "0.5rem 0" },
10476
- lg: { padding: "0.625rem 0" },
10477
- xl: { padding: "0.75rem 0" }
10478
- },
10479
- effects: {
10480
- base: [
10481
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
10482
- ]
10483
- }
10484
- },
10485
- {
10486
- id: "ghost",
10487
- name: "Ghost",
10488
- enabled: true,
10489
- priority: 3,
10490
- background: { type: "transparent" },
10491
- textColorToken: "mutedText",
10492
- borderRadius: "rounded-none",
10493
- shadow: { elevation: "none", softness: null, position: "bottom" },
10494
- sizes: {
10495
- sm: { padding: "0.25rem 0" },
10496
- md: { padding: "0.5rem 0" },
10497
- lg: { padding: "0.625rem 0" },
10498
- xl: { padding: "0.75rem 0" }
10499
- },
10500
- effects: {
10501
- hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
10502
- }
10503
- }
10504
- ]
10505
- }
10519
+ // ../theme-core/src/navigation/types.ts
10520
+ import { z as z18 } from "zod";
10521
+
10522
+ // ../theme-core/src/interactive/baseSchema.ts
10523
+ import { z as z17 } from "zod";
10524
+ var interactiveTypographySchema = z17.object({
10525
+ /** Font family source */
10526
+ typography: z17.enum(["body", "heading"]).default("body"),
10527
+ /** Font weight */
10528
+ fontWeight: z17.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
10529
+ /** Text transform */
10530
+ textTransform: z17.enum(["none", "uppercase", "capitalize"]).default("none"),
10531
+ /** Italic style */
10532
+ italic: z17.boolean().default(false)
10533
+ });
10534
+ var effectApplicationSchema2 = z17.object({
10535
+ /** Effect preset ID */
10536
+ effectId: z17.string(),
10537
+ /** User-provided customization options */
10538
+ options: z17.record(z17.string(), z17.any()).optional()
10539
+ });
10540
+ var effectCompositionSchema = z17.object({
10541
+ /** Effects always applied */
10542
+ base: z17.array(effectApplicationSchema2).optional(),
10543
+ /** Effects applied on hover */
10544
+ hover: z17.array(effectApplicationSchema2).optional(),
10545
+ /** Effects applied on active/pressed */
10546
+ active: z17.array(effectApplicationSchema2).optional(),
10547
+ /** Effects applied on focus */
10548
+ focus: z17.array(effectApplicationSchema2).optional()
10506
10549
  });
10507
10550
 
10508
- // ../theme-core/src/buttons/personalities/ink-stamp.ts
10509
- var inkStamp = defineButtonPersonality({
10510
- id: "ink-stamp",
10511
- name: "Ink Stamp",
10512
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
10513
- tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
10514
- buttonSystem: {
10515
- global: {
10516
- cornerStyle: "rounded",
10517
- shadow: "none",
10518
- textTransform: "uppercase",
10519
- fontWeight: 600,
10520
- borderWidth: 1,
10521
- hoverTransform: "none",
10522
- hoverColor: "none",
10523
- letterSpacing: "loose"
10524
- },
10525
- sizes: {
10526
- sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
10527
- md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
10528
- lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
10529
- xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
10530
- },
10531
- variants: [
10532
- {
10533
- id: "primary",
10534
- name: "Primary",
10535
- enabled: true,
10536
- priority: 1,
10537
- background: { type: "solid", colorToken: "primary" },
10538
- textColorToken: "primaryForeground",
10539
- borderRadius: "rounded-md",
10540
- effects: {
10541
- hover: [
10542
- { effectId: "drop-shadow", options: { intensity: "medium" } },
10543
- { effectId: "scale-up", options: { scale: "1.02" } }
10544
- ],
10545
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10546
- }
10547
- },
10548
- {
10549
- id: "secondary",
10550
- name: "Secondary",
10551
- enabled: true,
10552
- priority: 2,
10553
- background: { type: "transparent" },
10554
- textColorToken: "primary",
10555
- borderRadius: "rounded-md",
10556
- border: { widthClass: "border-2", colorToken: "primary" },
10557
- effects: {
10558
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10559
- }
10560
- },
10561
- {
10562
- id: "outline",
10563
- name: "Outline",
10564
- enabled: true,
10565
- priority: 3,
10566
- background: { type: "transparent" },
10567
- textColorToken: "text",
10568
- borderRadius: "rounded-md",
10569
- border: { widthClass: "border-2", colorToken: "border" },
10570
- effects: {
10571
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10572
- }
10573
- },
10574
- {
10575
- id: "ghost",
10576
- name: "Ghost",
10577
- enabled: true,
10578
- priority: 3,
10579
- background: { type: "transparent" },
10580
- textColorToken: "accent",
10581
- borderRadius: "rounded-none",
10582
- sizes: {
10583
- sm: { padding: "0.375rem 0", fontSize: "text-xs" },
10584
- md: { padding: "0.5rem 0", fontSize: "text-sm" },
10585
- lg: { padding: "0.625rem 0", fontSize: "text-base" },
10586
- xl: { padding: "0.75rem 0", fontSize: "text-lg" }
10587
- },
10588
- effects: {
10589
- base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
10590
- }
10591
- }
10592
- ]
10593
- }
10594
- });
10595
-
10596
- // ../theme-core/src/buttons/personalities/pebble.ts
10597
- var pebble = defineButtonPersonality({
10598
- id: "pebble",
10599
- name: "Pebble",
10600
- description: "Generous pill buttons with a soft hover lift.",
10601
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
10602
- buttonSystem: {
10603
- global: {
10604
- cornerStyle: "pill",
10605
- shadow: "none",
10606
- textTransform: "none",
10607
- fontWeight: 500,
10608
- borderWidth: 2,
10609
- hoverTransform: "none",
10610
- hoverColor: "none"
10611
- },
10612
- sizes: {
10613
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
10614
- md: { padding: "0.875rem 2.25rem" },
10615
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
10616
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
10617
- },
10618
- variants: [
10619
- {
10620
- id: "primary",
10621
- name: "Primary",
10622
- enabled: true,
10623
- priority: 1,
10624
- background: { type: "solid", colorToken: "primary" },
10625
- textColorToken: "primaryForeground",
10626
- borderRadius: "rounded-full",
10627
- effects: {
10628
- hover: [
10629
- { effectId: "scale-up", options: { scale: "1.03" } },
10630
- { effectId: "drop-shadow", options: { intensity: "medium" } }
10631
- ]
10632
- }
10633
- },
10634
- {
10635
- id: "secondary",
10636
- name: "Secondary",
10637
- enabled: true,
10638
- priority: 2,
10639
- background: { type: "transparent" },
10640
- textColorToken: "primary",
10641
- borderRadius: "rounded-full",
10642
- border: { widthClass: "border-2", colorToken: "accent" },
10643
- effects: {
10644
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
10645
- }
10646
- },
10647
- {
10648
- id: "outline",
10649
- name: "Outline",
10650
- enabled: true,
10651
- priority: 3,
10652
- background: { type: "transparent" },
10653
- textColorToken: "text",
10654
- borderRadius: "rounded-full",
10655
- border: { widthClass: "border", colorToken: "border" },
10656
- effects: {
10657
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10658
- }
10659
- },
10660
- {
10661
- id: "ghost",
10662
- name: "Ghost",
10663
- enabled: true,
10664
- priority: 3,
10665
- background: { type: "transparent" },
10666
- textColorToken: "primary",
10667
- borderRadius: "rounded-full",
10668
- sizes: {
10669
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
10670
- md: { padding: "0.5rem 1rem" },
10671
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
10672
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
10673
- },
10674
- effects: {
10675
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
10676
- }
10677
- }
10678
- ]
10679
- }
10680
- });
10681
-
10682
- // ../theme-core/src/buttons/personalities/soft-pill.ts
10683
- var softPill = defineButtonPersonality({
10684
- id: "soft-pill",
10685
- name: "Soft Pill",
10686
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10687
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
10688
- buttonSystem: {
10689
- global: {
10690
- cornerStyle: "pill",
10691
- shadow: "low",
10692
- textTransform: "none",
10693
- fontWeight: 500,
10694
- borderWidth: 2,
10695
- hoverTransform: "lift",
10696
- hoverColor: "none"
10697
- },
10698
- variants: [
10699
- {
10700
- id: "primary",
10701
- name: "Primary",
10702
- enabled: true,
10703
- priority: 1,
10704
- background: { type: "solid", colorToken: "primary" },
10705
- textColorToken: "primaryForeground",
10706
- borderRadius: "rounded-full",
10707
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
10708
- effects: {
10709
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
10710
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10711
- }
10712
- },
10713
- {
10714
- id: "secondary",
10715
- name: "Secondary",
10716
- enabled: true,
10717
- priority: 2,
10718
- background: { type: "transparent" },
10719
- textColorToken: "primary",
10720
- borderRadius: "rounded-full",
10721
- border: { widthClass: "border-2", colorToken: "primary" },
10722
- effects: {
10723
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10724
- }
10725
- },
10726
- {
10727
- id: "outline",
10728
- name: "Outline",
10729
- enabled: true,
10730
- priority: 3,
10731
- background: { type: "transparent" },
10732
- textColorToken: "text",
10733
- borderRadius: "rounded-full",
10734
- border: { widthClass: "border", colorToken: "border" },
10735
- effects: {
10736
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10737
- }
10738
- },
10739
- {
10740
- id: "ghost",
10741
- name: "Ghost",
10742
- enabled: true,
10743
- priority: 3,
10744
- background: { type: "transparent" },
10745
- textColorToken: "text",
10746
- borderRadius: "rounded-full",
10747
- effects: {
10748
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
10749
- }
10750
- }
10751
- ]
10752
- }
10753
- });
10754
-
10755
- // ../theme-core/src/buttons/personalities/index.ts
10756
- var buttonPersonalities = [
10757
- softPill,
10758
- confidentChip,
10759
- editorialLink,
10760
- pebble,
10761
- inkStamp,
10762
- brushedWash
10763
- ];
10764
- var personalitiesById = new Map(
10765
- buttonPersonalities.map((p) => [p.id, p])
10766
- );
10767
-
10768
- // ../theme-core/src/cards/types.ts
10769
- import { z as z16 } from "zod";
10770
- var cardSpacingSchema = z16.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
10771
- var gradientDirectionSchema2 = z16.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
10772
- var cardBackgroundSchema = z16.discriminatedUnion("type", [
10773
- z16.object({ type: z16.literal("solid"), colorToken: z16.string() }),
10774
- z16.object({
10775
- type: z16.literal("gradient"),
10776
- fromToken: z16.string(),
10777
- toToken: z16.string(),
10778
- direction: gradientDirectionSchema2
10779
- }),
10780
- z16.object({ type: z16.literal("transparent") })
10781
- ]);
10782
- var cardBorderSchema = z16.object({
10783
- widthClass: z16.string(),
10784
- colorToken: z16.string()
10785
- });
10786
- var cardVariantSchema = z16.object({
10787
- id: z16.string(),
10788
- name: z16.string().min(1).max(20),
10789
- enabled: z16.boolean(),
10790
- priority: z16.union([z16.literal(1), z16.literal(2), z16.literal(3)]),
10791
- // Appearance (token-based)
10792
- background: cardBackgroundSchema,
10793
- spacing: cardSpacingSchema,
10794
- // Optional overrides (uses theme defaults if not specified)
10795
- shadow: z16.object({
10796
- elevation: z16.enum(["none", "low", "medium", "high"]),
10797
- softness: z16.enum(["crisp", "soft", "hard"]).nullable(),
10798
- position: z16.enum(["bottom", "bottom-right"]).default("bottom")
10799
- }).optional(),
10800
- corners: z16.enum(["square", "soft", "rounded", "pill"]).optional(),
10801
- // Border (optional)
10802
- border: cardBorderSchema.optional()
10803
- });
10804
- var cardSystemSchema = z16.object({
10805
- variants: z16.array(cardVariantSchema).min(1).max(3)
10806
- });
10807
-
10808
- // ../theme-core/src/accordions/types.ts
10809
- import { z as z17 } from "zod";
10810
- var accordionIconSchema = z17.enum([
10811
- "plus-minus",
10812
- // + becomes - (swap or rotate 90°)
10813
- "chevron",
10814
- // › becomes ⌄ (rotate 90° or 180°)
10815
- "caret",
10816
- // ▸ becomes ▾ (rotate 90° or 180°)
10817
- "arrow",
10818
- // → becomes ↓ (rotate 90° or 180°)
10819
- "circle-plus-minus"
10820
- // ⊕ becomes ⊖ (swap with fade)
10821
- ]);
10822
- var accordionSystemSchema = z17.object({
10823
- // Visual styling (solid color only - gradients can be added later if needed)
10824
- background: z17.object({
10825
- type: z17.literal("solid"),
10826
- colorToken: z17.string()
10827
- }),
10828
- // Spacing (padding inside items)
10829
- spacing: z17.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
10830
- // Border radius (null = inherit from theme.corners)
10831
- corners: z17.enum(["square", "soft", "rounded", "pill"]).nullable(),
10832
- // Border styling (null = inherit from theme.border)
10833
- border: z17.object({
10834
- widthClass: z17.string(),
10835
- // e.g., 'border', 'border-2', 'border-0'
10836
- colorToken: z17.string()
10837
- }).nullable(),
10838
- // Shadow (null = inherit from theme.shadow)
10839
- shadow: z17.object({
10840
- elevation: z17.enum(["none", "low", "medium", "high"]),
10841
- softness: z17.enum(["soft", "crisp", "hard"]).nullable(),
10842
- position: z17.enum(["bottom", "bottom-right"])
10843
- }).nullable(),
10844
- // Icon style and animation
10845
- icon: z17.object({
10846
- style: accordionIconSchema,
10847
- position: z17.enum(["left", "right"]),
10848
- size: z17.enum(["sm", "md", "lg"])
10849
- }),
10850
- // Trigger (question) styling
10851
- trigger: z17.object({
10852
- textColorToken: z17.string(),
10853
- fontWeight: z17.enum(["regular", "medium", "semibold", "bold"]).nullable()
10854
- // null = inherit from theme
10855
- }),
10856
- // Hover state styling
10857
- hover: z17.object({
10858
- backgroundColorToken: z17.string().optional(),
10859
- textColorToken: z17.string().optional(),
10860
- borderColorToken: z17.string().optional()
10861
- }),
10862
- // Content (answer) styling
10863
- content: z17.object({
10864
- textColorToken: z17.string()
10865
- })
10866
- });
10867
-
10868
- // ../theme-core/src/inputs/types.ts
10869
- import { z as z18 } from "zod";
10870
- var inputSystemSchema = z18.object({
10871
- // Base styling (applied to all inputs)
10872
- base: z18.object({
10873
- background: z18.union([
10874
- z18.object({
10875
- type: z18.literal("solid"),
10876
- colorToken: z18.string()
10877
- }),
10878
- z18.object({
10879
- type: z18.literal("transparent")
10880
- })
10881
- ]),
10882
- textColorToken: z18.string(),
10883
- border: z18.object({
10884
- widthClass: z18.string(),
10885
- // e.g., 'border', 'border-2'
10886
- colorToken: z18.string(),
10887
- style: z18.enum(["all", "underline"]).optional()
10888
- }),
10889
- corners: z18.enum(["square", "soft", "rounded", "pill"]).nullable(),
10890
- // null = inherit from theme.corners
10891
- shadow: z18.object({
10892
- elevation: z18.enum(["none", "low", "medium"]),
10893
- softness: z18.enum(["soft", "crisp", "hard"]).nullable()
10894
- }).nullable(),
10895
- spacing: z18.enum(["compact", "cozy", "medium", "comfortable"]),
10896
- // padding inside inputs
10897
- fontSize: z18.enum(["sm", "base", "lg"])
10898
- }),
10899
- // Label styling
10900
- label: z18.object({
10901
- textColorToken: z18.string(),
10902
- fontWeight: z18.enum(["regular", "medium", "semibold", "bold", "black"]),
10903
- fontSize: z18.enum(["2xs", "xs", "sm", "base"]),
10904
- textTransform: z18.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
10905
- letterSpacing: z18.enum(["normal", "wide", "wider", "widest"]).optional(),
10906
- opacity: z18.number().min(0.2).max(1).optional()
10907
- }),
10908
- // Focus state
10909
- focus: z18.object({
10910
- ringColorToken: z18.string(),
10911
- ringWidth: z18.enum(["0", "1", "2", "3"]),
10912
- borderColorToken: z18.string().optional()
10913
- // Change border color on focus
10914
- }),
10915
- // Error state (for validation feedback)
10916
- error: z18.object({
10917
- borderColorToken: z18.string(),
10918
- textColorToken: z18.string()
10919
- }),
10920
- // Disabled state
10921
- disabled: z18.object({
10922
- backgroundColorToken: z18.string(),
10923
- textColorToken: z18.string(),
10924
- opacity: z18.number().min(0.3).max(0.7)
10925
- })
10926
- });
10927
-
10928
- // ../theme-core/src/gradients/types.ts
10929
- import { z as z19 } from "zod";
10930
- var gradientStopSchema = z19.object({
10931
- color: z19.string(),
10932
- // Theme color token name (e.g., 'primary-500')
10933
- position: z19.number().min(0).max(100)
10934
- // Percentage 0-100
10935
- });
10936
- var gradientConfigSchema = z19.object({
10937
- type: z19.enum(["linear", "radial"]),
10938
- angle: z19.number().min(0).max(360).optional(),
10939
- // For linear gradients (degrees)
10940
- position: z19.string().optional(),
10941
- // For radial gradients ('center', 'top left', etc.)
10942
- stops: z19.array(gradientStopSchema).min(2)
10943
- });
10944
-
10945
- // ../theme-core/src/navigation/types.ts
10946
- import { z as z21 } from "zod";
10947
-
10948
- // ../theme-core/src/interactive/baseSchema.ts
10949
- import { z as z20 } from "zod";
10950
- var interactiveTypographySchema = z20.object({
10951
- /** Font family source */
10952
- typography: z20.enum(["body", "heading"]).default("body"),
10953
- /** Font weight */
10954
- fontWeight: z20.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
10955
- /** Text transform */
10956
- textTransform: z20.enum(["none", "uppercase", "capitalize"]).default("none"),
10957
- /** Italic style */
10958
- italic: z20.boolean().default(false)
10959
- });
10960
- var effectApplicationSchema2 = z20.object({
10961
- /** Effect preset ID */
10962
- effectId: z20.string(),
10963
- /** User-provided customization options */
10964
- options: z20.record(z20.string(), z20.any()).optional()
10965
- });
10966
- var effectCompositionSchema = z20.object({
10967
- /** Effects always applied */
10968
- base: z20.array(effectApplicationSchema2).optional(),
10969
- /** Effects applied on hover */
10970
- hover: z20.array(effectApplicationSchema2).optional(),
10971
- /** Effects applied on active/pressed */
10972
- active: z20.array(effectApplicationSchema2).optional(),
10973
- /** Effects applied on focus */
10974
- focus: z20.array(effectApplicationSchema2).optional()
10975
- });
10976
-
10977
- // ../theme-core/src/navigation/types.ts
10978
- var navLinkPaddingSchema = z21.enum(["none", "compact", "default"]);
10979
- var navLinkPaddingXSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10980
- var navLinkBorderRadiusSchema = z21.enum(["none", "sm", "md", "full"]);
10981
- var navLinkTextSizeSchema = z21.enum(["xs", "sm", "base", "lg"]);
10982
- var navLinkLetterSpacingSchema = z21.enum(["normal", "wide", "wider", "widest"]);
10983
- var navLinkStyleSchema = z21.object({
10984
- /** Display name for the style */
10985
- name: z21.string().min(1).max(30).optional(),
10986
- /** Typography settings (inherited from interactive base) */
10987
- ...interactiveTypographySchema.shape,
10988
- /** Text color token */
10989
- colorToken: z21.string().default("text"),
10990
- /** Optional text size override */
10991
- textSize: navLinkTextSizeSchema.optional(),
10992
- /** Optional letter spacing override */
10993
- letterSpacing: navLinkLetterSpacingSchema.optional(),
10994
- /** Hover/active color token (for color-change effects) */
10995
- hoverColorToken: z21.string().nullable().optional(),
10996
- /** Padding preset */
10997
- padding: navLinkPaddingSchema.default("compact"),
10998
- /** Horizontal padding override (overrides horizontal component of padding preset) */
10999
- paddingX: navLinkPaddingXSchema.optional(),
11000
- /** Border radius (for capsule/pill styles) */
11001
- borderRadius: navLinkBorderRadiusSchema.default("none"),
11002
- /** Composable effects */
11003
- effects: effectCompositionSchema.optional()
10551
+ // ../theme-core/src/navigation/types.ts
10552
+ var navLinkPaddingSchema = z18.enum(["none", "compact", "default"]);
10553
+ var navLinkPaddingXSchema = z18.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
10554
+ var navLinkBorderRadiusSchema = z18.enum(["none", "sm", "md", "full"]);
10555
+ var navLinkTextSizeSchema = z18.enum(["xs", "sm", "base", "lg"]);
10556
+ var navLinkLetterSpacingSchema = z18.enum(["normal", "wide", "wider", "widest"]);
10557
+ var navLinkStyleSchema = z18.object({
10558
+ /** Display name for the style */
10559
+ name: z18.string().min(1).max(30).optional(),
10560
+ /** Typography settings (inherited from interactive base) */
10561
+ ...interactiveTypographySchema.shape,
10562
+ /** Text color token */
10563
+ colorToken: z18.string().default("text"),
10564
+ /** Optional text size override */
10565
+ textSize: navLinkTextSizeSchema.optional(),
10566
+ /** Optional letter spacing override */
10567
+ letterSpacing: navLinkLetterSpacingSchema.optional(),
10568
+ /** Hover/active color token (for color-change effects) */
10569
+ hoverColorToken: z18.string().nullable().optional(),
10570
+ /** Padding preset */
10571
+ padding: navLinkPaddingSchema.default("compact"),
10572
+ /** Horizontal padding override (overrides horizontal component of padding preset) */
10573
+ paddingX: navLinkPaddingXSchema.optional(),
10574
+ /** Border radius (for capsule/pill styles) */
10575
+ borderRadius: navLinkBorderRadiusSchema.default("none"),
10576
+ /** Composable effects */
10577
+ effects: effectCompositionSchema.optional()
11004
10578
  });
11005
10579
 
11006
10580
  // ../theme-core/src/customCss/validation.ts
11007
- import { z as z22 } from "zod";
10581
+ import { z as z19 } from "zod";
11008
10582
  var FORBIDDEN_SELECTORS = [":root", "html", "body"];
11009
10583
  var UNIVERSAL_SELECTOR = "*";
11010
10584
  var REMOTE_URL_PATTERN = /url\s*\(\s*['"]?(https?:|\/\/)/i;
@@ -11046,7 +10620,7 @@ function containsForbiddenSelector(selector) {
11046
10620
  }
11047
10621
  return false;
11048
10622
  }
11049
- var selectorSchema = z22.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
10623
+ var selectorSchema = z19.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
11050
10624
  (s) => !containsForbiddenSelector(s),
11051
10625
  { message: "Global selectors (:root, html, body, *) are not allowed" }
11052
10626
  );
@@ -11056,38 +10630,38 @@ function containsRemoteUrl(value) {
11056
10630
  function containsJavascriptUrl(value) {
11057
10631
  return JAVASCRIPT_URL_PATTERN.test(value);
11058
10632
  }
11059
- var declarationValueSchema = z22.string().max(500, "Declaration value too long (max 500 characters)").refine(
10633
+ var declarationValueSchema = z19.string().max(500, "Declaration value too long (max 500 characters)").refine(
11060
10634
  (v) => !containsRemoteUrl(v),
11061
10635
  { message: "Remote url() references are not allowed. Use local paths, data URIs, or fragment IDs." }
11062
10636
  ).refine(
11063
10637
  (v) => !containsJavascriptUrl(v),
11064
10638
  { message: "javascript: URLs are not allowed" }
11065
10639
  );
11066
- var declarationsSchema = z22.record(
11067
- z22.string().min(1).max(100),
10640
+ var declarationsSchema = z19.record(
10641
+ z19.string().min(1).max(100),
11068
10642
  // property name
11069
10643
  declarationValueSchema
11070
10644
  // property value
11071
10645
  );
11072
- var customCssRuleSchema = z22.object({
11073
- id: z22.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
10646
+ var customCssRuleSchema = z19.object({
10647
+ id: z19.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
11074
10648
  selector: selectorSchema,
11075
10649
  declarations: declarationsSchema
11076
10650
  });
11077
10651
  var blockCustomCssRuleSchema = customCssRuleSchema.extend({
11078
- blockKind: z22.string().min(1, "Block kind is required").max(50, "Block kind too long")
10652
+ blockKind: z19.string().min(1, "Block kind is required").max(50, "Block kind too long")
11079
10653
  });
11080
- var customCssRulesSchema = z22.array(customCssRuleSchema).optional();
11081
- var blockCustomCssRulesSchema = z22.array(blockCustomCssRuleSchema).optional();
10654
+ var customCssRulesSchema = z19.array(customCssRuleSchema).optional();
10655
+ var blockCustomCssRulesSchema = z19.array(blockCustomCssRuleSchema).optional();
11082
10656
 
11083
10657
  // ../theme-core/src/customCss/atRuleValidation.ts
11084
- import { z as z23 } from "zod";
10658
+ import { z as z20 } from "zod";
11085
10659
  var KEYFRAME_OFFSET_PATTERN = /^(from|to|\d{1,3}%)$/i;
11086
10660
  var ANIMATION_NAME_PATTERN = /^[a-zA-Z_-][a-zA-Z0-9_-]*$/;
11087
10661
  var BLOCKED_AT_RULES = ["@import", "@charset"];
11088
10662
  var BLOCKED_AT_RULE_PATTERN = /@(?:import|charset)\b/i;
11089
- var ruleIdSchema = z23.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
11090
- var nestedRuleSchema = z23.object({
10663
+ var ruleIdSchema = z20.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
10664
+ var nestedRuleSchema = z20.object({
11091
10665
  selector: selectorSchema,
11092
10666
  declarations: declarationsSchema
11093
10667
  });
@@ -11099,146 +10673,146 @@ function isValidKeyframeOffset(offset) {
11099
10673
  const value = parseInt(match[1], 10);
11100
10674
  return value >= 0 && value <= 100;
11101
10675
  }
11102
- var keyframeOffsetSchema = z23.string().transform((offset) => offset.trim()).refine(
10676
+ var keyframeOffsetSchema = z20.string().transform((offset) => offset.trim()).refine(
11103
10677
  (offset) => KEYFRAME_OFFSET_PATTERN.test(offset),
11104
10678
  { message: 'Invalid keyframe offset. Use percentages (0%, 50%, 100%) or "from"/"to"' }
11105
10679
  ).refine(
11106
10680
  isValidKeyframeOffset,
11107
10681
  { message: "Keyframe offset must be between 0% and 100%" }
11108
10682
  );
11109
- var animationNameSchema = z23.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
10683
+ var animationNameSchema = z20.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
11110
10684
  (name) => ANIMATION_NAME_PATTERN.test(name),
11111
10685
  { message: "Invalid animation name. Use letters, numbers, dashes, underscores (start with letter, dash, or underscore)" }
11112
10686
  );
11113
- var keyframeSchema = z23.object({
10687
+ var keyframeSchema = z20.object({
11114
10688
  offset: keyframeOffsetSchema,
11115
10689
  declarations: declarationsSchema
11116
10690
  });
11117
- var keyframesAtRuleSchema = z23.object({
10691
+ var keyframesAtRuleSchema = z20.object({
11118
10692
  id: ruleIdSchema,
11119
- type: z23.literal("keyframes"),
10693
+ type: z20.literal("keyframes"),
11120
10694
  name: animationNameSchema,
11121
- frames: z23.array(keyframeSchema).min(1, "At least one keyframe is required")
10695
+ frames: z20.array(keyframeSchema).min(1, "At least one keyframe is required")
11122
10696
  });
11123
- var fontFaceDeclarationsSchema = z23.record(z23.string().min(1).max(100), declarationValueSchema).refine(
10697
+ var fontFaceDeclarationsSchema = z20.record(z20.string().min(1).max(100), declarationValueSchema).refine(
11124
10698
  (decls) => "fontFamily" in decls || "font-family" in decls,
11125
10699
  { message: "font-family is required in @font-face" }
11126
10700
  );
11127
- var fontFaceAtRuleSchema = z23.object({
10701
+ var fontFaceAtRuleSchema = z20.object({
11128
10702
  id: ruleIdSchema,
11129
- type: z23.literal("font-face"),
10703
+ type: z20.literal("font-face"),
11130
10704
  declarations: fontFaceDeclarationsSchema
11131
10705
  });
11132
- var mediaQuerySchema = z23.string().min(1, "Media query is required").max(200, "Media query too long");
11133
- var mediaAtRuleSchema = z23.object({
10706
+ var mediaQuerySchema = z20.string().min(1, "Media query is required").max(200, "Media query too long");
10707
+ var mediaAtRuleSchema = z20.object({
11134
10708
  id: ruleIdSchema,
11135
- type: z23.literal("media"),
10709
+ type: z20.literal("media"),
11136
10710
  query: mediaQuerySchema,
11137
- rules: z23.array(nestedRuleSchema).min(1, "At least one rule is required")
10711
+ rules: z20.array(nestedRuleSchema).min(1, "At least one rule is required")
11138
10712
  });
11139
- var supportsConditionSchema = z23.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
11140
- var supportsAtRuleSchema = z23.object({
10713
+ var supportsConditionSchema = z20.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
10714
+ var supportsAtRuleSchema = z20.object({
11141
10715
  id: ruleIdSchema,
11142
- type: z23.literal("supports"),
10716
+ type: z20.literal("supports"),
11143
10717
  condition: supportsConditionSchema,
11144
- rules: z23.array(nestedRuleSchema).min(1, "At least one rule is required")
10718
+ rules: z20.array(nestedRuleSchema).min(1, "At least one rule is required")
11145
10719
  });
11146
10720
  function containsBlockedAtRule(css) {
11147
10721
  return BLOCKED_AT_RULE_PATTERN.test(css);
11148
10722
  }
11149
- var rawCssSchema = z23.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
10723
+ var rawCssSchema = z20.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
11150
10724
  (css) => css.trim().startsWith("@"),
11151
10725
  { message: "Raw at-rule must start with @" }
11152
10726
  ).refine(
11153
10727
  (css) => !containsBlockedAtRule(css),
11154
10728
  { message: `Blocked at-rules: ${BLOCKED_AT_RULES.join(", ")}. Use typed at-rules or local assets instead.` }
11155
10729
  );
11156
- var rawAtRuleSchema = z23.object({
10730
+ var rawAtRuleSchema = z20.object({
11157
10731
  id: ruleIdSchema,
11158
- type: z23.literal("raw"),
10732
+ type: z20.literal("raw"),
11159
10733
  css: rawCssSchema
11160
10734
  });
11161
- var customCssAtRuleSchema = z23.discriminatedUnion("type", [
10735
+ var customCssAtRuleSchema = z20.discriminatedUnion("type", [
11162
10736
  keyframesAtRuleSchema,
11163
10737
  fontFaceAtRuleSchema,
11164
10738
  mediaAtRuleSchema,
11165
10739
  supportsAtRuleSchema,
11166
10740
  rawAtRuleSchema
11167
10741
  ]);
11168
- var customCssAtRulesSchema = z23.array(customCssAtRuleSchema).optional();
10742
+ var customCssAtRulesSchema = z20.array(customCssAtRuleSchema).optional();
11169
10743
 
11170
10744
  // ../theme-core/src/shared/componentStyles.ts
11171
- import { z as z24 } from "zod";
11172
- var componentBorderSchema = z24.object({
11173
- width: z24.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
11174
- style: z24.enum(["solid", "dashed"]).default("solid"),
11175
- colorToken: z24.string().optional()
10745
+ import { z as z21 } from "zod";
10746
+ var componentBorderSchema = z21.object({
10747
+ width: z21.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
10748
+ style: z21.enum(["solid", "dashed"]).default("solid"),
10749
+ colorToken: z21.string().optional()
11176
10750
  // defaults to "border" if not set
11177
10751
  });
11178
- var componentShadowSchema = z24.object({
11179
- elevation: z24.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
10752
+ var componentShadowSchema = z21.object({
10753
+ elevation: z21.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
11180
10754
  });
11181
10755
 
11182
10756
  // ../theme-core/src/schema.ts
11183
- var axesSchema = z25.object({
11184
- tone: z25.enum(["minimal", "classic", "bold"]),
11185
- energy: z25.enum(["calm", "vibrant"]),
11186
- density: z25.enum(["airy", "regular", "compact"]),
11187
- mediaBias: z25.enum(["text", "media", "mixed"]),
11188
- conversionBias: z25.enum(["low", "med", "high"]),
11189
- motion: z25.enum(["subtle", "standard", "expressive"])
11190
- });
11191
- var colourHexString = z25.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
11192
- var paletteColorSchema = z25.object({
11193
- name: z25.string().min(1),
10757
+ var axesSchema = z22.object({
10758
+ tone: z22.enum(["minimal", "classic", "bold"]),
10759
+ energy: z22.enum(["calm", "vibrant"]),
10760
+ density: z22.enum(["airy", "regular", "compact"]),
10761
+ mediaBias: z22.enum(["text", "media", "mixed"]),
10762
+ conversionBias: z22.enum(["low", "med", "high"]),
10763
+ motion: z22.enum(["subtle", "standard", "expressive"])
10764
+ });
10765
+ var colourHexString = z22.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
10766
+ var paletteColorSchema = z22.object({
10767
+ name: z22.string().min(1),
11194
10768
  hex: colourHexString
11195
10769
  });
11196
- var paletteMetaSchema = z25.object({
11197
- mode: z25.enum(["light", "dark"])
10770
+ var paletteMetaSchema = z22.object({
10771
+ mode: z22.enum(["light", "dark"])
11198
10772
  });
11199
- var paletteSchema = z25.object({
11200
- colors: z25.array(paletteColorSchema),
10773
+ var paletteSchema = z22.object({
10774
+ colors: z22.array(paletteColorSchema),
11201
10775
  meta: paletteMetaSchema
11202
10776
  });
11203
- var typographyStyleSchema = z25.object({
11204
- family: z25.string().min(1),
11205
- weight: z25.enum(["light", "regular", "medium", "semibold", "bold"]),
11206
- letterSpacing: z25.enum(["tight", "normal", "loose"]),
11207
- lineHeight: z25.enum(["normal", "relaxed", "loose"])
10777
+ var typographyStyleSchema = z22.object({
10778
+ family: z22.string().min(1),
10779
+ weight: z22.enum(["light", "regular", "medium", "semibold", "bold"]),
10780
+ letterSpacing: z22.enum(["tight", "normal", "loose"]),
10781
+ lineHeight: z22.enum(["normal", "relaxed", "loose"])
11208
10782
  });
11209
10783
  var bodyTypographyStyleSchema = typographyStyleSchema.extend({
11210
- size: z25.enum(["md", "lg", "xl"])
10784
+ size: z22.enum(["md", "lg", "xl"])
11211
10785
  });
11212
- var headingSizeSchema = z25.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
11213
- var headingTypographyOverridesSchema = z25.object({
11214
- weight: z25.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
11215
- letterSpacing: z25.enum(["tight", "normal", "loose"]).nullable().optional(),
10786
+ var headingSizeSchema = z22.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
10787
+ var headingTypographyOverridesSchema = z22.object({
10788
+ weight: z22.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
10789
+ letterSpacing: z22.enum(["tight", "normal", "loose"]).nullable().optional(),
11216
10790
  size: headingSizeSchema.nullable().optional(),
11217
- lineHeight: z25.enum(["normal", "relaxed", "loose"]).nullable().optional(),
11218
- italic: z25.boolean().nullable().optional(),
11219
- colorToken: z25.string().min(1).nullable().optional()
10791
+ lineHeight: z22.enum(["normal", "relaxed", "loose"]).nullable().optional(),
10792
+ italic: z22.boolean().nullable().optional(),
10793
+ colorToken: z22.string().min(1).nullable().optional()
11220
10794
  // Palette token name for heading color
11221
10795
  });
11222
10796
  var headingTypographyStyleSchema = typographyStyleSchema.extend({
11223
- case: z25.enum(["uppercase", "normal", "smallCaps"]).nullable(),
11224
- italic: z25.boolean().nullable(),
11225
- colorToken: z25.string().min(1).nullable().optional()
10797
+ case: z22.enum(["uppercase", "normal", "smallCaps"]).nullable(),
10798
+ italic: z22.boolean().nullable(),
10799
+ colorToken: z22.string().min(1).nullable().optional()
11226
10800
  // Palette token name for heading color
11227
10801
  });
11228
- var proseLinkUnderlineStyleSchema = z25.enum(["solid", "dotted", "dashed"]);
11229
- var proseLinkUnderlineThicknessSchema = z25.enum(["auto", "fromFont", "thin", "medium", "thick"]);
11230
- var proseLinkUnderlineOffsetSchema = z25.enum(["auto", "tight", "normal", "loose"]);
11231
- var proseLinkStyleSchema = z25.object({
11232
- colorToken: z25.string().min(1).optional(),
11233
- hoverColorToken: z25.string().min(1).optional(),
11234
- underline: z25.boolean().optional(),
11235
- decorationColorToken: z25.string().min(1).optional(),
11236
- hoverDecorationColorToken: z25.string().min(1).optional(),
10802
+ var proseLinkUnderlineStyleSchema = z22.enum(["solid", "dotted", "dashed"]);
10803
+ var proseLinkUnderlineThicknessSchema = z22.enum(["auto", "fromFont", "thin", "medium", "thick"]);
10804
+ var proseLinkUnderlineOffsetSchema = z22.enum(["auto", "tight", "normal", "loose"]);
10805
+ var proseLinkStyleSchema = z22.object({
10806
+ colorToken: z22.string().min(1).optional(),
10807
+ hoverColorToken: z22.string().min(1).optional(),
10808
+ underline: z22.boolean().optional(),
10809
+ decorationColorToken: z22.string().min(1).optional(),
10810
+ hoverDecorationColorToken: z22.string().min(1).optional(),
11237
10811
  underlineStyle: proseLinkUnderlineStyleSchema.optional(),
11238
10812
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
11239
10813
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
11240
10814
  });
11241
- var semanticSpacingSchema = z25.enum([
10815
+ var semanticSpacingSchema = z22.enum([
11242
10816
  "none",
11243
10817
  "compact",
11244
10818
  "cozy",
@@ -11246,62 +10820,62 @@ var semanticSpacingSchema = z25.enum([
11246
10820
  "comfortable",
11247
10821
  "spacious"
11248
10822
  ]);
11249
- var boxRoundedSchema = z25.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
11250
- var boxBackgroundOverlaySchema = z25.object({
11251
- type: z25.enum(["none", "color", "gradient"]).nullable().optional(),
11252
- color: z25.string().nullable().optional(),
11253
- gradient: z25.string().nullable().optional(),
11254
- opacity: z25.number().min(0).max(1).nullable().optional()
11255
- });
11256
- var boxBackgroundSchema = z25.object({
11257
- type: z25.enum(["color", "gradient", "image"]).optional(),
11258
- color: z25.string().nullable().optional(),
11259
- gradient: z25.string().nullable().optional(),
10823
+ var boxRoundedSchema = z22.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
10824
+ var boxBackgroundOverlaySchema = z22.object({
10825
+ type: z22.enum(["none", "color", "gradient"]).nullable().optional(),
10826
+ color: z22.string().nullable().optional(),
10827
+ gradient: z22.string().nullable().optional(),
10828
+ opacity: z22.number().min(0).max(1).nullable().optional()
10829
+ });
10830
+ var boxBackgroundSchema = z22.object({
10831
+ type: z22.enum(["color", "gradient", "image"]).optional(),
10832
+ color: z22.string().nullable().optional(),
10833
+ gradient: z22.string().nullable().optional(),
11260
10834
  image: mediaSchema.nullable().optional(),
11261
- objectFit: z25.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
11262
- scale: z25.string().nullable().optional(),
11263
- position: z25.string().nullable().optional(),
11264
- opacity: z25.number().min(0).max(1).nullable().optional(),
10835
+ objectFit: z22.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
10836
+ scale: z22.string().nullable().optional(),
10837
+ position: z22.string().nullable().optional(),
10838
+ opacity: z22.number().min(0).max(1).nullable().optional(),
11265
10839
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
11266
- textColor: z25.string().nullable().optional(),
11267
- headingColor: z25.string().nullable().optional()
10840
+ textColor: z22.string().nullable().optional(),
10841
+ headingColor: z22.string().nullable().optional()
11268
10842
  });
11269
- var sectionStylesOverrideSchema = z25.object({
10843
+ var sectionStylesOverrideSchema = z22.object({
11270
10844
  background: boxBackgroundSchema.nullable().optional(),
11271
10845
  spacing: semanticSpacingSchema.nullable().optional(),
11272
- minHeight: z25.enum(["none", "hero", "immersive"]).nullable().optional()
10846
+ minHeight: z22.enum(["none", "hero", "immersive"]).nullable().optional()
11273
10847
  });
11274
- var containerStylesOverrideSchema = z25.object({
10848
+ var containerStylesOverrideSchema = z22.object({
11275
10849
  background: boxBackgroundSchema.nullable().optional(),
11276
10850
  spacing: semanticSpacingSchema.nullable().optional(),
11277
- raised: z25.boolean().nullable().optional(),
10851
+ raised: z22.boolean().nullable().optional(),
11278
10852
  rounded: boxRoundedSchema.nullable().optional(),
11279
- fullWidth: z25.boolean().nullable().optional()
10853
+ fullWidth: z22.boolean().nullable().optional()
11280
10854
  });
11281
- var cardBorderOverrideSchema = z25.object({
11282
- enabled: z25.boolean().nullable().optional(),
11283
- width: z25.enum(["none", "1", "2", "3"]).nullable().optional(),
11284
- colorToken: z25.string().nullable().optional()
10855
+ var cardBorderOverrideSchema = z22.object({
10856
+ enabled: z22.boolean().nullable().optional(),
10857
+ width: z22.enum(["none", "1", "2", "3"]).nullable().optional(),
10858
+ colorToken: z22.string().nullable().optional()
11285
10859
  });
11286
- var cardStylesOverrideSchema = z25.object({
10860
+ var cardStylesOverrideSchema = z22.object({
11287
10861
  background: boxBackgroundSchema.nullable().optional(),
11288
10862
  border: cardBorderOverrideSchema.nullable().optional(),
11289
10863
  spacing: semanticSpacingSchema.nullable().optional(),
11290
- raised: z25.boolean().nullable().optional(),
10864
+ raised: z22.boolean().nullable().optional(),
11291
10865
  rounded: boxRoundedSchema.nullable().optional()
11292
10866
  });
11293
- var blockStyleOverridesSchema = z25.object({
10867
+ var blockStyleOverridesSchema = z22.object({
11294
10868
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
11295
10869
  containerStyles: containerStylesOverrideSchema.nullable().optional(),
11296
10870
  cardStyles: cardStylesOverrideSchema.nullable().optional()
11297
10871
  });
11298
- var blockThemeOverrideSchema = z25.object({
11299
- typography: z25.object({
10872
+ var blockThemeOverrideSchema = z22.object({
10873
+ typography: z22.object({
11300
10874
  proseLinkStyle: proseLinkStyleSchema.optional()
11301
10875
  }).optional(),
11302
10876
  styles: blockStyleOverridesSchema.optional()
11303
10877
  });
11304
- var typographyScaleSchema = z25.enum([
10878
+ var typographyScaleSchema = z22.enum([
11305
10879
  // New intuitive names
11306
10880
  "compact",
11307
10881
  // ratio 1.2 (was minorThird)
@@ -11314,9 +10888,9 @@ var typographyScaleSchema = z25.enum([
11314
10888
  "majorThird",
11315
10889
  "perfectFourth"
11316
10890
  ]);
11317
- var typographySchema = z25.object({
10891
+ var typographySchema = z22.object({
11318
10892
  body: bodyTypographyStyleSchema,
11319
- headings: z25.object({
10893
+ headings: z22.object({
11320
10894
  default: headingTypographyStyleSchema,
11321
10895
  h1: headingTypographyOverridesSchema,
11322
10896
  h2: headingTypographyOverridesSchema,
@@ -11329,41 +10903,41 @@ var typographySchema = z25.object({
11329
10903
  scale: typographyScaleSchema,
11330
10904
  proseLinkStyle: proseLinkStyleSchema.optional()
11331
10905
  });
11332
- var spaceSchema = z25.enum(["comfortable", "standard", "dense"]);
11333
- var corners = z25.enum(["square", "soft", "rounded", "pill"]);
11334
- var shadow = z25.object({
11335
- elevation: z25.enum(["none", "low", "medium", "high"]),
11336
- softness: z25.enum(["crisp", "soft", "hard"]).nullable(),
11337
- position: z25.enum(["bottom", "bottom-right"]).default("bottom")
10906
+ var spaceSchema = z22.enum(["comfortable", "standard", "dense"]);
10907
+ var corners = z22.enum(["square", "soft", "rounded", "pill"]);
10908
+ var shadow = z22.object({
10909
+ elevation: z22.enum(["none", "low", "medium", "high"]),
10910
+ softness: z22.enum(["crisp", "soft", "hard"]).nullable(),
10911
+ position: z22.enum(["bottom", "bottom-right"]).default("bottom")
11338
10912
  });
11339
- var border = z25.object({
11340
- width: z25.enum(["none", "hairline", "thin", "thick"]),
11341
- style: z25.enum(["solid", "dashed"])
10913
+ var border = z22.object({
10914
+ width: z22.enum(["none", "hairline", "thin", "thick"]),
10915
+ style: z22.enum(["solid", "dashed"])
11342
10916
  });
11343
- var motion = z25.object({
11344
- level: z25.enum(["off", "low", "medium", "high"]),
11345
- easing: z25.enum(["standard", "snappy", "gentle"]).nullable()
10917
+ var motion = z22.object({
10918
+ level: z22.enum(["off", "low", "medium", "high"]),
10919
+ easing: z22.enum(["standard", "snappy", "gentle"]).nullable()
11346
10920
  });
11347
- var buttonStyle = z25.object({
10921
+ var buttonStyle = z22.object({
11348
10922
  shape: corners
11349
10923
  // Used for --radius-control CSS variable
11350
10924
  });
11351
- var cardStyle = z25.object({
11352
- elevation: z25.enum(["none", "low", "medium", "high"]),
11353
- border: z25.enum(["none", "subtle", "defined"]),
10925
+ var cardStyle = z22.object({
10926
+ elevation: z22.enum(["none", "low", "medium", "high"]),
10927
+ border: z22.enum(["none", "subtle", "defined"]),
11354
10928
  shape: corners,
11355
- headerStyle: z25.enum(["plain", "accentBar", "subtleBg"]).nullable(),
11356
- mediaTreatment: z25.enum(["square", "rounded", "bleed"]).nullable()
10929
+ headerStyle: z22.enum(["plain", "accentBar", "subtleBg"]).nullable(),
10930
+ mediaTreatment: z22.enum(["square", "rounded", "bleed"]).nullable()
11357
10931
  });
11358
- var inputStyle = z25.object({
10932
+ var inputStyle = z22.object({
11359
10933
  shape: corners,
11360
- border: z25.enum(["subtle", "defined", "underline"]),
11361
- focus: z25.enum(["glow", "ring", "underline"]),
11362
- label: z25.enum(["inside", "above"])
10934
+ border: z22.enum(["subtle", "defined", "underline"]),
10935
+ focus: z22.enum(["glow", "ring", "underline"]),
10936
+ label: z22.enum(["inside", "above"])
11363
10937
  });
11364
- var headerVariant = z25.enum(["classic", "centered", "transparent", "floating", "editorial"]);
11365
- var headerPositioning = z25.enum(["static", "sticky", "fixed"]);
11366
- var headerNavStyle = z25.enum([
10938
+ var headerVariant = z22.enum(["classic", "centered", "transparent", "floating", "editorial"]);
10939
+ var headerPositioning = z22.enum(["static", "sticky", "fixed"]);
10940
+ var headerNavStyle = z22.enum([
11367
10941
  "minimal",
11368
10942
  "underline",
11369
10943
  "underline-grow",
@@ -11372,82 +10946,82 @@ var headerNavStyle = z25.enum([
11372
10946
  "frosted",
11373
10947
  "solid"
11374
10948
  ]);
11375
- var navFontWeight = z25.enum(["regular", "medium", "semibold", "bold"]);
11376
- var headerMaxWidth = z25.enum(["container", "full"]);
11377
- var headerContainerSchema = z25.object({
11378
- rounded: z25.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
11379
- border: z25.boolean().default(true),
11380
- shadow: z25.boolean().default(true),
11381
- padding: z25.enum(["sm", "md", "lg"]).default("md"),
11382
- tint: z25.string().nullable().optional(),
11383
- opacity: z25.number().min(0).max(1).default(0.12)
10949
+ var navFontWeight = z22.enum(["regular", "medium", "semibold", "bold"]);
10950
+ var headerMaxWidth = z22.enum(["container", "full"]);
10951
+ var headerContainerSchema = z22.object({
10952
+ rounded: z22.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
10953
+ border: z22.boolean().default(true),
10954
+ shadow: z22.boolean().default(true),
10955
+ padding: z22.enum(["sm", "md", "lg"]).default("md"),
10956
+ tint: z22.string().nullable().optional(),
10957
+ opacity: z22.number().min(0).max(1).default(0.12)
11384
10958
  }).optional();
11385
10959
  var headerBorderSchema = componentBorderSchema.extend({
11386
- position: z25.enum(["bottom", "top", "both", "none"]).default("bottom")
10960
+ position: z22.enum(["bottom", "top", "both", "none"]).default("bottom")
11387
10961
  }).optional();
11388
- var logoStyleSchema = z25.object({
11389
- fontFamily: z25.enum(["heading", "body"]).default("heading"),
11390
- letterSpacing: z25.enum(["normal", "wide", "wider", "widest"]).default("normal"),
11391
- gradient: z25.boolean().default(false)
10962
+ var logoStyleSchema = z22.object({
10963
+ fontFamily: z22.enum(["heading", "body"]).default("heading"),
10964
+ letterSpacing: z22.enum(["normal", "wide", "wider", "widest"]).default("normal"),
10965
+ gradient: z22.boolean().default(false)
11392
10966
  }).optional();
11393
- var headerLogoTextSchema = z25.object({
11394
- mobileWrapLines: z25.union([z25.literal(1), z25.literal(2)]).optional(),
11395
- mobileMaxWidth: z25.enum(["xs", "sm", "md"]).optional(),
11396
- hideOnShrink: z25.boolean().optional()
10967
+ var headerLogoTextSchema = z22.object({
10968
+ mobileWrapLines: z22.union([z22.literal(1), z22.literal(2)]).optional(),
10969
+ mobileMaxWidth: z22.enum(["xs", "sm", "md"]).optional(),
10970
+ hideOnShrink: z22.boolean().optional()
11397
10971
  }).optional();
11398
- var navEffectsSchema = z25.object({
11399
- underlineGradient: z25.boolean().default(false),
11400
- glow: z25.boolean().default(false),
11401
- glowColor: z25.string().optional(),
11402
- neumorphic: z25.boolean().default(false)
10972
+ var navEffectsSchema = z22.object({
10973
+ underlineGradient: z22.boolean().default(false),
10974
+ glow: z22.boolean().default(false),
10975
+ glowColor: z22.string().optional(),
10976
+ neumorphic: z22.boolean().default(false)
11403
10977
  }).optional();
11404
- var dropdownStyleSchema = z25.object({
10978
+ var dropdownStyleSchema = z22.object({
11405
10979
  // Container styling
11406
- background: z25.string().default("surface"),
10980
+ background: z22.string().default("surface"),
11407
10981
  // color token
11408
- textColor: z25.string().default("text"),
10982
+ textColor: z22.string().default("text"),
11409
10983
  // color token
11410
- borderColor: z25.string().nullable().default("border"),
10984
+ borderColor: z22.string().nullable().default("border"),
11411
10985
  // null = no border
11412
- shadow: z25.enum(["none", "sm", "md", "lg"]).default("md"),
11413
- borderRadius: z25.enum(["none", "sm", "md", "lg"]).default("md"),
10986
+ shadow: z22.enum(["none", "sm", "md", "lg"]).default("md"),
10987
+ borderRadius: z22.enum(["none", "sm", "md", "lg"]).default("md"),
11414
10988
  // Link hover states (explicit control)
11415
- hoverBackground: z25.string().nullable().optional(),
10989
+ hoverBackground: z22.string().nullable().optional(),
11416
10990
  // color token, null = transparent
11417
- hoverTextColor: z25.string().nullable().optional(),
10991
+ hoverTextColor: z22.string().nullable().optional(),
11418
10992
  // color token, null = inherit
11419
10993
  // Typography
11420
- textTransform: z25.enum(["none", "uppercase", "capitalize"]).default("none"),
11421
- letterSpacing: z25.enum(["normal", "wide", "wider"]).default("normal"),
11422
- fontWeight: z25.enum(["regular", "medium", "semibold", "bold"]).optional(),
10994
+ textTransform: z22.enum(["none", "uppercase", "capitalize"]).default("none"),
10995
+ letterSpacing: z22.enum(["normal", "wide", "wider"]).default("normal"),
10996
+ fontWeight: z22.enum(["regular", "medium", "semibold", "bold"]).optional(),
11423
10997
  // optional = inherit from navWeight
11424
- textSize: z25.enum(["xs", "sm", "base", "lg"]).optional()
10998
+ textSize: z22.enum(["xs", "sm", "base", "lg"]).optional()
11425
10999
  // optional = no override (browser default)
11426
11000
  }).optional();
11427
- var headerCtaGapSchema = z25.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11428
- var navContainerSchema = z25.object({
11429
- type: z25.enum(["none", "pill", "glass"]).default("none"),
11430
- tint: z25.string().nullable().optional(),
11431
- opacity: z25.number().min(0).max(1).default(0.15)
11001
+ var headerCtaGapSchema = z22.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11002
+ var navContainerSchema = z22.object({
11003
+ type: z22.enum(["none", "pill", "glass"]).default("none"),
11004
+ tint: z22.string().nullable().optional(),
11005
+ opacity: z22.number().min(0).max(1).default(0.15)
11432
11006
  }).default({ type: "none", tint: null, opacity: 0.15 });
11433
- var headerBackgroundSchema = z25.object({
11434
- type: z25.enum(["color", "gradient", "image"]),
11435
- color: z25.string().nullable().optional(),
11007
+ var headerBackgroundSchema = z22.object({
11008
+ type: z22.enum(["color", "gradient", "image"]),
11009
+ color: z22.string().nullable().optional(),
11436
11010
  gradient: gradientConfigSchema.nullable().optional(),
11437
11011
  image: mediaSchema.nullable().optional(),
11438
- textColor: z25.string().nullable().optional()
11012
+ textColor: z22.string().nullable().optional()
11439
11013
  });
11440
- var headerSchema = z25.object({
11014
+ var headerSchema = z22.object({
11441
11015
  variant: headerVariant,
11442
11016
  positioning: headerPositioning,
11443
- shrinkOnScroll: z25.boolean(),
11017
+ shrinkOnScroll: z22.boolean(),
11444
11018
  maxWidth: headerMaxWidth,
11445
11019
  logoOverride: mediaSchema.nullable().optional(),
11446
11020
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
11447
- textColor: z25.string().nullable().optional(),
11021
+ textColor: z22.string().nullable().optional(),
11448
11022
  // Site title and general header text
11449
11023
  navStyle: headerNavStyle,
11450
- navColor: z25.string().nullable().optional(),
11024
+ navColor: z22.string().nullable().optional(),
11451
11025
  // Nav links (inherits textColor if not set)
11452
11026
  navWeight: navFontWeight.default("medium"),
11453
11027
  // New fields for header system enhancement
@@ -11466,50 +11040,50 @@ var headerSchema = z25.object({
11466
11040
  // Dropdown menu styling (nav dropdowns and mobile drawer)
11467
11041
  dropdownStyle: dropdownStyleSchema
11468
11042
  });
11469
- var footerVariant = z25.enum(["simple", "columns", "split"]);
11470
- var footerMaxWidth = z25.enum(["container", "full"]);
11471
- var footerMode = z25.enum(["default", "blocks", "default+blocks", "none"]);
11472
- var footerNavLayoutMode = z25.enum(["stack", "inline", "inline-wrap"]);
11473
- var footerNavLayoutAlign = z25.enum(["start", "center", "end", "space-between"]);
11474
- var footerSpacing = z25.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11475
- var footerLogoPlacement = z25.enum(["left", "right", "above", "below"]);
11476
- var footerLogoSize = z25.enum(["sm", "md", "lg", "xl"]);
11477
- var footerLogoMaxHeight = z25.enum(["sm", "md", "lg", "xl"]);
11478
- var footerBottomTextLinkStyleSchema = z25.object({
11479
- colorToken: z25.string().optional(),
11480
- hoverColorToken: z25.string().nullable().optional(),
11481
- decorationColorToken: z25.string().nullable().optional(),
11482
- underline: z25.boolean().optional()
11483
- });
11484
- var footerBottomBarSchema = z25.object({
11485
- enabled: z25.boolean().optional(),
11486
- fullBleed: z25.boolean().optional(),
11043
+ var footerVariant = z22.enum(["simple", "columns", "split"]);
11044
+ var footerMaxWidth = z22.enum(["container", "full"]);
11045
+ var footerMode = z22.enum(["default", "blocks", "default+blocks", "none"]);
11046
+ var footerNavLayoutMode = z22.enum(["stack", "inline", "inline-wrap"]);
11047
+ var footerNavLayoutAlign = z22.enum(["start", "center", "end", "space-between"]);
11048
+ var footerSpacing = z22.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11049
+ var footerLogoPlacement = z22.enum(["left", "right", "above", "below"]);
11050
+ var footerLogoSize = z22.enum(["sm", "md", "lg", "xl"]);
11051
+ var footerLogoMaxHeight = z22.enum(["sm", "md", "lg", "xl"]);
11052
+ var footerBottomTextLinkStyleSchema = z22.object({
11053
+ colorToken: z22.string().optional(),
11054
+ hoverColorToken: z22.string().nullable().optional(),
11055
+ decorationColorToken: z22.string().nullable().optional(),
11056
+ underline: z22.boolean().optional()
11057
+ });
11058
+ var footerBottomBarSchema = z22.object({
11059
+ enabled: z22.boolean().optional(),
11060
+ fullBleed: z22.boolean().optional(),
11487
11061
  background: headerBackgroundSchema.optional(),
11488
- textColor: z25.string().nullable().optional(),
11489
- textAlign: z25.enum(["left", "center", "right"]).optional(),
11062
+ textColor: z22.string().nullable().optional(),
11063
+ textAlign: z22.enum(["left", "center", "right"]).optional(),
11490
11064
  paddingY: footerSpacing.optional(),
11491
11065
  paddingX: footerSpacing.optional(),
11492
- borderTop: z25.object({
11493
- colorToken: z25.string().nullable().optional(),
11494
- width: z25.enum(["none", "thin", "medium", "thick"]).optional()
11066
+ borderTop: z22.object({
11067
+ colorToken: z22.string().nullable().optional(),
11068
+ width: z22.enum(["none", "thin", "medium", "thick"]).optional()
11495
11069
  }).optional()
11496
11070
  });
11497
- var footerNavLayoutSchema = z25.object({
11071
+ var footerNavLayoutSchema = z22.object({
11498
11072
  layout: footerNavLayoutMode.optional(),
11499
11073
  align: footerNavLayoutAlign.optional(),
11500
11074
  gapX: footerSpacing.optional(),
11501
11075
  gapY: footerSpacing.optional(),
11502
- columns: z25.number().int().min(1).max(6).optional()
11076
+ columns: z22.number().int().min(1).max(6).optional()
11503
11077
  });
11504
- var footerLogoSchema = z25.object({
11505
- showLogo: z25.boolean().default(true),
11506
- showLogoText: z25.boolean().optional(),
11078
+ var footerLogoSchema = z22.object({
11079
+ showLogo: z22.boolean().default(true),
11080
+ showLogoText: z22.boolean().optional(),
11507
11081
  placement: footerLogoPlacement.optional(),
11508
11082
  size: footerLogoSize.optional(),
11509
11083
  maxHeight: footerLogoMaxHeight.optional(),
11510
- align: z25.enum(["start", "center", "end"]).optional()
11084
+ align: z22.enum(["start", "center", "end"]).optional()
11511
11085
  });
11512
- var footerSchema = z25.object({
11086
+ var footerSchema = z22.object({
11513
11087
  /**
11514
11088
  * SDK-only footer rendering mode.
11515
11089
  *
@@ -11518,11 +11092,11 @@ var footerSchema = z25.object({
11518
11092
  mode: footerMode.optional(),
11519
11093
  variant: footerVariant,
11520
11094
  maxWidth: footerMaxWidth,
11521
- showLogoText: z25.boolean().optional(),
11095
+ showLogoText: z22.boolean().optional(),
11522
11096
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
11523
11097
  // Footer nav styling (independent from header)
11524
11098
  navStyle: headerNavStyle.default("minimal"),
11525
- navColor: z25.string().nullable().optional(),
11099
+ navColor: z22.string().nullable().optional(),
11526
11100
  navWeight: navFontWeight.default("medium"),
11527
11101
  // Full nav link customization (overrides navStyle if set)
11528
11102
  navLinkStyle: navLinkStyleSchema.optional(),
@@ -11533,15 +11107,15 @@ var footerSchema = z25.object({
11533
11107
  logo: footerLogoSchema.optional(),
11534
11108
  bottomBar: footerBottomBarSchema.optional()
11535
11109
  });
11536
- var containerPaddingPresetSchema = z25.enum(["tight", "compact", "default", "relaxed"]);
11537
- var layoutSchema = z25.object({
11538
- containerPadding: z25.object({
11110
+ var containerPaddingPresetSchema = z22.enum(["tight", "compact", "default", "relaxed"]);
11111
+ var layoutSchema = z22.object({
11112
+ containerPadding: z22.object({
11539
11113
  mobile: containerPaddingPresetSchema.optional(),
11540
11114
  tablet: containerPaddingPresetSchema.optional(),
11541
11115
  desktop: containerPaddingPresetSchema.optional()
11542
11116
  }).optional()
11543
11117
  }).optional();
11544
- var heroTypographySizeSchema = z25.enum([
11118
+ var heroTypographySizeSchema = z22.enum([
11545
11119
  "sm",
11546
11120
  "base",
11547
11121
  "lg",
@@ -11552,14 +11126,14 @@ var heroTypographySizeSchema = z25.enum([
11552
11126
  "5xl",
11553
11127
  "6xl"
11554
11128
  ]);
11555
- var heroTypographyLineHeightSchema = z25.enum(["tight", "snug", "normal", "relaxed"]);
11556
- var heroResponsiveTypographySchema = z25.object({
11129
+ var heroTypographyLineHeightSchema = z22.enum(["tight", "snug", "normal", "relaxed"]);
11130
+ var heroResponsiveTypographySchema = z22.object({
11557
11131
  headlineSize: heroTypographySizeSchema.optional(),
11558
11132
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
11559
11133
  subheadlineSize: heroTypographySizeSchema.optional(),
11560
11134
  subheadlineLineHeight: heroTypographyLineHeightSchema.optional()
11561
11135
  });
11562
- var heroTypographySchema = z25.object({
11136
+ var heroTypographySchema = z22.object({
11563
11137
  headlineSize: heroTypographySizeSchema.optional(),
11564
11138
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
11565
11139
  subheadlineSize: heroTypographySizeSchema.optional(),
@@ -11568,24 +11142,24 @@ var heroTypographySchema = z25.object({
11568
11142
  microHeadlineLineHeight: heroTypographyLineHeightSchema.optional(),
11569
11143
  microSubheadlineSize: heroTypographySizeSchema.optional(),
11570
11144
  microSubheadlineLineHeight: heroTypographyLineHeightSchema.optional(),
11571
- responsive: z25.object({
11145
+ responsive: z22.object({
11572
11146
  tablet: heroResponsiveTypographySchema.optional(),
11573
11147
  mobile: heroResponsiveTypographySchema.optional()
11574
11148
  }).optional()
11575
11149
  });
11576
- var heroSchema = z25.object({
11150
+ var heroSchema = z22.object({
11577
11151
  typography: heroTypographySchema.optional()
11578
11152
  }).optional();
11579
- var gradientsSchema = z25.object({
11580
- button: z25.string().min(1).nullable().optional(),
11581
- hero: z25.string().min(1).nullable().optional(),
11582
- background: z25.string().min(1).nullable().optional()
11583
- });
11584
- var themeSchema = z25.object({
11585
- name: z25.string().min(1).max(30),
11586
- description: z25.string().min(1).max(400),
11587
- rationale: z25.string().min(1).max(400),
11588
- siteStyleId: z25.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
11153
+ var gradientsSchema = z22.object({
11154
+ button: z22.string().min(1).nullable().optional(),
11155
+ hero: z22.string().min(1).nullable().optional(),
11156
+ background: z22.string().min(1).nullable().optional()
11157
+ });
11158
+ var themeSchema = z22.object({
11159
+ name: z22.string().min(1).max(30),
11160
+ description: z22.string().min(1).max(400),
11161
+ rationale: z22.string().min(1).max(400),
11162
+ siteStyleId: z22.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
11589
11163
  axes: axesSchema,
11590
11164
  palette: paletteSchema,
11591
11165
  typography: typographySchema,
@@ -11612,16 +11186,16 @@ var themeSchema = z25.object({
11612
11186
  // Block-specific customization (Tier 3)
11613
11187
  // blockCustomVars: Per-block CSS variable overrides as bare values
11614
11188
  // Example: { "event-registration": { "--step-color": "#6d28d9" } }
11615
- blockCustomVars: z25.record(
11616
- z25.string(),
11189
+ blockCustomVars: z22.record(
11190
+ z22.string(),
11617
11191
  // block kind (matches data-block attribute)
11618
- z25.record(z25.string(), z25.string())
11192
+ z22.record(z22.string(), z22.string())
11619
11193
  // { '--var-name': 'value' }
11620
11194
  ).optional(),
11621
11195
  // Structured block-kind theme overrides (v1: typography prose-link style only)
11622
11196
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
11623
- blockOverrides: z25.record(
11624
- z25.string(),
11197
+ blockOverrides: z22.record(
11198
+ z22.string(),
11625
11199
  blockThemeOverrideSchema
11626
11200
  ).optional(),
11627
11201
  // Structured custom CSS rules
@@ -11657,22 +11231,21 @@ var themeSchema = z25.object({
11657
11231
  * }
11658
11232
  * ```
11659
11233
  */
11660
- styleGroups: z25.record(z25.string(), z25.array(z25.string())).optional()
11234
+ styleGroups: z22.record(z22.string(), z22.array(z22.string())).optional()
11661
11235
  });
11662
- var themesTurnSchema = z25.object({
11663
- message: z25.string().min(1),
11664
- themes: z25.array(themeSchema).length(3)
11236
+ var themesTurnSchema = z22.object({
11237
+ message: z22.string().min(1),
11238
+ themes: z22.array(themeSchema).length(3)
11665
11239
  });
11666
11240
 
11667
11241
  // ../theme-core/src/palette/variants/types.ts
11668
- import { z as z26 } from "zod";
11669
11242
  function asPaletteVariantId(value) {
11670
11243
  if (value.length === 0) {
11671
11244
  throw new Error("PaletteVariantId must be a non-empty string");
11672
11245
  }
11673
11246
  return value;
11674
11247
  }
11675
- var paletteVariantIdSchema = z26.string().min(1).transform((value) => asPaletteVariantId(value));
11248
+ var paletteVariantIdSchema = z23.string().min(1).transform((value) => asPaletteVariantId(value));
11676
11249
  var PALETTE_TOKEN_NAMES = [
11677
11250
  "primary",
11678
11251
  "primaryForeground",
@@ -11688,19 +11261,19 @@ var PALETTE_TOKEN_NAMES = [
11688
11261
  "text",
11689
11262
  "border"
11690
11263
  ];
11691
- var paletteTokenNameSchema = z26.enum(PALETTE_TOKEN_NAMES);
11264
+ var paletteTokenNameSchema = z23.enum(PALETTE_TOKEN_NAMES);
11692
11265
  var HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
11693
- var hexColorSchema = z26.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
11266
+ var hexColorSchema = z23.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
11694
11267
  var variantPaletteColorSchema = paletteColorSchema.extend({
11695
11268
  name: paletteTokenNameSchema
11696
11269
  });
11697
- var paletteVariantSchema = z26.object({
11270
+ var paletteVariantSchema = z23.object({
11698
11271
  id: paletteVariantIdSchema,
11699
- name: z26.string().min(1),
11700
- description: z26.string().min(1),
11272
+ name: z23.string().min(1),
11273
+ description: z23.string().min(1),
11701
11274
  tags: styleTagsSchema,
11702
- mode: z26.enum(["light", "dark"]),
11703
- colors: z26.array(variantPaletteColorSchema).min(1)
11275
+ mode: z23.enum(["light", "dark"]),
11276
+ colors: z23.array(variantPaletteColorSchema).min(1)
11704
11277
  });
11705
11278
  function definePaletteVariant(input) {
11706
11279
  return {
@@ -11712,7 +11285,7 @@ function definePaletteVariant(input) {
11712
11285
  colors: input.colors
11713
11286
  };
11714
11287
  }
11715
- var paletteOverridesSchema = z26.object({
11288
+ var paletteOverridesSchema = z23.object({
11716
11289
  primary: hexColorSchema.optional(),
11717
11290
  primaryForeground: hexColorSchema.optional(),
11718
11291
  secondary: hexColorSchema.optional(),
@@ -11932,96 +11505,747 @@ var softNaturalWatercolor = definePaletteVariant({
11932
11505
  ]
11933
11506
  });
11934
11507
 
11935
- // ../theme-core/src/palette/variants/warm-neutral.ts
11936
- var warmNeutralClay = definePaletteVariant({
11937
- id: "warm-neutral-clay",
11938
- name: "Warm Neutral \u2014 Clay",
11939
- description: "Terracotta primary on a cream ground.",
11940
- tags: { tone: "classic", energy: "calm", era: "organic" },
11941
- mode: "light",
11942
- colors: [
11943
- { name: "primary", hex: "#8b5e34" },
11944
- { name: "secondary", hex: "#7c6f64" },
11945
- { name: "accent", hex: "#a15c38" },
11946
- { name: "success", hex: "#527853" },
11947
- { name: "warning", hex: "#b7791f" },
11948
- { name: "destructive", hex: "#b91c1c" },
11949
- { name: "background", hex: "#fffaf3" },
11950
- { name: "surface", hex: "#ffffff" },
11951
- { name: "surfaceAlt", hex: "#f5eadc" },
11952
- { name: "muted", hex: "#efe2d0" },
11953
- { name: "text", hex: "#2f241c" },
11954
- { name: "primaryForeground", hex: "#fffaf3" },
11955
- { name: "border", hex: "#d8c6b3" }
11956
- ]
11957
- });
11958
- var warmNeutralCream = definePaletteVariant({
11959
- id: "warm-neutral-cream",
11960
- name: "Warm Neutral \u2014 Cream",
11961
- description: "Soft sand primary with pale cream surfaces.",
11962
- tags: { tone: "minimal", energy: "calm", era: "organic" },
11963
- mode: "light",
11964
- colors: [
11965
- { name: "primary", hex: "#b08864" },
11966
- { name: "secondary", hex: "#9a8c7e" },
11967
- { name: "accent", hex: "#c2956a" },
11968
- { name: "success", hex: "#7d8a5f" },
11969
- { name: "warning", hex: "#c89a4d" },
11970
- { name: "destructive", hex: "#a3503e" },
11971
- { name: "background", hex: "#fdf8ee" },
11972
- { name: "surface", hex: "#ffffff" },
11973
- { name: "surfaceAlt", hex: "#f4ebd9" },
11974
- { name: "muted", hex: "#ede3cf" },
11975
- { name: "text", hex: "#3b2f24" },
11976
- { name: "primaryForeground", hex: "#fdf8ee" },
11977
- { name: "border", hex: "#e0d2b8" }
11978
- ]
11508
+ // ../theme-core/src/palette/variants/warm-neutral.ts
11509
+ var warmNeutralClay = definePaletteVariant({
11510
+ id: "warm-neutral-clay",
11511
+ name: "Warm Neutral \u2014 Clay",
11512
+ description: "Terracotta primary on a cream ground.",
11513
+ tags: { tone: "classic", energy: "calm", era: "organic" },
11514
+ mode: "light",
11515
+ colors: [
11516
+ { name: "primary", hex: "#8b5e34" },
11517
+ { name: "secondary", hex: "#7c6f64" },
11518
+ { name: "accent", hex: "#a15c38" },
11519
+ { name: "success", hex: "#527853" },
11520
+ { name: "warning", hex: "#b7791f" },
11521
+ { name: "destructive", hex: "#b91c1c" },
11522
+ { name: "background", hex: "#fffaf3" },
11523
+ { name: "surface", hex: "#ffffff" },
11524
+ { name: "surfaceAlt", hex: "#f5eadc" },
11525
+ { name: "muted", hex: "#efe2d0" },
11526
+ { name: "text", hex: "#2f241c" },
11527
+ { name: "primaryForeground", hex: "#fffaf3" },
11528
+ { name: "border", hex: "#d8c6b3" }
11529
+ ]
11530
+ });
11531
+ var warmNeutralCream = definePaletteVariant({
11532
+ id: "warm-neutral-cream",
11533
+ name: "Warm Neutral \u2014 Cream",
11534
+ description: "Soft sand primary with pale cream surfaces.",
11535
+ tags: { tone: "minimal", energy: "calm", era: "organic" },
11536
+ mode: "light",
11537
+ colors: [
11538
+ { name: "primary", hex: "#b08864" },
11539
+ { name: "secondary", hex: "#9a8c7e" },
11540
+ { name: "accent", hex: "#c2956a" },
11541
+ { name: "success", hex: "#7d8a5f" },
11542
+ { name: "warning", hex: "#c89a4d" },
11543
+ { name: "destructive", hex: "#a3503e" },
11544
+ { name: "background", hex: "#fdf8ee" },
11545
+ { name: "surface", hex: "#ffffff" },
11546
+ { name: "surfaceAlt", hex: "#f4ebd9" },
11547
+ { name: "muted", hex: "#ede3cf" },
11548
+ { name: "text", hex: "#3b2f24" },
11549
+ { name: "primaryForeground", hex: "#fdf8ee" },
11550
+ { name: "border", hex: "#e0d2b8" }
11551
+ ]
11552
+ });
11553
+ var warmNeutralForest = definePaletteVariant({
11554
+ id: "warm-neutral-forest",
11555
+ name: "Warm Neutral \u2014 Forest",
11556
+ description: "Deep forest green primary with earthy neutrals.",
11557
+ tags: { tone: "classic", energy: "calm", era: "organic" },
11558
+ mode: "light",
11559
+ colors: [
11560
+ { name: "primary", hex: "#3d5840" },
11561
+ { name: "secondary", hex: "#7a6f5d" },
11562
+ { name: "accent", hex: "#b06b50" },
11563
+ { name: "success", hex: "#5a7a5d" },
11564
+ { name: "warning", hex: "#b7791f" },
11565
+ { name: "destructive", hex: "#b91c1c" },
11566
+ { name: "background", hex: "#fbf8f0" },
11567
+ { name: "surface", hex: "#ffffff" },
11568
+ { name: "surfaceAlt", hex: "#f2ecdb" },
11569
+ { name: "muted", hex: "#ebe3cc" },
11570
+ { name: "text", hex: "#2a2a2a" },
11571
+ { name: "primaryForeground", hex: "#fbf8f0" },
11572
+ { name: "border", hex: "#cdc1a4" }
11573
+ ]
11574
+ });
11575
+
11576
+ // ../theme-core/src/palette/variants/index.ts
11577
+ var paletteVariants = [
11578
+ // Brand-led family
11579
+ brandLedCool,
11580
+ brandLedWarm,
11581
+ brandLedJewel,
11582
+ // Warm-neutral family
11583
+ warmNeutralClay,
11584
+ warmNeutralCream,
11585
+ warmNeutralForest,
11586
+ // High-contrast family
11587
+ highContrastInk,
11588
+ highContrastCharcoal,
11589
+ highContrastMonochrome,
11590
+ // Soft-natural family
11591
+ softNaturalSage,
11592
+ softNaturalStone,
11593
+ softNaturalWatercolor
11594
+ ];
11595
+ var paletteVariantsById = new Map(
11596
+ paletteVariants.map((v) => [v.id, v])
11597
+ );
11598
+
11599
+ // ../theme-core/src/site-styles/sourceCatalogs.ts
11600
+ var generatedContentFrames = [
11601
+ plainFrame,
11602
+ panelFrame("inset"),
11603
+ panelFrame("raised"),
11604
+ flushPanelFrame({ bleed: "start" })
11605
+ ];
11606
+ var userContentFrames = [
11607
+ ...generatedContentFrames,
11608
+ panelFrame("editorial"),
11609
+ flushPanelFrame({ bleed: "end" }),
11610
+ flushPanelFrame({ bleed: "both" })
11611
+ ];
11612
+ var generatedDesignOptionCatalog = {
11613
+ source: "generated",
11614
+ sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
11615
+ contentFrames: generatedContentFrames,
11616
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
11617
+ transitions: ["none", "soft-fade-short", "soft-fade-long"],
11618
+ emphases: ["low", "medium", "high"],
11619
+ detachedCustom: false
11620
+ };
11621
+ var userDesignOptionCatalog = {
11622
+ source: "user",
11623
+ sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
11624
+ contentFrames: userContentFrames,
11625
+ itemSurfaces: [
11626
+ ...generatedDesignOptionCatalog.itemSurfaces,
11627
+ "inset",
11628
+ "editorial"
11629
+ ],
11630
+ transitions: [
11631
+ ...generatedDesignOptionCatalog.transitions,
11632
+ "wave-edge",
11633
+ "angle-edge"
11634
+ ],
11635
+ emphases: generatedDesignOptionCatalog.emphases,
11636
+ detachedCustom: false
11637
+ };
11638
+ var advancedDesignOptionCatalog = {
11639
+ source: "advanced",
11640
+ sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
11641
+ contentFrames: userDesignOptionCatalog.contentFrames,
11642
+ itemSurfaces: userDesignOptionCatalog.itemSurfaces,
11643
+ transitions: userDesignOptionCatalog.transitions,
11644
+ emphases: userDesignOptionCatalog.emphases,
11645
+ detachedCustom: true
11646
+ };
11647
+
11648
+ // ../theme-core/src/site-styles/curatedSiteStyles.ts
11649
+ var curatedSiteStyleIdValues = [
11650
+ "site-style:calm-studio",
11651
+ "site-style:clear-professional",
11652
+ "site-style:warm-editorial",
11653
+ "site-style:bright-community",
11654
+ "site-style:quiet-luxury",
11655
+ "site-style:practical-services",
11656
+ "site-style:modern-wellness",
11657
+ "site-style:bold-launch"
11658
+ ];
11659
+ var quietBudget = {
11660
+ accentDensity: "low",
11661
+ panelDensity: "medium",
11662
+ transitionMix: "quiet",
11663
+ primaryCtaLimit: 2,
11664
+ mediaDensity: "medium",
11665
+ decorativeRepetition: "low"
11666
+ };
11667
+ var balancedBudget = {
11668
+ accentDensity: "medium",
11669
+ panelDensity: "medium",
11670
+ transitionMix: "balanced",
11671
+ primaryCtaLimit: 3,
11672
+ mediaDensity: "medium",
11673
+ decorativeRepetition: "medium"
11674
+ };
11675
+ var expressiveBudget = {
11676
+ accentDensity: "high",
11677
+ panelDensity: "high",
11678
+ transitionMix: "expressive",
11679
+ primaryCtaLimit: 3,
11680
+ mediaDensity: "high",
11681
+ decorativeRepetition: "medium"
11682
+ };
11683
+ function uniqueContentFrameKinds() {
11684
+ const kinds = [...new Set(
11685
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
11686
+ )];
11687
+ const firstKind = kinds[0];
11688
+ if (!firstKind) {
11689
+ throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
11690
+ }
11691
+ return [firstKind, ...kinds.slice(1)];
11692
+ }
11693
+ var generatedContentFrameKinds = uniqueContentFrameKinds();
11694
+ function defineCuratedSiteStyle(input) {
11695
+ return {
11696
+ id: asSiteStyleId(input.id),
11697
+ name: input.name,
11698
+ description: input.description,
11699
+ generationBrief: input.generationBrief,
11700
+ selectionKeywords: input.selectionKeywords ?? [],
11701
+ template: {
11702
+ id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
11703
+ name: input.name,
11704
+ version: 1,
11705
+ tokenRecipes: input.tokenRecipes,
11706
+ compositionBudget: input.compositionBudget,
11707
+ supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
11708
+ supportedContentFrames: generatedContentFrameKinds,
11709
+ supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
11710
+ supportedTransitions: generatedDesignOptionCatalog.transitions
11711
+ },
11712
+ buttonPersonalityChoices: input.buttonPersonalityChoices,
11713
+ paletteVariantChoices: input.paletteVariantChoices
11714
+ };
11715
+ }
11716
+ function buttonChoice(id, note) {
11717
+ return note ? { id: asButtonPersonalityId(id), note } : { id: asButtonPersonalityId(id) };
11718
+ }
11719
+ function paletteChoice(id, note) {
11720
+ return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
11721
+ }
11722
+ var curatedSiteStyles = [
11723
+ defineCuratedSiteStyle({
11724
+ id: "site-style:calm-studio",
11725
+ name: "Calm Studio",
11726
+ description: "Soft, measured, and spacious for intimate appointment or class businesses.",
11727
+ generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
11728
+ tokenRecipes: {
11729
+ palette: "soft-natural",
11730
+ contrast: "standard",
11731
+ radius: "soft",
11732
+ shadow: "subtle",
11733
+ typography: "friendly-sans",
11734
+ spacing: "airy",
11735
+ motion: "subtle"
11736
+ },
11737
+ compositionBudget: quietBudget,
11738
+ buttonPersonalityChoices: [
11739
+ buttonChoice("soft-pill"),
11740
+ buttonChoice("pebble"),
11741
+ buttonChoice("editorial-link"),
11742
+ buttonChoice("brushed-wash")
11743
+ ],
11744
+ paletteVariantChoices: [
11745
+ paletteChoice("soft-natural-sage"),
11746
+ paletteChoice("soft-natural-stone"),
11747
+ paletteChoice("warm-neutral-clay"),
11748
+ paletteChoice("soft-natural-watercolor")
11749
+ ]
11750
+ }),
11751
+ defineCuratedSiteStyle({
11752
+ id: "site-style:clear-professional",
11753
+ name: "Clear Professional",
11754
+ description: "Crisp, trustworthy, and direct for local services and consultancies.",
11755
+ generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
11756
+ tokenRecipes: {
11757
+ palette: "brand-led",
11758
+ contrast: "strong",
11759
+ radius: "soft",
11760
+ shadow: "subtle",
11761
+ typography: "clean-sans",
11762
+ spacing: "regular",
11763
+ motion: "subtle"
11764
+ },
11765
+ compositionBudget: balancedBudget,
11766
+ buttonPersonalityChoices: [
11767
+ buttonChoice("confident-chip"),
11768
+ buttonChoice("soft-pill"),
11769
+ buttonChoice("editorial-link")
11770
+ ],
11771
+ paletteVariantChoices: [
11772
+ paletteChoice("brand-led-cool"),
11773
+ paletteChoice("high-contrast-ink"),
11774
+ paletteChoice("brand-led-jewel")
11775
+ ]
11776
+ }),
11777
+ defineCuratedSiteStyle({
11778
+ id: "site-style:warm-editorial",
11779
+ name: "Warm Editorial",
11780
+ description: "Story-led and textured for educators, makers, venues, and retreats.",
11781
+ generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
11782
+ tokenRecipes: {
11783
+ palette: "warm-neutral",
11784
+ contrast: "standard",
11785
+ radius: "square",
11786
+ shadow: "none",
11787
+ typography: "serif-editorial",
11788
+ spacing: "airy",
11789
+ motion: "subtle"
11790
+ },
11791
+ compositionBudget: balancedBudget,
11792
+ buttonPersonalityChoices: [
11793
+ buttonChoice("editorial-link"),
11794
+ buttonChoice("soft-pill"),
11795
+ buttonChoice("brushed-wash")
11796
+ ],
11797
+ paletteVariantChoices: [
11798
+ paletteChoice("warm-neutral-cream"),
11799
+ paletteChoice("warm-neutral-clay"),
11800
+ paletteChoice("warm-neutral-forest"),
11801
+ paletteChoice("soft-natural-stone")
11802
+ ]
11803
+ }),
11804
+ defineCuratedSiteStyle({
11805
+ id: "site-style:bright-community",
11806
+ name: "Bright Community",
11807
+ description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
11808
+ generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
11809
+ tokenRecipes: {
11810
+ palette: "brand-led",
11811
+ contrast: "standard",
11812
+ radius: "rounded",
11813
+ shadow: "subtle",
11814
+ typography: "friendly-sans",
11815
+ spacing: "regular",
11816
+ motion: "expressive"
11817
+ },
11818
+ compositionBudget: balancedBudget,
11819
+ buttonPersonalityChoices: [
11820
+ buttonChoice("pebble"),
11821
+ buttonChoice("brushed-wash"),
11822
+ buttonChoice("confident-chip")
11823
+ ],
11824
+ paletteVariantChoices: [
11825
+ paletteChoice("brand-led-warm"),
11826
+ paletteChoice("brand-led-jewel"),
11827
+ paletteChoice("soft-natural-watercolor")
11828
+ ]
11829
+ }),
11830
+ defineCuratedSiteStyle({
11831
+ id: "site-style:quiet-luxury",
11832
+ name: "Quiet Luxury",
11833
+ description: "Minimal, confident, and refined for premium experiences and private services.",
11834
+ generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
11835
+ selectionKeywords: [
11836
+ "luxury",
11837
+ "premium",
11838
+ "boutique",
11839
+ "bespoke",
11840
+ "exclusive"
11841
+ ],
11842
+ tokenRecipes: {
11843
+ palette: "high-contrast",
11844
+ contrast: "strong",
11845
+ radius: "square",
11846
+ shadow: "none",
11847
+ typography: "classic-serif",
11848
+ spacing: "airy",
11849
+ motion: "none"
11850
+ },
11851
+ compositionBudget: quietBudget,
11852
+ buttonPersonalityChoices: [
11853
+ buttonChoice("editorial-link"),
11854
+ buttonChoice("confident-chip"),
11855
+ buttonChoice("soft-pill")
11856
+ ],
11857
+ paletteVariantChoices: [
11858
+ paletteChoice("high-contrast-charcoal"),
11859
+ paletteChoice("high-contrast-ink"),
11860
+ paletteChoice("warm-neutral-cream")
11861
+ ]
11862
+ }),
11863
+ defineCuratedSiteStyle({
11864
+ id: "site-style:practical-services",
11865
+ name: "Practical Services",
11866
+ description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
11867
+ generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
11868
+ selectionKeywords: [
11869
+ "repair",
11870
+ "plumb",
11871
+ "electric",
11872
+ "cleaning",
11873
+ "landscap",
11874
+ "contractor"
11875
+ ],
11876
+ tokenRecipes: {
11877
+ palette: "brand-led",
11878
+ contrast: "maximum",
11879
+ radius: "soft",
11880
+ shadow: "subtle",
11881
+ typography: "clean-sans",
11882
+ spacing: "compact",
11883
+ motion: "none"
11884
+ },
11885
+ compositionBudget: quietBudget,
11886
+ buttonPersonalityChoices: [
11887
+ buttonChoice("confident-chip"),
11888
+ buttonChoice("pebble"),
11889
+ buttonChoice("ink-stamp")
11890
+ ],
11891
+ paletteVariantChoices: [
11892
+ paletteChoice("brand-led-cool"),
11893
+ paletteChoice("high-contrast-ink"),
11894
+ paletteChoice("brand-led-warm")
11895
+ ]
11896
+ }),
11897
+ defineCuratedSiteStyle({
11898
+ id: "site-style:modern-wellness",
11899
+ name: "Modern Wellness",
11900
+ description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
11901
+ generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
11902
+ tokenRecipes: {
11903
+ palette: "soft-natural",
11904
+ contrast: "standard",
11905
+ radius: "rounded",
11906
+ shadow: "subtle",
11907
+ typography: "clean-sans",
11908
+ spacing: "airy",
11909
+ motion: "subtle"
11910
+ },
11911
+ compositionBudget: balancedBudget,
11912
+ buttonPersonalityChoices: [
11913
+ buttonChoice("soft-pill"),
11914
+ buttonChoice("pebble"),
11915
+ buttonChoice("confident-chip")
11916
+ ],
11917
+ paletteVariantChoices: [
11918
+ paletteChoice("soft-natural-sage"),
11919
+ paletteChoice("soft-natural-stone"),
11920
+ paletteChoice("warm-neutral-forest")
11921
+ ]
11922
+ }),
11923
+ defineCuratedSiteStyle({
11924
+ id: "site-style:bold-launch",
11925
+ name: "Bold Launch",
11926
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
11927
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
11928
+ selectionKeywords: [
11929
+ "launch",
11930
+ "campaign",
11931
+ "preorder",
11932
+ "pre-order",
11933
+ "waitlist",
11934
+ "drop"
11935
+ ],
11936
+ tokenRecipes: {
11937
+ palette: "high-contrast",
11938
+ contrast: "maximum",
11939
+ radius: "pill",
11940
+ shadow: "layered",
11941
+ typography: "clean-sans",
11942
+ spacing: "regular",
11943
+ motion: "expressive"
11944
+ },
11945
+ compositionBudget: expressiveBudget,
11946
+ buttonPersonalityChoices: [
11947
+ buttonChoice("ink-stamp"),
11948
+ buttonChoice("confident-chip"),
11949
+ buttonChoice("brushed-wash"),
11950
+ buttonChoice("pebble")
11951
+ ],
11952
+ paletteVariantChoices: [
11953
+ paletteChoice("high-contrast-monochrome"),
11954
+ paletteChoice("high-contrast-ink"),
11955
+ paletteChoice("brand-led-jewel"),
11956
+ paletteChoice("brand-led-warm")
11957
+ ]
11958
+ })
11959
+ ];
11960
+ var curatedSiteStylesById = new Map(
11961
+ curatedSiteStyles.map((style) => [style.id, style])
11962
+ );
11963
+
11964
+ // ../theme-core/src/site-styles/designState.ts
11965
+ import { z as z24 } from "zod";
11966
+
11967
+ // ../theme-core/src/site-styles/rawStyleFields.ts
11968
+ var themeV2RuntimeStyleFieldNames = [
11969
+ "_frameStyles",
11970
+ "_sectionStyles",
11971
+ "_containerStyles",
11972
+ "_cardStyles",
11973
+ // styleGroup is legacy runtime transition wiring rather than a nested
11974
+ // override object, but normal editors should still never see it directly.
11975
+ "styleGroup"
11976
+ ];
11977
+ var themeV2BlockSpecificRawStyleFieldNames = [
11978
+ "_contentCardStyles",
11979
+ "_textCardStyles"
11980
+ ];
11981
+ var themeV2NormalEditorRawStyleFieldNames = [
11982
+ ...themeV2RuntimeStyleFieldNames,
11983
+ ...themeV2BlockSpecificRawStyleFieldNames
11984
+ ];
11985
+ var themeV2NormalEditorRawStyleFieldNameSet = new Set(
11986
+ themeV2NormalEditorRawStyleFieldNames
11987
+ );
11988
+
11989
+ // ../theme-core/src/site-styles/designState.ts
11990
+ var themeV2DesignStateSchemaVersion = 1;
11991
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
11992
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
11993
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
11994
+ fields3[0],
11995
+ ...fields3.slice(1)
11996
+ ]);
11997
+ var heroLegibilityStrategySchema = z24.enum([
11998
+ "none",
11999
+ "scrim-gradient",
12000
+ "solid-panel"
12001
+ ]);
12002
+ function uniqueNonEmpty(values) {
12003
+ const uniqueValues = [...new Set(values)];
12004
+ const firstValue = uniqueValues[0];
12005
+ if (!firstValue) {
12006
+ throw new Error("Expected at least one Theme V2 design state option.");
12007
+ }
12008
+ return [firstValue, ...uniqueValues.slice(1)];
12009
+ }
12010
+ var userPanelTreatments = uniqueNonEmpty(
12011
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
12012
+ );
12013
+ var userFlushTreatments = uniqueNonEmpty(
12014
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
12015
+ );
12016
+ var userFlushBleeds = uniqueNonEmpty(
12017
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
12018
+ );
12019
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
12020
+ z24.object({ kind: z24.literal("plain") }).strict(),
12021
+ z24.object({
12022
+ kind: z24.literal("panel"),
12023
+ treatment: z24.enum(userPanelTreatments)
12024
+ }).strict(),
12025
+ z24.object({
12026
+ kind: z24.literal("flush-panel"),
12027
+ treatment: z24.enum(userFlushTreatments),
12028
+ bleed: z24.enum(userFlushBleeds)
12029
+ }).strict()
12030
+ ]);
12031
+ var blockDesignPlanSchema = z24.object({
12032
+ blockId: z24.string().min(1).transform(asDesignBlockId),
12033
+ blockKind: z24.string().min(1),
12034
+ purpose: z24.string().min(1),
12035
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
12036
+ contentFrame: contentFrameIntentSchema,
12037
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
12038
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
12039
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
12040
+ heroLegibility: heroLegibilityStrategySchema.optional()
12041
+ }).strict();
12042
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
12043
+ z24.object({
12044
+ kind: z24.literal("theme-v2"),
12045
+ source: designResolutionPolicySchema,
12046
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
12047
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
12048
+ templateVersion: z24.number().int().nonnegative(),
12049
+ resolverVersion: z24.number().int().nonnegative()
12050
+ }).strict(),
12051
+ z24.object({
12052
+ kind: z24.literal("legacy-raw"),
12053
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
12054
+ }).strict(),
12055
+ z24.object({
12056
+ kind: z24.literal("advanced-detached"),
12057
+ reason: z24.literal("detached-custom-runtime-fields")
12058
+ }).strict()
12059
+ ]);
12060
+ var blockRuntimeStyleAuthoritySchema = z24.object({
12061
+ unit: z24.literal("block-runtime-fields"),
12062
+ blockId: z24.string().min(1).transform(asDesignBlockId),
12063
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
12064
+ authority: styleAuthoritySchema
12065
+ }).strict();
12066
+ var persistedPageDesignStateV1Schema = z24.object({
12067
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
12068
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
12069
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
12070
+ templateVersion: z24.number().int().nonnegative(),
12071
+ resolverVersion: z24.number().int().nonnegative(),
12072
+ rhythmPresetId: z24.string().min(1),
12073
+ blocks: z24.array(blockDesignPlanSchema),
12074
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
12075
+ }).strict();
12076
+
12077
+ // ../theme-core/src/site-styles/generatedSchemas.ts
12078
+ import { z as z25 } from "zod";
12079
+ function uniqueNonEmpty2(values) {
12080
+ const uniqueValues = [...new Set(values)];
12081
+ const firstValue = uniqueValues[0];
12082
+ if (!firstValue) {
12083
+ throw new Error("Expected at least one generated schema option.");
12084
+ }
12085
+ return [firstValue, ...uniqueValues.slice(1)];
12086
+ }
12087
+ var generatedPanelTreatments = uniqueNonEmpty2(
12088
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
12089
+ );
12090
+ var generatedFlushTreatments = uniqueNonEmpty2(
12091
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
12092
+ );
12093
+ var generatedFlushBleeds = uniqueNonEmpty2(
12094
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
12095
+ );
12096
+ var generatedPanelFrameSchema = z25.object({
12097
+ kind: z25.literal("panel"),
12098
+ treatment: z25.enum(generatedPanelTreatments)
12099
+ }).strict();
12100
+ var generatedFlushPanelFrameSchema = z25.object({
12101
+ kind: z25.literal("flush-panel"),
12102
+ treatment: z25.enum(generatedFlushTreatments),
12103
+ bleed: z25.enum(generatedFlushBleeds)
12104
+ }).strict();
12105
+ var generatedContentFrameIntentSchema = z25.discriminatedUnion("kind", [
12106
+ z25.object({ kind: z25.literal("plain") }).strict(),
12107
+ generatedPanelFrameSchema,
12108
+ generatedFlushPanelFrameSchema
12109
+ ]);
12110
+ var generatedSiteStyleIdSchema = z25.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
12111
+ function generatedChoiceSchema(valueSchema) {
12112
+ return z25.discriminatedUnion("kind", [
12113
+ z25.object({
12114
+ source: z25.literal("generated"),
12115
+ kind: z25.literal("auto")
12116
+ }).strict(),
12117
+ z25.object({
12118
+ source: z25.literal("generated"),
12119
+ kind: z25.literal("explicit"),
12120
+ value: valueSchema
12121
+ }).strict()
12122
+ ]);
12123
+ }
12124
+ var generatedBlockDesignIntentSchema = z25.object({
12125
+ sectionSurface: generatedChoiceSchema(
12126
+ z25.enum(generatedDesignOptionCatalog.sectionSurfaces)
12127
+ ),
12128
+ contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
12129
+ itemSurface: generatedChoiceSchema(
12130
+ z25.enum(generatedDesignOptionCatalog.itemSurfaces)
12131
+ ),
12132
+ transitionAfter: generatedChoiceSchema(
12133
+ z25.enum(generatedDesignOptionCatalog.transitions)
12134
+ ),
12135
+ emphasis: generatedChoiceSchema(
12136
+ z25.enum(generatedDesignOptionCatalog.emphases)
12137
+ )
12138
+ }).strict();
12139
+ var generatedMediaCompositionIntentSchema = z25.enum([
12140
+ "none",
12141
+ "supporting",
12142
+ "dominant"
12143
+ ]);
12144
+ var generatedDecorativeCompositionIntentSchema = z25.enum([
12145
+ "none",
12146
+ "supporting"
12147
+ ]);
12148
+ var generatedHeroLegibilityStrategySchema = z25.enum([
12149
+ "none",
12150
+ "scrim-gradient"
12151
+ ]);
12152
+ var generatedBlockMediaIntentSchema = z25.object({
12153
+ media: generatedMediaCompositionIntentSchema,
12154
+ decorative: generatedDecorativeCompositionIntentSchema,
12155
+ heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
12156
+ }).strict();
12157
+ var generatedBoundaryIntentSchema = z25.object({
12158
+ transitionAfter: generatedChoiceSchema(
12159
+ z25.enum(generatedDesignOptionCatalog.transitions)
12160
+ )
12161
+ }).strict();
12162
+ var generatedPageDesignBlockIntentSchema = z25.object({
12163
+ blockId: z25.string().min(1),
12164
+ blockKind: z25.string().min(1),
12165
+ purpose: z25.string().min(1),
12166
+ design: generatedBlockDesignIntentSchema,
12167
+ mediaIntent: generatedBlockMediaIntentSchema,
12168
+ boundaryIntent: generatedBoundaryIntentSchema
12169
+ }).strict();
12170
+ var generatedPageDesignIntentSchema = z25.object({
12171
+ siteStyleId: generatedSiteStyleIdSchema,
12172
+ blocks: z25.array(generatedPageDesignBlockIntentSchema)
12173
+ }).strict();
12174
+
12175
+ // ../theme-core/src/site-styles/pageDesignIntent.ts
12176
+ import { z as z26 } from "zod";
12177
+ var pageDesignIntentSchemaVersion = 1;
12178
+ var pageDesignUserPinnedAppearanceChoiceSchema = z26.object({
12179
+ kind: z26.literal("user-pinned"),
12180
+ value: z26.string().min(1).transform(asAppearancePresetId)
12181
+ }).strict();
12182
+ var pageDesignUserPinnedBoundaryChoiceSchema = z26.object({
12183
+ kind: z26.literal("user-pinned"),
12184
+ value: z26.string().min(1).transform(asBoundaryOptionId)
12185
+ }).strict();
12186
+ var pageDesignBlockLookPinSchema = z26.object({
12187
+ blockId: z26.string().min(1).transform(asDesignBlockId),
12188
+ blockKind: z26.string().min(1),
12189
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
12190
+ }).strict();
12191
+ var pageDesignBoundaryPinSchema = z26.object({
12192
+ boundaryId: z26.string().min(1).transform(asDesignBoundaryId),
12193
+ previousBlockId: z26.string().min(1).transform(asDesignBlockId),
12194
+ nextBlockId: z26.string().min(1).transform(asDesignBlockId),
12195
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
12196
+ }).strict().superRefine((pin, ctx) => {
12197
+ const expectedBoundaryId = makeBoundaryId(
12198
+ pin.previousBlockId,
12199
+ pin.nextBlockId
12200
+ );
12201
+ if (pin.boundaryId !== expectedBoundaryId) {
12202
+ ctx.addIssue({
12203
+ code: z26.ZodIssueCode.custom,
12204
+ path: ["boundaryId"],
12205
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
12206
+ });
12207
+ }
11979
12208
  });
11980
- var warmNeutralForest = definePaletteVariant({
11981
- id: "warm-neutral-forest",
11982
- name: "Warm Neutral \u2014 Forest",
11983
- description: "Deep forest green primary with earthy neutrals.",
11984
- tags: { tone: "classic", energy: "calm", era: "organic" },
11985
- mode: "light",
11986
- colors: [
11987
- { name: "primary", hex: "#3d5840" },
11988
- { name: "secondary", hex: "#7a6f5d" },
11989
- { name: "accent", hex: "#b06b50" },
11990
- { name: "success", hex: "#5a7a5d" },
11991
- { name: "warning", hex: "#b7791f" },
11992
- { name: "destructive", hex: "#b91c1c" },
11993
- { name: "background", hex: "#fbf8f0" },
11994
- { name: "surface", hex: "#ffffff" },
11995
- { name: "surfaceAlt", hex: "#f2ecdb" },
11996
- { name: "muted", hex: "#ebe3cc" },
11997
- { name: "text", hex: "#2a2a2a" },
11998
- { name: "primaryForeground", hex: "#fbf8f0" },
11999
- { name: "border", hex: "#cdc1a4" }
12000
- ]
12209
+ var pageDesignIntentV1Schema = z26.object({
12210
+ schemaVersion: z26.literal(pageDesignIntentSchemaVersion),
12211
+ siteStyleId: z26.string().min(1).transform(asSiteStyleId),
12212
+ pageFlowPresetId: z26.string().min(1).transform(asPageFlowPresetId),
12213
+ blockLookPins: z26.array(pageDesignBlockLookPinSchema),
12214
+ boundaryPins: z26.array(pageDesignBoundaryPinSchema)
12215
+ }).strict().superRefine((intent, ctx) => {
12216
+ addDuplicateStringIssues(ctx, {
12217
+ values: intent.blockLookPins.map((pin) => pin.blockId),
12218
+ path: ["blockLookPins"],
12219
+ label: "block Look pin"
12220
+ });
12221
+ addDuplicateStringIssues(ctx, {
12222
+ values: intent.boundaryPins.map(
12223
+ (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
12224
+ ),
12225
+ path: ["boundaryPins"],
12226
+ label: "boundary pin"
12227
+ });
12001
12228
  });
12002
-
12003
- // ../theme-core/src/palette/variants/index.ts
12004
- var paletteVariants = [
12005
- // Brand-led family
12006
- brandLedCool,
12007
- brandLedWarm,
12008
- brandLedJewel,
12009
- // Warm-neutral family
12010
- warmNeutralClay,
12011
- warmNeutralCream,
12012
- warmNeutralForest,
12013
- // High-contrast family
12014
- highContrastInk,
12015
- highContrastCharcoal,
12016
- highContrastMonochrome,
12017
- // Soft-natural family
12018
- softNaturalSage,
12019
- softNaturalStone,
12020
- softNaturalWatercolor
12021
- ];
12022
- var paletteVariantsById = new Map(
12023
- paletteVariants.map((v) => [v.id, v])
12024
- );
12229
+ function addDuplicateStringIssues(ctx, input) {
12230
+ const seen = /* @__PURE__ */ new Set();
12231
+ const duplicates = /* @__PURE__ */ new Set();
12232
+ for (const value of input.values) {
12233
+ if (seen.has(value)) {
12234
+ duplicates.add(value);
12235
+ }
12236
+ seen.add(value);
12237
+ }
12238
+ for (const duplicate of duplicates) {
12239
+ ctx.addIssue({
12240
+ code: z26.ZodIssueCode.custom,
12241
+ path: [...input.path],
12242
+ message: `Duplicate ${input.label}: ${duplicate}.`
12243
+ });
12244
+ }
12245
+ }
12246
+ function boundaryKey(previousBlockId, nextBlockId) {
12247
+ return makeBoundaryId(previousBlockId, nextBlockId);
12248
+ }
12025
12249
 
12026
12250
  // ../theme-core/src/site-styles/runtimeCompiler.ts
12027
12251
  function defineDesignRuntimeRules(rules) {
@@ -13366,7 +13590,8 @@ function ctaButton(opts) {
13366
13590
  },
13367
13591
  size: {
13368
13592
  $bind: {
13369
- from: sizePath
13593
+ from: sizePath,
13594
+ fallback: opts?.sizeFallback ?? "md"
13370
13595
  }
13371
13596
  },
13372
13597
  ...opts?.className ? { className: opts.className } : {},
@@ -16971,7 +17196,19 @@ var teamMemberFragment = defineFragment({
16971
17196
  bind("photo")
16972
17197
  )
16973
17198
  ]),
16974
- text({ as: "h3" }, bind("name")),
17199
+ link(
17200
+ {
17201
+ href: { $bind: { from: "profilePath" } },
17202
+ className: "rb-team-member-name-link"
17203
+ },
17204
+ [text({ as: "h3" }, bind("name"))],
17205
+ when("profilePath")
17206
+ ),
17207
+ text(
17208
+ { as: "h3" },
17209
+ when("profilePath", { not: true }),
17210
+ bind("name")
17211
+ ),
16975
17212
  text({ as: "p", className: "rb-team-member-role" }, when("role"), bind("role")),
16976
17213
  richText(
16977
17214
  { className: "rb-prose rb-max-w-none" },
@@ -19406,14 +19643,16 @@ var headerCta = ctaButton({
19406
19643
  whenPath: "menu.ctaItem.label",
19407
19644
  variantPath: "menu.ctaItem.variant",
19408
19645
  linkPath: "menu.ctaItem.link",
19409
- className: `header-cta btn-sm ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
19646
+ sizeFallback: "sm",
19647
+ className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
19410
19648
  });
19411
19649
  var mobileCta = ctaButton({
19412
19650
  basePath: "menu.ctaItem",
19413
19651
  whenPath: "menu.ctaItem.label",
19414
19652
  variantPath: "menu.ctaItem.variant",
19415
19653
  linkPath: "menu.ctaItem.link",
19416
- className: "nav-mobile-cta btn-md rb-w-full"
19654
+ sizeFallback: "md",
19655
+ className: "nav-mobile-cta rb-w-full"
19417
19656
  });
19418
19657
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
19419
19658
  {
@@ -21263,7 +21502,9 @@ var courseSessionSchema = z42.object({
21263
21502
  var courseTeamMemberSummarySchema = z42.object({
21264
21503
  id: z42.string(),
21265
21504
  name: z42.string(),
21266
- summary: z42.string().nullable()
21505
+ roleLabel: z42.string().nullable(),
21506
+ summary: z42.string().nullable(),
21507
+ profilePath: z42.string().nullable()
21267
21508
  });
21268
21509
  var coursePricingOptionSchema = z42.object({
21269
21510
  id: z42.string(),
@@ -21368,7 +21609,9 @@ var publicEventTicketTypeSchema = z43.object({
21368
21609
  var publicTeamMemberSummarySchema = z43.object({
21369
21610
  id: z43.string(),
21370
21611
  name: z43.string(),
21371
- summary: z43.string().nullable()
21612
+ roleLabel: z43.string().nullable(),
21613
+ summary: z43.string().nullable(),
21614
+ profilePath: z43.string().nullable()
21372
21615
  });
21373
21616
  var publicEventSchema = z43.object({
21374
21617
  kind: z43.enum(["event", "course_session"]).optional(),
@@ -27215,7 +27458,25 @@ var newsletterSignupBlockDefinition = {
27215
27458
  };
27216
27459
 
27217
27460
  // ../blocks/src/system/blocks/team-members.ts
27461
+ import { z as z61 } from "zod";
27218
27462
  var ITEM_NAME2 = "member";
27463
+ var teamMemberPhotoSchema = mediaSchema2.refine((media2) => media2.type === "image", {
27464
+ message: "Team member photos must be image media"
27465
+ }).nullable();
27466
+ var teamMemberDataSchema = z61.object({
27467
+ _type: z61.literal("teamMember"),
27468
+ id: z61.string(),
27469
+ name: z61.string(),
27470
+ role: z61.string().nullable(),
27471
+ roleLabel: z61.string().nullable(),
27472
+ bio: z61.string().nullable(),
27473
+ summary: z61.string().nullable(),
27474
+ photo: teamMemberPhotoSchema,
27475
+ profilePath: z61.string().nullable()
27476
+ });
27477
+ var teamMembersDataSchema = z61.array(teamMemberDataSchema);
27478
+ var dynamicSourceWhen = { equals: "site_staff" };
27479
+ var manualSourceWhen = { equals: "site_staff", not: true };
27219
27480
  var headingNode = text(
27220
27481
  { as: "h2" },
27221
27482
  bind("content.heading"),
@@ -27305,7 +27566,15 @@ var teamMemberStackLayout = el(
27305
27566
  ]
27306
27567
  ),
27307
27568
  stack({ gap: "sm", className: "rb-team-member-body rb-flex-1 rb-min-w-0" }, [
27308
- text({ as: "h3" }, bind("name")),
27569
+ link(
27570
+ {
27571
+ href: { $bind: { from: "profilePath" } },
27572
+ className: "rb-team-member-name-link"
27573
+ },
27574
+ [text({ as: "h3" }, bind("name"))],
27575
+ when("profilePath")
27576
+ ),
27577
+ text({ as: "h3" }, when("profilePath", { not: true }), bind("name")),
27309
27578
  text(
27310
27579
  { as: "p", className: "rb-team-member-role" },
27311
27580
  when("role"),
@@ -27319,12 +27588,18 @@ var teamMemberStackLayout = el(
27319
27588
  ])
27320
27589
  ]
27321
27590
  );
27322
- var gridMembersNode = repeaterFragmentLayout({
27591
+ var manualGridMembersNode = when("content.source", manualSourceWhen)(repeaterFragmentLayout({
27323
27592
  collectionPath: "content.members",
27324
27593
  itemName: ITEM_NAME2,
27325
27594
  fragments: { teamMember: teamMemberFragment },
27326
27595
  itemGap: "sm"
27327
- });
27596
+ }));
27597
+ var dynamicGridMembersNode = when("content.source", dynamicSourceWhen)(repeaterFragmentLayout({
27598
+ collectionPath: "data.members",
27599
+ itemName: ITEM_NAME2,
27600
+ fragments: { teamMember: teamMemberFragment },
27601
+ itemGap: "sm"
27602
+ }));
27328
27603
  var gridVariant = wrapVariant3(
27329
27604
  el(
27330
27605
  "grid",
@@ -27338,22 +27613,29 @@ var gridVariant = wrapVariant3(
27338
27613
  },
27339
27614
  gap: { $bind: { from: "content.gap", fallback: "medium" } }
27340
27615
  },
27341
- [gridMembersNode]
27616
+ [manualGridMembersNode, dynamicGridMembersNode]
27342
27617
  )
27343
27618
  );
27344
- var stackMembersNode = repeaterFragmentLayout({
27619
+ var manualStackMembersNode = when("content.source", manualSourceWhen)(repeaterFragmentLayout({
27345
27620
  collectionPath: "content.members",
27346
27621
  itemName: ITEM_NAME2,
27347
27622
  fragments: { teamMember: teamMemberFragment },
27348
27623
  layoutOverrides: { teamMember: teamMemberStackLayout },
27349
27624
  itemGap: "sm"
27350
- });
27625
+ }));
27626
+ var dynamicStackMembersNode = when("content.source", dynamicSourceWhen)(repeaterFragmentLayout({
27627
+ collectionPath: "data.members",
27628
+ itemName: ITEM_NAME2,
27629
+ fragments: { teamMember: teamMemberFragment },
27630
+ layoutOverrides: { teamMember: teamMemberStackLayout },
27631
+ itemGap: "sm"
27632
+ }));
27351
27633
  var stackVariant = wrapVariant3({
27352
27634
  type: "stack",
27353
27635
  props: {
27354
27636
  gap: { $bind: { from: "content.gap", fallback: "medium" } }
27355
27637
  },
27356
- children: [stackMembersNode]
27638
+ children: [manualStackMembersNode, dynamicStackMembersNode]
27357
27639
  });
27358
27640
  var teamMembersManifest = createBlockManifest({
27359
27641
  id: "block.team-members",
@@ -27368,6 +27650,18 @@ var teamMembersManifest = createBlockManifest({
27368
27650
  required: false,
27369
27651
  maxLength: 120
27370
27652
  }),
27653
+ parseFieldDefinition({
27654
+ id: "source",
27655
+ type: "select",
27656
+ label: "Team members",
27657
+ description: "Choose whether to use the site-wide team or a hand-picked list.",
27658
+ defaultValue: "manual",
27659
+ options: [
27660
+ { value: "manual", label: "Choose manually" },
27661
+ { value: "site_staff", label: "Use all site team members" }
27662
+ ],
27663
+ ui: { intent: "behavior" }
27664
+ }),
27371
27665
  parseFieldDefinition({
27372
27666
  id: "layoutAlign",
27373
27667
  type: "select",
@@ -27470,18 +27764,24 @@ var teamMembersManifest = createBlockManifest({
27470
27764
  ],
27471
27765
  ui: { intent: "display" }
27472
27766
  }),
27473
- fragmentsToRepeaterField(
27474
- "members",
27475
- "Team members",
27476
- { teamMember: teamMemberFragment },
27477
- {
27478
- minItems: 0,
27479
- maxItems: 50,
27480
- itemLabel: "Team member",
27481
- itemLabelSource: "name",
27482
- description: "Add people to this section."
27767
+ {
27768
+ ...fragmentsToRepeaterField(
27769
+ "members",
27770
+ "Team members",
27771
+ { teamMember: teamMemberFragment },
27772
+ {
27773
+ minItems: 0,
27774
+ maxItems: 50,
27775
+ itemLabel: "Team member",
27776
+ itemLabelSource: "name",
27777
+ description: "Add people to this section."
27778
+ }
27779
+ ),
27780
+ ui: {
27781
+ intent: "content",
27782
+ visibleWhen: { field: "source", equals: "manual" }
27483
27783
  }
27484
- )
27784
+ }
27485
27785
  ],
27486
27786
  layout: gridVariant,
27487
27787
  variants: {
@@ -27507,7 +27807,20 @@ var teamMembersManifest = createBlockManifest({
27507
27807
  styleTokens: { spacing: "lg" }
27508
27808
  });
27509
27809
  var teamMembersBlockDefinition = {
27510
- manifest: teamMembersManifest
27810
+ manifest: teamMembersManifest,
27811
+ dataSchemas: {
27812
+ members: teamMembersDataSchema
27813
+ },
27814
+ dataLoaders: {
27815
+ members: {
27816
+ endpoint: "listPublicTeamMembers",
27817
+ params: {
27818
+ siteId: { $bind: { from: "$root.siteId" } },
27819
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } }
27820
+ },
27821
+ mode: "server"
27822
+ }
27823
+ }
27511
27824
  };
27512
27825
 
27513
27826
  // ../blocks/src/system/runtime/nodes/location-map.shared.ts
@@ -28987,6 +29300,7 @@ function coercePayload(payload) {
28987
29300
  if ("form" in record && typeof record.form !== "function") return record.form;
28988
29301
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
28989
29302
  if ("services" in record && typeof record.services !== "function") return record.services;
29303
+ if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
28990
29304
  }
28991
29305
  return payload;
28992
29306
  }
@@ -29108,6 +29422,10 @@ function normalizeLoaderParams(endpoint, params, context) {
29108
29422
  ensureSiteId(out, context);
29109
29423
  return out;
29110
29424
  }
29425
+ if (endpoint === "listPublicTeamMembers") {
29426
+ ensureSiteId(out, context);
29427
+ return out;
29428
+ }
29111
29429
  if (endpoint === "getPublishedEntryPreview") {
29112
29430
  ensureSiteId(out, context);
29113
29431
  return out;
@@ -29122,6 +29440,7 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
29122
29440
  "getPublishedEntryPreview",
29123
29441
  "listPublicEvents",
29124
29442
  "listPublicCourses",
29443
+ "listPublicTeamMembers",
29125
29444
  "listPublicProducts",
29126
29445
  "listPublicPasses",
29127
29446
  "listPublicMemberships",
@@ -29286,6 +29605,16 @@ async function prefetchBlockData2(page, context, client, options) {
29286
29605
  const parsedLimit = typeof limit === "string" ? Number.parseInt(limit, 10) : typeof limit === "number" ? limit : void 0;
29287
29606
  return await client.listPublicCourses({ siteId, limit: parsedLimit, stage });
29288
29607
  }
29608
+ case "listPublicTeamMembers": {
29609
+ const { siteId, stage } = resolvedParams ?? {};
29610
+ if (!siteId) {
29611
+ throw new Error("listPublicTeamMembers requires siteId param");
29612
+ }
29613
+ return await client.listPublicTeamMembers({
29614
+ siteId,
29615
+ stage: typeof stage === "string" ? stage : void 0
29616
+ });
29617
+ }
29289
29618
  case "listPublicProducts": {
29290
29619
  const { siteId, stage, categorySelector } = resolvedParams ?? {};
29291
29620
  if (!siteId) {