@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
@@ -857,13 +857,150 @@ var ENDPOINT_DEFINITIONS = {
857
857
  "server:internal_error"
858
858
  ]
859
859
  },
860
- deleteAppointmentResource: {
860
+ removeAppointmentResource: {
861
861
  path: "/sites/{siteId}/bookings/resources/{resourceId}",
862
862
  method: "DELETE",
863
863
  auth: "user",
864
864
  responseKind: "json",
865
865
  errors: ["resource:not_found", "server:internal_error"]
866
866
  },
867
+ createTeamMemberProfile: {
868
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile",
869
+ method: "POST",
870
+ auth: "user",
871
+ responseKind: "json",
872
+ errors: [
873
+ "validation:invalid_input",
874
+ "resource:not_found",
875
+ "resource:conflict",
876
+ "server:internal_error"
877
+ ]
878
+ },
879
+ updateTeamMemberProfilePolicy: {
880
+ path: "/sites/{siteId}/bookings/resources/profile-policy",
881
+ method: "PUT",
882
+ auth: "user",
883
+ responseKind: "json",
884
+ errors: ["validation:invalid_input", "server:internal_error"]
885
+ },
886
+ updateTeamMemberProfileContent: {
887
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/content",
888
+ method: "PUT",
889
+ tags: [
890
+ "site-{siteId}",
891
+ "content-{siteId}-team-member",
892
+ "content-entry-{entryId}"
893
+ ],
894
+ auth: "user",
895
+ responseKind: "json",
896
+ errors: [
897
+ "validation:invalid_input",
898
+ "resource:not_found",
899
+ "resource:conflict",
900
+ "server:internal_error"
901
+ ]
902
+ },
903
+ publishTeamMemberProfile: {
904
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/publish",
905
+ method: "POST",
906
+ tags: [
907
+ "site-{siteId}",
908
+ "content-{siteId}-team-member",
909
+ "content-entry-{entryId}"
910
+ ],
911
+ auth: "user",
912
+ responseKind: "json",
913
+ errors: [
914
+ "validation:invalid_input",
915
+ "resource:not_found",
916
+ "server:internal_error"
917
+ ]
918
+ },
919
+ discardTeamMemberProfileDraft: {
920
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/discard",
921
+ method: "POST",
922
+ tags: [
923
+ "site-{siteId}",
924
+ "content-{siteId}-team-member",
925
+ "content-entry-{entryId}"
926
+ ],
927
+ auth: "user",
928
+ responseKind: "json",
929
+ errors: [
930
+ "validation:invalid_input",
931
+ "resource:not_found",
932
+ "resource:conflict",
933
+ "server:internal_error"
934
+ ]
935
+ },
936
+ unpublishTeamMemberProfile: {
937
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/unpublish",
938
+ method: "POST",
939
+ tags: [
940
+ "site-{siteId}",
941
+ "content-{siteId}-team-member",
942
+ "content-entry-{entryId}"
943
+ ],
944
+ auth: "user",
945
+ responseKind: "json",
946
+ errors: [
947
+ "validation:invalid_input",
948
+ "resource:not_found",
949
+ "resource:conflict",
950
+ "server:internal_error"
951
+ ]
952
+ },
953
+ scheduleTeamMemberProfile: {
954
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/schedule",
955
+ method: "POST",
956
+ tags: [
957
+ "site-{siteId}",
958
+ "content-{siteId}-team-member",
959
+ "content-entry-{entryId}"
960
+ ],
961
+ auth: "user",
962
+ responseKind: "json",
963
+ errors: [
964
+ "validation:invalid_input",
965
+ "resource:not_found",
966
+ "resource:conflict",
967
+ "server:internal_error"
968
+ ]
969
+ },
970
+ cancelScheduledTeamMemberProfile: {
971
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/{entryId}/schedule",
972
+ method: "DELETE",
973
+ tags: [
974
+ "site-{siteId}",
975
+ "content-{siteId}-team-member",
976
+ "content-entry-{entryId}"
977
+ ],
978
+ auth: "user",
979
+ responseKind: "json",
980
+ errors: [
981
+ "validation:invalid_input",
982
+ "resource:not_found",
983
+ "resource:conflict",
984
+ "server:internal_error"
985
+ ]
986
+ },
987
+ updateTeamMemberProfileRouteMetadata: {
988
+ path: "/sites/{siteId}/bookings/resources/{resourceId}/profile/routes/{routeId}/metadata",
989
+ method: "PATCH",
990
+ tags: [
991
+ TAG_TEMPLATES.siteCollection,
992
+ TAG_TEMPLATES.siteRoutableContent,
993
+ TAG_TEMPLATES.routeById
994
+ ],
995
+ auth: "user",
996
+ responseKind: "json",
997
+ errors: [
998
+ "validation:invalid_input",
999
+ "resource:not_found",
1000
+ "resource:conflict",
1001
+ "server:internal_error"
1002
+ ]
1003
+ },
867
1004
  listAppointmentServices: {
868
1005
  path: "/sites/{siteId}/bookings/services",
869
1006
  method: "GET",
@@ -3237,6 +3374,15 @@ var ENDPOINT_DEFINITIONS = {
3237
3374
  auth: "public",
3238
3375
  responseKind: "json"
3239
3376
  },
3377
+ listPublicTeamMembers: {
3378
+ path: "/public/sites/{siteId}/team-members",
3379
+ method: "GET",
3380
+ revalidate: 60,
3381
+ tags: ["public-team-members-{siteId}"],
3382
+ errors: [],
3383
+ auth: "public",
3384
+ responseKind: "json"
3385
+ },
3240
3386
  getPublicCourse: {
3241
3387
  path: "/public/sites/{siteId}/courses/{courseId}",
3242
3388
  method: "GET",
@@ -6433,6 +6579,7 @@ var SUPPORTED_LOADER_ENDPOINTS = [
6433
6579
  "listPublicEvents",
6434
6580
  "getPublicEventDetails",
6435
6581
  "listPublicCourses",
6582
+ "listPublicTeamMembers",
6436
6583
  "listPublicProducts",
6437
6584
  "listPublicPasses",
6438
6585
  "listPublicMemberships",
@@ -7684,861 +7831,569 @@ function assertUniqueLayoutProfileKeys(profiles) {
7684
7831
  }
7685
7832
  }
7686
7833
 
7687
- // ../theme-core/src/site-styles/compatibility.ts
7834
+ // ../theme-core/src/buttons/personalities/types.ts
7835
+ import { z as z11 } from "zod";
7836
+
7837
+ // ../theme-core/src/buttons/types.ts
7688
7838
  import { z as z9 } from "zod";
7839
+ var VARIANT_ROLES = [
7840
+ "primary",
7841
+ "secondary",
7842
+ "outline",
7843
+ "ghost",
7844
+ "link",
7845
+ "tertiary",
7846
+ "accent"
7847
+ ];
7848
+ var cornerStyleSchema = z9.enum(["square", "rounded", "pill"]);
7849
+ var shadowSizeSchema = z9.enum(["none", "low", "medium", "high"]);
7850
+ var textTransformSchema = z9.enum(["none", "uppercase", "lowercase", "capitalize"]);
7851
+ var fontWeightSchema = z9.union([z9.literal(500), z9.literal(600), z9.literal(700)]);
7852
+ var buttonTypographySchema = z9.enum(["body", "heading"]);
7853
+ var letterSpacingSchema = z9.enum(["tight", "normal", "loose"]);
7854
+ var hoverTransformSchema = z9.enum(["none", "lift", "scale", "press"]);
7855
+ var hoverColorSchema = z9.enum(["none", "brighten", "darken", "saturate", "token"]);
7856
+ var buttonPaddingPresetSchema = z9.enum(["compact", "default", "spacious"]);
7857
+ var gradientStyleSchema = z9.enum(["linear", "radial", "conic"]);
7858
+ var gradientSharpnessSchema = z9.enum(["smooth", "medium", "hard"]);
7859
+ var prioritySchema = z9.union([z9.literal(1), z9.literal(2), z9.literal(3)]);
7860
+ var variantRoleSchema = z9.enum(VARIANT_ROLES);
7861
+ var buttonSizeNameSchema = z9.enum(["sm", "md", "lg", "xl"]);
7862
+ var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
7863
+ var paddingShorthandSchema = z9.string().refine(
7864
+ (value) => {
7865
+ const parts = value.split(/\s+/).filter(Boolean);
7866
+ return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
7867
+ },
7868
+ {
7869
+ message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
7870
+ }
7871
+ );
7872
+ var buttonSizeConfigSchema = z9.object({
7873
+ padding: paddingShorthandSchema,
7874
+ fontSize: z9.string().optional()
7875
+ });
7876
+ var buttonSizesSchema = z9.object({
7877
+ sm: buttonSizeConfigSchema,
7878
+ md: buttonSizeConfigSchema,
7879
+ lg: buttonSizeConfigSchema,
7880
+ xl: buttonSizeConfigSchema.optional()
7881
+ }).transform(({ sm, md, lg, xl }) => ({
7882
+ sm,
7883
+ md,
7884
+ lg,
7885
+ xl: xl ?? lg
7886
+ }));
7887
+ var buttonGlobalSettingsSchema = z9.object({
7888
+ cornerStyle: cornerStyleSchema,
7889
+ cornerRadius: z9.number().min(0).max(24).optional(),
7890
+ shadow: shadowSizeSchema,
7891
+ textTransform: textTransformSchema,
7892
+ fontWeight: fontWeightSchema,
7893
+ /**
7894
+ * @deprecated Set per-variant via `variant.border.widthClass` instead.
7895
+ * Schema field is preserved so existing presets parse; the value is unread
7896
+ * by the current generator and will be removed once the legacy
7897
+ * `primitives/content/components/Button.tsx` slot exports are deleted.
7898
+ */
7899
+ borderWidth: z9.union([z9.literal(1), z9.literal(2), z9.literal(3)]),
7900
+ // === Family-level typography ===
7901
+ // Typography source (body or heading) — selects which theme typography pool to inherit
7902
+ typography: buttonTypographySchema.optional(),
7903
+ // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
7904
+ // Sized variants get this as default; fixed variants inherit unless they override.
7905
+ // Size class CSS may still override at run time for sized variants.
7906
+ fontSize: z9.string().optional(),
7907
+ // Letter spacing applied to all variants
7908
+ letterSpacing: letterSpacingSchema.optional(),
7909
+ // Italic style
7910
+ italic: z9.boolean().optional(),
7911
+ // Padding preset (applies to sized variants without a sizes config)
7912
+ paddingPreset: buttonPaddingPresetSchema.optional(),
7913
+ hoverTransform: hoverTransformSchema,
7914
+ hoverColor: hoverColorSchema,
7915
+ // When hoverColor is 'token', this specifies which token to use
7916
+ hoverColorToken: z9.string().optional(),
7917
+ // Gradient settings (if any variant uses gradients)
7918
+ gradientStyle: gradientStyleSchema.optional(),
7919
+ gradientAngle: z9.number().min(0).max(360).optional(),
7920
+ gradientSharpness: gradientSharpnessSchema.optional()
7921
+ });
7922
+ var gradientDirectionSchema = z9.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
7923
+ var buttonBackgroundSchema = z9.discriminatedUnion("type", [
7924
+ z9.object({ type: z9.literal("solid"), colorToken: z9.string() }),
7925
+ z9.object({
7926
+ type: z9.literal("gradient"),
7927
+ stops: z9.array(z9.string()).min(2),
7928
+ direction: gradientDirectionSchema
7929
+ }),
7930
+ z9.object({ type: z9.literal("transparent") })
7931
+ ]);
7932
+ var effectApplicationSchema = z9.object({
7933
+ effectId: z9.string(),
7934
+ options: z9.record(z9.string(), z9.any()).optional()
7935
+ });
7936
+ var buttonBorderSchema = z9.object({
7937
+ widthClass: z9.string(),
7938
+ colorToken: z9.string()
7939
+ });
7940
+ var variantShadowSchema = z9.object({
7941
+ elevation: z9.enum(["none", "low", "medium", "high"]),
7942
+ softness: z9.enum(["crisp", "soft", "hard"]).nullable(),
7943
+ position: z9.enum(["bottom", "bottom-right"]).default("bottom")
7944
+ });
7945
+ var variantEffectsSchema = z9.object({
7946
+ base: z9.array(effectApplicationSchema).optional(),
7947
+ hover: z9.array(effectApplicationSchema).optional(),
7948
+ active: z9.array(effectApplicationSchema).optional(),
7949
+ focus: z9.array(effectApplicationSchema).optional()
7950
+ });
7951
+ var variantSizeOverridesSchema = z9.object({
7952
+ sm: buttonSizeConfigSchema.optional(),
7953
+ md: buttonSizeConfigSchema.optional(),
7954
+ lg: buttonSizeConfigSchema.optional(),
7955
+ xl: buttonSizeConfigSchema.optional()
7956
+ });
7957
+ var buttonVariantSchema = z9.object({
7958
+ id: z9.string(),
7959
+ name: z9.string().min(1).max(20),
7960
+ enabled: z9.boolean(),
7961
+ priority: prioritySchema,
7962
+ // Base appearance (token-based)
7963
+ background: buttonBackgroundSchema,
7964
+ textColorToken: z9.string(),
7965
+ /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
7966
+ borderRadius: z9.string().optional(),
7967
+ // Optional shadow override (uses theme.shadow if not specified)
7968
+ shadow: variantShadowSchema.optional(),
7969
+ // Border (optional)
7970
+ border: buttonBorderSchema.optional(),
7971
+ // Hover background token (per-variant override, takes precedence over global hoverColorToken)
7972
+ hoverBackgroundToken: z9.string().optional(),
7973
+ // Effect composition
7974
+ effects: variantEffectsSchema.optional(),
7975
+ // Per-variant size overrides — see VariantSizeOverrides
7976
+ sizes: variantSizeOverridesSchema.optional()
7977
+ });
7978
+ var buttonSystemSchema = z9.object({
7979
+ global: buttonGlobalSettingsSchema,
7980
+ variants: z9.array(buttonVariantSchema).min(1).max(6),
7981
+ sizes: buttonSizesSchema.optional()
7982
+ });
7983
+
7984
+ // ../theme-core/src/site-styles/styleTags.ts
7985
+ import { z as z10 } from "zod";
7689
7986
  var STYLE_AXIS_VALUES = {
7690
7987
  tone: ["minimal", "classic", "bold"],
7691
7988
  energy: ["calm", "vibrant"],
7692
7989
  motion: ["subtle", "standard", "expressive"],
7693
7990
  era: ["editorial", "modern", "organic", "technical", "retro"]
7694
7991
  };
7695
- var styleTagsSchema = z9.object({
7696
- tone: z9.enum(STYLE_AXIS_VALUES.tone).optional(),
7697
- energy: z9.enum(STYLE_AXIS_VALUES.energy).optional(),
7698
- motion: z9.enum(STYLE_AXIS_VALUES.motion).optional(),
7699
- era: z9.enum(STYLE_AXIS_VALUES.era).optional()
7992
+ var styleTagsSchema = z10.object({
7993
+ tone: z10.enum(STYLE_AXIS_VALUES.tone).optional(),
7994
+ energy: z10.enum(STYLE_AXIS_VALUES.energy).optional(),
7995
+ motion: z10.enum(STYLE_AXIS_VALUES.motion).optional(),
7996
+ era: z10.enum(STYLE_AXIS_VALUES.era).optional()
7700
7997
  });
7701
7998
 
7702
- // ../theme-core/src/site-styles/sourceCatalogs.ts
7703
- var generatedContentFrames = [
7704
- plainFrame,
7705
- panelFrame("inset"),
7706
- panelFrame("raised"),
7707
- flushPanelFrame({ bleed: "start" })
7708
- ];
7709
- var userContentFrames = [
7710
- ...generatedContentFrames,
7711
- panelFrame("editorial"),
7712
- flushPanelFrame({ bleed: "end" }),
7713
- flushPanelFrame({ bleed: "both" })
7714
- ];
7715
- var generatedDesignOptionCatalog = {
7716
- source: "generated",
7717
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
7718
- contentFrames: generatedContentFrames,
7719
- itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
7720
- transitions: ["none", "soft-fade-short", "soft-fade-long"],
7721
- emphases: ["low", "medium", "high"],
7722
- detachedCustom: false
7723
- };
7724
- var userDesignOptionCatalog = {
7725
- source: "user",
7726
- sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
7727
- contentFrames: userContentFrames,
7728
- itemSurfaces: [
7729
- ...generatedDesignOptionCatalog.itemSurfaces,
7730
- "inset",
7731
- "editorial"
7732
- ],
7733
- transitions: [
7734
- ...generatedDesignOptionCatalog.transitions,
7735
- "wave-edge",
7736
- "angle-edge"
7737
- ],
7738
- emphases: generatedDesignOptionCatalog.emphases,
7739
- detachedCustom: false
7740
- };
7741
- var advancedDesignOptionCatalog = {
7742
- source: "advanced",
7743
- sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
7744
- contentFrames: userDesignOptionCatalog.contentFrames,
7745
- itemSurfaces: userDesignOptionCatalog.itemSurfaces,
7746
- transitions: userDesignOptionCatalog.transitions,
7747
- emphases: userDesignOptionCatalog.emphases,
7748
- detachedCustom: true
7749
- };
7750
-
7751
- // ../theme-core/src/site-styles/curatedSiteStyles.ts
7752
- var curatedSiteStyleIdValues = [
7753
- "site-style:calm-studio",
7754
- "site-style:clear-professional",
7755
- "site-style:warm-editorial",
7756
- "site-style:bright-community",
7757
- "site-style:quiet-luxury",
7758
- "site-style:practical-services",
7759
- "site-style:modern-wellness",
7760
- "site-style:bold-launch"
7761
- ];
7762
- var quietBudget = {
7763
- accentDensity: "low",
7764
- panelDensity: "medium",
7765
- transitionMix: "quiet",
7766
- primaryCtaLimit: 2,
7767
- mediaDensity: "medium",
7768
- decorativeRepetition: "low"
7769
- };
7770
- var balancedBudget = {
7771
- accentDensity: "medium",
7772
- panelDensity: "medium",
7773
- transitionMix: "balanced",
7774
- primaryCtaLimit: 3,
7775
- mediaDensity: "medium",
7776
- decorativeRepetition: "medium"
7777
- };
7778
- var expressiveBudget = {
7779
- accentDensity: "high",
7780
- panelDensity: "high",
7781
- transitionMix: "expressive",
7782
- primaryCtaLimit: 3,
7783
- mediaDensity: "high",
7784
- decorativeRepetition: "medium"
7785
- };
7786
- function uniqueContentFrameKinds() {
7787
- const kinds = [...new Set(
7788
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
7789
- )];
7790
- const firstKind = kinds[0];
7791
- if (!firstKind) {
7792
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
7999
+ // ../theme-core/src/buttons/personalities/types.ts
8000
+ function asButtonPersonalityId(value) {
8001
+ if (value.length === 0) {
8002
+ throw new Error("ButtonPersonalityId must be a non-empty string");
7793
8003
  }
7794
- return [firstKind, ...kinds.slice(1)];
8004
+ return value;
7795
8005
  }
7796
- var generatedContentFrameKinds = uniqueContentFrameKinds();
7797
- function defineCuratedSiteStyle(input) {
8006
+ var buttonPersonalityIdSchema = z11.string().min(1).transform((value) => asButtonPersonalityId(value));
8007
+ var buttonPersonalitySchema = z11.object({
8008
+ id: buttonPersonalityIdSchema,
8009
+ name: z11.string().min(1),
8010
+ description: z11.string().min(1),
8011
+ tags: styleTagsSchema,
8012
+ buttonSystem: buttonSystemSchema
8013
+ });
8014
+ function defineButtonPersonality(input) {
7798
8015
  return {
7799
- id: asSiteStyleId(input.id),
8016
+ id: asButtonPersonalityId(input.id),
7800
8017
  name: input.name,
7801
8018
  description: input.description,
7802
- generationBrief: input.generationBrief,
7803
- selectionKeywords: input.selectionKeywords ?? [],
7804
- template: {
7805
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
7806
- name: input.name,
7807
- version: 1,
7808
- tokenRecipes: input.tokenRecipes,
7809
- compositionBudget: input.compositionBudget,
7810
- supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
7811
- supportedContentFrames: generatedContentFrameKinds,
7812
- supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
7813
- supportedTransitions: generatedDesignOptionCatalog.transitions
7814
- },
7815
- // The library IDs are already branded at construction (`asButtonPersonalityId`
7816
- // / `asPaletteVariantId`); the closed-union input type guarantees only
7817
- // shipped IDs reach this branch.
7818
- defaultButtonPersonalityId: input.defaultButtonPersonalityId,
7819
- acceptedButtons: input.acceptedButtons,
7820
- defaultPaletteVariantId: input.defaultPaletteVariantId,
7821
- acceptedPalettes: input.acceptedPalettes
8019
+ tags: input.tags,
8020
+ buttonSystem: input.buttonSystem
7822
8021
  };
7823
8022
  }
7824
- var curatedSiteStyles = [
7825
- defineCuratedSiteStyle({
7826
- id: "site-style:calm-studio",
7827
- name: "Calm Studio",
7828
- description: "Soft, measured, and spacious for intimate appointment or class businesses.",
7829
- generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
7830
- tokenRecipes: {
7831
- palette: "soft-natural",
7832
- contrast: "standard",
7833
- radius: "soft",
7834
- shadow: "subtle",
7835
- typography: "friendly-sans",
7836
- spacing: "airy",
7837
- motion: "subtle"
7838
- },
7839
- compositionBudget: quietBudget,
7840
- defaultButtonPersonalityId: "soft-pill",
7841
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "editorial"] },
7842
- defaultPaletteVariantId: "soft-natural-sage",
7843
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
7844
- }),
7845
- defineCuratedSiteStyle({
7846
- id: "site-style:clear-professional",
7847
- name: "Clear Professional",
7848
- description: "Crisp, trustworthy, and direct for local services and consultancies.",
7849
- generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
7850
- tokenRecipes: {
7851
- palette: "brand-led",
7852
- contrast: "strong",
7853
- radius: "soft",
7854
- shadow: "subtle",
7855
- typography: "clean-sans",
7856
- spacing: "regular",
7857
- motion: "subtle"
8023
+
8024
+ // ../theme-core/src/buttons/personalities/brushed-wash.ts
8025
+ var brushedWash = defineButtonPersonality({
8026
+ id: "brushed-wash",
8027
+ name: "Brushed Wash",
8028
+ description: "Watercolour-gradient buttons with soft shadows and generous padding.",
8029
+ tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
8030
+ buttonSystem: {
8031
+ global: {
8032
+ cornerStyle: "rounded",
8033
+ shadow: "low",
8034
+ textTransform: "none",
8035
+ fontWeight: 500,
8036
+ borderWidth: 1,
8037
+ hoverTransform: "none",
8038
+ hoverColor: "none"
7858
8039
  },
7859
- compositionBudget: balancedBudget,
7860
- defaultButtonPersonalityId: "confident-chip",
7861
- acceptedButtons: { tone: ["minimal", "classic"], era: ["modern", "editorial"] },
7862
- defaultPaletteVariantId: "brand-led-cool",
7863
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["modern", "editorial"] }
7864
- }),
7865
- defineCuratedSiteStyle({
7866
- id: "site-style:warm-editorial",
7867
- name: "Warm Editorial",
7868
- description: "Story-led and textured for educators, makers, venues, and retreats.",
7869
- generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
7870
- tokenRecipes: {
7871
- palette: "warm-neutral",
7872
- contrast: "standard",
7873
- radius: "square",
7874
- shadow: "none",
7875
- typography: "serif-editorial",
7876
- spacing: "airy",
7877
- motion: "subtle"
8040
+ sizes: {
8041
+ sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
8042
+ md: { padding: "1rem 2.5rem" },
8043
+ lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
8044
+ xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
7878
8045
  },
7879
- compositionBudget: balancedBudget,
7880
- defaultButtonPersonalityId: "editorial-link",
7881
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
7882
- defaultPaletteVariantId: "warm-neutral-cream",
7883
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
7884
- }),
7885
- defineCuratedSiteStyle({
7886
- id: "site-style:bright-community",
7887
- name: "Bright Community",
7888
- description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
7889
- generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
7890
- tokenRecipes: {
7891
- palette: "brand-led",
7892
- contrast: "standard",
7893
- radius: "rounded",
7894
- shadow: "subtle",
7895
- typography: "friendly-sans",
7896
- spacing: "regular",
7897
- motion: "expressive"
8046
+ variants: [
8047
+ {
8048
+ id: "primary",
8049
+ name: "Primary",
8050
+ enabled: true,
8051
+ priority: 1,
8052
+ background: {
8053
+ type: "gradient",
8054
+ stops: ["primary", "accent"],
8055
+ direction: "to-r"
8056
+ },
8057
+ textColorToken: "primaryForeground",
8058
+ borderRadius: "rounded-lg",
8059
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8060
+ effects: {
8061
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8062
+ }
8063
+ },
8064
+ {
8065
+ id: "secondary",
8066
+ name: "Secondary",
8067
+ enabled: true,
8068
+ priority: 2,
8069
+ background: {
8070
+ type: "gradient",
8071
+ stops: ["secondary", "accent"],
8072
+ direction: "to-br"
8073
+ },
8074
+ textColorToken: "primaryForeground",
8075
+ borderRadius: "rounded-lg",
8076
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8077
+ effects: {
8078
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8079
+ }
8080
+ },
8081
+ {
8082
+ id: "outline",
8083
+ name: "Outline",
8084
+ enabled: true,
8085
+ priority: 3,
8086
+ background: { type: "transparent" },
8087
+ textColorToken: "primary",
8088
+ borderRadius: "rounded-lg",
8089
+ border: { widthClass: "border", colorToken: "primary" },
8090
+ effects: {
8091
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8092
+ }
8093
+ },
8094
+ {
8095
+ id: "ghost",
8096
+ name: "Ghost",
8097
+ enabled: true,
8098
+ priority: 3,
8099
+ background: { type: "transparent" },
8100
+ textColorToken: "text",
8101
+ borderRadius: "rounded-lg",
8102
+ effects: {
8103
+ hover: [
8104
+ { effectId: "background-on-hover", options: { colorToken: "surface" } }
8105
+ ]
8106
+ }
8107
+ }
8108
+ ]
8109
+ }
8110
+ });
8111
+
8112
+ // ../theme-core/src/buttons/personalities/confident-chip.ts
8113
+ var confidentChip = defineButtonPersonality({
8114
+ id: "confident-chip",
8115
+ name: "Confident Chip",
8116
+ description: "Mid-radius solid buttons with a crisp hover.",
8117
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
8118
+ buttonSystem: {
8119
+ global: {
8120
+ cornerStyle: "rounded",
8121
+ shadow: "medium",
8122
+ textTransform: "none",
8123
+ fontWeight: 600,
8124
+ borderWidth: 1,
8125
+ hoverTransform: "none",
8126
+ hoverColor: "none"
7898
8127
  },
7899
- compositionBudget: balancedBudget,
7900
- defaultButtonPersonalityId: "pebble",
7901
- acceptedButtons: { tone: ["classic", "bold"], era: ["organic", "modern"] },
7902
- defaultPaletteVariantId: "brand-led-warm",
7903
- acceptedPalettes: { tone: ["classic", "bold"], era: ["modern", "organic"] }
7904
- }),
7905
- defineCuratedSiteStyle({
7906
- id: "site-style:quiet-luxury",
7907
- name: "Quiet Luxury",
7908
- description: "Minimal, confident, and refined for premium experiences and private services.",
7909
- generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
7910
- selectionKeywords: [
7911
- "luxury",
7912
- "premium",
7913
- "boutique",
7914
- "bespoke",
7915
- "exclusive"
7916
- ],
7917
- tokenRecipes: {
7918
- palette: "high-contrast",
7919
- contrast: "strong",
7920
- radius: "square",
7921
- shadow: "none",
7922
- typography: "classic-serif",
7923
- spacing: "airy",
7924
- motion: "none"
7925
- },
7926
- compositionBudget: quietBudget,
7927
- defaultButtonPersonalityId: "editorial-link",
7928
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
7929
- defaultPaletteVariantId: "high-contrast-charcoal",
7930
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
7931
- }),
7932
- defineCuratedSiteStyle({
7933
- id: "site-style:practical-services",
7934
- name: "Practical Services",
7935
- description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
7936
- generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
7937
- selectionKeywords: [
7938
- "repair",
7939
- "plumb",
7940
- "electric",
7941
- "cleaning",
7942
- "landscap",
7943
- "contractor"
7944
- ],
7945
- tokenRecipes: {
7946
- palette: "brand-led",
7947
- contrast: "maximum",
7948
- radius: "soft",
7949
- shadow: "subtle",
7950
- typography: "clean-sans",
7951
- spacing: "compact",
7952
- motion: "none"
8128
+ variants: [
8129
+ {
8130
+ id: "primary",
8131
+ name: "Primary",
8132
+ enabled: true,
8133
+ priority: 1,
8134
+ background: { type: "solid", colorToken: "primary" },
8135
+ textColorToken: "primaryForeground",
8136
+ borderRadius: "rounded-md",
8137
+ shadow: { elevation: "medium", softness: "soft", position: "bottom" },
8138
+ effects: {
8139
+ hover: [{ effectId: "darken-background", options: { amount: 60 } }],
8140
+ active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
8141
+ }
8142
+ },
8143
+ {
8144
+ id: "secondary",
8145
+ name: "Secondary",
8146
+ enabled: true,
8147
+ priority: 2,
8148
+ background: { type: "solid", colorToken: "surface" },
8149
+ textColorToken: "text",
8150
+ borderRadius: "rounded-md",
8151
+ border: { widthClass: "border", colorToken: "border" },
8152
+ effects: {
8153
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8154
+ }
8155
+ },
8156
+ {
8157
+ id: "outline",
8158
+ name: "Outline",
8159
+ enabled: true,
8160
+ priority: 3,
8161
+ background: { type: "transparent" },
8162
+ textColorToken: "primary",
8163
+ borderRadius: "rounded-md",
8164
+ border: { widthClass: "border", colorToken: "primary" },
8165
+ effects: {
8166
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8167
+ }
8168
+ },
8169
+ {
8170
+ id: "ghost",
8171
+ name: "Ghost",
8172
+ enabled: true,
8173
+ priority: 3,
8174
+ background: { type: "transparent" },
8175
+ textColorToken: "primary",
8176
+ borderRadius: "rounded-md",
8177
+ effects: {
8178
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8179
+ }
8180
+ }
8181
+ ]
8182
+ }
8183
+ });
8184
+
8185
+ // ../theme-core/src/buttons/personalities/editorial-link.ts
8186
+ var editorialLink = defineButtonPersonality({
8187
+ id: "editorial-link",
8188
+ name: "Editorial Link",
8189
+ description: "Link-style with a growing underline. Refined, typographic.",
8190
+ tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
8191
+ buttonSystem: {
8192
+ global: {
8193
+ cornerStyle: "square",
8194
+ shadow: "none",
8195
+ textTransform: "none",
8196
+ fontWeight: 500,
8197
+ borderWidth: 1,
8198
+ hoverTransform: "none",
8199
+ hoverColor: "none"
7953
8200
  },
7954
- compositionBudget: quietBudget,
7955
- defaultButtonPersonalityId: "confident-chip",
7956
- acceptedButtons: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] },
7957
- defaultPaletteVariantId: "brand-led-cool",
7958
- acceptedPalettes: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] }
7959
- }),
7960
- defineCuratedSiteStyle({
7961
- id: "site-style:modern-wellness",
7962
- name: "Modern Wellness",
7963
- description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
7964
- generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
7965
- tokenRecipes: {
7966
- palette: "soft-natural",
7967
- contrast: "standard",
7968
- radius: "rounded",
7969
- shadow: "subtle",
7970
- typography: "clean-sans",
7971
- spacing: "airy",
7972
- motion: "subtle"
8201
+ variants: [
8202
+ {
8203
+ id: "primary",
8204
+ name: "Primary",
8205
+ enabled: true,
8206
+ priority: 1,
8207
+ background: { type: "transparent" },
8208
+ textColorToken: "text",
8209
+ borderRadius: "rounded-none",
8210
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8211
+ sizes: {
8212
+ sm: { padding: "0.25rem 0" },
8213
+ md: { padding: "0.5rem 0" },
8214
+ lg: { padding: "0.625rem 0" },
8215
+ xl: { padding: "0.75rem 0" }
8216
+ },
8217
+ effects: {
8218
+ base: [
8219
+ { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
8220
+ ]
8221
+ }
8222
+ },
8223
+ {
8224
+ id: "secondary",
8225
+ name: "Secondary",
8226
+ enabled: true,
8227
+ priority: 2,
8228
+ background: { type: "transparent" },
8229
+ textColorToken: "mutedText",
8230
+ borderRadius: "rounded-none",
8231
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8232
+ sizes: {
8233
+ sm: { padding: "0.25rem 0" },
8234
+ md: { padding: "0.5rem 0" },
8235
+ lg: { padding: "0.625rem 0" },
8236
+ xl: { padding: "0.75rem 0" }
8237
+ },
8238
+ effects: {
8239
+ base: [
8240
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
8241
+ ]
8242
+ }
8243
+ },
8244
+ {
8245
+ id: "outline",
8246
+ name: "Outline",
8247
+ enabled: true,
8248
+ priority: 3,
8249
+ background: { type: "transparent" },
8250
+ textColorToken: "accent",
8251
+ borderRadius: "rounded-none",
8252
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8253
+ sizes: {
8254
+ sm: { padding: "0.25rem 0" },
8255
+ md: { padding: "0.5rem 0" },
8256
+ lg: { padding: "0.625rem 0" },
8257
+ xl: { padding: "0.75rem 0" }
8258
+ },
8259
+ effects: {
8260
+ base: [
8261
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
8262
+ ]
8263
+ }
8264
+ },
8265
+ {
8266
+ id: "ghost",
8267
+ name: "Ghost",
8268
+ enabled: true,
8269
+ priority: 3,
8270
+ background: { type: "transparent" },
8271
+ textColorToken: "mutedText",
8272
+ borderRadius: "rounded-none",
8273
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8274
+ sizes: {
8275
+ sm: { padding: "0.25rem 0" },
8276
+ md: { padding: "0.5rem 0" },
8277
+ lg: { padding: "0.625rem 0" },
8278
+ xl: { padding: "0.75rem 0" }
8279
+ },
8280
+ effects: {
8281
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
8282
+ }
8283
+ }
8284
+ ]
8285
+ }
8286
+ });
8287
+
8288
+ // ../theme-core/src/buttons/personalities/ink-stamp.ts
8289
+ var inkStamp = defineButtonPersonality({
8290
+ id: "ink-stamp",
8291
+ name: "Ink Stamp",
8292
+ description: "Hand-stamped block-print buttons with a slight lift on hover.",
8293
+ tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
8294
+ buttonSystem: {
8295
+ global: {
8296
+ cornerStyle: "rounded",
8297
+ shadow: "none",
8298
+ textTransform: "uppercase",
8299
+ fontWeight: 600,
8300
+ borderWidth: 1,
8301
+ hoverTransform: "none",
8302
+ hoverColor: "none",
8303
+ letterSpacing: "loose"
7973
8304
  },
7974
- compositionBudget: balancedBudget,
7975
- defaultButtonPersonalityId: "soft-pill",
7976
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "modern"] },
7977
- defaultPaletteVariantId: "soft-natural-sage",
7978
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
7979
- }),
7980
- defineCuratedSiteStyle({
7981
- id: "site-style:bold-launch",
7982
- name: "Bold Launch",
7983
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
7984
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
7985
- selectionKeywords: [
7986
- "launch",
7987
- "campaign",
7988
- "preorder",
7989
- "pre-order",
7990
- "waitlist",
7991
- "drop"
7992
- ],
7993
- tokenRecipes: {
7994
- palette: "high-contrast",
7995
- contrast: "maximum",
7996
- radius: "pill",
7997
- shadow: "layered",
7998
- typography: "clean-sans",
7999
- spacing: "regular",
8000
- motion: "expressive"
8305
+ sizes: {
8306
+ sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
8307
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
8308
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
8309
+ xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
8001
8310
  },
8002
- compositionBudget: expressiveBudget,
8003
- defaultButtonPersonalityId: "ink-stamp",
8004
- acceptedButtons: { tone: ["classic", "bold"], era: ["editorial", "organic", "modern"] },
8005
- defaultPaletteVariantId: "high-contrast-monochrome",
8006
- acceptedPalettes: { tone: ["bold"], era: ["editorial", "modern"] }
8007
- })
8008
- ];
8009
- var curatedSiteStylesById = new Map(
8010
- curatedSiteStyles.map((style) => [style.id, style])
8011
- );
8012
-
8013
- // ../theme-core/src/site-styles/designState.ts
8014
- import { z as z10 } from "zod";
8015
-
8016
- // ../theme-core/src/site-styles/rawStyleFields.ts
8017
- var themeV2RuntimeStyleFieldNames = [
8018
- "_frameStyles",
8019
- "_sectionStyles",
8020
- "_containerStyles",
8021
- "_cardStyles",
8022
- // styleGroup is legacy runtime transition wiring rather than a nested
8023
- // override object, but normal editors should still never see it directly.
8024
- "styleGroup"
8025
- ];
8026
- var themeV2BlockSpecificRawStyleFieldNames = [
8027
- "_contentCardStyles",
8028
- "_textCardStyles"
8029
- ];
8030
- var themeV2NormalEditorRawStyleFieldNames = [
8031
- ...themeV2RuntimeStyleFieldNames,
8032
- ...themeV2BlockSpecificRawStyleFieldNames
8033
- ];
8034
- var themeV2NormalEditorRawStyleFieldNameSet = new Set(
8035
- themeV2NormalEditorRawStyleFieldNames
8036
- );
8037
-
8038
- // ../theme-core/src/site-styles/designState.ts
8039
- var themeV2DesignStateSchemaVersion = 1;
8040
- var designResolutionPolicySchema = z10.enum(["generated", "user", "admin", "sdk"]);
8041
- var runtimeStyleFieldNameSchema = z10.enum(themeV2RuntimeStyleFieldNames);
8042
- var nonEmptyRuntimeStyleFieldNamesSchema = z10.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
8043
- fields3[0],
8044
- ...fields3.slice(1)
8045
- ]);
8046
- var heroLegibilityStrategySchema = z10.enum([
8047
- "none",
8048
- "scrim-gradient",
8049
- "solid-panel"
8050
- ]);
8051
- function uniqueNonEmpty(values) {
8052
- const uniqueValues = [...new Set(values)];
8053
- const firstValue = uniqueValues[0];
8054
- if (!firstValue) {
8055
- throw new Error("Expected at least one Theme V2 design state option.");
8056
- }
8057
- return [firstValue, ...uniqueValues.slice(1)];
8058
- }
8059
- var userPanelTreatments = uniqueNonEmpty(
8060
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
8061
- );
8062
- var userFlushTreatments = uniqueNonEmpty(
8063
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
8064
- );
8065
- var userFlushBleeds = uniqueNonEmpty(
8066
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
8067
- );
8068
- var contentFrameIntentSchema = z10.discriminatedUnion("kind", [
8069
- z10.object({ kind: z10.literal("plain") }).strict(),
8070
- z10.object({
8071
- kind: z10.literal("panel"),
8072
- treatment: z10.enum(userPanelTreatments)
8073
- }).strict(),
8074
- z10.object({
8075
- kind: z10.literal("flush-panel"),
8076
- treatment: z10.enum(userFlushTreatments),
8077
- bleed: z10.enum(userFlushBleeds)
8078
- }).strict()
8079
- ]);
8080
- var blockDesignPlanSchema = z10.object({
8081
- blockId: z10.string().min(1).transform(asDesignBlockId),
8082
- blockKind: z10.string().min(1),
8083
- purpose: z10.string().min(1),
8084
- sectionSurface: z10.enum(userDesignOptionCatalog.sectionSurfaces),
8085
- contentFrame: contentFrameIntentSchema,
8086
- itemSurface: z10.enum(userDesignOptionCatalog.itemSurfaces),
8087
- transitionAfter: z10.enum(userDesignOptionCatalog.transitions),
8088
- emphasis: z10.enum(userDesignOptionCatalog.emphases),
8089
- heroLegibility: heroLegibilityStrategySchema.optional()
8090
- }).strict();
8091
- var styleAuthoritySchema = z10.discriminatedUnion("kind", [
8092
- z10.object({
8093
- kind: z10.literal("theme-v2"),
8094
- source: designResolutionPolicySchema,
8095
- siteStyleId: z10.string().min(1).transform(asSiteStyleId),
8096
- templateId: z10.string().min(1).transform(asDesignSystemTemplateId),
8097
- templateVersion: z10.number().int().nonnegative(),
8098
- resolverVersion: z10.number().int().nonnegative()
8099
- }).strict(),
8100
- z10.object({
8101
- kind: z10.literal("legacy-raw"),
8102
- reason: z10.enum(["pre-theme-v2", "manual-runtime-fields"])
8103
- }).strict(),
8104
- z10.object({
8105
- kind: z10.literal("advanced-detached"),
8106
- reason: z10.literal("detached-custom-runtime-fields")
8107
- }).strict()
8108
- ]);
8109
- var blockRuntimeStyleAuthoritySchema = z10.object({
8110
- unit: z10.literal("block-runtime-fields"),
8111
- blockId: z10.string().min(1).transform(asDesignBlockId),
8112
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
8113
- authority: styleAuthoritySchema
8114
- }).strict();
8115
- var persistedPageDesignStateV1Schema = z10.object({
8116
- schemaVersion: z10.literal(themeV2DesignStateSchemaVersion),
8117
- siteStyleId: z10.string().min(1).transform(asSiteStyleId),
8118
- templateId: z10.string().min(1).transform(asDesignSystemTemplateId),
8119
- templateVersion: z10.number().int().nonnegative(),
8120
- resolverVersion: z10.number().int().nonnegative(),
8121
- rhythmPresetId: z10.string().min(1),
8122
- blocks: z10.array(blockDesignPlanSchema),
8123
- styleAuthorities: z10.array(blockRuntimeStyleAuthoritySchema)
8124
- }).strict();
8125
-
8126
- // ../theme-core/src/site-styles/generatedSchemas.ts
8127
- import { z as z11 } from "zod";
8128
- function uniqueNonEmpty2(values) {
8129
- const uniqueValues = [...new Set(values)];
8130
- const firstValue = uniqueValues[0];
8131
- if (!firstValue) {
8132
- throw new Error("Expected at least one generated schema option.");
8133
- }
8134
- return [firstValue, ...uniqueValues.slice(1)];
8135
- }
8136
- var generatedPanelTreatments = uniqueNonEmpty2(
8137
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
8138
- );
8139
- var generatedFlushTreatments = uniqueNonEmpty2(
8140
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
8141
- );
8142
- var generatedFlushBleeds = uniqueNonEmpty2(
8143
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
8144
- );
8145
- var generatedPanelFrameSchema = z11.object({
8146
- kind: z11.literal("panel"),
8147
- treatment: z11.enum(generatedPanelTreatments)
8148
- }).strict();
8149
- var generatedFlushPanelFrameSchema = z11.object({
8150
- kind: z11.literal("flush-panel"),
8151
- treatment: z11.enum(generatedFlushTreatments),
8152
- bleed: z11.enum(generatedFlushBleeds)
8153
- }).strict();
8154
- var generatedContentFrameIntentSchema = z11.discriminatedUnion("kind", [
8155
- z11.object({ kind: z11.literal("plain") }).strict(),
8156
- generatedPanelFrameSchema,
8157
- generatedFlushPanelFrameSchema
8158
- ]);
8159
- var generatedSiteStyleIdSchema = z11.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
8160
- function generatedChoiceSchema(valueSchema) {
8161
- return z11.discriminatedUnion("kind", [
8162
- z11.object({
8163
- source: z11.literal("generated"),
8164
- kind: z11.literal("auto")
8165
- }).strict(),
8166
- z11.object({
8167
- source: z11.literal("generated"),
8168
- kind: z11.literal("explicit"),
8169
- value: valueSchema
8170
- }).strict()
8171
- ]);
8172
- }
8173
- var generatedBlockDesignIntentSchema = z11.object({
8174
- sectionSurface: generatedChoiceSchema(
8175
- z11.enum(generatedDesignOptionCatalog.sectionSurfaces)
8176
- ),
8177
- contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
8178
- itemSurface: generatedChoiceSchema(
8179
- z11.enum(generatedDesignOptionCatalog.itemSurfaces)
8180
- ),
8181
- transitionAfter: generatedChoiceSchema(
8182
- z11.enum(generatedDesignOptionCatalog.transitions)
8183
- ),
8184
- emphasis: generatedChoiceSchema(
8185
- z11.enum(generatedDesignOptionCatalog.emphases)
8186
- )
8187
- }).strict();
8188
- var generatedMediaCompositionIntentSchema = z11.enum([
8189
- "none",
8190
- "supporting",
8191
- "dominant"
8192
- ]);
8193
- var generatedDecorativeCompositionIntentSchema = z11.enum([
8194
- "none",
8195
- "supporting"
8196
- ]);
8197
- var generatedHeroLegibilityStrategySchema = z11.enum([
8198
- "none",
8199
- "scrim-gradient"
8200
- ]);
8201
- var generatedBlockMediaIntentSchema = z11.object({
8202
- media: generatedMediaCompositionIntentSchema,
8203
- decorative: generatedDecorativeCompositionIntentSchema,
8204
- heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
8205
- }).strict();
8206
- var generatedBoundaryIntentSchema = z11.object({
8207
- transitionAfter: generatedChoiceSchema(
8208
- z11.enum(generatedDesignOptionCatalog.transitions)
8209
- )
8210
- }).strict();
8211
- var generatedPageDesignBlockIntentSchema = z11.object({
8212
- blockId: z11.string().min(1),
8213
- blockKind: z11.string().min(1),
8214
- purpose: z11.string().min(1),
8215
- design: generatedBlockDesignIntentSchema,
8216
- mediaIntent: generatedBlockMediaIntentSchema,
8217
- boundaryIntent: generatedBoundaryIntentSchema
8218
- }).strict();
8219
- var generatedPageDesignIntentSchema = z11.object({
8220
- siteStyleId: generatedSiteStyleIdSchema,
8221
- blocks: z11.array(generatedPageDesignBlockIntentSchema)
8222
- }).strict();
8223
-
8224
- // ../theme-core/src/site-styles/pageDesignIntent.ts
8225
- import { z as z12 } from "zod";
8226
- var pageDesignIntentSchemaVersion = 1;
8227
- var pageDesignUserPinnedAppearanceChoiceSchema = z12.object({
8228
- kind: z12.literal("user-pinned"),
8229
- value: z12.string().min(1).transform(asAppearancePresetId)
8230
- }).strict();
8231
- var pageDesignUserPinnedBoundaryChoiceSchema = z12.object({
8232
- kind: z12.literal("user-pinned"),
8233
- value: z12.string().min(1).transform(asBoundaryOptionId)
8234
- }).strict();
8235
- var pageDesignBlockLookPinSchema = z12.object({
8236
- blockId: z12.string().min(1).transform(asDesignBlockId),
8237
- blockKind: z12.string().min(1),
8238
- choice: pageDesignUserPinnedAppearanceChoiceSchema
8239
- }).strict();
8240
- var pageDesignBoundaryPinSchema = z12.object({
8241
- boundaryId: z12.string().min(1).transform(asDesignBoundaryId),
8242
- previousBlockId: z12.string().min(1).transform(asDesignBlockId),
8243
- nextBlockId: z12.string().min(1).transform(asDesignBlockId),
8244
- choice: pageDesignUserPinnedBoundaryChoiceSchema
8245
- }).strict().superRefine((pin, ctx) => {
8246
- const expectedBoundaryId = makeBoundaryId(
8247
- pin.previousBlockId,
8248
- pin.nextBlockId
8249
- );
8250
- if (pin.boundaryId !== expectedBoundaryId) {
8251
- ctx.addIssue({
8252
- code: z12.ZodIssueCode.custom,
8253
- path: ["boundaryId"],
8254
- message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
8255
- });
8256
- }
8257
- });
8258
- var pageDesignIntentV1Schema = z12.object({
8259
- schemaVersion: z12.literal(pageDesignIntentSchemaVersion),
8260
- siteStyleId: z12.string().min(1).transform(asSiteStyleId),
8261
- pageFlowPresetId: z12.string().min(1).transform(asPageFlowPresetId),
8262
- blockLookPins: z12.array(pageDesignBlockLookPinSchema),
8263
- boundaryPins: z12.array(pageDesignBoundaryPinSchema)
8264
- }).strict().superRefine((intent, ctx) => {
8265
- addDuplicateStringIssues(ctx, {
8266
- values: intent.blockLookPins.map((pin) => pin.blockId),
8267
- path: ["blockLookPins"],
8268
- label: "block Look pin"
8269
- });
8270
- addDuplicateStringIssues(ctx, {
8271
- values: intent.boundaryPins.map(
8272
- (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
8273
- ),
8274
- path: ["boundaryPins"],
8275
- label: "boundary pin"
8276
- });
8277
- });
8278
- function addDuplicateStringIssues(ctx, input) {
8279
- const seen = /* @__PURE__ */ new Set();
8280
- const duplicates = /* @__PURE__ */ new Set();
8281
- for (const value of input.values) {
8282
- if (seen.has(value)) {
8283
- duplicates.add(value);
8284
- }
8285
- seen.add(value);
8286
- }
8287
- for (const duplicate of duplicates) {
8288
- ctx.addIssue({
8289
- code: z12.ZodIssueCode.custom,
8290
- path: [...input.path],
8291
- message: `Duplicate ${input.label}: ${duplicate}.`
8292
- });
8311
+ variants: [
8312
+ {
8313
+ id: "primary",
8314
+ name: "Primary",
8315
+ enabled: true,
8316
+ priority: 1,
8317
+ background: { type: "solid", colorToken: "primary" },
8318
+ textColorToken: "primaryForeground",
8319
+ borderRadius: "rounded-md",
8320
+ effects: {
8321
+ hover: [
8322
+ { effectId: "drop-shadow", options: { intensity: "medium" } },
8323
+ { effectId: "scale-up", options: { scale: "1.02" } }
8324
+ ],
8325
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8326
+ }
8327
+ },
8328
+ {
8329
+ id: "secondary",
8330
+ name: "Secondary",
8331
+ enabled: true,
8332
+ priority: 2,
8333
+ background: { type: "transparent" },
8334
+ textColorToken: "primary",
8335
+ borderRadius: "rounded-md",
8336
+ border: { widthClass: "border-2", colorToken: "primary" },
8337
+ effects: {
8338
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8339
+ }
8340
+ },
8341
+ {
8342
+ id: "outline",
8343
+ name: "Outline",
8344
+ enabled: true,
8345
+ priority: 3,
8346
+ background: { type: "transparent" },
8347
+ textColorToken: "text",
8348
+ borderRadius: "rounded-md",
8349
+ border: { widthClass: "border-2", colorToken: "border" },
8350
+ effects: {
8351
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8352
+ }
8353
+ },
8354
+ {
8355
+ id: "ghost",
8356
+ name: "Ghost",
8357
+ enabled: true,
8358
+ priority: 3,
8359
+ background: { type: "transparent" },
8360
+ textColorToken: "accent",
8361
+ borderRadius: "rounded-none",
8362
+ sizes: {
8363
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
8364
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
8365
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
8366
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
8367
+ },
8368
+ effects: {
8369
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
8370
+ }
8371
+ }
8372
+ ]
8293
8373
  }
8294
- }
8295
- function boundaryKey(previousBlockId, nextBlockId) {
8296
- return makeBoundaryId(previousBlockId, nextBlockId);
8297
- }
8298
-
8299
- // ../theme-core/src/schema.ts
8300
- import { z as z25 } from "zod";
8301
-
8302
- // ../theme-core/src/lib/media.ts
8303
- import z13 from "zod";
8304
- var hotspotSchema = z13.object({
8305
- x: z13.number().min(0).max(1),
8306
- y: z13.number().min(0).max(1),
8307
- radius: z13.number().optional()
8308
- });
8309
- var rotationSchema = z13.union([z13.literal(0), z13.literal(90), z13.literal(180), z13.literal(270)]);
8310
- var rectSchema = z13.tuple([z13.number(), z13.number(), z13.number(), z13.number()]);
8311
- var aspectCropSchema = z13.object({
8312
- aspect: z13.preprocess((value) => value == null ? void 0 : value, z13.string().optional()),
8313
- rect: z13.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
8314
- hotspot: z13.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
8315
- rotation: z13.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
8316
- });
8317
- var transformSchema = z13.object({
8318
- aspectCrops: z13.preprocess((value) => {
8319
- if (!value || typeof value !== "object" || Array.isArray(value)) {
8320
- return void 0;
8321
- }
8322
- return value;
8323
- }, z13.record(z13.string(), aspectCropSchema.catch({}))).optional(),
8324
- rect: rectSchema.optional(),
8325
- hotspot: hotspotSchema.optional(),
8326
- rotation: rotationSchema.optional()
8327
- });
8328
- var mediaSchema = z13.object({
8329
- type: z13.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
8330
- purpose: z13.string().optional(),
8331
- placeholder: z13.boolean().default(true).optional(),
8332
- assetId: z13.string().optional(),
8333
- identifier: z13.string().optional(),
8334
- src: z13.string().optional(),
8335
- alt: z13.string().optional(),
8336
- filename: z13.string().optional(),
8337
- mimeType: z13.string().optional(),
8338
- width: z13.number().optional(),
8339
- height: z13.number().optional(),
8340
- storageBucket: z13.string().optional(),
8341
- storagePath: z13.string().optional(),
8342
- transform: transformSchema.optional()
8343
8374
  });
8344
8375
 
8345
- // ../theme-core/src/buttons/types.ts
8346
- import { z as z14 } from "zod";
8347
- var VARIANT_ROLES = [
8348
- "primary",
8349
- "secondary",
8350
- "outline",
8351
- "ghost",
8352
- "link",
8353
- "tertiary",
8354
- "accent"
8355
- ];
8356
- var cornerStyleSchema = z14.enum(["square", "rounded", "pill"]);
8357
- var shadowSizeSchema = z14.enum(["none", "low", "medium", "high"]);
8358
- var textTransformSchema = z14.enum(["none", "uppercase", "lowercase", "capitalize"]);
8359
- var fontWeightSchema = z14.union([z14.literal(500), z14.literal(600), z14.literal(700)]);
8360
- var buttonTypographySchema = z14.enum(["body", "heading"]);
8361
- var letterSpacingSchema = z14.enum(["tight", "normal", "loose"]);
8362
- var hoverTransformSchema = z14.enum(["none", "lift", "scale", "press"]);
8363
- var hoverColorSchema = z14.enum(["none", "brighten", "darken", "saturate", "token"]);
8364
- var buttonPaddingPresetSchema = z14.enum(["compact", "default", "spacious"]);
8365
- var gradientStyleSchema = z14.enum(["linear", "radial", "conic"]);
8366
- var gradientSharpnessSchema = z14.enum(["smooth", "medium", "hard"]);
8367
- var prioritySchema = z14.union([z14.literal(1), z14.literal(2), z14.literal(3)]);
8368
- var variantRoleSchema = z14.enum(VARIANT_ROLES);
8369
- var buttonSizeNameSchema = z14.enum(["sm", "md", "lg", "xl"]);
8370
- var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
8371
- var paddingShorthandSchema = z14.string().refine(
8372
- (value) => {
8373
- const parts = value.split(/\s+/).filter(Boolean);
8374
- return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
8375
- },
8376
- {
8377
- message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
8378
- }
8379
- );
8380
- var buttonSizeConfigSchema = z14.object({
8381
- padding: paddingShorthandSchema,
8382
- fontSize: z14.string().optional()
8383
- });
8384
- var buttonSizesSchema = z14.object({
8385
- sm: buttonSizeConfigSchema,
8386
- md: buttonSizeConfigSchema,
8387
- lg: buttonSizeConfigSchema,
8388
- xl: buttonSizeConfigSchema.optional()
8389
- }).transform(({ sm, md, lg, xl }) => ({
8390
- sm,
8391
- md,
8392
- lg,
8393
- xl: xl ?? lg
8394
- }));
8395
- var buttonGlobalSettingsSchema = z14.object({
8396
- cornerStyle: cornerStyleSchema,
8397
- cornerRadius: z14.number().min(0).max(24).optional(),
8398
- shadow: shadowSizeSchema,
8399
- textTransform: textTransformSchema,
8400
- fontWeight: fontWeightSchema,
8401
- /**
8402
- * @deprecated Set per-variant via `variant.border.widthClass` instead.
8403
- * Schema field is preserved so existing presets parse; the value is unread
8404
- * by the current generator and will be removed once the legacy
8405
- * `primitives/content/components/Button.tsx` slot exports are deleted.
8406
- */
8407
- borderWidth: z14.union([z14.literal(1), z14.literal(2), z14.literal(3)]),
8408
- // === Family-level typography ===
8409
- // Typography source (body or heading) — selects which theme typography pool to inherit
8410
- typography: buttonTypographySchema.optional(),
8411
- // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
8412
- // Sized variants get this as default; fixed variants inherit unless they override.
8413
- // Size class CSS may still override at run time for sized variants.
8414
- fontSize: z14.string().optional(),
8415
- // Letter spacing applied to all variants
8416
- letterSpacing: letterSpacingSchema.optional(),
8417
- // Italic style
8418
- italic: z14.boolean().optional(),
8419
- // Padding preset (applies to sized variants without a sizes config)
8420
- paddingPreset: buttonPaddingPresetSchema.optional(),
8421
- hoverTransform: hoverTransformSchema,
8422
- hoverColor: hoverColorSchema,
8423
- // When hoverColor is 'token', this specifies which token to use
8424
- hoverColorToken: z14.string().optional(),
8425
- // Gradient settings (if any variant uses gradients)
8426
- gradientStyle: gradientStyleSchema.optional(),
8427
- gradientAngle: z14.number().min(0).max(360).optional(),
8428
- gradientSharpness: gradientSharpnessSchema.optional()
8429
- });
8430
- var gradientDirectionSchema = z14.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
8431
- var buttonBackgroundSchema = z14.discriminatedUnion("type", [
8432
- z14.object({ type: z14.literal("solid"), colorToken: z14.string() }),
8433
- z14.object({
8434
- type: z14.literal("gradient"),
8435
- stops: z14.array(z14.string()).min(2),
8436
- direction: gradientDirectionSchema
8437
- }),
8438
- z14.object({ type: z14.literal("transparent") })
8439
- ]);
8440
- var effectApplicationSchema = z14.object({
8441
- effectId: z14.string(),
8442
- options: z14.record(z14.string(), z14.any()).optional()
8443
- });
8444
- var buttonBorderSchema = z14.object({
8445
- widthClass: z14.string(),
8446
- colorToken: z14.string()
8447
- });
8448
- var variantShadowSchema = z14.object({
8449
- elevation: z14.enum(["none", "low", "medium", "high"]),
8450
- softness: z14.enum(["crisp", "soft", "hard"]).nullable(),
8451
- position: z14.enum(["bottom", "bottom-right"]).default("bottom")
8452
- });
8453
- var variantEffectsSchema = z14.object({
8454
- base: z14.array(effectApplicationSchema).optional(),
8455
- hover: z14.array(effectApplicationSchema).optional(),
8456
- active: z14.array(effectApplicationSchema).optional(),
8457
- focus: z14.array(effectApplicationSchema).optional()
8458
- });
8459
- var variantSizeOverridesSchema = z14.object({
8460
- sm: buttonSizeConfigSchema.optional(),
8461
- md: buttonSizeConfigSchema.optional(),
8462
- lg: buttonSizeConfigSchema.optional(),
8463
- xl: buttonSizeConfigSchema.optional()
8464
- });
8465
- var buttonVariantSchema = z14.object({
8466
- id: z14.string(),
8467
- name: z14.string().min(1).max(20),
8468
- enabled: z14.boolean(),
8469
- priority: prioritySchema,
8470
- // Base appearance (token-based)
8471
- background: buttonBackgroundSchema,
8472
- textColorToken: z14.string(),
8473
- /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
8474
- borderRadius: z14.string().optional(),
8475
- // Optional shadow override (uses theme.shadow if not specified)
8476
- shadow: variantShadowSchema.optional(),
8477
- // Border (optional)
8478
- border: buttonBorderSchema.optional(),
8479
- // Hover background token (per-variant override, takes precedence over global hoverColorToken)
8480
- hoverBackgroundToken: z14.string().optional(),
8481
- // Effect composition
8482
- effects: variantEffectsSchema.optional(),
8483
- // Per-variant size overrides — see VariantSizeOverrides
8484
- sizes: variantSizeOverridesSchema.optional()
8485
- });
8486
- var buttonSystemSchema = z14.object({
8487
- global: buttonGlobalSettingsSchema,
8488
- variants: z14.array(buttonVariantSchema).min(1).max(6),
8489
- sizes: buttonSizesSchema.optional()
8490
- });
8491
-
8492
- // ../theme-core/src/buttons/generateButtonCss.ts
8493
- var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
8494
-
8495
- // ../theme-core/src/buttons/personalities/types.ts
8496
- import { z as z15 } from "zod";
8497
- function asButtonPersonalityId(value) {
8498
- if (value.length === 0) {
8499
- throw new Error("ButtonPersonalityId must be a non-empty string");
8500
- }
8501
- return value;
8502
- }
8503
- var buttonPersonalityIdSchema = z15.string().min(1).transform((value) => asButtonPersonalityId(value));
8504
- var buttonPersonalitySchema = z15.object({
8505
- id: buttonPersonalityIdSchema,
8506
- name: z15.string().min(1),
8507
- description: z15.string().min(1),
8508
- tags: styleTagsSchema,
8509
- buttonSystem: buttonSystemSchema
8510
- });
8511
- function defineButtonPersonality(input) {
8512
- return {
8513
- id: asButtonPersonalityId(input.id),
8514
- name: input.name,
8515
- description: input.description,
8516
- tags: input.tags,
8517
- buttonSystem: input.buttonSystem
8518
- };
8519
- }
8520
-
8521
- // ../theme-core/src/buttons/personalities/brushed-wash.ts
8522
- var brushedWash = defineButtonPersonality({
8523
- id: "brushed-wash",
8524
- name: "Brushed Wash",
8525
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
8526
- tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
8376
+ // ../theme-core/src/buttons/personalities/pebble.ts
8377
+ var pebble = defineButtonPersonality({
8378
+ id: "pebble",
8379
+ name: "Pebble",
8380
+ description: "Generous pill buttons with a soft hover lift.",
8381
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
8527
8382
  buttonSystem: {
8528
8383
  global: {
8529
- cornerStyle: "rounded",
8530
- shadow: "low",
8384
+ cornerStyle: "pill",
8385
+ shadow: "none",
8531
8386
  textTransform: "none",
8532
8387
  fontWeight: 500,
8533
- borderWidth: 1,
8388
+ borderWidth: 2,
8534
8389
  hoverTransform: "none",
8535
8390
  hoverColor: "none"
8536
8391
  },
8537
8392
  sizes: {
8538
- sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
8539
- md: { padding: "1rem 2.5rem" },
8540
- lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
8541
- xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
8393
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
8394
+ md: { padding: "0.875rem 2.25rem" },
8395
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
8396
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
8542
8397
  },
8543
8398
  variants: [
8544
8399
  {
@@ -8546,16 +8401,14 @@ var brushedWash = defineButtonPersonality({
8546
8401
  name: "Primary",
8547
8402
  enabled: true,
8548
8403
  priority: 1,
8549
- background: {
8550
- type: "gradient",
8551
- stops: ["primary", "accent"],
8552
- direction: "to-r"
8553
- },
8404
+ background: { type: "solid", colorToken: "primary" },
8554
8405
  textColorToken: "primaryForeground",
8555
- borderRadius: "rounded-lg",
8556
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
8406
+ borderRadius: "rounded-full",
8557
8407
  effects: {
8558
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8408
+ hover: [
8409
+ { effectId: "scale-up", options: { scale: "1.03" } },
8410
+ { effectId: "drop-shadow", options: { intensity: "medium" } }
8411
+ ]
8559
8412
  }
8560
8413
  },
8561
8414
  {
@@ -8563,16 +8416,12 @@ var brushedWash = defineButtonPersonality({
8563
8416
  name: "Secondary",
8564
8417
  enabled: true,
8565
8418
  priority: 2,
8566
- background: {
8567
- type: "gradient",
8568
- stops: ["secondary", "accent"],
8569
- direction: "to-br"
8570
- },
8571
- textColorToken: "primaryForeground",
8572
- borderRadius: "rounded-lg",
8573
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
8419
+ background: { type: "transparent" },
8420
+ textColorToken: "primary",
8421
+ borderRadius: "rounded-full",
8422
+ border: { widthClass: "border-2", colorToken: "accent" },
8574
8423
  effects: {
8575
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8424
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
8576
8425
  }
8577
8426
  },
8578
8427
  {
@@ -8581,9 +8430,9 @@ var brushedWash = defineButtonPersonality({
8581
8430
  enabled: true,
8582
8431
  priority: 3,
8583
8432
  background: { type: "transparent" },
8584
- textColorToken: "primary",
8585
- borderRadius: "rounded-lg",
8586
- border: { widthClass: "border", colorToken: "primary" },
8433
+ textColorToken: "text",
8434
+ borderRadius: "rounded-full",
8435
+ border: { widthClass: "border", colorToken: "border" },
8587
8436
  effects: {
8588
8437
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8589
8438
  }
@@ -8594,32 +8443,36 @@ var brushedWash = defineButtonPersonality({
8594
8443
  enabled: true,
8595
8444
  priority: 3,
8596
8445
  background: { type: "transparent" },
8597
- textColorToken: "text",
8598
- borderRadius: "rounded-lg",
8446
+ textColorToken: "primary",
8447
+ borderRadius: "rounded-full",
8448
+ sizes: {
8449
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
8450
+ md: { padding: "0.5rem 1rem" },
8451
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
8452
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
8453
+ },
8599
8454
  effects: {
8600
- hover: [
8601
- { effectId: "background-on-hover", options: { colorToken: "surface" } }
8602
- ]
8455
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
8603
8456
  }
8604
8457
  }
8605
8458
  ]
8606
8459
  }
8607
8460
  });
8608
8461
 
8609
- // ../theme-core/src/buttons/personalities/confident-chip.ts
8610
- var confidentChip = defineButtonPersonality({
8611
- id: "confident-chip",
8612
- name: "Confident Chip",
8613
- description: "Mid-radius solid buttons with a crisp hover.",
8614
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
8462
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
8463
+ var softPill = defineButtonPersonality({
8464
+ id: "soft-pill",
8465
+ name: "Soft Pill",
8466
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
8467
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
8615
8468
  buttonSystem: {
8616
8469
  global: {
8617
- cornerStyle: "rounded",
8618
- shadow: "medium",
8470
+ cornerStyle: "pill",
8471
+ shadow: "low",
8619
8472
  textTransform: "none",
8620
- fontWeight: 600,
8621
- borderWidth: 1,
8622
- hoverTransform: "none",
8473
+ fontWeight: 500,
8474
+ borderWidth: 2,
8475
+ hoverTransform: "lift",
8623
8476
  hoverColor: "none"
8624
8477
  },
8625
8478
  variants: [
@@ -8630,11 +8483,11 @@ var confidentChip = defineButtonPersonality({
8630
8483
  priority: 1,
8631
8484
  background: { type: "solid", colorToken: "primary" },
8632
8485
  textColorToken: "primaryForeground",
8633
- borderRadius: "rounded-md",
8634
- shadow: { elevation: "medium", softness: "soft", position: "bottom" },
8486
+ borderRadius: "rounded-full",
8487
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8635
8488
  effects: {
8636
- hover: [{ effectId: "darken-background", options: { amount: 60 } }],
8637
- active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
8489
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
8490
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8638
8491
  }
8639
8492
  },
8640
8493
  {
@@ -8642,12 +8495,12 @@ var confidentChip = defineButtonPersonality({
8642
8495
  name: "Secondary",
8643
8496
  enabled: true,
8644
8497
  priority: 2,
8645
- background: { type: "solid", colorToken: "surface" },
8646
- textColorToken: "text",
8647
- borderRadius: "rounded-md",
8648
- border: { widthClass: "border", colorToken: "border" },
8498
+ background: { type: "transparent" },
8499
+ textColorToken: "primary",
8500
+ borderRadius: "rounded-full",
8501
+ border: { widthClass: "border-2", colorToken: "primary" },
8649
8502
  effects: {
8650
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8503
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8651
8504
  }
8652
8505
  },
8653
8506
  {
@@ -8656,9 +8509,9 @@ var confidentChip = defineButtonPersonality({
8656
8509
  enabled: true,
8657
8510
  priority: 3,
8658
8511
  background: { type: "transparent" },
8659
- textColorToken: "primary",
8660
- borderRadius: "rounded-md",
8661
- border: { widthClass: "border", colorToken: "primary" },
8512
+ textColorToken: "text",
8513
+ borderRadius: "rounded-full",
8514
+ border: { widthClass: "border", colorToken: "border" },
8662
8515
  effects: {
8663
8516
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8664
8517
  }
@@ -8669,8 +8522,8 @@ var confidentChip = defineButtonPersonality({
8669
8522
  enabled: true,
8670
8523
  priority: 3,
8671
8524
  background: { type: "transparent" },
8672
- textColorToken: "primary",
8673
- borderRadius: "rounded-md",
8525
+ textColorToken: "text",
8526
+ borderRadius: "rounded-full",
8674
8527
  effects: {
8675
8528
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8676
8529
  }
@@ -8679,412 +8532,114 @@ var confidentChip = defineButtonPersonality({
8679
8532
  }
8680
8533
  });
8681
8534
 
8682
- // ../theme-core/src/buttons/personalities/editorial-link.ts
8683
- var editorialLink = defineButtonPersonality({
8684
- id: "editorial-link",
8685
- name: "Editorial Link",
8686
- description: "Link-style with a growing underline. Refined, typographic.",
8687
- tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
8688
- buttonSystem: {
8689
- global: {
8690
- cornerStyle: "square",
8691
- shadow: "none",
8692
- textTransform: "none",
8693
- fontWeight: 500,
8694
- borderWidth: 1,
8695
- hoverTransform: "none",
8696
- hoverColor: "none"
8697
- },
8698
- variants: [
8699
- {
8700
- id: "primary",
8701
- name: "Primary",
8702
- enabled: true,
8703
- priority: 1,
8704
- background: { type: "transparent" },
8705
- textColorToken: "text",
8706
- borderRadius: "rounded-none",
8707
- shadow: { elevation: "none", softness: null, position: "bottom" },
8708
- sizes: {
8709
- sm: { padding: "0.25rem 0" },
8710
- md: { padding: "0.5rem 0" },
8711
- lg: { padding: "0.625rem 0" },
8712
- xl: { padding: "0.75rem 0" }
8713
- },
8714
- effects: {
8715
- base: [
8716
- { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
8717
- ]
8718
- }
8719
- },
8720
- {
8721
- id: "secondary",
8722
- name: "Secondary",
8723
- enabled: true,
8724
- priority: 2,
8725
- background: { type: "transparent" },
8726
- textColorToken: "mutedText",
8727
- borderRadius: "rounded-none",
8728
- shadow: { elevation: "none", softness: null, position: "bottom" },
8729
- sizes: {
8730
- sm: { padding: "0.25rem 0" },
8731
- md: { padding: "0.5rem 0" },
8732
- lg: { padding: "0.625rem 0" },
8733
- xl: { padding: "0.75rem 0" }
8734
- },
8735
- effects: {
8736
- base: [
8737
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
8738
- ]
8739
- }
8740
- },
8741
- {
8742
- id: "outline",
8743
- name: "Outline",
8744
- enabled: true,
8745
- priority: 3,
8746
- background: { type: "transparent" },
8747
- textColorToken: "accent",
8748
- borderRadius: "rounded-none",
8749
- shadow: { elevation: "none", softness: null, position: "bottom" },
8750
- sizes: {
8751
- sm: { padding: "0.25rem 0" },
8752
- md: { padding: "0.5rem 0" },
8753
- lg: { padding: "0.625rem 0" },
8754
- xl: { padding: "0.75rem 0" }
8755
- },
8756
- effects: {
8757
- base: [
8758
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
8759
- ]
8760
- }
8761
- },
8762
- {
8763
- id: "ghost",
8764
- name: "Ghost",
8765
- enabled: true,
8766
- priority: 3,
8767
- background: { type: "transparent" },
8768
- textColorToken: "mutedText",
8769
- borderRadius: "rounded-none",
8770
- shadow: { elevation: "none", softness: null, position: "bottom" },
8771
- sizes: {
8772
- sm: { padding: "0.25rem 0" },
8773
- md: { padding: "0.5rem 0" },
8774
- lg: { padding: "0.625rem 0" },
8775
- xl: { padding: "0.75rem 0" }
8776
- },
8777
- effects: {
8778
- hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
8779
- }
8780
- }
8781
- ]
8782
- }
8535
+ // ../theme-core/src/buttons/personalities/index.ts
8536
+ var buttonPersonalities = [
8537
+ softPill,
8538
+ confidentChip,
8539
+ editorialLink,
8540
+ pebble,
8541
+ inkStamp,
8542
+ brushedWash
8543
+ ];
8544
+ var personalitiesById = new Map(
8545
+ buttonPersonalities.map((p) => [p.id, p])
8546
+ );
8547
+
8548
+ // ../theme-core/src/palette/variants/types.ts
8549
+ import { z as z23 } from "zod";
8550
+
8551
+ // ../theme-core/src/schema.ts
8552
+ import { z as z22 } from "zod";
8553
+
8554
+ // ../theme-core/src/lib/media.ts
8555
+ import z12 from "zod";
8556
+ var hotspotSchema = z12.object({
8557
+ x: z12.number().min(0).max(1),
8558
+ y: z12.number().min(0).max(1),
8559
+ radius: z12.number().optional()
8560
+ });
8561
+ var rotationSchema = z12.union([z12.literal(0), z12.literal(90), z12.literal(180), z12.literal(270)]);
8562
+ var rectSchema = z12.tuple([z12.number(), z12.number(), z12.number(), z12.number()]);
8563
+ var aspectCropSchema = z12.object({
8564
+ aspect: z12.preprocess((value) => value == null ? void 0 : value, z12.string().optional()),
8565
+ rect: z12.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
8566
+ hotspot: z12.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
8567
+ rotation: z12.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
8568
+ });
8569
+ var transformSchema = z12.object({
8570
+ aspectCrops: z12.preprocess((value) => {
8571
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
8572
+ return void 0;
8573
+ }
8574
+ return value;
8575
+ }, z12.record(z12.string(), aspectCropSchema.catch({}))).optional(),
8576
+ rect: rectSchema.optional(),
8577
+ hotspot: hotspotSchema.optional(),
8578
+ rotation: rotationSchema.optional()
8579
+ });
8580
+ var mediaSchema = z12.object({
8581
+ type: z12.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
8582
+ purpose: z12.string().optional(),
8583
+ placeholder: z12.boolean().default(true).optional(),
8584
+ assetId: z12.string().optional(),
8585
+ identifier: z12.string().optional(),
8586
+ src: z12.string().optional(),
8587
+ alt: z12.string().optional(),
8588
+ filename: z12.string().optional(),
8589
+ mimeType: z12.string().optional(),
8590
+ width: z12.number().optional(),
8591
+ height: z12.number().optional(),
8592
+ storageBucket: z12.string().optional(),
8593
+ storagePath: z12.string().optional(),
8594
+ transform: transformSchema.optional()
8783
8595
  });
8784
8596
 
8785
- // ../theme-core/src/buttons/personalities/ink-stamp.ts
8786
- var inkStamp = defineButtonPersonality({
8787
- id: "ink-stamp",
8788
- name: "Ink Stamp",
8789
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
8790
- tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
8791
- buttonSystem: {
8792
- global: {
8793
- cornerStyle: "rounded",
8794
- shadow: "none",
8795
- textTransform: "uppercase",
8796
- fontWeight: 600,
8797
- borderWidth: 1,
8798
- hoverTransform: "none",
8799
- hoverColor: "none",
8800
- letterSpacing: "loose"
8801
- },
8802
- sizes: {
8803
- sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
8804
- md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
8805
- lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
8806
- xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
8807
- },
8808
- variants: [
8809
- {
8810
- id: "primary",
8811
- name: "Primary",
8812
- enabled: true,
8813
- priority: 1,
8814
- background: { type: "solid", colorToken: "primary" },
8815
- textColorToken: "primaryForeground",
8816
- borderRadius: "rounded-md",
8817
- effects: {
8818
- hover: [
8819
- { effectId: "drop-shadow", options: { intensity: "medium" } },
8820
- { effectId: "scale-up", options: { scale: "1.02" } }
8821
- ],
8822
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8823
- }
8824
- },
8825
- {
8826
- id: "secondary",
8827
- name: "Secondary",
8828
- enabled: true,
8829
- priority: 2,
8830
- background: { type: "transparent" },
8831
- textColorToken: "primary",
8832
- borderRadius: "rounded-md",
8833
- border: { widthClass: "border-2", colorToken: "primary" },
8834
- effects: {
8835
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8836
- }
8837
- },
8838
- {
8839
- id: "outline",
8840
- name: "Outline",
8841
- enabled: true,
8842
- priority: 3,
8843
- background: { type: "transparent" },
8844
- textColorToken: "text",
8845
- borderRadius: "rounded-md",
8846
- border: { widthClass: "border-2", colorToken: "border" },
8847
- effects: {
8848
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8849
- }
8850
- },
8851
- {
8852
- id: "ghost",
8853
- name: "Ghost",
8854
- enabled: true,
8855
- priority: 3,
8856
- background: { type: "transparent" },
8857
- textColorToken: "accent",
8858
- borderRadius: "rounded-none",
8859
- sizes: {
8860
- sm: { padding: "0.375rem 0", fontSize: "text-xs" },
8861
- md: { padding: "0.5rem 0", fontSize: "text-sm" },
8862
- lg: { padding: "0.625rem 0", fontSize: "text-base" },
8863
- xl: { padding: "0.75rem 0", fontSize: "text-lg" }
8864
- },
8865
- effects: {
8866
- base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
8867
- }
8868
- }
8869
- ]
8870
- }
8871
- });
8872
-
8873
- // ../theme-core/src/buttons/personalities/pebble.ts
8874
- var pebble = defineButtonPersonality({
8875
- id: "pebble",
8876
- name: "Pebble",
8877
- description: "Generous pill buttons with a soft hover lift.",
8878
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
8879
- buttonSystem: {
8880
- global: {
8881
- cornerStyle: "pill",
8882
- shadow: "none",
8883
- textTransform: "none",
8884
- fontWeight: 500,
8885
- borderWidth: 2,
8886
- hoverTransform: "none",
8887
- hoverColor: "none"
8888
- },
8889
- sizes: {
8890
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
8891
- md: { padding: "0.875rem 2.25rem" },
8892
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
8893
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
8894
- },
8895
- variants: [
8896
- {
8897
- id: "primary",
8898
- name: "Primary",
8899
- enabled: true,
8900
- priority: 1,
8901
- background: { type: "solid", colorToken: "primary" },
8902
- textColorToken: "primaryForeground",
8903
- borderRadius: "rounded-full",
8904
- effects: {
8905
- hover: [
8906
- { effectId: "scale-up", options: { scale: "1.03" } },
8907
- { effectId: "drop-shadow", options: { intensity: "medium" } }
8908
- ]
8909
- }
8910
- },
8911
- {
8912
- id: "secondary",
8913
- name: "Secondary",
8914
- enabled: true,
8915
- priority: 2,
8916
- background: { type: "transparent" },
8917
- textColorToken: "primary",
8918
- borderRadius: "rounded-full",
8919
- border: { widthClass: "border-2", colorToken: "accent" },
8920
- effects: {
8921
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
8922
- }
8923
- },
8924
- {
8925
- id: "outline",
8926
- name: "Outline",
8927
- enabled: true,
8928
- priority: 3,
8929
- background: { type: "transparent" },
8930
- textColorToken: "text",
8931
- borderRadius: "rounded-full",
8932
- border: { widthClass: "border", colorToken: "border" },
8933
- effects: {
8934
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8935
- }
8936
- },
8937
- {
8938
- id: "ghost",
8939
- name: "Ghost",
8940
- enabled: true,
8941
- priority: 3,
8942
- background: { type: "transparent" },
8943
- textColorToken: "primary",
8944
- borderRadius: "rounded-full",
8945
- sizes: {
8946
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
8947
- md: { padding: "0.5rem 1rem" },
8948
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
8949
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
8950
- },
8951
- effects: {
8952
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
8953
- }
8954
- }
8955
- ]
8956
- }
8957
- });
8958
-
8959
- // ../theme-core/src/buttons/personalities/soft-pill.ts
8960
- var softPill = defineButtonPersonality({
8961
- id: "soft-pill",
8962
- name: "Soft Pill",
8963
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
8964
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
8965
- buttonSystem: {
8966
- global: {
8967
- cornerStyle: "pill",
8968
- shadow: "low",
8969
- textTransform: "none",
8970
- fontWeight: 500,
8971
- borderWidth: 2,
8972
- hoverTransform: "lift",
8973
- hoverColor: "none"
8974
- },
8975
- variants: [
8976
- {
8977
- id: "primary",
8978
- name: "Primary",
8979
- enabled: true,
8980
- priority: 1,
8981
- background: { type: "solid", colorToken: "primary" },
8982
- textColorToken: "primaryForeground",
8983
- borderRadius: "rounded-full",
8984
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
8985
- effects: {
8986
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
8987
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8988
- }
8989
- },
8990
- {
8991
- id: "secondary",
8992
- name: "Secondary",
8993
- enabled: true,
8994
- priority: 2,
8995
- background: { type: "transparent" },
8996
- textColorToken: "primary",
8997
- borderRadius: "rounded-full",
8998
- border: { widthClass: "border-2", colorToken: "primary" },
8999
- effects: {
9000
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9001
- }
9002
- },
9003
- {
9004
- id: "outline",
9005
- name: "Outline",
9006
- enabled: true,
9007
- priority: 3,
9008
- background: { type: "transparent" },
9009
- textColorToken: "text",
9010
- borderRadius: "rounded-full",
9011
- border: { widthClass: "border", colorToken: "border" },
9012
- effects: {
9013
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9014
- }
9015
- },
9016
- {
9017
- id: "ghost",
9018
- name: "Ghost",
9019
- enabled: true,
9020
- priority: 3,
9021
- background: { type: "transparent" },
9022
- textColorToken: "text",
9023
- borderRadius: "rounded-full",
9024
- effects: {
9025
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9026
- }
9027
- }
9028
- ]
9029
- }
9030
- });
9031
-
9032
- // ../theme-core/src/buttons/personalities/index.ts
9033
- var buttonPersonalities = [
9034
- softPill,
9035
- confidentChip,
9036
- editorialLink,
9037
- pebble,
9038
- inkStamp,
9039
- brushedWash
9040
- ];
9041
- var personalitiesById = new Map(
9042
- buttonPersonalities.map((p) => [p.id, p])
9043
- );
9044
-
9045
- // ../theme-core/src/cards/types.ts
9046
- import { z as z16 } from "zod";
9047
- var cardSpacingSchema = z16.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9048
- var gradientDirectionSchema2 = z16.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
9049
- var cardBackgroundSchema = z16.discriminatedUnion("type", [
9050
- z16.object({ type: z16.literal("solid"), colorToken: z16.string() }),
9051
- z16.object({
9052
- type: z16.literal("gradient"),
9053
- fromToken: z16.string(),
9054
- toToken: z16.string(),
9055
- direction: gradientDirectionSchema2
9056
- }),
9057
- z16.object({ type: z16.literal("transparent") })
9058
- ]);
9059
- var cardBorderSchema = z16.object({
9060
- widthClass: z16.string(),
9061
- colorToken: z16.string()
9062
- });
9063
- var cardVariantSchema = z16.object({
9064
- id: z16.string(),
9065
- name: z16.string().min(1).max(20),
9066
- enabled: z16.boolean(),
9067
- priority: z16.union([z16.literal(1), z16.literal(2), z16.literal(3)]),
9068
- // Appearance (token-based)
9069
- background: cardBackgroundSchema,
9070
- spacing: cardSpacingSchema,
9071
- // Optional overrides (uses theme defaults if not specified)
9072
- shadow: z16.object({
9073
- elevation: z16.enum(["none", "low", "medium", "high"]),
9074
- softness: z16.enum(["crisp", "soft", "hard"]).nullable(),
9075
- position: z16.enum(["bottom", "bottom-right"]).default("bottom")
9076
- }).optional(),
9077
- corners: z16.enum(["square", "soft", "rounded", "pill"]).optional(),
9078
- // Border (optional)
9079
- border: cardBorderSchema.optional()
9080
- });
9081
- var cardSystemSchema = z16.object({
9082
- variants: z16.array(cardVariantSchema).min(1).max(3)
8597
+ // ../theme-core/src/buttons/generateButtonCss.ts
8598
+ var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
8599
+
8600
+ // ../theme-core/src/cards/types.ts
8601
+ import { z as z13 } from "zod";
8602
+ var cardSpacingSchema = z13.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
8603
+ var gradientDirectionSchema2 = z13.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
8604
+ var cardBackgroundSchema = z13.discriminatedUnion("type", [
8605
+ z13.object({ type: z13.literal("solid"), colorToken: z13.string() }),
8606
+ z13.object({
8607
+ type: z13.literal("gradient"),
8608
+ fromToken: z13.string(),
8609
+ toToken: z13.string(),
8610
+ direction: gradientDirectionSchema2
8611
+ }),
8612
+ z13.object({ type: z13.literal("transparent") })
8613
+ ]);
8614
+ var cardBorderSchema = z13.object({
8615
+ widthClass: z13.string(),
8616
+ colorToken: z13.string()
8617
+ });
8618
+ var cardVariantSchema = z13.object({
8619
+ id: z13.string(),
8620
+ name: z13.string().min(1).max(20),
8621
+ enabled: z13.boolean(),
8622
+ priority: z13.union([z13.literal(1), z13.literal(2), z13.literal(3)]),
8623
+ // Appearance (token-based)
8624
+ background: cardBackgroundSchema,
8625
+ spacing: cardSpacingSchema,
8626
+ // Optional overrides (uses theme defaults if not specified)
8627
+ shadow: z13.object({
8628
+ elevation: z13.enum(["none", "low", "medium", "high"]),
8629
+ softness: z13.enum(["crisp", "soft", "hard"]).nullable(),
8630
+ position: z13.enum(["bottom", "bottom-right"]).default("bottom")
8631
+ }).optional(),
8632
+ corners: z13.enum(["square", "soft", "rounded", "pill"]).optional(),
8633
+ // Border (optional)
8634
+ border: cardBorderSchema.optional()
8635
+ });
8636
+ var cardSystemSchema = z13.object({
8637
+ variants: z13.array(cardVariantSchema).min(1).max(3)
9083
8638
  });
9084
8639
 
9085
8640
  // ../theme-core/src/accordions/types.ts
9086
- import { z as z17 } from "zod";
9087
- var accordionIconSchema = z17.enum([
8641
+ import { z as z14 } from "zod";
8642
+ var accordionIconSchema = z14.enum([
9088
8643
  "plus-minus",
9089
8644
  // + becomes - (swap or rotate 90°)
9090
8645
  "chevron",
@@ -9096,180 +8651,180 @@ var accordionIconSchema = z17.enum([
9096
8651
  "circle-plus-minus"
9097
8652
  // ⊕ becomes ⊖ (swap with fade)
9098
8653
  ]);
9099
- var accordionSystemSchema = z17.object({
8654
+ var accordionSystemSchema = z14.object({
9100
8655
  // Visual styling (solid color only - gradients can be added later if needed)
9101
- background: z17.object({
9102
- type: z17.literal("solid"),
9103
- colorToken: z17.string()
8656
+ background: z14.object({
8657
+ type: z14.literal("solid"),
8658
+ colorToken: z14.string()
9104
8659
  }),
9105
8660
  // Spacing (padding inside items)
9106
- spacing: z17.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
8661
+ spacing: z14.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
9107
8662
  // Border radius (null = inherit from theme.corners)
9108
- corners: z17.enum(["square", "soft", "rounded", "pill"]).nullable(),
8663
+ corners: z14.enum(["square", "soft", "rounded", "pill"]).nullable(),
9109
8664
  // Border styling (null = inherit from theme.border)
9110
- border: z17.object({
9111
- widthClass: z17.string(),
8665
+ border: z14.object({
8666
+ widthClass: z14.string(),
9112
8667
  // e.g., 'border', 'border-2', 'border-0'
9113
- colorToken: z17.string()
8668
+ colorToken: z14.string()
9114
8669
  }).nullable(),
9115
8670
  // Shadow (null = inherit from theme.shadow)
9116
- shadow: z17.object({
9117
- elevation: z17.enum(["none", "low", "medium", "high"]),
9118
- softness: z17.enum(["soft", "crisp", "hard"]).nullable(),
9119
- position: z17.enum(["bottom", "bottom-right"])
8671
+ shadow: z14.object({
8672
+ elevation: z14.enum(["none", "low", "medium", "high"]),
8673
+ softness: z14.enum(["soft", "crisp", "hard"]).nullable(),
8674
+ position: z14.enum(["bottom", "bottom-right"])
9120
8675
  }).nullable(),
9121
8676
  // Icon style and animation
9122
- icon: z17.object({
8677
+ icon: z14.object({
9123
8678
  style: accordionIconSchema,
9124
- position: z17.enum(["left", "right"]),
9125
- size: z17.enum(["sm", "md", "lg"])
8679
+ position: z14.enum(["left", "right"]),
8680
+ size: z14.enum(["sm", "md", "lg"])
9126
8681
  }),
9127
8682
  // Trigger (question) styling
9128
- trigger: z17.object({
9129
- textColorToken: z17.string(),
9130
- fontWeight: z17.enum(["regular", "medium", "semibold", "bold"]).nullable()
8683
+ trigger: z14.object({
8684
+ textColorToken: z14.string(),
8685
+ fontWeight: z14.enum(["regular", "medium", "semibold", "bold"]).nullable()
9131
8686
  // null = inherit from theme
9132
8687
  }),
9133
8688
  // Hover state styling
9134
- hover: z17.object({
9135
- backgroundColorToken: z17.string().optional(),
9136
- textColorToken: z17.string().optional(),
9137
- borderColorToken: z17.string().optional()
8689
+ hover: z14.object({
8690
+ backgroundColorToken: z14.string().optional(),
8691
+ textColorToken: z14.string().optional(),
8692
+ borderColorToken: z14.string().optional()
9138
8693
  }),
9139
8694
  // Content (answer) styling
9140
- content: z17.object({
9141
- textColorToken: z17.string()
8695
+ content: z14.object({
8696
+ textColorToken: z14.string()
9142
8697
  })
9143
8698
  });
9144
8699
 
9145
8700
  // ../theme-core/src/inputs/types.ts
9146
- import { z as z18 } from "zod";
9147
- var inputSystemSchema = z18.object({
8701
+ import { z as z15 } from "zod";
8702
+ var inputSystemSchema = z15.object({
9148
8703
  // Base styling (applied to all inputs)
9149
- base: z18.object({
9150
- background: z18.union([
9151
- z18.object({
9152
- type: z18.literal("solid"),
9153
- colorToken: z18.string()
8704
+ base: z15.object({
8705
+ background: z15.union([
8706
+ z15.object({
8707
+ type: z15.literal("solid"),
8708
+ colorToken: z15.string()
9154
8709
  }),
9155
- z18.object({
9156
- type: z18.literal("transparent")
8710
+ z15.object({
8711
+ type: z15.literal("transparent")
9157
8712
  })
9158
8713
  ]),
9159
- textColorToken: z18.string(),
9160
- border: z18.object({
9161
- widthClass: z18.string(),
8714
+ textColorToken: z15.string(),
8715
+ border: z15.object({
8716
+ widthClass: z15.string(),
9162
8717
  // e.g., 'border', 'border-2'
9163
- colorToken: z18.string(),
9164
- style: z18.enum(["all", "underline"]).optional()
8718
+ colorToken: z15.string(),
8719
+ style: z15.enum(["all", "underline"]).optional()
9165
8720
  }),
9166
- corners: z18.enum(["square", "soft", "rounded", "pill"]).nullable(),
8721
+ corners: z15.enum(["square", "soft", "rounded", "pill"]).nullable(),
9167
8722
  // null = inherit from theme.corners
9168
- shadow: z18.object({
9169
- elevation: z18.enum(["none", "low", "medium"]),
9170
- softness: z18.enum(["soft", "crisp", "hard"]).nullable()
8723
+ shadow: z15.object({
8724
+ elevation: z15.enum(["none", "low", "medium"]),
8725
+ softness: z15.enum(["soft", "crisp", "hard"]).nullable()
9171
8726
  }).nullable(),
9172
- spacing: z18.enum(["compact", "cozy", "medium", "comfortable"]),
8727
+ spacing: z15.enum(["compact", "cozy", "medium", "comfortable"]),
9173
8728
  // padding inside inputs
9174
- fontSize: z18.enum(["sm", "base", "lg"])
8729
+ fontSize: z15.enum(["sm", "base", "lg"])
9175
8730
  }),
9176
8731
  // Label styling
9177
- label: z18.object({
9178
- textColorToken: z18.string(),
9179
- fontWeight: z18.enum(["regular", "medium", "semibold", "bold", "black"]),
9180
- fontSize: z18.enum(["2xs", "xs", "sm", "base"]),
9181
- textTransform: z18.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
9182
- letterSpacing: z18.enum(["normal", "wide", "wider", "widest"]).optional(),
9183
- opacity: z18.number().min(0.2).max(1).optional()
8732
+ label: z15.object({
8733
+ textColorToken: z15.string(),
8734
+ fontWeight: z15.enum(["regular", "medium", "semibold", "bold", "black"]),
8735
+ fontSize: z15.enum(["2xs", "xs", "sm", "base"]),
8736
+ textTransform: z15.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
8737
+ letterSpacing: z15.enum(["normal", "wide", "wider", "widest"]).optional(),
8738
+ opacity: z15.number().min(0.2).max(1).optional()
9184
8739
  }),
9185
8740
  // Focus state
9186
- focus: z18.object({
9187
- ringColorToken: z18.string(),
9188
- ringWidth: z18.enum(["0", "1", "2", "3"]),
9189
- borderColorToken: z18.string().optional()
8741
+ focus: z15.object({
8742
+ ringColorToken: z15.string(),
8743
+ ringWidth: z15.enum(["0", "1", "2", "3"]),
8744
+ borderColorToken: z15.string().optional()
9190
8745
  // Change border color on focus
9191
8746
  }),
9192
8747
  // Error state (for validation feedback)
9193
- error: z18.object({
9194
- borderColorToken: z18.string(),
9195
- textColorToken: z18.string()
8748
+ error: z15.object({
8749
+ borderColorToken: z15.string(),
8750
+ textColorToken: z15.string()
9196
8751
  }),
9197
8752
  // Disabled state
9198
- disabled: z18.object({
9199
- backgroundColorToken: z18.string(),
9200
- textColorToken: z18.string(),
9201
- opacity: z18.number().min(0.3).max(0.7)
8753
+ disabled: z15.object({
8754
+ backgroundColorToken: z15.string(),
8755
+ textColorToken: z15.string(),
8756
+ opacity: z15.number().min(0.3).max(0.7)
9202
8757
  })
9203
8758
  });
9204
8759
 
9205
8760
  // ../theme-core/src/gradients/types.ts
9206
- import { z as z19 } from "zod";
9207
- var gradientStopSchema = z19.object({
9208
- color: z19.string(),
8761
+ import { z as z16 } from "zod";
8762
+ var gradientStopSchema = z16.object({
8763
+ color: z16.string(),
9209
8764
  // Theme color token name (e.g., 'primary-500')
9210
- position: z19.number().min(0).max(100)
8765
+ position: z16.number().min(0).max(100)
9211
8766
  // Percentage 0-100
9212
8767
  });
9213
- var gradientConfigSchema = z19.object({
9214
- type: z19.enum(["linear", "radial"]),
9215
- angle: z19.number().min(0).max(360).optional(),
8768
+ var gradientConfigSchema = z16.object({
8769
+ type: z16.enum(["linear", "radial"]),
8770
+ angle: z16.number().min(0).max(360).optional(),
9216
8771
  // For linear gradients (degrees)
9217
- position: z19.string().optional(),
8772
+ position: z16.string().optional(),
9218
8773
  // For radial gradients ('center', 'top left', etc.)
9219
- stops: z19.array(gradientStopSchema).min(2)
8774
+ stops: z16.array(gradientStopSchema).min(2)
9220
8775
  });
9221
8776
 
9222
8777
  // ../theme-core/src/navigation/types.ts
9223
- import { z as z21 } from "zod";
8778
+ import { z as z18 } from "zod";
9224
8779
 
9225
8780
  // ../theme-core/src/interactive/baseSchema.ts
9226
- import { z as z20 } from "zod";
9227
- var interactiveTypographySchema = z20.object({
8781
+ import { z as z17 } from "zod";
8782
+ var interactiveTypographySchema = z17.object({
9228
8783
  /** Font family source */
9229
- typography: z20.enum(["body", "heading"]).default("body"),
8784
+ typography: z17.enum(["body", "heading"]).default("body"),
9230
8785
  /** Font weight */
9231
- fontWeight: z20.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
8786
+ fontWeight: z17.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
9232
8787
  /** Text transform */
9233
- textTransform: z20.enum(["none", "uppercase", "capitalize"]).default("none"),
8788
+ textTransform: z17.enum(["none", "uppercase", "capitalize"]).default("none"),
9234
8789
  /** Italic style */
9235
- italic: z20.boolean().default(false)
8790
+ italic: z17.boolean().default(false)
9236
8791
  });
9237
- var effectApplicationSchema2 = z20.object({
8792
+ var effectApplicationSchema2 = z17.object({
9238
8793
  /** Effect preset ID */
9239
- effectId: z20.string(),
8794
+ effectId: z17.string(),
9240
8795
  /** User-provided customization options */
9241
- options: z20.record(z20.string(), z20.any()).optional()
8796
+ options: z17.record(z17.string(), z17.any()).optional()
9242
8797
  });
9243
- var effectCompositionSchema = z20.object({
8798
+ var effectCompositionSchema = z17.object({
9244
8799
  /** Effects always applied */
9245
- base: z20.array(effectApplicationSchema2).optional(),
8800
+ base: z17.array(effectApplicationSchema2).optional(),
9246
8801
  /** Effects applied on hover */
9247
- hover: z20.array(effectApplicationSchema2).optional(),
8802
+ hover: z17.array(effectApplicationSchema2).optional(),
9248
8803
  /** Effects applied on active/pressed */
9249
- active: z20.array(effectApplicationSchema2).optional(),
8804
+ active: z17.array(effectApplicationSchema2).optional(),
9250
8805
  /** Effects applied on focus */
9251
- focus: z20.array(effectApplicationSchema2).optional()
8806
+ focus: z17.array(effectApplicationSchema2).optional()
9252
8807
  });
9253
8808
 
9254
8809
  // ../theme-core/src/navigation/types.ts
9255
- var navLinkPaddingSchema = z21.enum(["none", "compact", "default"]);
9256
- var navLinkPaddingXSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9257
- var navLinkBorderRadiusSchema = z21.enum(["none", "sm", "md", "full"]);
9258
- var navLinkTextSizeSchema = z21.enum(["xs", "sm", "base", "lg"]);
9259
- var navLinkLetterSpacingSchema = z21.enum(["normal", "wide", "wider", "widest"]);
9260
- var navLinkStyleSchema = z21.object({
8810
+ var navLinkPaddingSchema = z18.enum(["none", "compact", "default"]);
8811
+ var navLinkPaddingXSchema = z18.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
8812
+ var navLinkBorderRadiusSchema = z18.enum(["none", "sm", "md", "full"]);
8813
+ var navLinkTextSizeSchema = z18.enum(["xs", "sm", "base", "lg"]);
8814
+ var navLinkLetterSpacingSchema = z18.enum(["normal", "wide", "wider", "widest"]);
8815
+ var navLinkStyleSchema = z18.object({
9261
8816
  /** Display name for the style */
9262
- name: z21.string().min(1).max(30).optional(),
8817
+ name: z18.string().min(1).max(30).optional(),
9263
8818
  /** Typography settings (inherited from interactive base) */
9264
8819
  ...interactiveTypographySchema.shape,
9265
8820
  /** Text color token */
9266
- colorToken: z21.string().default("text"),
8821
+ colorToken: z18.string().default("text"),
9267
8822
  /** Optional text size override */
9268
8823
  textSize: navLinkTextSizeSchema.optional(),
9269
8824
  /** Optional letter spacing override */
9270
8825
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9271
8826
  /** Hover/active color token (for color-change effects) */
9272
- hoverColorToken: z21.string().nullable().optional(),
8827
+ hoverColorToken: z18.string().nullable().optional(),
9273
8828
  /** Padding preset */
9274
8829
  padding: navLinkPaddingSchema.default("compact"),
9275
8830
  /** Horizontal padding override (overrides horizontal component of padding preset) */
@@ -9281,7 +8836,7 @@ var navLinkStyleSchema = z21.object({
9281
8836
  });
9282
8837
 
9283
8838
  // ../theme-core/src/customCss/validation.ts
9284
- import { z as z22 } from "zod";
8839
+ import { z as z19 } from "zod";
9285
8840
  var FORBIDDEN_SELECTORS = [":root", "html", "body"];
9286
8841
  var UNIVERSAL_SELECTOR = "*";
9287
8842
  var REMOTE_URL_PATTERN = /url\s*\(\s*['"]?(https?:|\/\/)/i;
@@ -9323,7 +8878,7 @@ function containsForbiddenSelector(selector) {
9323
8878
  }
9324
8879
  return false;
9325
8880
  }
9326
- var selectorSchema = z22.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
8881
+ var selectorSchema = z19.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
9327
8882
  (s) => !containsForbiddenSelector(s),
9328
8883
  { message: "Global selectors (:root, html, body, *) are not allowed" }
9329
8884
  );
@@ -9333,38 +8888,38 @@ function containsRemoteUrl(value) {
9333
8888
  function containsJavascriptUrl(value) {
9334
8889
  return JAVASCRIPT_URL_PATTERN.test(value);
9335
8890
  }
9336
- var declarationValueSchema = z22.string().max(500, "Declaration value too long (max 500 characters)").refine(
8891
+ var declarationValueSchema = z19.string().max(500, "Declaration value too long (max 500 characters)").refine(
9337
8892
  (v) => !containsRemoteUrl(v),
9338
8893
  { message: "Remote url() references are not allowed. Use local paths, data URIs, or fragment IDs." }
9339
8894
  ).refine(
9340
8895
  (v) => !containsJavascriptUrl(v),
9341
8896
  { message: "javascript: URLs are not allowed" }
9342
8897
  );
9343
- var declarationsSchema = z22.record(
9344
- z22.string().min(1).max(100),
8898
+ var declarationsSchema = z19.record(
8899
+ z19.string().min(1).max(100),
9345
8900
  // property name
9346
8901
  declarationValueSchema
9347
8902
  // property value
9348
8903
  );
9349
- var customCssRuleSchema = z22.object({
9350
- id: z22.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
8904
+ var customCssRuleSchema = z19.object({
8905
+ id: z19.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
9351
8906
  selector: selectorSchema,
9352
8907
  declarations: declarationsSchema
9353
8908
  });
9354
8909
  var blockCustomCssRuleSchema = customCssRuleSchema.extend({
9355
- blockKind: z22.string().min(1, "Block kind is required").max(50, "Block kind too long")
8910
+ blockKind: z19.string().min(1, "Block kind is required").max(50, "Block kind too long")
9356
8911
  });
9357
- var customCssRulesSchema = z22.array(customCssRuleSchema).optional();
9358
- var blockCustomCssRulesSchema = z22.array(blockCustomCssRuleSchema).optional();
8912
+ var customCssRulesSchema = z19.array(customCssRuleSchema).optional();
8913
+ var blockCustomCssRulesSchema = z19.array(blockCustomCssRuleSchema).optional();
9359
8914
 
9360
8915
  // ../theme-core/src/customCss/atRuleValidation.ts
9361
- import { z as z23 } from "zod";
8916
+ import { z as z20 } from "zod";
9362
8917
  var KEYFRAME_OFFSET_PATTERN = /^(from|to|\d{1,3}%)$/i;
9363
8918
  var ANIMATION_NAME_PATTERN = /^[a-zA-Z_-][a-zA-Z0-9_-]*$/;
9364
8919
  var BLOCKED_AT_RULES = ["@import", "@charset"];
9365
8920
  var BLOCKED_AT_RULE_PATTERN = /@(?:import|charset)\b/i;
9366
- var ruleIdSchema = z23.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
9367
- var nestedRuleSchema = z23.object({
8921
+ var ruleIdSchema = z20.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
8922
+ var nestedRuleSchema = z20.object({
9368
8923
  selector: selectorSchema,
9369
8924
  declarations: declarationsSchema
9370
8925
  });
@@ -9376,146 +8931,146 @@ function isValidKeyframeOffset(offset) {
9376
8931
  const value = parseInt(match[1], 10);
9377
8932
  return value >= 0 && value <= 100;
9378
8933
  }
9379
- var keyframeOffsetSchema = z23.string().transform((offset) => offset.trim()).refine(
8934
+ var keyframeOffsetSchema = z20.string().transform((offset) => offset.trim()).refine(
9380
8935
  (offset) => KEYFRAME_OFFSET_PATTERN.test(offset),
9381
8936
  { message: 'Invalid keyframe offset. Use percentages (0%, 50%, 100%) or "from"/"to"' }
9382
8937
  ).refine(
9383
8938
  isValidKeyframeOffset,
9384
8939
  { message: "Keyframe offset must be between 0% and 100%" }
9385
8940
  );
9386
- var animationNameSchema = z23.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
8941
+ var animationNameSchema = z20.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
9387
8942
  (name) => ANIMATION_NAME_PATTERN.test(name),
9388
8943
  { message: "Invalid animation name. Use letters, numbers, dashes, underscores (start with letter, dash, or underscore)" }
9389
8944
  );
9390
- var keyframeSchema = z23.object({
8945
+ var keyframeSchema = z20.object({
9391
8946
  offset: keyframeOffsetSchema,
9392
8947
  declarations: declarationsSchema
9393
8948
  });
9394
- var keyframesAtRuleSchema = z23.object({
8949
+ var keyframesAtRuleSchema = z20.object({
9395
8950
  id: ruleIdSchema,
9396
- type: z23.literal("keyframes"),
8951
+ type: z20.literal("keyframes"),
9397
8952
  name: animationNameSchema,
9398
- frames: z23.array(keyframeSchema).min(1, "At least one keyframe is required")
8953
+ frames: z20.array(keyframeSchema).min(1, "At least one keyframe is required")
9399
8954
  });
9400
- var fontFaceDeclarationsSchema = z23.record(z23.string().min(1).max(100), declarationValueSchema).refine(
8955
+ var fontFaceDeclarationsSchema = z20.record(z20.string().min(1).max(100), declarationValueSchema).refine(
9401
8956
  (decls) => "fontFamily" in decls || "font-family" in decls,
9402
8957
  { message: "font-family is required in @font-face" }
9403
8958
  );
9404
- var fontFaceAtRuleSchema = z23.object({
8959
+ var fontFaceAtRuleSchema = z20.object({
9405
8960
  id: ruleIdSchema,
9406
- type: z23.literal("font-face"),
8961
+ type: z20.literal("font-face"),
9407
8962
  declarations: fontFaceDeclarationsSchema
9408
8963
  });
9409
- var mediaQuerySchema = z23.string().min(1, "Media query is required").max(200, "Media query too long");
9410
- var mediaAtRuleSchema = z23.object({
8964
+ var mediaQuerySchema = z20.string().min(1, "Media query is required").max(200, "Media query too long");
8965
+ var mediaAtRuleSchema = z20.object({
9411
8966
  id: ruleIdSchema,
9412
- type: z23.literal("media"),
8967
+ type: z20.literal("media"),
9413
8968
  query: mediaQuerySchema,
9414
- rules: z23.array(nestedRuleSchema).min(1, "At least one rule is required")
8969
+ rules: z20.array(nestedRuleSchema).min(1, "At least one rule is required")
9415
8970
  });
9416
- var supportsConditionSchema = z23.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
9417
- var supportsAtRuleSchema = z23.object({
8971
+ var supportsConditionSchema = z20.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
8972
+ var supportsAtRuleSchema = z20.object({
9418
8973
  id: ruleIdSchema,
9419
- type: z23.literal("supports"),
8974
+ type: z20.literal("supports"),
9420
8975
  condition: supportsConditionSchema,
9421
- rules: z23.array(nestedRuleSchema).min(1, "At least one rule is required")
8976
+ rules: z20.array(nestedRuleSchema).min(1, "At least one rule is required")
9422
8977
  });
9423
8978
  function containsBlockedAtRule(css) {
9424
8979
  return BLOCKED_AT_RULE_PATTERN.test(css);
9425
8980
  }
9426
- var rawCssSchema = z23.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
8981
+ var rawCssSchema = z20.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
9427
8982
  (css) => css.trim().startsWith("@"),
9428
8983
  { message: "Raw at-rule must start with @" }
9429
8984
  ).refine(
9430
8985
  (css) => !containsBlockedAtRule(css),
9431
8986
  { message: `Blocked at-rules: ${BLOCKED_AT_RULES.join(", ")}. Use typed at-rules or local assets instead.` }
9432
8987
  );
9433
- var rawAtRuleSchema = z23.object({
8988
+ var rawAtRuleSchema = z20.object({
9434
8989
  id: ruleIdSchema,
9435
- type: z23.literal("raw"),
8990
+ type: z20.literal("raw"),
9436
8991
  css: rawCssSchema
9437
8992
  });
9438
- var customCssAtRuleSchema = z23.discriminatedUnion("type", [
8993
+ var customCssAtRuleSchema = z20.discriminatedUnion("type", [
9439
8994
  keyframesAtRuleSchema,
9440
8995
  fontFaceAtRuleSchema,
9441
8996
  mediaAtRuleSchema,
9442
8997
  supportsAtRuleSchema,
9443
8998
  rawAtRuleSchema
9444
8999
  ]);
9445
- var customCssAtRulesSchema = z23.array(customCssAtRuleSchema).optional();
9000
+ var customCssAtRulesSchema = z20.array(customCssAtRuleSchema).optional();
9446
9001
 
9447
9002
  // ../theme-core/src/shared/componentStyles.ts
9448
- import { z as z24 } from "zod";
9449
- var componentBorderSchema = z24.object({
9450
- width: z24.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
9451
- style: z24.enum(["solid", "dashed"]).default("solid"),
9452
- colorToken: z24.string().optional()
9003
+ import { z as z21 } from "zod";
9004
+ var componentBorderSchema = z21.object({
9005
+ width: z21.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
9006
+ style: z21.enum(["solid", "dashed"]).default("solid"),
9007
+ colorToken: z21.string().optional()
9453
9008
  // defaults to "border" if not set
9454
9009
  });
9455
- var componentShadowSchema = z24.object({
9456
- elevation: z24.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
9010
+ var componentShadowSchema = z21.object({
9011
+ elevation: z21.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
9457
9012
  });
9458
9013
 
9459
9014
  // ../theme-core/src/schema.ts
9460
- var axesSchema = z25.object({
9461
- tone: z25.enum(["minimal", "classic", "bold"]),
9462
- energy: z25.enum(["calm", "vibrant"]),
9463
- density: z25.enum(["airy", "regular", "compact"]),
9464
- mediaBias: z25.enum(["text", "media", "mixed"]),
9465
- conversionBias: z25.enum(["low", "med", "high"]),
9466
- motion: z25.enum(["subtle", "standard", "expressive"])
9467
- });
9468
- var colourHexString = z25.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
9469
- var paletteColorSchema = z25.object({
9470
- name: z25.string().min(1),
9015
+ var axesSchema = z22.object({
9016
+ tone: z22.enum(["minimal", "classic", "bold"]),
9017
+ energy: z22.enum(["calm", "vibrant"]),
9018
+ density: z22.enum(["airy", "regular", "compact"]),
9019
+ mediaBias: z22.enum(["text", "media", "mixed"]),
9020
+ conversionBias: z22.enum(["low", "med", "high"]),
9021
+ motion: z22.enum(["subtle", "standard", "expressive"])
9022
+ });
9023
+ var colourHexString = z22.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
9024
+ var paletteColorSchema = z22.object({
9025
+ name: z22.string().min(1),
9471
9026
  hex: colourHexString
9472
9027
  });
9473
- var paletteMetaSchema = z25.object({
9474
- mode: z25.enum(["light", "dark"])
9028
+ var paletteMetaSchema = z22.object({
9029
+ mode: z22.enum(["light", "dark"])
9475
9030
  });
9476
- var paletteSchema = z25.object({
9477
- colors: z25.array(paletteColorSchema),
9031
+ var paletteSchema = z22.object({
9032
+ colors: z22.array(paletteColorSchema),
9478
9033
  meta: paletteMetaSchema
9479
9034
  });
9480
- var typographyStyleSchema = z25.object({
9481
- family: z25.string().min(1),
9482
- weight: z25.enum(["light", "regular", "medium", "semibold", "bold"]),
9483
- letterSpacing: z25.enum(["tight", "normal", "loose"]),
9484
- lineHeight: z25.enum(["normal", "relaxed", "loose"])
9035
+ var typographyStyleSchema = z22.object({
9036
+ family: z22.string().min(1),
9037
+ weight: z22.enum(["light", "regular", "medium", "semibold", "bold"]),
9038
+ letterSpacing: z22.enum(["tight", "normal", "loose"]),
9039
+ lineHeight: z22.enum(["normal", "relaxed", "loose"])
9485
9040
  });
9486
9041
  var bodyTypographyStyleSchema = typographyStyleSchema.extend({
9487
- size: z25.enum(["md", "lg", "xl"])
9042
+ size: z22.enum(["md", "lg", "xl"])
9488
9043
  });
9489
- var headingSizeSchema = z25.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
9490
- var headingTypographyOverridesSchema = z25.object({
9491
- weight: z25.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
9492
- letterSpacing: z25.enum(["tight", "normal", "loose"]).nullable().optional(),
9044
+ var headingSizeSchema = z22.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
9045
+ var headingTypographyOverridesSchema = z22.object({
9046
+ weight: z22.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
9047
+ letterSpacing: z22.enum(["tight", "normal", "loose"]).nullable().optional(),
9493
9048
  size: headingSizeSchema.nullable().optional(),
9494
- lineHeight: z25.enum(["normal", "relaxed", "loose"]).nullable().optional(),
9495
- italic: z25.boolean().nullable().optional(),
9496
- colorToken: z25.string().min(1).nullable().optional()
9049
+ lineHeight: z22.enum(["normal", "relaxed", "loose"]).nullable().optional(),
9050
+ italic: z22.boolean().nullable().optional(),
9051
+ colorToken: z22.string().min(1).nullable().optional()
9497
9052
  // Palette token name for heading color
9498
9053
  });
9499
9054
  var headingTypographyStyleSchema = typographyStyleSchema.extend({
9500
- case: z25.enum(["uppercase", "normal", "smallCaps"]).nullable(),
9501
- italic: z25.boolean().nullable(),
9502
- colorToken: z25.string().min(1).nullable().optional()
9055
+ case: z22.enum(["uppercase", "normal", "smallCaps"]).nullable(),
9056
+ italic: z22.boolean().nullable(),
9057
+ colorToken: z22.string().min(1).nullable().optional()
9503
9058
  // Palette token name for heading color
9504
9059
  });
9505
- var proseLinkUnderlineStyleSchema = z25.enum(["solid", "dotted", "dashed"]);
9506
- var proseLinkUnderlineThicknessSchema = z25.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9507
- var proseLinkUnderlineOffsetSchema = z25.enum(["auto", "tight", "normal", "loose"]);
9508
- var proseLinkStyleSchema = z25.object({
9509
- colorToken: z25.string().min(1).optional(),
9510
- hoverColorToken: z25.string().min(1).optional(),
9511
- underline: z25.boolean().optional(),
9512
- decorationColorToken: z25.string().min(1).optional(),
9513
- hoverDecorationColorToken: z25.string().min(1).optional(),
9060
+ var proseLinkUnderlineStyleSchema = z22.enum(["solid", "dotted", "dashed"]);
9061
+ var proseLinkUnderlineThicknessSchema = z22.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9062
+ var proseLinkUnderlineOffsetSchema = z22.enum(["auto", "tight", "normal", "loose"]);
9063
+ var proseLinkStyleSchema = z22.object({
9064
+ colorToken: z22.string().min(1).optional(),
9065
+ hoverColorToken: z22.string().min(1).optional(),
9066
+ underline: z22.boolean().optional(),
9067
+ decorationColorToken: z22.string().min(1).optional(),
9068
+ hoverDecorationColorToken: z22.string().min(1).optional(),
9514
9069
  underlineStyle: proseLinkUnderlineStyleSchema.optional(),
9515
9070
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9516
9071
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9517
9072
  });
9518
- var semanticSpacingSchema = z25.enum([
9073
+ var semanticSpacingSchema = z22.enum([
9519
9074
  "none",
9520
9075
  "compact",
9521
9076
  "cozy",
@@ -9523,62 +9078,62 @@ var semanticSpacingSchema = z25.enum([
9523
9078
  "comfortable",
9524
9079
  "spacious"
9525
9080
  ]);
9526
- var boxRoundedSchema = z25.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9527
- var boxBackgroundOverlaySchema = z25.object({
9528
- type: z25.enum(["none", "color", "gradient"]).nullable().optional(),
9529
- color: z25.string().nullable().optional(),
9530
- gradient: z25.string().nullable().optional(),
9531
- opacity: z25.number().min(0).max(1).nullable().optional()
9532
- });
9533
- var boxBackgroundSchema = z25.object({
9534
- type: z25.enum(["color", "gradient", "image"]).optional(),
9535
- color: z25.string().nullable().optional(),
9536
- gradient: z25.string().nullable().optional(),
9081
+ var boxRoundedSchema = z22.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9082
+ var boxBackgroundOverlaySchema = z22.object({
9083
+ type: z22.enum(["none", "color", "gradient"]).nullable().optional(),
9084
+ color: z22.string().nullable().optional(),
9085
+ gradient: z22.string().nullable().optional(),
9086
+ opacity: z22.number().min(0).max(1).nullable().optional()
9087
+ });
9088
+ var boxBackgroundSchema = z22.object({
9089
+ type: z22.enum(["color", "gradient", "image"]).optional(),
9090
+ color: z22.string().nullable().optional(),
9091
+ gradient: z22.string().nullable().optional(),
9537
9092
  image: mediaSchema.nullable().optional(),
9538
- objectFit: z25.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
9539
- scale: z25.string().nullable().optional(),
9540
- position: z25.string().nullable().optional(),
9541
- opacity: z25.number().min(0).max(1).nullable().optional(),
9093
+ objectFit: z22.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
9094
+ scale: z22.string().nullable().optional(),
9095
+ position: z22.string().nullable().optional(),
9096
+ opacity: z22.number().min(0).max(1).nullable().optional(),
9542
9097
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9543
- textColor: z25.string().nullable().optional(),
9544
- headingColor: z25.string().nullable().optional()
9098
+ textColor: z22.string().nullable().optional(),
9099
+ headingColor: z22.string().nullable().optional()
9545
9100
  });
9546
- var sectionStylesOverrideSchema = z25.object({
9101
+ var sectionStylesOverrideSchema = z22.object({
9547
9102
  background: boxBackgroundSchema.nullable().optional(),
9548
9103
  spacing: semanticSpacingSchema.nullable().optional(),
9549
- minHeight: z25.enum(["none", "hero", "immersive"]).nullable().optional()
9104
+ minHeight: z22.enum(["none", "hero", "immersive"]).nullable().optional()
9550
9105
  });
9551
- var containerStylesOverrideSchema = z25.object({
9106
+ var containerStylesOverrideSchema = z22.object({
9552
9107
  background: boxBackgroundSchema.nullable().optional(),
9553
9108
  spacing: semanticSpacingSchema.nullable().optional(),
9554
- raised: z25.boolean().nullable().optional(),
9109
+ raised: z22.boolean().nullable().optional(),
9555
9110
  rounded: boxRoundedSchema.nullable().optional(),
9556
- fullWidth: z25.boolean().nullable().optional()
9111
+ fullWidth: z22.boolean().nullable().optional()
9557
9112
  });
9558
- var cardBorderOverrideSchema = z25.object({
9559
- enabled: z25.boolean().nullable().optional(),
9560
- width: z25.enum(["none", "1", "2", "3"]).nullable().optional(),
9561
- colorToken: z25.string().nullable().optional()
9113
+ var cardBorderOverrideSchema = z22.object({
9114
+ enabled: z22.boolean().nullable().optional(),
9115
+ width: z22.enum(["none", "1", "2", "3"]).nullable().optional(),
9116
+ colorToken: z22.string().nullable().optional()
9562
9117
  });
9563
- var cardStylesOverrideSchema = z25.object({
9118
+ var cardStylesOverrideSchema = z22.object({
9564
9119
  background: boxBackgroundSchema.nullable().optional(),
9565
9120
  border: cardBorderOverrideSchema.nullable().optional(),
9566
9121
  spacing: semanticSpacingSchema.nullable().optional(),
9567
- raised: z25.boolean().nullable().optional(),
9122
+ raised: z22.boolean().nullable().optional(),
9568
9123
  rounded: boxRoundedSchema.nullable().optional()
9569
9124
  });
9570
- var blockStyleOverridesSchema = z25.object({
9125
+ var blockStyleOverridesSchema = z22.object({
9571
9126
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
9572
9127
  containerStyles: containerStylesOverrideSchema.nullable().optional(),
9573
9128
  cardStyles: cardStylesOverrideSchema.nullable().optional()
9574
9129
  });
9575
- var blockThemeOverrideSchema = z25.object({
9576
- typography: z25.object({
9130
+ var blockThemeOverrideSchema = z22.object({
9131
+ typography: z22.object({
9577
9132
  proseLinkStyle: proseLinkStyleSchema.optional()
9578
9133
  }).optional(),
9579
9134
  styles: blockStyleOverridesSchema.optional()
9580
9135
  });
9581
- var typographyScaleSchema = z25.enum([
9136
+ var typographyScaleSchema = z22.enum([
9582
9137
  // New intuitive names
9583
9138
  "compact",
9584
9139
  // ratio 1.2 (was minorThird)
@@ -9591,9 +9146,9 @@ var typographyScaleSchema = z25.enum([
9591
9146
  "majorThird",
9592
9147
  "perfectFourth"
9593
9148
  ]);
9594
- var typographySchema = z25.object({
9149
+ var typographySchema = z22.object({
9595
9150
  body: bodyTypographyStyleSchema,
9596
- headings: z25.object({
9151
+ headings: z22.object({
9597
9152
  default: headingTypographyStyleSchema,
9598
9153
  h1: headingTypographyOverridesSchema,
9599
9154
  h2: headingTypographyOverridesSchema,
@@ -9606,41 +9161,41 @@ var typographySchema = z25.object({
9606
9161
  scale: typographyScaleSchema,
9607
9162
  proseLinkStyle: proseLinkStyleSchema.optional()
9608
9163
  });
9609
- var spaceSchema = z25.enum(["comfortable", "standard", "dense"]);
9610
- var corners = z25.enum(["square", "soft", "rounded", "pill"]);
9611
- var shadow = z25.object({
9612
- elevation: z25.enum(["none", "low", "medium", "high"]),
9613
- softness: z25.enum(["crisp", "soft", "hard"]).nullable(),
9614
- position: z25.enum(["bottom", "bottom-right"]).default("bottom")
9164
+ var spaceSchema = z22.enum(["comfortable", "standard", "dense"]);
9165
+ var corners = z22.enum(["square", "soft", "rounded", "pill"]);
9166
+ var shadow = z22.object({
9167
+ elevation: z22.enum(["none", "low", "medium", "high"]),
9168
+ softness: z22.enum(["crisp", "soft", "hard"]).nullable(),
9169
+ position: z22.enum(["bottom", "bottom-right"]).default("bottom")
9615
9170
  });
9616
- var border = z25.object({
9617
- width: z25.enum(["none", "hairline", "thin", "thick"]),
9618
- style: z25.enum(["solid", "dashed"])
9171
+ var border = z22.object({
9172
+ width: z22.enum(["none", "hairline", "thin", "thick"]),
9173
+ style: z22.enum(["solid", "dashed"])
9619
9174
  });
9620
- var motion = z25.object({
9621
- level: z25.enum(["off", "low", "medium", "high"]),
9622
- easing: z25.enum(["standard", "snappy", "gentle"]).nullable()
9175
+ var motion = z22.object({
9176
+ level: z22.enum(["off", "low", "medium", "high"]),
9177
+ easing: z22.enum(["standard", "snappy", "gentle"]).nullable()
9623
9178
  });
9624
- var buttonStyle = z25.object({
9179
+ var buttonStyle = z22.object({
9625
9180
  shape: corners
9626
9181
  // Used for --radius-control CSS variable
9627
9182
  });
9628
- var cardStyle = z25.object({
9629
- elevation: z25.enum(["none", "low", "medium", "high"]),
9630
- border: z25.enum(["none", "subtle", "defined"]),
9183
+ var cardStyle = z22.object({
9184
+ elevation: z22.enum(["none", "low", "medium", "high"]),
9185
+ border: z22.enum(["none", "subtle", "defined"]),
9631
9186
  shape: corners,
9632
- headerStyle: z25.enum(["plain", "accentBar", "subtleBg"]).nullable(),
9633
- mediaTreatment: z25.enum(["square", "rounded", "bleed"]).nullable()
9187
+ headerStyle: z22.enum(["plain", "accentBar", "subtleBg"]).nullable(),
9188
+ mediaTreatment: z22.enum(["square", "rounded", "bleed"]).nullable()
9634
9189
  });
9635
- var inputStyle = z25.object({
9190
+ var inputStyle = z22.object({
9636
9191
  shape: corners,
9637
- border: z25.enum(["subtle", "defined", "underline"]),
9638
- focus: z25.enum(["glow", "ring", "underline"]),
9639
- label: z25.enum(["inside", "above"])
9192
+ border: z22.enum(["subtle", "defined", "underline"]),
9193
+ focus: z22.enum(["glow", "ring", "underline"]),
9194
+ label: z22.enum(["inside", "above"])
9640
9195
  });
9641
- var headerVariant = z25.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9642
- var headerPositioning = z25.enum(["static", "sticky", "fixed"]);
9643
- var headerNavStyle = z25.enum([
9196
+ var headerVariant = z22.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9197
+ var headerPositioning = z22.enum(["static", "sticky", "fixed"]);
9198
+ var headerNavStyle = z22.enum([
9644
9199
  "minimal",
9645
9200
  "underline",
9646
9201
  "underline-grow",
@@ -9649,82 +9204,82 @@ var headerNavStyle = z25.enum([
9649
9204
  "frosted",
9650
9205
  "solid"
9651
9206
  ]);
9652
- var navFontWeight = z25.enum(["regular", "medium", "semibold", "bold"]);
9653
- var headerMaxWidth = z25.enum(["container", "full"]);
9654
- var headerContainerSchema = z25.object({
9655
- rounded: z25.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
9656
- border: z25.boolean().default(true),
9657
- shadow: z25.boolean().default(true),
9658
- padding: z25.enum(["sm", "md", "lg"]).default("md"),
9659
- tint: z25.string().nullable().optional(),
9660
- opacity: z25.number().min(0).max(1).default(0.12)
9207
+ var navFontWeight = z22.enum(["regular", "medium", "semibold", "bold"]);
9208
+ var headerMaxWidth = z22.enum(["container", "full"]);
9209
+ var headerContainerSchema = z22.object({
9210
+ rounded: z22.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
9211
+ border: z22.boolean().default(true),
9212
+ shadow: z22.boolean().default(true),
9213
+ padding: z22.enum(["sm", "md", "lg"]).default("md"),
9214
+ tint: z22.string().nullable().optional(),
9215
+ opacity: z22.number().min(0).max(1).default(0.12)
9661
9216
  }).optional();
9662
9217
  var headerBorderSchema = componentBorderSchema.extend({
9663
- position: z25.enum(["bottom", "top", "both", "none"]).default("bottom")
9218
+ position: z22.enum(["bottom", "top", "both", "none"]).default("bottom")
9664
9219
  }).optional();
9665
- var logoStyleSchema = z25.object({
9666
- fontFamily: z25.enum(["heading", "body"]).default("heading"),
9667
- letterSpacing: z25.enum(["normal", "wide", "wider", "widest"]).default("normal"),
9668
- gradient: z25.boolean().default(false)
9220
+ var logoStyleSchema = z22.object({
9221
+ fontFamily: z22.enum(["heading", "body"]).default("heading"),
9222
+ letterSpacing: z22.enum(["normal", "wide", "wider", "widest"]).default("normal"),
9223
+ gradient: z22.boolean().default(false)
9669
9224
  }).optional();
9670
- var headerLogoTextSchema = z25.object({
9671
- mobileWrapLines: z25.union([z25.literal(1), z25.literal(2)]).optional(),
9672
- mobileMaxWidth: z25.enum(["xs", "sm", "md"]).optional(),
9673
- hideOnShrink: z25.boolean().optional()
9225
+ var headerLogoTextSchema = z22.object({
9226
+ mobileWrapLines: z22.union([z22.literal(1), z22.literal(2)]).optional(),
9227
+ mobileMaxWidth: z22.enum(["xs", "sm", "md"]).optional(),
9228
+ hideOnShrink: z22.boolean().optional()
9674
9229
  }).optional();
9675
- var navEffectsSchema = z25.object({
9676
- underlineGradient: z25.boolean().default(false),
9677
- glow: z25.boolean().default(false),
9678
- glowColor: z25.string().optional(),
9679
- neumorphic: z25.boolean().default(false)
9230
+ var navEffectsSchema = z22.object({
9231
+ underlineGradient: z22.boolean().default(false),
9232
+ glow: z22.boolean().default(false),
9233
+ glowColor: z22.string().optional(),
9234
+ neumorphic: z22.boolean().default(false)
9680
9235
  }).optional();
9681
- var dropdownStyleSchema = z25.object({
9236
+ var dropdownStyleSchema = z22.object({
9682
9237
  // Container styling
9683
- background: z25.string().default("surface"),
9238
+ background: z22.string().default("surface"),
9684
9239
  // color token
9685
- textColor: z25.string().default("text"),
9240
+ textColor: z22.string().default("text"),
9686
9241
  // color token
9687
- borderColor: z25.string().nullable().default("border"),
9242
+ borderColor: z22.string().nullable().default("border"),
9688
9243
  // null = no border
9689
- shadow: z25.enum(["none", "sm", "md", "lg"]).default("md"),
9690
- borderRadius: z25.enum(["none", "sm", "md", "lg"]).default("md"),
9244
+ shadow: z22.enum(["none", "sm", "md", "lg"]).default("md"),
9245
+ borderRadius: z22.enum(["none", "sm", "md", "lg"]).default("md"),
9691
9246
  // Link hover states (explicit control)
9692
- hoverBackground: z25.string().nullable().optional(),
9247
+ hoverBackground: z22.string().nullable().optional(),
9693
9248
  // color token, null = transparent
9694
- hoverTextColor: z25.string().nullable().optional(),
9249
+ hoverTextColor: z22.string().nullable().optional(),
9695
9250
  // color token, null = inherit
9696
9251
  // Typography
9697
- textTransform: z25.enum(["none", "uppercase", "capitalize"]).default("none"),
9698
- letterSpacing: z25.enum(["normal", "wide", "wider"]).default("normal"),
9699
- fontWeight: z25.enum(["regular", "medium", "semibold", "bold"]).optional(),
9252
+ textTransform: z22.enum(["none", "uppercase", "capitalize"]).default("none"),
9253
+ letterSpacing: z22.enum(["normal", "wide", "wider"]).default("normal"),
9254
+ fontWeight: z22.enum(["regular", "medium", "semibold", "bold"]).optional(),
9700
9255
  // optional = inherit from navWeight
9701
- textSize: z25.enum(["xs", "sm", "base", "lg"]).optional()
9256
+ textSize: z22.enum(["xs", "sm", "base", "lg"]).optional()
9702
9257
  // optional = no override (browser default)
9703
9258
  }).optional();
9704
- var headerCtaGapSchema = z25.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9705
- var navContainerSchema = z25.object({
9706
- type: z25.enum(["none", "pill", "glass"]).default("none"),
9707
- tint: z25.string().nullable().optional(),
9708
- opacity: z25.number().min(0).max(1).default(0.15)
9259
+ var headerCtaGapSchema = z22.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9260
+ var navContainerSchema = z22.object({
9261
+ type: z22.enum(["none", "pill", "glass"]).default("none"),
9262
+ tint: z22.string().nullable().optional(),
9263
+ opacity: z22.number().min(0).max(1).default(0.15)
9709
9264
  }).default({ type: "none", tint: null, opacity: 0.15 });
9710
- var headerBackgroundSchema = z25.object({
9711
- type: z25.enum(["color", "gradient", "image"]),
9712
- color: z25.string().nullable().optional(),
9265
+ var headerBackgroundSchema = z22.object({
9266
+ type: z22.enum(["color", "gradient", "image"]),
9267
+ color: z22.string().nullable().optional(),
9713
9268
  gradient: gradientConfigSchema.nullable().optional(),
9714
9269
  image: mediaSchema.nullable().optional(),
9715
- textColor: z25.string().nullable().optional()
9270
+ textColor: z22.string().nullable().optional()
9716
9271
  });
9717
- var headerSchema = z25.object({
9272
+ var headerSchema = z22.object({
9718
9273
  variant: headerVariant,
9719
9274
  positioning: headerPositioning,
9720
- shrinkOnScroll: z25.boolean(),
9275
+ shrinkOnScroll: z22.boolean(),
9721
9276
  maxWidth: headerMaxWidth,
9722
9277
  logoOverride: mediaSchema.nullable().optional(),
9723
9278
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9724
- textColor: z25.string().nullable().optional(),
9279
+ textColor: z22.string().nullable().optional(),
9725
9280
  // Site title and general header text
9726
9281
  navStyle: headerNavStyle,
9727
- navColor: z25.string().nullable().optional(),
9282
+ navColor: z22.string().nullable().optional(),
9728
9283
  // Nav links (inherits textColor if not set)
9729
9284
  navWeight: navFontWeight.default("medium"),
9730
9285
  // New fields for header system enhancement
@@ -9743,50 +9298,50 @@ var headerSchema = z25.object({
9743
9298
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9744
9299
  dropdownStyle: dropdownStyleSchema
9745
9300
  });
9746
- var footerVariant = z25.enum(["simple", "columns", "split"]);
9747
- var footerMaxWidth = z25.enum(["container", "full"]);
9748
- var footerMode = z25.enum(["default", "blocks", "default+blocks", "none"]);
9749
- var footerNavLayoutMode = z25.enum(["stack", "inline", "inline-wrap"]);
9750
- var footerNavLayoutAlign = z25.enum(["start", "center", "end", "space-between"]);
9751
- var footerSpacing = z25.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9752
- var footerLogoPlacement = z25.enum(["left", "right", "above", "below"]);
9753
- var footerLogoSize = z25.enum(["sm", "md", "lg", "xl"]);
9754
- var footerLogoMaxHeight = z25.enum(["sm", "md", "lg", "xl"]);
9755
- var footerBottomTextLinkStyleSchema = z25.object({
9756
- colorToken: z25.string().optional(),
9757
- hoverColorToken: z25.string().nullable().optional(),
9758
- decorationColorToken: z25.string().nullable().optional(),
9759
- underline: z25.boolean().optional()
9760
- });
9761
- var footerBottomBarSchema = z25.object({
9762
- enabled: z25.boolean().optional(),
9763
- fullBleed: z25.boolean().optional(),
9301
+ var footerVariant = z22.enum(["simple", "columns", "split"]);
9302
+ var footerMaxWidth = z22.enum(["container", "full"]);
9303
+ var footerMode = z22.enum(["default", "blocks", "default+blocks", "none"]);
9304
+ var footerNavLayoutMode = z22.enum(["stack", "inline", "inline-wrap"]);
9305
+ var footerNavLayoutAlign = z22.enum(["start", "center", "end", "space-between"]);
9306
+ var footerSpacing = z22.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9307
+ var footerLogoPlacement = z22.enum(["left", "right", "above", "below"]);
9308
+ var footerLogoSize = z22.enum(["sm", "md", "lg", "xl"]);
9309
+ var footerLogoMaxHeight = z22.enum(["sm", "md", "lg", "xl"]);
9310
+ var footerBottomTextLinkStyleSchema = z22.object({
9311
+ colorToken: z22.string().optional(),
9312
+ hoverColorToken: z22.string().nullable().optional(),
9313
+ decorationColorToken: z22.string().nullable().optional(),
9314
+ underline: z22.boolean().optional()
9315
+ });
9316
+ var footerBottomBarSchema = z22.object({
9317
+ enabled: z22.boolean().optional(),
9318
+ fullBleed: z22.boolean().optional(),
9764
9319
  background: headerBackgroundSchema.optional(),
9765
- textColor: z25.string().nullable().optional(),
9766
- textAlign: z25.enum(["left", "center", "right"]).optional(),
9320
+ textColor: z22.string().nullable().optional(),
9321
+ textAlign: z22.enum(["left", "center", "right"]).optional(),
9767
9322
  paddingY: footerSpacing.optional(),
9768
9323
  paddingX: footerSpacing.optional(),
9769
- borderTop: z25.object({
9770
- colorToken: z25.string().nullable().optional(),
9771
- width: z25.enum(["none", "thin", "medium", "thick"]).optional()
9324
+ borderTop: z22.object({
9325
+ colorToken: z22.string().nullable().optional(),
9326
+ width: z22.enum(["none", "thin", "medium", "thick"]).optional()
9772
9327
  }).optional()
9773
9328
  });
9774
- var footerNavLayoutSchema = z25.object({
9329
+ var footerNavLayoutSchema = z22.object({
9775
9330
  layout: footerNavLayoutMode.optional(),
9776
9331
  align: footerNavLayoutAlign.optional(),
9777
9332
  gapX: footerSpacing.optional(),
9778
9333
  gapY: footerSpacing.optional(),
9779
- columns: z25.number().int().min(1).max(6).optional()
9334
+ columns: z22.number().int().min(1).max(6).optional()
9780
9335
  });
9781
- var footerLogoSchema = z25.object({
9782
- showLogo: z25.boolean().default(true),
9783
- showLogoText: z25.boolean().optional(),
9336
+ var footerLogoSchema = z22.object({
9337
+ showLogo: z22.boolean().default(true),
9338
+ showLogoText: z22.boolean().optional(),
9784
9339
  placement: footerLogoPlacement.optional(),
9785
9340
  size: footerLogoSize.optional(),
9786
9341
  maxHeight: footerLogoMaxHeight.optional(),
9787
- align: z25.enum(["start", "center", "end"]).optional()
9342
+ align: z22.enum(["start", "center", "end"]).optional()
9788
9343
  });
9789
- var footerSchema = z25.object({
9344
+ var footerSchema = z22.object({
9790
9345
  /**
9791
9346
  * SDK-only footer rendering mode.
9792
9347
  *
@@ -9795,11 +9350,11 @@ var footerSchema = z25.object({
9795
9350
  mode: footerMode.optional(),
9796
9351
  variant: footerVariant,
9797
9352
  maxWidth: footerMaxWidth,
9798
- showLogoText: z25.boolean().optional(),
9353
+ showLogoText: z22.boolean().optional(),
9799
9354
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9800
9355
  // Footer nav styling (independent from header)
9801
9356
  navStyle: headerNavStyle.default("minimal"),
9802
- navColor: z25.string().nullable().optional(),
9357
+ navColor: z22.string().nullable().optional(),
9803
9358
  navWeight: navFontWeight.default("medium"),
9804
9359
  // Full nav link customization (overrides navStyle if set)
9805
9360
  navLinkStyle: navLinkStyleSchema.optional(),
@@ -9810,15 +9365,15 @@ var footerSchema = z25.object({
9810
9365
  logo: footerLogoSchema.optional(),
9811
9366
  bottomBar: footerBottomBarSchema.optional()
9812
9367
  });
9813
- var containerPaddingPresetSchema = z25.enum(["tight", "compact", "default", "relaxed"]);
9814
- var layoutSchema = z25.object({
9815
- containerPadding: z25.object({
9368
+ var containerPaddingPresetSchema = z22.enum(["tight", "compact", "default", "relaxed"]);
9369
+ var layoutSchema = z22.object({
9370
+ containerPadding: z22.object({
9816
9371
  mobile: containerPaddingPresetSchema.optional(),
9817
9372
  tablet: containerPaddingPresetSchema.optional(),
9818
9373
  desktop: containerPaddingPresetSchema.optional()
9819
9374
  }).optional()
9820
9375
  }).optional();
9821
- var heroTypographySizeSchema = z25.enum([
9376
+ var heroTypographySizeSchema = z22.enum([
9822
9377
  "sm",
9823
9378
  "base",
9824
9379
  "lg",
@@ -9829,14 +9384,14 @@ var heroTypographySizeSchema = z25.enum([
9829
9384
  "5xl",
9830
9385
  "6xl"
9831
9386
  ]);
9832
- var heroTypographyLineHeightSchema = z25.enum(["tight", "snug", "normal", "relaxed"]);
9833
- var heroResponsiveTypographySchema = z25.object({
9387
+ var heroTypographyLineHeightSchema = z22.enum(["tight", "snug", "normal", "relaxed"]);
9388
+ var heroResponsiveTypographySchema = z22.object({
9834
9389
  headlineSize: heroTypographySizeSchema.optional(),
9835
9390
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
9836
9391
  subheadlineSize: heroTypographySizeSchema.optional(),
9837
9392
  subheadlineLineHeight: heroTypographyLineHeightSchema.optional()
9838
9393
  });
9839
- var heroTypographySchema = z25.object({
9394
+ var heroTypographySchema = z22.object({
9840
9395
  headlineSize: heroTypographySizeSchema.optional(),
9841
9396
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
9842
9397
  subheadlineSize: heroTypographySizeSchema.optional(),
@@ -9845,24 +9400,24 @@ var heroTypographySchema = z25.object({
9845
9400
  microHeadlineLineHeight: heroTypographyLineHeightSchema.optional(),
9846
9401
  microSubheadlineSize: heroTypographySizeSchema.optional(),
9847
9402
  microSubheadlineLineHeight: heroTypographyLineHeightSchema.optional(),
9848
- responsive: z25.object({
9403
+ responsive: z22.object({
9849
9404
  tablet: heroResponsiveTypographySchema.optional(),
9850
9405
  mobile: heroResponsiveTypographySchema.optional()
9851
9406
  }).optional()
9852
9407
  });
9853
- var heroSchema = z25.object({
9408
+ var heroSchema = z22.object({
9854
9409
  typography: heroTypographySchema.optional()
9855
9410
  }).optional();
9856
- var gradientsSchema = z25.object({
9857
- button: z25.string().min(1).nullable().optional(),
9858
- hero: z25.string().min(1).nullable().optional(),
9859
- background: z25.string().min(1).nullable().optional()
9860
- });
9861
- var themeSchema = z25.object({
9862
- name: z25.string().min(1).max(30),
9863
- description: z25.string().min(1).max(400),
9864
- rationale: z25.string().min(1).max(400),
9865
- siteStyleId: z25.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
9411
+ var gradientsSchema = z22.object({
9412
+ button: z22.string().min(1).nullable().optional(),
9413
+ hero: z22.string().min(1).nullable().optional(),
9414
+ background: z22.string().min(1).nullable().optional()
9415
+ });
9416
+ var themeSchema = z22.object({
9417
+ name: z22.string().min(1).max(30),
9418
+ description: z22.string().min(1).max(400),
9419
+ rationale: z22.string().min(1).max(400),
9420
+ siteStyleId: z22.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
9866
9421
  axes: axesSchema,
9867
9422
  palette: paletteSchema,
9868
9423
  typography: typographySchema,
@@ -9889,16 +9444,16 @@ var themeSchema = z25.object({
9889
9444
  // Block-specific customization (Tier 3)
9890
9445
  // blockCustomVars: Per-block CSS variable overrides as bare values
9891
9446
  // Example: { "event-registration": { "--step-color": "#6d28d9" } }
9892
- blockCustomVars: z25.record(
9893
- z25.string(),
9447
+ blockCustomVars: z22.record(
9448
+ z22.string(),
9894
9449
  // block kind (matches data-block attribute)
9895
- z25.record(z25.string(), z25.string())
9450
+ z22.record(z22.string(), z22.string())
9896
9451
  // { '--var-name': 'value' }
9897
9452
  ).optional(),
9898
9453
  // Structured block-kind theme overrides (v1: typography prose-link style only)
9899
9454
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
9900
- blockOverrides: z25.record(
9901
- z25.string(),
9455
+ blockOverrides: z22.record(
9456
+ z22.string(),
9902
9457
  blockThemeOverrideSchema
9903
9458
  ).optional(),
9904
9459
  // Structured custom CSS rules
@@ -9934,22 +9489,21 @@ var themeSchema = z25.object({
9934
9489
  * }
9935
9490
  * ```
9936
9491
  */
9937
- styleGroups: z25.record(z25.string(), z25.array(z25.string())).optional()
9492
+ styleGroups: z22.record(z22.string(), z22.array(z22.string())).optional()
9938
9493
  });
9939
- var themesTurnSchema = z25.object({
9940
- message: z25.string().min(1),
9941
- themes: z25.array(themeSchema).length(3)
9494
+ var themesTurnSchema = z22.object({
9495
+ message: z22.string().min(1),
9496
+ themes: z22.array(themeSchema).length(3)
9942
9497
  });
9943
9498
 
9944
9499
  // ../theme-core/src/palette/variants/types.ts
9945
- import { z as z26 } from "zod";
9946
9500
  function asPaletteVariantId(value) {
9947
9501
  if (value.length === 0) {
9948
9502
  throw new Error("PaletteVariantId must be a non-empty string");
9949
9503
  }
9950
9504
  return value;
9951
9505
  }
9952
- var paletteVariantIdSchema = z26.string().min(1).transform((value) => asPaletteVariantId(value));
9506
+ var paletteVariantIdSchema = z23.string().min(1).transform((value) => asPaletteVariantId(value));
9953
9507
  var PALETTE_TOKEN_NAMES = [
9954
9508
  "primary",
9955
9509
  "primaryForeground",
@@ -9965,19 +9519,19 @@ var PALETTE_TOKEN_NAMES = [
9965
9519
  "text",
9966
9520
  "border"
9967
9521
  ];
9968
- var paletteTokenNameSchema = z26.enum(PALETTE_TOKEN_NAMES);
9522
+ var paletteTokenNameSchema = z23.enum(PALETTE_TOKEN_NAMES);
9969
9523
  var HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
9970
- var hexColorSchema = z26.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
9524
+ var hexColorSchema = z23.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
9971
9525
  var variantPaletteColorSchema = paletteColorSchema.extend({
9972
9526
  name: paletteTokenNameSchema
9973
9527
  });
9974
- var paletteVariantSchema = z26.object({
9528
+ var paletteVariantSchema = z23.object({
9975
9529
  id: paletteVariantIdSchema,
9976
- name: z26.string().min(1),
9977
- description: z26.string().min(1),
9530
+ name: z23.string().min(1),
9531
+ description: z23.string().min(1),
9978
9532
  tags: styleTagsSchema,
9979
- mode: z26.enum(["light", "dark"]),
9980
- colors: z26.array(variantPaletteColorSchema).min(1)
9533
+ mode: z23.enum(["light", "dark"]),
9534
+ colors: z23.array(variantPaletteColorSchema).min(1)
9981
9535
  });
9982
9536
  function definePaletteVariant(input) {
9983
9537
  return {
@@ -9989,7 +9543,7 @@ function definePaletteVariant(input) {
9989
9543
  colors: input.colors
9990
9544
  };
9991
9545
  }
9992
- var paletteOverridesSchema = z26.object({
9546
+ var paletteOverridesSchema = z23.object({
9993
9547
  primary: hexColorSchema.optional(),
9994
9548
  primaryForeground: hexColorSchema.optional(),
9995
9549
  secondary: hexColorSchema.optional(),
@@ -10209,96 +9763,747 @@ var softNaturalWatercolor = definePaletteVariant({
10209
9763
  ]
10210
9764
  });
10211
9765
 
10212
- // ../theme-core/src/palette/variants/warm-neutral.ts
10213
- var warmNeutralClay = definePaletteVariant({
10214
- id: "warm-neutral-clay",
10215
- name: "Warm Neutral \u2014 Clay",
10216
- description: "Terracotta primary on a cream ground.",
10217
- tags: { tone: "classic", energy: "calm", era: "organic" },
10218
- mode: "light",
10219
- colors: [
10220
- { name: "primary", hex: "#8b5e34" },
10221
- { name: "secondary", hex: "#7c6f64" },
10222
- { name: "accent", hex: "#a15c38" },
10223
- { name: "success", hex: "#527853" },
10224
- { name: "warning", hex: "#b7791f" },
10225
- { name: "destructive", hex: "#b91c1c" },
10226
- { name: "background", hex: "#fffaf3" },
10227
- { name: "surface", hex: "#ffffff" },
10228
- { name: "surfaceAlt", hex: "#f5eadc" },
10229
- { name: "muted", hex: "#efe2d0" },
10230
- { name: "text", hex: "#2f241c" },
10231
- { name: "primaryForeground", hex: "#fffaf3" },
10232
- { name: "border", hex: "#d8c6b3" }
10233
- ]
10234
- });
10235
- var warmNeutralCream = definePaletteVariant({
10236
- id: "warm-neutral-cream",
10237
- name: "Warm Neutral \u2014 Cream",
10238
- description: "Soft sand primary with pale cream surfaces.",
10239
- tags: { tone: "minimal", energy: "calm", era: "organic" },
10240
- mode: "light",
10241
- colors: [
10242
- { name: "primary", hex: "#b08864" },
10243
- { name: "secondary", hex: "#9a8c7e" },
10244
- { name: "accent", hex: "#c2956a" },
10245
- { name: "success", hex: "#7d8a5f" },
10246
- { name: "warning", hex: "#c89a4d" },
10247
- { name: "destructive", hex: "#a3503e" },
10248
- { name: "background", hex: "#fdf8ee" },
10249
- { name: "surface", hex: "#ffffff" },
10250
- { name: "surfaceAlt", hex: "#f4ebd9" },
10251
- { name: "muted", hex: "#ede3cf" },
10252
- { name: "text", hex: "#3b2f24" },
10253
- { name: "primaryForeground", hex: "#fdf8ee" },
10254
- { name: "border", hex: "#e0d2b8" }
10255
- ]
9766
+ // ../theme-core/src/palette/variants/warm-neutral.ts
9767
+ var warmNeutralClay = definePaletteVariant({
9768
+ id: "warm-neutral-clay",
9769
+ name: "Warm Neutral \u2014 Clay",
9770
+ description: "Terracotta primary on a cream ground.",
9771
+ tags: { tone: "classic", energy: "calm", era: "organic" },
9772
+ mode: "light",
9773
+ colors: [
9774
+ { name: "primary", hex: "#8b5e34" },
9775
+ { name: "secondary", hex: "#7c6f64" },
9776
+ { name: "accent", hex: "#a15c38" },
9777
+ { name: "success", hex: "#527853" },
9778
+ { name: "warning", hex: "#b7791f" },
9779
+ { name: "destructive", hex: "#b91c1c" },
9780
+ { name: "background", hex: "#fffaf3" },
9781
+ { name: "surface", hex: "#ffffff" },
9782
+ { name: "surfaceAlt", hex: "#f5eadc" },
9783
+ { name: "muted", hex: "#efe2d0" },
9784
+ { name: "text", hex: "#2f241c" },
9785
+ { name: "primaryForeground", hex: "#fffaf3" },
9786
+ { name: "border", hex: "#d8c6b3" }
9787
+ ]
9788
+ });
9789
+ var warmNeutralCream = definePaletteVariant({
9790
+ id: "warm-neutral-cream",
9791
+ name: "Warm Neutral \u2014 Cream",
9792
+ description: "Soft sand primary with pale cream surfaces.",
9793
+ tags: { tone: "minimal", energy: "calm", era: "organic" },
9794
+ mode: "light",
9795
+ colors: [
9796
+ { name: "primary", hex: "#b08864" },
9797
+ { name: "secondary", hex: "#9a8c7e" },
9798
+ { name: "accent", hex: "#c2956a" },
9799
+ { name: "success", hex: "#7d8a5f" },
9800
+ { name: "warning", hex: "#c89a4d" },
9801
+ { name: "destructive", hex: "#a3503e" },
9802
+ { name: "background", hex: "#fdf8ee" },
9803
+ { name: "surface", hex: "#ffffff" },
9804
+ { name: "surfaceAlt", hex: "#f4ebd9" },
9805
+ { name: "muted", hex: "#ede3cf" },
9806
+ { name: "text", hex: "#3b2f24" },
9807
+ { name: "primaryForeground", hex: "#fdf8ee" },
9808
+ { name: "border", hex: "#e0d2b8" }
9809
+ ]
9810
+ });
9811
+ var warmNeutralForest = definePaletteVariant({
9812
+ id: "warm-neutral-forest",
9813
+ name: "Warm Neutral \u2014 Forest",
9814
+ description: "Deep forest green primary with earthy neutrals.",
9815
+ tags: { tone: "classic", energy: "calm", era: "organic" },
9816
+ mode: "light",
9817
+ colors: [
9818
+ { name: "primary", hex: "#3d5840" },
9819
+ { name: "secondary", hex: "#7a6f5d" },
9820
+ { name: "accent", hex: "#b06b50" },
9821
+ { name: "success", hex: "#5a7a5d" },
9822
+ { name: "warning", hex: "#b7791f" },
9823
+ { name: "destructive", hex: "#b91c1c" },
9824
+ { name: "background", hex: "#fbf8f0" },
9825
+ { name: "surface", hex: "#ffffff" },
9826
+ { name: "surfaceAlt", hex: "#f2ecdb" },
9827
+ { name: "muted", hex: "#ebe3cc" },
9828
+ { name: "text", hex: "#2a2a2a" },
9829
+ { name: "primaryForeground", hex: "#fbf8f0" },
9830
+ { name: "border", hex: "#cdc1a4" }
9831
+ ]
9832
+ });
9833
+
9834
+ // ../theme-core/src/palette/variants/index.ts
9835
+ var paletteVariants = [
9836
+ // Brand-led family
9837
+ brandLedCool,
9838
+ brandLedWarm,
9839
+ brandLedJewel,
9840
+ // Warm-neutral family
9841
+ warmNeutralClay,
9842
+ warmNeutralCream,
9843
+ warmNeutralForest,
9844
+ // High-contrast family
9845
+ highContrastInk,
9846
+ highContrastCharcoal,
9847
+ highContrastMonochrome,
9848
+ // Soft-natural family
9849
+ softNaturalSage,
9850
+ softNaturalStone,
9851
+ softNaturalWatercolor
9852
+ ];
9853
+ var paletteVariantsById = new Map(
9854
+ paletteVariants.map((v) => [v.id, v])
9855
+ );
9856
+
9857
+ // ../theme-core/src/site-styles/sourceCatalogs.ts
9858
+ var generatedContentFrames = [
9859
+ plainFrame,
9860
+ panelFrame("inset"),
9861
+ panelFrame("raised"),
9862
+ flushPanelFrame({ bleed: "start" })
9863
+ ];
9864
+ var userContentFrames = [
9865
+ ...generatedContentFrames,
9866
+ panelFrame("editorial"),
9867
+ flushPanelFrame({ bleed: "end" }),
9868
+ flushPanelFrame({ bleed: "both" })
9869
+ ];
9870
+ var generatedDesignOptionCatalog = {
9871
+ source: "generated",
9872
+ sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
9873
+ contentFrames: generatedContentFrames,
9874
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
9875
+ transitions: ["none", "soft-fade-short", "soft-fade-long"],
9876
+ emphases: ["low", "medium", "high"],
9877
+ detachedCustom: false
9878
+ };
9879
+ var userDesignOptionCatalog = {
9880
+ source: "user",
9881
+ sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
9882
+ contentFrames: userContentFrames,
9883
+ itemSurfaces: [
9884
+ ...generatedDesignOptionCatalog.itemSurfaces,
9885
+ "inset",
9886
+ "editorial"
9887
+ ],
9888
+ transitions: [
9889
+ ...generatedDesignOptionCatalog.transitions,
9890
+ "wave-edge",
9891
+ "angle-edge"
9892
+ ],
9893
+ emphases: generatedDesignOptionCatalog.emphases,
9894
+ detachedCustom: false
9895
+ };
9896
+ var advancedDesignOptionCatalog = {
9897
+ source: "advanced",
9898
+ sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
9899
+ contentFrames: userDesignOptionCatalog.contentFrames,
9900
+ itemSurfaces: userDesignOptionCatalog.itemSurfaces,
9901
+ transitions: userDesignOptionCatalog.transitions,
9902
+ emphases: userDesignOptionCatalog.emphases,
9903
+ detachedCustom: true
9904
+ };
9905
+
9906
+ // ../theme-core/src/site-styles/curatedSiteStyles.ts
9907
+ var curatedSiteStyleIdValues = [
9908
+ "site-style:calm-studio",
9909
+ "site-style:clear-professional",
9910
+ "site-style:warm-editorial",
9911
+ "site-style:bright-community",
9912
+ "site-style:quiet-luxury",
9913
+ "site-style:practical-services",
9914
+ "site-style:modern-wellness",
9915
+ "site-style:bold-launch"
9916
+ ];
9917
+ var quietBudget = {
9918
+ accentDensity: "low",
9919
+ panelDensity: "medium",
9920
+ transitionMix: "quiet",
9921
+ primaryCtaLimit: 2,
9922
+ mediaDensity: "medium",
9923
+ decorativeRepetition: "low"
9924
+ };
9925
+ var balancedBudget = {
9926
+ accentDensity: "medium",
9927
+ panelDensity: "medium",
9928
+ transitionMix: "balanced",
9929
+ primaryCtaLimit: 3,
9930
+ mediaDensity: "medium",
9931
+ decorativeRepetition: "medium"
9932
+ };
9933
+ var expressiveBudget = {
9934
+ accentDensity: "high",
9935
+ panelDensity: "high",
9936
+ transitionMix: "expressive",
9937
+ primaryCtaLimit: 3,
9938
+ mediaDensity: "high",
9939
+ decorativeRepetition: "medium"
9940
+ };
9941
+ function uniqueContentFrameKinds() {
9942
+ const kinds = [...new Set(
9943
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
9944
+ )];
9945
+ const firstKind = kinds[0];
9946
+ if (!firstKind) {
9947
+ throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
9948
+ }
9949
+ return [firstKind, ...kinds.slice(1)];
9950
+ }
9951
+ var generatedContentFrameKinds = uniqueContentFrameKinds();
9952
+ function defineCuratedSiteStyle(input) {
9953
+ return {
9954
+ id: asSiteStyleId(input.id),
9955
+ name: input.name,
9956
+ description: input.description,
9957
+ generationBrief: input.generationBrief,
9958
+ selectionKeywords: input.selectionKeywords ?? [],
9959
+ template: {
9960
+ id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
9961
+ name: input.name,
9962
+ version: 1,
9963
+ tokenRecipes: input.tokenRecipes,
9964
+ compositionBudget: input.compositionBudget,
9965
+ supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
9966
+ supportedContentFrames: generatedContentFrameKinds,
9967
+ supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
9968
+ supportedTransitions: generatedDesignOptionCatalog.transitions
9969
+ },
9970
+ buttonPersonalityChoices: input.buttonPersonalityChoices,
9971
+ paletteVariantChoices: input.paletteVariantChoices
9972
+ };
9973
+ }
9974
+ function buttonChoice(id, note) {
9975
+ return note ? { id: asButtonPersonalityId(id), note } : { id: asButtonPersonalityId(id) };
9976
+ }
9977
+ function paletteChoice(id, note) {
9978
+ return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
9979
+ }
9980
+ var curatedSiteStyles = [
9981
+ defineCuratedSiteStyle({
9982
+ id: "site-style:calm-studio",
9983
+ name: "Calm Studio",
9984
+ description: "Soft, measured, and spacious for intimate appointment or class businesses.",
9985
+ generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
9986
+ tokenRecipes: {
9987
+ palette: "soft-natural",
9988
+ contrast: "standard",
9989
+ radius: "soft",
9990
+ shadow: "subtle",
9991
+ typography: "friendly-sans",
9992
+ spacing: "airy",
9993
+ motion: "subtle"
9994
+ },
9995
+ compositionBudget: quietBudget,
9996
+ buttonPersonalityChoices: [
9997
+ buttonChoice("soft-pill"),
9998
+ buttonChoice("pebble"),
9999
+ buttonChoice("editorial-link"),
10000
+ buttonChoice("brushed-wash")
10001
+ ],
10002
+ paletteVariantChoices: [
10003
+ paletteChoice("soft-natural-sage"),
10004
+ paletteChoice("soft-natural-stone"),
10005
+ paletteChoice("warm-neutral-clay"),
10006
+ paletteChoice("soft-natural-watercolor")
10007
+ ]
10008
+ }),
10009
+ defineCuratedSiteStyle({
10010
+ id: "site-style:clear-professional",
10011
+ name: "Clear Professional",
10012
+ description: "Crisp, trustworthy, and direct for local services and consultancies.",
10013
+ generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
10014
+ tokenRecipes: {
10015
+ palette: "brand-led",
10016
+ contrast: "strong",
10017
+ radius: "soft",
10018
+ shadow: "subtle",
10019
+ typography: "clean-sans",
10020
+ spacing: "regular",
10021
+ motion: "subtle"
10022
+ },
10023
+ compositionBudget: balancedBudget,
10024
+ buttonPersonalityChoices: [
10025
+ buttonChoice("confident-chip"),
10026
+ buttonChoice("soft-pill"),
10027
+ buttonChoice("editorial-link")
10028
+ ],
10029
+ paletteVariantChoices: [
10030
+ paletteChoice("brand-led-cool"),
10031
+ paletteChoice("high-contrast-ink"),
10032
+ paletteChoice("brand-led-jewel")
10033
+ ]
10034
+ }),
10035
+ defineCuratedSiteStyle({
10036
+ id: "site-style:warm-editorial",
10037
+ name: "Warm Editorial",
10038
+ description: "Story-led and textured for educators, makers, venues, and retreats.",
10039
+ generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
10040
+ tokenRecipes: {
10041
+ palette: "warm-neutral",
10042
+ contrast: "standard",
10043
+ radius: "square",
10044
+ shadow: "none",
10045
+ typography: "serif-editorial",
10046
+ spacing: "airy",
10047
+ motion: "subtle"
10048
+ },
10049
+ compositionBudget: balancedBudget,
10050
+ buttonPersonalityChoices: [
10051
+ buttonChoice("editorial-link"),
10052
+ buttonChoice("soft-pill"),
10053
+ buttonChoice("brushed-wash")
10054
+ ],
10055
+ paletteVariantChoices: [
10056
+ paletteChoice("warm-neutral-cream"),
10057
+ paletteChoice("warm-neutral-clay"),
10058
+ paletteChoice("warm-neutral-forest"),
10059
+ paletteChoice("soft-natural-stone")
10060
+ ]
10061
+ }),
10062
+ defineCuratedSiteStyle({
10063
+ id: "site-style:bright-community",
10064
+ name: "Bright Community",
10065
+ description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
10066
+ generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
10067
+ tokenRecipes: {
10068
+ palette: "brand-led",
10069
+ contrast: "standard",
10070
+ radius: "rounded",
10071
+ shadow: "subtle",
10072
+ typography: "friendly-sans",
10073
+ spacing: "regular",
10074
+ motion: "expressive"
10075
+ },
10076
+ compositionBudget: balancedBudget,
10077
+ buttonPersonalityChoices: [
10078
+ buttonChoice("pebble"),
10079
+ buttonChoice("brushed-wash"),
10080
+ buttonChoice("confident-chip")
10081
+ ],
10082
+ paletteVariantChoices: [
10083
+ paletteChoice("brand-led-warm"),
10084
+ paletteChoice("brand-led-jewel"),
10085
+ paletteChoice("soft-natural-watercolor")
10086
+ ]
10087
+ }),
10088
+ defineCuratedSiteStyle({
10089
+ id: "site-style:quiet-luxury",
10090
+ name: "Quiet Luxury",
10091
+ description: "Minimal, confident, and refined for premium experiences and private services.",
10092
+ generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
10093
+ selectionKeywords: [
10094
+ "luxury",
10095
+ "premium",
10096
+ "boutique",
10097
+ "bespoke",
10098
+ "exclusive"
10099
+ ],
10100
+ tokenRecipes: {
10101
+ palette: "high-contrast",
10102
+ contrast: "strong",
10103
+ radius: "square",
10104
+ shadow: "none",
10105
+ typography: "classic-serif",
10106
+ spacing: "airy",
10107
+ motion: "none"
10108
+ },
10109
+ compositionBudget: quietBudget,
10110
+ buttonPersonalityChoices: [
10111
+ buttonChoice("editorial-link"),
10112
+ buttonChoice("confident-chip"),
10113
+ buttonChoice("soft-pill")
10114
+ ],
10115
+ paletteVariantChoices: [
10116
+ paletteChoice("high-contrast-charcoal"),
10117
+ paletteChoice("high-contrast-ink"),
10118
+ paletteChoice("warm-neutral-cream")
10119
+ ]
10120
+ }),
10121
+ defineCuratedSiteStyle({
10122
+ id: "site-style:practical-services",
10123
+ name: "Practical Services",
10124
+ description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
10125
+ generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
10126
+ selectionKeywords: [
10127
+ "repair",
10128
+ "plumb",
10129
+ "electric",
10130
+ "cleaning",
10131
+ "landscap",
10132
+ "contractor"
10133
+ ],
10134
+ tokenRecipes: {
10135
+ palette: "brand-led",
10136
+ contrast: "maximum",
10137
+ radius: "soft",
10138
+ shadow: "subtle",
10139
+ typography: "clean-sans",
10140
+ spacing: "compact",
10141
+ motion: "none"
10142
+ },
10143
+ compositionBudget: quietBudget,
10144
+ buttonPersonalityChoices: [
10145
+ buttonChoice("confident-chip"),
10146
+ buttonChoice("pebble"),
10147
+ buttonChoice("ink-stamp")
10148
+ ],
10149
+ paletteVariantChoices: [
10150
+ paletteChoice("brand-led-cool"),
10151
+ paletteChoice("high-contrast-ink"),
10152
+ paletteChoice("brand-led-warm")
10153
+ ]
10154
+ }),
10155
+ defineCuratedSiteStyle({
10156
+ id: "site-style:modern-wellness",
10157
+ name: "Modern Wellness",
10158
+ description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
10159
+ generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
10160
+ tokenRecipes: {
10161
+ palette: "soft-natural",
10162
+ contrast: "standard",
10163
+ radius: "rounded",
10164
+ shadow: "subtle",
10165
+ typography: "clean-sans",
10166
+ spacing: "airy",
10167
+ motion: "subtle"
10168
+ },
10169
+ compositionBudget: balancedBudget,
10170
+ buttonPersonalityChoices: [
10171
+ buttonChoice("soft-pill"),
10172
+ buttonChoice("pebble"),
10173
+ buttonChoice("confident-chip")
10174
+ ],
10175
+ paletteVariantChoices: [
10176
+ paletteChoice("soft-natural-sage"),
10177
+ paletteChoice("soft-natural-stone"),
10178
+ paletteChoice("warm-neutral-forest")
10179
+ ]
10180
+ }),
10181
+ defineCuratedSiteStyle({
10182
+ id: "site-style:bold-launch",
10183
+ name: "Bold Launch",
10184
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
10185
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
10186
+ selectionKeywords: [
10187
+ "launch",
10188
+ "campaign",
10189
+ "preorder",
10190
+ "pre-order",
10191
+ "waitlist",
10192
+ "drop"
10193
+ ],
10194
+ tokenRecipes: {
10195
+ palette: "high-contrast",
10196
+ contrast: "maximum",
10197
+ radius: "pill",
10198
+ shadow: "layered",
10199
+ typography: "clean-sans",
10200
+ spacing: "regular",
10201
+ motion: "expressive"
10202
+ },
10203
+ compositionBudget: expressiveBudget,
10204
+ buttonPersonalityChoices: [
10205
+ buttonChoice("ink-stamp"),
10206
+ buttonChoice("confident-chip"),
10207
+ buttonChoice("brushed-wash"),
10208
+ buttonChoice("pebble")
10209
+ ],
10210
+ paletteVariantChoices: [
10211
+ paletteChoice("high-contrast-monochrome"),
10212
+ paletteChoice("high-contrast-ink"),
10213
+ paletteChoice("brand-led-jewel"),
10214
+ paletteChoice("brand-led-warm")
10215
+ ]
10216
+ })
10217
+ ];
10218
+ var curatedSiteStylesById = new Map(
10219
+ curatedSiteStyles.map((style) => [style.id, style])
10220
+ );
10221
+
10222
+ // ../theme-core/src/site-styles/designState.ts
10223
+ import { z as z24 } from "zod";
10224
+
10225
+ // ../theme-core/src/site-styles/rawStyleFields.ts
10226
+ var themeV2RuntimeStyleFieldNames = [
10227
+ "_frameStyles",
10228
+ "_sectionStyles",
10229
+ "_containerStyles",
10230
+ "_cardStyles",
10231
+ // styleGroup is legacy runtime transition wiring rather than a nested
10232
+ // override object, but normal editors should still never see it directly.
10233
+ "styleGroup"
10234
+ ];
10235
+ var themeV2BlockSpecificRawStyleFieldNames = [
10236
+ "_contentCardStyles",
10237
+ "_textCardStyles"
10238
+ ];
10239
+ var themeV2NormalEditorRawStyleFieldNames = [
10240
+ ...themeV2RuntimeStyleFieldNames,
10241
+ ...themeV2BlockSpecificRawStyleFieldNames
10242
+ ];
10243
+ var themeV2NormalEditorRawStyleFieldNameSet = new Set(
10244
+ themeV2NormalEditorRawStyleFieldNames
10245
+ );
10246
+
10247
+ // ../theme-core/src/site-styles/designState.ts
10248
+ var themeV2DesignStateSchemaVersion = 1;
10249
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
10250
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
10251
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
10252
+ fields3[0],
10253
+ ...fields3.slice(1)
10254
+ ]);
10255
+ var heroLegibilityStrategySchema = z24.enum([
10256
+ "none",
10257
+ "scrim-gradient",
10258
+ "solid-panel"
10259
+ ]);
10260
+ function uniqueNonEmpty(values) {
10261
+ const uniqueValues = [...new Set(values)];
10262
+ const firstValue = uniqueValues[0];
10263
+ if (!firstValue) {
10264
+ throw new Error("Expected at least one Theme V2 design state option.");
10265
+ }
10266
+ return [firstValue, ...uniqueValues.slice(1)];
10267
+ }
10268
+ var userPanelTreatments = uniqueNonEmpty(
10269
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
10270
+ );
10271
+ var userFlushTreatments = uniqueNonEmpty(
10272
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
10273
+ );
10274
+ var userFlushBleeds = uniqueNonEmpty(
10275
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
10276
+ );
10277
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
10278
+ z24.object({ kind: z24.literal("plain") }).strict(),
10279
+ z24.object({
10280
+ kind: z24.literal("panel"),
10281
+ treatment: z24.enum(userPanelTreatments)
10282
+ }).strict(),
10283
+ z24.object({
10284
+ kind: z24.literal("flush-panel"),
10285
+ treatment: z24.enum(userFlushTreatments),
10286
+ bleed: z24.enum(userFlushBleeds)
10287
+ }).strict()
10288
+ ]);
10289
+ var blockDesignPlanSchema = z24.object({
10290
+ blockId: z24.string().min(1).transform(asDesignBlockId),
10291
+ blockKind: z24.string().min(1),
10292
+ purpose: z24.string().min(1),
10293
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
10294
+ contentFrame: contentFrameIntentSchema,
10295
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
10296
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
10297
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
10298
+ heroLegibility: heroLegibilityStrategySchema.optional()
10299
+ }).strict();
10300
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
10301
+ z24.object({
10302
+ kind: z24.literal("theme-v2"),
10303
+ source: designResolutionPolicySchema,
10304
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
10305
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
10306
+ templateVersion: z24.number().int().nonnegative(),
10307
+ resolverVersion: z24.number().int().nonnegative()
10308
+ }).strict(),
10309
+ z24.object({
10310
+ kind: z24.literal("legacy-raw"),
10311
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
10312
+ }).strict(),
10313
+ z24.object({
10314
+ kind: z24.literal("advanced-detached"),
10315
+ reason: z24.literal("detached-custom-runtime-fields")
10316
+ }).strict()
10317
+ ]);
10318
+ var blockRuntimeStyleAuthoritySchema = z24.object({
10319
+ unit: z24.literal("block-runtime-fields"),
10320
+ blockId: z24.string().min(1).transform(asDesignBlockId),
10321
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
10322
+ authority: styleAuthoritySchema
10323
+ }).strict();
10324
+ var persistedPageDesignStateV1Schema = z24.object({
10325
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
10326
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
10327
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
10328
+ templateVersion: z24.number().int().nonnegative(),
10329
+ resolverVersion: z24.number().int().nonnegative(),
10330
+ rhythmPresetId: z24.string().min(1),
10331
+ blocks: z24.array(blockDesignPlanSchema),
10332
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
10333
+ }).strict();
10334
+
10335
+ // ../theme-core/src/site-styles/generatedSchemas.ts
10336
+ import { z as z25 } from "zod";
10337
+ function uniqueNonEmpty2(values) {
10338
+ const uniqueValues = [...new Set(values)];
10339
+ const firstValue = uniqueValues[0];
10340
+ if (!firstValue) {
10341
+ throw new Error("Expected at least one generated schema option.");
10342
+ }
10343
+ return [firstValue, ...uniqueValues.slice(1)];
10344
+ }
10345
+ var generatedPanelTreatments = uniqueNonEmpty2(
10346
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
10347
+ );
10348
+ var generatedFlushTreatments = uniqueNonEmpty2(
10349
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
10350
+ );
10351
+ var generatedFlushBleeds = uniqueNonEmpty2(
10352
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
10353
+ );
10354
+ var generatedPanelFrameSchema = z25.object({
10355
+ kind: z25.literal("panel"),
10356
+ treatment: z25.enum(generatedPanelTreatments)
10357
+ }).strict();
10358
+ var generatedFlushPanelFrameSchema = z25.object({
10359
+ kind: z25.literal("flush-panel"),
10360
+ treatment: z25.enum(generatedFlushTreatments),
10361
+ bleed: z25.enum(generatedFlushBleeds)
10362
+ }).strict();
10363
+ var generatedContentFrameIntentSchema = z25.discriminatedUnion("kind", [
10364
+ z25.object({ kind: z25.literal("plain") }).strict(),
10365
+ generatedPanelFrameSchema,
10366
+ generatedFlushPanelFrameSchema
10367
+ ]);
10368
+ var generatedSiteStyleIdSchema = z25.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
10369
+ function generatedChoiceSchema(valueSchema) {
10370
+ return z25.discriminatedUnion("kind", [
10371
+ z25.object({
10372
+ source: z25.literal("generated"),
10373
+ kind: z25.literal("auto")
10374
+ }).strict(),
10375
+ z25.object({
10376
+ source: z25.literal("generated"),
10377
+ kind: z25.literal("explicit"),
10378
+ value: valueSchema
10379
+ }).strict()
10380
+ ]);
10381
+ }
10382
+ var generatedBlockDesignIntentSchema = z25.object({
10383
+ sectionSurface: generatedChoiceSchema(
10384
+ z25.enum(generatedDesignOptionCatalog.sectionSurfaces)
10385
+ ),
10386
+ contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
10387
+ itemSurface: generatedChoiceSchema(
10388
+ z25.enum(generatedDesignOptionCatalog.itemSurfaces)
10389
+ ),
10390
+ transitionAfter: generatedChoiceSchema(
10391
+ z25.enum(generatedDesignOptionCatalog.transitions)
10392
+ ),
10393
+ emphasis: generatedChoiceSchema(
10394
+ z25.enum(generatedDesignOptionCatalog.emphases)
10395
+ )
10396
+ }).strict();
10397
+ var generatedMediaCompositionIntentSchema = z25.enum([
10398
+ "none",
10399
+ "supporting",
10400
+ "dominant"
10401
+ ]);
10402
+ var generatedDecorativeCompositionIntentSchema = z25.enum([
10403
+ "none",
10404
+ "supporting"
10405
+ ]);
10406
+ var generatedHeroLegibilityStrategySchema = z25.enum([
10407
+ "none",
10408
+ "scrim-gradient"
10409
+ ]);
10410
+ var generatedBlockMediaIntentSchema = z25.object({
10411
+ media: generatedMediaCompositionIntentSchema,
10412
+ decorative: generatedDecorativeCompositionIntentSchema,
10413
+ heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
10414
+ }).strict();
10415
+ var generatedBoundaryIntentSchema = z25.object({
10416
+ transitionAfter: generatedChoiceSchema(
10417
+ z25.enum(generatedDesignOptionCatalog.transitions)
10418
+ )
10419
+ }).strict();
10420
+ var generatedPageDesignBlockIntentSchema = z25.object({
10421
+ blockId: z25.string().min(1),
10422
+ blockKind: z25.string().min(1),
10423
+ purpose: z25.string().min(1),
10424
+ design: generatedBlockDesignIntentSchema,
10425
+ mediaIntent: generatedBlockMediaIntentSchema,
10426
+ boundaryIntent: generatedBoundaryIntentSchema
10427
+ }).strict();
10428
+ var generatedPageDesignIntentSchema = z25.object({
10429
+ siteStyleId: generatedSiteStyleIdSchema,
10430
+ blocks: z25.array(generatedPageDesignBlockIntentSchema)
10431
+ }).strict();
10432
+
10433
+ // ../theme-core/src/site-styles/pageDesignIntent.ts
10434
+ import { z as z26 } from "zod";
10435
+ var pageDesignIntentSchemaVersion = 1;
10436
+ var pageDesignUserPinnedAppearanceChoiceSchema = z26.object({
10437
+ kind: z26.literal("user-pinned"),
10438
+ value: z26.string().min(1).transform(asAppearancePresetId)
10439
+ }).strict();
10440
+ var pageDesignUserPinnedBoundaryChoiceSchema = z26.object({
10441
+ kind: z26.literal("user-pinned"),
10442
+ value: z26.string().min(1).transform(asBoundaryOptionId)
10443
+ }).strict();
10444
+ var pageDesignBlockLookPinSchema = z26.object({
10445
+ blockId: z26.string().min(1).transform(asDesignBlockId),
10446
+ blockKind: z26.string().min(1),
10447
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
10448
+ }).strict();
10449
+ var pageDesignBoundaryPinSchema = z26.object({
10450
+ boundaryId: z26.string().min(1).transform(asDesignBoundaryId),
10451
+ previousBlockId: z26.string().min(1).transform(asDesignBlockId),
10452
+ nextBlockId: z26.string().min(1).transform(asDesignBlockId),
10453
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
10454
+ }).strict().superRefine((pin, ctx) => {
10455
+ const expectedBoundaryId = makeBoundaryId(
10456
+ pin.previousBlockId,
10457
+ pin.nextBlockId
10458
+ );
10459
+ if (pin.boundaryId !== expectedBoundaryId) {
10460
+ ctx.addIssue({
10461
+ code: z26.ZodIssueCode.custom,
10462
+ path: ["boundaryId"],
10463
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
10464
+ });
10465
+ }
10256
10466
  });
10257
- var warmNeutralForest = definePaletteVariant({
10258
- id: "warm-neutral-forest",
10259
- name: "Warm Neutral \u2014 Forest",
10260
- description: "Deep forest green primary with earthy neutrals.",
10261
- tags: { tone: "classic", energy: "calm", era: "organic" },
10262
- mode: "light",
10263
- colors: [
10264
- { name: "primary", hex: "#3d5840" },
10265
- { name: "secondary", hex: "#7a6f5d" },
10266
- { name: "accent", hex: "#b06b50" },
10267
- { name: "success", hex: "#5a7a5d" },
10268
- { name: "warning", hex: "#b7791f" },
10269
- { name: "destructive", hex: "#b91c1c" },
10270
- { name: "background", hex: "#fbf8f0" },
10271
- { name: "surface", hex: "#ffffff" },
10272
- { name: "surfaceAlt", hex: "#f2ecdb" },
10273
- { name: "muted", hex: "#ebe3cc" },
10274
- { name: "text", hex: "#2a2a2a" },
10275
- { name: "primaryForeground", hex: "#fbf8f0" },
10276
- { name: "border", hex: "#cdc1a4" }
10277
- ]
10467
+ var pageDesignIntentV1Schema = z26.object({
10468
+ schemaVersion: z26.literal(pageDesignIntentSchemaVersion),
10469
+ siteStyleId: z26.string().min(1).transform(asSiteStyleId),
10470
+ pageFlowPresetId: z26.string().min(1).transform(asPageFlowPresetId),
10471
+ blockLookPins: z26.array(pageDesignBlockLookPinSchema),
10472
+ boundaryPins: z26.array(pageDesignBoundaryPinSchema)
10473
+ }).strict().superRefine((intent, ctx) => {
10474
+ addDuplicateStringIssues(ctx, {
10475
+ values: intent.blockLookPins.map((pin) => pin.blockId),
10476
+ path: ["blockLookPins"],
10477
+ label: "block Look pin"
10478
+ });
10479
+ addDuplicateStringIssues(ctx, {
10480
+ values: intent.boundaryPins.map(
10481
+ (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
10482
+ ),
10483
+ path: ["boundaryPins"],
10484
+ label: "boundary pin"
10485
+ });
10278
10486
  });
10279
-
10280
- // ../theme-core/src/palette/variants/index.ts
10281
- var paletteVariants = [
10282
- // Brand-led family
10283
- brandLedCool,
10284
- brandLedWarm,
10285
- brandLedJewel,
10286
- // Warm-neutral family
10287
- warmNeutralClay,
10288
- warmNeutralCream,
10289
- warmNeutralForest,
10290
- // High-contrast family
10291
- highContrastInk,
10292
- highContrastCharcoal,
10293
- highContrastMonochrome,
10294
- // Soft-natural family
10295
- softNaturalSage,
10296
- softNaturalStone,
10297
- softNaturalWatercolor
10298
- ];
10299
- var paletteVariantsById = new Map(
10300
- paletteVariants.map((v) => [v.id, v])
10301
- );
10487
+ function addDuplicateStringIssues(ctx, input) {
10488
+ const seen = /* @__PURE__ */ new Set();
10489
+ const duplicates = /* @__PURE__ */ new Set();
10490
+ for (const value of input.values) {
10491
+ if (seen.has(value)) {
10492
+ duplicates.add(value);
10493
+ }
10494
+ seen.add(value);
10495
+ }
10496
+ for (const duplicate of duplicates) {
10497
+ ctx.addIssue({
10498
+ code: z26.ZodIssueCode.custom,
10499
+ path: [...input.path],
10500
+ message: `Duplicate ${input.label}: ${duplicate}.`
10501
+ });
10502
+ }
10503
+ }
10504
+ function boundaryKey(previousBlockId, nextBlockId) {
10505
+ return makeBoundaryId(previousBlockId, nextBlockId);
10506
+ }
10302
10507
 
10303
10508
  // ../theme-core/src/site-styles/runtimeCompiler.ts
10304
10509
  function defineDesignRuntimeRules(rules) {
@@ -11643,7 +11848,8 @@ function ctaButton(opts) {
11643
11848
  },
11644
11849
  size: {
11645
11850
  $bind: {
11646
- from: sizePath
11851
+ from: sizePath,
11852
+ fallback: opts?.sizeFallback ?? "md"
11647
11853
  }
11648
11854
  },
11649
11855
  ...opts?.className ? { className: opts.className } : {},
@@ -15248,7 +15454,19 @@ var teamMemberFragment = defineFragment({
15248
15454
  bind("photo")
15249
15455
  )
15250
15456
  ]),
15251
- text({ as: "h3" }, bind("name")),
15457
+ link(
15458
+ {
15459
+ href: { $bind: { from: "profilePath" } },
15460
+ className: "rb-team-member-name-link"
15461
+ },
15462
+ [text({ as: "h3" }, bind("name"))],
15463
+ when("profilePath")
15464
+ ),
15465
+ text(
15466
+ { as: "h3" },
15467
+ when("profilePath", { not: true }),
15468
+ bind("name")
15469
+ ),
15252
15470
  text({ as: "p", className: "rb-team-member-role" }, when("role"), bind("role")),
15253
15471
  richText(
15254
15472
  { className: "rb-prose rb-max-w-none" },
@@ -17683,14 +17901,16 @@ var headerCta = ctaButton({
17683
17901
  whenPath: "menu.ctaItem.label",
17684
17902
  variantPath: "menu.ctaItem.variant",
17685
17903
  linkPath: "menu.ctaItem.link",
17686
- className: `header-cta btn-sm ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
17904
+ sizeFallback: "sm",
17905
+ className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
17687
17906
  });
17688
17907
  var mobileCta = ctaButton({
17689
17908
  basePath: "menu.ctaItem",
17690
17909
  whenPath: "menu.ctaItem.label",
17691
17910
  variantPath: "menu.ctaItem.variant",
17692
17911
  linkPath: "menu.ctaItem.link",
17693
- className: "nav-mobile-cta btn-md rb-w-full"
17912
+ sizeFallback: "md",
17913
+ className: "nav-mobile-cta rb-w-full"
17694
17914
  });
17695
17915
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
17696
17916
  {
@@ -19540,7 +19760,9 @@ var courseSessionSchema = z42.object({
19540
19760
  var courseTeamMemberSummarySchema = z42.object({
19541
19761
  id: z42.string(),
19542
19762
  name: z42.string(),
19543
- summary: z42.string().nullable()
19763
+ roleLabel: z42.string().nullable(),
19764
+ summary: z42.string().nullable(),
19765
+ profilePath: z42.string().nullable()
19544
19766
  });
19545
19767
  var coursePricingOptionSchema = z42.object({
19546
19768
  id: z42.string(),
@@ -19645,7 +19867,9 @@ var publicEventTicketTypeSchema = z43.object({
19645
19867
  var publicTeamMemberSummarySchema = z43.object({
19646
19868
  id: z43.string(),
19647
19869
  name: z43.string(),
19648
- summary: z43.string().nullable()
19870
+ roleLabel: z43.string().nullable(),
19871
+ summary: z43.string().nullable(),
19872
+ profilePath: z43.string().nullable()
19649
19873
  });
19650
19874
  var publicEventSchema = z43.object({
19651
19875
  kind: z43.enum(["event", "course_session"]).optional(),
@@ -25492,7 +25716,25 @@ var newsletterSignupBlockDefinition = {
25492
25716
  };
25493
25717
 
25494
25718
  // ../blocks/src/system/blocks/team-members.ts
25719
+ import { z as z61 } from "zod";
25495
25720
  var ITEM_NAME2 = "member";
25721
+ var teamMemberPhotoSchema = mediaSchema2.refine((media2) => media2.type === "image", {
25722
+ message: "Team member photos must be image media"
25723
+ }).nullable();
25724
+ var teamMemberDataSchema = z61.object({
25725
+ _type: z61.literal("teamMember"),
25726
+ id: z61.string(),
25727
+ name: z61.string(),
25728
+ role: z61.string().nullable(),
25729
+ roleLabel: z61.string().nullable(),
25730
+ bio: z61.string().nullable(),
25731
+ summary: z61.string().nullable(),
25732
+ photo: teamMemberPhotoSchema,
25733
+ profilePath: z61.string().nullable()
25734
+ });
25735
+ var teamMembersDataSchema = z61.array(teamMemberDataSchema);
25736
+ var dynamicSourceWhen = { equals: "site_staff" };
25737
+ var manualSourceWhen = { equals: "site_staff", not: true };
25496
25738
  var headingNode = text(
25497
25739
  { as: "h2" },
25498
25740
  bind("content.heading"),
@@ -25582,7 +25824,15 @@ var teamMemberStackLayout = el(
25582
25824
  ]
25583
25825
  ),
25584
25826
  stack({ gap: "sm", className: "rb-team-member-body rb-flex-1 rb-min-w-0" }, [
25585
- text({ as: "h3" }, bind("name")),
25827
+ link(
25828
+ {
25829
+ href: { $bind: { from: "profilePath" } },
25830
+ className: "rb-team-member-name-link"
25831
+ },
25832
+ [text({ as: "h3" }, bind("name"))],
25833
+ when("profilePath")
25834
+ ),
25835
+ text({ as: "h3" }, when("profilePath", { not: true }), bind("name")),
25586
25836
  text(
25587
25837
  { as: "p", className: "rb-team-member-role" },
25588
25838
  when("role"),
@@ -25596,12 +25846,18 @@ var teamMemberStackLayout = el(
25596
25846
  ])
25597
25847
  ]
25598
25848
  );
25599
- var gridMembersNode = repeaterFragmentLayout({
25849
+ var manualGridMembersNode = when("content.source", manualSourceWhen)(repeaterFragmentLayout({
25600
25850
  collectionPath: "content.members",
25601
25851
  itemName: ITEM_NAME2,
25602
25852
  fragments: { teamMember: teamMemberFragment },
25603
25853
  itemGap: "sm"
25604
- });
25854
+ }));
25855
+ var dynamicGridMembersNode = when("content.source", dynamicSourceWhen)(repeaterFragmentLayout({
25856
+ collectionPath: "data.members",
25857
+ itemName: ITEM_NAME2,
25858
+ fragments: { teamMember: teamMemberFragment },
25859
+ itemGap: "sm"
25860
+ }));
25605
25861
  var gridVariant = wrapVariant3(
25606
25862
  el(
25607
25863
  "grid",
@@ -25615,22 +25871,29 @@ var gridVariant = wrapVariant3(
25615
25871
  },
25616
25872
  gap: { $bind: { from: "content.gap", fallback: "medium" } }
25617
25873
  },
25618
- [gridMembersNode]
25874
+ [manualGridMembersNode, dynamicGridMembersNode]
25619
25875
  )
25620
25876
  );
25621
- var stackMembersNode = repeaterFragmentLayout({
25877
+ var manualStackMembersNode = when("content.source", manualSourceWhen)(repeaterFragmentLayout({
25622
25878
  collectionPath: "content.members",
25623
25879
  itemName: ITEM_NAME2,
25624
25880
  fragments: { teamMember: teamMemberFragment },
25625
25881
  layoutOverrides: { teamMember: teamMemberStackLayout },
25626
25882
  itemGap: "sm"
25627
- });
25883
+ }));
25884
+ var dynamicStackMembersNode = when("content.source", dynamicSourceWhen)(repeaterFragmentLayout({
25885
+ collectionPath: "data.members",
25886
+ itemName: ITEM_NAME2,
25887
+ fragments: { teamMember: teamMemberFragment },
25888
+ layoutOverrides: { teamMember: teamMemberStackLayout },
25889
+ itemGap: "sm"
25890
+ }));
25628
25891
  var stackVariant = wrapVariant3({
25629
25892
  type: "stack",
25630
25893
  props: {
25631
25894
  gap: { $bind: { from: "content.gap", fallback: "medium" } }
25632
25895
  },
25633
- children: [stackMembersNode]
25896
+ children: [manualStackMembersNode, dynamicStackMembersNode]
25634
25897
  });
25635
25898
  var teamMembersManifest = createBlockManifest({
25636
25899
  id: "block.team-members",
@@ -25645,6 +25908,18 @@ var teamMembersManifest = createBlockManifest({
25645
25908
  required: false,
25646
25909
  maxLength: 120
25647
25910
  }),
25911
+ parseFieldDefinition({
25912
+ id: "source",
25913
+ type: "select",
25914
+ label: "Team members",
25915
+ description: "Choose whether to use the site-wide team or a hand-picked list.",
25916
+ defaultValue: "manual",
25917
+ options: [
25918
+ { value: "manual", label: "Choose manually" },
25919
+ { value: "site_staff", label: "Use all site team members" }
25920
+ ],
25921
+ ui: { intent: "behavior" }
25922
+ }),
25648
25923
  parseFieldDefinition({
25649
25924
  id: "layoutAlign",
25650
25925
  type: "select",
@@ -25747,18 +26022,24 @@ var teamMembersManifest = createBlockManifest({
25747
26022
  ],
25748
26023
  ui: { intent: "display" }
25749
26024
  }),
25750
- fragmentsToRepeaterField(
25751
- "members",
25752
- "Team members",
25753
- { teamMember: teamMemberFragment },
25754
- {
25755
- minItems: 0,
25756
- maxItems: 50,
25757
- itemLabel: "Team member",
25758
- itemLabelSource: "name",
25759
- description: "Add people to this section."
26025
+ {
26026
+ ...fragmentsToRepeaterField(
26027
+ "members",
26028
+ "Team members",
26029
+ { teamMember: teamMemberFragment },
26030
+ {
26031
+ minItems: 0,
26032
+ maxItems: 50,
26033
+ itemLabel: "Team member",
26034
+ itemLabelSource: "name",
26035
+ description: "Add people to this section."
26036
+ }
26037
+ ),
26038
+ ui: {
26039
+ intent: "content",
26040
+ visibleWhen: { field: "source", equals: "manual" }
25760
26041
  }
25761
- )
26042
+ }
25762
26043
  ],
25763
26044
  layout: gridVariant,
25764
26045
  variants: {
@@ -25784,7 +26065,20 @@ var teamMembersManifest = createBlockManifest({
25784
26065
  styleTokens: { spacing: "lg" }
25785
26066
  });
25786
26067
  var teamMembersBlockDefinition = {
25787
- manifest: teamMembersManifest
26068
+ manifest: teamMembersManifest,
26069
+ dataSchemas: {
26070
+ members: teamMembersDataSchema
26071
+ },
26072
+ dataLoaders: {
26073
+ members: {
26074
+ endpoint: "listPublicTeamMembers",
26075
+ params: {
26076
+ siteId: { $bind: { from: "$root.siteId" } },
26077
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } }
26078
+ },
26079
+ mode: "server"
26080
+ }
26081
+ }
25788
26082
  };
25789
26083
 
25790
26084
  // ../blocks/src/system/runtime/nodes/location-map.shared.ts
@@ -27264,6 +27558,7 @@ function coercePayload(payload) {
27264
27558
  if ("form" in record && typeof record.form !== "function") return record.form;
27265
27559
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
27266
27560
  if ("services" in record && typeof record.services !== "function") return record.services;
27561
+ if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
27267
27562
  }
27268
27563
  return payload;
27269
27564
  }
@@ -27385,6 +27680,10 @@ function normalizeLoaderParams(endpoint, params, context) {
27385
27680
  ensureSiteId(out, context);
27386
27681
  return out;
27387
27682
  }
27683
+ if (endpoint === "listPublicTeamMembers") {
27684
+ ensureSiteId(out, context);
27685
+ return out;
27686
+ }
27388
27687
  if (endpoint === "getPublishedEntryPreview") {
27389
27688
  ensureSiteId(out, context);
27390
27689
  return out;
@@ -27399,6 +27698,7 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
27399
27698
  "getPublishedEntryPreview",
27400
27699
  "listPublicEvents",
27401
27700
  "listPublicCourses",
27701
+ "listPublicTeamMembers",
27402
27702
  "listPublicProducts",
27403
27703
  "listPublicPasses",
27404
27704
  "listPublicMemberships",
@@ -27563,6 +27863,16 @@ async function prefetchBlockData2(page, context, client, options) {
27563
27863
  const parsedLimit = typeof limit === "string" ? Number.parseInt(limit, 10) : typeof limit === "number" ? limit : void 0;
27564
27864
  return await client.listPublicCourses({ siteId, limit: parsedLimit, stage });
27565
27865
  }
27866
+ case "listPublicTeamMembers": {
27867
+ const { siteId, stage } = resolvedParams ?? {};
27868
+ if (!siteId) {
27869
+ throw new Error("listPublicTeamMembers requires siteId param");
27870
+ }
27871
+ return await client.listPublicTeamMembers({
27872
+ siteId,
27873
+ stage: typeof stage === "string" ? stage : void 0
27874
+ });
27875
+ }
27566
27876
  case "listPublicProducts": {
27567
27877
  const { siteId, stage, categorySelector } = resolvedParams ?? {};
27568
27878
  if (!siteId) {