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