@riverbankcms/sdk 0.60.1 → 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 (97) hide show
  1. package/dist/_dts/api/src/bookingRecords.d.ts +7 -0
  2. package/dist/_dts/api/src/bookingVerticals.d.ts +1 -0
  3. package/dist/_dts/api/src/communications.d.ts +1 -0
  4. package/dist/_dts/api/src/contentRuntime.d.ts +8 -0
  5. package/dist/_dts/api/src/endpoints.d.ts +17 -0
  6. package/dist/_dts/api/src/index.d.ts +1 -1
  7. package/dist/_dts/api/src/media.d.ts +1 -1
  8. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +10 -2
  9. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +26 -1
  10. package/dist/_dts/api/src/siteSettings.d.ts +7 -0
  11. package/dist/_dts/api/src/types.d.ts +1 -1
  12. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +3 -0
  13. package/dist/_dts/blocks/src/system/blocks/site-footer.d.ts +1 -0
  14. package/dist/_dts/blocks/src/system/node/fragments/ctaButton.d.ts +2 -0
  15. package/dist/_dts/blocks/src/system/runtime/nodes/location-map.server.d.ts +4 -0
  16. package/dist/_dts/blocks/src/system/runtime/nodes/location-map.shared.d.ts +38 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/location-map.view.d.ts +2 -1
  18. package/dist/_dts/blocks/src/system/runtime/shared/themedButtonClass.d.ts +11 -0
  19. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +10 -2
  20. package/dist/_dts/core/src/business-address.d.ts +38 -0
  21. package/dist/_dts/core/src/index.d.ts +1 -0
  22. package/dist/_dts/core/src/participants.d.ts +32 -1
  23. package/dist/_dts/core/src/rectification.d.ts +79 -0
  24. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +28 -6
  25. package/dist/_dts/preview-next/src/client/blocks/runOptimisticCustomizeAction.d.ts +44 -0
  26. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +7 -1
  27. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +12 -1
  28. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +6 -1
  29. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +20 -0
  30. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +101 -0
  31. package/dist/_dts/sdk/src/client/types.d.ts +1 -0
  32. package/dist/_dts/sdk/src/public-api/contracts.d.ts +11 -1
  33. package/dist/_dts/sdk/src/version.d.ts +1 -1
  34. package/dist/_dts/theme-core/src/buttons/constants.d.ts +9 -1
  35. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +16 -11
  36. package/dist/_dts/theme-core/src/buttons/generateDefaultButtonSystem.d.ts +9 -16
  37. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  38. package/dist/_dts/theme-core/src/buttons/personalities/brushed-wash.d.ts +16 -0
  39. package/dist/_dts/theme-core/src/buttons/personalities/confident-chip.d.ts +16 -0
  40. package/dist/_dts/theme-core/src/buttons/personalities/editorial-link.d.ts +16 -0
  41. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +95 -0
  42. package/dist/_dts/theme-core/src/buttons/personalities/ink-stamp.d.ts +16 -0
  43. package/dist/_dts/theme-core/src/buttons/personalities/pebble.d.ts +16 -0
  44. package/dist/_dts/theme-core/src/buttons/personalities/soft-pill.d.ts +16 -0
  45. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +268 -0
  46. package/dist/_dts/theme-core/src/buttons/types.d.ts +253 -72
  47. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +69 -15
  48. package/dist/_dts/theme-core/src/palette/index.d.ts +1 -0
  49. package/dist/_dts/theme-core/src/palette/variants/brand-led.d.ts +52 -0
  50. package/dist/_dts/theme-core/src/palette/variants/high-contrast.d.ts +52 -0
  51. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +213 -0
  52. package/dist/_dts/theme-core/src/palette/variants/soft-natural.d.ts +52 -0
  53. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +154 -0
  54. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +52 -0
  55. package/dist/_dts/theme-core/src/schema.d.ts +122 -10
  56. package/dist/_dts/theme-core/src/site-styles/curatedChoices.d.ts +27 -0
  57. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +48 -1
  58. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  59. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +4 -0
  60. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +42 -3
  61. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +23 -1
  62. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +46 -0
  63. package/dist/_dts/ui/src/badge.d.ts +1 -1
  64. package/dist/_dts/ui/src/callout.d.ts +1 -1
  65. package/dist/_dts/ui/src/palette/ColorChooserDialog.d.ts +47 -0
  66. package/dist/_dts/ui/src/palette/ColorSlotButton.d.ts +15 -0
  67. package/dist/_dts/ui/src/palette/ColorSwatchButton.d.ts +15 -0
  68. package/dist/_dts/ui/src/palette/PaletteTokenEditor.d.ts +50 -0
  69. package/dist/_dts/ui/src/palette/hex.d.ts +23 -0
  70. package/dist/_dts/ui/src/palette/index.d.ts +14 -0
  71. package/dist/cli/index.mjs +2255 -947
  72. package/dist/client/bookings.mjs +294 -144
  73. package/dist/client/client.mjs +4053 -2600
  74. package/dist/client/hooks.mjs +3248 -2076
  75. package/dist/client/rendering/client.mjs +3377 -2165
  76. package/dist/client/rendering/islands.mjs +1911 -736
  77. package/dist/client/rendering.mjs +41897 -40445
  78. package/dist/preview-next/before-render.mjs +17 -0
  79. package/dist/preview-next/client/runtime.mjs +13511 -11313
  80. package/dist/preview-next/middleware.mjs +17 -0
  81. package/dist/server/components.mjs +4434 -3172
  82. package/dist/server/config-validation.mjs +3479 -2307
  83. package/dist/server/config.mjs +3479 -2307
  84. package/dist/server/data.mjs +3248 -2076
  85. package/dist/server/index.mjs +21 -3
  86. package/dist/server/next.mjs +3989 -2726
  87. package/dist/server/page-converter.mjs +3393 -2238
  88. package/dist/server/prebuild.mjs +1 -1
  89. package/dist/server/rendering/server.mjs +4434 -3172
  90. package/dist/server/rendering.mjs +4434 -3172
  91. package/dist/server/routing.mjs +3582 -2274
  92. package/dist/server/server.mjs +3252 -2079
  93. package/dist/server/theme-bridge.mjs +1454 -496
  94. package/dist/server/theme.mjs +1102 -505
  95. package/package.json +1 -1
  96. package/dist/_dts/preview-next/src/client/preview/PreviewSiteStyleSwitcher.d.ts +0 -11
  97. package/dist/_dts/preview-next/src/client/preview/PreviewSiteStyleSwitcher.state.d.ts +0 -43
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import z39, { z, ZodError } from 'zod';
2
+ import z42, { z, ZodError } from 'zod';
3
3
  import 'react/jsx-runtime';
4
4
  import { createJiti } from 'jiti';
5
5
  import * as path3 from 'path';
@@ -137,6 +137,12 @@ var init_location = __esm({
137
137
  }
138
138
  });
139
139
 
140
+ // ../core/src/business-address.ts
141
+ var init_business_address = __esm({
142
+ "../core/src/business-address.ts"() {
143
+ }
144
+ });
145
+
140
146
  // ../core/src/assert-never.ts
