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