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