141
147
  var init_assert_never = __esm({
142
148
  "../core/src/assert-never.ts"() {
@@ -185,6 +191,7 @@ var init_assertNever = __esm({
185
191
  // ../core/src/participants.ts
186
192
  var init_participants = __esm({
187
193
  "../core/src/participants.ts"() {
194
+ init_branded();
188
195
  init_result();
189
196
  }
190
197
  });
@@ -211,6 +218,7 @@ var init_src = __esm({
211
218
  init_person_records();
212
219
  init_rectification();
213
220
  init_location();
221
+ init_business_address();
214
222
  init_result();
215
223
  init_assert_never();
216
224
  init_try_async();
@@ -1523,6 +1531,774 @@ var init_typeGuards = __esm({
1523
1531
  "../blocks/src/lib/typeGuards.ts"() {
1524
1532
  }
1525
1533
  });
1534
+ var VARIANT_ROLES, cornerStyleSchema, shadowSizeSchema, textTransformSchema, fontWeightSchema, buttonTypographySchema, letterSpacingSchema, hoverTransformSchema, hoverColorSchema, buttonPaddingPresetSchema, gradientStyleSchema, gradientSharpnessSchema, prioritySchema, buttonSizeNameSchema, PADDING_TOKEN_PATTERN, paddingShorthandSchema, buttonSizeConfigSchema, buttonSizesSchema, buttonGlobalSettingsSchema, gradientDirectionSchema, buttonBackgroundSchema, effectApplicationSchema, buttonBorderSchema, variantShadowSchema, variantEffectsSchema, variantSizeOverridesSchema, buttonVariantSchema, buttonSystemSchema;
1535
+ var init_types2 = __esm({
1536
+ "../theme-core/src/buttons/types.ts"() {
1537
+ VARIANT_ROLES = [
1538
+ "primary",
1539
+ "secondary",
1540
+ "outline",
1541
+ "ghost",
1542
+ "link",
1543
+ "tertiary",
1544
+ "accent"
1545
+ ];
1546
+ cornerStyleSchema = z.enum(["square", "rounded", "pill"]);
1547
+ shadowSizeSchema = z.enum(["none", "low", "medium", "high"]);
1548
+ textTransformSchema = z.enum(["none", "uppercase", "lowercase", "capitalize"]);
1549
+ fontWeightSchema = z.union([z.literal(500), z.literal(600), z.literal(700)]);
1550
+ buttonTypographySchema = z.enum(["body", "heading"]);
1551
+ letterSpacingSchema = z.enum(["tight", "normal", "loose"]);
1552
+ hoverTransformSchema = z.enum(["none", "lift", "scale", "press"]);
1553
+ hoverColorSchema = z.enum(["none", "brighten", "darken", "saturate", "token"]);
1554
+ buttonPaddingPresetSchema = z.enum(["compact", "default", "spacious"]);
1555
+ gradientStyleSchema = z.enum(["linear", "radial", "conic"]);
1556
+ gradientSharpnessSchema = z.enum(["smooth", "medium", "hard"]);
1557
+ prioritySchema = z.union([z.literal(1), z.literal(2), z.literal(3)]);
1558
+ z.enum(VARIANT_ROLES);
1559
+ buttonSizeNameSchema = z.enum(["sm", "md", "lg", "xl"]);
1560
+ PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
1561
+ paddingShorthandSchema = z.string().refine(
1562
+ (value) => {
1563
+ const parts = value.split(/\s+/).filter(Boolean);
1564
+ return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
1565
+ },
1566
+ {
1567
+ message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
1568
+ }
1569
+ );
1570
+ buttonSizeConfigSchema = z.object({
1571
+ padding: paddingShorthandSchema,
1572
+ fontSize: z.string().optional()
1573
+ });
1574
+ buttonSizesSchema = z.object({
1575
+ sm: buttonSizeConfigSchema,
1576
+ md: buttonSizeConfigSchema,
1577
+ lg: buttonSizeConfigSchema,
1578
+ xl: buttonSizeConfigSchema.optional()
1579
+ }).transform(({ sm, md, lg, xl }) => ({
1580
+ sm,
1581
+ md,
1582
+ lg,
1583
+ xl: xl ?? lg
1584
+ }));
1585
+ buttonGlobalSettingsSchema = z.object({
1586
+ cornerStyle: cornerStyleSchema,
1587
+ cornerRadius: z.number().min(0).max(24).optional(),
1588
+ shadow: shadowSizeSchema,
1589
+ textTransform: textTransformSchema,
1590
+ fontWeight: fontWeightSchema,
1591
+ /**
1592
+ * @deprecated Set per-variant via `variant.border.widthClass` instead.
1593
+ * Schema field is preserved so existing presets parse; the value is unread
1594
+ * by the current generator and will be removed once the legacy
1595
+ * `primitives/content/components/Button.tsx` slot exports are deleted.
1596
+ */
1597
+ borderWidth: z.union([z.literal(1), z.literal(2), z.literal(3)]),
1598
+ // === Family-level typography ===
1599
+ // Typography source (body or heading) — selects which theme typography pool to inherit
1600
+ typography: buttonTypographySchema.optional(),
1601
+ // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
1602
+ // Sized variants get this as default; fixed variants inherit unless they override.
1603
+ // Size class CSS may still override at run time for sized variants.
1604
+ fontSize: z.string().optional(),
1605
+ // Letter spacing applied to all variants
1606
+ letterSpacing: letterSpacingSchema.optional(),
1607
+ // Italic style
1608
+ italic: z.boolean().optional(),
1609
+ // Padding preset (applies to sized variants without a sizes config)
1610
+ paddingPreset: buttonPaddingPresetSchema.optional(),
1611
+ hoverTransform: hoverTransformSchema,
1612
+ hoverColor: hoverColorSchema,
1613
+ // When hoverColor is 'token', this specifies which token to use
1614
+ hoverColorToken: z.string().optional(),
1615
+ // Gradient settings (if any variant uses gradients)
1616
+ gradientStyle: gradientStyleSchema.optional(),
1617
+ gradientAngle: z.number().min(0).max(360).optional(),
1618
+ gradientSharpness: gradientSharpnessSchema.optional()
1619
+ });
1620
+ gradientDirectionSchema = z.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
1621
+ buttonBackgroundSchema = z.discriminatedUnion("type", [
1622
+ z.object({ type: z.literal("solid"), colorToken: z.string() }),
1623
+ z.object({
1624
+ type: z.literal("gradient"),
1625
+ stops: z.array(z.string()).min(2),
1626
+ direction: gradientDirectionSchema
1627
+ }),
1628
+ z.object({ type: z.literal("transparent") })
1629
+ ]);
1630
+ effectApplicationSchema = z.object({
1631
+ effectId: z.string(),
1632
+ options: z.record(z.string(), z.any()).optional()
1633
+ });
1634
+ buttonBorderSchema = z.object({
1635
+ widthClass: z.string(),
1636
+ colorToken: z.string()
1637
+ });
1638
+ variantShadowSchema = z.object({
1639
+ elevation: z.enum(["none", "low", "medium", "high"]),
1640
+ softness: z.enum(["crisp", "soft", "hard"]).nullable(),
1641
+ position: z.enum(["bottom", "bottom-right"]).default("bottom")
1642
+ });
1643
+ variantEffectsSchema = z.object({
1644
+ base: z.array(effectApplicationSchema).optional(),
1645
+ hover: z.array(effectApplicationSchema).optional(),
1646
+ active: z.array(effectApplicationSchema).optional(),
1647
+ focus: z.array(effectApplicationSchema).optional()
1648
+ });
1649
+ variantSizeOverridesSchema = z.object({
1650
+ sm: buttonSizeConfigSchema.optional(),
1651
+ md: buttonSizeConfigSchema.optional(),
1652
+ lg: buttonSizeConfigSchema.optional(),
1653
+ xl: buttonSizeConfigSchema.optional()
1654
+ });
1655
+ buttonVariantSchema = z.object({
1656
+ id: z.string(),
1657
+ name: z.string().min(1).max(20),
1658
+ enabled: z.boolean(),
1659
+ priority: prioritySchema,
1660
+ // Base appearance (token-based)
1661
+ background: buttonBackgroundSchema,
1662
+ textColorToken: z.string(),
1663
+ /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
1664
+ borderRadius: z.string().optional(),
1665
+ // Optional shadow override (uses theme.shadow if not specified)
1666
+ shadow: variantShadowSchema.optional(),
1667
+ // Border (optional)
1668
+ border: buttonBorderSchema.optional(),
1669
+ // Hover background token (per-variant override, takes precedence over global hoverColorToken)
1670
+ hoverBackgroundToken: z.string().optional(),
1671
+ // Effect composition
1672
+ effects: variantEffectsSchema.optional(),
1673
+ // Per-variant size overrides — see VariantSizeOverrides
1674
+ sizes: variantSizeOverridesSchema.optional()
1675
+ });
1676
+ buttonSystemSchema = z.object({
1677
+ global: buttonGlobalSettingsSchema,
1678
+ variants: z.array(buttonVariantSchema).min(1).max(6),
1679
+ sizes: buttonSizesSchema.optional()
1680
+ });
1681
+ }
1682
+ });
1683
+ var STYLE_AXIS_VALUES, styleTagsSchema;
1684
+ var init_styleTags = __esm({
1685
+ "../theme-core/src/site-styles/styleTags.ts"() {
1686
+ STYLE_AXIS_VALUES = {
1687
+ tone: ["minimal", "classic", "bold"],
1688
+ energy: ["calm", "vibrant"],
1689
+ motion: ["subtle", "standard", "expressive"],
1690
+ era: ["editorial", "modern", "organic", "technical", "retro"]
1691
+ };
1692
+ styleTagsSchema = z.object({
1693
+ tone: z.enum(STYLE_AXIS_VALUES.tone).optional(),
1694
+ energy: z.enum(STYLE_AXIS_VALUES.energy).optional(),
1695
+ motion: z.enum(STYLE_AXIS_VALUES.motion).optional(),
1696
+ era: z.enum(STYLE_AXIS_VALUES.era).optional()
1697
+ });
1698
+ }
1699
+ });
1700
+ function asButtonPersonalityId(value) {
1701
+ if (value.length === 0) {
1702
+ throw new Error("ButtonPersonalityId must be a non-empty string");
1703
+ }
1704
+ return value;
1705
+ }
1706
+ function defineButtonPersonality(input) {
1707
+ return {
1708
+ id: asButtonPersonalityId(input.id),
1709
+ name: input.name,
1710
+ description: input.description,
1711
+ tags: input.tags,
1712
+ buttonSystem: input.buttonSystem
1713
+ };
1714
+ }
1715
+ var buttonPersonalityIdSchema;
1716
+ var init_types3 = __esm({
1717
+ "../theme-core/src/buttons/personalities/types.ts"() {
1718
+ init_types2();
1719
+ init_styleTags();
1720
+ buttonPersonalityIdSchema = z.string().min(1).transform((value) => asButtonPersonalityId(value));
1721
+ z.object({
1722
+ id: buttonPersonalityIdSchema,
1723
+ name: z.string().min(1),
1724
+ description: z.string().min(1),
1725
+ tags: styleTagsSchema,
1726
+ buttonSystem: buttonSystemSchema
1727
+ });
1728
+ }
1729
+ });
1730
+
1731
+ // ../theme-core/src/buttons/personalities/brushed-wash.ts
1732
+ var brushedWash;
1733
+ var init_brushed_wash = __esm({
1734
+ "../theme-core/src/buttons/personalities/brushed-wash.ts"() {
1735
+ init_types3();
1736
+ brushedWash = defineButtonPersonality({
1737
+ id: "brushed-wash",
1738
+ name: "Brushed Wash",
1739
+ description: "Watercolour-gradient buttons with soft shadows and generous padding.",
1740
+ tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
1741
+ buttonSystem: {
1742
+ global: {
1743
+ cornerStyle: "rounded",
1744
+ shadow: "low",
1745
+ textTransform: "none",
1746
+ fontWeight: 500,
1747
+ borderWidth: 1,
1748
+ hoverTransform: "none",
1749
+ hoverColor: "none"
1750
+ },
1751
+ sizes: {
1752
+ sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
1753
+ md: { padding: "1rem 2.5rem" },
1754
+ lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
1755
+ xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
1756
+ },
1757
+ variants: [
1758
+ {
1759
+ id: "primary",
1760
+ name: "Primary",
1761
+ enabled: true,
1762
+ priority: 1,
1763
+ background: {
1764
+ type: "gradient",
1765
+ stops: ["primary", "accent"],
1766
+ direction: "to-r"
1767
+ },
1768
+ textColorToken: "primaryForeground",
1769
+ borderRadius: "rounded-lg",
1770
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
1771
+ effects: {
1772
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
1773
+ }
1774
+ },
1775
+ {
1776
+ id: "secondary",
1777
+ name: "Secondary",
1778
+ enabled: true,
1779
+ priority: 2,
1780
+ background: {
1781
+ type: "gradient",
1782
+ stops: ["secondary", "accent"],
1783
+ direction: "to-br"
1784
+ },
1785
+ textColorToken: "primaryForeground",
1786
+ borderRadius: "rounded-lg",
1787
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
1788
+ effects: {
1789
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
1790
+ }
1791
+ },
1792
+ {
1793
+ id: "outline",
1794
+ name: "Outline",
1795
+ enabled: true,
1796
+ priority: 3,
1797
+ background: { type: "transparent" },
1798
+ textColorToken: "primary",
1799
+ borderRadius: "rounded-lg",
1800
+ border: { widthClass: "border", colorToken: "primary" },
1801
+ effects: {
1802
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
1803
+ }
1804
+ },
1805
+ {
1806
+ id: "ghost",
1807
+ name: "Ghost",
1808
+ enabled: true,
1809
+ priority: 3,
1810
+ background: { type: "transparent" },
1811
+ textColorToken: "text",
1812
+ borderRadius: "rounded-lg",
1813
+ effects: {
1814
+ hover: [
1815
+ { effectId: "background-on-hover", options: { colorToken: "surface" } }
1816
+ ]
1817
+ }
1818
+ }
1819
+ ]
1820
+ }
1821
+ });
1822
+ }
1823
+ });
1824
+
1825
+ // ../theme-core/src/buttons/personalities/confident-chip.ts
1826
+ var confidentChip;
1827
+ var init_confident_chip = __esm({
1828
+ "../theme-core/src/buttons/personalities/confident-chip.ts"() {
1829
+ init_types3();
1830
+ confidentChip = defineButtonPersonality({
1831
+ id: "confident-chip",
1832
+ name: "Confident Chip",
1833
+ description: "Mid-radius solid buttons with a crisp hover.",
1834
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
1835
+ buttonSystem: {
1836
+ global: {
1837
+ cornerStyle: "rounded",
1838
+ shadow: "medium",
1839
+ textTransform: "none",
1840
+ fontWeight: 600,
1841
+ borderWidth: 1,
1842
+ hoverTransform: "none",
1843
+ hoverColor: "none"
1844
+ },
1845
+ variants: [
1846
+ {
1847
+ id: "primary",
1848
+ name: "Primary",
1849
+ enabled: true,
1850
+ priority: 1,
1851
+ background: { type: "solid", colorToken: "primary" },
1852
+ textColorToken: "primaryForeground",
1853
+ borderRadius: "rounded-md",
1854
+ shadow: { elevation: "medium", softness: "soft", position: "bottom" },
1855
+ effects: {
1856
+ hover: [{ effectId: "darken-background", options: { amount: 60 } }],
1857
+ active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
1858
+ }
1859
+ },
1860
+ {
1861
+ id: "secondary",
1862
+ name: "Secondary",
1863
+ enabled: true,
1864
+ priority: 2,
1865
+ background: { type: "solid", colorToken: "surface" },
1866
+ textColorToken: "text",
1867
+ borderRadius: "rounded-md",
1868
+ border: { widthClass: "border", colorToken: "border" },
1869
+ effects: {
1870
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
1871
+ }
1872
+ },
1873
+ {
1874
+ id: "outline",
1875
+ name: "Outline",
1876
+ enabled: true,
1877
+ priority: 3,
1878
+ background: { type: "transparent" },
1879
+ textColorToken: "primary",
1880
+ borderRadius: "rounded-md",
1881
+ border: { widthClass: "border", colorToken: "primary" },
1882
+ effects: {
1883
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
1884
+ }
1885
+ },
1886
+ {
1887
+ id: "ghost",
1888
+ name: "Ghost",
1889
+ enabled: true,
1890
+ priority: 3,
1891
+ background: { type: "transparent" },
1892
+ textColorToken: "primary",
1893
+ borderRadius: "rounded-md",
1894
+ effects: {
1895
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
1896
+ }
1897
+ }
1898
+ ]
1899
+ }
1900
+ });
1901
+ }
1902
+ });
1903
+
1904
+ // ../theme-core/src/buttons/personalities/editorial-link.ts
1905
+ var editorialLink;
1906
+ var init_editorial_link = __esm({
1907
+ "../theme-core/src/buttons/personalities/editorial-link.ts"() {
1908
+ init_types3();
1909
+ editorialLink = defineButtonPersonality({
1910
+ id: "editorial-link",
1911
+ name: "Editorial Link",
1912
+ description: "Link-style with a growing underline. Refined, typographic.",
1913
+ tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
1914
+ buttonSystem: {
1915
+ global: {
1916
+ cornerStyle: "square",
1917
+ shadow: "none",
1918
+ textTransform: "none",
1919
+ fontWeight: 500,
1920
+ borderWidth: 1,
1921
+ hoverTransform: "none",
1922
+ hoverColor: "none"
1923
+ },
1924
+ variants: [
1925
+ {
1926
+ id: "primary",
1927
+ name: "Primary",
1928
+ enabled: true,
1929
+ priority: 1,
1930
+ background: { type: "transparent" },
1931
+ textColorToken: "text",
1932
+ borderRadius: "rounded-none",
1933
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1934
+ sizes: {
1935
+ sm: { padding: "0.25rem 0" },
1936
+ md: { padding: "0.5rem 0" },
1937
+ lg: { padding: "0.625rem 0" },
1938
+ xl: { padding: "0.75rem 0" }
1939
+ },
1940
+ effects: {
1941
+ base: [
1942
+ { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
1943
+ ]
1944
+ }
1945
+ },
1946
+ {
1947
+ id: "secondary",
1948
+ name: "Secondary",
1949
+ enabled: true,
1950
+ priority: 2,
1951
+ background: { type: "transparent" },
1952
+ textColorToken: "mutedText",
1953
+ borderRadius: "rounded-none",
1954
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1955
+ sizes: {
1956
+ sm: { padding: "0.25rem 0" },
1957
+ md: { padding: "0.5rem 0" },
1958
+ lg: { padding: "0.625rem 0" },
1959
+ xl: { padding: "0.75rem 0" }
1960
+ },
1961
+ effects: {
1962
+ base: [
1963
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
1964
+ ]
1965
+ }
1966
+ },
1967
+ {
1968
+ id: "outline",
1969
+ name: "Outline",
1970
+ enabled: true,
1971
+ priority: 3,
1972
+ background: { type: "transparent" },
1973
+ textColorToken: "accent",
1974
+ borderRadius: "rounded-none",
1975
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1976
+ sizes: {
1977
+ sm: { padding: "0.25rem 0" },
1978
+ md: { padding: "0.5rem 0" },
1979
+ lg: { padding: "0.625rem 0" },
1980
+ xl: { padding: "0.75rem 0" }
1981
+ },
1982
+ effects: {
1983
+ base: [
1984
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
1985
+ ]
1986
+ }
1987
+ },
1988
+ {
1989
+ id: "ghost",
1990
+ name: "Ghost",
1991
+ enabled: true,
1992
+ priority: 3,
1993
+ background: { type: "transparent" },
1994
+ textColorToken: "mutedText",
1995
+ borderRadius: "rounded-none",
1996
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1997
+ sizes: {
1998
+ sm: { padding: "0.25rem 0" },
1999
+ md: { padding: "0.5rem 0" },
2000
+ lg: { padding: "0.625rem 0" },
2001
+ xl: { padding: "0.75rem 0" }
2002
+ },
2003
+ effects: {
2004
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
2005
+ }
2006
+ }
2007
+ ]
2008
+ }
2009
+ });
2010
+ }
2011
+ });
2012
+
2013
+ // ../theme-core/src/buttons/personalities/ink-stamp.ts
2014
+ var inkStamp;
2015
+ var init_ink_stamp = __esm({
2016
+ "../theme-core/src/buttons/personalities/ink-stamp.ts"() {
2017
+ init_types3();
2018
+ inkStamp = defineButtonPersonality({
2019
+ id: "ink-stamp",
2020
+ name: "Ink Stamp",
2021
+ description: "Hand-stamped block-print buttons with a slight lift on hover.",
2022
+ tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
2023
+ buttonSystem: {
2024
+ global: {
2025
+ cornerStyle: "rounded",
2026
+ shadow: "none",
2027
+ textTransform: "uppercase",
2028
+ fontWeight: 600,
2029
+ borderWidth: 1,
2030
+ hoverTransform: "none",
2031
+ hoverColor: "none",
2032
+ letterSpacing: "loose"
2033
+ },
2034
+ sizes: {
2035
+ sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
2036
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
2037
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
2038
+ xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
2039
+ },
2040
+ variants: [
2041
+ {
2042
+ id: "primary",
2043
+ name: "Primary",
2044
+ enabled: true,
2045
+ priority: 1,
2046
+ background: { type: "solid", colorToken: "primary" },
2047
+ textColorToken: "primaryForeground",
2048
+ borderRadius: "rounded-md",
2049
+ effects: {
2050
+ hover: [
2051
+ { effectId: "drop-shadow", options: { intensity: "medium" } },
2052
+ { effectId: "scale-up", options: { scale: "1.02" } }
2053
+ ],
2054
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
2055
+ }
2056
+ },
2057
+ {
2058
+ id: "secondary",
2059
+ name: "Secondary",
2060
+ enabled: true,
2061
+ priority: 2,
2062
+ background: { type: "transparent" },
2063
+ textColorToken: "primary",
2064
+ borderRadius: "rounded-md",
2065
+ border: { widthClass: "border-2", colorToken: "primary" },
2066
+ effects: {
2067
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2068
+ }
2069
+ },
2070
+ {
2071
+ id: "outline",
2072
+ name: "Outline",
2073
+ enabled: true,
2074
+ priority: 3,
2075
+ background: { type: "transparent" },
2076
+ textColorToken: "text",
2077
+ borderRadius: "rounded-md",
2078
+ border: { widthClass: "border-2", colorToken: "border" },
2079
+ effects: {
2080
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2081
+ }
2082
+ },
2083
+ {
2084
+ id: "ghost",
2085
+ name: "Ghost",
2086
+ enabled: true,
2087
+ priority: 3,
2088
+ background: { type: "transparent" },
2089
+ textColorToken: "accent",
2090
+ borderRadius: "rounded-none",
2091
+ sizes: {
2092
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
2093
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
2094
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
2095
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
2096
+ },
2097
+ effects: {
2098
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
2099
+ }
2100
+ }
2101
+ ]
2102
+ }
2103
+ });
2104
+ }
2105
+ });
2106
+
2107
+ // ../theme-core/src/buttons/personalities/pebble.ts
2108
+ var pebble;
2109
+ var init_pebble = __esm({
2110
+ "../theme-core/src/buttons/personalities/pebble.ts"() {
2111
+ init_types3();
2112
+ pebble = defineButtonPersonality({
2113
+ id: "pebble",
2114
+ name: "Pebble",
2115
+ description: "Generous pill buttons with a soft hover lift.",
2116
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
2117
+ buttonSystem: {
2118
+ global: {
2119
+ cornerStyle: "pill",
2120
+ shadow: "none",
2121
+ textTransform: "none",
2122
+ fontWeight: 500,
2123
+ borderWidth: 2,
2124
+ hoverTransform: "none",
2125
+ hoverColor: "none"
2126
+ },
2127
+ sizes: {
2128
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
2129
+ md: { padding: "0.875rem 2.25rem" },
2130
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
2131
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
2132
+ },
2133
+ variants: [
2134
+ {
2135
+ id: "primary",
2136
+ name: "Primary",
2137
+ enabled: true,
2138
+ priority: 1,
2139
+ background: { type: "solid", colorToken: "primary" },
2140
+ textColorToken: "primaryForeground",
2141
+ borderRadius: "rounded-full",
2142
+ effects: {
2143
+ hover: [
2144
+ { effectId: "scale-up", options: { scale: "1.03" } },
2145
+ { effectId: "drop-shadow", options: { intensity: "medium" } }
2146
+ ]
2147
+ }
2148
+ },
2149
+ {
2150
+ id: "secondary",
2151
+ name: "Secondary",
2152
+ enabled: true,
2153
+ priority: 2,
2154
+ background: { type: "transparent" },
2155
+ textColorToken: "primary",
2156
+ borderRadius: "rounded-full",
2157
+ border: { widthClass: "border-2", colorToken: "accent" },
2158
+ effects: {
2159
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
2160
+ }
2161
+ },
2162
+ {
2163
+ id: "outline",
2164
+ name: "Outline",
2165
+ enabled: true,
2166
+ priority: 3,
2167
+ background: { type: "transparent" },
2168
+ textColorToken: "text",
2169
+ borderRadius: "rounded-full",
2170
+ border: { widthClass: "border", colorToken: "border" },
2171
+ effects: {
2172
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2173
+ }
2174
+ },
2175
+ {
2176
+ id: "ghost",
2177
+ name: "Ghost",
2178
+ enabled: true,
2179
+ priority: 3,
2180
+ background: { type: "transparent" },
2181
+ textColorToken: "primary",
2182
+ borderRadius: "rounded-full",
2183
+ sizes: {
2184
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
2185
+ md: { padding: "0.5rem 1rem" },
2186
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
2187
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
2188
+ },
2189
+ effects: {
2190
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
2191
+ }
2192
+ }
2193
+ ]
2194
+ }
2195
+ });
2196
+ }
2197
+ });
2198
+
2199
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
2200
+ var softPill;
2201
+ var init_soft_pill = __esm({
2202
+ "../theme-core/src/buttons/personalities/soft-pill.ts"() {
2203
+ init_types3();
2204
+ softPill = defineButtonPersonality({
2205
+ id: "soft-pill",
2206
+ name: "Soft Pill",
2207
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
2208
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
2209
+ buttonSystem: {
2210
+ global: {
2211
+ cornerStyle: "pill",
2212
+ shadow: "low",
2213
+ textTransform: "none",
2214
+ fontWeight: 500,
2215
+ borderWidth: 2,
2216
+ hoverTransform: "lift",
2217
+ hoverColor: "none"
2218
+ },
2219
+ variants: [
2220
+ {
2221
+ id: "primary",
2222
+ name: "Primary",
2223
+ enabled: true,
2224
+ priority: 1,
2225
+ background: { type: "solid", colorToken: "primary" },
2226
+ textColorToken: "primaryForeground",
2227
+ borderRadius: "rounded-full",
2228
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
2229
+ effects: {
2230
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
2231
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
2232
+ }
2233
+ },
2234
+ {
2235
+ id: "secondary",
2236
+ name: "Secondary",
2237
+ enabled: true,
2238
+ priority: 2,
2239
+ background: { type: "transparent" },
2240
+ textColorToken: "primary",
2241
+ borderRadius: "rounded-full",
2242
+ border: { widthClass: "border-2", colorToken: "primary" },
2243
+ effects: {
2244
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2245
+ }
2246
+ },
2247
+ {
2248
+ id: "outline",
2249
+ name: "Outline",
2250
+ enabled: true,
2251
+ priority: 3,
2252
+ background: { type: "transparent" },
2253
+ textColorToken: "text",
2254
+ borderRadius: "rounded-full",
2255
+ border: { widthClass: "border", colorToken: "border" },
2256
+ effects: {
2257
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2258
+ }
2259
+ },
2260
+ {
2261
+ id: "ghost",
2262
+ name: "Ghost",
2263
+ enabled: true,
2264
+ priority: 3,
2265
+ background: { type: "transparent" },
2266
+ textColorToken: "text",
2267
+ borderRadius: "rounded-full",
2268
+ effects: {
2269
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2270
+ }
2271
+ }
2272
+ ]
2273
+ }
2274
+ });
2275
+ }
2276
+ });
2277
+
2278
+ // ../theme-core/src/buttons/personalities/index.ts
2279
+ var buttonPersonalities;
2280
+ var init_personalities = __esm({
2281
+ "../theme-core/src/buttons/personalities/index.ts"() {
2282
+ init_brushed_wash();
2283
+ init_confident_chip();
2284
+ init_editorial_link();
2285
+ init_ink_stamp();
2286
+ init_pebble();
2287
+ init_soft_pill();
2288
+ init_types3();
2289
+ buttonPersonalities = [
2290
+ softPill,
2291
+ confidentChip,
2292
+ editorialLink,
2293
+ pebble,
2294
+ inkStamp,
2295
+ brushedWash
2296
+ ];
2297
+ new Map(
2298
+ buttonPersonalities.map((p) => [p.id, p])
2299
+ );
2300
+ }
2301
+ });
1526
2302
 
1527
2303
  // ../theme-core/src/tokens/resolver.ts
1528
2304
  var init_resolver = __esm({
@@ -1639,14 +2415,48 @@ var init_generateDefaultButtonSystem = __esm({
1639
2415
  init_contrast();
1640
2416
  }
1641
2417
  });
1642
-
1643
- // ../theme-core/src/buttons/generateButtonCss.ts
1644
2418
  var init_generateButtonCss = __esm({
1645
2419
  "../theme-core/src/buttons/generateButtonCss.ts"() {
2420
+ init_types2();
1646
2421
  init_resolver();
1647
2422
  init_generateEffectsCSS();
1648
2423
  init_constants();
1649
2424
  init_generateDefaultButtonSystem();
2425
+ buttonSizeNameSchema.options;
2426
+ }
2427
+ });
2428
+
2429
+ // ../theme-core/src/buttons/presets.ts
2430
+ var init_presets = __esm({
2431
+ "../theme-core/src/buttons/presets.ts"() {
2432
+ }
2433
+ });
2434
+
2435
+ // ../theme-core/src/buttons/effects/types.ts
2436
+ var init_types4 = __esm({
2437
+ "../theme-core/src/buttons/effects/types.ts"() {
2438
+ }
2439
+ });
2440
+
2441
+ // ../theme-core/src/buttons/core.ts
2442
+ var init_core = __esm({
2443
+ "../theme-core/src/buttons/core.ts"() {
2444
+ }
2445
+ });
2446
+
2447
+ // ../theme-core/src/buttons/index.ts
2448
+ var init_buttons = __esm({
2449
+ "../theme-core/src/buttons/index.ts"() {
2450
+ init_types2();
2451
+ init_generateButtonCss();
2452
+ init_generateDefaultButtonSystem();
2453
+ init_constants();
2454
+ init_presets();
2455
+ init_personalities();
2456
+ init_types4();
2457
+ init_registry();
2458
+ init_transform();
2459
+ init_core();
1650
2460
  }
1651
2461
  });
1652
2462
 
@@ -1671,7 +2481,7 @@ var init_generateCardCss = __esm({
1671
2481
  }
1672
2482
  });
1673
2483
  var accordionIconSchema, accordionSystemSchema;
1674
- var init_types2 = __esm({
2484
+ var init_types5 = __esm({
1675
2485
  "../theme-core/src/accordions/types.ts"() {
1676
2486
  accordionIconSchema = z.enum([
1677
2487
  "plus-minus",
@@ -1733,7 +2543,7 @@ var init_types2 = __esm({
1733
2543
  }
1734
2544
  });
1735
2545
  var inputSystemSchema;
1736
- var init_types3 = __esm({
2546
+ var init_types6 = __esm({
1737
2547
  "../theme-core/src/inputs/types.ts"() {
1738
2548
  inputSystemSchema = z.object({
1739
2549
  // Base styling (applied to all inputs)
@@ -1826,7 +2636,7 @@ var init_baseSchema = __esm({
1826
2636
  }
1827
2637
  });
1828
2638
  var navLinkPaddingSchema, navLinkPaddingXSchema, navLinkBorderRadiusSchema, navLinkTextSizeSchema, navLinkLetterSpacingSchema, navLinkStyleSchema;
1829
- var init_types4 = __esm({
2639
+ var init_types7 = __esm({
1830
2640
  "../theme-core/src/navigation/types.ts"() {
1831
2641
  init_baseSchema();
1832
2642
  navLinkPaddingSchema = z.enum(["none", "compact", "default"]);
@@ -2631,7 +3441,7 @@ function validateProps(props2, context = "node builder") {
2631
3441
  }
2632
3442
  }
2633
3443
  var RESERVED_KEYS;
2634
- var init_types5 = __esm({
3444
+ var init_types8 = __esm({
2635
3445
  "../blocks/src/system/node/types.ts"() {
2636
3446
  init_env();
2637
3447
  RESERVED_KEYS = [
@@ -2758,7 +3568,7 @@ var section, headerSection, stack, inline, accordion, accordionItem, carousel, t
2758
3568
  var init_builder = __esm({
2759
3569
  "../blocks/src/system/node/builder.ts"() {
2760
3570
  init_schema();
2761
- init_types5();
3571
+ init_types8();
2762
3572
  init_env();
2763
3573
  section = (props2, children, ...mods) => el("section", props2, children, ...mods);
2764
3574
  headerSection = (props2, children, ...mods) => el("headerSection", props2, children, ...mods);
@@ -3133,7 +3943,8 @@ function ctaButton(opts) {
3133
3943
  },
3134
3944
  size: {
3135
3945
  $bind: {
3136
- from: sizePath
3946
+ from: sizePath,
3947
+ fallback: opts?.sizeFallback ?? "md"
3137
3948
  }
3138
3949
  },
3139
3950
  ...opts?.className ? { className: opts.className } : {},
@@ -3639,7 +4450,7 @@ function createTransformRegistry(definitions) {
3639
4450
  }
3640
4451
  return registry;
3641
4452
  }
3642
- var init_core = __esm({
4453
+ var init_core2 = __esm({
3643
4454
  "../blocks/src/system/transforms/registry/core.ts"() {
3644
4455
  }
3645
4456
  });
@@ -3767,7 +4578,7 @@ function hasVisualContainerStyles(value) {
3767
4578
  var spacingTransform, raisedTransform, roundedTransform, boxStylesCompositeTransform, boxStylesBorderColorTransform, sectionClassNameTransform, containerStylesResolveClassName, containerStylesResolveBoxClassName, sectionTextColorStyleTransform, sectionHeadingColorStyleTransform, sectionColorsStyleTransform, GAP_CLASS_MAP, GAP_VALUE_MAP, semanticGapTransform, semanticGapValueTransform, boxStylesTransforms;
3768
4579
  var init_boxStyles2 = __esm({
3769
4580
  "../blocks/src/system/transforms/registry/boxStyles.ts"() {
3770
- init_core();
4581
+ init_core2();
3771
4582
  init_spacing();
3772
4583
  init_colorStyles();
3773
4584
  init_colorResolution();
@@ -4691,7 +5502,7 @@ function scopeContentPath(path21, scope) {
4691
5502
  return `content.${scope}.${path21}`;
4692
5503
  }
4693
5504
  var FRAGMENT_ID_PATTERN, FIELD_ID_PATTERN, dataLoaderSchema, fragmentDataSchema, fragmentConfigSchema, FragmentConfigError;
4694
- var init_types6 = __esm({
5505
+ var init_types9 = __esm({
4695
5506
  "../blocks/src/system/fragments/types.ts"() {
4696
5507
  init_schema2();
4697
5508
  init_node();
@@ -4824,7 +5635,7 @@ function buildFragmentDataLoaders(composition2) {
4824
5635
  var FragmentCompositionError, DOT_SCOPE_REGEX;
4825
5636
  var init_builder2 = __esm({
4826
5637
  "../blocks/src/system/fragments/builder.ts"() {
4827
- init_types6();
5638
+ init_types9();
4828
5639
  FragmentCompositionError = class extends Error {
4829
5640
  constructor(message) {
4830
5641
  super(message);
@@ -4839,7 +5650,7 @@ var init_builder2 = __esm({
4839
5650
  var bodyCopyFragment;
4840
5651
  var init_bodyCopy = __esm({
4841
5652
  "../blocks/src/system/fragments/library/bodyCopy.ts"() {
4842
- init_types6();
5653
+ init_types9();
4843
5654
  init_builder();
4844
5655
  bodyCopyFragment = defineFragment({
4845
5656
  id: "bodyCopy",
@@ -4938,7 +5749,7 @@ var init_bodyCopy = __esm({
4938
5749
  var heroCopyFragment;
4939
5750
  var init_heroCopy = __esm({
4940
5751
  "../blocks/src/system/fragments/library/heroCopy.ts"() {
4941
- init_types6();
5752
+ init_types9();
4942
5753
  init_builder();
4943
5754
  heroCopyFragment = defineFragment({
4944
5755
  id: "heroCopy",
@@ -5022,7 +5833,7 @@ function createButtonGroup(options = {}) {
5022
5833
  { value: "outline", label: "Outline" }
5023
5834
  ],
5024
5835
  defaultVariant,
5025
- includeSize = false,
5836
+ includeSize = true,
5026
5837
  defaultSize = "md",
5027
5838
  showGroupLabel = false,
5028
5839
  groupId = "button",
@@ -5164,7 +5975,7 @@ var init_ctas = __esm({
5164
5975
  var ctaRowFragment;
5165
5976
  var init_ctaRow2 = __esm({
5166
5977
  "../blocks/src/system/fragments/library/ctaRow.ts"() {
5167
- init_types6();
5978
+ init_types9();
5168
5979
  init_fragments();
5169
5980
  init_ctas();
5170
5981
  ctaRowFragment = defineFragment({
@@ -5183,7 +5994,7 @@ var init_ctaRow2 = __esm({
5183
5994
  var heroCtaRowFragment;
5184
5995
  var init_heroCtaRow = __esm({
5185
5996
  "../blocks/src/system/fragments/library/heroCtaRow.ts"() {
5186
- init_types6();
5997
+ init_types9();
5187
5998
  init_fragments();
5188
5999
  init_ctas();
5189
6000
  heroCtaRowFragment = defineFragment({
@@ -5229,7 +6040,7 @@ var init_heroCtaRow = __esm({
5229
6040
  var ctaCopyFragment;
5230
6041
  var init_ctaCopy = __esm({
5231
6042
  "../blocks/src/system/fragments/library/ctaCopy.ts"() {
5232
- init_types6();
6043
+ init_types9();
5233
6044
  init_fragments();
5234
6045
  init_builder();
5235
6046
  ctaCopyFragment = defineFragment({
@@ -5281,7 +6092,7 @@ var init_ctaCopy = __esm({
5281
6092
  var testimonialsHeadingFragment;
5282
6093
  var init_testimonialsHeading = __esm({
5283
6094
  "../blocks/src/system/fragments/library/testimonialsHeading.ts"() {
5284
- init_types6();
6095
+ init_types9();
5285
6096
  init_builder();
5286
6097
  init_colorStyles();
5287
6098
  testimonialsHeadingFragment = defineFragment({
@@ -5463,7 +6274,7 @@ function buildGridLayout() {
5463
6274
  var grid, testimonialsCarouselFragment;
5464
6275
  var init_testimonialsCarousel = __esm({
5465
6276
  "../blocks/src/system/fragments/library/testimonialsCarousel.ts"() {
5466
- init_types6();
6277
+ init_types9();
5467
6278
  init_builder();
5468
6279
  init_colorStyles();
5469
6280
  init_fragments();
@@ -5597,7 +6408,7 @@ var init_testimonialsCarousel = __esm({
5597
6408
  var formCopyFragment;
5598
6409
  var init_formCopy = __esm({
5599
6410
  "../blocks/src/system/fragments/library/formCopy.ts"() {
5600
- init_types6();
6411
+ init_types9();
5601
6412
  init_builder();
5602
6413
  formCopyFragment = defineFragment({
5603
6414
  id: "formCopy",
@@ -5658,7 +6469,7 @@ var init_api_bindings = __esm({
5658
6469
  var formEmbedFragment;
5659
6470
  var init_formEmbed = __esm({
5660
6471
  "../blocks/src/system/fragments/library/formEmbed.ts"() {
5661
- init_types6();
6472
+ init_types9();
5662
6473
  init_builder();
5663
6474
  init_api_bindings();
5664
6475
  formEmbedFragment = defineFragment({
@@ -5718,7 +6529,7 @@ var init_formEmbed = __esm({
5718
6529
  var footerBottomTextFragment;
5719
6530
  var init_footerBottomText = __esm({
5720
6531
  "../blocks/src/system/fragments/library/footerBottomText.ts"() {
5721
- init_types6();
6532
+ init_types9();
5722
6533
  init_builder();
5723
6534
  init_colorStyles();
5724
6535
  footerBottomTextFragment = defineFragment({
@@ -5785,7 +6596,7 @@ var init_footerBottomText = __esm({
5785
6596
  var headerCtaFragment;
5786
6597
  var init_headerCta = __esm({
5787
6598
  "../blocks/src/system/fragments/library/headerCta.ts"() {
5788
- init_types6();
6599
+ init_types9();
5789
6600
  init_fragments();
5790
6601
  headerCtaFragment = defineFragment({
5791
6602
  id: "headerCta",
@@ -5842,7 +6653,7 @@ var init_headerCta = __esm({
5842
6653
  var singleButtonFragment;
5843
6654
  var init_singleButton = __esm({
5844
6655
  "../blocks/src/system/fragments/library/singleButton.ts"() {
5845
- init_types6();
6656
+ init_types9();
5846
6657
  init_fragments();
5847
6658
  init_button();
5848
6659
  singleButtonFragment = defineFragment({
@@ -5878,7 +6689,7 @@ var init_singleButton = __esm({
5878
6689
  var blogFeaturedPostFragment;
5879
6690
  var init_blogFeaturedPost = __esm({
5880
6691
  "../blocks/src/system/fragments/library/blogFeaturedPost.ts"() {
5881
- init_types6();
6692
+ init_types9();
5882
6693
  init_fragments();
5883
6694
  init_builder();
5884
6695
  init_colorStyles();
@@ -6036,7 +6847,7 @@ var init_blogFeaturedPost = __esm({
6036
6847
  var faqHeadingFragment;
6037
6848
  var init_faqHeading = __esm({
6038
6849
  "../blocks/src/system/fragments/library/faqHeading.ts"() {
6039
- init_types6();
6850
+ init_types9();
6040
6851
  init_builder();
6041
6852
  init_colorStyles();
6042
6853
  faqHeadingFragment = defineFragment({
@@ -6110,7 +6921,7 @@ var faqAccordionFragment;
6110
6921
  var init_faqAccordion = __esm({
6111
6922
  "../blocks/src/system/fragments/library/faqAccordion.ts"() {
6112
6923
  init_builder();
6113
- init_types6();
6924
+ init_types9();
6114
6925
  faqAccordionFragment = defineFragment({
6115
6926
  id: "faqAccordion",
6116
6927
  title: "FAQ Accordion",
@@ -6185,7 +6996,7 @@ var init_faqAccordion = __esm({
6185
6996
  var cardFragment;
6186
6997
  var init_card = __esm({
6187
6998
  "../blocks/src/system/fragments/library/card.ts"() {
6188
- init_types6();
6999
+ init_types9();
6189
7000
  init_builder();
6190
7001
  init_ctas();
6191
7002
  init_ctaRow();
@@ -6321,7 +7132,7 @@ var init_card = __esm({
6321
7132
  var headingFragment;
6322
7133
  var init_heading = __esm({
6323
7134
  "../blocks/src/system/fragments/library/heading.ts"() {
6324
- init_types6();
7135
+ init_types9();
6325
7136
  init_builder();
6326
7137
  headingFragment = defineFragment({
6327
7138
  id: "heading",
@@ -6367,7 +7178,7 @@ var init_heading = __esm({
6367
7178
  var richTextFragment;
6368
7179
  var init_richText = __esm({
6369
7180
  "../blocks/src/system/fragments/library/richText.ts"() {
6370
- init_types6();
7181
+ init_types9();
6371
7182
  init_builder();
6372
7183
  richTextFragment = defineFragment({
6373
7184
  id: "richText",
@@ -6447,7 +7258,7 @@ var init_toRepeaterSchema = __esm({
6447
7258
  var heroLayoutControlsFragment;
6448
7259
  var init_heroLayoutControls = __esm({
6449
7260
  "../blocks/src/system/fragments/library/heroLayoutControls.ts"() {
6450
- init_types6();
7261
+ init_types9();
6451
7262
  heroLayoutControlsFragment = defineFragment({
6452
7263
  id: "heroLayoutControls",
6453
7264
  title: "Hero Layout",
@@ -6504,7 +7315,7 @@ var init_heroLayoutControls = __esm({
6504
7315
  var bookingFormFragment;
6505
7316
  var init_bookingForm = __esm({
6506
7317
  "../blocks/src/system/fragments/library/bookingForm.ts"() {
6507
- init_types6();
7318
+ init_types9();
6508
7319
  init_builder();
6509
7320
  init_api_bindings();
6510
7321
  bookingFormFragment = defineFragment({
@@ -6572,7 +7383,7 @@ var init_bookingForm = __esm({
6572
7383
  var quoteFragment;
6573
7384
  var init_quote = __esm({
6574
7385
  "../blocks/src/system/fragments/library/quote.ts"() {
6575
- init_types6();
7386
+ init_types9();
6576
7387
  init_builder();
6577
7388
  quoteFragment = defineFragment({
6578
7389
  id: "quote",
@@ -6639,7 +7450,7 @@ var init_quote = __esm({
6639
7450
  var imageFragment;
6640
7451
  var init_image = __esm({
6641
7452
  "../blocks/src/system/fragments/library/image.ts"() {
6642
- init_types6();
7453
+ init_types9();
6643
7454
  init_builder();
6644
7455
  init_colorStyles();
6645
7456
  imageFragment = defineFragment({
@@ -6753,7 +7564,7 @@ var init_image = __esm({
6753
7564
  var videoEmbedFragment;
6754
7565
  var init_videoEmbed = __esm({
6755
7566
  "../blocks/src/system/fragments/library/videoEmbed.ts"() {
6756
- init_types6();
7567
+ init_types9();
6757
7568
  init_builder();
6758
7569
  init_colorStyles();
6759
7570
  videoEmbedFragment = defineFragment({
@@ -6819,7 +7630,7 @@ var init_videoEmbed = __esm({
6819
7630
  var feedbackCalloutFragment;
6820
7631
  var init_feedbackCallout2 = __esm({
6821
7632
  "../blocks/src/system/fragments/library/feedbackCallout.ts"() {
6822
- init_types6();
7633
+ init_types9();
6823
7634
  init_ctas();
6824
7635
  init_fragments();
6825
7636
  feedbackCalloutFragment = defineFragment({
@@ -6894,7 +7705,7 @@ var init_feedbackCallout2 = __esm({
6894
7705
  var SECTION_STATE_KIND_LABELS, sectionStateFragment;
6895
7706
  var init_sectionState2 = __esm({
6896
7707
  "../blocks/src/system/fragments/library/sectionState.ts"() {
6897
- init_types6();
7708
+ init_types9();
6898
7709
  init_ctas();
6899
7710
  init_fragments();
6900
7711
  SECTION_STATE_KIND_LABELS = {
@@ -6973,7 +7784,7 @@ var init_sectionState2 = __esm({
6973
7784
  var columnContentFragment;
6974
7785
  var init_columnContent = __esm({
6975
7786
  "../blocks/src/system/fragments/library/columnContent.ts"() {
6976
- init_types6();
7787
+ init_types9();
6977
7788
  init_builder();
6978
7789
  init_toRepeaterSchema();
6979
7790
  init_image();
@@ -7040,7 +7851,7 @@ var init_columnContent = __esm({
7040
7851
  var spinnerFragment;
7041
7852
  var init_spinner = __esm({
7042
7853
  "../blocks/src/system/fragments/library/spinner.ts"() {
7043
- init_types6();
7854
+ init_types9();
7044
7855
  init_builder();
7045
7856
  spinnerFragment = defineFragment({
7046
7857
  id: "spinner",
@@ -7162,7 +7973,7 @@ var init_init = __esm({
7162
7973
  var newsletterCopyFragment;
7163
7974
  var init_newsletterCopy = __esm({
7164
7975
  "../blocks/src/system/fragments/library/newsletterCopy.ts"() {
7165
- init_types6();
7976
+ init_types9();
7166
7977
  init_builder();
7167
7978
  newsletterCopyFragment = defineFragment({
7168
7979
  id: "newsletterCopy",
@@ -7207,7 +8018,7 @@ var init_newsletterCopy = __esm({
7207
8018
  var newsletterFormFragment;
7208
8019
  var init_newsletterForm = __esm({
7209
8020
  "../blocks/src/system/fragments/library/newsletterForm.ts"() {
7210
- init_types6();
8021
+ init_types9();
7211
8022
  init_builder();
7212
8023
  init_api_bindings();
7213
8024
  newsletterFormFragment = defineFragment({
@@ -7297,7 +8108,7 @@ var init_newsletterForm = __esm({
7297
8108
  var teamMemberFragment;
7298
8109
  var init_teamMember = __esm({
7299
8110
  "../blocks/src/system/fragments/library/teamMember.ts"() {
7300
- init_types6();
8111
+ init_types9();
7301
8112
  init_builder();
7302
8113
  teamMemberFragment = defineFragment({
7303
8114
  id: "teamMember",
@@ -7368,7 +8179,7 @@ var init_teamMember = __esm({
7368
8179
  // ../blocks/src/system/fragments/index.ts
7369
8180
  var init_fragments2 = __esm({
7370
8181
  "../blocks/src/system/fragments/index.ts"() {
7371
- init_types6();
8182
+ init_types9();
7372
8183
  init_builder2();
7373
8184
  init_registry2();
7374
8185
  init_toRepeaterSchema();
@@ -7834,7 +8645,7 @@ var init_shared2 = __esm({
7834
8645
  });
7835
8646
 
7836
8647
  // ../blocks/src/system/blocks/events/shared/types.ts
7837
- var init_types7 = __esm({
8648
+ var init_types10 = __esm({
7838
8649
  "../blocks/src/system/blocks/events/shared/types.ts"() {
7839
8650
  }
7840
8651
  });
@@ -7848,52 +8659,52 @@ var init_media = __esm({
7848
8659
  "audio",
7849
8660
  "video"
7850
8661
  ];
7851
- hotspotSchema2 = z39.object({
7852
- x: z39.number().min(0).max(1),
7853
- y: z39.number().min(0).max(1),
7854
- radius: z39.number().optional()
7855
- });
7856
- rotationSchema2 = z39.union([z39.literal(0), z39.literal(90), z39.literal(180), z39.literal(270)]);
7857
- rectSchema2 = z39.tuple([z39.number(), z39.number(), z39.number(), z39.number()]);
7858
- aspectCropSchema2 = z39.object({
7859
- aspect: z39.preprocess((value) => value == null ? void 0 : value, z39.string().optional()),
7860
- rect: z39.preprocess((value) => value == null ? void 0 : value, rectSchema2.optional()),
7861
- hotspot: z39.preprocess((value) => value == null ? void 0 : value, hotspotSchema2.optional()),
7862
- rotation: z39.preprocess((value) => value == null ? void 0 : value, rotationSchema2.optional())
7863
- });
7864
- transformSchema2 = z39.object({
7865
- aspectCrops: z39.preprocess((value) => {
8662
+ hotspotSchema2 = z42.object({
8663
+ x: z42.number().min(0).max(1),
8664
+ y: z42.number().min(0).max(1),
8665
+ radius: z42.number().optional()
8666
+ });
8667
+ rotationSchema2 = z42.union([z42.literal(0), z42.literal(90), z42.literal(180), z42.literal(270)]);
8668
+ rectSchema2 = z42.tuple([z42.number(), z42.number(), z42.number(), z42.number()]);
8669
+ aspectCropSchema2 = z42.object({
8670
+ aspect: z42.preprocess((value) => value == null ? void 0 : value, z42.string().optional()),
8671
+ rect: z42.preprocess((value) => value == null ? void 0 : value, rectSchema2.optional()),
8672
+ hotspot: z42.preprocess((value) => value == null ? void 0 : value, hotspotSchema2.optional()),
8673
+ rotation: z42.preprocess((value) => value == null ? void 0 : value, rotationSchema2.optional())
8674
+ });
8675
+ transformSchema2 = z42.object({
8676
+ aspectCrops: z42.preprocess((value) => {
7866
8677
  if (!value || typeof value !== "object" || Array.isArray(value)) {
7867
8678
  return void 0;
7868
8679
  }
7869
8680
  return value;
7870
- }, z39.record(z39.string(), aspectCropSchema2.catch({}))).optional(),
8681
+ }, z42.record(z42.string(), aspectCropSchema2.catch({}))).optional(),
7871
8682
  rect: rectSchema2.optional(),
7872
8683
  hotspot: hotspotSchema2.optional(),
7873
8684
  rotation: rotationSchema2.optional()
7874
8685
  });
7875
- mediaBaseSchema = z39.object({
7876
- purpose: z39.string().optional(),
7877
- placeholder: z39.boolean().default(true).optional(),
7878
- assetId: z39.string().optional(),
7879
- identifier: z39.string().optional(),
7880
- src: z39.string().optional(),
7881
- alt: z39.string().optional(),
7882
- filename: z39.string().optional(),
7883
- mimeType: z39.string().optional(),
7884
- width: z39.number().optional(),
7885
- height: z39.number().optional(),
7886
- storageBucket: z39.string().optional(),
7887
- storagePath: z39.string().optional(),
8686
+ mediaBaseSchema = z42.object({
8687
+ purpose: z42.string().optional(),
8688
+ placeholder: z42.boolean().default(true).optional(),
8689
+ assetId: z42.string().optional(),
8690
+ identifier: z42.string().optional(),
8691
+ src: z42.string().optional(),
8692
+ alt: z42.string().optional(),
8693
+ filename: z42.string().optional(),
8694
+ mimeType: z42.string().optional(),
8695
+ width: z42.number().optional(),
8696
+ height: z42.number().optional(),
8697
+ storageBucket: z42.string().optional(),
8698
+ storagePath: z42.string().optional(),
7888
8699
  transform: transformSchema2.optional()
7889
8700
  });
7890
- imageMediaSchema = mediaBaseSchema.extend({ type: z39.literal("image") });
7891
- videoMediaSchema = mediaBaseSchema.extend({ type: z39.literal("video") });
7892
- audioMediaSchema = mediaBaseSchema.extend({ type: z39.literal("audio") });
7893
- documentMediaSchema = mediaBaseSchema.extend({ type: z39.literal("document") });
7894
- spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z39.literal("spreadsheet") });
7895
- archiveMediaSchema = mediaBaseSchema.extend({ type: z39.literal("archive") });
7896
- mediaSchema2 = z39.discriminatedUnion("type", [
8701
+ imageMediaSchema = mediaBaseSchema.extend({ type: z42.literal("image") });
8702
+ videoMediaSchema = mediaBaseSchema.extend({ type: z42.literal("video") });
8703
+ audioMediaSchema = mediaBaseSchema.extend({ type: z42.literal("audio") });
8704
+ documentMediaSchema = mediaBaseSchema.extend({ type: z42.literal("document") });
8705
+ spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z42.literal("spreadsheet") });
8706
+ archiveMediaSchema = mediaBaseSchema.extend({ type: z42.literal("archive") });
8707
+ mediaSchema2 = z42.discriminatedUnion("type", [
7897
8708
  imageMediaSchema,
7898
8709
  videoMediaSchema,
7899
8710
  audioMediaSchema,
@@ -8379,7 +9190,7 @@ var init_filtering = __esm({
8379
9190
  // ../blocks/src/system/blocks/events/shared/index.ts
8380
9191
  var init_shared3 = __esm({
8381
9192
  "../blocks/src/system/blocks/events/shared/index.ts"() {
8382
- init_types7();
9193
+ init_types10();
8383
9194
  init_schemas2();
8384
9195
  init_fields();
8385
9196
  init_filtering();
@@ -8706,7 +9517,7 @@ var init_event_registration = __esm({
8706
9517
  });
8707
9518
 
8708
9519
  // ../blocks/src/system/blocks/courses/shared/types.ts
8709
- var init_types8 = __esm({
9520
+ var init_types11 = __esm({
8710
9521
  "../blocks/src/system/blocks/courses/shared/types.ts"() {
8711
9522
  }
8712
9523
  });
@@ -8720,7 +9531,7 @@ var init_pricing = __esm({
8720
9531
  // ../blocks/src/system/blocks/courses/shared/index.ts
8721
9532
  var init_shared4 = __esm({
8722
9533
  "../blocks/src/system/blocks/courses/shared/index.ts"() {
8723
- init_types8();
9534
+ init_types11();
8724
9535
  init_schemas();
8725
9536
  init_pricing();
8726
9537
  }
@@ -12244,8 +13055,9 @@ function normalizeBoolean(value, fallback) {
12244
13055
  return fallback;
12245
13056
  }
12246
13057
  function normalizeLocationMapValueRecord(record) {
13058
+ const addressText = typeof record.addressText === "string" ? record.addressText : typeof record.displayAddress === "string" ? record.displayAddress : null;
12247
13059
  const normalized = {
12248
- addressText: normalizeLocationAddressText(typeof record.addressText === "string" ? record.addressText : null),
13060
+ addressText: normalizeLocationAddressText(addressText),
12249
13061
  lat: normalizeOptionalNumber(record.lat),
12250
13062
  lng: normalizeOptionalNumber(record.lng)
12251
13063
  };
@@ -12260,11 +13072,49 @@ function normalizeLocationMapValue(value) {
12260
13072
  }
12261
13073
  return normalizeLocationMapValueRecord(value);
12262
13074
  }
12263
- function normalizeLocationMapProps(input) {
13075
+ function normalizeLocationMapSource(value) {
13076
+ return value === "business_address" || value === "venue" ? value : "custom";
13077
+ }
13078
+ function resolveLocationMapLocation(input) {
13079
+ const source = normalizeLocationMapSource(input.locationSource);
13080
+ if (source === "business_address") {
13081
+ const locationValue2 = normalizeLocationMapValue(input.businessAddress ?? input.location);
13082
+ return locationValue2 ? { kind: "business_address", locationValue: locationValue2 } : { kind: "unresolved", source, reason: "missing_business_address" };
13083
+ }
13084
+ if (source === "venue") {
13085
+ const venueId = typeof input.venueId === "string" && input.venueId.trim() ? input.venueId.trim() : null;
13086
+ if (!venueId) {
13087
+ return { kind: "unresolved", source, reason: "missing_venue_id" };
13088
+ }
13089
+ const locationValue2 = input.venuesById ? normalizeLocationMapValue(input.venuesById[venueId] ?? null) : null;
13090
+ return locationValue2 ? { kind: "venue", venueId, locationValue: locationValue2 } : { kind: "unresolved", source, reason: "missing_venue_location" };
13091
+ }
12264
13092
  const locationValue = normalizeLocationMapValue(input.location);
13093
+ return locationValue ? { kind: "custom", locationValue } : { kind: "unresolved", source, reason: "missing_custom_location" };
13094
+ }
13095
+ function describeUnresolvedLocationMapLocation(resolvedLocation) {
13096
+ if (resolvedLocation.kind !== "unresolved") {
13097
+ return null;
13098
+ }
13099
+ switch (resolvedLocation.reason) {
13100
+ case "missing_business_address":
13101
+ return "Business address details are not configured yet.";
13102
+ case "missing_venue_id":
13103
+ return "Choose a venue to show this map.";
13104
+ case "missing_venue_location":
13105
+ return "The selected venue does not have location details yet.";
13106
+ case "missing_custom_location":
13107
+ return "Location details coming soon.";
13108
+ }
13109
+ }
13110
+ function normalizeLocationMapProps(input) {
13111
+ const resolvedLocation = resolveLocationMapLocation(input);
13112
+ const locationValue = resolvedLocation.kind === "unresolved" ? null : resolvedLocation.locationValue;
12265
13113
  const directionsLabel = normalizeLocationAddressText(input.directionsLabel) ?? LOCATION_MAP_DEFAULTS.directionsLabel;
12266
13114
  return {
13115
+ resolvedLocation,
12267
13116
  locationValue,
13117
+ unresolvedMessage: describeUnresolvedLocationMapLocation(resolvedLocation),
12268
13118
  addressText: locationValue?.addressText ?? null,
12269
13119
  location: toLocationCoordinates(locationValue),
12270
13120
  zoom: Math.min(
@@ -12378,7 +13228,7 @@ var init_border2 = __esm({
12378
13228
  // ../theme-core/src/accordions/generateAccordionCss.ts
12379
13229
  var init_generateAccordionCss = __esm({
12380
13230
  "../theme-core/src/accordions/generateAccordionCss.ts"() {
12381
- init_types2();
13231
+ init_types5();
12382
13232
  init_constants2();
12383
13233
  init_border2();
12384
13234
  }
@@ -12393,7 +13243,7 @@ var init_defaults = __esm({
12393
13243
  // ../theme-core/src/inputs/generateInputCss.ts
12394
13244
  var init_generateInputCss = __esm({
12395
13245
  "../theme-core/src/inputs/generateInputCss.ts"() {
12396
- init_types3();
13246
+ init_types6();
12397
13247
  init_constants();
12398
13248
  init_border2();
12399
13249
  }
@@ -12414,12 +13264,12 @@ var init_generateBaseCSS = __esm({
12414
13264
  // ../theme-core/src/navigation/generateNavLinkCSS.ts
12415
13265
  var init_generateNavLinkCSS = __esm({
12416
13266
  "../theme-core/src/navigation/generateNavLinkCSS.ts"() {
12417
- init_types4();
13267
+ init_types7();
12418
13268
  init_generateBaseCSS();
12419
13269
  init_generateEffectsCSS();
12420
13270
  }
12421
13271
  });
12422
- var init_presets = __esm({
13272
+ var init_presets2 = __esm({
12423
13273
  "../theme-core/src/navigation/presets.ts"() {
12424
13274
  }
12425
13275
  });
@@ -12429,7 +13279,7 @@ var init_generateHeaderCss = __esm({
12429
13279
  "../theme-core/src/header/generateHeaderCss.ts"() {
12430
13280
  init_resolver();
12431
13281
  init_generateNavLinkCSS();
12432
- init_presets();
13282
+ init_presets2();
12433
13283
  init_shared();
12434
13284
  init_breakpoints();
12435
13285
  }
@@ -12447,7 +13297,7 @@ var init_generateFooterCss = __esm({
12447
13297
  "../theme-core/src/footer/generateFooterCss.ts"() {
12448
13298
  init_resolver();
12449
13299
  init_generateNavLinkCSS();
12450
- init_presets();
13300
+ init_presets2();
12451
13301
  }
12452
13302
  });
12453
13303
 
@@ -15007,6 +15857,23 @@ var ENDPOINT_DEFINITIONS = {
15007
15857
  auth: "user",
15008
15858
  responseKind: "json"
15009
15859
  },
15860
+ getSiteBusinessAddress: {
15861
+ path: "/sites/{siteId}/settings/business-address",
15862
+ method: "GET",
15863
+ revalidate: 120,
15864
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
15865
+ auth: "user",
15866
+ responseKind: "json",
15867
+ errors: ["auth:forbidden", "server:internal_error"]
15868
+ },
15869
+ updateSiteBusinessAddress: {
15870
+ path: "/sites/{siteId}/settings/business-address",
15871
+ method: "POST",
15872
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings],
15873
+ auth: "user",
15874
+ responseKind: "json",
15875
+ errors: ["auth:forbidden", "server:internal_error"]
15876
+ },
15010
15877
  getSiteGenerationIntake: {
15011
15878
  path: "/sites/{siteId}/settings/site-generation-intake",
15012
15879
  method: "GET",
@@ -20256,35 +21123,61 @@ function buildFieldSchema(field, allowNull, allowIncomplete = false) {
20256
21123
  }
20257
21124
  return finalizeSchema(schema, required, allowNull, allowIncomplete);
20258
21125
  }
21126
+ function buildFriendlyStringSchema(field) {
21127
+ return z.string({
21128
+ error: (issue) => issue.input === void 0 || issue.input === null ? "This field is required" : `${field.label} needs text`
21129
+ });
21130
+ }
20259
21131
  function buildTextSchema(field) {
20260
21132
  const ui = field.ui ?? {};
20261
21133
  const inputType = ui?.inputType;
20262
21134
  let schema;
20263
21135
  if (inputType === "number") {
20264
- schema = z.coerce.number();
20265
- if (typeof ui?.min === "number") schema = schema.min(ui.min);
20266
- if (typeof ui?.max === "number") schema = schema.max(ui.max);
21136
+ schema = z.coerce.number({
21137
+ error: (issue) => issue.input === void 0 ? `${field.label} is required` : `${field.label} needs a number`
21138
+ });
21139
+ if (typeof ui?.min === "number") {
21140
+ schema = schema.min(
21141
+ ui.min,
21142
+ `${field.label} must be ${ui.min} or more`
21143
+ );
21144
+ }
21145
+ if (typeof ui?.max === "number") {
21146
+ schema = schema.max(
21147
+ ui.max,
21148
+ `${field.label} must be ${ui.max} or less`
21149
+ );
21150
+ }
20267
21151
  } else {
20268
- schema = z.string();
21152
+ schema = buildFriendlyStringSchema(field);
20269
21153
  if (inputType === "email") {
20270
- schema = schema.email(`${field.label} must be a valid email`);
21154
+ schema = schema.email("Enter a valid email address");
20271
21155
  }
20272
21156
  if (inputType === "tel") {
20273
21157
  const TEL_RE = /^[+()0-9\s\-]{3,}$/;
20274
- schema = schema.regex(TEL_RE, `${field.label} must be a valid phone number`);
21158
+ schema = schema.regex(
21159
+ TEL_RE,
21160
+ "Enter a valid phone number"
21161
+ );
20275
21162
  }
20276
21163
  if (ui?.pattern) {
20277
21164
  try {
20278
21165
  const re = new RegExp(ui.pattern);
20279
- schema = schema.regex(re, `${field.label} is not in the correct format`);
21166
+ schema = schema.regex(
21167
+ re,
21168
+ `${field.label} is not in the right format`
21169
+ );
20280
21170
  } catch {
20281
21171
  }
20282
21172
  }
20283
21173
  if (field.maxLength) {
20284
- schema = schema.max(field.maxLength, `${field.label} must have at most ${field.maxLength} characters`);
21174
+ schema = schema.max(
21175
+ field.maxLength,
21176
+ `${field.label} must be ${field.maxLength} characters or less`
21177
+ );
20285
21178
  }
20286
21179
  if (field.required) {
20287
- schema = schema.min(1, `${field.label} is required`).refine((v) => v.trim().length > 0, { message: `${field.label} is required` });
21180
+ schema = schema.min(1, { message: `${field.label} is required` }).refine((v) => v.trim().length > 0, { message: `${field.label} is required` });
20288
21181
  }
20289
21182
  }
20290
21183
  return schema;
@@ -20294,19 +21187,22 @@ function buildRichTextSchema2() {
20294
21187
  }
20295
21188
  var SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
20296
21189
  function buildSlugSchema(field) {
20297
- const message = `${field.label} must contain lowercase letters, numbers, and dashes`;
20298
- let schema = z.string().regex(SLUG_PATTERN, message);
21190
+ const message = `${field.label} can only use lowercase letters, numbers, and dashes`;
21191
+ let schema = buildFriendlyStringSchema(field).regex(SLUG_PATTERN, message);
20299
21192
  if (field.maxLength) {
20300
- schema = schema.max(field.maxLength, `${field.label} must be at most ${field.maxLength} characters`);
21193
+ schema = schema.max(
21194
+ field.maxLength,
21195
+ `${field.label} must be ${field.maxLength} characters or less`
21196
+ );
20301
21197
  }
20302
21198
  if (field.required) {
20303
- schema = schema.min(1, `${field.label} is required`);
21199
+ schema = schema.min(1, { message: `${field.label} is required` });
20304
21200
  }
20305
21201
  return schema;
20306
21202
  }
20307
21203
  var ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
20308
21204
  function buildUrlSchema(field) {
20309
- const message = `${field.label} must be a valid URL`;
21205
+ const message = "Enter a valid web address";
20310
21206
  const validate = (value) => {
20311
21207
  if (!value) {
20312
21208
  return !field.required;
@@ -20316,14 +21212,16 @@ function buildUrlSchema(field) {
20316
21212
  }
20317
21213
  try {
20318
21214
  const parsed = new URL(value);
20319
- return ALLOWED_URL_PROTOCOLS.includes(parsed.protocol);
21215
+ return ALLOWED_URL_PROTOCOLS.includes(
21216
+ parsed.protocol
21217
+ );
20320
21218
  } catch {
20321
21219
  return false;
20322
21220
  }
20323
21221
  };
20324
- let schema = z.string().trim().refine(validate, message);
21222
+ let schema = buildFriendlyStringSchema(field).trim().refine(validate, message);
20325
21223
  if (field.required) {
20326
- schema = schema.min(1, `${field.label} is required`);
21224
+ schema = schema.min(1, { message: `${field.label} is required` });
20327
21225
  }
20328
21226
  return schema;
20329
21227
  }
@@ -20376,10 +21274,13 @@ function buildSelectSchema(field) {
20376
21274
  switch (source.kind) {
20377
21275
  case "sdk":
20378
21276
  case "site":
20379
- return z.string();
21277
+ return buildFriendlyStringSchema(field);
20380
21278
  case "static": {
20381
21279
  const values = field.options.map((option) => option.value);
20382
- return z.string().refine((value) => values.includes(value), `${field.label} must be one of: ${values.join(", ")}`);
21280
+ return buildFriendlyStringSchema(field).refine(
21281
+ (value) => values.includes(value),
21282
+ `Choose one of the available options for ${field.label}`
21283
+ );
20383
21284
  }
20384
21285
  default:
20385
21286
  return assertNeverSelectSource2(source);
@@ -20387,14 +21288,16 @@ function buildSelectSchema(field) {
20387
21288
  })();
20388
21289
  if (field.multiple) {
20389
21290
  const arraySchema = z.array(singleValueSchema);
20390
- return field.required ? arraySchema : arraySchema.nullable();
21291
+ return field.required ? arraySchema.min(1, { message: "This field is required" }) : arraySchema.nullable();
20391
21292
  }
20392
21293
  return field.required ? singleValueSchema : singleValueSchema.nullable();
20393
21294
  }
20394
21295
  function buildReferenceSchema(field) {
20395
- let schema = z.string();
21296
+ let schema = z.string({
21297
+ error: (issue) => issue.input === void 0 || issue.input === null ? "This field is required" : `${field.label} needs text`
21298
+ });
20396
21299
  if (field.required) {
20397
- schema = schema.min(1, `${field.label} is required`);
21300
+ schema = schema.min(1, { message: `${field.label} is required` });
20398
21301
  }
20399
21302
  return schema;
20400
21303
  }
@@ -20742,834 +21645,185 @@ function assertUniqueLayoutProfileKeys(profiles) {
20742
21645
  }
20743
21646
  }
20744
21647
 
20745
- // ../theme-core/src/site-styles/sourceCatalogs.ts
20746
- var generatedContentFrames = [
20747
- plainFrame,
20748
- panelFrame("inset"),
20749
- panelFrame("raised"),
20750
- flushPanelFrame({ bleed: "start" })
20751
- ];
20752
- var userContentFrames = [
20753
- ...generatedContentFrames,
20754
- panelFrame("editorial"),
20755
- flushPanelFrame({ bleed: "end" }),
20756
- flushPanelFrame({ bleed: "both" })
20757
- ];
20758
- var generatedDesignOptionCatalog = {
20759
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
20760
- contentFrames: generatedContentFrames,
20761
- itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
20762
- transitions: ["none", "soft-fade-short", "soft-fade-long"],
20763
- emphases: ["low", "medium", "high"]};
20764
- var userDesignOptionCatalog = {
20765
- sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
20766
- contentFrames: userContentFrames,
20767
- itemSurfaces: [
20768
- ...generatedDesignOptionCatalog.itemSurfaces,
20769
- "inset",
20770
- "editorial"
20771
- ],
20772
- transitions: [
20773
- ...generatedDesignOptionCatalog.transitions,
20774
- "wave-edge",
20775
- "angle-edge"
20776
- ],
20777
- emphases: generatedDesignOptionCatalog.emphases};
20778
-
20779
21648
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
20780
- var curatedSiteStyleIdValues = [
20781
- "site-style:calm-studio",
20782
- "site-style:clear-professional",
20783
- "site-style:warm-editorial",
20784
- "site-style:bright-community",
20785
- "site-style:quiet-luxury",
20786
- "site-style:practical-services",
20787
- "site-style:modern-wellness",
20788
- "site-style:bold-launch"
20789
- ];
20790
- var quietBudget = {
20791
- accentDensity: "low",
20792
- panelDensity: "medium",
20793
- transitionMix: "quiet",
20794
- primaryCtaLimit: 2,
20795
- mediaDensity: "medium",
20796
- decorativeRepetition: "low"
20797
- };
20798
- var balancedBudget = {
20799
- accentDensity: "medium",
20800
- panelDensity: "medium",
20801
- transitionMix: "balanced",
20802
- primaryCtaLimit: 3,
20803
- mediaDensity: "medium",
20804
- decorativeRepetition: "medium"
20805
- };
20806
- var expressiveBudget = {
20807
- accentDensity: "high",
20808
- panelDensity: "high",
20809
- transitionMix: "expressive",
20810
- primaryCtaLimit: 3,
20811
- mediaDensity: "high",
20812
- decorativeRepetition: "medium"
20813
- };
20814
- function uniqueContentFrameKinds() {
20815
- const kinds = [...new Set(
20816
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
20817
- )];
20818
- const firstKind = kinds[0];
20819
- if (!firstKind) {
20820
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
20821
- }
20822
- return [firstKind, ...kinds.slice(1)];
20823
- }
20824
- var generatedContentFrameKinds = uniqueContentFrameKinds();
20825
- function defineCuratedSiteStyle(input) {
20826
- return {
20827
- id: asSiteStyleId(input.id),
20828
- name: input.name,
20829
- description: input.description,
20830
- generationBrief: input.generationBrief,
20831
- selectionKeywords: input.selectionKeywords ?? [],
20832
- template: {
20833
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
20834
- name: input.name,
20835
- version: 1,
20836
- tokenRecipes: input.tokenRecipes,
20837
- compositionBudget: input.compositionBudget,
20838
- supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
20839
- supportedContentFrames: generatedContentFrameKinds,
20840
- supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
20841
- supportedTransitions: generatedDesignOptionCatalog.transitions
21649
+ init_personalities();
21650
+
21651
+ // ../theme-core/src/palette/variants/types.ts
21652
+ init_styleTags();
21653
+ var hotspotSchema = z42.object({
21654
+ x: z42.number().min(0).max(1),
21655
+ y: z42.number().min(0).max(1),
21656
+ radius: z42.number().optional()
21657
+ });
21658
+ var rotationSchema = z42.union([z42.literal(0), z42.literal(90), z42.literal(180), z42.literal(270)]);
21659
+ var rectSchema = z42.tuple([z42.number(), z42.number(), z42.number(), z42.number()]);
21660
+ var aspectCropSchema = z42.object({
21661
+ aspect: z42.preprocess((value) => value == null ? void 0 : value, z42.string().optional()),
21662
+ rect: z42.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
21663
+ hotspot: z42.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
21664
+ rotation: z42.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
21665
+ });
21666
+ var transformSchema = z42.object({
21667
+ aspectCrops: z42.preprocess((value) => {
21668
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
21669
+ return void 0;
20842
21670
  }
20843
- };
20844
- }
20845
- var curatedSiteStyles = [
20846
- defineCuratedSiteStyle({
20847
- id: "site-style:calm-studio",
20848
- name: "Calm Studio",
20849
- description: "Soft, measured, and spacious for intimate appointment or class businesses.",
20850
- generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
20851
- tokenRecipes: {
20852
- palette: "soft-natural",
20853
- contrast: "standard",
20854
- radius: "soft",
20855
- shadow: "subtle",
20856
- typography: "friendly-sans",
20857
- spacing: "airy",
20858
- motion: "subtle"
20859
- },
20860
- compositionBudget: quietBudget
20861
- }),
20862
- defineCuratedSiteStyle({
20863
- id: "site-style:clear-professional",
20864
- name: "Clear Professional",
20865
- description: "Crisp, trustworthy, and direct for local services and consultancies.",
20866
- generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
20867
- tokenRecipes: {
20868
- palette: "brand-led",
20869
- contrast: "strong",
20870
- radius: "soft",
20871
- shadow: "subtle",
20872
- typography: "clean-sans",
20873
- spacing: "regular",
20874
- motion: "subtle"
20875
- },
20876
- compositionBudget: balancedBudget
20877
- }),
20878
- defineCuratedSiteStyle({
20879
- id: "site-style:warm-editorial",
20880
- name: "Warm Editorial",
20881
- description: "Story-led and textured for educators, makers, venues, and retreats.",
20882
- generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
20883
- tokenRecipes: {
20884
- palette: "warm-neutral",
20885
- contrast: "standard",
20886
- radius: "square",
20887
- shadow: "none",
20888
- typography: "serif-editorial",
20889
- spacing: "airy",
20890
- motion: "subtle"
20891
- },
20892
- compositionBudget: balancedBudget
20893
- }),
20894
- defineCuratedSiteStyle({
20895
- id: "site-style:bright-community",
20896
- name: "Bright Community",
20897
- description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
20898
- generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
20899
- tokenRecipes: {
20900
- palette: "brand-led",
20901
- contrast: "standard",
20902
- radius: "rounded",
20903
- shadow: "subtle",
20904
- typography: "friendly-sans",
20905
- spacing: "regular",
20906
- motion: "expressive"
20907
- },
20908
- compositionBudget: balancedBudget
20909
- }),
20910
- defineCuratedSiteStyle({
20911
- id: "site-style:quiet-luxury",
20912
- name: "Quiet Luxury",
20913
- description: "Minimal, confident, and refined for premium experiences and private services.",
20914
- generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
20915
- selectionKeywords: [
20916
- "luxury",
20917
- "premium",
20918
- "boutique",
20919
- "bespoke",
20920
- "exclusive"
20921
- ],
20922
- tokenRecipes: {
20923
- palette: "high-contrast",
20924
- contrast: "strong",
20925
- radius: "square",
20926
- shadow: "none",
20927
- typography: "classic-serif",
20928
- spacing: "airy",
20929
- motion: "none"
20930
- },
20931
- compositionBudget: quietBudget
20932
- }),
20933
- defineCuratedSiteStyle({
20934
- id: "site-style:practical-services",
20935
- name: "Practical Services",
20936
- description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
20937
- generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
20938
- selectionKeywords: [
20939
- "repair",
20940
- "plumb",
20941
- "electric",
20942
- "cleaning",
20943
- "landscap",
20944
- "contractor"
20945
- ],
20946
- tokenRecipes: {
20947
- palette: "brand-led",
20948
- contrast: "maximum",
20949
- radius: "soft",
20950
- shadow: "subtle",
20951
- typography: "clean-sans",
20952
- spacing: "compact",
20953
- motion: "none"
20954
- },
20955
- compositionBudget: quietBudget
20956
- }),
20957
- defineCuratedSiteStyle({
20958
- id: "site-style:modern-wellness",
20959
- name: "Modern Wellness",
20960
- description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
20961
- generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
20962
- tokenRecipes: {
20963
- palette: "soft-natural",
20964
- contrast: "standard",
20965
- radius: "rounded",
20966
- shadow: "subtle",
20967
- typography: "clean-sans",
20968
- spacing: "airy",
20969
- motion: "subtle"
20970
- },
20971
- compositionBudget: balancedBudget
21671
+ return value;
21672
+ }, z42.record(z42.string(), aspectCropSchema.catch({}))).optional(),
21673
+ rect: rectSchema.optional(),
21674
+ hotspot: hotspotSchema.optional(),
21675
+ rotation: rotationSchema.optional()
21676
+ });
21677
+ var mediaSchema = z42.object({
21678
+ type: z42.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
21679
+ purpose: z42.string().optional(),
21680
+ placeholder: z42.boolean().default(true).optional(),
21681
+ assetId: z42.string().optional(),
21682
+ identifier: z42.string().optional(),
21683
+ src: z42.string().optional(),
21684
+ alt: z42.string().optional(),
21685
+ filename: z42.string().optional(),
21686
+ mimeType: z42.string().optional(),
21687
+ width: z42.number().optional(),
21688
+ height: z42.number().optional(),
21689
+ storageBucket: z42.string().optional(),
21690
+ storagePath: z42.string().optional(),
21691
+ transform: transformSchema.optional()
21692
+ });
21693
+
21694
+ // ../theme-core/src/schema.ts
21695
+ init_buttons();
21696
+ var cardSpacingSchema = z.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
21697
+ var gradientDirectionSchema2 = z.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
21698
+ var cardBackgroundSchema = z.discriminatedUnion("type", [
21699
+ z.object({ type: z.literal("solid"), colorToken: z.string() }),
21700
+ z.object({
21701
+ type: z.literal("gradient"),
21702
+ fromToken: z.string(),
21703
+ toToken: z.string(),
21704
+ direction: gradientDirectionSchema2
20972
21705
  }),
20973
- defineCuratedSiteStyle({
20974
- id: "site-style:bold-launch",
20975
- name: "Bold Launch",
20976
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
20977
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
20978
- selectionKeywords: [
20979
- "launch",
20980
- "campaign",
20981
- "preorder",
20982
- "pre-order",
20983
- "waitlist",
20984
- "drop"
20985
- ],
20986
- tokenRecipes: {
20987
- palette: "high-contrast",
20988
- contrast: "maximum",
20989
- radius: "pill",
20990
- shadow: "layered",
20991
- typography: "clean-sans",
20992
- spacing: "regular",
20993
- motion: "expressive"
20994
- },
20995
- compositionBudget: expressiveBudget
20996
- })
20997
- ];
20998
- new Map(
20999
- curatedSiteStyles.map((style) => [style.id, style])
21000
- );
21706
+ z.object({ type: z.literal("transparent") })
21707
+ ]);
21708
+ var cardBorderSchema = z.object({
21709
+ widthClass: z.string(),
21710
+ colorToken: z.string()
21711
+ });
21712
+ var cardVariantSchema = z.object({
21713
+ id: z.string(),
21714
+ name: z.string().min(1).max(20),
21715
+ enabled: z.boolean(),
21716
+ priority: z.union([z.literal(1), z.literal(2), z.literal(3)]),
21717
+ // Appearance (token-based)
21718
+ background: cardBackgroundSchema,
21719
+ spacing: cardSpacingSchema,
21720
+ // Optional overrides (uses theme defaults if not specified)
21721
+ shadow: z.object({
21722
+ elevation: z.enum(["none", "low", "medium", "high"]),
21723
+ softness: z.enum(["crisp", "soft", "hard"]).nullable(),
21724
+ position: z.enum(["bottom", "bottom-right"]).default("bottom")
21725
+ }).optional(),
21726
+ corners: z.enum(["square", "soft", "rounded", "pill"]).optional(),
21727
+ // Border (optional)
21728
+ border: cardBorderSchema.optional()
21729
+ });
21730
+ var cardSystemSchema = z.object({
21731
+ variants: z.array(cardVariantSchema).min(1).max(3)
21732
+ });
21001
21733
 
21002
- // ../theme-core/src/site-styles/rawStyleFields.ts
21003
- var themeV2RuntimeStyleFieldNames = [
21004
- "_frameStyles",
21005
- "_sectionStyles",
21006
- "_containerStyles",
21007
- "_cardStyles",
21008
- // styleGroup is legacy runtime transition wiring rather than a nested
21009
- // override object, but normal editors should still never see it directly.
21010
- "styleGroup"
21011
- ];
21012
- var themeV2BlockSpecificRawStyleFieldNames = [
21013
- "_contentCardStyles",
21014
- "_textCardStyles"
21015
- ];
21016
- var themeV2NormalEditorRawStyleFieldNames = [
21017
- ...themeV2RuntimeStyleFieldNames,
21018
- ...themeV2BlockSpecificRawStyleFieldNames
21019
- ];
21020
- new Set(
21021
- themeV2NormalEditorRawStyleFieldNames
21022
- );
21734
+ // ../theme-core/src/cards/index.ts
21735
+ init_constants2();
21736
+ init_generateCardCss();
21737
+ init_generateDefaultCardSystem();
21023
21738
 
21024
- // ../theme-core/src/site-styles/designState.ts
21025
- var themeV2DesignStateSchemaVersion = 1;
21026
- var designResolutionPolicySchema = z.enum(["generated", "user", "admin", "sdk"]);
21027
- var runtimeStyleFieldNameSchema = z.enum(themeV2RuntimeStyleFieldNames);
21028
- var nonEmptyRuntimeStyleFieldNamesSchema = z.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
21029
- fields3[0],
21030
- ...fields3.slice(1)
21031
- ]);
21032
- var heroLegibilityStrategySchema = z.enum([
21739
+ // ../theme-core/src/schema.ts
21740
+ init_types5();
21741
+ init_types6();
21742
+ var gradientStopSchema = z.object({
21743
+ color: z.string(),
21744
+ // Theme color token name (e.g., 'primary-500')
21745
+ position: z.number().min(0).max(100)
21746
+ // Percentage 0-100
21747
+ });
21748
+ var gradientConfigSchema = z.object({
21749
+ type: z.enum(["linear", "radial"]),
21750
+ angle: z.number().min(0).max(360).optional(),
21751
+ // For linear gradients (degrees)
21752
+ position: z.string().optional(),
21753
+ // For radial gradients ('center', 'top left', etc.)
21754
+ stops: z.array(gradientStopSchema).min(2)
21755
+ });
21756
+
21757
+ // ../theme-core/src/schema.ts
21758
+ init_types7();
21759
+ init_validation();
21760
+ init_atRuleValidation();
21761
+ init_shared();
21762
+ var axesSchema = z.object({
21763
+ tone: z.enum(["minimal", "classic", "bold"]),
21764
+ energy: z.enum(["calm", "vibrant"]),
21765
+ density: z.enum(["airy", "regular", "compact"]),
21766
+ mediaBias: z.enum(["text", "media", "mixed"]),
21767
+ conversionBias: z.enum(["low", "med", "high"]),
21768
+ motion: z.enum(["subtle", "standard", "expressive"])
21769
+ });
21770
+ var colourHexString = z.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
21771
+ var paletteColorSchema = z.object({
21772
+ name: z.string().min(1),
21773
+ hex: colourHexString
21774
+ });
21775
+ var paletteMetaSchema = z.object({
21776
+ mode: z.enum(["light", "dark"])
21777
+ });
21778
+ var paletteSchema = z.object({
21779
+ colors: z.array(paletteColorSchema),
21780
+ meta: paletteMetaSchema
21781
+ });
21782
+ var typographyStyleSchema = z.object({
21783
+ family: z.string().min(1),
21784
+ weight: z.enum(["light", "regular", "medium", "semibold", "bold"]),
21785
+ letterSpacing: z.enum(["tight", "normal", "loose"]),
21786
+ lineHeight: z.enum(["normal", "relaxed", "loose"])
21787
+ });
21788
+ var bodyTypographyStyleSchema = typographyStyleSchema.extend({
21789
+ size: z.enum(["md", "lg", "xl"])
21790
+ });
21791
+ var headingSizeSchema = z.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
21792
+ var headingTypographyOverridesSchema = z.object({
21793
+ weight: z.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
21794
+ letterSpacing: z.enum(["tight", "normal", "loose"]).nullable().optional(),
21795
+ size: headingSizeSchema.nullable().optional(),
21796
+ lineHeight: z.enum(["normal", "relaxed", "loose"]).nullable().optional(),
21797
+ italic: z.boolean().nullable().optional(),
21798
+ colorToken: z.string().min(1).nullable().optional()
21799
+ // Palette token name for heading color
21800
+ });
21801
+ var headingTypographyStyleSchema = typographyStyleSchema.extend({
21802
+ case: z.enum(["uppercase", "normal", "smallCaps"]).nullable(),
21803
+ italic: z.boolean().nullable(),
21804
+ colorToken: z.string().min(1).nullable().optional()
21805
+ // Palette token name for heading color
21806
+ });
21807
+ var proseLinkUnderlineStyleSchema = z.enum(["solid", "dotted", "dashed"]);
21808
+ var proseLinkUnderlineThicknessSchema = z.enum(["auto", "fromFont", "thin", "medium", "thick"]);
21809
+ var proseLinkUnderlineOffsetSchema = z.enum(["auto", "tight", "normal", "loose"]);
21810
+ var proseLinkStyleSchema = z.object({
21811
+ colorToken: z.string().min(1).optional(),
21812
+ hoverColorToken: z.string().min(1).optional(),
21813
+ underline: z.boolean().optional(),
21814
+ decorationColorToken: z.string().min(1).optional(),
21815
+ hoverDecorationColorToken: z.string().min(1).optional(),
21816
+ underlineStyle: proseLinkUnderlineStyleSchema.optional(),
21817
+ underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
21818
+ underlineOffset: proseLinkUnderlineOffsetSchema.optional()
21819
+ });
21820
+ var semanticSpacingSchema = z.enum([
21033
21821
  "none",
21034
- "scrim-gradient",
21035
- "solid-panel"
21036
- ]);
21037
- function uniqueNonEmpty(values) {
21038
- const uniqueValues = [...new Set(values)];
21039
- const firstValue = uniqueValues[0];
21040
- if (!firstValue) {
21041
- throw new Error("Expected at least one Theme V2 design state option.");
21042
- }
21043
- return [firstValue, ...uniqueValues.slice(1)];
21044
- }
21045
- var userPanelTreatments = uniqueNonEmpty(
21046
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
21047
- );
21048
- var userFlushTreatments = uniqueNonEmpty(
21049
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
21050
- );
21051
- var userFlushBleeds = uniqueNonEmpty(
21052
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
21053
- );
21054
- var contentFrameIntentSchema = z.discriminatedUnion("kind", [
21055
- z.object({ kind: z.literal("plain") }).strict(),
21056
- z.object({
21057
- kind: z.literal("panel"),
21058
- treatment: z.enum(userPanelTreatments)
21059
- }).strict(),
21060
- z.object({
21061
- kind: z.literal("flush-panel"),
21062
- treatment: z.enum(userFlushTreatments),
21063
- bleed: z.enum(userFlushBleeds)
21064
- }).strict()
21065
- ]);
21066
- var blockDesignPlanSchema = z.object({
21067
- blockId: z.string().min(1).transform(asDesignBlockId),
21068
- blockKind: z.string().min(1),
21069
- purpose: z.string().min(1),
21070
- sectionSurface: z.enum(userDesignOptionCatalog.sectionSurfaces),
21071
- contentFrame: contentFrameIntentSchema,
21072
- itemSurface: z.enum(userDesignOptionCatalog.itemSurfaces),
21073
- transitionAfter: z.enum(userDesignOptionCatalog.transitions),
21074
- emphasis: z.enum(userDesignOptionCatalog.emphases),
21075
- heroLegibility: heroLegibilityStrategySchema.optional()
21076
- }).strict();
21077
- var styleAuthoritySchema = z.discriminatedUnion("kind", [
21078
- z.object({
21079
- kind: z.literal("theme-v2"),
21080
- source: designResolutionPolicySchema,
21081
- siteStyleId: z.string().min(1).transform(asSiteStyleId),
21082
- templateId: z.string().min(1).transform(asDesignSystemTemplateId),
21083
- templateVersion: z.number().int().nonnegative(),
21084
- resolverVersion: z.number().int().nonnegative()
21085
- }).strict(),
21086
- z.object({
21087
- kind: z.literal("legacy-raw"),
21088
- reason: z.enum(["pre-theme-v2", "manual-runtime-fields"])
21089
- }).strict(),
21090
- z.object({
21091
- kind: z.literal("advanced-detached"),
21092
- reason: z.literal("detached-custom-runtime-fields")
21093
- }).strict()
21094
- ]);
21095
- var blockRuntimeStyleAuthoritySchema = z.object({
21096
- unit: z.literal("block-runtime-fields"),
21097
- blockId: z.string().min(1).transform(asDesignBlockId),
21098
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
21099
- authority: styleAuthoritySchema
21100
- }).strict();
21101
- z.object({
21102
- schemaVersion: z.literal(themeV2DesignStateSchemaVersion),
21103
- siteStyleId: z.string().min(1).transform(asSiteStyleId),
21104
- templateId: z.string().min(1).transform(asDesignSystemTemplateId),
21105
- templateVersion: z.number().int().nonnegative(),
21106
- resolverVersion: z.number().int().nonnegative(),
21107
- rhythmPresetId: z.string().min(1),
21108
- blocks: z.array(blockDesignPlanSchema),
21109
- styleAuthorities: z.array(blockRuntimeStyleAuthoritySchema)
21110
- }).strict();
21111
- function uniqueNonEmpty2(values) {
21112
- const uniqueValues = [...new Set(values)];
21113
- const firstValue = uniqueValues[0];
21114
- if (!firstValue) {
21115
- throw new Error("Expected at least one generated schema option.");
21116
- }
21117
- return [firstValue, ...uniqueValues.slice(1)];
21118
- }
21119
- var generatedPanelTreatments = uniqueNonEmpty2(
21120
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
21121
- );
21122
- var generatedFlushTreatments = uniqueNonEmpty2(
21123
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
21124
- );
21125
- var generatedFlushBleeds = uniqueNonEmpty2(
21126
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
21127
- );
21128
- var generatedPanelFrameSchema = z.object({
21129
- kind: z.literal("panel"),
21130
- treatment: z.enum(generatedPanelTreatments)
21131
- }).strict();
21132
- var generatedFlushPanelFrameSchema = z.object({
21133
- kind: z.literal("flush-panel"),
21134
- treatment: z.enum(generatedFlushTreatments),
21135
- bleed: z.enum(generatedFlushBleeds)
21136
- }).strict();
21137
- var generatedContentFrameIntentSchema = z.discriminatedUnion("kind", [
21138
- z.object({ kind: z.literal("plain") }).strict(),
21139
- generatedPanelFrameSchema,
21140
- generatedFlushPanelFrameSchema
21141
- ]);
21142
- var generatedSiteStyleIdSchema = z.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
21143
- function generatedChoiceSchema(valueSchema) {
21144
- return z.discriminatedUnion("kind", [
21145
- z.object({
21146
- source: z.literal("generated"),
21147
- kind: z.literal("auto")
21148
- }).strict(),
21149
- z.object({
21150
- source: z.literal("generated"),
21151
- kind: z.literal("explicit"),
21152
- value: valueSchema
21153
- }).strict()
21154
- ]);
21155
- }
21156
- var generatedBlockDesignIntentSchema = z.object({
21157
- sectionSurface: generatedChoiceSchema(
21158
- z.enum(generatedDesignOptionCatalog.sectionSurfaces)
21159
- ),
21160
- contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
21161
- itemSurface: generatedChoiceSchema(
21162
- z.enum(generatedDesignOptionCatalog.itemSurfaces)
21163
- ),
21164
- transitionAfter: generatedChoiceSchema(
21165
- z.enum(generatedDesignOptionCatalog.transitions)
21166
- ),
21167
- emphasis: generatedChoiceSchema(
21168
- z.enum(generatedDesignOptionCatalog.emphases)
21169
- )
21170
- }).strict();
21171
- var generatedMediaCompositionIntentSchema = z.enum([
21172
- "none",
21173
- "supporting",
21174
- "dominant"
21175
- ]);
21176
- var generatedDecorativeCompositionIntentSchema = z.enum([
21177
- "none",
21178
- "supporting"
21179
- ]);
21180
- var generatedHeroLegibilityStrategySchema = z.enum([
21181
- "none",
21182
- "scrim-gradient"
21183
- ]);
21184
- var generatedBlockMediaIntentSchema = z.object({
21185
- media: generatedMediaCompositionIntentSchema,
21186
- decorative: generatedDecorativeCompositionIntentSchema,
21187
- heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
21188
- }).strict();
21189
- var generatedBoundaryIntentSchema = z.object({
21190
- transitionAfter: generatedChoiceSchema(
21191
- z.enum(generatedDesignOptionCatalog.transitions)
21192
- )
21193
- }).strict();
21194
- var generatedPageDesignBlockIntentSchema = z.object({
21195
- blockId: z.string().min(1),
21196
- blockKind: z.string().min(1),
21197
- purpose: z.string().min(1),
21198
- design: generatedBlockDesignIntentSchema,
21199
- mediaIntent: generatedBlockMediaIntentSchema,
21200
- boundaryIntent: generatedBoundaryIntentSchema
21201
- }).strict();
21202
- z.object({
21203
- siteStyleId: generatedSiteStyleIdSchema,
21204
- blocks: z.array(generatedPageDesignBlockIntentSchema)
21205
- }).strict();
21206
- var pageDesignIntentSchemaVersion = 1;
21207
- var pageDesignUserPinnedAppearanceChoiceSchema = z.object({
21208
- kind: z.literal("user-pinned"),
21209
- value: z.string().min(1).transform(asAppearancePresetId)
21210
- }).strict();
21211
- var pageDesignUserPinnedBoundaryChoiceSchema = z.object({
21212
- kind: z.literal("user-pinned"),
21213
- value: z.string().min(1).transform(asBoundaryOptionId)
21214
- }).strict();
21215
- var pageDesignBlockLookPinSchema = z.object({
21216
- blockId: z.string().min(1).transform(asDesignBlockId),
21217
- blockKind: z.string().min(1),
21218
- choice: pageDesignUserPinnedAppearanceChoiceSchema
21219
- }).strict();
21220
- var pageDesignBoundaryPinSchema = z.object({
21221
- boundaryId: z.string().min(1).transform(asDesignBoundaryId),
21222
- previousBlockId: z.string().min(1).transform(asDesignBlockId),
21223
- nextBlockId: z.string().min(1).transform(asDesignBlockId),
21224
- choice: pageDesignUserPinnedBoundaryChoiceSchema
21225
- }).strict().superRefine((pin, ctx) => {
21226
- const expectedBoundaryId = makeBoundaryId(
21227
- pin.previousBlockId,
21228
- pin.nextBlockId
21229
- );
21230
- if (pin.boundaryId !== expectedBoundaryId) {
21231
- ctx.addIssue({
21232
- code: z.ZodIssueCode.custom,
21233
- path: ["boundaryId"],
21234
- message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
21235
- });
21236
- }
21237
- });
21238
- z.object({
21239
- schemaVersion: z.literal(pageDesignIntentSchemaVersion),
21240
- siteStyleId: z.string().min(1).transform(asSiteStyleId),
21241
- pageFlowPresetId: z.string().min(1).transform(asPageFlowPresetId),
21242
- blockLookPins: z.array(pageDesignBlockLookPinSchema),
21243
- boundaryPins: z.array(pageDesignBoundaryPinSchema)
21244
- }).strict().superRefine((intent, ctx) => {
21245
- addDuplicateStringIssues(ctx, {
21246
- values: intent.blockLookPins.map((pin) => pin.blockId),
21247
- path: ["blockLookPins"],
21248
- label: "block Look pin"
21249
- });
21250
- addDuplicateStringIssues(ctx, {
21251
- values: intent.boundaryPins.map(
21252
- (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
21253
- ),
21254
- path: ["boundaryPins"],
21255
- label: "boundary pin"
21256
- });
21257
- });
21258
- function addDuplicateStringIssues(ctx, input) {
21259
- const seen = /* @__PURE__ */ new Set();
21260
- const duplicates = /* @__PURE__ */ new Set();
21261
- for (const value of input.values) {
21262
- if (seen.has(value)) {
21263
- duplicates.add(value);
21264
- }
21265
- seen.add(value);
21266
- }
21267
- for (const duplicate of duplicates) {
21268
- ctx.addIssue({
21269
- code: z.ZodIssueCode.custom,
21270
- path: [...input.path],
21271
- message: `Duplicate ${input.label}: ${duplicate}.`
21272
- });
21273
- }
21274
- }
21275
- function boundaryKey(previousBlockId, nextBlockId) {
21276
- return makeBoundaryId(previousBlockId, nextBlockId);
21277
- }
21278
- var hotspotSchema = z39.object({
21279
- x: z39.number().min(0).max(1),
21280
- y: z39.number().min(0).max(1),
21281
- radius: z39.number().optional()
21282
- });
21283
- var rotationSchema = z39.union([z39.literal(0), z39.literal(90), z39.literal(180), z39.literal(270)]);
21284
- var rectSchema = z39.tuple([z39.number(), z39.number(), z39.number(), z39.number()]);
21285
- var aspectCropSchema = z39.object({
21286
- aspect: z39.preprocess((value) => value == null ? void 0 : value, z39.string().optional()),
21287
- rect: z39.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
21288
- hotspot: z39.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
21289
- rotation: z39.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
21290
- });
21291
- var transformSchema = z39.object({
21292
- aspectCrops: z39.preprocess((value) => {
21293
- if (!value || typeof value !== "object" || Array.isArray(value)) {
21294
- return void 0;
21295
- }
21296
- return value;
21297
- }, z39.record(z39.string(), aspectCropSchema.catch({}))).optional(),
21298
- rect: rectSchema.optional(),
21299
- hotspot: hotspotSchema.optional(),
21300
- rotation: rotationSchema.optional()
21301
- });
21302
- var mediaSchema = z39.object({
21303
- type: z39.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
21304
- purpose: z39.string().optional(),
21305
- placeholder: z39.boolean().default(true).optional(),
21306
- assetId: z39.string().optional(),
21307
- identifier: z39.string().optional(),
21308
- src: z39.string().optional(),
21309
- alt: z39.string().optional(),
21310
- filename: z39.string().optional(),
21311
- mimeType: z39.string().optional(),
21312
- width: z39.number().optional(),
21313
- height: z39.number().optional(),
21314
- storageBucket: z39.string().optional(),
21315
- storagePath: z39.string().optional(),
21316
- transform: transformSchema.optional()
21317
- });
21318
- var cornerStyleSchema = z.enum(["square", "rounded", "pill"]);
21319
- var shadowSizeSchema = z.enum(["none", "low", "medium", "high"]);
21320
- var textTransformSchema = z.enum(["none", "uppercase", "lowercase", "capitalize"]);
21321
- var fontWeightSchema = z.union([z.literal(500), z.literal(600), z.literal(700)]);
21322
- var buttonTypographySchema = z.enum(["body", "heading"]);
21323
- var hoverTransformSchema = z.enum(["none", "lift", "scale", "press"]);
21324
- var hoverColorSchema = z.enum(["none", "brighten", "darken", "saturate", "token"]);
21325
- var buttonPaddingPresetSchema = z.enum(["compact", "default", "spacious"]);
21326
- var gradientStyleSchema = z.enum(["linear", "radial", "conic"]);
21327
- var gradientSharpnessSchema = z.enum(["smooth", "medium", "hard"]);
21328
- z.enum(["sm", "md", "lg", "xl"]);
21329
- var buttonSizeConfigSchema = z.object({
21330
- padding: z.string(),
21331
- fontSize: z.string().optional()
21332
- });
21333
- var buttonSizesSchema = z.object({
21334
- sm: buttonSizeConfigSchema,
21335
- md: buttonSizeConfigSchema,
21336
- lg: buttonSizeConfigSchema,
21337
- xl: buttonSizeConfigSchema.optional()
21338
- });
21339
- var backgroundTreatmentSchema = z.enum(["solid", "gradient", "outline", "ghost"]);
21340
- var outlineHoverEffectSchema = z.enum([
21341
- "border-glow",
21342
- "border-shift",
21343
- "border-grow",
21344
- "fill-transition",
21345
- "border-trace"
21346
- ]);
21347
- var buttonGlobalSettingsSchema = z.object({
21348
- cornerStyle: cornerStyleSchema,
21349
- cornerRadius: z.number().min(0).max(24).optional(),
21350
- shadow: shadowSizeSchema,
21351
- textTransform: textTransformSchema,
21352
- fontWeight: fontWeightSchema,
21353
- borderWidth: z.union([z.literal(1), z.literal(2), z.literal(3)]),
21354
- // Typography source (body or heading)
21355
- typography: buttonTypographySchema.optional(),
21356
- // Italic style
21357
- italic: z.boolean().optional(),
21358
- // Padding preset (applies to all variants unless overridden)
21359
- paddingPreset: buttonPaddingPresetSchema.optional(),
21360
- hoverTransform: hoverTransformSchema,
21361
- hoverColor: hoverColorSchema,
21362
- // When hoverColor is 'token', this specifies which token to use
21363
- hoverColorToken: z.string().optional(),
21364
- // Gradient settings (if any variant uses gradients)
21365
- gradientStyle: gradientStyleSchema.optional(),
21366
- gradientAngle: z.number().min(0).max(360).optional(),
21367
- gradientSharpness: gradientSharpnessSchema.optional()
21368
- });
21369
- var gradientDirectionSchema = z.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
21370
- var buttonBackgroundSchema = z.discriminatedUnion("type", [
21371
- z.object({ type: z.literal("solid"), colorToken: z.string() }),
21372
- z.object({
21373
- type: z.literal("gradient"),
21374
- stops: z.array(z.string()).min(2),
21375
- direction: gradientDirectionSchema
21376
- }),
21377
- z.object({ type: z.literal("transparent") })
21378
- ]);
21379
- var effectApplicationSchema = z.object({
21380
- effectId: z.string(),
21381
- options: z.record(z.string(), z.any()).optional()
21382
- });
21383
- var buttonBorderSchema = z.object({
21384
- widthClass: z.string(),
21385
- colorToken: z.string()
21386
- });
21387
- z.object({
21388
- id: z.string(),
21389
- name: z.string().min(1).max(20),
21390
- enabled: z.boolean(),
21391
- priority: z.union([z.literal(1), z.literal(2), z.literal(3)]),
21392
- backgroundTreatment: backgroundTreatmentSchema,
21393
- color: z.string().optional(),
21394
- gradientColors: z.tuple([z.string(), z.string()]).optional(),
21395
- borderColor: z.string().optional(),
21396
- outlineHoverEffect: outlineHoverEffectSchema.optional(),
21397
- effectPreset: z.string().optional()
21398
- });
21399
- var buttonVariantSchema = z.object({
21400
- id: z.string(),
21401
- name: z.string().min(1).max(20),
21402
- enabled: z.boolean(),
21403
- priority: z.union([z.literal(1), z.literal(2), z.literal(3)]),
21404
- // Base appearance (token-based)
21405
- background: buttonBackgroundSchema,
21406
- textColorToken: z.string(),
21407
- borderRadius: z.string(),
21408
- // Optional shadow override (uses theme.shadow if not specified)
21409
- shadow: z.object({
21410
- elevation: z.enum(["none", "low", "medium", "high"]),
21411
- softness: z.enum(["crisp", "soft", "hard"]).nullable(),
21412
- position: z.enum(["bottom", "bottom-right"]).default("bottom")
21413
- }).optional(),
21414
- // Border (optional)
21415
- border: buttonBorderSchema.optional(),
21416
- // Padding (optional, defaults to "0.5rem 1rem")
21417
- padding: z.string().optional(),
21418
- // Font size (optional, Tailwind text size class)
21419
- fontSize: z.string().optional(),
21420
- // Hover background token (per-variant override, takes precedence over global hoverColorToken)
21421
- hoverBackgroundToken: z.string().optional(),
21422
- // Effect composition
21423
- effects: z.object({
21424
- base: z.array(effectApplicationSchema).optional(),
21425
- hover: z.array(effectApplicationSchema).optional(),
21426
- active: z.array(effectApplicationSchema).optional(),
21427
- focus: z.array(effectApplicationSchema).optional()
21428
- }).optional()
21429
- });
21430
- var buttonSystemSchema = z.object({
21431
- global: buttonGlobalSettingsSchema,
21432
- variants: z.array(buttonVariantSchema).min(1).max(6),
21433
- sizes: buttonSizesSchema.optional()
21434
- });
21435
-
21436
- // ../theme-core/src/buttons/index.ts
21437
- init_generateButtonCss();
21438
- init_generateDefaultButtonSystem();
21439
- init_constants();
21440
- init_registry();
21441
- init_transform();
21442
- var cardSpacingSchema = z.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
21443
- var gradientDirectionSchema2 = z.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
21444
- var cardBackgroundSchema = z.discriminatedUnion("type", [
21445
- z.object({ type: z.literal("solid"), colorToken: z.string() }),
21446
- z.object({
21447
- type: z.literal("gradient"),
21448
- fromToken: z.string(),
21449
- toToken: z.string(),
21450
- direction: gradientDirectionSchema2
21451
- }),
21452
- z.object({ type: z.literal("transparent") })
21453
- ]);
21454
- var cardBorderSchema = z.object({
21455
- widthClass: z.string(),
21456
- colorToken: z.string()
21457
- });
21458
- var cardVariantSchema = z.object({
21459
- id: z.string(),
21460
- name: z.string().min(1).max(20),
21461
- enabled: z.boolean(),
21462
- priority: z.union([z.literal(1), z.literal(2), z.literal(3)]),
21463
- // Appearance (token-based)
21464
- background: cardBackgroundSchema,
21465
- spacing: cardSpacingSchema,
21466
- // Optional overrides (uses theme defaults if not specified)
21467
- shadow: z.object({
21468
- elevation: z.enum(["none", "low", "medium", "high"]),
21469
- softness: z.enum(["crisp", "soft", "hard"]).nullable(),
21470
- position: z.enum(["bottom", "bottom-right"]).default("bottom")
21471
- }).optional(),
21472
- corners: z.enum(["square", "soft", "rounded", "pill"]).optional(),
21473
- // Border (optional)
21474
- border: cardBorderSchema.optional()
21475
- });
21476
- var cardSystemSchema = z.object({
21477
- variants: z.array(cardVariantSchema).min(1).max(3)
21478
- });
21479
-
21480
- // ../theme-core/src/cards/index.ts
21481
- init_constants2();
21482
- init_generateCardCss();
21483
- init_generateDefaultCardSystem();
21484
-
21485
- // ../theme-core/src/schema.ts
21486
- init_types2();
21487
- init_types3();
21488
- var gradientStopSchema = z.object({
21489
- color: z.string(),
21490
- // Theme color token name (e.g., 'primary-500')
21491
- position: z.number().min(0).max(100)
21492
- // Percentage 0-100
21493
- });
21494
- var gradientConfigSchema = z.object({
21495
- type: z.enum(["linear", "radial"]),
21496
- angle: z.number().min(0).max(360).optional(),
21497
- // For linear gradients (degrees)
21498
- position: z.string().optional(),
21499
- // For radial gradients ('center', 'top left', etc.)
21500
- stops: z.array(gradientStopSchema).min(2)
21501
- });
21502
-
21503
- // ../theme-core/src/schema.ts
21504
- init_types4();
21505
- init_validation();
21506
- init_atRuleValidation();
21507
- init_shared();
21508
- var axesSchema = z.object({
21509
- tone: z.enum(["minimal", "classic", "bold"]),
21510
- energy: z.enum(["calm", "vibrant"]),
21511
- density: z.enum(["airy", "regular", "compact"]),
21512
- mediaBias: z.enum(["text", "media", "mixed"]),
21513
- conversionBias: z.enum(["low", "med", "high"]),
21514
- motion: z.enum(["subtle", "standard", "expressive"])
21515
- });
21516
- var colourHexString = z.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
21517
- var paletteColorSchema = z.object({
21518
- name: z.string().min(1),
21519
- hex: colourHexString
21520
- });
21521
- var paletteMetaSchema = z.object({
21522
- mode: z.enum(["light", "dark"])
21523
- });
21524
- var paletteSchema = z.object({
21525
- colors: z.array(paletteColorSchema),
21526
- meta: paletteMetaSchema
21527
- });
21528
- var typographyStyleSchema = z.object({
21529
- family: z.string().min(1),
21530
- weight: z.enum(["light", "regular", "medium", "semibold", "bold"]),
21531
- letterSpacing: z.enum(["tight", "normal", "loose"]),
21532
- lineHeight: z.enum(["normal", "relaxed", "loose"])
21533
- });
21534
- var bodyTypographyStyleSchema = typographyStyleSchema.extend({
21535
- size: z.enum(["md", "lg", "xl"])
21536
- });
21537
- var headingSizeSchema = z.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
21538
- var headingTypographyOverridesSchema = z.object({
21539
- weight: z.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
21540
- letterSpacing: z.enum(["tight", "normal", "loose"]).nullable().optional(),
21541
- size: headingSizeSchema.nullable().optional(),
21542
- lineHeight: z.enum(["normal", "relaxed", "loose"]).nullable().optional(),
21543
- italic: z.boolean().nullable().optional(),
21544
- colorToken: z.string().min(1).nullable().optional()
21545
- // Palette token name for heading color
21546
- });
21547
- var headingTypographyStyleSchema = typographyStyleSchema.extend({
21548
- case: z.enum(["uppercase", "normal", "smallCaps"]).nullable(),
21549
- italic: z.boolean().nullable(),
21550
- colorToken: z.string().min(1).nullable().optional()
21551
- // Palette token name for heading color
21552
- });
21553
- var proseLinkUnderlineStyleSchema = z.enum(["solid", "dotted", "dashed"]);
21554
- var proseLinkUnderlineThicknessSchema = z.enum(["auto", "fromFont", "thin", "medium", "thick"]);
21555
- var proseLinkUnderlineOffsetSchema = z.enum(["auto", "tight", "normal", "loose"]);
21556
- var proseLinkStyleSchema = z.object({
21557
- colorToken: z.string().min(1).optional(),
21558
- hoverColorToken: z.string().min(1).optional(),
21559
- underline: z.boolean().optional(),
21560
- decorationColorToken: z.string().min(1).optional(),
21561
- hoverDecorationColorToken: z.string().min(1).optional(),
21562
- underlineStyle: proseLinkUnderlineStyleSchema.optional(),
21563
- underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
21564
- underlineOffset: proseLinkUnderlineOffsetSchema.optional()
21565
- });
21566
- var semanticSpacingSchema = z.enum([
21567
- "none",
21568
- "compact",
21569
- "cozy",
21570
- "medium",
21571
- "comfortable",
21572
- "spacious"
21822
+ "compact",
21823
+ "cozy",
21824
+ "medium",
21825
+ "comfortable",
21826
+ "spacious"
21573
21827
  ]);
21574
21828
  var boxRoundedSchema = z.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
21575
21829
  var boxBackgroundOverlaySchema = z.object({
@@ -21988,6 +22242,994 @@ z.object({
21988
22242
  message: z.string().min(1),
21989
22243
  themes: z.array(themeSchema).length(3)
21990
22244
  });
22245
+
22246
+ // ../theme-core/src/palette/variants/types.ts
22247
+ function asPaletteVariantId(value) {
22248
+ if (value.length === 0) {
22249
+ throw new Error("PaletteVariantId must be a non-empty string");
22250
+ }
22251
+ return value;
22252
+ }
22253
+ var paletteVariantIdSchema = z.string().min(1).transform((value) => asPaletteVariantId(value));
22254
+ var PALETTE_TOKEN_NAMES = [
22255
+ "primary",
22256
+ "primaryForeground",
22257
+ "secondary",
22258
+ "accent",
22259
+ "success",
22260
+ "warning",
22261
+ "destructive",
22262
+ "background",
22263
+ "surface",
22264
+ "surfaceAlt",
22265
+ "muted",
22266
+ "text",
22267
+ "border"
22268
+ ];
22269
+ var paletteTokenNameSchema = z.enum(PALETTE_TOKEN_NAMES);
22270
+ var HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
22271
+ var hexColorSchema = z.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
22272
+ var variantPaletteColorSchema = paletteColorSchema.extend({
22273
+ name: paletteTokenNameSchema
22274
+ });
22275
+ z.object({
22276
+ id: paletteVariantIdSchema,
22277
+ name: z.string().min(1),
22278
+ description: z.string().min(1),
22279
+ tags: styleTagsSchema,
22280
+ mode: z.enum(["light", "dark"]),
22281
+ colors: z.array(variantPaletteColorSchema).min(1)
22282
+ });
22283
+ function definePaletteVariant(input) {
22284
+ return {
22285
+ id: asPaletteVariantId(input.id),
22286
+ name: input.name,
22287
+ description: input.description,
22288
+ tags: input.tags,
22289
+ mode: input.mode,
22290
+ colors: input.colors
22291
+ };
22292
+ }
22293
+ z.object({
22294
+ primary: hexColorSchema.optional(),
22295
+ primaryForeground: hexColorSchema.optional(),
22296
+ secondary: hexColorSchema.optional(),
22297
+ accent: hexColorSchema.optional(),
22298
+ success: hexColorSchema.optional(),
22299
+ warning: hexColorSchema.optional(),
22300
+ destructive: hexColorSchema.optional(),
22301
+ background: hexColorSchema.optional(),
22302
+ surface: hexColorSchema.optional(),
22303
+ surfaceAlt: hexColorSchema.optional(),
22304
+ muted: hexColorSchema.optional(),
22305
+ text: hexColorSchema.optional(),
22306
+ border: hexColorSchema.optional()
22307
+ }).strict().transform((value) => value);
22308
+
22309
+ // ../theme-core/src/palette/variants/brand-led.ts
22310
+ var brandLedCool = definePaletteVariant({
22311
+ id: "brand-led-cool",
22312
+ name: "Brand-led \u2014 Cool",
22313
+ description: "Confident blue primary with slate neutrals.",
22314
+ tags: { tone: "classic", energy: "calm", era: "modern" },
22315
+ mode: "light",
22316
+ colors: [
22317
+ { name: "primary", hex: "#2563eb" },
22318
+ { name: "secondary", hex: "#64748b" },
22319
+ { name: "accent", hex: "#0f766e" },
22320
+ { name: "success", hex: "#16a34a" },
22321
+ { name: "warning", hex: "#d97706" },
22322
+ { name: "destructive", hex: "#dc2626" },
22323
+ { name: "background", hex: "#ffffff" },
22324
+ { name: "surface", hex: "#ffffff" },
22325
+ { name: "surfaceAlt", hex: "#f8fafc" },
22326
+ { name: "muted", hex: "#f1f5f9" },
22327
+ { name: "text", hex: "#0f172a" },
22328
+ { name: "primaryForeground", hex: "#ffffff" },
22329
+ { name: "border", hex: "#cbd5e1" }
22330
+ ]
22331
+ });
22332
+ var brandLedWarm = definePaletteVariant({
22333
+ id: "brand-led-warm",
22334
+ name: "Brand-led \u2014 Warm",
22335
+ description: "Sunset orange primary with warm grey neutrals.",
22336
+ tags: { tone: "classic", energy: "vibrant", era: "modern" },
22337
+ mode: "light",
22338
+ colors: [
22339
+ { name: "primary", hex: "#ea580c" },
22340
+ { name: "secondary", hex: "#78716c" },
22341
+ { name: "accent", hex: "#a16207" },
22342
+ { name: "success", hex: "#16a34a" },
22343
+ { name: "warning", hex: "#d97706" },
22344
+ { name: "destructive", hex: "#b91c1c" },
22345
+ { name: "background", hex: "#fffaf3" },
22346
+ { name: "surface", hex: "#ffffff" },
22347
+ { name: "surfaceAlt", hex: "#fbeee0" },
22348
+ { name: "muted", hex: "#f4e2cd" },
22349
+ { name: "text", hex: "#1c1917" },
22350
+ { name: "primaryForeground", hex: "#fffaf3" },
22351
+ { name: "border", hex: "#d6c4ad" }
22352
+ ]
22353
+ });
22354
+ var brandLedJewel = definePaletteVariant({
22355
+ id: "brand-led-jewel",
22356
+ name: "Brand-led \u2014 Jewel",
22357
+ description: "Deep emerald primary with rich neutrals.",
22358
+ tags: { tone: "bold", energy: "vibrant", era: "modern" },
22359
+ mode: "light",
22360
+ colors: [
22361
+ { name: "primary", hex: "#047857" },
22362
+ { name: "secondary", hex: "#4b5563" },
22363
+ { name: "accent", hex: "#7c3aed" },
22364
+ { name: "success", hex: "#15803d" },
22365
+ { name: "warning", hex: "#b45309" },
22366
+ { name: "destructive", hex: "#b91c1c" },
22367
+ { name: "background", hex: "#ffffff" },
22368
+ { name: "surface", hex: "#ffffff" },
22369
+ { name: "surfaceAlt", hex: "#f5f5f4" },
22370
+ { name: "muted", hex: "#e7e5e4" },
22371
+ { name: "text", hex: "#0c0a09" },
22372
+ { name: "primaryForeground", hex: "#ffffff" },
22373
+ { name: "border", hex: "#a8a29e" }
22374
+ ]
22375
+ });
22376
+
22377
+ // ../theme-core/src/palette/variants/high-contrast.ts
22378
+ var highContrastInk = definePaletteVariant({
22379
+ id: "high-contrast-ink",
22380
+ name: "High Contrast \u2014 Ink",
22381
+ description: "Near-black primary with cool greys.",
22382
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
22383
+ mode: "light",
22384
+ colors: [
22385
+ { name: "primary", hex: "#111827" },
22386
+ { name: "secondary", hex: "#374151" },
22387
+ { name: "accent", hex: "#1d4ed8" },
22388
+ { name: "success", hex: "#047857" },
22389
+ { name: "warning", hex: "#b45309" },
22390
+ { name: "destructive", hex: "#b91c1c" },
22391
+ { name: "background", hex: "#ffffff" },
22392
+ { name: "surface", hex: "#ffffff" },
22393
+ { name: "surfaceAlt", hex: "#f3f4f6" },
22394
+ { name: "muted", hex: "#e5e7eb" },
22395
+ { name: "text", hex: "#030712" },
22396
+ { name: "primaryForeground", hex: "#ffffff" },
22397
+ { name: "border", hex: "#6b7280" }
22398
+ ]
22399
+ });
22400
+ var highContrastCharcoal = definePaletteVariant({
22401
+ id: "high-contrast-charcoal",
22402
+ name: "High Contrast \u2014 Charcoal",
22403
+ description: "Warm charcoal primary on a soft cream ground.",
22404
+ tags: { tone: "minimal", energy: "calm", era: "editorial" },
22405
+ mode: "light",
22406
+ colors: [
22407
+ { name: "primary", hex: "#1f2937" },
22408
+ { name: "secondary", hex: "#52525b" },
22409
+ { name: "accent", hex: "#a16207" },
22410
+ { name: "success", hex: "#15803d" },
22411
+ { name: "warning", hex: "#b45309" },
22412
+ { name: "destructive", hex: "#991b1b" },
22413
+ { name: "background", hex: "#fafaf9" },
22414
+ { name: "surface", hex: "#ffffff" },
22415
+ { name: "surfaceAlt", hex: "#f5f5f4" },
22416
+ { name: "muted", hex: "#e7e5e4" },
22417
+ { name: "text", hex: "#0c0a09" },
22418
+ { name: "primaryForeground", hex: "#fafaf9" },
22419
+ { name: "border", hex: "#a8a29e" }
22420
+ ]
22421
+ });
22422
+ var highContrastMonochrome = definePaletteVariant({
22423
+ id: "high-contrast-monochrome",
22424
+ name: "High Contrast \u2014 Monochrome",
22425
+ description: "Pure black-on-white with a single saturated accent.",
22426
+ tags: { tone: "bold", energy: "vibrant", era: "editorial" },
22427
+ mode: "light",
22428
+ colors: [
22429
+ { name: "primary", hex: "#000000" },
22430
+ { name: "secondary", hex: "#404040" },
22431
+ { name: "accent", hex: "#dc2626" },
22432
+ { name: "success", hex: "#000000" },
22433
+ { name: "warning", hex: "#000000" },
22434
+ { name: "destructive", hex: "#dc2626" },
22435
+ { name: "background", hex: "#ffffff" },
22436
+ { name: "surface", hex: "#ffffff" },
22437
+ { name: "surfaceAlt", hex: "#f5f5f5" },
22438
+ { name: "muted", hex: "#e5e5e5" },
22439
+ { name: "text", hex: "#000000" },
22440
+ { name: "primaryForeground", hex: "#ffffff" },
22441
+ { name: "border", hex: "#525252" }
22442
+ ]
22443
+ });
22444
+
22445
+ // ../theme-core/src/palette/variants/soft-natural.ts
22446
+ var softNaturalSage = definePaletteVariant({
22447
+ id: "soft-natural-sage",
22448
+ name: "Soft Natural \u2014 Sage",
22449
+ description: "Olive sage primary on an off-white ground.",
22450
+ tags: { tone: "classic", energy: "calm", era: "organic" },
22451
+ mode: "light",
22452
+ colors: [
22453
+ { name: "primary", hex: "#3f6212" },
22454
+ { name: "secondary", hex: "#6b7280" },
22455
+ { name: "accent", hex: "#0f766e" },
22456
+ { name: "success", hex: "#15803d" },
22457
+ { name: "warning", hex: "#a16207" },
22458
+ { name: "destructive", hex: "#b91c1c" },
22459
+ { name: "background", hex: "#fbfdf7" },
22460
+ { name: "surface", hex: "#ffffff" },
22461
+ { name: "surfaceAlt", hex: "#eef5e8" },
22462
+ { name: "muted", hex: "#e7efdf" },
22463
+ { name: "text", hex: "#1f2a1d" },
22464
+ { name: "primaryForeground", hex: "#ffffff" },
22465
+ { name: "border", hex: "#cbd8c0" }
22466
+ ]
22467
+ });
22468
+ var softNaturalStone = definePaletteVariant({
22469
+ id: "soft-natural-stone",
22470
+ name: "Soft Natural \u2014 Stone",
22471
+ description: "River-stone grey-green primary with cool neutrals.",
22472
+ tags: { tone: "minimal", energy: "calm", era: "organic" },
22473
+ mode: "light",
22474
+ colors: [
22475
+ { name: "primary", hex: "#5a7a5d" },
22476
+ { name: "secondary", hex: "#8a9a8c" },
22477
+ { name: "accent", hex: "#c9b88f" },
22478
+ { name: "success", hex: "#5a7a5d" },
22479
+ { name: "warning", hex: "#a89466" },
22480
+ { name: "destructive", hex: "#a3503e" },
22481
+ { name: "background", hex: "#faf6ec" },
22482
+ { name: "surface", hex: "#ffffff" },
22483
+ { name: "surfaceAlt", hex: "#f0ecdf" },
22484
+ { name: "muted", hex: "#e6e1d0" },
22485
+ { name: "text", hex: "#2f3d31" },
22486
+ { name: "primaryForeground", hex: "#faf6ec" },
22487
+ { name: "border", hex: "#c9c1ad" }
22488
+ ]
22489
+ });
22490
+ var softNaturalWatercolor = definePaletteVariant({
22491
+ id: "soft-natural-watercolor",
22492
+ name: "Soft Natural \u2014 Watercolor",
22493
+ description: "Soft sand primary with watercolour sage accents.",
22494
+ tags: { tone: "classic", energy: "vibrant", era: "organic" },
22495
+ mode: "light",
22496
+ colors: [
22497
+ { name: "primary", hex: "#a8825f" },
22498
+ { name: "secondary", hex: "#88a888" },
22499
+ { name: "accent", hex: "#c8a78e" },
22500
+ { name: "success", hex: "#7d8a5f" },
22501
+ { name: "warning", hex: "#c89a4d" },
22502
+ { name: "destructive", hex: "#a3503e" },
22503
+ { name: "background", hex: "#fefdfa" },
22504
+ { name: "surface", hex: "#ffffff" },
22505
+ { name: "surfaceAlt", hex: "#f6f1e6" },
22506
+ { name: "muted", hex: "#eee7d1" },
22507
+ { name: "text", hex: "#4a3d30" },
22508
+ { name: "primaryForeground", hex: "#fefdfa" },
22509
+ { name: "border", hex: "#d8c9a8" }
22510
+ ]
22511
+ });
22512
+
22513
+ // ../theme-core/src/palette/variants/warm-neutral.ts
22514
+ var warmNeutralClay = definePaletteVariant({
22515
+ id: "warm-neutral-clay",
22516
+ name: "Warm Neutral \u2014 Clay",
22517
+ description: "Terracotta primary on a cream ground.",
22518
+ tags: { tone: "classic", energy: "calm", era: "organic" },
22519
+ mode: "light",
22520
+ colors: [
22521
+ { name: "primary", hex: "#8b5e34" },
22522
+ { name: "secondary", hex: "#7c6f64" },
22523
+ { name: "accent", hex: "#a15c38" },
22524
+ { name: "success", hex: "#527853" },
22525
+ { name: "warning", hex: "#b7791f" },
22526
+ { name: "destructive", hex: "#b91c1c" },
22527
+ { name: "background", hex: "#fffaf3" },
22528
+ { name: "surface", hex: "#ffffff" },
22529
+ { name: "surfaceAlt", hex: "#f5eadc" },
22530
+ { name: "muted", hex: "#efe2d0" },
22531
+ { name: "text", hex: "#2f241c" },
22532
+ { name: "primaryForeground", hex: "#fffaf3" },
22533
+ { name: "border", hex: "#d8c6b3" }
22534
+ ]
22535
+ });
22536
+ var warmNeutralCream = definePaletteVariant({
22537
+ id: "warm-neutral-cream",
22538
+ name: "Warm Neutral \u2014 Cream",
22539
+ description: "Soft sand primary with pale cream surfaces.",
22540
+ tags: { tone: "minimal", energy: "calm", era: "organic" },
22541
+ mode: "light",
22542
+ colors: [
22543
+ { name: "primary", hex: "#b08864" },
22544
+ { name: "secondary", hex: "#9a8c7e" },
22545
+ { name: "accent", hex: "#c2956a" },
22546
+ { name: "success", hex: "#7d8a5f" },
22547
+ { name: "warning", hex: "#c89a4d" },
22548
+ { name: "destructive", hex: "#a3503e" },
22549
+ { name: "background", hex: "#fdf8ee" },
22550
+ { name: "surface", hex: "#ffffff" },
22551
+ { name: "surfaceAlt", hex: "#f4ebd9" },
22552
+ { name: "muted", hex: "#ede3cf" },
22553
+ { name: "text", hex: "#3b2f24" },
22554
+ { name: "primaryForeground", hex: "#fdf8ee" },
22555
+ { name: "border", hex: "#e0d2b8" }
22556
+ ]
22557
+ });
22558
+ var warmNeutralForest = definePaletteVariant({
22559
+ id: "warm-neutral-forest",
22560
+ name: "Warm Neutral \u2014 Forest",
22561
+ description: "Deep forest green primary with earthy neutrals.",
22562
+ tags: { tone: "classic", energy: "calm", era: "organic" },
22563
+ mode: "light",
22564
+ colors: [
22565
+ { name: "primary", hex: "#3d5840" },
22566
+ { name: "secondary", hex: "#7a6f5d" },
22567
+ { name: "accent", hex: "#b06b50" },
22568
+ { name: "success", hex: "#5a7a5d" },
22569
+ { name: "warning", hex: "#b7791f" },
22570
+ { name: "destructive", hex: "#b91c1c" },
22571
+ { name: "background", hex: "#fbf8f0" },
22572
+ { name: "surface", hex: "#ffffff" },
22573
+ { name: "surfaceAlt", hex: "#f2ecdb" },
22574
+ { name: "muted", hex: "#ebe3cc" },
22575
+ { name: "text", hex: "#2a2a2a" },
22576
+ { name: "primaryForeground", hex: "#fbf8f0" },
22577
+ { name: "border", hex: "#cdc1a4" }
22578
+ ]
22579
+ });
22580
+
22581
+ // ../theme-core/src/palette/variants/index.ts
22582
+ var paletteVariants = [
22583
+ // Brand-led family
22584
+ brandLedCool,
22585
+ brandLedWarm,
22586
+ brandLedJewel,
22587
+ // Warm-neutral family
22588
+ warmNeutralClay,
22589
+ warmNeutralCream,
22590
+ warmNeutralForest,
22591
+ // High-contrast family
22592
+ highContrastInk,
22593
+ highContrastCharcoal,
22594
+ highContrastMonochrome,
22595
+ // Soft-natural family
22596
+ softNaturalSage,
22597
+ softNaturalStone,
22598
+ softNaturalWatercolor
22599
+ ];
22600
+ new Map(
22601
+ paletteVariants.map((v) => [v.id, v])
22602
+ );
22603
+
22604
+ // ../theme-core/src/site-styles/sourceCatalogs.ts
22605
+ var generatedContentFrames = [
22606
+ plainFrame,
22607
+ panelFrame("inset"),
22608
+ panelFrame("raised"),
22609
+ flushPanelFrame({ bleed: "start" })
22610
+ ];
22611
+ var userContentFrames = [
22612
+ ...generatedContentFrames,
22613
+ panelFrame("editorial"),
22614
+ flushPanelFrame({ bleed: "end" }),
22615
+ flushPanelFrame({ bleed: "both" })
22616
+ ];
22617
+ var generatedDesignOptionCatalog = {
22618
+ sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
22619
+ contentFrames: generatedContentFrames,
22620
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
22621
+ transitions: ["none", "soft-fade-short", "soft-fade-long"],
22622
+ emphases: ["low", "medium", "high"]};
22623
+ var userDesignOptionCatalog = {
22624
+ sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
22625
+ contentFrames: userContentFrames,
22626
+ itemSurfaces: [
22627
+ ...generatedDesignOptionCatalog.itemSurfaces,
22628
+ "inset",
22629
+ "editorial"
22630
+ ],
22631
+ transitions: [
22632
+ ...generatedDesignOptionCatalog.transitions,
22633
+ "wave-edge",
22634
+ "angle-edge"
22635
+ ],
22636
+ emphases: generatedDesignOptionCatalog.emphases};
22637
+
22638
+ // ../theme-core/src/site-styles/curatedSiteStyles.ts
22639
+ var curatedSiteStyleIdValues = [
22640
+ "site-style:calm-studio",
22641
+ "site-style:clear-professional",
22642
+ "site-style:warm-editorial",
22643
+ "site-style:bright-community",
22644
+ "site-style:quiet-luxury",
22645
+ "site-style:practical-services",
22646
+ "site-style:modern-wellness",
22647
+ "site-style:bold-launch"
22648
+ ];
22649
+ var quietBudget = {
22650
+ accentDensity: "low",
22651
+ panelDensity: "medium",
22652
+ transitionMix: "quiet",
22653
+ primaryCtaLimit: 2,
22654
+ mediaDensity: "medium",
22655
+ decorativeRepetition: "low"
22656
+ };
22657
+ var balancedBudget = {
22658
+ accentDensity: "medium",
22659
+ panelDensity: "medium",
22660
+ transitionMix: "balanced",
22661
+ primaryCtaLimit: 3,
22662
+ mediaDensity: "medium",
22663
+ decorativeRepetition: "medium"
22664
+ };
22665
+ var expressiveBudget = {
22666
+ accentDensity: "high",
22667
+ panelDensity: "high",
22668
+ transitionMix: "expressive",
22669
+ primaryCtaLimit: 3,
22670
+ mediaDensity: "high",
22671
+ decorativeRepetition: "medium"
22672
+ };
22673
+ function uniqueContentFrameKinds() {
22674
+ const kinds = [...new Set(
22675
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
22676
+ )];
22677
+ const firstKind = kinds[0];
22678
+ if (!firstKind) {
22679
+ throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
22680
+ }
22681
+ return [firstKind, ...kinds.slice(1)];
22682
+ }
22683
+ var generatedContentFrameKinds = uniqueContentFrameKinds();
22684
+ function defineCuratedSiteStyle(input) {
22685
+ return {
22686
+ id: asSiteStyleId(input.id),
22687
+ name: input.name,
22688
+ description: input.description,
22689
+ generationBrief: input.generationBrief,
22690
+ selectionKeywords: input.selectionKeywords ?? [],
22691
+ template: {
22692
+ id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
22693
+ name: input.name,
22694
+ version: 1,
22695
+ tokenRecipes: input.tokenRecipes,
22696
+ compositionBudget: input.compositionBudget,
22697
+ supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
22698
+ supportedContentFrames: generatedContentFrameKinds,
22699
+ supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
22700
+ supportedTransitions: generatedDesignOptionCatalog.transitions
22701
+ },
22702
+ buttonPersonalityChoices: input.buttonPersonalityChoices,
22703
+ paletteVariantChoices: input.paletteVariantChoices
22704
+ };
22705
+ }
22706
+ function buttonChoice(id, note) {
22707
+ return { id: asButtonPersonalityId(id) };
22708
+ }
22709
+ function paletteChoice(id, note) {
22710
+ return { id: asPaletteVariantId(id) };
22711
+ }
22712
+ var curatedSiteStyles = [
22713
+ defineCuratedSiteStyle({
22714
+ id: "site-style:calm-studio",
22715
+ name: "Calm Studio",
22716
+ description: "Soft, measured, and spacious for intimate appointment or class businesses.",
22717
+ generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
22718
+ tokenRecipes: {
22719
+ palette: "soft-natural",
22720
+ contrast: "standard",
22721
+ radius: "soft",
22722
+ shadow: "subtle",
22723
+ typography: "friendly-sans",
22724
+ spacing: "airy",
22725
+ motion: "subtle"
22726
+ },
22727
+ compositionBudget: quietBudget,
22728
+ buttonPersonalityChoices: [
22729
+ buttonChoice("soft-pill"),
22730
+ buttonChoice("pebble"),
22731
+ buttonChoice("editorial-link"),
22732
+ buttonChoice("brushed-wash")
22733
+ ],
22734
+ paletteVariantChoices: [
22735
+ paletteChoice("soft-natural-sage"),
22736
+ paletteChoice("soft-natural-stone"),
22737
+ paletteChoice("warm-neutral-clay"),
22738
+ paletteChoice("soft-natural-watercolor")
22739
+ ]
22740
+ }),
22741
+ defineCuratedSiteStyle({
22742
+ id: "site-style:clear-professional",
22743
+ name: "Clear Professional",
22744
+ description: "Crisp, trustworthy, and direct for local services and consultancies.",
22745
+ generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
22746
+ tokenRecipes: {
22747
+ palette: "brand-led",
22748
+ contrast: "strong",
22749
+ radius: "soft",
22750
+ shadow: "subtle",
22751
+ typography: "clean-sans",
22752
+ spacing: "regular",
22753
+ motion: "subtle"
22754
+ },
22755
+ compositionBudget: balancedBudget,
22756
+ buttonPersonalityChoices: [
22757
+ buttonChoice("confident-chip"),
22758
+ buttonChoice("soft-pill"),
22759
+ buttonChoice("editorial-link")
22760
+ ],
22761
+ paletteVariantChoices: [
22762
+ paletteChoice("brand-led-cool"),
22763
+ paletteChoice("high-contrast-ink"),
22764
+ paletteChoice("brand-led-jewel")
22765
+ ]
22766
+ }),
22767
+ defineCuratedSiteStyle({
22768
+ id: "site-style:warm-editorial",
22769
+ name: "Warm Editorial",
22770
+ description: "Story-led and textured for educators, makers, venues, and retreats.",
22771
+ generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
22772
+ tokenRecipes: {
22773
+ palette: "warm-neutral",
22774
+ contrast: "standard",
22775
+ radius: "square",
22776
+ shadow: "none",
22777
+ typography: "serif-editorial",
22778
+ spacing: "airy",
22779
+ motion: "subtle"
22780
+ },
22781
+ compositionBudget: balancedBudget,
22782
+ buttonPersonalityChoices: [
22783
+ buttonChoice("editorial-link"),
22784
+ buttonChoice("soft-pill"),
22785
+ buttonChoice("brushed-wash")
22786
+ ],
22787
+ paletteVariantChoices: [
22788
+ paletteChoice("warm-neutral-cream"),
22789
+ paletteChoice("warm-neutral-clay"),
22790
+ paletteChoice("warm-neutral-forest"),
22791
+ paletteChoice("soft-natural-stone")
22792
+ ]
22793
+ }),
22794
+ defineCuratedSiteStyle({
22795
+ id: "site-style:bright-community",
22796
+ name: "Bright Community",
22797
+ description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
22798
+ generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
22799
+ tokenRecipes: {
22800
+ palette: "brand-led",
22801
+ contrast: "standard",
22802
+ radius: "rounded",
22803
+ shadow: "subtle",
22804
+ typography: "friendly-sans",
22805
+ spacing: "regular",
22806
+ motion: "expressive"
22807
+ },
22808
+ compositionBudget: balancedBudget,
22809
+ buttonPersonalityChoices: [
22810
+ buttonChoice("pebble"),
22811
+ buttonChoice("brushed-wash"),
22812
+ buttonChoice("confident-chip")
22813
+ ],
22814
+ paletteVariantChoices: [
22815
+ paletteChoice("brand-led-warm"),
22816
+ paletteChoice("brand-led-jewel"),
22817
+ paletteChoice("soft-natural-watercolor")
22818
+ ]
22819
+ }),
22820
+ defineCuratedSiteStyle({
22821
+ id: "site-style:quiet-luxury",
22822
+ name: "Quiet Luxury",
22823
+ description: "Minimal, confident, and refined for premium experiences and private services.",
22824
+ generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
22825
+ selectionKeywords: [
22826
+ "luxury",
22827
+ "premium",
22828
+ "boutique",
22829
+ "bespoke",
22830
+ "exclusive"
22831
+ ],
22832
+ tokenRecipes: {
22833
+ palette: "high-contrast",
22834
+ contrast: "strong",
22835
+ radius: "square",
22836
+ shadow: "none",
22837
+ typography: "classic-serif",
22838
+ spacing: "airy",
22839
+ motion: "none"
22840
+ },
22841
+ compositionBudget: quietBudget,
22842
+ buttonPersonalityChoices: [
22843
+ buttonChoice("editorial-link"),
22844
+ buttonChoice("confident-chip"),
22845
+ buttonChoice("soft-pill")
22846
+ ],
22847
+ paletteVariantChoices: [
22848
+ paletteChoice("high-contrast-charcoal"),
22849
+ paletteChoice("high-contrast-ink"),
22850
+ paletteChoice("warm-neutral-cream")
22851
+ ]
22852
+ }),
22853
+ defineCuratedSiteStyle({
22854
+ id: "site-style:practical-services",
22855
+ name: "Practical Services",
22856
+ description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
22857
+ generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
22858
+ selectionKeywords: [
22859
+ "repair",
22860
+ "plumb",
22861
+ "electric",
22862
+ "cleaning",
22863
+ "landscap",
22864
+ "contractor"
22865
+ ],
22866
+ tokenRecipes: {
22867
+ palette: "brand-led",
22868
+ contrast: "maximum",
22869
+ radius: "soft",
22870
+ shadow: "subtle",
22871
+ typography: "clean-sans",
22872
+ spacing: "compact",
22873
+ motion: "none"
22874
+ },
22875
+ compositionBudget: quietBudget,
22876
+ buttonPersonalityChoices: [
22877
+ buttonChoice("confident-chip"),
22878
+ buttonChoice("pebble"),
22879
+ buttonChoice("ink-stamp")
22880
+ ],
22881
+ paletteVariantChoices: [
22882
+ paletteChoice("brand-led-cool"),
22883
+ paletteChoice("high-contrast-ink"),
22884
+ paletteChoice("brand-led-warm")
22885
+ ]
22886
+ }),
22887
+ defineCuratedSiteStyle({
22888
+ id: "site-style:modern-wellness",
22889
+ name: "Modern Wellness",
22890
+ description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
22891
+ generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
22892
+ tokenRecipes: {
22893
+ palette: "soft-natural",
22894
+ contrast: "standard",
22895
+ radius: "rounded",
22896
+ shadow: "subtle",
22897
+ typography: "clean-sans",
22898
+ spacing: "airy",
22899
+ motion: "subtle"
22900
+ },
22901
+ compositionBudget: balancedBudget,
22902
+ buttonPersonalityChoices: [
22903
+ buttonChoice("soft-pill"),
22904
+ buttonChoice("pebble"),
22905
+ buttonChoice("confident-chip")
22906
+ ],
22907
+ paletteVariantChoices: [
22908
+ paletteChoice("soft-natural-sage"),
22909
+ paletteChoice("soft-natural-stone"),
22910
+ paletteChoice("warm-neutral-forest")
22911
+ ]
22912
+ }),
22913
+ defineCuratedSiteStyle({
22914
+ id: "site-style:bold-launch",
22915
+ name: "Bold Launch",
22916
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
22917
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
22918
+ selectionKeywords: [
22919
+ "launch",
22920
+ "campaign",
22921
+ "preorder",
22922
+ "pre-order",
22923
+ "waitlist",
22924
+ "drop"
22925
+ ],
22926
+ tokenRecipes: {
22927
+ palette: "high-contrast",
22928
+ contrast: "maximum",
22929
+ radius: "pill",
22930
+ shadow: "layered",
22931
+ typography: "clean-sans",
22932
+ spacing: "regular",
22933
+ motion: "expressive"
22934
+ },
22935
+ compositionBudget: expressiveBudget,
22936
+ buttonPersonalityChoices: [
22937
+ buttonChoice("ink-stamp"),
22938
+ buttonChoice("confident-chip"),
22939
+ buttonChoice("brushed-wash"),
22940
+ buttonChoice("pebble")
22941
+ ],
22942
+ paletteVariantChoices: [
22943
+ paletteChoice("high-contrast-monochrome"),
22944
+ paletteChoice("high-contrast-ink"),
22945
+ paletteChoice("brand-led-jewel"),
22946
+ paletteChoice("brand-led-warm")
22947
+ ]
22948
+ })
22949
+ ];
22950
+ new Map(
22951
+ curatedSiteStyles.map((style) => [style.id, style])
22952
+ );
22953
+
22954
+ // ../theme-core/src/site-styles/rawStyleFields.ts
22955
+ var themeV2RuntimeStyleFieldNames = [
22956
+ "_frameStyles",
22957
+ "_sectionStyles",
22958
+ "_containerStyles",
22959
+ "_cardStyles",
22960
+ // styleGroup is legacy runtime transition wiring rather than a nested
22961
+ // override object, but normal editors should still never see it directly.
22962
+ "styleGroup"
22963
+ ];
22964
+ var themeV2BlockSpecificRawStyleFieldNames = [
22965
+ "_contentCardStyles",
22966
+ "_textCardStyles"
22967
+ ];
22968
+ var themeV2NormalEditorRawStyleFieldNames = [
22969
+ ...themeV2RuntimeStyleFieldNames,
22970
+ ...themeV2BlockSpecificRawStyleFieldNames
22971
+ ];
22972
+ new Set(
22973
+ themeV2NormalEditorRawStyleFieldNames
22974
+ );
22975
+
22976
+ // ../theme-core/src/site-styles/designState.ts
22977
+ var themeV2DesignStateSchemaVersion = 1;
22978
+ var designResolutionPolicySchema = z.enum(["generated", "user", "admin", "sdk"]);
22979
+ var runtimeStyleFieldNameSchema = z.enum(themeV2RuntimeStyleFieldNames);
22980
+ var nonEmptyRuntimeStyleFieldNamesSchema = z.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
22981
+ fields3[0],
22982
+ ...fields3.slice(1)
22983
+ ]);
22984
+ var heroLegibilityStrategySchema = z.enum([
22985
+ "none",
22986
+ "scrim-gradient",
22987
+ "solid-panel"
22988
+ ]);
22989
+ function uniqueNonEmpty(values) {
22990
+ const uniqueValues = [...new Set(values)];
22991
+ const firstValue = uniqueValues[0];
22992
+ if (!firstValue) {
22993
+ throw new Error("Expected at least one Theme V2 design state option.");
22994
+ }
22995
+ return [firstValue, ...uniqueValues.slice(1)];
22996
+ }
22997
+ var userPanelTreatments = uniqueNonEmpty(
22998
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
22999
+ );
23000
+ var userFlushTreatments = uniqueNonEmpty(
23001
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
23002
+ );
23003
+ var userFlushBleeds = uniqueNonEmpty(
23004
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
23005
+ );
23006
+ var contentFrameIntentSchema = z.discriminatedUnion("kind", [
23007
+ z.object({ kind: z.literal("plain") }).strict(),
23008
+ z.object({
23009
+ kind: z.literal("panel"),
23010
+ treatment: z.enum(userPanelTreatments)
23011
+ }).strict(),
23012
+ z.object({
23013
+ kind: z.literal("flush-panel"),
23014
+ treatment: z.enum(userFlushTreatments),
23015
+ bleed: z.enum(userFlushBleeds)
23016
+ }).strict()
23017
+ ]);
23018
+ var blockDesignPlanSchema = z.object({
23019
+ blockId: z.string().min(1).transform(asDesignBlockId),
23020
+ blockKind: z.string().min(1),
23021
+ purpose: z.string().min(1),
23022
+ sectionSurface: z.enum(userDesignOptionCatalog.sectionSurfaces),
23023
+ contentFrame: contentFrameIntentSchema,
23024
+ itemSurface: z.enum(userDesignOptionCatalog.itemSurfaces),
23025
+ transitionAfter: z.enum(userDesignOptionCatalog.transitions),
23026
+ emphasis: z.enum(userDesignOptionCatalog.emphases),
23027
+ heroLegibility: heroLegibilityStrategySchema.optional()
23028
+ }).strict();
23029
+ var styleAuthoritySchema = z.discriminatedUnion("kind", [
23030
+ z.object({
23031
+ kind: z.literal("theme-v2"),
23032
+ source: designResolutionPolicySchema,
23033
+ siteStyleId: z.string().min(1).transform(asSiteStyleId),
23034
+ templateId: z.string().min(1).transform(asDesignSystemTemplateId),
23035
+ templateVersion: z.number().int().nonnegative(),
23036
+ resolverVersion: z.number().int().nonnegative()
23037
+ }).strict(),
23038
+ z.object({
23039
+ kind: z.literal("legacy-raw"),
23040
+ reason: z.enum(["pre-theme-v2", "manual-runtime-fields"])
23041
+ }).strict(),
23042
+ z.object({
23043
+ kind: z.literal("advanced-detached"),
23044
+ reason: z.literal("detached-custom-runtime-fields")
23045
+ }).strict()
23046
+ ]);
23047
+ var blockRuntimeStyleAuthoritySchema = z.object({
23048
+ unit: z.literal("block-runtime-fields"),
23049
+ blockId: z.string().min(1).transform(asDesignBlockId),
23050
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
23051
+ authority: styleAuthoritySchema
23052
+ }).strict();
23053
+ z.object({
23054
+ schemaVersion: z.literal(themeV2DesignStateSchemaVersion),
23055
+ siteStyleId: z.string().min(1).transform(asSiteStyleId),
23056
+ templateId: z.string().min(1).transform(asDesignSystemTemplateId),
23057
+ templateVersion: z.number().int().nonnegative(),
23058
+ resolverVersion: z.number().int().nonnegative(),
23059
+ rhythmPresetId: z.string().min(1),
23060
+ blocks: z.array(blockDesignPlanSchema),
23061
+ styleAuthorities: z.array(blockRuntimeStyleAuthoritySchema)
23062
+ }).strict();
23063
+ function uniqueNonEmpty2(values) {
23064
+ const uniqueValues = [...new Set(values)];
23065
+ const firstValue = uniqueValues[0];
23066
+ if (!firstValue) {
23067
+ throw new Error("Expected at least one generated schema option.");
23068
+ }
23069
+ return [firstValue, ...uniqueValues.slice(1)];
23070
+ }
23071
+ var generatedPanelTreatments = uniqueNonEmpty2(
23072
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
23073
+ );
23074
+ var generatedFlushTreatments = uniqueNonEmpty2(
23075
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
23076
+ );
23077
+ var generatedFlushBleeds = uniqueNonEmpty2(
23078
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
23079
+ );
23080
+ var generatedPanelFrameSchema = z.object({
23081
+ kind: z.literal("panel"),
23082
+ treatment: z.enum(generatedPanelTreatments)
23083
+ }).strict();
23084
+ var generatedFlushPanelFrameSchema = z.object({
23085
+ kind: z.literal("flush-panel"),
23086
+ treatment: z.enum(generatedFlushTreatments),
23087
+ bleed: z.enum(generatedFlushBleeds)
23088
+ }).strict();
23089
+ var generatedContentFrameIntentSchema = z.discriminatedUnion("kind", [
23090
+ z.object({ kind: z.literal("plain") }).strict(),
23091
+ generatedPanelFrameSchema,
23092
+ generatedFlushPanelFrameSchema
23093
+ ]);
23094
+ var generatedSiteStyleIdSchema = z.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
23095
+ function generatedChoiceSchema(valueSchema) {
23096
+ return z.discriminatedUnion("kind", [
23097
+ z.object({
23098
+ source: z.literal("generated"),
23099
+ kind: z.literal("auto")
23100
+ }).strict(),
23101
+ z.object({
23102
+ source: z.literal("generated"),
23103
+ kind: z.literal("explicit"),
23104
+ value: valueSchema
23105
+ }).strict()
23106
+ ]);
23107
+ }
23108
+ var generatedBlockDesignIntentSchema = z.object({
23109
+ sectionSurface: generatedChoiceSchema(
23110
+ z.enum(generatedDesignOptionCatalog.sectionSurfaces)
23111
+ ),
23112
+ contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
23113
+ itemSurface: generatedChoiceSchema(
23114
+ z.enum(generatedDesignOptionCatalog.itemSurfaces)
23115
+ ),
23116
+ transitionAfter: generatedChoiceSchema(
23117
+ z.enum(generatedDesignOptionCatalog.transitions)
23118
+ ),
23119
+ emphasis: generatedChoiceSchema(
23120
+ z.enum(generatedDesignOptionCatalog.emphases)
23121
+ )
23122
+ }).strict();
23123
+ var generatedMediaCompositionIntentSchema = z.enum([
23124
+ "none",
23125
+ "supporting",
23126
+ "dominant"
23127
+ ]);
23128
+ var generatedDecorativeCompositionIntentSchema = z.enum([
23129
+ "none",
23130
+ "supporting"
23131
+ ]);
23132
+ var generatedHeroLegibilityStrategySchema = z.enum([
23133
+ "none",
23134
+ "scrim-gradient"
23135
+ ]);
23136
+ var generatedBlockMediaIntentSchema = z.object({
23137
+ media: generatedMediaCompositionIntentSchema,
23138
+ decorative: generatedDecorativeCompositionIntentSchema,
23139
+ heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
23140
+ }).strict();
23141
+ var generatedBoundaryIntentSchema = z.object({
23142
+ transitionAfter: generatedChoiceSchema(
23143
+ z.enum(generatedDesignOptionCatalog.transitions)
23144
+ )
23145
+ }).strict();
23146
+ var generatedPageDesignBlockIntentSchema = z.object({
23147
+ blockId: z.string().min(1),
23148
+ blockKind: z.string().min(1),
23149
+ purpose: z.string().min(1),
23150
+ design: generatedBlockDesignIntentSchema,
23151
+ mediaIntent: generatedBlockMediaIntentSchema,
23152
+ boundaryIntent: generatedBoundaryIntentSchema
23153
+ }).strict();
23154
+ z.object({
23155
+ siteStyleId: generatedSiteStyleIdSchema,
23156
+ blocks: z.array(generatedPageDesignBlockIntentSchema)
23157
+ }).strict();
23158
+ var pageDesignIntentSchemaVersion = 1;
23159
+ var pageDesignUserPinnedAppearanceChoiceSchema = z.object({
23160
+ kind: z.literal("user-pinned"),
23161
+ value: z.string().min(1).transform(asAppearancePresetId)
23162
+ }).strict();
23163
+ var pageDesignUserPinnedBoundaryChoiceSchema = z.object({
23164
+ kind: z.literal("user-pinned"),
23165
+ value: z.string().min(1).transform(asBoundaryOptionId)
23166
+ }).strict();
23167
+ var pageDesignBlockLookPinSchema = z.object({
23168
+ blockId: z.string().min(1).transform(asDesignBlockId),
23169
+ blockKind: z.string().min(1),
23170
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
23171
+ }).strict();
23172
+ var pageDesignBoundaryPinSchema = z.object({
23173
+ boundaryId: z.string().min(1).transform(asDesignBoundaryId),
23174
+ previousBlockId: z.string().min(1).transform(asDesignBlockId),
23175
+ nextBlockId: z.string().min(1).transform(asDesignBlockId),
23176
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
23177
+ }).strict().superRefine((pin, ctx) => {
23178
+ const expectedBoundaryId = makeBoundaryId(
23179
+ pin.previousBlockId,
23180
+ pin.nextBlockId
23181
+ );
23182
+ if (pin.boundaryId !== expectedBoundaryId) {
23183
+ ctx.addIssue({
23184
+ code: z.ZodIssueCode.custom,
23185
+ path: ["boundaryId"],
23186
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
23187
+ });
23188
+ }
23189
+ });
23190
+ z.object({
23191
+ schemaVersion: z.literal(pageDesignIntentSchemaVersion),
23192
+ siteStyleId: z.string().min(1).transform(asSiteStyleId),
23193
+ pageFlowPresetId: z.string().min(1).transform(asPageFlowPresetId),
23194
+ blockLookPins: z.array(pageDesignBlockLookPinSchema),
23195
+ boundaryPins: z.array(pageDesignBoundaryPinSchema)
23196
+ }).strict().superRefine((intent, ctx) => {
23197
+ addDuplicateStringIssues(ctx, {
23198
+ values: intent.blockLookPins.map((pin) => pin.blockId),
23199
+ path: ["blockLookPins"],
23200
+ label: "block Look pin"
23201
+ });
23202
+ addDuplicateStringIssues(ctx, {
23203
+ values: intent.boundaryPins.map(
23204
+ (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
23205
+ ),
23206
+ path: ["boundaryPins"],
23207
+ label: "boundary pin"
23208
+ });
23209
+ });
23210
+ function addDuplicateStringIssues(ctx, input) {
23211
+ const seen = /* @__PURE__ */ new Set();
23212
+ const duplicates = /* @__PURE__ */ new Set();
23213
+ for (const value of input.values) {
23214
+ if (seen.has(value)) {
23215
+ duplicates.add(value);
23216
+ }
23217
+ seen.add(value);
23218
+ }
23219
+ for (const duplicate of duplicates) {
23220
+ ctx.addIssue({
23221
+ code: z.ZodIssueCode.custom,
23222
+ path: [...input.path],
23223
+ message: `Duplicate ${input.label}: ${duplicate}.`
23224
+ });
23225
+ }
23226
+ }
23227
+ function boundaryKey(previousBlockId, nextBlockId) {
23228
+ return makeBoundaryId(previousBlockId, nextBlockId);
23229
+ }
23230
+
23231
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
23232
+ init_personalities();
21991
23233
  var nonEmptyStringSchema = z.string().min(1);
21992
23234
  var blockContentVersionIdSchema = nonEmptyStringSchema.transform(asBlockContentVersionId);
21993
23235
  var designBlockIdSchema = nonEmptyStringSchema.transform(asDesignBlockId);
@@ -22104,6 +23346,8 @@ var noneBoundaryOption = {
22104
23346
  id: asBoundaryOptionId("break:none")};
22105
23347
  var softBoundaryOption = {
22106
23348
  id: asBoundaryOptionId("break:soft")};
23349
+ ({
23350
+ id: asBoundaryOptionId("break:wave")});
22107
23351
  var spaciousBoundaryOption = {
22108
23352
  id: asBoundaryOptionId("break:spacious")};
22109
23353
  [
@@ -22126,6 +23370,9 @@ var spaciousBoundaryOption = {
22126
23370
  defaultBoundaryOptionId: spaciousBoundaryOption.id
22127
23371
  }
22128
23372
  ];
23373
+
23374
+ // ../theme-core/src/site-styles/index.ts
23375
+ init_styleTags();
22129
23376
  var themeTokenRecipeOptions = {
22130
23377
  palette: ["brand-led", "warm-neutral", "high-contrast", "soft-natural"],
22131
23378
  contrast: ["standard", "strong", "maximum"],
@@ -22991,7 +24238,7 @@ var formattingTransforms = [
22991
24238
  ];
22992
24239
 
22993
24240
  // ../blocks/src/system/transforms/registry/ui.ts
22994
- init_core();
24241
+ init_core2();
22995
24242
  init_colorStyles();
22996
24243
  init_blockColorTokens();
22997
24244
  init_sectionState_shared();
@@ -23452,7 +24699,7 @@ var uiTransforms = [
23452
24699
 
23453
24700
  // ../blocks/src/system/transforms/registry/layout.ts
23454
24701
  init_colorConversion();
23455
- init_core();
24702
+ init_core2();
23456
24703
  init_colorStyles();
23457
24704
  var joinClasses4 = (parts) => parts.filter(
23458
24705
  (part) => typeof part === "string" && part.trim().length > 0
@@ -24138,14 +25385,16 @@ var headerCta = ctaButton({
24138
25385
  whenPath: "menu.ctaItem.label",
24139
25386
  variantPath: "menu.ctaItem.variant",
24140
25387
  linkPath: "menu.ctaItem.link",
24141
- className: `header-cta btn-sm ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
25388
+ sizeFallback: "sm",
25389
+ className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
24142
25390
  });
24143
25391
  var mobileCta = ctaButton({
24144
25392
  basePath: "menu.ctaItem",
24145
25393
  whenPath: "menu.ctaItem.label",
24146
25394
  variantPath: "menu.ctaItem.variant",
24147
25395
  linkPath: "menu.ctaItem.link",
24148
- className: "nav-mobile-cta btn-md rb-w-full"
25396
+ sizeFallback: "md",
25397
+ className: "nav-mobile-cta rb-w-full"
24149
25398
  });
24150
25399
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
24151
25400
  {
@@ -24491,6 +25740,16 @@ var bodyTextLayout = () => {
24491
25740
  const bodyTextNode = layout[0];
24492
25741
  return bodyTextNode ? [bodyTextNode] : [];
24493
25742
  };
25743
+ var businessAddressLayout = () => [
25744
+ text(
25745
+ {
25746
+ as: "p",
25747
+ className: "rb-caption rb-opacity-80"
25748
+ },
25749
+ bind("site.businessAddress.displayAddress"),
25750
+ when("content.showBusinessAddress", { equals: true })
25751
+ )
25752
+ ];
24494
25753
  var inlineBottomTextLayout = () => {
24495
25754
  const layout = footerTextLayout();
24496
25755
  const bottomTextNode = layout[1];
@@ -24526,6 +25785,7 @@ var simpleFooterLayout = stack(
24526
25785
  linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
24527
25786
  }),
24528
25787
  ...bodyTextLayout(),
25788
+ ...businessAddressLayout(),
24529
25789
  ...inlineBottomTextLayout()
24530
25790
  ],
24531
25791
  when("$root.theme.footer.variant", { equals: "simple" })
@@ -24574,6 +25834,7 @@ var columnsFooterLayout = stack(
24574
25834
  ]
24575
25835
  ),
24576
25836
  ...bodyTextLayout(),
25837
+ ...businessAddressLayout(),
24577
25838
  ...inlineBottomTextLayout()
24578
25839
  ],
24579
25840
  when("$root.theme.footer.variant", { equals: "columns" })
@@ -24676,6 +25937,7 @@ var splitFooterLayout = stack(
24676
25937
  )
24677
25938
  ]
24678
25939
  ),
25940
+ ...businessAddressLayout(),
24679
25941
  ...inlineBottomTextLayout()
24680
25942
  ],
24681
25943
  when("$root.theme.footer.variant", { equals: "split" })
@@ -24756,6 +26018,16 @@ var siteFooterManifest = createBlockManifest({
24756
26018
  fragments: [{ fragment: footerBottomTextFragment, fieldPriority: 0 }],
24757
26019
  // Skip section styles - this block uses theme-based styling
24758
26020
  skipSectionStyles: true,
26021
+ additionalFields: [
26022
+ {
26023
+ id: "showBusinessAddress",
26024
+ type: "boolean",
26025
+ label: "Add business address to site footer?",
26026
+ required: false,
26027
+ defaultValue: false,
26028
+ ui: { intent: "content" }
26029
+ }
26030
+ ],
24759
26031
  layout: footerLayout,
24760
26032
  description: "Site-wide footer with navigation links and optional columns.",
24761
26033
  styleTokens: {
@@ -28110,15 +29382,21 @@ function normalizeLocationMapContent(content) {
28110
29382
  const record = typeof content === "object" && content !== null ? content : {};
28111
29383
  const normalized = normalizeLocationMapProps({
28112
29384
  location: record.location,
29385
+ locationSource: record.locationSource,
29386
+ venueId: typeof record.venueId === "string" ? record.venueId : null,
28113
29387
  zoom: record.zoom,
28114
29388
  heightPx: record.heightPx,
28115
29389
  showAddressText: record.showAddressText,
28116
29390
  showDirections: record.showDirections,
28117
29391
  directionsLabel: typeof record.directionsLabel === "string" ? record.directionsLabel : null
28118
29392
  });
29393
+ const locationSource = normalizeLocationMapSource(record.locationSource);
29394
+ const venueId = typeof record.venueId === "string" && record.venueId.trim() ? record.venueId.trim() : null;
28119
29395
  return {
28120
29396
  heading: typeof record.heading === "string" ? record.heading : null,
28121
- location: normalized.locationValue,
29397
+ locationSource,
29398
+ venueId: locationSource === "venue" ? venueId : null,
29399
+ location: locationSource === "custom" ? normalized.locationValue : null,
28122
29400
  showAddressText: normalized.showAddressText,
28123
29401
  showDirections: normalized.showDirections,
28124
29402
  directionsLabel: normalized.directionsLabel,
@@ -28143,13 +29421,37 @@ var locationMapManifest = createBlockManifest({
28143
29421
  required: false,
28144
29422
  maxLength: 120
28145
29423
  }),
29424
+ parseFieldDefinition({
29425
+ id: "locationSource",
29426
+ type: "select",
29427
+ label: "Location source",
29428
+ defaultValue: "custom",
29429
+ options: [
29430
+ { value: "business_address", label: "Use business address" },
29431
+ { value: "venue", label: "Use a venue" },
29432
+ { value: "custom", label: "Custom address" }
29433
+ ],
29434
+ ui: { intent: "content", widget: "locationSourceSelect" }
29435
+ }),
29436
+ createSiteOptionSelectField({
29437
+ id: "venueId",
29438
+ label: "Venue",
29439
+ required: false,
29440
+ multiple: false,
29441
+ optionSource: "venues",
29442
+ ui: { intent: "content", visibleWhen: { field: "locationSource", equals: "venue" } }
29443
+ }),
28146
29444
  parseFieldDefinition({
28147
29445
  id: "location",
28148
29446
  type: "group",
28149
29447
  label: "Location",
28150
29448
  description: "Enter the address and place the map pin.",
28151
29449
  required: true,
28152
- ui: { widget: "locationPicker", intent: "content" },
29450
+ ui: {
29451
+ widget: "locationPicker",
29452
+ intent: "content",
29453
+ visibleWhen: { field: "locationSource", equals: "custom" }
29454
+ },
28153
29455
  schema: {
28154
29456
  fields: [
28155
29457
  {
@@ -28232,6 +29534,10 @@ var locationMapManifest = createBlockManifest({
28232
29534
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
28233
29535
  el("location-map", {
28234
29536
  location: { $bind: { from: "content.location", fallback: null } },
29537
+ businessAddress: { $bind: { from: "site.businessAddress", fallback: null } },
29538
+ locationSource: { $bind: { from: "content.locationSource", fallback: "custom" } },
29539
+ venueId: { $bind: { from: "content.venueId", fallback: null } },
29540
+ venuesById: { $bind: { from: "site.venuesById", fallback: null } },
28235
29541
  zoom: { $bind: { from: "content.zoom", fallback: LOCATION_MAP_DEFAULTS.zoom } },
28236
29542
  heightPx: { $bind: { from: "content.heightPx", fallback: LOCATION_MAP_DEFAULTS.heightPx } },
28237
29543
  showAddressText: { $bind: { from: "content.showAddressText", fallback: LOCATION_MAP_DEFAULTS.showAddressText } },
@@ -28709,7 +30015,7 @@ function listBlockDefinitions() {
28709
30015
  }
28710
30016
 
28711
30017
  // ../blocks/src/system/transforms/registry/index.ts
28712
- init_core();
30018
+ init_core2();
28713
30019
 
28714
30020
  // ../blocks/src/system/transforms/registry/background.ts
28715
30021
  init_background2();
@@ -30453,6 +31759,7 @@ init_generateShades();
30453
31759
  init_expandPalette();
30454
31760
 
30455
31761
  // ../blocks/src/index.ts
31762
+ init_buttons();
30456
31763
  init_tokens2();
30457
31764
 
30458
31765
  // ../theme-core/src/ThemeScope.tsx
@@ -43569,7 +44876,7 @@ var SimpleCache = class {
43569
44876
  };
43570
44877
 
43571
44878
  // src/version.ts
43572
- var SDK_VERSION = "0.60.1";
44879
+ var SDK_VERSION = "0.60.6";
43573
44880
 
43574
44881
  // src/client/error.ts
43575
44882
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -44363,19 +45670,20 @@ function createRiverbankClient(config2) {
44363
45670
  }
44364
45671
  return {
44365
45672
  async getSite(params) {
44366
- const { slug, domain, id, signal, force } = params;
45673
+ const { slug, domain, id, signal, force, currentPath } = params;
44367
45674
  if (!slug && !domain && !id) {
44368
45675
  throw new Error(
44369
45676
  `getSite() requires at least one identifier: slug, domain, or id. Received: ${JSON.stringify(params)}`
44370
45677
  );
44371
45678
  }
44372
- const cacheKey = `site:${slug || domain || id}`;
45679
+ const cacheKey = `site:${slug || domain || id}:${currentPath ?? ""}`;
44373
45680
  const siteId = id || slug || domain;
44374
45681
  return resilientFetch(cacheKey, async (sig) => {
44375
45682
  const apiParams = {};
44376
45683
  if (params.slug) apiParams.slug = params.slug;
44377
45684
  if (params.domain) apiParams.domain = params.domain;
44378
45685
  if (params.id) apiParams.id = params.id;
45686
+ if (currentPath) apiParams.currentPath = currentPath;
44379
45687
  if (force) apiParams.force = "true";
44380
45688
  return await apiClient({
44381
45689
  endpoint: "getSite",