@riverbankcms/sdk 0.60.3 → 0.60.6

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 (60) hide show
  1. package/dist/_dts/api/src/bookingVerticals.d.ts +1 -0
  2. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -39
  3. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +2 -0
  4. package/dist/_dts/blocks/src/system/node/fragments/ctaButton.d.ts +2 -0
  5. package/dist/_dts/blocks/src/system/runtime/shared/themedButtonClass.d.ts +11 -0
  6. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +10 -2
  7. package/dist/_dts/core/src/participants.d.ts +32 -1
  8. package/dist/_dts/core/src/rectification.d.ts +79 -0
  9. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +6 -6
  10. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +17 -15
  11. package/dist/_dts/sdk/src/client/types.d.ts +1 -0
  12. package/dist/_dts/sdk/src/version.d.ts +1 -1
  13. package/dist/_dts/theme-core/src/buttons/personalities/brushed-wash.d.ts +7 -2
  14. package/dist/_dts/theme-core/src/buttons/personalities/confident-chip.d.ts +7 -2
  15. package/dist/_dts/theme-core/src/buttons/personalities/editorial-link.d.ts +7 -2
  16. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +86 -5
  17. package/dist/_dts/theme-core/src/buttons/personalities/ink-stamp.d.ts +7 -2
  18. package/dist/_dts/theme-core/src/buttons/personalities/pebble.d.ts +7 -2
  19. package/dist/_dts/theme-core/src/buttons/personalities/soft-pill.d.ts +7 -2
  20. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +10 -10
  21. package/dist/_dts/theme-core/src/palette/variants/brand-led.d.ts +33 -9
  22. package/dist/_dts/theme-core/src/palette/variants/high-contrast.d.ts +33 -9
  23. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +200 -4
  24. package/dist/_dts/theme-core/src/palette/variants/soft-natural.d.ts +33 -9
  25. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +10 -10
  26. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +33 -9
  27. package/dist/_dts/theme-core/src/site-styles/curatedChoices.d.ts +27 -0
  28. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +48 -194
  29. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -1
  30. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +12 -14
  31. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +46 -0
  32. package/dist/_dts/ui/src/palette/ColorChooserDialog.d.ts +47 -0
  33. package/dist/_dts/ui/src/palette/ColorSlotButton.d.ts +15 -0
  34. package/dist/_dts/ui/src/palette/ColorSwatchButton.d.ts +15 -0
  35. package/dist/_dts/ui/src/palette/PaletteTokenEditor.d.ts +50 -0
  36. package/dist/_dts/ui/src/palette/hex.d.ts +23 -0
  37. package/dist/_dts/ui/src/palette/index.d.ts +14 -0
  38. package/dist/cli/index.mjs +1023 -923
  39. package/dist/client/client.mjs +3410 -3221
  40. package/dist/client/hooks.mjs +1625 -1564
  41. package/dist/client/rendering/client.mjs +132 -37
  42. package/dist/client/rendering/islands.mjs +91 -30
  43. package/dist/client/rendering.mjs +1237 -1049
  44. package/dist/preview-next/client/runtime.mjs +3095 -2736
  45. package/dist/server/components.mjs +2381 -2255
  46. package/dist/server/config-validation.mjs +1625 -1564
  47. package/dist/server/config.mjs +1625 -1564
  48. package/dist/server/data.mjs +1625 -1564
  49. package/dist/server/index.mjs +4 -3
  50. package/dist/server/next.mjs +3233 -3106
  51. package/dist/server/page-converter.mjs +1625 -1564
  52. package/dist/server/prebuild.mjs +1 -1
  53. package/dist/server/rendering/server.mjs +2381 -2255
  54. package/dist/server/rendering.mjs +2381 -2255
  55. package/dist/server/routing.mjs +2340 -2271
  56. package/dist/server/server.mjs +1629 -1567
  57. package/dist/server/theme-bridge.mjs +130 -126
  58. package/dist/server/theme.mjs +131 -129
  59. package/package.json +1 -1
  60. package/dist/_dts/theme-core/src/site-styles/compatibility.d.ts +0 -109
@@ -7865,861 +7865,482 @@ function assertUniqueLayoutProfileKeys(profiles) {
7865
7865
  }
7866
7866
  }
7867
7867
 
7868
- // ../theme-core/src/site-styles/compatibility.ts
7868
+ // ../theme-core/src/buttons/personalities/types.ts
7869
+ import { z as z11 } from "zod";
7870
+
7871
+ // ../theme-core/src/buttons/types.ts
7869
7872
  import { z as z9 } from "zod";
7873
+ var VARIANT_ROLES = [
7874
+ "primary",
7875
+ "secondary",
7876
+ "outline",
7877
+ "ghost",
7878
+ "link",
7879
+ "tertiary",
7880
+ "accent"
7881
+ ];
7882
+ var cornerStyleSchema = z9.enum(["square", "rounded", "pill"]);
7883
+ var shadowSizeSchema = z9.enum(["none", "low", "medium", "high"]);
7884
+ var textTransformSchema = z9.enum(["none", "uppercase", "lowercase", "capitalize"]);
7885
+ var fontWeightSchema = z9.union([z9.literal(500), z9.literal(600), z9.literal(700)]);
7886
+ var buttonTypographySchema = z9.enum(["body", "heading"]);
7887
+ var letterSpacingSchema = z9.enum(["tight", "normal", "loose"]);
7888
+ var hoverTransformSchema = z9.enum(["none", "lift", "scale", "press"]);
7889
+ var hoverColorSchema = z9.enum(["none", "brighten", "darken", "saturate", "token"]);
7890
+ var buttonPaddingPresetSchema = z9.enum(["compact", "default", "spacious"]);
7891
+ var gradientStyleSchema = z9.enum(["linear", "radial", "conic"]);
7892
+ var gradientSharpnessSchema = z9.enum(["smooth", "medium", "hard"]);
7893
+ var prioritySchema = z9.union([z9.literal(1), z9.literal(2), z9.literal(3)]);
7894
+ var variantRoleSchema = z9.enum(VARIANT_ROLES);
7895
+ var buttonSizeNameSchema = z9.enum(["sm", "md", "lg", "xl"]);
7896
+ var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
7897
+ var paddingShorthandSchema = z9.string().refine(
7898
+ (value) => {
7899
+ const parts = value.split(/\s+/).filter(Boolean);
7900
+ return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
7901
+ },
7902
+ {
7903
+ message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
7904
+ }
7905
+ );
7906
+ var buttonSizeConfigSchema = z9.object({
7907
+ padding: paddingShorthandSchema,
7908
+ fontSize: z9.string().optional()
7909
+ });
7910
+ var buttonSizesSchema = z9.object({
7911
+ sm: buttonSizeConfigSchema,
7912
+ md: buttonSizeConfigSchema,
7913
+ lg: buttonSizeConfigSchema,
7914
+ xl: buttonSizeConfigSchema.optional()
7915
+ }).transform(({ sm, md, lg, xl }) => ({
7916
+ sm,
7917
+ md,
7918
+ lg,
7919
+ xl: xl ?? lg
7920
+ }));
7921
+ var buttonGlobalSettingsSchema = z9.object({
7922
+ cornerStyle: cornerStyleSchema,
7923
+ cornerRadius: z9.number().min(0).max(24).optional(),
7924
+ shadow: shadowSizeSchema,
7925
+ textTransform: textTransformSchema,
7926
+ fontWeight: fontWeightSchema,
7927
+ /**
7928
+ * @deprecated Set per-variant via `variant.border.widthClass` instead.
7929
+ * Schema field is preserved so existing presets parse; the value is unread
7930
+ * by the current generator and will be removed once the legacy
7931
+ * `primitives/content/components/Button.tsx` slot exports are deleted.
7932
+ */
7933
+ borderWidth: z9.union([z9.literal(1), z9.literal(2), z9.literal(3)]),
7934
+ // === Family-level typography ===
7935
+ // Typography source (body or heading) — selects which theme typography pool to inherit
7936
+ typography: buttonTypographySchema.optional(),
7937
+ // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
7938
+ // Sized variants get this as default; fixed variants inherit unless they override.
7939
+ // Size class CSS may still override at run time for sized variants.
7940
+ fontSize: z9.string().optional(),
7941
+ // Letter spacing applied to all variants
7942
+ letterSpacing: letterSpacingSchema.optional(),
7943
+ // Italic style
7944
+ italic: z9.boolean().optional(),
7945
+ // Padding preset (applies to sized variants without a sizes config)
7946
+ paddingPreset: buttonPaddingPresetSchema.optional(),
7947
+ hoverTransform: hoverTransformSchema,
7948
+ hoverColor: hoverColorSchema,
7949
+ // When hoverColor is 'token', this specifies which token to use
7950
+ hoverColorToken: z9.string().optional(),
7951
+ // Gradient settings (if any variant uses gradients)
7952
+ gradientStyle: gradientStyleSchema.optional(),
7953
+ gradientAngle: z9.number().min(0).max(360).optional(),
7954
+ gradientSharpness: gradientSharpnessSchema.optional()
7955
+ });
7956
+ var gradientDirectionSchema = z9.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
7957
+ var buttonBackgroundSchema = z9.discriminatedUnion("type", [
7958
+ z9.object({ type: z9.literal("solid"), colorToken: z9.string() }),
7959
+ z9.object({
7960
+ type: z9.literal("gradient"),
7961
+ stops: z9.array(z9.string()).min(2),
7962
+ direction: gradientDirectionSchema
7963
+ }),
7964
+ z9.object({ type: z9.literal("transparent") })
7965
+ ]);
7966
+ var effectApplicationSchema = z9.object({
7967
+ effectId: z9.string(),
7968
+ options: z9.record(z9.string(), z9.any()).optional()
7969
+ });
7970
+ var buttonBorderSchema = z9.object({
7971
+ widthClass: z9.string(),
7972
+ colorToken: z9.string()
7973
+ });
7974
+ var variantShadowSchema = z9.object({
7975
+ elevation: z9.enum(["none", "low", "medium", "high"]),
7976
+ softness: z9.enum(["crisp", "soft", "hard"]).nullable(),
7977
+ position: z9.enum(["bottom", "bottom-right"]).default("bottom")
7978
+ });
7979
+ var variantEffectsSchema = z9.object({
7980
+ base: z9.array(effectApplicationSchema).optional(),
7981
+ hover: z9.array(effectApplicationSchema).optional(),
7982
+ active: z9.array(effectApplicationSchema).optional(),
7983
+ focus: z9.array(effectApplicationSchema).optional()
7984
+ });
7985
+ var variantSizeOverridesSchema = z9.object({
7986
+ sm: buttonSizeConfigSchema.optional(),
7987
+ md: buttonSizeConfigSchema.optional(),
7988
+ lg: buttonSizeConfigSchema.optional(),
7989
+ xl: buttonSizeConfigSchema.optional()
7990
+ });
7991
+ var buttonVariantSchema = z9.object({
7992
+ id: z9.string(),
7993
+ name: z9.string().min(1).max(20),
7994
+ enabled: z9.boolean(),
7995
+ priority: prioritySchema,
7996
+ // Base appearance (token-based)
7997
+ background: buttonBackgroundSchema,
7998
+ textColorToken: z9.string(),
7999
+ /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
8000
+ borderRadius: z9.string().optional(),
8001
+ // Optional shadow override (uses theme.shadow if not specified)
8002
+ shadow: variantShadowSchema.optional(),
8003
+ // Border (optional)
8004
+ border: buttonBorderSchema.optional(),
8005
+ // Hover background token (per-variant override, takes precedence over global hoverColorToken)
8006
+ hoverBackgroundToken: z9.string().optional(),
8007
+ // Effect composition
8008
+ effects: variantEffectsSchema.optional(),
8009
+ // Per-variant size overrides — see VariantSizeOverrides
8010
+ sizes: variantSizeOverridesSchema.optional()
8011
+ });
8012
+ var buttonSystemSchema = z9.object({
8013
+ global: buttonGlobalSettingsSchema,
8014
+ variants: z9.array(buttonVariantSchema).min(1).max(6),
8015
+ sizes: buttonSizesSchema.optional()
8016
+ });
8017
+
8018
+ // ../theme-core/src/site-styles/styleTags.ts
8019
+ import { z as z10 } from "zod";
7870
8020
  var STYLE_AXIS_VALUES = {
7871
8021
  tone: ["minimal", "classic", "bold"],
7872
8022
  energy: ["calm", "vibrant"],
7873
8023
  motion: ["subtle", "standard", "expressive"],
7874
8024
  era: ["editorial", "modern", "organic", "technical", "retro"]
7875
8025
  };
7876
- var styleTagsSchema = z9.object({
7877
- tone: z9.enum(STYLE_AXIS_VALUES.tone).optional(),
7878
- energy: z9.enum(STYLE_AXIS_VALUES.energy).optional(),
7879
- motion: z9.enum(STYLE_AXIS_VALUES.motion).optional(),
7880
- era: z9.enum(STYLE_AXIS_VALUES.era).optional()
8026
+ var styleTagsSchema = z10.object({
8027
+ tone: z10.enum(STYLE_AXIS_VALUES.tone).optional(),
8028
+ energy: z10.enum(STYLE_AXIS_VALUES.energy).optional(),
8029
+ motion: z10.enum(STYLE_AXIS_VALUES.motion).optional(),
8030
+ era: z10.enum(STYLE_AXIS_VALUES.era).optional()
7881
8031
  });
7882
8032
 
7883
- // ../theme-core/src/site-styles/sourceCatalogs.ts
7884
- var generatedContentFrames = [
7885
- plainFrame,
7886
- panelFrame("inset"),
7887
- panelFrame("raised"),
7888
- flushPanelFrame({ bleed: "start" })
7889
- ];
7890
- var userContentFrames = [
7891
- ...generatedContentFrames,
7892
- panelFrame("editorial"),
7893
- flushPanelFrame({ bleed: "end" }),
7894
- flushPanelFrame({ bleed: "both" })
7895
- ];
7896
- var generatedDesignOptionCatalog = {
7897
- source: "generated",
7898
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
7899
- contentFrames: generatedContentFrames,
7900
- itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
7901
- transitions: ["none", "soft-fade-short", "soft-fade-long"],
7902
- emphases: ["low", "medium", "high"],
7903
- detachedCustom: false
7904
- };
7905
- var userDesignOptionCatalog = {
7906
- source: "user",
7907
- sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
7908
- contentFrames: userContentFrames,
7909
- itemSurfaces: [
7910
- ...generatedDesignOptionCatalog.itemSurfaces,
7911
- "inset",
7912
- "editorial"
7913
- ],
7914
- transitions: [
7915
- ...generatedDesignOptionCatalog.transitions,
7916
- "wave-edge",
7917
- "angle-edge"
7918
- ],
7919
- emphases: generatedDesignOptionCatalog.emphases,
7920
- detachedCustom: false
7921
- };
7922
- var advancedDesignOptionCatalog = {
7923
- source: "advanced",
7924
- sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
7925
- contentFrames: userDesignOptionCatalog.contentFrames,
7926
- itemSurfaces: userDesignOptionCatalog.itemSurfaces,
7927
- transitions: userDesignOptionCatalog.transitions,
7928
- emphases: userDesignOptionCatalog.emphases,
7929
- detachedCustom: true
7930
- };
7931
-
7932
- // ../theme-core/src/site-styles/curatedSiteStyles.ts
7933
- var curatedSiteStyleIdValues = [
7934
- "site-style:calm-studio",
7935
- "site-style:clear-professional",
7936
- "site-style:warm-editorial",
7937
- "site-style:bright-community",
7938
- "site-style:quiet-luxury",
7939
- "site-style:practical-services",
7940
- "site-style:modern-wellness",
7941
- "site-style:bold-launch"
7942
- ];
7943
- var quietBudget = {
7944
- accentDensity: "low",
7945
- panelDensity: "medium",
7946
- transitionMix: "quiet",
7947
- primaryCtaLimit: 2,
7948
- mediaDensity: "medium",
7949
- decorativeRepetition: "low"
7950
- };
7951
- var balancedBudget = {
7952
- accentDensity: "medium",
7953
- panelDensity: "medium",
7954
- transitionMix: "balanced",
7955
- primaryCtaLimit: 3,
7956
- mediaDensity: "medium",
7957
- decorativeRepetition: "medium"
7958
- };
7959
- var expressiveBudget = {
7960
- accentDensity: "high",
7961
- panelDensity: "high",
7962
- transitionMix: "expressive",
7963
- primaryCtaLimit: 3,
7964
- mediaDensity: "high",
7965
- decorativeRepetition: "medium"
7966
- };
7967
- function uniqueContentFrameKinds() {
7968
- const kinds = [...new Set(
7969
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
7970
- )];
7971
- const firstKind = kinds[0];
7972
- if (!firstKind) {
7973
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
8033
+ // ../theme-core/src/buttons/personalities/types.ts
8034
+ function asButtonPersonalityId(value) {
8035
+ if (value.length === 0) {
8036
+ throw new Error("ButtonPersonalityId must be a non-empty string");
7974
8037
  }
7975
- return [firstKind, ...kinds.slice(1)];
8038
+ return value;
7976
8039
  }
7977
- var generatedContentFrameKinds = uniqueContentFrameKinds();
7978
- function defineCuratedSiteStyle(input) {
8040
+ var buttonPersonalityIdSchema = z11.string().min(1).transform((value) => asButtonPersonalityId(value));
8041
+ var buttonPersonalitySchema = z11.object({
8042
+ id: buttonPersonalityIdSchema,
8043
+ name: z11.string().min(1),
8044
+ description: z11.string().min(1),
8045
+ tags: styleTagsSchema,
8046
+ buttonSystem: buttonSystemSchema
8047
+ });
8048
+ function defineButtonPersonality(input) {
7979
8049
  return {
7980
- id: asSiteStyleId(input.id),
8050
+ id: asButtonPersonalityId(input.id),
7981
8051
  name: input.name,
7982
8052
  description: input.description,
7983
- generationBrief: input.generationBrief,
7984
- selectionKeywords: input.selectionKeywords ?? [],
7985
- template: {
7986
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
7987
- name: input.name,
7988
- version: 1,
7989
- tokenRecipes: input.tokenRecipes,
7990
- compositionBudget: input.compositionBudget,
7991
- supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
7992
- supportedContentFrames: generatedContentFrameKinds,
7993
- supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
7994
- supportedTransitions: generatedDesignOptionCatalog.transitions
7995
- },
7996
- // The library IDs are already branded at construction (`asButtonPersonalityId`
7997
- // / `asPaletteVariantId`); the closed-union input type guarantees only
7998
- // shipped IDs reach this branch.
7999
- defaultButtonPersonalityId: input.defaultButtonPersonalityId,
8000
- acceptedButtons: input.acceptedButtons,
8001
- defaultPaletteVariantId: input.defaultPaletteVariantId,
8002
- acceptedPalettes: input.acceptedPalettes
8053
+ tags: input.tags,
8054
+ buttonSystem: input.buttonSystem
8003
8055
  };
8004
8056
  }
8005
- var curatedSiteStyles = [
8006
- defineCuratedSiteStyle({
8007
- id: "site-style:calm-studio",
8008
- name: "Calm Studio",
8009
- description: "Soft, measured, and spacious for intimate appointment or class businesses.",
8010
- generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
8011
- tokenRecipes: {
8012
- palette: "soft-natural",
8013
- contrast: "standard",
8014
- radius: "soft",
8015
- shadow: "subtle",
8016
- typography: "friendly-sans",
8017
- spacing: "airy",
8018
- motion: "subtle"
8019
- },
8020
- compositionBudget: quietBudget,
8021
- defaultButtonPersonalityId: "soft-pill",
8022
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "editorial"] },
8023
- defaultPaletteVariantId: "soft-natural-sage",
8024
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
8025
- }),
8026
- defineCuratedSiteStyle({
8027
- id: "site-style:clear-professional",
8028
- name: "Clear Professional",
8029
- description: "Crisp, trustworthy, and direct for local services and consultancies.",
8030
- generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
8031
- tokenRecipes: {
8032
- palette: "brand-led",
8033
- contrast: "strong",
8034
- radius: "soft",
8035
- shadow: "subtle",
8036
- typography: "clean-sans",
8037
- spacing: "regular",
8038
- motion: "subtle"
8057
+
8058
+ // ../theme-core/src/buttons/personalities/brushed-wash.ts
8059
+ var brushedWash = defineButtonPersonality({
8060
+ id: "brushed-wash",
8061
+ name: "Brushed Wash",
8062
+ description: "Watercolour-gradient buttons with soft shadows and generous padding.",
8063
+ tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
8064
+ buttonSystem: {
8065
+ global: {
8066
+ cornerStyle: "rounded",
8067
+ shadow: "low",
8068
+ textTransform: "none",
8069
+ fontWeight: 500,
8070
+ borderWidth: 1,
8071
+ hoverTransform: "none",
8072
+ hoverColor: "none"
8039
8073
  },
8040
- compositionBudget: balancedBudget,
8041
- defaultButtonPersonalityId: "confident-chip",
8042
- acceptedButtons: { tone: ["minimal", "classic"], era: ["modern", "editorial"] },
8043
- defaultPaletteVariantId: "brand-led-cool",
8044
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["modern", "editorial"] }
8045
- }),
8046
- defineCuratedSiteStyle({
8047
- id: "site-style:warm-editorial",
8048
- name: "Warm Editorial",
8049
- description: "Story-led and textured for educators, makers, venues, and retreats.",
8050
- generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
8051
- tokenRecipes: {
8052
- palette: "warm-neutral",
8053
- contrast: "standard",
8054
- radius: "square",
8055
- shadow: "none",
8056
- typography: "serif-editorial",
8057
- spacing: "airy",
8058
- motion: "subtle"
8074
+ sizes: {
8075
+ sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
8076
+ md: { padding: "1rem 2.5rem" },
8077
+ lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
8078
+ xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
8059
8079
  },
8060
- compositionBudget: balancedBudget,
8061
- defaultButtonPersonalityId: "editorial-link",
8062
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
8063
- defaultPaletteVariantId: "warm-neutral-cream",
8064
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
8065
- }),
8066
- defineCuratedSiteStyle({
8067
- id: "site-style:bright-community",
8068
- name: "Bright Community",
8069
- description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
8070
- generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
8071
- tokenRecipes: {
8072
- palette: "brand-led",
8073
- contrast: "standard",
8074
- radius: "rounded",
8075
- shadow: "subtle",
8076
- typography: "friendly-sans",
8077
- spacing: "regular",
8078
- motion: "expressive"
8080
+ variants: [
8081
+ {
8082
+ id: "primary",
8083
+ name: "Primary",
8084
+ enabled: true,
8085
+ priority: 1,
8086
+ background: {
8087
+ type: "gradient",
8088
+ stops: ["primary", "accent"],
8089
+ direction: "to-r"
8090
+ },
8091
+ textColorToken: "primaryForeground",
8092
+ borderRadius: "rounded-lg",
8093
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8094
+ effects: {
8095
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8096
+ }
8097
+ },
8098
+ {
8099
+ id: "secondary",
8100
+ name: "Secondary",
8101
+ enabled: true,
8102
+ priority: 2,
8103
+ background: {
8104
+ type: "gradient",
8105
+ stops: ["secondary", "accent"],
8106
+ direction: "to-br"
8107
+ },
8108
+ textColorToken: "primaryForeground",
8109
+ borderRadius: "rounded-lg",
8110
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
8111
+ effects: {
8112
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8113
+ }
8114
+ },
8115
+ {
8116
+ id: "outline",
8117
+ name: "Outline",
8118
+ enabled: true,
8119
+ priority: 3,
8120
+ background: { type: "transparent" },
8121
+ textColorToken: "primary",
8122
+ borderRadius: "rounded-lg",
8123
+ border: { widthClass: "border", colorToken: "primary" },
8124
+ effects: {
8125
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8126
+ }
8127
+ },
8128
+ {
8129
+ id: "ghost",
8130
+ name: "Ghost",
8131
+ enabled: true,
8132
+ priority: 3,
8133
+ background: { type: "transparent" },
8134
+ textColorToken: "text",
8135
+ borderRadius: "rounded-lg",
8136
+ effects: {
8137
+ hover: [
8138
+ { effectId: "background-on-hover", options: { colorToken: "surface" } }
8139
+ ]
8140
+ }
8141
+ }
8142
+ ]
8143
+ }
8144
+ });
8145
+
8146
+ // ../theme-core/src/buttons/personalities/confident-chip.ts
8147
+ var confidentChip = defineButtonPersonality({
8148
+ id: "confident-chip",
8149
+ name: "Confident Chip",
8150
+ description: "Mid-radius solid buttons with a crisp hover.",
8151
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
8152
+ buttonSystem: {
8153
+ global: {
8154
+ cornerStyle: "rounded",
8155
+ shadow: "medium",
8156
+ textTransform: "none",
8157
+ fontWeight: 600,
8158
+ borderWidth: 1,
8159
+ hoverTransform: "none",
8160
+ hoverColor: "none"
8079
8161
  },
8080
- compositionBudget: balancedBudget,
8081
- defaultButtonPersonalityId: "pebble",
8082
- acceptedButtons: { tone: ["classic", "bold"], era: ["organic", "modern"] },
8083
- defaultPaletteVariantId: "brand-led-warm",
8084
- acceptedPalettes: { tone: ["classic", "bold"], era: ["modern", "organic"] }
8085
- }),
8086
- defineCuratedSiteStyle({
8087
- id: "site-style:quiet-luxury",
8088
- name: "Quiet Luxury",
8089
- description: "Minimal, confident, and refined for premium experiences and private services.",
8090
- generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
8091
- selectionKeywords: [
8092
- "luxury",
8093
- "premium",
8094
- "boutique",
8095
- "bespoke",
8096
- "exclusive"
8097
- ],
8098
- tokenRecipes: {
8099
- palette: "high-contrast",
8100
- contrast: "strong",
8101
- radius: "square",
8162
+ variants: [
8163
+ {
8164
+ id: "primary",
8165
+ name: "Primary",
8166
+ enabled: true,
8167
+ priority: 1,
8168
+ background: { type: "solid", colorToken: "primary" },
8169
+ textColorToken: "primaryForeground",
8170
+ borderRadius: "rounded-md",
8171
+ shadow: { elevation: "medium", softness: "soft", position: "bottom" },
8172
+ effects: {
8173
+ hover: [{ effectId: "darken-background", options: { amount: 60 } }],
8174
+ active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
8175
+ }
8176
+ },
8177
+ {
8178
+ id: "secondary",
8179
+ name: "Secondary",
8180
+ enabled: true,
8181
+ priority: 2,
8182
+ background: { type: "solid", colorToken: "surface" },
8183
+ textColorToken: "text",
8184
+ borderRadius: "rounded-md",
8185
+ border: { widthClass: "border", colorToken: "border" },
8186
+ effects: {
8187
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8188
+ }
8189
+ },
8190
+ {
8191
+ id: "outline",
8192
+ name: "Outline",
8193
+ enabled: true,
8194
+ priority: 3,
8195
+ background: { type: "transparent" },
8196
+ textColorToken: "primary",
8197
+ borderRadius: "rounded-md",
8198
+ border: { widthClass: "border", colorToken: "primary" },
8199
+ effects: {
8200
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8201
+ }
8202
+ },
8203
+ {
8204
+ id: "ghost",
8205
+ name: "Ghost",
8206
+ enabled: true,
8207
+ priority: 3,
8208
+ background: { type: "transparent" },
8209
+ textColorToken: "primary",
8210
+ borderRadius: "rounded-md",
8211
+ effects: {
8212
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8213
+ }
8214
+ }
8215
+ ]
8216
+ }
8217
+ });
8218
+
8219
+ // ../theme-core/src/buttons/personalities/editorial-link.ts
8220
+ var editorialLink = defineButtonPersonality({
8221
+ id: "editorial-link",
8222
+ name: "Editorial Link",
8223
+ description: "Link-style with a growing underline. Refined, typographic.",
8224
+ tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
8225
+ buttonSystem: {
8226
+ global: {
8227
+ cornerStyle: "square",
8102
8228
  shadow: "none",
8103
- typography: "classic-serif",
8104
- spacing: "airy",
8105
- motion: "none"
8106
- },
8107
- compositionBudget: quietBudget,
8108
- defaultButtonPersonalityId: "editorial-link",
8109
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
8110
- defaultPaletteVariantId: "high-contrast-charcoal",
8111
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
8112
- }),
8113
- defineCuratedSiteStyle({
8114
- id: "site-style:practical-services",
8115
- name: "Practical Services",
8116
- description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
8117
- generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
8118
- selectionKeywords: [
8119
- "repair",
8120
- "plumb",
8121
- "electric",
8122
- "cleaning",
8123
- "landscap",
8124
- "contractor"
8125
- ],
8126
- tokenRecipes: {
8127
- palette: "brand-led",
8128
- contrast: "maximum",
8129
- radius: "soft",
8130
- shadow: "subtle",
8131
- typography: "clean-sans",
8132
- spacing: "compact",
8133
- motion: "none"
8134
- },
8135
- compositionBudget: quietBudget,
8136
- defaultButtonPersonalityId: "confident-chip",
8137
- acceptedButtons: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] },
8138
- defaultPaletteVariantId: "brand-led-cool",
8139
- acceptedPalettes: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] }
8140
- }),
8141
- defineCuratedSiteStyle({
8142
- id: "site-style:modern-wellness",
8143
- name: "Modern Wellness",
8144
- description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
8145
- generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
8146
- tokenRecipes: {
8147
- palette: "soft-natural",
8148
- contrast: "standard",
8149
- radius: "rounded",
8150
- shadow: "subtle",
8151
- typography: "clean-sans",
8152
- spacing: "airy",
8153
- motion: "subtle"
8229
+ textTransform: "none",
8230
+ fontWeight: 500,
8231
+ borderWidth: 1,
8232
+ hoverTransform: "none",
8233
+ hoverColor: "none"
8154
8234
  },
8155
- compositionBudget: balancedBudget,
8156
- defaultButtonPersonalityId: "soft-pill",
8157
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "modern"] },
8158
- defaultPaletteVariantId: "soft-natural-sage",
8159
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
8160
- }),
8161
- defineCuratedSiteStyle({
8162
- id: "site-style:bold-launch",
8163
- name: "Bold Launch",
8164
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
8165
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
8166
- selectionKeywords: [
8167
- "launch",
8168
- "campaign",
8169
- "preorder",
8170
- "pre-order",
8171
- "waitlist",
8172
- "drop"
8173
- ],
8174
- tokenRecipes: {
8175
- palette: "high-contrast",
8176
- contrast: "maximum",
8177
- radius: "pill",
8178
- shadow: "layered",
8179
- typography: "clean-sans",
8180
- spacing: "regular",
8181
- motion: "expressive"
8182
- },
8183
- compositionBudget: expressiveBudget,
8184
- defaultButtonPersonalityId: "ink-stamp",
8185
- acceptedButtons: { tone: ["classic", "bold"], era: ["editorial", "organic", "modern"] },
8186
- defaultPaletteVariantId: "high-contrast-monochrome",
8187
- acceptedPalettes: { tone: ["bold"], era: ["editorial", "modern"] }
8188
- })
8189
- ];
8190
- var curatedSiteStylesById = new Map(
8191
- curatedSiteStyles.map((style) => [style.id, style])
8192
- );
8193
-
8194
- // ../theme-core/src/site-styles/designState.ts
8195
- import { z as z10 } from "zod";
8196
-
8197
- // ../theme-core/src/site-styles/rawStyleFields.ts
8198
- var themeV2RuntimeStyleFieldNames = [
8199
- "_frameStyles",
8200
- "_sectionStyles",
8201
- "_containerStyles",
8202
- "_cardStyles",
8203
- // styleGroup is legacy runtime transition wiring rather than a nested
8204
- // override object, but normal editors should still never see it directly.
8205
- "styleGroup"
8206
- ];
8207
- var themeV2BlockSpecificRawStyleFieldNames = [
8208
- "_contentCardStyles",
8209
- "_textCardStyles"
8210
- ];
8211
- var themeV2NormalEditorRawStyleFieldNames = [
8212
- ...themeV2RuntimeStyleFieldNames,
8213
- ...themeV2BlockSpecificRawStyleFieldNames
8214
- ];
8215
- var themeV2NormalEditorRawStyleFieldNameSet = new Set(
8216
- themeV2NormalEditorRawStyleFieldNames
8217
- );
8218
-
8219
- // ../theme-core/src/site-styles/designState.ts
8220
- var themeV2DesignStateSchemaVersion = 1;
8221
- var designResolutionPolicySchema = z10.enum(["generated", "user", "admin", "sdk"]);
8222
- var runtimeStyleFieldNameSchema = z10.enum(themeV2RuntimeStyleFieldNames);
8223
- var nonEmptyRuntimeStyleFieldNamesSchema = z10.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
8224
- fields3[0],
8225
- ...fields3.slice(1)
8226
- ]);
8227
- var heroLegibilityStrategySchema = z10.enum([
8228
- "none",
8229
- "scrim-gradient",
8230
- "solid-panel"
8231
- ]);
8232
- function uniqueNonEmpty(values) {
8233
- const uniqueValues = [...new Set(values)];
8234
- const firstValue = uniqueValues[0];
8235
- if (!firstValue) {
8236
- throw new Error("Expected at least one Theme V2 design state option.");
8237
- }
8238
- return [firstValue, ...uniqueValues.slice(1)];
8239
- }
8240
- var userPanelTreatments = uniqueNonEmpty(
8241
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
8242
- );
8243
- var userFlushTreatments = uniqueNonEmpty(
8244
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
8245
- );
8246
- var userFlushBleeds = uniqueNonEmpty(
8247
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
8248
- );
8249
- var contentFrameIntentSchema = z10.discriminatedUnion("kind", [
8250
- z10.object({ kind: z10.literal("plain") }).strict(),
8251
- z10.object({
8252
- kind: z10.literal("panel"),
8253
- treatment: z10.enum(userPanelTreatments)
8254
- }).strict(),
8255
- z10.object({
8256
- kind: z10.literal("flush-panel"),
8257
- treatment: z10.enum(userFlushTreatments),
8258
- bleed: z10.enum(userFlushBleeds)
8259
- }).strict()
8260
- ]);
8261
- var blockDesignPlanSchema = z10.object({
8262
- blockId: z10.string().min(1).transform(asDesignBlockId),
8263
- blockKind: z10.string().min(1),
8264
- purpose: z10.string().min(1),
8265
- sectionSurface: z10.enum(userDesignOptionCatalog.sectionSurfaces),
8266
- contentFrame: contentFrameIntentSchema,
8267
- itemSurface: z10.enum(userDesignOptionCatalog.itemSurfaces),
8268
- transitionAfter: z10.enum(userDesignOptionCatalog.transitions),
8269
- emphasis: z10.enum(userDesignOptionCatalog.emphases),
8270
- heroLegibility: heroLegibilityStrategySchema.optional()
8271
- }).strict();
8272
- var styleAuthoritySchema = z10.discriminatedUnion("kind", [
8273
- z10.object({
8274
- kind: z10.literal("theme-v2"),
8275
- source: designResolutionPolicySchema,
8276
- siteStyleId: z10.string().min(1).transform(asSiteStyleId),
8277
- templateId: z10.string().min(1).transform(asDesignSystemTemplateId),
8278
- templateVersion: z10.number().int().nonnegative(),
8279
- resolverVersion: z10.number().int().nonnegative()
8280
- }).strict(),
8281
- z10.object({
8282
- kind: z10.literal("legacy-raw"),
8283
- reason: z10.enum(["pre-theme-v2", "manual-runtime-fields"])
8284
- }).strict(),
8285
- z10.object({
8286
- kind: z10.literal("advanced-detached"),
8287
- reason: z10.literal("detached-custom-runtime-fields")
8288
- }).strict()
8289
- ]);
8290
- var blockRuntimeStyleAuthoritySchema = z10.object({
8291
- unit: z10.literal("block-runtime-fields"),
8292
- blockId: z10.string().min(1).transform(asDesignBlockId),
8293
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
8294
- authority: styleAuthoritySchema
8295
- }).strict();
8296
- var persistedPageDesignStateV1Schema = z10.object({
8297
- schemaVersion: z10.literal(themeV2DesignStateSchemaVersion),
8298
- siteStyleId: z10.string().min(1).transform(asSiteStyleId),
8299
- templateId: z10.string().min(1).transform(asDesignSystemTemplateId),
8300
- templateVersion: z10.number().int().nonnegative(),
8301
- resolverVersion: z10.number().int().nonnegative(),
8302
- rhythmPresetId: z10.string().min(1),
8303
- blocks: z10.array(blockDesignPlanSchema),
8304
- styleAuthorities: z10.array(blockRuntimeStyleAuthoritySchema)
8305
- }).strict();
8306
-
8307
- // ../theme-core/src/site-styles/generatedSchemas.ts
8308
- import { z as z11 } from "zod";
8309
- function uniqueNonEmpty2(values) {
8310
- const uniqueValues = [...new Set(values)];
8311
- const firstValue = uniqueValues[0];
8312
- if (!firstValue) {
8313
- throw new Error("Expected at least one generated schema option.");
8314
- }
8315
- return [firstValue, ...uniqueValues.slice(1)];
8316
- }
8317
- var generatedPanelTreatments = uniqueNonEmpty2(
8318
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
8319
- );
8320
- var generatedFlushTreatments = uniqueNonEmpty2(
8321
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
8322
- );
8323
- var generatedFlushBleeds = uniqueNonEmpty2(
8324
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
8325
- );
8326
- var generatedPanelFrameSchema = z11.object({
8327
- kind: z11.literal("panel"),
8328
- treatment: z11.enum(generatedPanelTreatments)
8329
- }).strict();
8330
- var generatedFlushPanelFrameSchema = z11.object({
8331
- kind: z11.literal("flush-panel"),
8332
- treatment: z11.enum(generatedFlushTreatments),
8333
- bleed: z11.enum(generatedFlushBleeds)
8334
- }).strict();
8335
- var generatedContentFrameIntentSchema = z11.discriminatedUnion("kind", [
8336
- z11.object({ kind: z11.literal("plain") }).strict(),
8337
- generatedPanelFrameSchema,
8338
- generatedFlushPanelFrameSchema
8339
- ]);
8340
- var generatedSiteStyleIdSchema = z11.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
8341
- function generatedChoiceSchema(valueSchema) {
8342
- return z11.discriminatedUnion("kind", [
8343
- z11.object({
8344
- source: z11.literal("generated"),
8345
- kind: z11.literal("auto")
8346
- }).strict(),
8347
- z11.object({
8348
- source: z11.literal("generated"),
8349
- kind: z11.literal("explicit"),
8350
- value: valueSchema
8351
- }).strict()
8352
- ]);
8353
- }
8354
- var generatedBlockDesignIntentSchema = z11.object({
8355
- sectionSurface: generatedChoiceSchema(
8356
- z11.enum(generatedDesignOptionCatalog.sectionSurfaces)
8357
- ),
8358
- contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
8359
- itemSurface: generatedChoiceSchema(
8360
- z11.enum(generatedDesignOptionCatalog.itemSurfaces)
8361
- ),
8362
- transitionAfter: generatedChoiceSchema(
8363
- z11.enum(generatedDesignOptionCatalog.transitions)
8364
- ),
8365
- emphasis: generatedChoiceSchema(
8366
- z11.enum(generatedDesignOptionCatalog.emphases)
8367
- )
8368
- }).strict();
8369
- var generatedMediaCompositionIntentSchema = z11.enum([
8370
- "none",
8371
- "supporting",
8372
- "dominant"
8373
- ]);
8374
- var generatedDecorativeCompositionIntentSchema = z11.enum([
8375
- "none",
8376
- "supporting"
8377
- ]);
8378
- var generatedHeroLegibilityStrategySchema = z11.enum([
8379
- "none",
8380
- "scrim-gradient"
8381
- ]);
8382
- var generatedBlockMediaIntentSchema = z11.object({
8383
- media: generatedMediaCompositionIntentSchema,
8384
- decorative: generatedDecorativeCompositionIntentSchema,
8385
- heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
8386
- }).strict();
8387
- var generatedBoundaryIntentSchema = z11.object({
8388
- transitionAfter: generatedChoiceSchema(
8389
- z11.enum(generatedDesignOptionCatalog.transitions)
8390
- )
8391
- }).strict();
8392
- var generatedPageDesignBlockIntentSchema = z11.object({
8393
- blockId: z11.string().min(1),
8394
- blockKind: z11.string().min(1),
8395
- purpose: z11.string().min(1),
8396
- design: generatedBlockDesignIntentSchema,
8397
- mediaIntent: generatedBlockMediaIntentSchema,
8398
- boundaryIntent: generatedBoundaryIntentSchema
8399
- }).strict();
8400
- var generatedPageDesignIntentSchema = z11.object({
8401
- siteStyleId: generatedSiteStyleIdSchema,
8402
- blocks: z11.array(generatedPageDesignBlockIntentSchema)
8403
- }).strict();
8404
-
8405
- // ../theme-core/src/site-styles/pageDesignIntent.ts
8406
- import { z as z12 } from "zod";
8407
- var pageDesignIntentSchemaVersion = 1;
8408
- var pageDesignUserPinnedAppearanceChoiceSchema = z12.object({
8409
- kind: z12.literal("user-pinned"),
8410
- value: z12.string().min(1).transform(asAppearancePresetId)
8411
- }).strict();
8412
- var pageDesignUserPinnedBoundaryChoiceSchema = z12.object({
8413
- kind: z12.literal("user-pinned"),
8414
- value: z12.string().min(1).transform(asBoundaryOptionId)
8415
- }).strict();
8416
- var pageDesignBlockLookPinSchema = z12.object({
8417
- blockId: z12.string().min(1).transform(asDesignBlockId),
8418
- blockKind: z12.string().min(1),
8419
- choice: pageDesignUserPinnedAppearanceChoiceSchema
8420
- }).strict();
8421
- var pageDesignBoundaryPinSchema = z12.object({
8422
- boundaryId: z12.string().min(1).transform(asDesignBoundaryId),
8423
- previousBlockId: z12.string().min(1).transform(asDesignBlockId),
8424
- nextBlockId: z12.string().min(1).transform(asDesignBlockId),
8425
- choice: pageDesignUserPinnedBoundaryChoiceSchema
8426
- }).strict().superRefine((pin, ctx) => {
8427
- const expectedBoundaryId = makeBoundaryId(
8428
- pin.previousBlockId,
8429
- pin.nextBlockId
8430
- );
8431
- if (pin.boundaryId !== expectedBoundaryId) {
8432
- ctx.addIssue({
8433
- code: z12.ZodIssueCode.custom,
8434
- path: ["boundaryId"],
8435
- message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
8436
- });
8235
+ variants: [
8236
+ {
8237
+ id: "primary",
8238
+ name: "Primary",
8239
+ enabled: true,
8240
+ priority: 1,
8241
+ background: { type: "transparent" },
8242
+ textColorToken: "text",
8243
+ borderRadius: "rounded-none",
8244
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8245
+ sizes: {
8246
+ sm: { padding: "0.25rem 0" },
8247
+ md: { padding: "0.5rem 0" },
8248
+ lg: { padding: "0.625rem 0" },
8249
+ xl: { padding: "0.75rem 0" }
8250
+ },
8251
+ effects: {
8252
+ base: [
8253
+ { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
8254
+ ]
8255
+ }
8256
+ },
8257
+ {
8258
+ id: "secondary",
8259
+ name: "Secondary",
8260
+ enabled: true,
8261
+ priority: 2,
8262
+ background: { type: "transparent" },
8263
+ textColorToken: "mutedText",
8264
+ borderRadius: "rounded-none",
8265
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8266
+ sizes: {
8267
+ sm: { padding: "0.25rem 0" },
8268
+ md: { padding: "0.5rem 0" },
8269
+ lg: { padding: "0.625rem 0" },
8270
+ xl: { padding: "0.75rem 0" }
8271
+ },
8272
+ effects: {
8273
+ base: [
8274
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
8275
+ ]
8276
+ }
8277
+ },
8278
+ {
8279
+ id: "outline",
8280
+ name: "Outline",
8281
+ enabled: true,
8282
+ priority: 3,
8283
+ background: { type: "transparent" },
8284
+ textColorToken: "accent",
8285
+ borderRadius: "rounded-none",
8286
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8287
+ sizes: {
8288
+ sm: { padding: "0.25rem 0" },
8289
+ md: { padding: "0.5rem 0" },
8290
+ lg: { padding: "0.625rem 0" },
8291
+ xl: { padding: "0.75rem 0" }
8292
+ },
8293
+ effects: {
8294
+ base: [
8295
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
8296
+ ]
8297
+ }
8298
+ },
8299
+ {
8300
+ id: "ghost",
8301
+ name: "Ghost",
8302
+ enabled: true,
8303
+ priority: 3,
8304
+ background: { type: "transparent" },
8305
+ textColorToken: "mutedText",
8306
+ borderRadius: "rounded-none",
8307
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8308
+ sizes: {
8309
+ sm: { padding: "0.25rem 0" },
8310
+ md: { padding: "0.5rem 0" },
8311
+ lg: { padding: "0.625rem 0" },
8312
+ xl: { padding: "0.75rem 0" }
8313
+ },
8314
+ effects: {
8315
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
8316
+ }
8317
+ }
8318
+ ]
8437
8319
  }
8438
8320
  });
8439
- var pageDesignIntentV1Schema = z12.object({
8440
- schemaVersion: z12.literal(pageDesignIntentSchemaVersion),
8441
- siteStyleId: z12.string().min(1).transform(asSiteStyleId),
8442
- pageFlowPresetId: z12.string().min(1).transform(asPageFlowPresetId),
8443
- blockLookPins: z12.array(pageDesignBlockLookPinSchema),
8444
- boundaryPins: z12.array(pageDesignBoundaryPinSchema)
8445
- }).strict().superRefine((intent, ctx) => {
8446
- addDuplicateStringIssues(ctx, {
8447
- values: intent.blockLookPins.map((pin) => pin.blockId),
8448
- path: ["blockLookPins"],
8449
- label: "block Look pin"
8450
- });
8451
- addDuplicateStringIssues(ctx, {
8452
- values: intent.boundaryPins.map(
8453
- (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
8454
- ),
8455
- path: ["boundaryPins"],
8456
- label: "boundary pin"
8457
- });
8458
- });
8459
- function addDuplicateStringIssues(ctx, input) {
8460
- const seen = /* @__PURE__ */ new Set();
8461
- const duplicates = /* @__PURE__ */ new Set();
8462
- for (const value of input.values) {
8463
- if (seen.has(value)) {
8464
- duplicates.add(value);
8465
- }
8466
- seen.add(value);
8467
- }
8468
- for (const duplicate of duplicates) {
8469
- ctx.addIssue({
8470
- code: z12.ZodIssueCode.custom,
8471
- path: [...input.path],
8472
- message: `Duplicate ${input.label}: ${duplicate}.`
8473
- });
8474
- }
8475
- }
8476
- function boundaryKey(previousBlockId, nextBlockId) {
8477
- return makeBoundaryId(previousBlockId, nextBlockId);
8478
- }
8479
-
8480
- // ../theme-core/src/schema.ts
8481
- import { z as z25 } from "zod";
8482
-
8483
- // ../theme-core/src/lib/media.ts
8484
- import z13 from "zod";
8485
- var hotspotSchema = z13.object({
8486
- x: z13.number().min(0).max(1),
8487
- y: z13.number().min(0).max(1),
8488
- radius: z13.number().optional()
8489
- });
8490
- var rotationSchema = z13.union([z13.literal(0), z13.literal(90), z13.literal(180), z13.literal(270)]);
8491
- var rectSchema = z13.tuple([z13.number(), z13.number(), z13.number(), z13.number()]);
8492
- var aspectCropSchema = z13.object({
8493
- aspect: z13.preprocess((value) => value == null ? void 0 : value, z13.string().optional()),
8494
- rect: z13.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
8495
- hotspot: z13.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
8496
- rotation: z13.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
8497
- });
8498
- var transformSchema = z13.object({
8499
- aspectCrops: z13.preprocess((value) => {
8500
- if (!value || typeof value !== "object" || Array.isArray(value)) {
8501
- return void 0;
8502
- }
8503
- return value;
8504
- }, z13.record(z13.string(), aspectCropSchema.catch({}))).optional(),
8505
- rect: rectSchema.optional(),
8506
- hotspot: hotspotSchema.optional(),
8507
- rotation: rotationSchema.optional()
8508
- });
8509
- var mediaSchema = z13.object({
8510
- type: z13.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
8511
- purpose: z13.string().optional(),
8512
- placeholder: z13.boolean().default(true).optional(),
8513
- assetId: z13.string().optional(),
8514
- identifier: z13.string().optional(),
8515
- src: z13.string().optional(),
8516
- alt: z13.string().optional(),
8517
- filename: z13.string().optional(),
8518
- mimeType: z13.string().optional(),
8519
- width: z13.number().optional(),
8520
- height: z13.number().optional(),
8521
- storageBucket: z13.string().optional(),
8522
- storagePath: z13.string().optional(),
8523
- transform: transformSchema.optional()
8524
- });
8525
-
8526
- // ../theme-core/src/buttons/types.ts
8527
- import { z as z14 } from "zod";
8528
- var VARIANT_ROLES = [
8529
- "primary",
8530
- "secondary",
8531
- "outline",
8532
- "ghost",
8533
- "link",
8534
- "tertiary",
8535
- "accent"
8536
- ];
8537
- var cornerStyleSchema = z14.enum(["square", "rounded", "pill"]);
8538
- var shadowSizeSchema = z14.enum(["none", "low", "medium", "high"]);
8539
- var textTransformSchema = z14.enum(["none", "uppercase", "lowercase", "capitalize"]);
8540
- var fontWeightSchema = z14.union([z14.literal(500), z14.literal(600), z14.literal(700)]);
8541
- var buttonTypographySchema = z14.enum(["body", "heading"]);
8542
- var letterSpacingSchema = z14.enum(["tight", "normal", "loose"]);
8543
- var hoverTransformSchema = z14.enum(["none", "lift", "scale", "press"]);
8544
- var hoverColorSchema = z14.enum(["none", "brighten", "darken", "saturate", "token"]);
8545
- var buttonPaddingPresetSchema = z14.enum(["compact", "default", "spacious"]);
8546
- var gradientStyleSchema = z14.enum(["linear", "radial", "conic"]);
8547
- var gradientSharpnessSchema = z14.enum(["smooth", "medium", "hard"]);
8548
- var prioritySchema = z14.union([z14.literal(1), z14.literal(2), z14.literal(3)]);
8549
- var variantRoleSchema = z14.enum(VARIANT_ROLES);
8550
- var buttonSizeNameSchema = z14.enum(["sm", "md", "lg", "xl"]);
8551
- var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
8552
- var paddingShorthandSchema = z14.string().refine(
8553
- (value) => {
8554
- const parts = value.split(/\s+/).filter(Boolean);
8555
- return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
8556
- },
8557
- {
8558
- message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
8559
- }
8560
- );
8561
- var buttonSizeConfigSchema = z14.object({
8562
- padding: paddingShorthandSchema,
8563
- fontSize: z14.string().optional()
8564
- });
8565
- var buttonSizesSchema = z14.object({
8566
- sm: buttonSizeConfigSchema,
8567
- md: buttonSizeConfigSchema,
8568
- lg: buttonSizeConfigSchema,
8569
- xl: buttonSizeConfigSchema.optional()
8570
- }).transform(({ sm, md, lg, xl }) => ({
8571
- sm,
8572
- md,
8573
- lg,
8574
- xl: xl ?? lg
8575
- }));
8576
- var buttonGlobalSettingsSchema = z14.object({
8577
- cornerStyle: cornerStyleSchema,
8578
- cornerRadius: z14.number().min(0).max(24).optional(),
8579
- shadow: shadowSizeSchema,
8580
- textTransform: textTransformSchema,
8581
- fontWeight: fontWeightSchema,
8582
- /**
8583
- * @deprecated Set per-variant via `variant.border.widthClass` instead.
8584
- * Schema field is preserved so existing presets parse; the value is unread
8585
- * by the current generator and will be removed once the legacy
8586
- * `primitives/content/components/Button.tsx` slot exports are deleted.
8587
- */
8588
- borderWidth: z14.union([z14.literal(1), z14.literal(2), z14.literal(3)]),
8589
- // === Family-level typography ===
8590
- // Typography source (body or heading) — selects which theme typography pool to inherit
8591
- typography: buttonTypographySchema.optional(),
8592
- // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
8593
- // Sized variants get this as default; fixed variants inherit unless they override.
8594
- // Size class CSS may still override at run time for sized variants.
8595
- fontSize: z14.string().optional(),
8596
- // Letter spacing applied to all variants
8597
- letterSpacing: letterSpacingSchema.optional(),
8598
- // Italic style
8599
- italic: z14.boolean().optional(),
8600
- // Padding preset (applies to sized variants without a sizes config)
8601
- paddingPreset: buttonPaddingPresetSchema.optional(),
8602
- hoverTransform: hoverTransformSchema,
8603
- hoverColor: hoverColorSchema,
8604
- // When hoverColor is 'token', this specifies which token to use
8605
- hoverColorToken: z14.string().optional(),
8606
- // Gradient settings (if any variant uses gradients)
8607
- gradientStyle: gradientStyleSchema.optional(),
8608
- gradientAngle: z14.number().min(0).max(360).optional(),
8609
- gradientSharpness: gradientSharpnessSchema.optional()
8610
- });
8611
- var gradientDirectionSchema = z14.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
8612
- var buttonBackgroundSchema = z14.discriminatedUnion("type", [
8613
- z14.object({ type: z14.literal("solid"), colorToken: z14.string() }),
8614
- z14.object({
8615
- type: z14.literal("gradient"),
8616
- stops: z14.array(z14.string()).min(2),
8617
- direction: gradientDirectionSchema
8618
- }),
8619
- z14.object({ type: z14.literal("transparent") })
8620
- ]);
8621
- var effectApplicationSchema = z14.object({
8622
- effectId: z14.string(),
8623
- options: z14.record(z14.string(), z14.any()).optional()
8624
- });
8625
- var buttonBorderSchema = z14.object({
8626
- widthClass: z14.string(),
8627
- colorToken: z14.string()
8628
- });
8629
- var variantShadowSchema = z14.object({
8630
- elevation: z14.enum(["none", "low", "medium", "high"]),
8631
- softness: z14.enum(["crisp", "soft", "hard"]).nullable(),
8632
- position: z14.enum(["bottom", "bottom-right"]).default("bottom")
8633
- });
8634
- var variantEffectsSchema = z14.object({
8635
- base: z14.array(effectApplicationSchema).optional(),
8636
- hover: z14.array(effectApplicationSchema).optional(),
8637
- active: z14.array(effectApplicationSchema).optional(),
8638
- focus: z14.array(effectApplicationSchema).optional()
8639
- });
8640
- var variantSizeOverridesSchema = z14.object({
8641
- sm: buttonSizeConfigSchema.optional(),
8642
- md: buttonSizeConfigSchema.optional(),
8643
- lg: buttonSizeConfigSchema.optional(),
8644
- xl: buttonSizeConfigSchema.optional()
8645
- });
8646
- var buttonVariantSchema = z14.object({
8647
- id: z14.string(),
8648
- name: z14.string().min(1).max(20),
8649
- enabled: z14.boolean(),
8650
- priority: prioritySchema,
8651
- // Base appearance (token-based)
8652
- background: buttonBackgroundSchema,
8653
- textColorToken: z14.string(),
8654
- /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
8655
- borderRadius: z14.string().optional(),
8656
- // Optional shadow override (uses theme.shadow if not specified)
8657
- shadow: variantShadowSchema.optional(),
8658
- // Border (optional)
8659
- border: buttonBorderSchema.optional(),
8660
- // Hover background token (per-variant override, takes precedence over global hoverColorToken)
8661
- hoverBackgroundToken: z14.string().optional(),
8662
- // Effect composition
8663
- effects: variantEffectsSchema.optional(),
8664
- // Per-variant size overrides — see VariantSizeOverrides
8665
- sizes: variantSizeOverridesSchema.optional()
8666
- });
8667
- var buttonSystemSchema = z14.object({
8668
- global: buttonGlobalSettingsSchema,
8669
- variants: z14.array(buttonVariantSchema).min(1).max(6),
8670
- sizes: buttonSizesSchema.optional()
8671
- });
8672
-
8673
- // ../theme-core/src/buttons/generateButtonCss.ts
8674
- var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
8675
-
8676
- // ../theme-core/src/buttons/personalities/types.ts
8677
- import { z as z15 } from "zod";
8678
- function asButtonPersonalityId(value) {
8679
- if (value.length === 0) {
8680
- throw new Error("ButtonPersonalityId must be a non-empty string");
8681
- }
8682
- return value;
8683
- }
8684
- var buttonPersonalityIdSchema = z15.string().min(1).transform((value) => asButtonPersonalityId(value));
8685
- var buttonPersonalitySchema = z15.object({
8686
- id: buttonPersonalityIdSchema,
8687
- name: z15.string().min(1),
8688
- description: z15.string().min(1),
8689
- tags: styleTagsSchema,
8690
- buttonSystem: buttonSystemSchema
8691
- });
8692
- function defineButtonPersonality(input) {
8693
- return {
8694
- id: asButtonPersonalityId(input.id),
8695
- name: input.name,
8696
- description: input.description,
8697
- tags: input.tags,
8698
- buttonSystem: input.buttonSystem
8699
- };
8700
- }
8701
8321
 
8702
- // ../theme-core/src/buttons/personalities/brushed-wash.ts
8703
- var brushedWash = defineButtonPersonality({
8704
- id: "brushed-wash",
8705
- name: "Brushed Wash",
8706
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
8707
- tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
8322
+ // ../theme-core/src/buttons/personalities/ink-stamp.ts
8323
+ var inkStamp = defineButtonPersonality({
8324
+ id: "ink-stamp",
8325
+ name: "Ink Stamp",
8326
+ description: "Hand-stamped block-print buttons with a slight lift on hover.",
8327
+ tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
8708
8328
  buttonSystem: {
8709
8329
  global: {
8710
8330
  cornerStyle: "rounded",
8711
- shadow: "low",
8712
- textTransform: "none",
8713
- fontWeight: 500,
8331
+ shadow: "none",
8332
+ textTransform: "uppercase",
8333
+ fontWeight: 600,
8714
8334
  borderWidth: 1,
8715
8335
  hoverTransform: "none",
8716
- hoverColor: "none"
8336
+ hoverColor: "none",
8337
+ letterSpacing: "loose"
8717
8338
  },
8718
8339
  sizes: {
8719
- sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
8720
- md: { padding: "1rem 2.5rem" },
8721
- lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
8722
- xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
8340
+ sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
8341
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
8342
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
8343
+ xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
8723
8344
  },
8724
8345
  variants: [
8725
8346
  {
@@ -8727,16 +8348,15 @@ var brushedWash = defineButtonPersonality({
8727
8348
  name: "Primary",
8728
8349
  enabled: true,
8729
8350
  priority: 1,
8730
- background: {
8731
- type: "gradient",
8732
- stops: ["primary", "accent"],
8733
- direction: "to-r"
8734
- },
8351
+ background: { type: "solid", colorToken: "primary" },
8735
8352
  textColorToken: "primaryForeground",
8736
- borderRadius: "rounded-lg",
8737
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
8353
+ borderRadius: "rounded-md",
8738
8354
  effects: {
8739
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8355
+ hover: [
8356
+ { effectId: "drop-shadow", options: { intensity: "medium" } },
8357
+ { effectId: "scale-up", options: { scale: "1.02" } }
8358
+ ],
8359
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8740
8360
  }
8741
8361
  },
8742
8362
  {
@@ -8744,16 +8364,12 @@ var brushedWash = defineButtonPersonality({
8744
8364
  name: "Secondary",
8745
8365
  enabled: true,
8746
8366
  priority: 2,
8747
- background: {
8748
- type: "gradient",
8749
- stops: ["secondary", "accent"],
8750
- direction: "to-br"
8751
- },
8752
- textColorToken: "primaryForeground",
8753
- borderRadius: "rounded-lg",
8754
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
8367
+ background: { type: "transparent" },
8368
+ textColorToken: "primary",
8369
+ borderRadius: "rounded-md",
8370
+ border: { widthClass: "border-2", colorToken: "primary" },
8755
8371
  effects: {
8756
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
8372
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8757
8373
  }
8758
8374
  },
8759
8375
  {
@@ -8762,9 +8378,9 @@ var brushedWash = defineButtonPersonality({
8762
8378
  enabled: true,
8763
8379
  priority: 3,
8764
8380
  background: { type: "transparent" },
8765
- textColorToken: "primary",
8766
- borderRadius: "rounded-lg",
8767
- border: { widthClass: "border", colorToken: "primary" },
8381
+ textColorToken: "text",
8382
+ borderRadius: "rounded-md",
8383
+ border: { widthClass: "border-2", colorToken: "border" },
8768
8384
  effects: {
8769
8385
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8770
8386
  }
@@ -8775,216 +8391,43 @@ var brushedWash = defineButtonPersonality({
8775
8391
  enabled: true,
8776
8392
  priority: 3,
8777
8393
  background: { type: "transparent" },
8778
- textColorToken: "text",
8779
- borderRadius: "rounded-lg",
8394
+ textColorToken: "accent",
8395
+ borderRadius: "rounded-none",
8396
+ sizes: {
8397
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
8398
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
8399
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
8400
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
8401
+ },
8780
8402
  effects: {
8781
- hover: [
8782
- { effectId: "background-on-hover", options: { colorToken: "surface" } }
8783
- ]
8403
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
8784
8404
  }
8785
8405
  }
8786
8406
  ]
8787
8407
  }
8788
8408
  });
8789
8409
 
8790
- // ../theme-core/src/buttons/personalities/confident-chip.ts
8791
- var confidentChip = defineButtonPersonality({
8792
- id: "confident-chip",
8793
- name: "Confident Chip",
8794
- description: "Mid-radius solid buttons with a crisp hover.",
8795
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
8410
+ // ../theme-core/src/buttons/personalities/pebble.ts
8411
+ var pebble = defineButtonPersonality({
8412
+ id: "pebble",
8413
+ name: "Pebble",
8414
+ description: "Generous pill buttons with a soft hover lift.",
8415
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
8796
8416
  buttonSystem: {
8797
8417
  global: {
8798
- cornerStyle: "rounded",
8799
- shadow: "medium",
8418
+ cornerStyle: "pill",
8419
+ shadow: "none",
8800
8420
  textTransform: "none",
8801
- fontWeight: 600,
8802
- borderWidth: 1,
8421
+ fontWeight: 500,
8422
+ borderWidth: 2,
8803
8423
  hoverTransform: "none",
8804
8424
  hoverColor: "none"
8805
8425
  },
8806
- variants: [
8807
- {
8808
- id: "primary",
8809
- name: "Primary",
8810
- enabled: true,
8811
- priority: 1,
8812
- background: { type: "solid", colorToken: "primary" },
8813
- textColorToken: "primaryForeground",
8814
- borderRadius: "rounded-md",
8815
- shadow: { elevation: "medium", softness: "soft", position: "bottom" },
8816
- effects: {
8817
- hover: [{ effectId: "darken-background", options: { amount: 60 } }],
8818
- active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
8819
- }
8820
- },
8821
- {
8822
- id: "secondary",
8823
- name: "Secondary",
8824
- enabled: true,
8825
- priority: 2,
8826
- background: { type: "solid", colorToken: "surface" },
8827
- textColorToken: "text",
8828
- borderRadius: "rounded-md",
8829
- border: { widthClass: "border", colorToken: "border" },
8830
- effects: {
8831
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
8832
- }
8833
- },
8834
- {
8835
- id: "outline",
8836
- name: "Outline",
8837
- enabled: true,
8838
- priority: 3,
8839
- background: { type: "transparent" },
8840
- textColorToken: "primary",
8841
- borderRadius: "rounded-md",
8842
- border: { widthClass: "border", colorToken: "primary" },
8843
- effects: {
8844
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8845
- }
8846
- },
8847
- {
8848
- id: "ghost",
8849
- name: "Ghost",
8850
- enabled: true,
8851
- priority: 3,
8852
- background: { type: "transparent" },
8853
- textColorToken: "primary",
8854
- borderRadius: "rounded-md",
8855
- effects: {
8856
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8857
- }
8858
- }
8859
- ]
8860
- }
8861
- });
8862
-
8863
- // ../theme-core/src/buttons/personalities/editorial-link.ts
8864
- var editorialLink = defineButtonPersonality({
8865
- id: "editorial-link",
8866
- name: "Editorial Link",
8867
- description: "Link-style with a growing underline. Refined, typographic.",
8868
- tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
8869
- buttonSystem: {
8870
- global: {
8871
- cornerStyle: "square",
8872
- shadow: "none",
8873
- textTransform: "none",
8874
- fontWeight: 500,
8875
- borderWidth: 1,
8876
- hoverTransform: "none",
8877
- hoverColor: "none"
8878
- },
8879
- variants: [
8880
- {
8881
- id: "primary",
8882
- name: "Primary",
8883
- enabled: true,
8884
- priority: 1,
8885
- background: { type: "transparent" },
8886
- textColorToken: "text",
8887
- borderRadius: "rounded-none",
8888
- shadow: { elevation: "none", softness: null, position: "bottom" },
8889
- sizes: {
8890
- sm: { padding: "0.25rem 0" },
8891
- md: { padding: "0.5rem 0" },
8892
- lg: { padding: "0.625rem 0" },
8893
- xl: { padding: "0.75rem 0" }
8894
- },
8895
- effects: {
8896
- base: [
8897
- { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
8898
- ]
8899
- }
8900
- },
8901
- {
8902
- id: "secondary",
8903
- name: "Secondary",
8904
- enabled: true,
8905
- priority: 2,
8906
- background: { type: "transparent" },
8907
- textColorToken: "mutedText",
8908
- borderRadius: "rounded-none",
8909
- shadow: { elevation: "none", softness: null, position: "bottom" },
8910
- sizes: {
8911
- sm: { padding: "0.25rem 0" },
8912
- md: { padding: "0.5rem 0" },
8913
- lg: { padding: "0.625rem 0" },
8914
- xl: { padding: "0.75rem 0" }
8915
- },
8916
- effects: {
8917
- base: [
8918
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
8919
- ]
8920
- }
8921
- },
8922
- {
8923
- id: "outline",
8924
- name: "Outline",
8925
- enabled: true,
8926
- priority: 3,
8927
- background: { type: "transparent" },
8928
- textColorToken: "accent",
8929
- borderRadius: "rounded-none",
8930
- shadow: { elevation: "none", softness: null, position: "bottom" },
8931
- sizes: {
8932
- sm: { padding: "0.25rem 0" },
8933
- md: { padding: "0.5rem 0" },
8934
- lg: { padding: "0.625rem 0" },
8935
- xl: { padding: "0.75rem 0" }
8936
- },
8937
- effects: {
8938
- base: [
8939
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
8940
- ]
8941
- }
8942
- },
8943
- {
8944
- id: "ghost",
8945
- name: "Ghost",
8946
- enabled: true,
8947
- priority: 3,
8948
- background: { type: "transparent" },
8949
- textColorToken: "mutedText",
8950
- borderRadius: "rounded-none",
8951
- shadow: { elevation: "none", softness: null, position: "bottom" },
8952
- sizes: {
8953
- sm: { padding: "0.25rem 0" },
8954
- md: { padding: "0.5rem 0" },
8955
- lg: { padding: "0.625rem 0" },
8956
- xl: { padding: "0.75rem 0" }
8957
- },
8958
- effects: {
8959
- hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
8960
- }
8961
- }
8962
- ]
8963
- }
8964
- });
8965
-
8966
- // ../theme-core/src/buttons/personalities/ink-stamp.ts
8967
- var inkStamp = defineButtonPersonality({
8968
- id: "ink-stamp",
8969
- name: "Ink Stamp",
8970
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
8971
- tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
8972
- buttonSystem: {
8973
- global: {
8974
- cornerStyle: "rounded",
8975
- shadow: "none",
8976
- textTransform: "uppercase",
8977
- fontWeight: 600,
8978
- borderWidth: 1,
8979
- hoverTransform: "none",
8980
- hoverColor: "none",
8981
- letterSpacing: "loose"
8982
- },
8983
8426
  sizes: {
8984
- sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
8985
- md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
8986
- lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
8987
- xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
8427
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
8428
+ md: { padding: "0.875rem 2.25rem" },
8429
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
8430
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
8988
8431
  },
8989
8432
  variants: [
8990
8433
  {
@@ -8994,13 +8437,12 @@ var inkStamp = defineButtonPersonality({
8994
8437
  priority: 1,
8995
8438
  background: { type: "solid", colorToken: "primary" },
8996
8439
  textColorToken: "primaryForeground",
8997
- borderRadius: "rounded-md",
8440
+ borderRadius: "rounded-full",
8998
8441
  effects: {
8999
8442
  hover: [
9000
- { effectId: "drop-shadow", options: { intensity: "medium" } },
9001
- { effectId: "scale-up", options: { scale: "1.02" } }
9002
- ],
9003
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8443
+ { effectId: "scale-up", options: { scale: "1.03" } },
8444
+ { effectId: "drop-shadow", options: { intensity: "medium" } }
8445
+ ]
9004
8446
  }
9005
8447
  },
9006
8448
  {
@@ -9010,10 +8452,10 @@ var inkStamp = defineButtonPersonality({
9010
8452
  priority: 2,
9011
8453
  background: { type: "transparent" },
9012
8454
  textColorToken: "primary",
9013
- borderRadius: "rounded-md",
9014
- border: { widthClass: "border-2", colorToken: "primary" },
8455
+ borderRadius: "rounded-full",
8456
+ border: { widthClass: "border-2", colorToken: "accent" },
9015
8457
  effects: {
9016
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8458
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
9017
8459
  }
9018
8460
  },
9019
8461
  {
@@ -9023,8 +8465,8 @@ var inkStamp = defineButtonPersonality({
9023
8465
  priority: 3,
9024
8466
  background: { type: "transparent" },
9025
8467
  textColorToken: "text",
9026
- borderRadius: "rounded-md",
9027
- border: { widthClass: "border-2", colorToken: "border" },
8468
+ borderRadius: "rounded-full",
8469
+ border: { widthClass: "border", colorToken: "border" },
9028
8470
  effects: {
9029
8471
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9030
8472
  }
@@ -9035,44 +8477,38 @@ var inkStamp = defineButtonPersonality({
9035
8477
  enabled: true,
9036
8478
  priority: 3,
9037
8479
  background: { type: "transparent" },
9038
- textColorToken: "accent",
9039
- borderRadius: "rounded-none",
8480
+ textColorToken: "primary",
8481
+ borderRadius: "rounded-full",
9040
8482
  sizes: {
9041
- sm: { padding: "0.375rem 0", fontSize: "text-xs" },
9042
- md: { padding: "0.5rem 0", fontSize: "text-sm" },
9043
- lg: { padding: "0.625rem 0", fontSize: "text-base" },
9044
- xl: { padding: "0.75rem 0", fontSize: "text-lg" }
8483
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
8484
+ md: { padding: "0.5rem 1rem" },
8485
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
8486
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
9045
8487
  },
9046
8488
  effects: {
9047
- base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
8489
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
9048
8490
  }
9049
8491
  }
9050
8492
  ]
9051
8493
  }
9052
8494
  });
9053
8495
 
9054
- // ../theme-core/src/buttons/personalities/pebble.ts
9055
- var pebble = defineButtonPersonality({
9056
- id: "pebble",
9057
- name: "Pebble",
9058
- description: "Generous pill buttons with a soft hover lift.",
9059
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
8496
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
8497
+ var softPill = defineButtonPersonality({
8498
+ id: "soft-pill",
8499
+ name: "Soft Pill",
8500
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
8501
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
9060
8502
  buttonSystem: {
9061
8503
  global: {
9062
8504
  cornerStyle: "pill",
9063
- shadow: "none",
8505
+ shadow: "low",
9064
8506
  textTransform: "none",
9065
8507
  fontWeight: 500,
9066
8508
  borderWidth: 2,
9067
- hoverTransform: "none",
8509
+ hoverTransform: "lift",
9068
8510
  hoverColor: "none"
9069
8511
  },
9070
- sizes: {
9071
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
9072
- md: { padding: "0.875rem 2.25rem" },
9073
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
9074
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
9075
- },
9076
8512
  variants: [
9077
8513
  {
9078
8514
  id: "primary",
@@ -9082,11 +8518,10 @@ var pebble = defineButtonPersonality({
9082
8518
  background: { type: "solid", colorToken: "primary" },
9083
8519
  textColorToken: "primaryForeground",
9084
8520
  borderRadius: "rounded-full",
8521
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
9085
8522
  effects: {
9086
- hover: [
9087
- { effectId: "scale-up", options: { scale: "1.03" } },
9088
- { effectId: "drop-shadow", options: { intensity: "medium" } }
9089
- ]
8523
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
8524
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
9090
8525
  }
9091
8526
  },
9092
8527
  {
@@ -9097,9 +8532,9 @@ var pebble = defineButtonPersonality({
9097
8532
  background: { type: "transparent" },
9098
8533
  textColorToken: "primary",
9099
8534
  borderRadius: "rounded-full",
9100
- border: { widthClass: "border-2", colorToken: "accent" },
8535
+ border: { widthClass: "border-2", colorToken: "primary" },
9101
8536
  effects: {
9102
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
8537
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9103
8538
  }
9104
8539
  },
9105
8540
  {
@@ -9121,86 +8556,7 @@ var pebble = defineButtonPersonality({
9121
8556
  enabled: true,
9122
8557
  priority: 3,
9123
8558
  background: { type: "transparent" },
9124
- textColorToken: "primary",
9125
- borderRadius: "rounded-full",
9126
- sizes: {
9127
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
9128
- md: { padding: "0.5rem 1rem" },
9129
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
9130
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
9131
- },
9132
- effects: {
9133
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
9134
- }
9135
- }
9136
- ]
9137
- }
9138
- });
9139
-
9140
- // ../theme-core/src/buttons/personalities/soft-pill.ts
9141
- var softPill = defineButtonPersonality({
9142
- id: "soft-pill",
9143
- name: "Soft Pill",
9144
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
9145
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
9146
- buttonSystem: {
9147
- global: {
9148
- cornerStyle: "pill",
9149
- shadow: "low",
9150
- textTransform: "none",
9151
- fontWeight: 500,
9152
- borderWidth: 2,
9153
- hoverTransform: "lift",
9154
- hoverColor: "none"
9155
- },
9156
- variants: [
9157
- {
9158
- id: "primary",
9159
- name: "Primary",
9160
- enabled: true,
9161
- priority: 1,
9162
- background: { type: "solid", colorToken: "primary" },
9163
- textColorToken: "primaryForeground",
9164
- borderRadius: "rounded-full",
9165
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
9166
- effects: {
9167
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
9168
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
9169
- }
9170
- },
9171
- {
9172
- id: "secondary",
9173
- name: "Secondary",
9174
- enabled: true,
9175
- priority: 2,
9176
- background: { type: "transparent" },
9177
- textColorToken: "primary",
9178
- borderRadius: "rounded-full",
9179
- border: { widthClass: "border-2", colorToken: "primary" },
9180
- effects: {
9181
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9182
- }
9183
- },
9184
- {
9185
- id: "outline",
9186
- name: "Outline",
9187
- enabled: true,
9188
- priority: 3,
9189
- background: { type: "transparent" },
9190
- textColorToken: "text",
9191
- borderRadius: "rounded-full",
9192
- border: { widthClass: "border", colorToken: "border" },
9193
- effects: {
9194
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
9195
- }
9196
- },
9197
- {
9198
- id: "ghost",
9199
- name: "Ghost",
9200
- enabled: true,
9201
- priority: 3,
9202
- background: { type: "transparent" },
9203
- textColorToken: "text",
8559
+ textColorToken: "text",
9204
8560
  borderRadius: "rounded-full",
9205
8561
  effects: {
9206
8562
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
@@ -9223,49 +8579,101 @@ var personalitiesById = new Map(
9223
8579
  buttonPersonalities.map((p) => [p.id, p])
9224
8580
  );
9225
8581
 
8582
+ // ../theme-core/src/palette/variants/types.ts
8583
+ import { z as z23 } from "zod";
8584
+
8585
+ // ../theme-core/src/schema.ts
8586
+ import { z as z22 } from "zod";
8587
+
8588
+ // ../theme-core/src/lib/media.ts
8589
+ import z12 from "zod";
8590
+ var hotspotSchema = z12.object({
8591
+ x: z12.number().min(0).max(1),
8592
+ y: z12.number().min(0).max(1),
8593
+ radius: z12.number().optional()
8594
+ });
8595
+ var rotationSchema = z12.union([z12.literal(0), z12.literal(90), z12.literal(180), z12.literal(270)]);
8596
+ var rectSchema = z12.tuple([z12.number(), z12.number(), z12.number(), z12.number()]);
8597
+ var aspectCropSchema = z12.object({
8598
+ aspect: z12.preprocess((value) => value == null ? void 0 : value, z12.string().optional()),
8599
+ rect: z12.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
8600
+ hotspot: z12.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
8601
+ rotation: z12.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
8602
+ });
8603
+ var transformSchema = z12.object({
8604
+ aspectCrops: z12.preprocess((value) => {
8605
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
8606
+ return void 0;
8607
+ }
8608
+ return value;
8609
+ }, z12.record(z12.string(), aspectCropSchema.catch({}))).optional(),
8610
+ rect: rectSchema.optional(),
8611
+ hotspot: hotspotSchema.optional(),
8612
+ rotation: rotationSchema.optional()
8613
+ });
8614
+ var mediaSchema = z12.object({
8615
+ type: z12.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
8616
+ purpose: z12.string().optional(),
8617
+ placeholder: z12.boolean().default(true).optional(),
8618
+ assetId: z12.string().optional(),
8619
+ identifier: z12.string().optional(),
8620
+ src: z12.string().optional(),
8621
+ alt: z12.string().optional(),
8622
+ filename: z12.string().optional(),
8623
+ mimeType: z12.string().optional(),
8624
+ width: z12.number().optional(),
8625
+ height: z12.number().optional(),
8626
+ storageBucket: z12.string().optional(),
8627
+ storagePath: z12.string().optional(),
8628
+ transform: transformSchema.optional()
8629
+ });
8630
+
8631
+ // ../theme-core/src/buttons/generateButtonCss.ts
8632
+ var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
8633
+
9226
8634
  // ../theme-core/src/cards/types.ts
9227
- import { z as z16 } from "zod";
9228
- var cardSpacingSchema = z16.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
9229
- var gradientDirectionSchema2 = z16.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
9230
- var cardBackgroundSchema = z16.discriminatedUnion("type", [
9231
- z16.object({ type: z16.literal("solid"), colorToken: z16.string() }),
9232
- z16.object({
9233
- type: z16.literal("gradient"),
9234
- fromToken: z16.string(),
9235
- toToken: z16.string(),
8635
+ import { z as z13 } from "zod";
8636
+ var cardSpacingSchema = z13.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
8637
+ var gradientDirectionSchema2 = z13.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
8638
+ var cardBackgroundSchema = z13.discriminatedUnion("type", [
8639
+ z13.object({ type: z13.literal("solid"), colorToken: z13.string() }),
8640
+ z13.object({
8641
+ type: z13.literal("gradient"),
8642
+ fromToken: z13.string(),
8643
+ toToken: z13.string(),
9236
8644
  direction: gradientDirectionSchema2
9237
8645
  }),
9238
- z16.object({ type: z16.literal("transparent") })
8646
+ z13.object({ type: z13.literal("transparent") })
9239
8647
  ]);
9240
- var cardBorderSchema = z16.object({
9241
- widthClass: z16.string(),
9242
- colorToken: z16.string()
9243
- });
9244
- var cardVariantSchema = z16.object({
9245
- id: z16.string(),
9246
- name: z16.string().min(1).max(20),
9247
- enabled: z16.boolean(),
9248
- priority: z16.union([z16.literal(1), z16.literal(2), z16.literal(3)]),
8648
+ var cardBorderSchema = z13.object({
8649
+ widthClass: z13.string(),
8650
+ colorToken: z13.string()
8651
+ });
8652
+ var cardVariantSchema = z13.object({
8653
+ id: z13.string(),
8654
+ name: z13.string().min(1).max(20),
8655
+ enabled: z13.boolean(),
8656
+ priority: z13.union([z13.literal(1), z13.literal(2), z13.literal(3)]),
9249
8657
  // Appearance (token-based)
9250
8658
  background: cardBackgroundSchema,
9251
8659
  spacing: cardSpacingSchema,
9252
8660
  // Optional overrides (uses theme defaults if not specified)
9253
- shadow: z16.object({
9254
- elevation: z16.enum(["none", "low", "medium", "high"]),
9255
- softness: z16.enum(["crisp", "soft", "hard"]).nullable(),
9256
- position: z16.enum(["bottom", "bottom-right"]).default("bottom")
8661
+ shadow: z13.object({
8662
+ elevation: z13.enum(["none", "low", "medium", "high"]),
8663
+ softness: z13.enum(["crisp", "soft", "hard"]).nullable(),
8664
+ position: z13.enum(["bottom", "bottom-right"]).default("bottom")
9257
8665
  }).optional(),
9258
- corners: z16.enum(["square", "soft", "rounded", "pill"]).optional(),
8666
+ corners: z13.enum(["square", "soft", "rounded", "pill"]).optional(),
9259
8667
  // Border (optional)
9260
8668
  border: cardBorderSchema.optional()
9261
8669
  });
9262
- var cardSystemSchema = z16.object({
9263
- variants: z16.array(cardVariantSchema).min(1).max(3)
8670
+ var cardSystemSchema = z13.object({
8671
+ variants: z13.array(cardVariantSchema).min(1).max(3)
9264
8672
  });
9265
8673
 
9266
8674
  // ../theme-core/src/accordions/types.ts
9267
- import { z as z17 } from "zod";
9268
- var accordionIconSchema = z17.enum([
8675
+ import { z as z14 } from "zod";
8676
+ var accordionIconSchema = z14.enum([
9269
8677
  "plus-minus",
9270
8678
  // + becomes - (swap or rotate 90°)
9271
8679
  "chevron",
@@ -9277,180 +8685,180 @@ var accordionIconSchema = z17.enum([
9277
8685
  "circle-plus-minus"
9278
8686
  // ⊕ becomes ⊖ (swap with fade)
9279
8687
  ]);
9280
- var accordionSystemSchema = z17.object({
8688
+ var accordionSystemSchema = z14.object({
9281
8689
  // Visual styling (solid color only - gradients can be added later if needed)
9282
- background: z17.object({
9283
- type: z17.literal("solid"),
9284
- colorToken: z17.string()
8690
+ background: z14.object({
8691
+ type: z14.literal("solid"),
8692
+ colorToken: z14.string()
9285
8693
  }),
9286
8694
  // Spacing (padding inside items)
9287
- spacing: z17.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
8695
+ spacing: z14.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
9288
8696
  // Border radius (null = inherit from theme.corners)
9289
- corners: z17.enum(["square", "soft", "rounded", "pill"]).nullable(),
8697
+ corners: z14.enum(["square", "soft", "rounded", "pill"]).nullable(),
9290
8698
  // Border styling (null = inherit from theme.border)
9291
- border: z17.object({
9292
- widthClass: z17.string(),
8699
+ border: z14.object({
8700
+ widthClass: z14.string(),
9293
8701
  // e.g., 'border', 'border-2', 'border-0'
9294
- colorToken: z17.string()
8702
+ colorToken: z14.string()
9295
8703
  }).nullable(),
9296
8704
  // Shadow (null = inherit from theme.shadow)
9297
- shadow: z17.object({
9298
- elevation: z17.enum(["none", "low", "medium", "high"]),
9299
- softness: z17.enum(["soft", "crisp", "hard"]).nullable(),
9300
- position: z17.enum(["bottom", "bottom-right"])
8705
+ shadow: z14.object({
8706
+ elevation: z14.enum(["none", "low", "medium", "high"]),
8707
+ softness: z14.enum(["soft", "crisp", "hard"]).nullable(),
8708
+ position: z14.enum(["bottom", "bottom-right"])
9301
8709
  }).nullable(),
9302
8710
  // Icon style and animation
9303
- icon: z17.object({
8711
+ icon: z14.object({
9304
8712
  style: accordionIconSchema,
9305
- position: z17.enum(["left", "right"]),
9306
- size: z17.enum(["sm", "md", "lg"])
8713
+ position: z14.enum(["left", "right"]),
8714
+ size: z14.enum(["sm", "md", "lg"])
9307
8715
  }),
9308
8716
  // Trigger (question) styling
9309
- trigger: z17.object({
9310
- textColorToken: z17.string(),
9311
- fontWeight: z17.enum(["regular", "medium", "semibold", "bold"]).nullable()
8717
+ trigger: z14.object({
8718
+ textColorToken: z14.string(),
8719
+ fontWeight: z14.enum(["regular", "medium", "semibold", "bold"]).nullable()
9312
8720
  // null = inherit from theme
9313
8721
  }),
9314
8722
  // Hover state styling
9315
- hover: z17.object({
9316
- backgroundColorToken: z17.string().optional(),
9317
- textColorToken: z17.string().optional(),
9318
- borderColorToken: z17.string().optional()
8723
+ hover: z14.object({
8724
+ backgroundColorToken: z14.string().optional(),
8725
+ textColorToken: z14.string().optional(),
8726
+ borderColorToken: z14.string().optional()
9319
8727
  }),
9320
8728
  // Content (answer) styling
9321
- content: z17.object({
9322
- textColorToken: z17.string()
8729
+ content: z14.object({
8730
+ textColorToken: z14.string()
9323
8731
  })
9324
8732
  });
9325
8733
 
9326
8734
  // ../theme-core/src/inputs/types.ts
9327
- import { z as z18 } from "zod";
9328
- var inputSystemSchema = z18.object({
8735
+ import { z as z15 } from "zod";
8736
+ var inputSystemSchema = z15.object({
9329
8737
  // Base styling (applied to all inputs)
9330
- base: z18.object({
9331
- background: z18.union([
9332
- z18.object({
9333
- type: z18.literal("solid"),
9334
- colorToken: z18.string()
8738
+ base: z15.object({
8739
+ background: z15.union([
8740
+ z15.object({
8741
+ type: z15.literal("solid"),
8742
+ colorToken: z15.string()
9335
8743
  }),
9336
- z18.object({
9337
- type: z18.literal("transparent")
8744
+ z15.object({
8745
+ type: z15.literal("transparent")
9338
8746
  })
9339
8747
  ]),
9340
- textColorToken: z18.string(),
9341
- border: z18.object({
9342
- widthClass: z18.string(),
8748
+ textColorToken: z15.string(),
8749
+ border: z15.object({
8750
+ widthClass: z15.string(),
9343
8751
  // e.g., 'border', 'border-2'
9344
- colorToken: z18.string(),
9345
- style: z18.enum(["all", "underline"]).optional()
8752
+ colorToken: z15.string(),
8753
+ style: z15.enum(["all", "underline"]).optional()
9346
8754
  }),
9347
- corners: z18.enum(["square", "soft", "rounded", "pill"]).nullable(),
8755
+ corners: z15.enum(["square", "soft", "rounded", "pill"]).nullable(),
9348
8756
  // null = inherit from theme.corners
9349
- shadow: z18.object({
9350
- elevation: z18.enum(["none", "low", "medium"]),
9351
- softness: z18.enum(["soft", "crisp", "hard"]).nullable()
8757
+ shadow: z15.object({
8758
+ elevation: z15.enum(["none", "low", "medium"]),
8759
+ softness: z15.enum(["soft", "crisp", "hard"]).nullable()
9352
8760
  }).nullable(),
9353
- spacing: z18.enum(["compact", "cozy", "medium", "comfortable"]),
8761
+ spacing: z15.enum(["compact", "cozy", "medium", "comfortable"]),
9354
8762
  // padding inside inputs
9355
- fontSize: z18.enum(["sm", "base", "lg"])
8763
+ fontSize: z15.enum(["sm", "base", "lg"])
9356
8764
  }),
9357
8765
  // Label styling
9358
- label: z18.object({
9359
- textColorToken: z18.string(),
9360
- fontWeight: z18.enum(["regular", "medium", "semibold", "bold", "black"]),
9361
- fontSize: z18.enum(["2xs", "xs", "sm", "base"]),
9362
- textTransform: z18.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
9363
- letterSpacing: z18.enum(["normal", "wide", "wider", "widest"]).optional(),
9364
- opacity: z18.number().min(0.2).max(1).optional()
8766
+ label: z15.object({
8767
+ textColorToken: z15.string(),
8768
+ fontWeight: z15.enum(["regular", "medium", "semibold", "bold", "black"]),
8769
+ fontSize: z15.enum(["2xs", "xs", "sm", "base"]),
8770
+ textTransform: z15.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
8771
+ letterSpacing: z15.enum(["normal", "wide", "wider", "widest"]).optional(),
8772
+ opacity: z15.number().min(0.2).max(1).optional()
9365
8773
  }),
9366
8774
  // Focus state
9367
- focus: z18.object({
9368
- ringColorToken: z18.string(),
9369
- ringWidth: z18.enum(["0", "1", "2", "3"]),
9370
- borderColorToken: z18.string().optional()
8775
+ focus: z15.object({
8776
+ ringColorToken: z15.string(),
8777
+ ringWidth: z15.enum(["0", "1", "2", "3"]),
8778
+ borderColorToken: z15.string().optional()
9371
8779
  // Change border color on focus
9372
8780
  }),
9373
8781
  // Error state (for validation feedback)
9374
- error: z18.object({
9375
- borderColorToken: z18.string(),
9376
- textColorToken: z18.string()
8782
+ error: z15.object({
8783
+ borderColorToken: z15.string(),
8784
+ textColorToken: z15.string()
9377
8785
  }),
9378
8786
  // Disabled state
9379
- disabled: z18.object({
9380
- backgroundColorToken: z18.string(),
9381
- textColorToken: z18.string(),
9382
- opacity: z18.number().min(0.3).max(0.7)
8787
+ disabled: z15.object({
8788
+ backgroundColorToken: z15.string(),
8789
+ textColorToken: z15.string(),
8790
+ opacity: z15.number().min(0.3).max(0.7)
9383
8791
  })
9384
8792
  });
9385
8793
 
9386
8794
  // ../theme-core/src/gradients/types.ts
9387
- import { z as z19 } from "zod";
9388
- var gradientStopSchema = z19.object({
9389
- color: z19.string(),
8795
+ import { z as z16 } from "zod";
8796
+ var gradientStopSchema = z16.object({
8797
+ color: z16.string(),
9390
8798
  // Theme color token name (e.g., 'primary-500')
9391
- position: z19.number().min(0).max(100)
8799
+ position: z16.number().min(0).max(100)
9392
8800
  // Percentage 0-100
9393
8801
  });
9394
- var gradientConfigSchema = z19.object({
9395
- type: z19.enum(["linear", "radial"]),
9396
- angle: z19.number().min(0).max(360).optional(),
8802
+ var gradientConfigSchema = z16.object({
8803
+ type: z16.enum(["linear", "radial"]),
8804
+ angle: z16.number().min(0).max(360).optional(),
9397
8805
  // For linear gradients (degrees)
9398
- position: z19.string().optional(),
8806
+ position: z16.string().optional(),
9399
8807
  // For radial gradients ('center', 'top left', etc.)
9400
- stops: z19.array(gradientStopSchema).min(2)
8808
+ stops: z16.array(gradientStopSchema).min(2)
9401
8809
  });
9402
8810
 
9403
8811
  // ../theme-core/src/navigation/types.ts
9404
- import { z as z21 } from "zod";
8812
+ import { z as z18 } from "zod";
9405
8813
 
9406
8814
  // ../theme-core/src/interactive/baseSchema.ts
9407
- import { z as z20 } from "zod";
9408
- var interactiveTypographySchema = z20.object({
8815
+ import { z as z17 } from "zod";
8816
+ var interactiveTypographySchema = z17.object({
9409
8817
  /** Font family source */
9410
- typography: z20.enum(["body", "heading"]).default("body"),
8818
+ typography: z17.enum(["body", "heading"]).default("body"),
9411
8819
  /** Font weight */
9412
- fontWeight: z20.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
8820
+ fontWeight: z17.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
9413
8821
  /** Text transform */
9414
- textTransform: z20.enum(["none", "uppercase", "capitalize"]).default("none"),
8822
+ textTransform: z17.enum(["none", "uppercase", "capitalize"]).default("none"),
9415
8823
  /** Italic style */
9416
- italic: z20.boolean().default(false)
8824
+ italic: z17.boolean().default(false)
9417
8825
  });
9418
- var effectApplicationSchema2 = z20.object({
8826
+ var effectApplicationSchema2 = z17.object({
9419
8827
  /** Effect preset ID */
9420
- effectId: z20.string(),
8828
+ effectId: z17.string(),
9421
8829
  /** User-provided customization options */
9422
- options: z20.record(z20.string(), z20.any()).optional()
8830
+ options: z17.record(z17.string(), z17.any()).optional()
9423
8831
  });
9424
- var effectCompositionSchema = z20.object({
8832
+ var effectCompositionSchema = z17.object({
9425
8833
  /** Effects always applied */
9426
- base: z20.array(effectApplicationSchema2).optional(),
8834
+ base: z17.array(effectApplicationSchema2).optional(),
9427
8835
  /** Effects applied on hover */
9428
- hover: z20.array(effectApplicationSchema2).optional(),
8836
+ hover: z17.array(effectApplicationSchema2).optional(),
9429
8837
  /** Effects applied on active/pressed */
9430
- active: z20.array(effectApplicationSchema2).optional(),
8838
+ active: z17.array(effectApplicationSchema2).optional(),
9431
8839
  /** Effects applied on focus */
9432
- focus: z20.array(effectApplicationSchema2).optional()
8840
+ focus: z17.array(effectApplicationSchema2).optional()
9433
8841
  });
9434
8842
 
9435
8843
  // ../theme-core/src/navigation/types.ts
9436
- var navLinkPaddingSchema = z21.enum(["none", "compact", "default"]);
9437
- var navLinkPaddingXSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9438
- var navLinkBorderRadiusSchema = z21.enum(["none", "sm", "md", "full"]);
9439
- var navLinkTextSizeSchema = z21.enum(["xs", "sm", "base", "lg"]);
9440
- var navLinkLetterSpacingSchema = z21.enum(["normal", "wide", "wider", "widest"]);
9441
- var navLinkStyleSchema = z21.object({
8844
+ var navLinkPaddingSchema = z18.enum(["none", "compact", "default"]);
8845
+ var navLinkPaddingXSchema = z18.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
8846
+ var navLinkBorderRadiusSchema = z18.enum(["none", "sm", "md", "full"]);
8847
+ var navLinkTextSizeSchema = z18.enum(["xs", "sm", "base", "lg"]);
8848
+ var navLinkLetterSpacingSchema = z18.enum(["normal", "wide", "wider", "widest"]);
8849
+ var navLinkStyleSchema = z18.object({
9442
8850
  /** Display name for the style */
9443
- name: z21.string().min(1).max(30).optional(),
8851
+ name: z18.string().min(1).max(30).optional(),
9444
8852
  /** Typography settings (inherited from interactive base) */
9445
8853
  ...interactiveTypographySchema.shape,
9446
8854
  /** Text color token */
9447
- colorToken: z21.string().default("text"),
8855
+ colorToken: z18.string().default("text"),
9448
8856
  /** Optional text size override */
9449
8857
  textSize: navLinkTextSizeSchema.optional(),
9450
8858
  /** Optional letter spacing override */
9451
8859
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9452
8860
  /** Hover/active color token (for color-change effects) */
9453
- hoverColorToken: z21.string().nullable().optional(),
8861
+ hoverColorToken: z18.string().nullable().optional(),
9454
8862
  /** Padding preset */
9455
8863
  padding: navLinkPaddingSchema.default("compact"),
9456
8864
  /** Horizontal padding override (overrides horizontal component of padding preset) */
@@ -9462,7 +8870,7 @@ var navLinkStyleSchema = z21.object({
9462
8870
  });
9463
8871
 
9464
8872
  // ../theme-core/src/customCss/validation.ts
9465
- import { z as z22 } from "zod";
8873
+ import { z as z19 } from "zod";
9466
8874
  var FORBIDDEN_SELECTORS = [":root", "html", "body"];
9467
8875
  var UNIVERSAL_SELECTOR = "*";
9468
8876
  var REMOTE_URL_PATTERN = /url\s*\(\s*['"]?(https?:|\/\/)/i;
@@ -9504,7 +8912,7 @@ function containsForbiddenSelector(selector) {
9504
8912
  }
9505
8913
  return false;
9506
8914
  }
9507
- var selectorSchema = z22.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
8915
+ var selectorSchema = z19.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
9508
8916
  (s) => !containsForbiddenSelector(s),
9509
8917
  { message: "Global selectors (:root, html, body, *) are not allowed" }
9510
8918
  );
@@ -9514,38 +8922,38 @@ function containsRemoteUrl(value) {
9514
8922
  function containsJavascriptUrl(value) {
9515
8923
  return JAVASCRIPT_URL_PATTERN.test(value);
9516
8924
  }
9517
- var declarationValueSchema = z22.string().max(500, "Declaration value too long (max 500 characters)").refine(
8925
+ var declarationValueSchema = z19.string().max(500, "Declaration value too long (max 500 characters)").refine(
9518
8926
  (v) => !containsRemoteUrl(v),
9519
8927
  { message: "Remote url() references are not allowed. Use local paths, data URIs, or fragment IDs." }
9520
8928
  ).refine(
9521
8929
  (v) => !containsJavascriptUrl(v),
9522
8930
  { message: "javascript: URLs are not allowed" }
9523
8931
  );
9524
- var declarationsSchema = z22.record(
9525
- z22.string().min(1).max(100),
8932
+ var declarationsSchema = z19.record(
8933
+ z19.string().min(1).max(100),
9526
8934
  // property name
9527
8935
  declarationValueSchema
9528
8936
  // property value
9529
8937
  );
9530
- var customCssRuleSchema = z22.object({
9531
- id: z22.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
8938
+ var customCssRuleSchema = z19.object({
8939
+ id: z19.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
9532
8940
  selector: selectorSchema,
9533
8941
  declarations: declarationsSchema
9534
8942
  });
9535
8943
  var blockCustomCssRuleSchema = customCssRuleSchema.extend({
9536
- blockKind: z22.string().min(1, "Block kind is required").max(50, "Block kind too long")
8944
+ blockKind: z19.string().min(1, "Block kind is required").max(50, "Block kind too long")
9537
8945
  });
9538
- var customCssRulesSchema = z22.array(customCssRuleSchema).optional();
9539
- var blockCustomCssRulesSchema = z22.array(blockCustomCssRuleSchema).optional();
8946
+ var customCssRulesSchema = z19.array(customCssRuleSchema).optional();
8947
+ var blockCustomCssRulesSchema = z19.array(blockCustomCssRuleSchema).optional();
9540
8948
 
9541
8949
  // ../theme-core/src/customCss/atRuleValidation.ts
9542
- import { z as z23 } from "zod";
8950
+ import { z as z20 } from "zod";
9543
8951
  var KEYFRAME_OFFSET_PATTERN = /^(from|to|\d{1,3}%)$/i;
9544
8952
  var ANIMATION_NAME_PATTERN = /^[a-zA-Z_-][a-zA-Z0-9_-]*$/;
9545
8953
  var BLOCKED_AT_RULES = ["@import", "@charset"];
9546
8954
  var BLOCKED_AT_RULE_PATTERN = /@(?:import|charset)\b/i;
9547
- var ruleIdSchema = z23.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
9548
- var nestedRuleSchema = z23.object({
8955
+ var ruleIdSchema = z20.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
8956
+ var nestedRuleSchema = z20.object({
9549
8957
  selector: selectorSchema,
9550
8958
  declarations: declarationsSchema
9551
8959
  });
@@ -9557,146 +8965,146 @@ function isValidKeyframeOffset(offset) {
9557
8965
  const value = parseInt(match[1], 10);
9558
8966
  return value >= 0 && value <= 100;
9559
8967
  }
9560
- var keyframeOffsetSchema = z23.string().transform((offset) => offset.trim()).refine(
8968
+ var keyframeOffsetSchema = z20.string().transform((offset) => offset.trim()).refine(
9561
8969
  (offset) => KEYFRAME_OFFSET_PATTERN.test(offset),
9562
8970
  { message: 'Invalid keyframe offset. Use percentages (0%, 50%, 100%) or "from"/"to"' }
9563
8971
  ).refine(
9564
8972
  isValidKeyframeOffset,
9565
8973
  { message: "Keyframe offset must be between 0% and 100%" }
9566
8974
  );
9567
- var animationNameSchema = z23.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
8975
+ var animationNameSchema = z20.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
9568
8976
  (name) => ANIMATION_NAME_PATTERN.test(name),
9569
8977
  { message: "Invalid animation name. Use letters, numbers, dashes, underscores (start with letter, dash, or underscore)" }
9570
8978
  );
9571
- var keyframeSchema = z23.object({
8979
+ var keyframeSchema = z20.object({
9572
8980
  offset: keyframeOffsetSchema,
9573
8981
  declarations: declarationsSchema
9574
8982
  });
9575
- var keyframesAtRuleSchema = z23.object({
8983
+ var keyframesAtRuleSchema = z20.object({
9576
8984
  id: ruleIdSchema,
9577
- type: z23.literal("keyframes"),
8985
+ type: z20.literal("keyframes"),
9578
8986
  name: animationNameSchema,
9579
- frames: z23.array(keyframeSchema).min(1, "At least one keyframe is required")
8987
+ frames: z20.array(keyframeSchema).min(1, "At least one keyframe is required")
9580
8988
  });
9581
- var fontFaceDeclarationsSchema = z23.record(z23.string().min(1).max(100), declarationValueSchema).refine(
8989
+ var fontFaceDeclarationsSchema = z20.record(z20.string().min(1).max(100), declarationValueSchema).refine(
9582
8990
  (decls) => "fontFamily" in decls || "font-family" in decls,
9583
8991
  { message: "font-family is required in @font-face" }
9584
8992
  );
9585
- var fontFaceAtRuleSchema = z23.object({
8993
+ var fontFaceAtRuleSchema = z20.object({
9586
8994
  id: ruleIdSchema,
9587
- type: z23.literal("font-face"),
8995
+ type: z20.literal("font-face"),
9588
8996
  declarations: fontFaceDeclarationsSchema
9589
8997
  });
9590
- var mediaQuerySchema = z23.string().min(1, "Media query is required").max(200, "Media query too long");
9591
- var mediaAtRuleSchema = z23.object({
8998
+ var mediaQuerySchema = z20.string().min(1, "Media query is required").max(200, "Media query too long");
8999
+ var mediaAtRuleSchema = z20.object({
9592
9000
  id: ruleIdSchema,
9593
- type: z23.literal("media"),
9001
+ type: z20.literal("media"),
9594
9002
  query: mediaQuerySchema,
9595
- rules: z23.array(nestedRuleSchema).min(1, "At least one rule is required")
9003
+ rules: z20.array(nestedRuleSchema).min(1, "At least one rule is required")
9596
9004
  });
9597
- var supportsConditionSchema = z23.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
9598
- var supportsAtRuleSchema = z23.object({
9005
+ var supportsConditionSchema = z20.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
9006
+ var supportsAtRuleSchema = z20.object({
9599
9007
  id: ruleIdSchema,
9600
- type: z23.literal("supports"),
9008
+ type: z20.literal("supports"),
9601
9009
  condition: supportsConditionSchema,
9602
- rules: z23.array(nestedRuleSchema).min(1, "At least one rule is required")
9010
+ rules: z20.array(nestedRuleSchema).min(1, "At least one rule is required")
9603
9011
  });
9604
9012
  function containsBlockedAtRule(css) {
9605
9013
  return BLOCKED_AT_RULE_PATTERN.test(css);
9606
9014
  }
9607
- var rawCssSchema = z23.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
9015
+ var rawCssSchema = z20.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
9608
9016
  (css) => css.trim().startsWith("@"),
9609
9017
  { message: "Raw at-rule must start with @" }
9610
9018
  ).refine(
9611
9019
  (css) => !containsBlockedAtRule(css),
9612
9020
  { message: `Blocked at-rules: ${BLOCKED_AT_RULES.join(", ")}. Use typed at-rules or local assets instead.` }
9613
9021
  );
9614
- var rawAtRuleSchema = z23.object({
9022
+ var rawAtRuleSchema = z20.object({
9615
9023
  id: ruleIdSchema,
9616
- type: z23.literal("raw"),
9024
+ type: z20.literal("raw"),
9617
9025
  css: rawCssSchema
9618
9026
  });
9619
- var customCssAtRuleSchema = z23.discriminatedUnion("type", [
9027
+ var customCssAtRuleSchema = z20.discriminatedUnion("type", [
9620
9028
  keyframesAtRuleSchema,
9621
9029
  fontFaceAtRuleSchema,
9622
9030
  mediaAtRuleSchema,
9623
9031
  supportsAtRuleSchema,
9624
9032
  rawAtRuleSchema
9625
9033
  ]);
9626
- var customCssAtRulesSchema = z23.array(customCssAtRuleSchema).optional();
9034
+ var customCssAtRulesSchema = z20.array(customCssAtRuleSchema).optional();
9627
9035
 
9628
9036
  // ../theme-core/src/shared/componentStyles.ts
9629
- import { z as z24 } from "zod";
9630
- var componentBorderSchema = z24.object({
9631
- width: z24.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
9632
- style: z24.enum(["solid", "dashed"]).default("solid"),
9633
- colorToken: z24.string().optional()
9037
+ import { z as z21 } from "zod";
9038
+ var componentBorderSchema = z21.object({
9039
+ width: z21.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
9040
+ style: z21.enum(["solid", "dashed"]).default("solid"),
9041
+ colorToken: z21.string().optional()
9634
9042
  // defaults to "border" if not set
9635
9043
  });
9636
- var componentShadowSchema = z24.object({
9637
- elevation: z24.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
9044
+ var componentShadowSchema = z21.object({
9045
+ elevation: z21.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
9638
9046
  });
9639
9047
 
9640
9048
  // ../theme-core/src/schema.ts
9641
- var axesSchema = z25.object({
9642
- tone: z25.enum(["minimal", "classic", "bold"]),
9643
- energy: z25.enum(["calm", "vibrant"]),
9644
- density: z25.enum(["airy", "regular", "compact"]),
9645
- mediaBias: z25.enum(["text", "media", "mixed"]),
9646
- conversionBias: z25.enum(["low", "med", "high"]),
9647
- motion: z25.enum(["subtle", "standard", "expressive"])
9648
- });
9649
- var colourHexString = z25.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
9650
- var paletteColorSchema = z25.object({
9651
- name: z25.string().min(1),
9049
+ var axesSchema = z22.object({
9050
+ tone: z22.enum(["minimal", "classic", "bold"]),
9051
+ energy: z22.enum(["calm", "vibrant"]),
9052
+ density: z22.enum(["airy", "regular", "compact"]),
9053
+ mediaBias: z22.enum(["text", "media", "mixed"]),
9054
+ conversionBias: z22.enum(["low", "med", "high"]),
9055
+ motion: z22.enum(["subtle", "standard", "expressive"])
9056
+ });
9057
+ var colourHexString = z22.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
9058
+ var paletteColorSchema = z22.object({
9059
+ name: z22.string().min(1),
9652
9060
  hex: colourHexString
9653
9061
  });
9654
- var paletteMetaSchema = z25.object({
9655
- mode: z25.enum(["light", "dark"])
9062
+ var paletteMetaSchema = z22.object({
9063
+ mode: z22.enum(["light", "dark"])
9656
9064
  });
9657
- var paletteSchema = z25.object({
9658
- colors: z25.array(paletteColorSchema),
9065
+ var paletteSchema = z22.object({
9066
+ colors: z22.array(paletteColorSchema),
9659
9067
  meta: paletteMetaSchema
9660
9068
  });
9661
- var typographyStyleSchema = z25.object({
9662
- family: z25.string().min(1),
9663
- weight: z25.enum(["light", "regular", "medium", "semibold", "bold"]),
9664
- letterSpacing: z25.enum(["tight", "normal", "loose"]),
9665
- lineHeight: z25.enum(["normal", "relaxed", "loose"])
9069
+ var typographyStyleSchema = z22.object({
9070
+ family: z22.string().min(1),
9071
+ weight: z22.enum(["light", "regular", "medium", "semibold", "bold"]),
9072
+ letterSpacing: z22.enum(["tight", "normal", "loose"]),
9073
+ lineHeight: z22.enum(["normal", "relaxed", "loose"])
9666
9074
  });
9667
9075
  var bodyTypographyStyleSchema = typographyStyleSchema.extend({
9668
- size: z25.enum(["md", "lg", "xl"])
9076
+ size: z22.enum(["md", "lg", "xl"])
9669
9077
  });
9670
- var headingSizeSchema = z25.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
9671
- var headingTypographyOverridesSchema = z25.object({
9672
- weight: z25.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
9673
- letterSpacing: z25.enum(["tight", "normal", "loose"]).nullable().optional(),
9078
+ var headingSizeSchema = z22.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
9079
+ var headingTypographyOverridesSchema = z22.object({
9080
+ weight: z22.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
9081
+ letterSpacing: z22.enum(["tight", "normal", "loose"]).nullable().optional(),
9674
9082
  size: headingSizeSchema.nullable().optional(),
9675
- lineHeight: z25.enum(["normal", "relaxed", "loose"]).nullable().optional(),
9676
- italic: z25.boolean().nullable().optional(),
9677
- colorToken: z25.string().min(1).nullable().optional()
9083
+ lineHeight: z22.enum(["normal", "relaxed", "loose"]).nullable().optional(),
9084
+ italic: z22.boolean().nullable().optional(),
9085
+ colorToken: z22.string().min(1).nullable().optional()
9678
9086
  // Palette token name for heading color
9679
9087
  });
9680
9088
  var headingTypographyStyleSchema = typographyStyleSchema.extend({
9681
- case: z25.enum(["uppercase", "normal", "smallCaps"]).nullable(),
9682
- italic: z25.boolean().nullable(),
9683
- colorToken: z25.string().min(1).nullable().optional()
9089
+ case: z22.enum(["uppercase", "normal", "smallCaps"]).nullable(),
9090
+ italic: z22.boolean().nullable(),
9091
+ colorToken: z22.string().min(1).nullable().optional()
9684
9092
  // Palette token name for heading color
9685
9093
  });
9686
- var proseLinkUnderlineStyleSchema = z25.enum(["solid", "dotted", "dashed"]);
9687
- var proseLinkUnderlineThicknessSchema = z25.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9688
- var proseLinkUnderlineOffsetSchema = z25.enum(["auto", "tight", "normal", "loose"]);
9689
- var proseLinkStyleSchema = z25.object({
9690
- colorToken: z25.string().min(1).optional(),
9691
- hoverColorToken: z25.string().min(1).optional(),
9692
- underline: z25.boolean().optional(),
9693
- decorationColorToken: z25.string().min(1).optional(),
9694
- hoverDecorationColorToken: z25.string().min(1).optional(),
9094
+ var proseLinkUnderlineStyleSchema = z22.enum(["solid", "dotted", "dashed"]);
9095
+ var proseLinkUnderlineThicknessSchema = z22.enum(["auto", "fromFont", "thin", "medium", "thick"]);
9096
+ var proseLinkUnderlineOffsetSchema = z22.enum(["auto", "tight", "normal", "loose"]);
9097
+ var proseLinkStyleSchema = z22.object({
9098
+ colorToken: z22.string().min(1).optional(),
9099
+ hoverColorToken: z22.string().min(1).optional(),
9100
+ underline: z22.boolean().optional(),
9101
+ decorationColorToken: z22.string().min(1).optional(),
9102
+ hoverDecorationColorToken: z22.string().min(1).optional(),
9695
9103
  underlineStyle: proseLinkUnderlineStyleSchema.optional(),
9696
9104
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
9697
9105
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
9698
9106
  });
9699
- var semanticSpacingSchema = z25.enum([
9107
+ var semanticSpacingSchema = z22.enum([
9700
9108
  "none",
9701
9109
  "compact",
9702
9110
  "cozy",
@@ -9704,62 +9112,62 @@ var semanticSpacingSchema = z25.enum([
9704
9112
  "comfortable",
9705
9113
  "spacious"
9706
9114
  ]);
9707
- var boxRoundedSchema = z25.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9708
- var boxBackgroundOverlaySchema = z25.object({
9709
- type: z25.enum(["none", "color", "gradient"]).nullable().optional(),
9710
- color: z25.string().nullable().optional(),
9711
- gradient: z25.string().nullable().optional(),
9712
- opacity: z25.number().min(0).max(1).nullable().optional()
9713
- });
9714
- var boxBackgroundSchema = z25.object({
9715
- type: z25.enum(["color", "gradient", "image"]).optional(),
9716
- color: z25.string().nullable().optional(),
9717
- gradient: z25.string().nullable().optional(),
9115
+ var boxRoundedSchema = z22.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
9116
+ var boxBackgroundOverlaySchema = z22.object({
9117
+ type: z22.enum(["none", "color", "gradient"]).nullable().optional(),
9118
+ color: z22.string().nullable().optional(),
9119
+ gradient: z22.string().nullable().optional(),
9120
+ opacity: z22.number().min(0).max(1).nullable().optional()
9121
+ });
9122
+ var boxBackgroundSchema = z22.object({
9123
+ type: z22.enum(["color", "gradient", "image"]).optional(),
9124
+ color: z22.string().nullable().optional(),
9125
+ gradient: z22.string().nullable().optional(),
9718
9126
  image: mediaSchema.nullable().optional(),
9719
- objectFit: z25.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
9720
- scale: z25.string().nullable().optional(),
9721
- position: z25.string().nullable().optional(),
9722
- opacity: z25.number().min(0).max(1).nullable().optional(),
9127
+ objectFit: z22.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
9128
+ scale: z22.string().nullable().optional(),
9129
+ position: z22.string().nullable().optional(),
9130
+ opacity: z22.number().min(0).max(1).nullable().optional(),
9723
9131
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
9724
- textColor: z25.string().nullable().optional(),
9725
- headingColor: z25.string().nullable().optional()
9132
+ textColor: z22.string().nullable().optional(),
9133
+ headingColor: z22.string().nullable().optional()
9726
9134
  });
9727
- var sectionStylesOverrideSchema = z25.object({
9135
+ var sectionStylesOverrideSchema = z22.object({
9728
9136
  background: boxBackgroundSchema.nullable().optional(),
9729
9137
  spacing: semanticSpacingSchema.nullable().optional(),
9730
- minHeight: z25.enum(["none", "hero", "immersive"]).nullable().optional()
9138
+ minHeight: z22.enum(["none", "hero", "immersive"]).nullable().optional()
9731
9139
  });
9732
- var containerStylesOverrideSchema = z25.object({
9140
+ var containerStylesOverrideSchema = z22.object({
9733
9141
  background: boxBackgroundSchema.nullable().optional(),
9734
9142
  spacing: semanticSpacingSchema.nullable().optional(),
9735
- raised: z25.boolean().nullable().optional(),
9143
+ raised: z22.boolean().nullable().optional(),
9736
9144
  rounded: boxRoundedSchema.nullable().optional(),
9737
- fullWidth: z25.boolean().nullable().optional()
9145
+ fullWidth: z22.boolean().nullable().optional()
9738
9146
  });
9739
- var cardBorderOverrideSchema = z25.object({
9740
- enabled: z25.boolean().nullable().optional(),
9741
- width: z25.enum(["none", "1", "2", "3"]).nullable().optional(),
9742
- colorToken: z25.string().nullable().optional()
9147
+ var cardBorderOverrideSchema = z22.object({
9148
+ enabled: z22.boolean().nullable().optional(),
9149
+ width: z22.enum(["none", "1", "2", "3"]).nullable().optional(),
9150
+ colorToken: z22.string().nullable().optional()
9743
9151
  });
9744
- var cardStylesOverrideSchema = z25.object({
9152
+ var cardStylesOverrideSchema = z22.object({
9745
9153
  background: boxBackgroundSchema.nullable().optional(),
9746
9154
  border: cardBorderOverrideSchema.nullable().optional(),
9747
9155
  spacing: semanticSpacingSchema.nullable().optional(),
9748
- raised: z25.boolean().nullable().optional(),
9156
+ raised: z22.boolean().nullable().optional(),
9749
9157
  rounded: boxRoundedSchema.nullable().optional()
9750
9158
  });
9751
- var blockStyleOverridesSchema = z25.object({
9159
+ var blockStyleOverridesSchema = z22.object({
9752
9160
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
9753
9161
  containerStyles: containerStylesOverrideSchema.nullable().optional(),
9754
9162
  cardStyles: cardStylesOverrideSchema.nullable().optional()
9755
9163
  });
9756
- var blockThemeOverrideSchema = z25.object({
9757
- typography: z25.object({
9164
+ var blockThemeOverrideSchema = z22.object({
9165
+ typography: z22.object({
9758
9166
  proseLinkStyle: proseLinkStyleSchema.optional()
9759
9167
  }).optional(),
9760
9168
  styles: blockStyleOverridesSchema.optional()
9761
9169
  });
9762
- var typographyScaleSchema = z25.enum([
9170
+ var typographyScaleSchema = z22.enum([
9763
9171
  // New intuitive names
9764
9172
  "compact",
9765
9173
  // ratio 1.2 (was minorThird)
@@ -9772,9 +9180,9 @@ var typographyScaleSchema = z25.enum([
9772
9180
  "majorThird",
9773
9181
  "perfectFourth"
9774
9182
  ]);
9775
- var typographySchema = z25.object({
9183
+ var typographySchema = z22.object({
9776
9184
  body: bodyTypographyStyleSchema,
9777
- headings: z25.object({
9185
+ headings: z22.object({
9778
9186
  default: headingTypographyStyleSchema,
9779
9187
  h1: headingTypographyOverridesSchema,
9780
9188
  h2: headingTypographyOverridesSchema,
@@ -9787,41 +9195,41 @@ var typographySchema = z25.object({
9787
9195
  scale: typographyScaleSchema,
9788
9196
  proseLinkStyle: proseLinkStyleSchema.optional()
9789
9197
  });
9790
- var spaceSchema = z25.enum(["comfortable", "standard", "dense"]);
9791
- var corners = z25.enum(["square", "soft", "rounded", "pill"]);
9792
- var shadow = z25.object({
9793
- elevation: z25.enum(["none", "low", "medium", "high"]),
9794
- softness: z25.enum(["crisp", "soft", "hard"]).nullable(),
9795
- position: z25.enum(["bottom", "bottom-right"]).default("bottom")
9198
+ var spaceSchema = z22.enum(["comfortable", "standard", "dense"]);
9199
+ var corners = z22.enum(["square", "soft", "rounded", "pill"]);
9200
+ var shadow = z22.object({
9201
+ elevation: z22.enum(["none", "low", "medium", "high"]),
9202
+ softness: z22.enum(["crisp", "soft", "hard"]).nullable(),
9203
+ position: z22.enum(["bottom", "bottom-right"]).default("bottom")
9796
9204
  });
9797
- var border = z25.object({
9798
- width: z25.enum(["none", "hairline", "thin", "thick"]),
9799
- style: z25.enum(["solid", "dashed"])
9205
+ var border = z22.object({
9206
+ width: z22.enum(["none", "hairline", "thin", "thick"]),
9207
+ style: z22.enum(["solid", "dashed"])
9800
9208
  });
9801
- var motion = z25.object({
9802
- level: z25.enum(["off", "low", "medium", "high"]),
9803
- easing: z25.enum(["standard", "snappy", "gentle"]).nullable()
9209
+ var motion = z22.object({
9210
+ level: z22.enum(["off", "low", "medium", "high"]),
9211
+ easing: z22.enum(["standard", "snappy", "gentle"]).nullable()
9804
9212
  });
9805
- var buttonStyle = z25.object({
9213
+ var buttonStyle = z22.object({
9806
9214
  shape: corners
9807
9215
  // Used for --radius-control CSS variable
9808
9216
  });
9809
- var cardStyle = z25.object({
9810
- elevation: z25.enum(["none", "low", "medium", "high"]),
9811
- border: z25.enum(["none", "subtle", "defined"]),
9217
+ var cardStyle = z22.object({
9218
+ elevation: z22.enum(["none", "low", "medium", "high"]),
9219
+ border: z22.enum(["none", "subtle", "defined"]),
9812
9220
  shape: corners,
9813
- headerStyle: z25.enum(["plain", "accentBar", "subtleBg"]).nullable(),
9814
- mediaTreatment: z25.enum(["square", "rounded", "bleed"]).nullable()
9221
+ headerStyle: z22.enum(["plain", "accentBar", "subtleBg"]).nullable(),
9222
+ mediaTreatment: z22.enum(["square", "rounded", "bleed"]).nullable()
9815
9223
  });
9816
- var inputStyle = z25.object({
9224
+ var inputStyle = z22.object({
9817
9225
  shape: corners,
9818
- border: z25.enum(["subtle", "defined", "underline"]),
9819
- focus: z25.enum(["glow", "ring", "underline"]),
9820
- label: z25.enum(["inside", "above"])
9226
+ border: z22.enum(["subtle", "defined", "underline"]),
9227
+ focus: z22.enum(["glow", "ring", "underline"]),
9228
+ label: z22.enum(["inside", "above"])
9821
9229
  });
9822
- var headerVariant = z25.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9823
- var headerPositioning = z25.enum(["static", "sticky", "fixed"]);
9824
- var headerNavStyle = z25.enum([
9230
+ var headerVariant = z22.enum(["classic", "centered", "transparent", "floating", "editorial"]);
9231
+ var headerPositioning = z22.enum(["static", "sticky", "fixed"]);
9232
+ var headerNavStyle = z22.enum([
9825
9233
  "minimal",
9826
9234
  "underline",
9827
9235
  "underline-grow",
@@ -9830,82 +9238,82 @@ var headerNavStyle = z25.enum([
9830
9238
  "frosted",
9831
9239
  "solid"
9832
9240
  ]);
9833
- var navFontWeight = z25.enum(["regular", "medium", "semibold", "bold"]);
9834
- var headerMaxWidth = z25.enum(["container", "full"]);
9835
- var headerContainerSchema = z25.object({
9836
- rounded: z25.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
9837
- border: z25.boolean().default(true),
9838
- shadow: z25.boolean().default(true),
9839
- padding: z25.enum(["sm", "md", "lg"]).default("md"),
9840
- tint: z25.string().nullable().optional(),
9841
- opacity: z25.number().min(0).max(1).default(0.12)
9241
+ var navFontWeight = z22.enum(["regular", "medium", "semibold", "bold"]);
9242
+ var headerMaxWidth = z22.enum(["container", "full"]);
9243
+ var headerContainerSchema = z22.object({
9244
+ rounded: z22.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
9245
+ border: z22.boolean().default(true),
9246
+ shadow: z22.boolean().default(true),
9247
+ padding: z22.enum(["sm", "md", "lg"]).default("md"),
9248
+ tint: z22.string().nullable().optional(),
9249
+ opacity: z22.number().min(0).max(1).default(0.12)
9842
9250
  }).optional();
9843
9251
  var headerBorderSchema = componentBorderSchema.extend({
9844
- position: z25.enum(["bottom", "top", "both", "none"]).default("bottom")
9252
+ position: z22.enum(["bottom", "top", "both", "none"]).default("bottom")
9845
9253
  }).optional();
9846
- var logoStyleSchema = z25.object({
9847
- fontFamily: z25.enum(["heading", "body"]).default("heading"),
9848
- letterSpacing: z25.enum(["normal", "wide", "wider", "widest"]).default("normal"),
9849
- gradient: z25.boolean().default(false)
9254
+ var logoStyleSchema = z22.object({
9255
+ fontFamily: z22.enum(["heading", "body"]).default("heading"),
9256
+ letterSpacing: z22.enum(["normal", "wide", "wider", "widest"]).default("normal"),
9257
+ gradient: z22.boolean().default(false)
9850
9258
  }).optional();
9851
- var headerLogoTextSchema = z25.object({
9852
- mobileWrapLines: z25.union([z25.literal(1), z25.literal(2)]).optional(),
9853
- mobileMaxWidth: z25.enum(["xs", "sm", "md"]).optional(),
9854
- hideOnShrink: z25.boolean().optional()
9259
+ var headerLogoTextSchema = z22.object({
9260
+ mobileWrapLines: z22.union([z22.literal(1), z22.literal(2)]).optional(),
9261
+ mobileMaxWidth: z22.enum(["xs", "sm", "md"]).optional(),
9262
+ hideOnShrink: z22.boolean().optional()
9855
9263
  }).optional();
9856
- var navEffectsSchema = z25.object({
9857
- underlineGradient: z25.boolean().default(false),
9858
- glow: z25.boolean().default(false),
9859
- glowColor: z25.string().optional(),
9860
- neumorphic: z25.boolean().default(false)
9264
+ var navEffectsSchema = z22.object({
9265
+ underlineGradient: z22.boolean().default(false),
9266
+ glow: z22.boolean().default(false),
9267
+ glowColor: z22.string().optional(),
9268
+ neumorphic: z22.boolean().default(false)
9861
9269
  }).optional();
9862
- var dropdownStyleSchema = z25.object({
9270
+ var dropdownStyleSchema = z22.object({
9863
9271
  // Container styling
9864
- background: z25.string().default("surface"),
9272
+ background: z22.string().default("surface"),
9865
9273
  // color token
9866
- textColor: z25.string().default("text"),
9274
+ textColor: z22.string().default("text"),
9867
9275
  // color token
9868
- borderColor: z25.string().nullable().default("border"),
9276
+ borderColor: z22.string().nullable().default("border"),
9869
9277
  // null = no border
9870
- shadow: z25.enum(["none", "sm", "md", "lg"]).default("md"),
9871
- borderRadius: z25.enum(["none", "sm", "md", "lg"]).default("md"),
9278
+ shadow: z22.enum(["none", "sm", "md", "lg"]).default("md"),
9279
+ borderRadius: z22.enum(["none", "sm", "md", "lg"]).default("md"),
9872
9280
  // Link hover states (explicit control)
9873
- hoverBackground: z25.string().nullable().optional(),
9281
+ hoverBackground: z22.string().nullable().optional(),
9874
9282
  // color token, null = transparent
9875
- hoverTextColor: z25.string().nullable().optional(),
9283
+ hoverTextColor: z22.string().nullable().optional(),
9876
9284
  // color token, null = inherit
9877
9285
  // Typography
9878
- textTransform: z25.enum(["none", "uppercase", "capitalize"]).default("none"),
9879
- letterSpacing: z25.enum(["normal", "wide", "wider"]).default("normal"),
9880
- fontWeight: z25.enum(["regular", "medium", "semibold", "bold"]).optional(),
9286
+ textTransform: z22.enum(["none", "uppercase", "capitalize"]).default("none"),
9287
+ letterSpacing: z22.enum(["normal", "wide", "wider"]).default("normal"),
9288
+ fontWeight: z22.enum(["regular", "medium", "semibold", "bold"]).optional(),
9881
9289
  // optional = inherit from navWeight
9882
- textSize: z25.enum(["xs", "sm", "base", "lg"]).optional()
9290
+ textSize: z22.enum(["xs", "sm", "base", "lg"]).optional()
9883
9291
  // optional = no override (browser default)
9884
9292
  }).optional();
9885
- var headerCtaGapSchema = z25.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9886
- var navContainerSchema = z25.object({
9887
- type: z25.enum(["none", "pill", "glass"]).default("none"),
9888
- tint: z25.string().nullable().optional(),
9889
- opacity: z25.number().min(0).max(1).default(0.15)
9293
+ var headerCtaGapSchema = z22.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9294
+ var navContainerSchema = z22.object({
9295
+ type: z22.enum(["none", "pill", "glass"]).default("none"),
9296
+ tint: z22.string().nullable().optional(),
9297
+ opacity: z22.number().min(0).max(1).default(0.15)
9890
9298
  }).default({ type: "none", tint: null, opacity: 0.15 });
9891
- var headerBackgroundSchema = z25.object({
9892
- type: z25.enum(["color", "gradient", "image"]),
9893
- color: z25.string().nullable().optional(),
9299
+ var headerBackgroundSchema = z22.object({
9300
+ type: z22.enum(["color", "gradient", "image"]),
9301
+ color: z22.string().nullable().optional(),
9894
9302
  gradient: gradientConfigSchema.nullable().optional(),
9895
9303
  image: mediaSchema.nullable().optional(),
9896
- textColor: z25.string().nullable().optional()
9304
+ textColor: z22.string().nullable().optional()
9897
9305
  });
9898
- var headerSchema = z25.object({
9306
+ var headerSchema = z22.object({
9899
9307
  variant: headerVariant,
9900
9308
  positioning: headerPositioning,
9901
- shrinkOnScroll: z25.boolean(),
9309
+ shrinkOnScroll: z22.boolean(),
9902
9310
  maxWidth: headerMaxWidth,
9903
9311
  logoOverride: mediaSchema.nullable().optional(),
9904
9312
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9905
- textColor: z25.string().nullable().optional(),
9313
+ textColor: z22.string().nullable().optional(),
9906
9314
  // Site title and general header text
9907
9315
  navStyle: headerNavStyle,
9908
- navColor: z25.string().nullable().optional(),
9316
+ navColor: z22.string().nullable().optional(),
9909
9317
  // Nav links (inherits textColor if not set)
9910
9318
  navWeight: navFontWeight.default("medium"),
9911
9319
  // New fields for header system enhancement
@@ -9924,50 +9332,50 @@ var headerSchema = z25.object({
9924
9332
  // Dropdown menu styling (nav dropdowns and mobile drawer)
9925
9333
  dropdownStyle: dropdownStyleSchema
9926
9334
  });
9927
- var footerVariant = z25.enum(["simple", "columns", "split"]);
9928
- var footerMaxWidth = z25.enum(["container", "full"]);
9929
- var footerMode = z25.enum(["default", "blocks", "default+blocks", "none"]);
9930
- var footerNavLayoutMode = z25.enum(["stack", "inline", "inline-wrap"]);
9931
- var footerNavLayoutAlign = z25.enum(["start", "center", "end", "space-between"]);
9932
- var footerSpacing = z25.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9933
- var footerLogoPlacement = z25.enum(["left", "right", "above", "below"]);
9934
- var footerLogoSize = z25.enum(["sm", "md", "lg", "xl"]);
9935
- var footerLogoMaxHeight = z25.enum(["sm", "md", "lg", "xl"]);
9936
- var footerBottomTextLinkStyleSchema = z25.object({
9937
- colorToken: z25.string().optional(),
9938
- hoverColorToken: z25.string().nullable().optional(),
9939
- decorationColorToken: z25.string().nullable().optional(),
9940
- underline: z25.boolean().optional()
9941
- });
9942
- var footerBottomBarSchema = z25.object({
9943
- enabled: z25.boolean().optional(),
9944
- fullBleed: z25.boolean().optional(),
9335
+ var footerVariant = z22.enum(["simple", "columns", "split"]);
9336
+ var footerMaxWidth = z22.enum(["container", "full"]);
9337
+ var footerMode = z22.enum(["default", "blocks", "default+blocks", "none"]);
9338
+ var footerNavLayoutMode = z22.enum(["stack", "inline", "inline-wrap"]);
9339
+ var footerNavLayoutAlign = z22.enum(["start", "center", "end", "space-between"]);
9340
+ var footerSpacing = z22.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
9341
+ var footerLogoPlacement = z22.enum(["left", "right", "above", "below"]);
9342
+ var footerLogoSize = z22.enum(["sm", "md", "lg", "xl"]);
9343
+ var footerLogoMaxHeight = z22.enum(["sm", "md", "lg", "xl"]);
9344
+ var footerBottomTextLinkStyleSchema = z22.object({
9345
+ colorToken: z22.string().optional(),
9346
+ hoverColorToken: z22.string().nullable().optional(),
9347
+ decorationColorToken: z22.string().nullable().optional(),
9348
+ underline: z22.boolean().optional()
9349
+ });
9350
+ var footerBottomBarSchema = z22.object({
9351
+ enabled: z22.boolean().optional(),
9352
+ fullBleed: z22.boolean().optional(),
9945
9353
  background: headerBackgroundSchema.optional(),
9946
- textColor: z25.string().nullable().optional(),
9947
- textAlign: z25.enum(["left", "center", "right"]).optional(),
9354
+ textColor: z22.string().nullable().optional(),
9355
+ textAlign: z22.enum(["left", "center", "right"]).optional(),
9948
9356
  paddingY: footerSpacing.optional(),
9949
9357
  paddingX: footerSpacing.optional(),
9950
- borderTop: z25.object({
9951
- colorToken: z25.string().nullable().optional(),
9952
- width: z25.enum(["none", "thin", "medium", "thick"]).optional()
9358
+ borderTop: z22.object({
9359
+ colorToken: z22.string().nullable().optional(),
9360
+ width: z22.enum(["none", "thin", "medium", "thick"]).optional()
9953
9361
  }).optional()
9954
9362
  });
9955
- var footerNavLayoutSchema = z25.object({
9363
+ var footerNavLayoutSchema = z22.object({
9956
9364
  layout: footerNavLayoutMode.optional(),
9957
9365
  align: footerNavLayoutAlign.optional(),
9958
9366
  gapX: footerSpacing.optional(),
9959
9367
  gapY: footerSpacing.optional(),
9960
- columns: z25.number().int().min(1).max(6).optional()
9368
+ columns: z22.number().int().min(1).max(6).optional()
9961
9369
  });
9962
- var footerLogoSchema = z25.object({
9963
- showLogo: z25.boolean().default(true),
9964
- showLogoText: z25.boolean().optional(),
9370
+ var footerLogoSchema = z22.object({
9371
+ showLogo: z22.boolean().default(true),
9372
+ showLogoText: z22.boolean().optional(),
9965
9373
  placement: footerLogoPlacement.optional(),
9966
9374
  size: footerLogoSize.optional(),
9967
9375
  maxHeight: footerLogoMaxHeight.optional(),
9968
- align: z25.enum(["start", "center", "end"]).optional()
9376
+ align: z22.enum(["start", "center", "end"]).optional()
9969
9377
  });
9970
- var footerSchema = z25.object({
9378
+ var footerSchema = z22.object({
9971
9379
  /**
9972
9380
  * SDK-only footer rendering mode.
9973
9381
  *
@@ -9976,11 +9384,11 @@ var footerSchema = z25.object({
9976
9384
  mode: footerMode.optional(),
9977
9385
  variant: footerVariant,
9978
9386
  maxWidth: footerMaxWidth,
9979
- showLogoText: z25.boolean().optional(),
9387
+ showLogoText: z22.boolean().optional(),
9980
9388
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
9981
9389
  // Footer nav styling (independent from header)
9982
9390
  navStyle: headerNavStyle.default("minimal"),
9983
- navColor: z25.string().nullable().optional(),
9391
+ navColor: z22.string().nullable().optional(),
9984
9392
  navWeight: navFontWeight.default("medium"),
9985
9393
  // Full nav link customization (overrides navStyle if set)
9986
9394
  navLinkStyle: navLinkStyleSchema.optional(),
@@ -9991,15 +9399,15 @@ var footerSchema = z25.object({
9991
9399
  logo: footerLogoSchema.optional(),
9992
9400
  bottomBar: footerBottomBarSchema.optional()
9993
9401
  });
9994
- var containerPaddingPresetSchema = z25.enum(["tight", "compact", "default", "relaxed"]);
9995
- var layoutSchema = z25.object({
9996
- containerPadding: z25.object({
9402
+ var containerPaddingPresetSchema = z22.enum(["tight", "compact", "default", "relaxed"]);
9403
+ var layoutSchema = z22.object({
9404
+ containerPadding: z22.object({
9997
9405
  mobile: containerPaddingPresetSchema.optional(),
9998
9406
  tablet: containerPaddingPresetSchema.optional(),
9999
9407
  desktop: containerPaddingPresetSchema.optional()
10000
9408
  }).optional()
10001
9409
  }).optional();
10002
- var heroTypographySizeSchema = z25.enum([
9410
+ var heroTypographySizeSchema = z22.enum([
10003
9411
  "sm",
10004
9412
  "base",
10005
9413
  "lg",
@@ -10010,14 +9418,14 @@ var heroTypographySizeSchema = z25.enum([
10010
9418
  "5xl",
10011
9419
  "6xl"
10012
9420
  ]);
10013
- var heroTypographyLineHeightSchema = z25.enum(["tight", "snug", "normal", "relaxed"]);
10014
- var heroResponsiveTypographySchema = z25.object({
9421
+ var heroTypographyLineHeightSchema = z22.enum(["tight", "snug", "normal", "relaxed"]);
9422
+ var heroResponsiveTypographySchema = z22.object({
10015
9423
  headlineSize: heroTypographySizeSchema.optional(),
10016
9424
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
10017
9425
  subheadlineSize: heroTypographySizeSchema.optional(),
10018
9426
  subheadlineLineHeight: heroTypographyLineHeightSchema.optional()
10019
9427
  });
10020
- var heroTypographySchema = z25.object({
9428
+ var heroTypographySchema = z22.object({
10021
9429
  headlineSize: heroTypographySizeSchema.optional(),
10022
9430
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
10023
9431
  subheadlineSize: heroTypographySizeSchema.optional(),
@@ -10026,24 +9434,24 @@ var heroTypographySchema = z25.object({
10026
9434
  microHeadlineLineHeight: heroTypographyLineHeightSchema.optional(),
10027
9435
  microSubheadlineSize: heroTypographySizeSchema.optional(),
10028
9436
  microSubheadlineLineHeight: heroTypographyLineHeightSchema.optional(),
10029
- responsive: z25.object({
9437
+ responsive: z22.object({
10030
9438
  tablet: heroResponsiveTypographySchema.optional(),
10031
9439
  mobile: heroResponsiveTypographySchema.optional()
10032
9440
  }).optional()
10033
9441
  });
10034
- var heroSchema = z25.object({
9442
+ var heroSchema = z22.object({
10035
9443
  typography: heroTypographySchema.optional()
10036
9444
  }).optional();
10037
- var gradientsSchema = z25.object({
10038
- button: z25.string().min(1).nullable().optional(),
10039
- hero: z25.string().min(1).nullable().optional(),
10040
- background: z25.string().min(1).nullable().optional()
10041
- });
10042
- var themeSchema = z25.object({
10043
- name: z25.string().min(1).max(30),
10044
- description: z25.string().min(1).max(400),
10045
- rationale: z25.string().min(1).max(400),
10046
- siteStyleId: z25.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
9445
+ var gradientsSchema = z22.object({
9446
+ button: z22.string().min(1).nullable().optional(),
9447
+ hero: z22.string().min(1).nullable().optional(),
9448
+ background: z22.string().min(1).nullable().optional()
9449
+ });
9450
+ var themeSchema = z22.object({
9451
+ name: z22.string().min(1).max(30),
9452
+ description: z22.string().min(1).max(400),
9453
+ rationale: z22.string().min(1).max(400),
9454
+ siteStyleId: z22.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
10047
9455
  axes: axesSchema,
10048
9456
  palette: paletteSchema,
10049
9457
  typography: typographySchema,
@@ -10070,16 +9478,16 @@ var themeSchema = z25.object({
10070
9478
  // Block-specific customization (Tier 3)
10071
9479
  // blockCustomVars: Per-block CSS variable overrides as bare values
10072
9480
  // Example: { "event-registration": { "--step-color": "#6d28d9" } }
10073
- blockCustomVars: z25.record(
10074
- z25.string(),
9481
+ blockCustomVars: z22.record(
9482
+ z22.string(),
10075
9483
  // block kind (matches data-block attribute)
10076
- z25.record(z25.string(), z25.string())
9484
+ z22.record(z22.string(), z22.string())
10077
9485
  // { '--var-name': 'value' }
10078
9486
  ).optional(),
10079
9487
  // Structured block-kind theme overrides (v1: typography prose-link style only)
10080
9488
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
10081
- blockOverrides: z25.record(
10082
- z25.string(),
9489
+ blockOverrides: z22.record(
9490
+ z22.string(),
10083
9491
  blockThemeOverrideSchema
10084
9492
  ).optional(),
10085
9493
  // Structured custom CSS rules
@@ -10115,22 +9523,21 @@ var themeSchema = z25.object({
10115
9523
  * }
10116
9524
  * ```
10117
9525
  */
10118
- styleGroups: z25.record(z25.string(), z25.array(z25.string())).optional()
9526
+ styleGroups: z22.record(z22.string(), z22.array(z22.string())).optional()
10119
9527
  });
10120
- var themesTurnSchema = z25.object({
10121
- message: z25.string().min(1),
10122
- themes: z25.array(themeSchema).length(3)
9528
+ var themesTurnSchema = z22.object({
9529
+ message: z22.string().min(1),
9530
+ themes: z22.array(themeSchema).length(3)
10123
9531
  });
10124
9532
 
10125
9533
  // ../theme-core/src/palette/variants/types.ts
10126
- import { z as z26 } from "zod";
10127
9534
  function asPaletteVariantId(value) {
10128
9535
  if (value.length === 0) {
10129
9536
  throw new Error("PaletteVariantId must be a non-empty string");
10130
9537
  }
10131
9538
  return value;
10132
9539
  }
10133
- var paletteVariantIdSchema = z26.string().min(1).transform((value) => asPaletteVariantId(value));
9540
+ var paletteVariantIdSchema = z23.string().min(1).transform((value) => asPaletteVariantId(value));
10134
9541
  var PALETTE_TOKEN_NAMES = [
10135
9542
  "primary",
10136
9543
  "primaryForeground",
@@ -10146,19 +9553,19 @@ var PALETTE_TOKEN_NAMES = [
10146
9553
  "text",
10147
9554
  "border"
10148
9555
  ];
10149
- var paletteTokenNameSchema = z26.enum(PALETTE_TOKEN_NAMES);
9556
+ var paletteTokenNameSchema = z23.enum(PALETTE_TOKEN_NAMES);
10150
9557
  var HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
10151
- var hexColorSchema = z26.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
9558
+ var hexColorSchema = z23.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
10152
9559
  var variantPaletteColorSchema = paletteColorSchema.extend({
10153
9560
  name: paletteTokenNameSchema
10154
9561
  });
10155
- var paletteVariantSchema = z26.object({
9562
+ var paletteVariantSchema = z23.object({
10156
9563
  id: paletteVariantIdSchema,
10157
- name: z26.string().min(1),
10158
- description: z26.string().min(1),
9564
+ name: z23.string().min(1),
9565
+ description: z23.string().min(1),
10159
9566
  tags: styleTagsSchema,
10160
- mode: z26.enum(["light", "dark"]),
10161
- colors: z26.array(variantPaletteColorSchema).min(1)
9567
+ mode: z23.enum(["light", "dark"]),
9568
+ colors: z23.array(variantPaletteColorSchema).min(1)
10162
9569
  });
10163
9570
  function definePaletteVariant(input) {
10164
9571
  return {
@@ -10170,7 +9577,7 @@ function definePaletteVariant(input) {
10170
9577
  colors: input.colors
10171
9578
  };
10172
9579
  }
10173
- var paletteOverridesSchema = z26.object({
9580
+ var paletteOverridesSchema = z23.object({
10174
9581
  primary: hexColorSchema.optional(),
10175
9582
  primaryForeground: hexColorSchema.optional(),
10176
9583
  secondary: hexColorSchema.optional(),
@@ -10458,28 +9865,679 @@ var warmNeutralForest = definePaletteVariant({
10458
9865
  ]
10459
9866
  });
10460
9867
 
10461
- // ../theme-core/src/palette/variants/index.ts
10462
- var paletteVariants = [
10463
- // Brand-led family
10464
- brandLedCool,
10465
- brandLedWarm,
10466
- brandLedJewel,
10467
- // Warm-neutral family
10468
- warmNeutralClay,
10469
- warmNeutralCream,
10470
- warmNeutralForest,
10471
- // High-contrast family
10472
- highContrastInk,
10473
- highContrastCharcoal,
10474
- highContrastMonochrome,
10475
- // Soft-natural family
10476
- softNaturalSage,
10477
- softNaturalStone,
10478
- softNaturalWatercolor
9868
+ // ../theme-core/src/palette/variants/index.ts
9869
+ var paletteVariants = [
9870
+ // Brand-led family
9871
+ brandLedCool,
9872
+ brandLedWarm,
9873
+ brandLedJewel,
9874
+ // Warm-neutral family
9875
+ warmNeutralClay,
9876
+ warmNeutralCream,
9877
+ warmNeutralForest,
9878
+ // High-contrast family
9879
+ highContrastInk,
9880
+ highContrastCharcoal,
9881
+ highContrastMonochrome,
9882
+ // Soft-natural family
9883
+ softNaturalSage,
9884
+ softNaturalStone,
9885
+ softNaturalWatercolor
9886
+ ];
9887
+ var paletteVariantsById = new Map(
9888
+ paletteVariants.map((v) => [v.id, v])
9889
+ );
9890
+
9891
+ // ../theme-core/src/site-styles/sourceCatalogs.ts
9892
+ var generatedContentFrames = [
9893
+ plainFrame,
9894
+ panelFrame("inset"),
9895
+ panelFrame("raised"),
9896
+ flushPanelFrame({ bleed: "start" })
9897
+ ];
9898
+ var userContentFrames = [
9899
+ ...generatedContentFrames,
9900
+ panelFrame("editorial"),
9901
+ flushPanelFrame({ bleed: "end" }),
9902
+ flushPanelFrame({ bleed: "both" })
9903
+ ];
9904
+ var generatedDesignOptionCatalog = {
9905
+ source: "generated",
9906
+ sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
9907
+ contentFrames: generatedContentFrames,
9908
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
9909
+ transitions: ["none", "soft-fade-short", "soft-fade-long"],
9910
+ emphases: ["low", "medium", "high"],
9911
+ detachedCustom: false
9912
+ };
9913
+ var userDesignOptionCatalog = {
9914
+ source: "user",
9915
+ sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
9916
+ contentFrames: userContentFrames,
9917
+ itemSurfaces: [
9918
+ ...generatedDesignOptionCatalog.itemSurfaces,
9919
+ "inset",
9920
+ "editorial"
9921
+ ],
9922
+ transitions: [
9923
+ ...generatedDesignOptionCatalog.transitions,
9924
+ "wave-edge",
9925
+ "angle-edge"
9926
+ ],
9927
+ emphases: generatedDesignOptionCatalog.emphases,
9928
+ detachedCustom: false
9929
+ };
9930
+ var advancedDesignOptionCatalog = {
9931
+ source: "advanced",
9932
+ sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
9933
+ contentFrames: userDesignOptionCatalog.contentFrames,
9934
+ itemSurfaces: userDesignOptionCatalog.itemSurfaces,
9935
+ transitions: userDesignOptionCatalog.transitions,
9936
+ emphases: userDesignOptionCatalog.emphases,
9937
+ detachedCustom: true
9938
+ };
9939
+
9940
+ // ../theme-core/src/site-styles/curatedSiteStyles.ts
9941
+ var curatedSiteStyleIdValues = [
9942
+ "site-style:calm-studio",
9943
+ "site-style:clear-professional",
9944
+ "site-style:warm-editorial",
9945
+ "site-style:bright-community",
9946
+ "site-style:quiet-luxury",
9947
+ "site-style:practical-services",
9948
+ "site-style:modern-wellness",
9949
+ "site-style:bold-launch"
9950
+ ];
9951
+ var quietBudget = {
9952
+ accentDensity: "low",
9953
+ panelDensity: "medium",
9954
+ transitionMix: "quiet",
9955
+ primaryCtaLimit: 2,
9956
+ mediaDensity: "medium",
9957
+ decorativeRepetition: "low"
9958
+ };
9959
+ var balancedBudget = {
9960
+ accentDensity: "medium",
9961
+ panelDensity: "medium",
9962
+ transitionMix: "balanced",
9963
+ primaryCtaLimit: 3,
9964
+ mediaDensity: "medium",
9965
+ decorativeRepetition: "medium"
9966
+ };
9967
+ var expressiveBudget = {
9968
+ accentDensity: "high",
9969
+ panelDensity: "high",
9970
+ transitionMix: "expressive",
9971
+ primaryCtaLimit: 3,
9972
+ mediaDensity: "high",
9973
+ decorativeRepetition: "medium"
9974
+ };
9975
+ function uniqueContentFrameKinds() {
9976
+ const kinds = [...new Set(
9977
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
9978
+ )];
9979
+ const firstKind = kinds[0];
9980
+ if (!firstKind) {
9981
+ throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
9982
+ }
9983
+ return [firstKind, ...kinds.slice(1)];
9984
+ }
9985
+ var generatedContentFrameKinds = uniqueContentFrameKinds();
9986
+ function defineCuratedSiteStyle(input) {
9987
+ return {
9988
+ id: asSiteStyleId(input.id),
9989
+ name: input.name,
9990
+ description: input.description,
9991
+ generationBrief: input.generationBrief,
9992
+ selectionKeywords: input.selectionKeywords ?? [],
9993
+ template: {
9994
+ id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
9995
+ name: input.name,
9996
+ version: 1,
9997
+ tokenRecipes: input.tokenRecipes,
9998
+ compositionBudget: input.compositionBudget,
9999
+ supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
10000
+ supportedContentFrames: generatedContentFrameKinds,
10001
+ supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
10002
+ supportedTransitions: generatedDesignOptionCatalog.transitions
10003
+ },
10004
+ buttonPersonalityChoices: input.buttonPersonalityChoices,
10005
+ paletteVariantChoices: input.paletteVariantChoices
10006
+ };
10007
+ }
10008
+ function buttonChoice(id, note) {
10009
+ return note ? { id: asButtonPersonalityId(id), note } : { id: asButtonPersonalityId(id) };
10010
+ }
10011
+ function paletteChoice(id, note) {
10012
+ return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
10013
+ }
10014
+ var curatedSiteStyles = [
10015
+ defineCuratedSiteStyle({
10016
+ id: "site-style:calm-studio",
10017
+ name: "Calm Studio",
10018
+ description: "Soft, measured, and spacious for intimate appointment or class businesses.",
10019
+ generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
10020
+ tokenRecipes: {
10021
+ palette: "soft-natural",
10022
+ contrast: "standard",
10023
+ radius: "soft",
10024
+ shadow: "subtle",
10025
+ typography: "friendly-sans",
10026
+ spacing: "airy",
10027
+ motion: "subtle"
10028
+ },
10029
+ compositionBudget: quietBudget,
10030
+ buttonPersonalityChoices: [
10031
+ buttonChoice("soft-pill"),
10032
+ buttonChoice("pebble"),
10033
+ buttonChoice("editorial-link"),
10034
+ buttonChoice("brushed-wash")
10035
+ ],
10036
+ paletteVariantChoices: [
10037
+ paletteChoice("soft-natural-sage"),
10038
+ paletteChoice("soft-natural-stone"),
10039
+ paletteChoice("warm-neutral-clay"),
10040
+ paletteChoice("soft-natural-watercolor")
10041
+ ]
10042
+ }),
10043
+ defineCuratedSiteStyle({
10044
+ id: "site-style:clear-professional",
10045
+ name: "Clear Professional",
10046
+ description: "Crisp, trustworthy, and direct for local services and consultancies.",
10047
+ generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
10048
+ tokenRecipes: {
10049
+ palette: "brand-led",
10050
+ contrast: "strong",
10051
+ radius: "soft",
10052
+ shadow: "subtle",
10053
+ typography: "clean-sans",
10054
+ spacing: "regular",
10055
+ motion: "subtle"
10056
+ },
10057
+ compositionBudget: balancedBudget,
10058
+ buttonPersonalityChoices: [
10059
+ buttonChoice("confident-chip"),
10060
+ buttonChoice("soft-pill"),
10061
+ buttonChoice("editorial-link")
10062
+ ],
10063
+ paletteVariantChoices: [
10064
+ paletteChoice("brand-led-cool"),
10065
+ paletteChoice("high-contrast-ink"),
10066
+ paletteChoice("brand-led-jewel")
10067
+ ]
10068
+ }),
10069
+ defineCuratedSiteStyle({
10070
+ id: "site-style:warm-editorial",
10071
+ name: "Warm Editorial",
10072
+ description: "Story-led and textured for educators, makers, venues, and retreats.",
10073
+ generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
10074
+ tokenRecipes: {
10075
+ palette: "warm-neutral",
10076
+ contrast: "standard",
10077
+ radius: "square",
10078
+ shadow: "none",
10079
+ typography: "serif-editorial",
10080
+ spacing: "airy",
10081
+ motion: "subtle"
10082
+ },
10083
+ compositionBudget: balancedBudget,
10084
+ buttonPersonalityChoices: [
10085
+ buttonChoice("editorial-link"),
10086
+ buttonChoice("soft-pill"),
10087
+ buttonChoice("brushed-wash")
10088
+ ],
10089
+ paletteVariantChoices: [
10090
+ paletteChoice("warm-neutral-cream"),
10091
+ paletteChoice("warm-neutral-clay"),
10092
+ paletteChoice("warm-neutral-forest"),
10093
+ paletteChoice("soft-natural-stone")
10094
+ ]
10095
+ }),
10096
+ defineCuratedSiteStyle({
10097
+ id: "site-style:bright-community",
10098
+ name: "Bright Community",
10099
+ description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
10100
+ generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
10101
+ tokenRecipes: {
10102
+ palette: "brand-led",
10103
+ contrast: "standard",
10104
+ radius: "rounded",
10105
+ shadow: "subtle",
10106
+ typography: "friendly-sans",
10107
+ spacing: "regular",
10108
+ motion: "expressive"
10109
+ },
10110
+ compositionBudget: balancedBudget,
10111
+ buttonPersonalityChoices: [
10112
+ buttonChoice("pebble"),
10113
+ buttonChoice("brushed-wash"),
10114
+ buttonChoice("confident-chip")
10115
+ ],
10116
+ paletteVariantChoices: [
10117
+ paletteChoice("brand-led-warm"),
10118
+ paletteChoice("brand-led-jewel"),
10119
+ paletteChoice("soft-natural-watercolor")
10120
+ ]
10121
+ }),
10122
+ defineCuratedSiteStyle({
10123
+ id: "site-style:quiet-luxury",
10124
+ name: "Quiet Luxury",
10125
+ description: "Minimal, confident, and refined for premium experiences and private services.",
10126
+ generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
10127
+ selectionKeywords: [
10128
+ "luxury",
10129
+ "premium",
10130
+ "boutique",
10131
+ "bespoke",
10132
+ "exclusive"
10133
+ ],
10134
+ tokenRecipes: {
10135
+ palette: "high-contrast",
10136
+ contrast: "strong",
10137
+ radius: "square",
10138
+ shadow: "none",
10139
+ typography: "classic-serif",
10140
+ spacing: "airy",
10141
+ motion: "none"
10142
+ },
10143
+ compositionBudget: quietBudget,
10144
+ buttonPersonalityChoices: [
10145
+ buttonChoice("editorial-link"),
10146
+ buttonChoice("confident-chip"),
10147
+ buttonChoice("soft-pill")
10148
+ ],
10149
+ paletteVariantChoices: [
10150
+ paletteChoice("high-contrast-charcoal"),
10151
+ paletteChoice("high-contrast-ink"),
10152
+ paletteChoice("warm-neutral-cream")
10153
+ ]
10154
+ }),
10155
+ defineCuratedSiteStyle({
10156
+ id: "site-style:practical-services",
10157
+ name: "Practical Services",
10158
+ description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
10159
+ generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
10160
+ selectionKeywords: [
10161
+ "repair",
10162
+ "plumb",
10163
+ "electric",
10164
+ "cleaning",
10165
+ "landscap",
10166
+ "contractor"
10167
+ ],
10168
+ tokenRecipes: {
10169
+ palette: "brand-led",
10170
+ contrast: "maximum",
10171
+ radius: "soft",
10172
+ shadow: "subtle",
10173
+ typography: "clean-sans",
10174
+ spacing: "compact",
10175
+ motion: "none"
10176
+ },
10177
+ compositionBudget: quietBudget,
10178
+ buttonPersonalityChoices: [
10179
+ buttonChoice("confident-chip"),
10180
+ buttonChoice("pebble"),
10181
+ buttonChoice("ink-stamp")
10182
+ ],
10183
+ paletteVariantChoices: [
10184
+ paletteChoice("brand-led-cool"),
10185
+ paletteChoice("high-contrast-ink"),
10186
+ paletteChoice("brand-led-warm")
10187
+ ]
10188
+ }),
10189
+ defineCuratedSiteStyle({
10190
+ id: "site-style:modern-wellness",
10191
+ name: "Modern Wellness",
10192
+ description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
10193
+ generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
10194
+ tokenRecipes: {
10195
+ palette: "soft-natural",
10196
+ contrast: "standard",
10197
+ radius: "rounded",
10198
+ shadow: "subtle",
10199
+ typography: "clean-sans",
10200
+ spacing: "airy",
10201
+ motion: "subtle"
10202
+ },
10203
+ compositionBudget: balancedBudget,
10204
+ buttonPersonalityChoices: [
10205
+ buttonChoice("soft-pill"),
10206
+ buttonChoice("pebble"),
10207
+ buttonChoice("confident-chip")
10208
+ ],
10209
+ paletteVariantChoices: [
10210
+ paletteChoice("soft-natural-sage"),
10211
+ paletteChoice("soft-natural-stone"),
10212
+ paletteChoice("warm-neutral-forest")
10213
+ ]
10214
+ }),
10215
+ defineCuratedSiteStyle({
10216
+ id: "site-style:bold-launch",
10217
+ name: "Bold Launch",
10218
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
10219
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
10220
+ selectionKeywords: [
10221
+ "launch",
10222
+ "campaign",
10223
+ "preorder",
10224
+ "pre-order",
10225
+ "waitlist",
10226
+ "drop"
10227
+ ],
10228
+ tokenRecipes: {
10229
+ palette: "high-contrast",
10230
+ contrast: "maximum",
10231
+ radius: "pill",
10232
+ shadow: "layered",
10233
+ typography: "clean-sans",
10234
+ spacing: "regular",
10235
+ motion: "expressive"
10236
+ },
10237
+ compositionBudget: expressiveBudget,
10238
+ buttonPersonalityChoices: [
10239
+ buttonChoice("ink-stamp"),
10240
+ buttonChoice("confident-chip"),
10241
+ buttonChoice("brushed-wash"),
10242
+ buttonChoice("pebble")
10243
+ ],
10244
+ paletteVariantChoices: [
10245
+ paletteChoice("high-contrast-monochrome"),
10246
+ paletteChoice("high-contrast-ink"),
10247
+ paletteChoice("brand-led-jewel"),
10248
+ paletteChoice("brand-led-warm")
10249
+ ]
10250
+ })
10251
+ ];
10252
+ var curatedSiteStylesById = new Map(
10253
+ curatedSiteStyles.map((style) => [style.id, style])
10254
+ );
10255
+
10256
+ // ../theme-core/src/site-styles/designState.ts
10257
+ import { z as z24 } from "zod";
10258
+
10259
+ // ../theme-core/src/site-styles/rawStyleFields.ts
10260
+ var themeV2RuntimeStyleFieldNames = [
10261
+ "_frameStyles",
10262
+ "_sectionStyles",
10263
+ "_containerStyles",
10264
+ "_cardStyles",
10265
+ // styleGroup is legacy runtime transition wiring rather than a nested
10266
+ // override object, but normal editors should still never see it directly.
10267
+ "styleGroup"
10479
10268
  ];
10480
- var paletteVariantsById = new Map(
10481
- paletteVariants.map((v) => [v.id, v])
10269
+ var themeV2BlockSpecificRawStyleFieldNames = [
10270
+ "_contentCardStyles",
10271
+ "_textCardStyles"
10272
+ ];
10273
+ var themeV2NormalEditorRawStyleFieldNames = [
10274
+ ...themeV2RuntimeStyleFieldNames,
10275
+ ...themeV2BlockSpecificRawStyleFieldNames
10276
+ ];
10277
+ var themeV2NormalEditorRawStyleFieldNameSet = new Set(
10278
+ themeV2NormalEditorRawStyleFieldNames
10279
+ );
10280
+
10281
+ // ../theme-core/src/site-styles/designState.ts
10282
+ var themeV2DesignStateSchemaVersion = 1;
10283
+ var designResolutionPolicySchema = z24.enum(["generated", "user", "admin", "sdk"]);
10284
+ var runtimeStyleFieldNameSchema = z24.enum(themeV2RuntimeStyleFieldNames);
10285
+ var nonEmptyRuntimeStyleFieldNamesSchema = z24.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
10286
+ fields3[0],
10287
+ ...fields3.slice(1)
10288
+ ]);
10289
+ var heroLegibilityStrategySchema = z24.enum([
10290
+ "none",
10291
+ "scrim-gradient",
10292
+ "solid-panel"
10293
+ ]);
10294
+ function uniqueNonEmpty(values) {
10295
+ const uniqueValues = [...new Set(values)];
10296
+ const firstValue = uniqueValues[0];
10297
+ if (!firstValue) {
10298
+ throw new Error("Expected at least one Theme V2 design state option.");
10299
+ }
10300
+ return [firstValue, ...uniqueValues.slice(1)];
10301
+ }
10302
+ var userPanelTreatments = uniqueNonEmpty(
10303
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
10304
+ );
10305
+ var userFlushTreatments = uniqueNonEmpty(
10306
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
10307
+ );
10308
+ var userFlushBleeds = uniqueNonEmpty(
10309
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
10310
+ );
10311
+ var contentFrameIntentSchema = z24.discriminatedUnion("kind", [
10312
+ z24.object({ kind: z24.literal("plain") }).strict(),
10313
+ z24.object({
10314
+ kind: z24.literal("panel"),
10315
+ treatment: z24.enum(userPanelTreatments)
10316
+ }).strict(),
10317
+ z24.object({
10318
+ kind: z24.literal("flush-panel"),
10319
+ treatment: z24.enum(userFlushTreatments),
10320
+ bleed: z24.enum(userFlushBleeds)
10321
+ }).strict()
10322
+ ]);
10323
+ var blockDesignPlanSchema = z24.object({
10324
+ blockId: z24.string().min(1).transform(asDesignBlockId),
10325
+ blockKind: z24.string().min(1),
10326
+ purpose: z24.string().min(1),
10327
+ sectionSurface: z24.enum(userDesignOptionCatalog.sectionSurfaces),
10328
+ contentFrame: contentFrameIntentSchema,
10329
+ itemSurface: z24.enum(userDesignOptionCatalog.itemSurfaces),
10330
+ transitionAfter: z24.enum(userDesignOptionCatalog.transitions),
10331
+ emphasis: z24.enum(userDesignOptionCatalog.emphases),
10332
+ heroLegibility: heroLegibilityStrategySchema.optional()
10333
+ }).strict();
10334
+ var styleAuthoritySchema = z24.discriminatedUnion("kind", [
10335
+ z24.object({
10336
+ kind: z24.literal("theme-v2"),
10337
+ source: designResolutionPolicySchema,
10338
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
10339
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
10340
+ templateVersion: z24.number().int().nonnegative(),
10341
+ resolverVersion: z24.number().int().nonnegative()
10342
+ }).strict(),
10343
+ z24.object({
10344
+ kind: z24.literal("legacy-raw"),
10345
+ reason: z24.enum(["pre-theme-v2", "manual-runtime-fields"])
10346
+ }).strict(),
10347
+ z24.object({
10348
+ kind: z24.literal("advanced-detached"),
10349
+ reason: z24.literal("detached-custom-runtime-fields")
10350
+ }).strict()
10351
+ ]);
10352
+ var blockRuntimeStyleAuthoritySchema = z24.object({
10353
+ unit: z24.literal("block-runtime-fields"),
10354
+ blockId: z24.string().min(1).transform(asDesignBlockId),
10355
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
10356
+ authority: styleAuthoritySchema
10357
+ }).strict();
10358
+ var persistedPageDesignStateV1Schema = z24.object({
10359
+ schemaVersion: z24.literal(themeV2DesignStateSchemaVersion),
10360
+ siteStyleId: z24.string().min(1).transform(asSiteStyleId),
10361
+ templateId: z24.string().min(1).transform(asDesignSystemTemplateId),
10362
+ templateVersion: z24.number().int().nonnegative(),
10363
+ resolverVersion: z24.number().int().nonnegative(),
10364
+ rhythmPresetId: z24.string().min(1),
10365
+ blocks: z24.array(blockDesignPlanSchema),
10366
+ styleAuthorities: z24.array(blockRuntimeStyleAuthoritySchema)
10367
+ }).strict();
10368
+
10369
+ // ../theme-core/src/site-styles/generatedSchemas.ts
10370
+ import { z as z25 } from "zod";
10371
+ function uniqueNonEmpty2(values) {
10372
+ const uniqueValues = [...new Set(values)];
10373
+ const firstValue = uniqueValues[0];
10374
+ if (!firstValue) {
10375
+ throw new Error("Expected at least one generated schema option.");
10376
+ }
10377
+ return [firstValue, ...uniqueValues.slice(1)];
10378
+ }
10379
+ var generatedPanelTreatments = uniqueNonEmpty2(
10380
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
10482
10381
  );
10382
+ var generatedFlushTreatments = uniqueNonEmpty2(
10383
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
10384
+ );
10385
+ var generatedFlushBleeds = uniqueNonEmpty2(
10386
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
10387
+ );
10388
+ var generatedPanelFrameSchema = z25.object({
10389
+ kind: z25.literal("panel"),
10390
+ treatment: z25.enum(generatedPanelTreatments)
10391
+ }).strict();
10392
+ var generatedFlushPanelFrameSchema = z25.object({
10393
+ kind: z25.literal("flush-panel"),
10394
+ treatment: z25.enum(generatedFlushTreatments),
10395
+ bleed: z25.enum(generatedFlushBleeds)
10396
+ }).strict();
10397
+ var generatedContentFrameIntentSchema = z25.discriminatedUnion("kind", [
10398
+ z25.object({ kind: z25.literal("plain") }).strict(),
10399
+ generatedPanelFrameSchema,
10400
+ generatedFlushPanelFrameSchema
10401
+ ]);
10402
+ var generatedSiteStyleIdSchema = z25.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
10403
+ function generatedChoiceSchema(valueSchema) {
10404
+ return z25.discriminatedUnion("kind", [
10405
+ z25.object({
10406
+ source: z25.literal("generated"),
10407
+ kind: z25.literal("auto")
10408
+ }).strict(),
10409
+ z25.object({
10410
+ source: z25.literal("generated"),
10411
+ kind: z25.literal("explicit"),
10412
+ value: valueSchema
10413
+ }).strict()
10414
+ ]);
10415
+ }
10416
+ var generatedBlockDesignIntentSchema = z25.object({
10417
+ sectionSurface: generatedChoiceSchema(
10418
+ z25.enum(generatedDesignOptionCatalog.sectionSurfaces)
10419
+ ),
10420
+ contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
10421
+ itemSurface: generatedChoiceSchema(
10422
+ z25.enum(generatedDesignOptionCatalog.itemSurfaces)
10423
+ ),
10424
+ transitionAfter: generatedChoiceSchema(
10425
+ z25.enum(generatedDesignOptionCatalog.transitions)
10426
+ ),
10427
+ emphasis: generatedChoiceSchema(
10428
+ z25.enum(generatedDesignOptionCatalog.emphases)
10429
+ )
10430
+ }).strict();
10431
+ var generatedMediaCompositionIntentSchema = z25.enum([
10432
+ "none",
10433
+ "supporting",
10434
+ "dominant"
10435
+ ]);
10436
+ var generatedDecorativeCompositionIntentSchema = z25.enum([
10437
+ "none",
10438
+ "supporting"
10439
+ ]);
10440
+ var generatedHeroLegibilityStrategySchema = z25.enum([
10441
+ "none",
10442
+ "scrim-gradient"
10443
+ ]);
10444
+ var generatedBlockMediaIntentSchema = z25.object({
10445
+ media: generatedMediaCompositionIntentSchema,
10446
+ decorative: generatedDecorativeCompositionIntentSchema,
10447
+ heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
10448
+ }).strict();
10449
+ var generatedBoundaryIntentSchema = z25.object({
10450
+ transitionAfter: generatedChoiceSchema(
10451
+ z25.enum(generatedDesignOptionCatalog.transitions)
10452
+ )
10453
+ }).strict();
10454
+ var generatedPageDesignBlockIntentSchema = z25.object({
10455
+ blockId: z25.string().min(1),
10456
+ blockKind: z25.string().min(1),
10457
+ purpose: z25.string().min(1),
10458
+ design: generatedBlockDesignIntentSchema,
10459
+ mediaIntent: generatedBlockMediaIntentSchema,
10460
+ boundaryIntent: generatedBoundaryIntentSchema
10461
+ }).strict();
10462
+ var generatedPageDesignIntentSchema = z25.object({
10463
+ siteStyleId: generatedSiteStyleIdSchema,
10464
+ blocks: z25.array(generatedPageDesignBlockIntentSchema)
10465
+ }).strict();
10466
+
10467
+ // ../theme-core/src/site-styles/pageDesignIntent.ts
10468
+ import { z as z26 } from "zod";
10469
+ var pageDesignIntentSchemaVersion = 1;
10470
+ var pageDesignUserPinnedAppearanceChoiceSchema = z26.object({
10471
+ kind: z26.literal("user-pinned"),
10472
+ value: z26.string().min(1).transform(asAppearancePresetId)
10473
+ }).strict();
10474
+ var pageDesignUserPinnedBoundaryChoiceSchema = z26.object({
10475
+ kind: z26.literal("user-pinned"),
10476
+ value: z26.string().min(1).transform(asBoundaryOptionId)
10477
+ }).strict();
10478
+ var pageDesignBlockLookPinSchema = z26.object({
10479
+ blockId: z26.string().min(1).transform(asDesignBlockId),
10480
+ blockKind: z26.string().min(1),
10481
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
10482
+ }).strict();
10483
+ var pageDesignBoundaryPinSchema = z26.object({
10484
+ boundaryId: z26.string().min(1).transform(asDesignBoundaryId),
10485
+ previousBlockId: z26.string().min(1).transform(asDesignBlockId),
10486
+ nextBlockId: z26.string().min(1).transform(asDesignBlockId),
10487
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
10488
+ }).strict().superRefine((pin, ctx) => {
10489
+ const expectedBoundaryId = makeBoundaryId(
10490
+ pin.previousBlockId,
10491
+ pin.nextBlockId
10492
+ );
10493
+ if (pin.boundaryId !== expectedBoundaryId) {
10494
+ ctx.addIssue({
10495
+ code: z26.ZodIssueCode.custom,
10496
+ path: ["boundaryId"],
10497
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
10498
+ });
10499
+ }
10500
+ });
10501
+ var pageDesignIntentV1Schema = z26.object({
10502
+ schemaVersion: z26.literal(pageDesignIntentSchemaVersion),
10503
+ siteStyleId: z26.string().min(1).transform(asSiteStyleId),
10504
+ pageFlowPresetId: z26.string().min(1).transform(asPageFlowPresetId),
10505
+ blockLookPins: z26.array(pageDesignBlockLookPinSchema),
10506
+ boundaryPins: z26.array(pageDesignBoundaryPinSchema)
10507
+ }).strict().superRefine((intent, ctx) => {
10508
+ addDuplicateStringIssues(ctx, {
10509
+ values: intent.blockLookPins.map((pin) => pin.blockId),
10510
+ path: ["blockLookPins"],
10511
+ label: "block Look pin"
10512
+ });
10513
+ addDuplicateStringIssues(ctx, {
10514
+ values: intent.boundaryPins.map(
10515
+ (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
10516
+ ),
10517
+ path: ["boundaryPins"],
10518
+ label: "boundary pin"
10519
+ });
10520
+ });
10521
+ function addDuplicateStringIssues(ctx, input) {
10522
+ const seen = /* @__PURE__ */ new Set();
10523
+ const duplicates = /* @__PURE__ */ new Set();
10524
+ for (const value of input.values) {
10525
+ if (seen.has(value)) {
10526
+ duplicates.add(value);
10527
+ }
10528
+ seen.add(value);
10529
+ }
10530
+ for (const duplicate of duplicates) {
10531
+ ctx.addIssue({
10532
+ code: z26.ZodIssueCode.custom,
10533
+ path: [...input.path],
10534
+ message: `Duplicate ${input.label}: ${duplicate}.`
10535
+ });
10536
+ }
10537
+ }
10538
+ function boundaryKey(previousBlockId, nextBlockId) {
10539
+ return makeBoundaryId(previousBlockId, nextBlockId);
10540
+ }
10483
10541
 
10484
10542
  // ../theme-core/src/site-styles/runtimeCompiler.ts
10485
10543
  function defineDesignRuntimeRules(rules) {
@@ -11824,7 +11882,8 @@ function ctaButton(opts) {
11824
11882
  },
11825
11883
  size: {
11826
11884
  $bind: {
11827
- from: sizePath
11885
+ from: sizePath,
11886
+ fallback: opts?.sizeFallback ?? "md"
11828
11887
  }
11829
11888
  },
11830
11889
  ...opts?.className ? { className: opts.className } : {},
@@ -17853,14 +17912,16 @@ var headerCta = ctaButton({
17853
17912
  whenPath: "menu.ctaItem.label",
17854
17913
  variantPath: "menu.ctaItem.variant",
17855
17914
  linkPath: "menu.ctaItem.link",
17856
- className: `header-cta btn-sm ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
17915
+ sizeFallback: "sm",
17916
+ className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
17857
17917
  });
17858
17918
  var mobileCta = ctaButton({
17859
17919
  basePath: "menu.ctaItem",
17860
17920
  whenPath: "menu.ctaItem.label",
17861
17921
  variantPath: "menu.ctaItem.variant",
17862
17922
  linkPath: "menu.ctaItem.link",
17863
- className: "nav-mobile-cta btn-md rb-w-full"
17923
+ sizeFallback: "md",
17924
+ className: "nav-mobile-cta rb-w-full"
17864
17925
  });
17865
17926
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
17866
17927
  {