@riverbankcms/sdk 0.60.3 → 0.60.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/_dts/api/src/bookingVerticals.d.ts +1 -0
  2. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -39
  3. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +2 -0
  4. package/dist/_dts/blocks/src/system/node/fragments/ctaButton.d.ts +2 -0
  5. package/dist/_dts/blocks/src/system/runtime/shared/themedButtonClass.d.ts +11 -0
  6. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +10 -2
  7. package/dist/_dts/core/src/participants.d.ts +32 -1
  8. package/dist/_dts/core/src/rectification.d.ts +79 -0
  9. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +6 -6
  10. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +17 -15
  11. package/dist/_dts/sdk/src/client/types.d.ts +1 -0
  12. package/dist/_dts/sdk/src/version.d.ts +1 -1
  13. package/dist/_dts/theme-core/src/buttons/personalities/brushed-wash.d.ts +7 -2
  14. package/dist/_dts/theme-core/src/buttons/personalities/confident-chip.d.ts +7 -2
  15. package/dist/_dts/theme-core/src/buttons/personalities/editorial-link.d.ts +7 -2
  16. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +86 -5
  17. package/dist/_dts/theme-core/src/buttons/personalities/ink-stamp.d.ts +7 -2
  18. package/dist/_dts/theme-core/src/buttons/personalities/pebble.d.ts +7 -2
  19. package/dist/_dts/theme-core/src/buttons/personalities/soft-pill.d.ts +7 -2
  20. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +10 -10
  21. package/dist/_dts/theme-core/src/palette/variants/brand-led.d.ts +33 -9
  22. package/dist/_dts/theme-core/src/palette/variants/high-contrast.d.ts +33 -9
  23. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +200 -4
  24. package/dist/_dts/theme-core/src/palette/variants/soft-natural.d.ts +33 -9
  25. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +10 -10
  26. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +33 -9
  27. package/dist/_dts/theme-core/src/site-styles/curatedChoices.d.ts +27 -0
  28. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +48 -194
  29. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -1
  30. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +12 -14
  31. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +46 -0
  32. package/dist/_dts/ui/src/palette/ColorChooserDialog.d.ts +47 -0
  33. package/dist/_dts/ui/src/palette/ColorSlotButton.d.ts +15 -0
  34. package/dist/_dts/ui/src/palette/ColorSwatchButton.d.ts +15 -0
  35. package/dist/_dts/ui/src/palette/PaletteTokenEditor.d.ts +50 -0
  36. package/dist/_dts/ui/src/palette/hex.d.ts +23 -0
  37. package/dist/_dts/ui/src/palette/index.d.ts +14 -0
  38. package/dist/cli/index.mjs +1023 -923
  39. package/dist/client/client.mjs +3410 -3221
  40. package/dist/client/hooks.mjs +1625 -1564
  41. package/dist/client/rendering/client.mjs +132 -37
  42. package/dist/client/rendering/islands.mjs +91 -30
  43. package/dist/client/rendering.mjs +1237 -1049
  44. package/dist/preview-next/client/runtime.mjs +3095 -2736
  45. package/dist/server/components.mjs +2381 -2255
  46. package/dist/server/config-validation.mjs +1625 -1564
  47. package/dist/server/config.mjs +1625 -1564
  48. package/dist/server/data.mjs +1625 -1564
  49. package/dist/server/index.mjs +4 -3
  50. package/dist/server/next.mjs +3233 -3106
  51. package/dist/server/page-converter.mjs +1625 -1564
  52. package/dist/server/prebuild.mjs +1 -1
  53. package/dist/server/rendering/server.mjs +2381 -2255
  54. package/dist/server/rendering.mjs +2381 -2255
  55. package/dist/server/routing.mjs +2340 -2271
  56. package/dist/server/server.mjs +1629 -1567
  57. package/dist/server/theme-bridge.mjs +130 -126
  58. package/dist/server/theme.mjs +131 -129
  59. package/package.json +1 -1
  60. package/dist/_dts/theme-core/src/site-styles/compatibility.d.ts +0 -109
@@ -1210,861 +1210,482 @@ function assertUniqueLayoutProfileKeys(profiles) {
1210
1210
  }
1211
1211
  }
1212
1212
 
1213
- // ../theme-core/src/site-styles/compatibility.ts
1213
+ // ../theme-core/src/buttons/personalities/types.ts
1214
+ import { z as z5 } from "zod";
1215
+
1216
+ // ../theme-core/src/buttons/types.ts
1214
1217
  import { z as z3 } from "zod";
1218
+ var VARIANT_ROLES = [
1219
+ "primary",
1220
+ "secondary",
1221
+ "outline",
1222
+ "ghost",
1223
+ "link",
1224
+ "tertiary",
1225
+ "accent"
1226
+ ];
1227
+ var cornerStyleSchema = z3.enum(["square", "rounded", "pill"]);
1228
+ var shadowSizeSchema = z3.enum(["none", "low", "medium", "high"]);
1229
+ var textTransformSchema = z3.enum(["none", "uppercase", "lowercase", "capitalize"]);
1230
+ var fontWeightSchema = z3.union([z3.literal(500), z3.literal(600), z3.literal(700)]);
1231
+ var buttonTypographySchema = z3.enum(["body", "heading"]);
1232
+ var letterSpacingSchema = z3.enum(["tight", "normal", "loose"]);
1233
+ var hoverTransformSchema = z3.enum(["none", "lift", "scale", "press"]);
1234
+ var hoverColorSchema = z3.enum(["none", "brighten", "darken", "saturate", "token"]);
1235
+ var buttonPaddingPresetSchema = z3.enum(["compact", "default", "spacious"]);
1236
+ var gradientStyleSchema = z3.enum(["linear", "radial", "conic"]);
1237
+ var gradientSharpnessSchema = z3.enum(["smooth", "medium", "hard"]);
1238
+ var prioritySchema = z3.union([z3.literal(1), z3.literal(2), z3.literal(3)]);
1239
+ var variantRoleSchema = z3.enum(VARIANT_ROLES);
1240
+ var buttonSizeNameSchema = z3.enum(["sm", "md", "lg", "xl"]);
1241
+ var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
1242
+ var paddingShorthandSchema = z3.string().refine(
1243
+ (value) => {
1244
+ const parts = value.split(/\s+/).filter(Boolean);
1245
+ return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
1246
+ },
1247
+ {
1248
+ message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
1249
+ }
1250
+ );
1251
+ var buttonSizeConfigSchema = z3.object({
1252
+ padding: paddingShorthandSchema,
1253
+ fontSize: z3.string().optional()
1254
+ });
1255
+ var buttonSizesSchema = z3.object({
1256
+ sm: buttonSizeConfigSchema,
1257
+ md: buttonSizeConfigSchema,
1258
+ lg: buttonSizeConfigSchema,
1259
+ xl: buttonSizeConfigSchema.optional()
1260
+ }).transform(({ sm, md, lg, xl }) => ({
1261
+ sm,
1262
+ md,
1263
+ lg,
1264
+ xl: xl ?? lg
1265
+ }));
1266
+ var buttonGlobalSettingsSchema = z3.object({
1267
+ cornerStyle: cornerStyleSchema,
1268
+ cornerRadius: z3.number().min(0).max(24).optional(),
1269
+ shadow: shadowSizeSchema,
1270
+ textTransform: textTransformSchema,
1271
+ fontWeight: fontWeightSchema,
1272
+ /**
1273
+ * @deprecated Set per-variant via `variant.border.widthClass` instead.
1274
+ * Schema field is preserved so existing presets parse; the value is unread
1275
+ * by the current generator and will be removed once the legacy
1276
+ * `primitives/content/components/Button.tsx` slot exports are deleted.
1277
+ */
1278
+ borderWidth: z3.union([z3.literal(1), z3.literal(2), z3.literal(3)]),
1279
+ // === Family-level typography ===
1280
+ // Typography source (body or heading) — selects which theme typography pool to inherit
1281
+ typography: buttonTypographySchema.optional(),
1282
+ // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
1283
+ // Sized variants get this as default; fixed variants inherit unless they override.
1284
+ // Size class CSS may still override at run time for sized variants.
1285
+ fontSize: z3.string().optional(),
1286
+ // Letter spacing applied to all variants
1287
+ letterSpacing: letterSpacingSchema.optional(),
1288
+ // Italic style
1289
+ italic: z3.boolean().optional(),
1290
+ // Padding preset (applies to sized variants without a sizes config)
1291
+ paddingPreset: buttonPaddingPresetSchema.optional(),
1292
+ hoverTransform: hoverTransformSchema,
1293
+ hoverColor: hoverColorSchema,
1294
+ // When hoverColor is 'token', this specifies which token to use
1295
+ hoverColorToken: z3.string().optional(),
1296
+ // Gradient settings (if any variant uses gradients)
1297
+ gradientStyle: gradientStyleSchema.optional(),
1298
+ gradientAngle: z3.number().min(0).max(360).optional(),
1299
+ gradientSharpness: gradientSharpnessSchema.optional()
1300
+ });
1301
+ var gradientDirectionSchema = z3.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
1302
+ var buttonBackgroundSchema = z3.discriminatedUnion("type", [
1303
+ z3.object({ type: z3.literal("solid"), colorToken: z3.string() }),
1304
+ z3.object({
1305
+ type: z3.literal("gradient"),
1306
+ stops: z3.array(z3.string()).min(2),
1307
+ direction: gradientDirectionSchema
1308
+ }),
1309
+ z3.object({ type: z3.literal("transparent") })
1310
+ ]);
1311
+ var effectApplicationSchema = z3.object({
1312
+ effectId: z3.string(),
1313
+ options: z3.record(z3.string(), z3.any()).optional()
1314
+ });
1315
+ var buttonBorderSchema = z3.object({
1316
+ widthClass: z3.string(),
1317
+ colorToken: z3.string()
1318
+ });
1319
+ var variantShadowSchema = z3.object({
1320
+ elevation: z3.enum(["none", "low", "medium", "high"]),
1321
+ softness: z3.enum(["crisp", "soft", "hard"]).nullable(),
1322
+ position: z3.enum(["bottom", "bottom-right"]).default("bottom")
1323
+ });
1324
+ var variantEffectsSchema = z3.object({
1325
+ base: z3.array(effectApplicationSchema).optional(),
1326
+ hover: z3.array(effectApplicationSchema).optional(),
1327
+ active: z3.array(effectApplicationSchema).optional(),
1328
+ focus: z3.array(effectApplicationSchema).optional()
1329
+ });
1330
+ var variantSizeOverridesSchema = z3.object({
1331
+ sm: buttonSizeConfigSchema.optional(),
1332
+ md: buttonSizeConfigSchema.optional(),
1333
+ lg: buttonSizeConfigSchema.optional(),
1334
+ xl: buttonSizeConfigSchema.optional()
1335
+ });
1336
+ var buttonVariantSchema = z3.object({
1337
+ id: z3.string(),
1338
+ name: z3.string().min(1).max(20),
1339
+ enabled: z3.boolean(),
1340
+ priority: prioritySchema,
1341
+ // Base appearance (token-based)
1342
+ background: buttonBackgroundSchema,
1343
+ textColorToken: z3.string(),
1344
+ /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
1345
+ borderRadius: z3.string().optional(),
1346
+ // Optional shadow override (uses theme.shadow if not specified)
1347
+ shadow: variantShadowSchema.optional(),
1348
+ // Border (optional)
1349
+ border: buttonBorderSchema.optional(),
1350
+ // Hover background token (per-variant override, takes precedence over global hoverColorToken)
1351
+ hoverBackgroundToken: z3.string().optional(),
1352
+ // Effect composition
1353
+ effects: variantEffectsSchema.optional(),
1354
+ // Per-variant size overrides — see VariantSizeOverrides
1355
+ sizes: variantSizeOverridesSchema.optional()
1356
+ });
1357
+ var buttonSystemSchema = z3.object({
1358
+ global: buttonGlobalSettingsSchema,
1359
+ variants: z3.array(buttonVariantSchema).min(1).max(6),
1360
+ sizes: buttonSizesSchema.optional()
1361
+ });
1362
+
1363
+ // ../theme-core/src/site-styles/styleTags.ts
1364
+ import { z as z4 } from "zod";
1215
1365
  var STYLE_AXIS_VALUES = {
1216
1366
  tone: ["minimal", "classic", "bold"],
1217
1367
  energy: ["calm", "vibrant"],
1218
1368
  motion: ["subtle", "standard", "expressive"],
1219
1369
  era: ["editorial", "modern", "organic", "technical", "retro"]
1220
1370
  };
1221
- var styleTagsSchema = z3.object({
1222
- tone: z3.enum(STYLE_AXIS_VALUES.tone).optional(),
1223
- energy: z3.enum(STYLE_AXIS_VALUES.energy).optional(),
1224
- motion: z3.enum(STYLE_AXIS_VALUES.motion).optional(),
1225
- era: z3.enum(STYLE_AXIS_VALUES.era).optional()
1371
+ var styleTagsSchema = z4.object({
1372
+ tone: z4.enum(STYLE_AXIS_VALUES.tone).optional(),
1373
+ energy: z4.enum(STYLE_AXIS_VALUES.energy).optional(),
1374
+ motion: z4.enum(STYLE_AXIS_VALUES.motion).optional(),
1375
+ era: z4.enum(STYLE_AXIS_VALUES.era).optional()
1226
1376
  });
1227
1377
 
1228
- // ../theme-core/src/site-styles/sourceCatalogs.ts
1229
- var generatedContentFrames = [
1230
- plainFrame,
1231
- panelFrame("inset"),
1232
- panelFrame("raised"),
1233
- flushPanelFrame({ bleed: "start" })
1234
- ];
1235
- var userContentFrames = [
1236
- ...generatedContentFrames,
1237
- panelFrame("editorial"),
1238
- flushPanelFrame({ bleed: "end" }),
1239
- flushPanelFrame({ bleed: "both" })
1240
- ];
1241
- var generatedDesignOptionCatalog = {
1242
- source: "generated",
1243
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
1244
- contentFrames: generatedContentFrames,
1245
- itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
1246
- transitions: ["none", "soft-fade-short", "soft-fade-long"],
1247
- emphases: ["low", "medium", "high"],
1248
- detachedCustom: false
1249
- };
1250
- var userDesignOptionCatalog = {
1251
- source: "user",
1252
- sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
1253
- contentFrames: userContentFrames,
1254
- itemSurfaces: [
1255
- ...generatedDesignOptionCatalog.itemSurfaces,
1256
- "inset",
1257
- "editorial"
1258
- ],
1259
- transitions: [
1260
- ...generatedDesignOptionCatalog.transitions,
1261
- "wave-edge",
1262
- "angle-edge"
1263
- ],
1264
- emphases: generatedDesignOptionCatalog.emphases,
1265
- detachedCustom: false
1266
- };
1267
- var advancedDesignOptionCatalog = {
1268
- source: "advanced",
1269
- sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
1270
- contentFrames: userDesignOptionCatalog.contentFrames,
1271
- itemSurfaces: userDesignOptionCatalog.itemSurfaces,
1272
- transitions: userDesignOptionCatalog.transitions,
1273
- emphases: userDesignOptionCatalog.emphases,
1274
- detachedCustom: true
1275
- };
1276
-
1277
- // ../theme-core/src/site-styles/curatedSiteStyles.ts
1278
- var curatedSiteStyleIdValues = [
1279
- "site-style:calm-studio",
1280
- "site-style:clear-professional",
1281
- "site-style:warm-editorial",
1282
- "site-style:bright-community",
1283
- "site-style:quiet-luxury",
1284
- "site-style:practical-services",
1285
- "site-style:modern-wellness",
1286
- "site-style:bold-launch"
1287
- ];
1288
- var quietBudget = {
1289
- accentDensity: "low",
1290
- panelDensity: "medium",
1291
- transitionMix: "quiet",
1292
- primaryCtaLimit: 2,
1293
- mediaDensity: "medium",
1294
- decorativeRepetition: "low"
1295
- };
1296
- var balancedBudget = {
1297
- accentDensity: "medium",
1298
- panelDensity: "medium",
1299
- transitionMix: "balanced",
1300
- primaryCtaLimit: 3,
1301
- mediaDensity: "medium",
1302
- decorativeRepetition: "medium"
1303
- };
1304
- var expressiveBudget = {
1305
- accentDensity: "high",
1306
- panelDensity: "high",
1307
- transitionMix: "expressive",
1308
- primaryCtaLimit: 3,
1309
- mediaDensity: "high",
1310
- decorativeRepetition: "medium"
1311
- };
1312
- function uniqueContentFrameKinds() {
1313
- const kinds = [...new Set(
1314
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
1315
- )];
1316
- const firstKind = kinds[0];
1317
- if (!firstKind) {
1318
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
1378
+ // ../theme-core/src/buttons/personalities/types.ts
1379
+ function asButtonPersonalityId(value) {
1380
+ if (value.length === 0) {
1381
+ throw new Error("ButtonPersonalityId must be a non-empty string");
1319
1382
  }
1320
- return [firstKind, ...kinds.slice(1)];
1383
+ return value;
1321
1384
  }
1322
- var generatedContentFrameKinds = uniqueContentFrameKinds();
1323
- function defineCuratedSiteStyle(input) {
1385
+ var buttonPersonalityIdSchema = z5.string().min(1).transform((value) => asButtonPersonalityId(value));
1386
+ var buttonPersonalitySchema = z5.object({
1387
+ id: buttonPersonalityIdSchema,
1388
+ name: z5.string().min(1),
1389
+ description: z5.string().min(1),
1390
+ tags: styleTagsSchema,
1391
+ buttonSystem: buttonSystemSchema
1392
+ });
1393
+ function defineButtonPersonality(input) {
1324
1394
  return {
1325
- id: asSiteStyleId(input.id),
1395
+ id: asButtonPersonalityId(input.id),
1326
1396
  name: input.name,
1327
1397
  description: input.description,
1328
- generationBrief: input.generationBrief,
1329
- selectionKeywords: input.selectionKeywords ?? [],
1330
- template: {
1331
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
1332
- name: input.name,
1333
- version: 1,
1334
- tokenRecipes: input.tokenRecipes,
1335
- compositionBudget: input.compositionBudget,
1336
- supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
1337
- supportedContentFrames: generatedContentFrameKinds,
1338
- supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
1339
- supportedTransitions: generatedDesignOptionCatalog.transitions
1340
- },
1341
- // The library IDs are already branded at construction (`asButtonPersonalityId`
1342
- // / `asPaletteVariantId`); the closed-union input type guarantees only
1343
- // shipped IDs reach this branch.
1344
- defaultButtonPersonalityId: input.defaultButtonPersonalityId,
1345
- acceptedButtons: input.acceptedButtons,
1346
- defaultPaletteVariantId: input.defaultPaletteVariantId,
1347
- acceptedPalettes: input.acceptedPalettes
1398
+ tags: input.tags,
1399
+ buttonSystem: input.buttonSystem
1348
1400
  };
1349
1401
  }
1350
- var curatedSiteStyles = [
1351
- defineCuratedSiteStyle({
1352
- id: "site-style:calm-studio",
1353
- name: "Calm Studio",
1354
- description: "Soft, measured, and spacious for intimate appointment or class businesses.",
1355
- generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
1356
- tokenRecipes: {
1357
- palette: "soft-natural",
1358
- contrast: "standard",
1359
- radius: "soft",
1360
- shadow: "subtle",
1361
- typography: "friendly-sans",
1362
- spacing: "airy",
1363
- motion: "subtle"
1364
- },
1365
- compositionBudget: quietBudget,
1366
- defaultButtonPersonalityId: "soft-pill",
1367
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "editorial"] },
1368
- defaultPaletteVariantId: "soft-natural-sage",
1369
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
1370
- }),
1371
- defineCuratedSiteStyle({
1372
- id: "site-style:clear-professional",
1373
- name: "Clear Professional",
1374
- description: "Crisp, trustworthy, and direct for local services and consultancies.",
1375
- generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
1376
- tokenRecipes: {
1377
- palette: "brand-led",
1378
- contrast: "strong",
1379
- radius: "soft",
1380
- shadow: "subtle",
1381
- typography: "clean-sans",
1382
- spacing: "regular",
1383
- motion: "subtle"
1402
+
1403
+ // ../theme-core/src/buttons/personalities/brushed-wash.ts
1404
+ var brushedWash = defineButtonPersonality({
1405
+ id: "brushed-wash",
1406
+ name: "Brushed Wash",
1407
+ description: "Watercolour-gradient buttons with soft shadows and generous padding.",
1408
+ tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
1409
+ buttonSystem: {
1410
+ global: {
1411
+ cornerStyle: "rounded",
1412
+ shadow: "low",
1413
+ textTransform: "none",
1414
+ fontWeight: 500,
1415
+ borderWidth: 1,
1416
+ hoverTransform: "none",
1417
+ hoverColor: "none"
1384
1418
  },
1385
- compositionBudget: balancedBudget,
1386
- defaultButtonPersonalityId: "confident-chip",
1387
- acceptedButtons: { tone: ["minimal", "classic"], era: ["modern", "editorial"] },
1388
- defaultPaletteVariantId: "brand-led-cool",
1389
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["modern", "editorial"] }
1390
- }),
1391
- defineCuratedSiteStyle({
1392
- id: "site-style:warm-editorial",
1393
- name: "Warm Editorial",
1394
- description: "Story-led and textured for educators, makers, venues, and retreats.",
1395
- generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
1396
- tokenRecipes: {
1397
- palette: "warm-neutral",
1398
- contrast: "standard",
1399
- radius: "square",
1400
- shadow: "none",
1401
- typography: "serif-editorial",
1402
- spacing: "airy",
1403
- motion: "subtle"
1419
+ sizes: {
1420
+ sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
1421
+ md: { padding: "1rem 2.5rem" },
1422
+ lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
1423
+ xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
1404
1424
  },
1405
- compositionBudget: balancedBudget,
1406
- defaultButtonPersonalityId: "editorial-link",
1407
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
1408
- defaultPaletteVariantId: "warm-neutral-cream",
1409
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
1410
- }),
1411
- defineCuratedSiteStyle({
1412
- id: "site-style:bright-community",
1413
- name: "Bright Community",
1414
- description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
1415
- generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
1416
- tokenRecipes: {
1417
- palette: "brand-led",
1418
- contrast: "standard",
1419
- radius: "rounded",
1420
- shadow: "subtle",
1421
- typography: "friendly-sans",
1422
- spacing: "regular",
1423
- motion: "expressive"
1425
+ variants: [
1426
+ {
1427
+ id: "primary",
1428
+ name: "Primary",
1429
+ enabled: true,
1430
+ priority: 1,
1431
+ background: {
1432
+ type: "gradient",
1433
+ stops: ["primary", "accent"],
1434
+ direction: "to-r"
1435
+ },
1436
+ textColorToken: "primaryForeground",
1437
+ borderRadius: "rounded-lg",
1438
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
1439
+ effects: {
1440
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
1441
+ }
1442
+ },
1443
+ {
1444
+ id: "secondary",
1445
+ name: "Secondary",
1446
+ enabled: true,
1447
+ priority: 2,
1448
+ background: {
1449
+ type: "gradient",
1450
+ stops: ["secondary", "accent"],
1451
+ direction: "to-br"
1452
+ },
1453
+ textColorToken: "primaryForeground",
1454
+ borderRadius: "rounded-lg",
1455
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
1456
+ effects: {
1457
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
1458
+ }
1459
+ },
1460
+ {
1461
+ id: "outline",
1462
+ name: "Outline",
1463
+ enabled: true,
1464
+ priority: 3,
1465
+ background: { type: "transparent" },
1466
+ textColorToken: "primary",
1467
+ borderRadius: "rounded-lg",
1468
+ border: { widthClass: "border", colorToken: "primary" },
1469
+ effects: {
1470
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
1471
+ }
1472
+ },
1473
+ {
1474
+ id: "ghost",
1475
+ name: "Ghost",
1476
+ enabled: true,
1477
+ priority: 3,
1478
+ background: { type: "transparent" },
1479
+ textColorToken: "text",
1480
+ borderRadius: "rounded-lg",
1481
+ effects: {
1482
+ hover: [
1483
+ { effectId: "background-on-hover", options: { colorToken: "surface" } }
1484
+ ]
1485
+ }
1486
+ }
1487
+ ]
1488
+ }
1489
+ });
1490
+
1491
+ // ../theme-core/src/buttons/personalities/confident-chip.ts
1492
+ var confidentChip = defineButtonPersonality({
1493
+ id: "confident-chip",
1494
+ name: "Confident Chip",
1495
+ description: "Mid-radius solid buttons with a crisp hover.",
1496
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
1497
+ buttonSystem: {
1498
+ global: {
1499
+ cornerStyle: "rounded",
1500
+ shadow: "medium",
1501
+ textTransform: "none",
1502
+ fontWeight: 600,
1503
+ borderWidth: 1,
1504
+ hoverTransform: "none",
1505
+ hoverColor: "none"
1424
1506
  },
1425
- compositionBudget: balancedBudget,
1426
- defaultButtonPersonalityId: "pebble",
1427
- acceptedButtons: { tone: ["classic", "bold"], era: ["organic", "modern"] },
1428
- defaultPaletteVariantId: "brand-led-warm",
1429
- acceptedPalettes: { tone: ["classic", "bold"], era: ["modern", "organic"] }
1430
- }),
1431
- defineCuratedSiteStyle({
1432
- id: "site-style:quiet-luxury",
1433
- name: "Quiet Luxury",
1434
- description: "Minimal, confident, and refined for premium experiences and private services.",
1435
- generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
1436
- selectionKeywords: [
1437
- "luxury",
1438
- "premium",
1439
- "boutique",
1440
- "bespoke",
1441
- "exclusive"
1442
- ],
1443
- tokenRecipes: {
1444
- palette: "high-contrast",
1445
- contrast: "strong",
1446
- radius: "square",
1507
+ variants: [
1508
+ {
1509
+ id: "primary",
1510
+ name: "Primary",
1511
+ enabled: true,
1512
+ priority: 1,
1513
+ background: { type: "solid", colorToken: "primary" },
1514
+ textColorToken: "primaryForeground",
1515
+ borderRadius: "rounded-md",
1516
+ shadow: { elevation: "medium", softness: "soft", position: "bottom" },
1517
+ effects: {
1518
+ hover: [{ effectId: "darken-background", options: { amount: 60 } }],
1519
+ active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
1520
+ }
1521
+ },
1522
+ {
1523
+ id: "secondary",
1524
+ name: "Secondary",
1525
+ enabled: true,
1526
+ priority: 2,
1527
+ background: { type: "solid", colorToken: "surface" },
1528
+ textColorToken: "text",
1529
+ borderRadius: "rounded-md",
1530
+ border: { widthClass: "border", colorToken: "border" },
1531
+ effects: {
1532
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
1533
+ }
1534
+ },
1535
+ {
1536
+ id: "outline",
1537
+ name: "Outline",
1538
+ enabled: true,
1539
+ priority: 3,
1540
+ background: { type: "transparent" },
1541
+ textColorToken: "primary",
1542
+ borderRadius: "rounded-md",
1543
+ border: { widthClass: "border", colorToken: "primary" },
1544
+ effects: {
1545
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
1546
+ }
1547
+ },
1548
+ {
1549
+ id: "ghost",
1550
+ name: "Ghost",
1551
+ enabled: true,
1552
+ priority: 3,
1553
+ background: { type: "transparent" },
1554
+ textColorToken: "primary",
1555
+ borderRadius: "rounded-md",
1556
+ effects: {
1557
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
1558
+ }
1559
+ }
1560
+ ]
1561
+ }
1562
+ });
1563
+
1564
+ // ../theme-core/src/buttons/personalities/editorial-link.ts
1565
+ var editorialLink = defineButtonPersonality({
1566
+ id: "editorial-link",
1567
+ name: "Editorial Link",
1568
+ description: "Link-style with a growing underline. Refined, typographic.",
1569
+ tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
1570
+ buttonSystem: {
1571
+ global: {
1572
+ cornerStyle: "square",
1447
1573
  shadow: "none",
1448
- typography: "classic-serif",
1449
- spacing: "airy",
1450
- motion: "none"
1451
- },
1452
- compositionBudget: quietBudget,
1453
- defaultButtonPersonalityId: "editorial-link",
1454
- acceptedButtons: { tone: ["minimal", "classic"], era: ["editorial", "organic"] },
1455
- defaultPaletteVariantId: "high-contrast-charcoal",
1456
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["editorial", "organic"] }
1457
- }),
1458
- defineCuratedSiteStyle({
1459
- id: "site-style:practical-services",
1460
- name: "Practical Services",
1461
- description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
1462
- generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
1463
- selectionKeywords: [
1464
- "repair",
1465
- "plumb",
1466
- "electric",
1467
- "cleaning",
1468
- "landscap",
1469
- "contractor"
1470
- ],
1471
- tokenRecipes: {
1472
- palette: "brand-led",
1473
- contrast: "maximum",
1474
- radius: "soft",
1475
- shadow: "subtle",
1476
- typography: "clean-sans",
1477
- spacing: "compact",
1478
- motion: "none"
1479
- },
1480
- compositionBudget: quietBudget,
1481
- defaultButtonPersonalityId: "confident-chip",
1482
- acceptedButtons: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] },
1483
- defaultPaletteVariantId: "brand-led-cool",
1484
- acceptedPalettes: { tone: ["minimal", "classic", "bold"], era: ["modern", "editorial"] }
1485
- }),
1486
- defineCuratedSiteStyle({
1487
- id: "site-style:modern-wellness",
1488
- name: "Modern Wellness",
1489
- description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
1490
- generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
1491
- tokenRecipes: {
1492
- palette: "soft-natural",
1493
- contrast: "standard",
1494
- radius: "rounded",
1495
- shadow: "subtle",
1496
- typography: "clean-sans",
1497
- spacing: "airy",
1498
- motion: "subtle"
1574
+ textTransform: "none",
1575
+ fontWeight: 500,
1576
+ borderWidth: 1,
1577
+ hoverTransform: "none",
1578
+ hoverColor: "none"
1499
1579
  },
1500
- compositionBudget: balancedBudget,
1501
- defaultButtonPersonalityId: "soft-pill",
1502
- acceptedButtons: { tone: ["minimal", "classic"], era: ["organic", "modern"] },
1503
- defaultPaletteVariantId: "soft-natural-sage",
1504
- acceptedPalettes: { tone: ["minimal", "classic"], era: ["organic"] }
1505
- }),
1506
- defineCuratedSiteStyle({
1507
- id: "site-style:bold-launch",
1508
- name: "Bold Launch",
1509
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
1510
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
1511
- selectionKeywords: [
1512
- "launch",
1513
- "campaign",
1514
- "preorder",
1515
- "pre-order",
1516
- "waitlist",
1517
- "drop"
1518
- ],
1519
- tokenRecipes: {
1520
- palette: "high-contrast",
1521
- contrast: "maximum",
1522
- radius: "pill",
1523
- shadow: "layered",
1524
- typography: "clean-sans",
1525
- spacing: "regular",
1526
- motion: "expressive"
1527
- },
1528
- compositionBudget: expressiveBudget,
1529
- defaultButtonPersonalityId: "ink-stamp",
1530
- acceptedButtons: { tone: ["classic", "bold"], era: ["editorial", "organic", "modern"] },
1531
- defaultPaletteVariantId: "high-contrast-monochrome",
1532
- acceptedPalettes: { tone: ["bold"], era: ["editorial", "modern"] }
1533
- })
1534
- ];
1535
- var curatedSiteStylesById = new Map(
1536
- curatedSiteStyles.map((style) => [style.id, style])
1537
- );
1538
-
1539
- // ../theme-core/src/site-styles/designState.ts
1540
- import { z as z4 } from "zod";
1541
-
1542
- // ../theme-core/src/site-styles/rawStyleFields.ts
1543
- var themeV2RuntimeStyleFieldNames = [
1544
- "_frameStyles",
1545
- "_sectionStyles",
1546
- "_containerStyles",
1547
- "_cardStyles",
1548
- // styleGroup is legacy runtime transition wiring rather than a nested
1549
- // override object, but normal editors should still never see it directly.
1550
- "styleGroup"
1551
- ];
1552
- var themeV2BlockSpecificRawStyleFieldNames = [
1553
- "_contentCardStyles",
1554
- "_textCardStyles"
1555
- ];
1556
- var themeV2NormalEditorRawStyleFieldNames = [
1557
- ...themeV2RuntimeStyleFieldNames,
1558
- ...themeV2BlockSpecificRawStyleFieldNames
1559
- ];
1560
- var themeV2NormalEditorRawStyleFieldNameSet = new Set(
1561
- themeV2NormalEditorRawStyleFieldNames
1562
- );
1563
-
1564
- // ../theme-core/src/site-styles/designState.ts
1565
- var themeV2DesignStateSchemaVersion = 1;
1566
- var designResolutionPolicySchema = z4.enum(["generated", "user", "admin", "sdk"]);
1567
- var runtimeStyleFieldNameSchema = z4.enum(themeV2RuntimeStyleFieldNames);
1568
- var nonEmptyRuntimeStyleFieldNamesSchema = z4.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
1569
- fields3[0],
1570
- ...fields3.slice(1)
1571
- ]);
1572
- var heroLegibilityStrategySchema = z4.enum([
1573
- "none",
1574
- "scrim-gradient",
1575
- "solid-panel"
1576
- ]);
1577
- function uniqueNonEmpty(values) {
1578
- const uniqueValues = [...new Set(values)];
1579
- const firstValue = uniqueValues[0];
1580
- if (!firstValue) {
1581
- throw new Error("Expected at least one Theme V2 design state option.");
1582
- }
1583
- return [firstValue, ...uniqueValues.slice(1)];
1584
- }
1585
- var userPanelTreatments = uniqueNonEmpty(
1586
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
1587
- );
1588
- var userFlushTreatments = uniqueNonEmpty(
1589
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
1590
- );
1591
- var userFlushBleeds = uniqueNonEmpty(
1592
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
1593
- );
1594
- var contentFrameIntentSchema = z4.discriminatedUnion("kind", [
1595
- z4.object({ kind: z4.literal("plain") }).strict(),
1596
- z4.object({
1597
- kind: z4.literal("panel"),
1598
- treatment: z4.enum(userPanelTreatments)
1599
- }).strict(),
1600
- z4.object({
1601
- kind: z4.literal("flush-panel"),
1602
- treatment: z4.enum(userFlushTreatments),
1603
- bleed: z4.enum(userFlushBleeds)
1604
- }).strict()
1605
- ]);
1606
- var blockDesignPlanSchema = z4.object({
1607
- blockId: z4.string().min(1).transform(asDesignBlockId),
1608
- blockKind: z4.string().min(1),
1609
- purpose: z4.string().min(1),
1610
- sectionSurface: z4.enum(userDesignOptionCatalog.sectionSurfaces),
1611
- contentFrame: contentFrameIntentSchema,
1612
- itemSurface: z4.enum(userDesignOptionCatalog.itemSurfaces),
1613
- transitionAfter: z4.enum(userDesignOptionCatalog.transitions),
1614
- emphasis: z4.enum(userDesignOptionCatalog.emphases),
1615
- heroLegibility: heroLegibilityStrategySchema.optional()
1616
- }).strict();
1617
- var styleAuthoritySchema = z4.discriminatedUnion("kind", [
1618
- z4.object({
1619
- kind: z4.literal("theme-v2"),
1620
- source: designResolutionPolicySchema,
1621
- siteStyleId: z4.string().min(1).transform(asSiteStyleId),
1622
- templateId: z4.string().min(1).transform(asDesignSystemTemplateId),
1623
- templateVersion: z4.number().int().nonnegative(),
1624
- resolverVersion: z4.number().int().nonnegative()
1625
- }).strict(),
1626
- z4.object({
1627
- kind: z4.literal("legacy-raw"),
1628
- reason: z4.enum(["pre-theme-v2", "manual-runtime-fields"])
1629
- }).strict(),
1630
- z4.object({
1631
- kind: z4.literal("advanced-detached"),
1632
- reason: z4.literal("detached-custom-runtime-fields")
1633
- }).strict()
1634
- ]);
1635
- var blockRuntimeStyleAuthoritySchema = z4.object({
1636
- unit: z4.literal("block-runtime-fields"),
1637
- blockId: z4.string().min(1).transform(asDesignBlockId),
1638
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
1639
- authority: styleAuthoritySchema
1640
- }).strict();
1641
- var persistedPageDesignStateV1Schema = z4.object({
1642
- schemaVersion: z4.literal(themeV2DesignStateSchemaVersion),
1643
- siteStyleId: z4.string().min(1).transform(asSiteStyleId),
1644
- templateId: z4.string().min(1).transform(asDesignSystemTemplateId),
1645
- templateVersion: z4.number().int().nonnegative(),
1646
- resolverVersion: z4.number().int().nonnegative(),
1647
- rhythmPresetId: z4.string().min(1),
1648
- blocks: z4.array(blockDesignPlanSchema),
1649
- styleAuthorities: z4.array(blockRuntimeStyleAuthoritySchema)
1650
- }).strict();
1651
-
1652
- // ../theme-core/src/site-styles/generatedSchemas.ts
1653
- import { z as z5 } from "zod";
1654
- function uniqueNonEmpty2(values) {
1655
- const uniqueValues = [...new Set(values)];
1656
- const firstValue = uniqueValues[0];
1657
- if (!firstValue) {
1658
- throw new Error("Expected at least one generated schema option.");
1659
- }
1660
- return [firstValue, ...uniqueValues.slice(1)];
1661
- }
1662
- var generatedPanelTreatments = uniqueNonEmpty2(
1663
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
1664
- );
1665
- var generatedFlushTreatments = uniqueNonEmpty2(
1666
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
1667
- );
1668
- var generatedFlushBleeds = uniqueNonEmpty2(
1669
- generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
1670
- );
1671
- var generatedPanelFrameSchema = z5.object({
1672
- kind: z5.literal("panel"),
1673
- treatment: z5.enum(generatedPanelTreatments)
1674
- }).strict();
1675
- var generatedFlushPanelFrameSchema = z5.object({
1676
- kind: z5.literal("flush-panel"),
1677
- treatment: z5.enum(generatedFlushTreatments),
1678
- bleed: z5.enum(generatedFlushBleeds)
1679
- }).strict();
1680
- var generatedContentFrameIntentSchema = z5.discriminatedUnion("kind", [
1681
- z5.object({ kind: z5.literal("plain") }).strict(),
1682
- generatedPanelFrameSchema,
1683
- generatedFlushPanelFrameSchema
1684
- ]);
1685
- var generatedSiteStyleIdSchema = z5.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
1686
- function generatedChoiceSchema(valueSchema) {
1687
- return z5.discriminatedUnion("kind", [
1688
- z5.object({
1689
- source: z5.literal("generated"),
1690
- kind: z5.literal("auto")
1691
- }).strict(),
1692
- z5.object({
1693
- source: z5.literal("generated"),
1694
- kind: z5.literal("explicit"),
1695
- value: valueSchema
1696
- }).strict()
1697
- ]);
1698
- }
1699
- var generatedBlockDesignIntentSchema = z5.object({
1700
- sectionSurface: generatedChoiceSchema(
1701
- z5.enum(generatedDesignOptionCatalog.sectionSurfaces)
1702
- ),
1703
- contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
1704
- itemSurface: generatedChoiceSchema(
1705
- z5.enum(generatedDesignOptionCatalog.itemSurfaces)
1706
- ),
1707
- transitionAfter: generatedChoiceSchema(
1708
- z5.enum(generatedDesignOptionCatalog.transitions)
1709
- ),
1710
- emphasis: generatedChoiceSchema(
1711
- z5.enum(generatedDesignOptionCatalog.emphases)
1712
- )
1713
- }).strict();
1714
- var generatedMediaCompositionIntentSchema = z5.enum([
1715
- "none",
1716
- "supporting",
1717
- "dominant"
1718
- ]);
1719
- var generatedDecorativeCompositionIntentSchema = z5.enum([
1720
- "none",
1721
- "supporting"
1722
- ]);
1723
- var generatedHeroLegibilityStrategySchema = z5.enum([
1724
- "none",
1725
- "scrim-gradient"
1726
- ]);
1727
- var generatedBlockMediaIntentSchema = z5.object({
1728
- media: generatedMediaCompositionIntentSchema,
1729
- decorative: generatedDecorativeCompositionIntentSchema,
1730
- heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
1731
- }).strict();
1732
- var generatedBoundaryIntentSchema = z5.object({
1733
- transitionAfter: generatedChoiceSchema(
1734
- z5.enum(generatedDesignOptionCatalog.transitions)
1735
- )
1736
- }).strict();
1737
- var generatedPageDesignBlockIntentSchema = z5.object({
1738
- blockId: z5.string().min(1),
1739
- blockKind: z5.string().min(1),
1740
- purpose: z5.string().min(1),
1741
- design: generatedBlockDesignIntentSchema,
1742
- mediaIntent: generatedBlockMediaIntentSchema,
1743
- boundaryIntent: generatedBoundaryIntentSchema
1744
- }).strict();
1745
- var generatedPageDesignIntentSchema = z5.object({
1746
- siteStyleId: generatedSiteStyleIdSchema,
1747
- blocks: z5.array(generatedPageDesignBlockIntentSchema)
1748
- }).strict();
1749
-
1750
- // ../theme-core/src/site-styles/pageDesignIntent.ts
1751
- import { z as z6 } from "zod";
1752
- var pageDesignIntentSchemaVersion = 1;
1753
- var pageDesignUserPinnedAppearanceChoiceSchema = z6.object({
1754
- kind: z6.literal("user-pinned"),
1755
- value: z6.string().min(1).transform(asAppearancePresetId)
1756
- }).strict();
1757
- var pageDesignUserPinnedBoundaryChoiceSchema = z6.object({
1758
- kind: z6.literal("user-pinned"),
1759
- value: z6.string().min(1).transform(asBoundaryOptionId)
1760
- }).strict();
1761
- var pageDesignBlockLookPinSchema = z6.object({
1762
- blockId: z6.string().min(1).transform(asDesignBlockId),
1763
- blockKind: z6.string().min(1),
1764
- choice: pageDesignUserPinnedAppearanceChoiceSchema
1765
- }).strict();
1766
- var pageDesignBoundaryPinSchema = z6.object({
1767
- boundaryId: z6.string().min(1).transform(asDesignBoundaryId),
1768
- previousBlockId: z6.string().min(1).transform(asDesignBlockId),
1769
- nextBlockId: z6.string().min(1).transform(asDesignBlockId),
1770
- choice: pageDesignUserPinnedBoundaryChoiceSchema
1771
- }).strict().superRefine((pin, ctx) => {
1772
- const expectedBoundaryId = makeBoundaryId(
1773
- pin.previousBlockId,
1774
- pin.nextBlockId
1775
- );
1776
- if (pin.boundaryId !== expectedBoundaryId) {
1777
- ctx.addIssue({
1778
- code: z6.ZodIssueCode.custom,
1779
- path: ["boundaryId"],
1780
- message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
1781
- });
1580
+ variants: [
1581
+ {
1582
+ id: "primary",
1583
+ name: "Primary",
1584
+ enabled: true,
1585
+ priority: 1,
1586
+ background: { type: "transparent" },
1587
+ textColorToken: "text",
1588
+ borderRadius: "rounded-none",
1589
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1590
+ sizes: {
1591
+ sm: { padding: "0.25rem 0" },
1592
+ md: { padding: "0.5rem 0" },
1593
+ lg: { padding: "0.625rem 0" },
1594
+ xl: { padding: "0.75rem 0" }
1595
+ },
1596
+ effects: {
1597
+ base: [
1598
+ { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
1599
+ ]
1600
+ }
1601
+ },
1602
+ {
1603
+ id: "secondary",
1604
+ name: "Secondary",
1605
+ enabled: true,
1606
+ priority: 2,
1607
+ background: { type: "transparent" },
1608
+ textColorToken: "mutedText",
1609
+ borderRadius: "rounded-none",
1610
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1611
+ sizes: {
1612
+ sm: { padding: "0.25rem 0" },
1613
+ md: { padding: "0.5rem 0" },
1614
+ lg: { padding: "0.625rem 0" },
1615
+ xl: { padding: "0.75rem 0" }
1616
+ },
1617
+ effects: {
1618
+ base: [
1619
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
1620
+ ]
1621
+ }
1622
+ },
1623
+ {
1624
+ id: "outline",
1625
+ name: "Outline",
1626
+ enabled: true,
1627
+ priority: 3,
1628
+ background: { type: "transparent" },
1629
+ textColorToken: "accent",
1630
+ borderRadius: "rounded-none",
1631
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1632
+ sizes: {
1633
+ sm: { padding: "0.25rem 0" },
1634
+ md: { padding: "0.5rem 0" },
1635
+ lg: { padding: "0.625rem 0" },
1636
+ xl: { padding: "0.75rem 0" }
1637
+ },
1638
+ effects: {
1639
+ base: [
1640
+ { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
1641
+ ]
1642
+ }
1643
+ },
1644
+ {
1645
+ id: "ghost",
1646
+ name: "Ghost",
1647
+ enabled: true,
1648
+ priority: 3,
1649
+ background: { type: "transparent" },
1650
+ textColorToken: "mutedText",
1651
+ borderRadius: "rounded-none",
1652
+ shadow: { elevation: "none", softness: null, position: "bottom" },
1653
+ sizes: {
1654
+ sm: { padding: "0.25rem 0" },
1655
+ md: { padding: "0.5rem 0" },
1656
+ lg: { padding: "0.625rem 0" },
1657
+ xl: { padding: "0.75rem 0" }
1658
+ },
1659
+ effects: {
1660
+ hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
1661
+ }
1662
+ }
1663
+ ]
1782
1664
  }
1783
1665
  });
1784
- var pageDesignIntentV1Schema = z6.object({
1785
- schemaVersion: z6.literal(pageDesignIntentSchemaVersion),
1786
- siteStyleId: z6.string().min(1).transform(asSiteStyleId),
1787
- pageFlowPresetId: z6.string().min(1).transform(asPageFlowPresetId),
1788
- blockLookPins: z6.array(pageDesignBlockLookPinSchema),
1789
- boundaryPins: z6.array(pageDesignBoundaryPinSchema)
1790
- }).strict().superRefine((intent, ctx) => {
1791
- addDuplicateStringIssues(ctx, {
1792
- values: intent.blockLookPins.map((pin) => pin.blockId),
1793
- path: ["blockLookPins"],
1794
- label: "block Look pin"
1795
- });
1796
- addDuplicateStringIssues(ctx, {
1797
- values: intent.boundaryPins.map(
1798
- (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
1799
- ),
1800
- path: ["boundaryPins"],
1801
- label: "boundary pin"
1802
- });
1803
- });
1804
- function addDuplicateStringIssues(ctx, input) {
1805
- const seen = /* @__PURE__ */ new Set();
1806
- const duplicates = /* @__PURE__ */ new Set();
1807
- for (const value of input.values) {
1808
- if (seen.has(value)) {
1809
- duplicates.add(value);
1810
- }
1811
- seen.add(value);
1812
- }
1813
- for (const duplicate of duplicates) {
1814
- ctx.addIssue({
1815
- code: z6.ZodIssueCode.custom,
1816
- path: [...input.path],
1817
- message: `Duplicate ${input.label}: ${duplicate}.`
1818
- });
1819
- }
1820
- }
1821
- function boundaryKey(previousBlockId, nextBlockId) {
1822
- return makeBoundaryId(previousBlockId, nextBlockId);
1823
- }
1824
-
1825
- // ../theme-core/src/schema.ts
1826
- import { z as z19 } from "zod";
1827
-
1828
- // ../theme-core/src/lib/media.ts
1829
- import z7 from "zod";
1830
- var hotspotSchema = z7.object({
1831
- x: z7.number().min(0).max(1),
1832
- y: z7.number().min(0).max(1),
1833
- radius: z7.number().optional()
1834
- });
1835
- var rotationSchema = z7.union([z7.literal(0), z7.literal(90), z7.literal(180), z7.literal(270)]);
1836
- var rectSchema = z7.tuple([z7.number(), z7.number(), z7.number(), z7.number()]);
1837
- var aspectCropSchema = z7.object({
1838
- aspect: z7.preprocess((value) => value == null ? void 0 : value, z7.string().optional()),
1839
- rect: z7.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
1840
- hotspot: z7.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
1841
- rotation: z7.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
1842
- });
1843
- var transformSchema = z7.object({
1844
- aspectCrops: z7.preprocess((value) => {
1845
- if (!value || typeof value !== "object" || Array.isArray(value)) {
1846
- return void 0;
1847
- }
1848
- return value;
1849
- }, z7.record(z7.string(), aspectCropSchema.catch({}))).optional(),
1850
- rect: rectSchema.optional(),
1851
- hotspot: hotspotSchema.optional(),
1852
- rotation: rotationSchema.optional()
1853
- });
1854
- var mediaSchema = z7.object({
1855
- type: z7.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
1856
- purpose: z7.string().optional(),
1857
- placeholder: z7.boolean().default(true).optional(),
1858
- assetId: z7.string().optional(),
1859
- identifier: z7.string().optional(),
1860
- src: z7.string().optional(),
1861
- alt: z7.string().optional(),
1862
- filename: z7.string().optional(),
1863
- mimeType: z7.string().optional(),
1864
- width: z7.number().optional(),
1865
- height: z7.number().optional(),
1866
- storageBucket: z7.string().optional(),
1867
- storagePath: z7.string().optional(),
1868
- transform: transformSchema.optional()
1869
- });
1870
-
1871
- // ../theme-core/src/buttons/types.ts
1872
- import { z as z8 } from "zod";
1873
- var VARIANT_ROLES = [
1874
- "primary",
1875
- "secondary",
1876
- "outline",
1877
- "ghost",
1878
- "link",
1879
- "tertiary",
1880
- "accent"
1881
- ];
1882
- var cornerStyleSchema = z8.enum(["square", "rounded", "pill"]);
1883
- var shadowSizeSchema = z8.enum(["none", "low", "medium", "high"]);
1884
- var textTransformSchema = z8.enum(["none", "uppercase", "lowercase", "capitalize"]);
1885
- var fontWeightSchema = z8.union([z8.literal(500), z8.literal(600), z8.literal(700)]);
1886
- var buttonTypographySchema = z8.enum(["body", "heading"]);
1887
- var letterSpacingSchema = z8.enum(["tight", "normal", "loose"]);
1888
- var hoverTransformSchema = z8.enum(["none", "lift", "scale", "press"]);
1889
- var hoverColorSchema = z8.enum(["none", "brighten", "darken", "saturate", "token"]);
1890
- var buttonPaddingPresetSchema = z8.enum(["compact", "default", "spacious"]);
1891
- var gradientStyleSchema = z8.enum(["linear", "radial", "conic"]);
1892
- var gradientSharpnessSchema = z8.enum(["smooth", "medium", "hard"]);
1893
- var prioritySchema = z8.union([z8.literal(1), z8.literal(2), z8.literal(3)]);
1894
- var variantRoleSchema = z8.enum(VARIANT_ROLES);
1895
- var buttonSizeNameSchema = z8.enum(["sm", "md", "lg", "xl"]);
1896
- var PADDING_TOKEN_PATTERN = /^(?:0|\d+(?:\.\d+)?(?:rem|em|px|%))$/;
1897
- var paddingShorthandSchema = z8.string().refine(
1898
- (value) => {
1899
- const parts = value.split(/\s+/).filter(Boolean);
1900
- return parts.length === 2 && parts.every((token) => PADDING_TOKEN_PATTERN.test(token));
1901
- },
1902
- {
1903
- message: 'Padding must be two space-separated CSS length tokens (e.g. "0.5rem 1rem"). Use `0` for zero.'
1904
- }
1905
- );
1906
- var buttonSizeConfigSchema = z8.object({
1907
- padding: paddingShorthandSchema,
1908
- fontSize: z8.string().optional()
1909
- });
1910
- var buttonSizesSchema = z8.object({
1911
- sm: buttonSizeConfigSchema,
1912
- md: buttonSizeConfigSchema,
1913
- lg: buttonSizeConfigSchema,
1914
- xl: buttonSizeConfigSchema.optional()
1915
- }).transform(({ sm, md, lg, xl }) => ({
1916
- sm,
1917
- md,
1918
- lg,
1919
- xl: xl ?? lg
1920
- }));
1921
- var buttonGlobalSettingsSchema = z8.object({
1922
- cornerStyle: cornerStyleSchema,
1923
- cornerRadius: z8.number().min(0).max(24).optional(),
1924
- shadow: shadowSizeSchema,
1925
- textTransform: textTransformSchema,
1926
- fontWeight: fontWeightSchema,
1927
- /**
1928
- * @deprecated Set per-variant via `variant.border.widthClass` instead.
1929
- * Schema field is preserved so existing presets parse; the value is unread
1930
- * by the current generator and will be removed once the legacy
1931
- * `primitives/content/components/Button.tsx` slot exports are deleted.
1932
- */
1933
- borderWidth: z8.union([z8.literal(1), z8.literal(2), z8.literal(3)]),
1934
- // === Family-level typography ===
1935
- // Typography source (body or heading) — selects which theme typography pool to inherit
1936
- typography: buttonTypographySchema.optional(),
1937
- // Font size for all variants in the family (Tailwind token, e.g. "text-xs", "text-sm")
1938
- // Sized variants get this as default; fixed variants inherit unless they override.
1939
- // Size class CSS may still override at run time for sized variants.
1940
- fontSize: z8.string().optional(),
1941
- // Letter spacing applied to all variants
1942
- letterSpacing: letterSpacingSchema.optional(),
1943
- // Italic style
1944
- italic: z8.boolean().optional(),
1945
- // Padding preset (applies to sized variants without a sizes config)
1946
- paddingPreset: buttonPaddingPresetSchema.optional(),
1947
- hoverTransform: hoverTransformSchema,
1948
- hoverColor: hoverColorSchema,
1949
- // When hoverColor is 'token', this specifies which token to use
1950
- hoverColorToken: z8.string().optional(),
1951
- // Gradient settings (if any variant uses gradients)
1952
- gradientStyle: gradientStyleSchema.optional(),
1953
- gradientAngle: z8.number().min(0).max(360).optional(),
1954
- gradientSharpness: gradientSharpnessSchema.optional()
1955
- });
1956
- var gradientDirectionSchema = z8.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
1957
- var buttonBackgroundSchema = z8.discriminatedUnion("type", [
1958
- z8.object({ type: z8.literal("solid"), colorToken: z8.string() }),
1959
- z8.object({
1960
- type: z8.literal("gradient"),
1961
- stops: z8.array(z8.string()).min(2),
1962
- direction: gradientDirectionSchema
1963
- }),
1964
- z8.object({ type: z8.literal("transparent") })
1965
- ]);
1966
- var effectApplicationSchema = z8.object({
1967
- effectId: z8.string(),
1968
- options: z8.record(z8.string(), z8.any()).optional()
1969
- });
1970
- var buttonBorderSchema = z8.object({
1971
- widthClass: z8.string(),
1972
- colorToken: z8.string()
1973
- });
1974
- var variantShadowSchema = z8.object({
1975
- elevation: z8.enum(["none", "low", "medium", "high"]),
1976
- softness: z8.enum(["crisp", "soft", "hard"]).nullable(),
1977
- position: z8.enum(["bottom", "bottom-right"]).default("bottom")
1978
- });
1979
- var variantEffectsSchema = z8.object({
1980
- base: z8.array(effectApplicationSchema).optional(),
1981
- hover: z8.array(effectApplicationSchema).optional(),
1982
- active: z8.array(effectApplicationSchema).optional(),
1983
- focus: z8.array(effectApplicationSchema).optional()
1984
- });
1985
- var variantSizeOverridesSchema = z8.object({
1986
- sm: buttonSizeConfigSchema.optional(),
1987
- md: buttonSizeConfigSchema.optional(),
1988
- lg: buttonSizeConfigSchema.optional(),
1989
- xl: buttonSizeConfigSchema.optional()
1990
- });
1991
- var buttonVariantSchema = z8.object({
1992
- id: z8.string(),
1993
- name: z8.string().min(1).max(20),
1994
- enabled: z8.boolean(),
1995
- priority: prioritySchema,
1996
- // Base appearance (token-based)
1997
- background: buttonBackgroundSchema,
1998
- textColorToken: z8.string(),
1999
- /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
2000
- borderRadius: z8.string().optional(),
2001
- // Optional shadow override (uses theme.shadow if not specified)
2002
- shadow: variantShadowSchema.optional(),
2003
- // Border (optional)
2004
- border: buttonBorderSchema.optional(),
2005
- // Hover background token (per-variant override, takes precedence over global hoverColorToken)
2006
- hoverBackgroundToken: z8.string().optional(),
2007
- // Effect composition
2008
- effects: variantEffectsSchema.optional(),
2009
- // Per-variant size overrides — see VariantSizeOverrides
2010
- sizes: variantSizeOverridesSchema.optional()
2011
- });
2012
- var buttonSystemSchema = z8.object({
2013
- global: buttonGlobalSettingsSchema,
2014
- variants: z8.array(buttonVariantSchema).min(1).max(6),
2015
- sizes: buttonSizesSchema.optional()
2016
- });
2017
-
2018
- // ../theme-core/src/buttons/generateButtonCss.ts
2019
- var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
2020
-
2021
- // ../theme-core/src/buttons/personalities/types.ts
2022
- import { z as z9 } from "zod";
2023
- function asButtonPersonalityId(value) {
2024
- if (value.length === 0) {
2025
- throw new Error("ButtonPersonalityId must be a non-empty string");
2026
- }
2027
- return value;
2028
- }
2029
- var buttonPersonalityIdSchema = z9.string().min(1).transform((value) => asButtonPersonalityId(value));
2030
- var buttonPersonalitySchema = z9.object({
2031
- id: buttonPersonalityIdSchema,
2032
- name: z9.string().min(1),
2033
- description: z9.string().min(1),
2034
- tags: styleTagsSchema,
2035
- buttonSystem: buttonSystemSchema
2036
- });
2037
- function defineButtonPersonality(input) {
2038
- return {
2039
- id: asButtonPersonalityId(input.id),
2040
- name: input.name,
2041
- description: input.description,
2042
- tags: input.tags,
2043
- buttonSystem: input.buttonSystem
2044
- };
2045
- }
2046
1666
 
2047
- // ../theme-core/src/buttons/personalities/brushed-wash.ts
2048
- var brushedWash = defineButtonPersonality({
2049
- id: "brushed-wash",
2050
- name: "Brushed Wash",
2051
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
2052
- tags: { tone: "classic", energy: "vibrant", motion: "standard", era: "organic" },
1667
+ // ../theme-core/src/buttons/personalities/ink-stamp.ts
1668
+ var inkStamp = defineButtonPersonality({
1669
+ id: "ink-stamp",
1670
+ name: "Ink Stamp",
1671
+ description: "Hand-stamped block-print buttons with a slight lift on hover.",
1672
+ tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
2053
1673
  buttonSystem: {
2054
1674
  global: {
2055
1675
  cornerStyle: "rounded",
2056
- shadow: "low",
2057
- textTransform: "none",
2058
- fontWeight: 500,
1676
+ shadow: "none",
1677
+ textTransform: "uppercase",
1678
+ fontWeight: 600,
2059
1679
  borderWidth: 1,
2060
1680
  hoverTransform: "none",
2061
- hoverColor: "none"
1681
+ hoverColor: "none",
1682
+ letterSpacing: "loose"
2062
1683
  },
2063
1684
  sizes: {
2064
- sm: { padding: "0.75rem 2rem", fontSize: "text-sm" },
2065
- md: { padding: "1rem 2.5rem" },
2066
- lg: { padding: "1.25rem 3rem", fontSize: "text-lg" },
2067
- xl: { padding: "1.625rem 3.75rem", fontSize: "text-xl" }
1685
+ sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
1686
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
1687
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
1688
+ xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
2068
1689
  },
2069
1690
  variants: [
2070
1691
  {
@@ -2072,16 +1693,15 @@ var brushedWash = defineButtonPersonality({
2072
1693
  name: "Primary",
2073
1694
  enabled: true,
2074
1695
  priority: 1,
2075
- background: {
2076
- type: "gradient",
2077
- stops: ["primary", "accent"],
2078
- direction: "to-r"
2079
- },
1696
+ background: { type: "solid", colorToken: "primary" },
2080
1697
  textColorToken: "primaryForeground",
2081
- borderRadius: "rounded-lg",
2082
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
1698
+ borderRadius: "rounded-md",
2083
1699
  effects: {
2084
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
1700
+ hover: [
1701
+ { effectId: "drop-shadow", options: { intensity: "medium" } },
1702
+ { effectId: "scale-up", options: { scale: "1.02" } }
1703
+ ],
1704
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
2085
1705
  }
2086
1706
  },
2087
1707
  {
@@ -2089,16 +1709,12 @@ var brushedWash = defineButtonPersonality({
2089
1709
  name: "Secondary",
2090
1710
  enabled: true,
2091
1711
  priority: 2,
2092
- background: {
2093
- type: "gradient",
2094
- stops: ["secondary", "accent"],
2095
- direction: "to-br"
2096
- },
2097
- textColorToken: "primaryForeground",
2098
- borderRadius: "rounded-lg",
2099
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
1712
+ background: { type: "transparent" },
1713
+ textColorToken: "primary",
1714
+ borderRadius: "rounded-md",
1715
+ border: { widthClass: "border-2", colorToken: "primary" },
2100
1716
  effects: {
2101
- hover: [{ effectId: "opacity-reduce", options: { reduction: -15 } }]
1717
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2102
1718
  }
2103
1719
  },
2104
1720
  {
@@ -2107,9 +1723,9 @@ var brushedWash = defineButtonPersonality({
2107
1723
  enabled: true,
2108
1724
  priority: 3,
2109
1725
  background: { type: "transparent" },
2110
- textColorToken: "primary",
2111
- borderRadius: "rounded-lg",
2112
- border: { widthClass: "border", colorToken: "primary" },
1726
+ textColorToken: "text",
1727
+ borderRadius: "rounded-md",
1728
+ border: { widthClass: "border-2", colorToken: "border" },
2113
1729
  effects: {
2114
1730
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2115
1731
  }
@@ -2120,216 +1736,43 @@ var brushedWash = defineButtonPersonality({
2120
1736
  enabled: true,
2121
1737
  priority: 3,
2122
1738
  background: { type: "transparent" },
2123
- textColorToken: "text",
2124
- borderRadius: "rounded-lg",
1739
+ textColorToken: "accent",
1740
+ borderRadius: "rounded-none",
1741
+ sizes: {
1742
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
1743
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
1744
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
1745
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
1746
+ },
2125
1747
  effects: {
2126
- hover: [
2127
- { effectId: "background-on-hover", options: { colorToken: "surface" } }
2128
- ]
1748
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
2129
1749
  }
2130
1750
  }
2131
1751
  ]
2132
1752
  }
2133
1753
  });
2134
1754
 
2135
- // ../theme-core/src/buttons/personalities/confident-chip.ts
2136
- var confidentChip = defineButtonPersonality({
2137
- id: "confident-chip",
2138
- name: "Confident Chip",
2139
- description: "Mid-radius solid buttons with a crisp hover.",
2140
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "modern" },
1755
+ // ../theme-core/src/buttons/personalities/pebble.ts
1756
+ var pebble = defineButtonPersonality({
1757
+ id: "pebble",
1758
+ name: "Pebble",
1759
+ description: "Generous pill buttons with a soft hover lift.",
1760
+ tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
2141
1761
  buttonSystem: {
2142
1762
  global: {
2143
- cornerStyle: "rounded",
2144
- shadow: "medium",
1763
+ cornerStyle: "pill",
1764
+ shadow: "none",
2145
1765
  textTransform: "none",
2146
- fontWeight: 600,
2147
- borderWidth: 1,
1766
+ fontWeight: 500,
1767
+ borderWidth: 2,
2148
1768
  hoverTransform: "none",
2149
1769
  hoverColor: "none"
2150
1770
  },
2151
- variants: [
2152
- {
2153
- id: "primary",
2154
- name: "Primary",
2155
- enabled: true,
2156
- priority: 1,
2157
- background: { type: "solid", colorToken: "primary" },
2158
- textColorToken: "primaryForeground",
2159
- borderRadius: "rounded-md",
2160
- shadow: { elevation: "medium", softness: "soft", position: "bottom" },
2161
- effects: {
2162
- hover: [{ effectId: "darken-background", options: { amount: 60 } }],
2163
- active: [{ effectId: "scale-down", options: { scale: "0.97" } }]
2164
- }
2165
- },
2166
- {
2167
- id: "secondary",
2168
- name: "Secondary",
2169
- enabled: true,
2170
- priority: 2,
2171
- background: { type: "solid", colorToken: "surface" },
2172
- textColorToken: "text",
2173
- borderRadius: "rounded-md",
2174
- border: { widthClass: "border", colorToken: "border" },
2175
- effects: {
2176
- hover: [{ effectId: "background-on-hover", options: { colorToken: "background" } }]
2177
- }
2178
- },
2179
- {
2180
- id: "outline",
2181
- name: "Outline",
2182
- enabled: true,
2183
- priority: 3,
2184
- background: { type: "transparent" },
2185
- textColorToken: "primary",
2186
- borderRadius: "rounded-md",
2187
- border: { widthClass: "border", colorToken: "primary" },
2188
- effects: {
2189
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2190
- }
2191
- },
2192
- {
2193
- id: "ghost",
2194
- name: "Ghost",
2195
- enabled: true,
2196
- priority: 3,
2197
- background: { type: "transparent" },
2198
- textColorToken: "primary",
2199
- borderRadius: "rounded-md",
2200
- effects: {
2201
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2202
- }
2203
- }
2204
- ]
2205
- }
2206
- });
2207
-
2208
- // ../theme-core/src/buttons/personalities/editorial-link.ts
2209
- var editorialLink = defineButtonPersonality({
2210
- id: "editorial-link",
2211
- name: "Editorial Link",
2212
- description: "Link-style with a growing underline. Refined, typographic.",
2213
- tags: { tone: "minimal", energy: "calm", motion: "subtle", era: "editorial" },
2214
- buttonSystem: {
2215
- global: {
2216
- cornerStyle: "square",
2217
- shadow: "none",
2218
- textTransform: "none",
2219
- fontWeight: 500,
2220
- borderWidth: 1,
2221
- hoverTransform: "none",
2222
- hoverColor: "none"
2223
- },
2224
- variants: [
2225
- {
2226
- id: "primary",
2227
- name: "Primary",
2228
- enabled: true,
2229
- priority: 1,
2230
- background: { type: "transparent" },
2231
- textColorToken: "text",
2232
- borderRadius: "rounded-none",
2233
- shadow: { elevation: "none", softness: null, position: "bottom" },
2234
- sizes: {
2235
- sm: { padding: "0.25rem 0" },
2236
- md: { padding: "0.5rem 0" },
2237
- lg: { padding: "0.625rem 0" },
2238
- xl: { padding: "0.75rem 0" }
2239
- },
2240
- effects: {
2241
- base: [
2242
- { effectId: "border-bottom-grow", options: { height: 2, colorToken: "text", origin: "left" } }
2243
- ]
2244
- }
2245
- },
2246
- {
2247
- id: "secondary",
2248
- name: "Secondary",
2249
- enabled: true,
2250
- priority: 2,
2251
- background: { type: "transparent" },
2252
- textColorToken: "mutedText",
2253
- borderRadius: "rounded-none",
2254
- shadow: { elevation: "none", softness: null, position: "bottom" },
2255
- sizes: {
2256
- sm: { padding: "0.25rem 0" },
2257
- md: { padding: "0.5rem 0" },
2258
- lg: { padding: "0.625rem 0" },
2259
- xl: { padding: "0.75rem 0" }
2260
- },
2261
- effects: {
2262
- base: [
2263
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "mutedText", origin: "left" } }
2264
- ]
2265
- }
2266
- },
2267
- {
2268
- id: "outline",
2269
- name: "Outline",
2270
- enabled: true,
2271
- priority: 3,
2272
- background: { type: "transparent" },
2273
- textColorToken: "accent",
2274
- borderRadius: "rounded-none",
2275
- shadow: { elevation: "none", softness: null, position: "bottom" },
2276
- sizes: {
2277
- sm: { padding: "0.25rem 0" },
2278
- md: { padding: "0.5rem 0" },
2279
- lg: { padding: "0.625rem 0" },
2280
- xl: { padding: "0.75rem 0" }
2281
- },
2282
- effects: {
2283
- base: [
2284
- { effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }
2285
- ]
2286
- }
2287
- },
2288
- {
2289
- id: "ghost",
2290
- name: "Ghost",
2291
- enabled: true,
2292
- priority: 3,
2293
- background: { type: "transparent" },
2294
- textColorToken: "mutedText",
2295
- borderRadius: "rounded-none",
2296
- shadow: { elevation: "none", softness: null, position: "bottom" },
2297
- sizes: {
2298
- sm: { padding: "0.25rem 0" },
2299
- md: { padding: "0.5rem 0" },
2300
- lg: { padding: "0.625rem 0" },
2301
- xl: { padding: "0.75rem 0" }
2302
- },
2303
- effects: {
2304
- hover: [{ effectId: "opacity-reduce", options: { reduction: -20 } }]
2305
- }
2306
- }
2307
- ]
2308
- }
2309
- });
2310
-
2311
- // ../theme-core/src/buttons/personalities/ink-stamp.ts
2312
- var inkStamp = defineButtonPersonality({
2313
- id: "ink-stamp",
2314
- name: "Ink Stamp",
2315
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
2316
- tags: { tone: "bold", energy: "vibrant", motion: "standard", era: "organic" },
2317
- buttonSystem: {
2318
- global: {
2319
- cornerStyle: "rounded",
2320
- shadow: "none",
2321
- textTransform: "uppercase",
2322
- fontWeight: 600,
2323
- borderWidth: 1,
2324
- hoverTransform: "none",
2325
- hoverColor: "none",
2326
- letterSpacing: "loose"
2327
- },
2328
1771
  sizes: {
2329
- sm: { padding: "0.5rem 1.25rem", fontSize: "text-xs" },
2330
- md: { padding: "0.75rem 1.75rem", fontSize: "text-sm" },
2331
- lg: { padding: "0.875rem 2.25rem", fontSize: "text-base" },
2332
- xl: { padding: "1.125rem 2.75rem", fontSize: "text-lg" }
1772
+ sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
1773
+ md: { padding: "0.875rem 2.25rem" },
1774
+ lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
1775
+ xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
2333
1776
  },
2334
1777
  variants: [
2335
1778
  {
@@ -2339,13 +1782,12 @@ var inkStamp = defineButtonPersonality({
2339
1782
  priority: 1,
2340
1783
  background: { type: "solid", colorToken: "primary" },
2341
1784
  textColorToken: "primaryForeground",
2342
- borderRadius: "rounded-md",
1785
+ borderRadius: "rounded-full",
2343
1786
  effects: {
2344
1787
  hover: [
2345
- { effectId: "drop-shadow", options: { intensity: "medium" } },
2346
- { effectId: "scale-up", options: { scale: "1.02" } }
2347
- ],
2348
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
1788
+ { effectId: "scale-up", options: { scale: "1.03" } },
1789
+ { effectId: "drop-shadow", options: { intensity: "medium" } }
1790
+ ]
2349
1791
  }
2350
1792
  },
2351
1793
  {
@@ -2355,10 +1797,10 @@ var inkStamp = defineButtonPersonality({
2355
1797
  priority: 2,
2356
1798
  background: { type: "transparent" },
2357
1799
  textColorToken: "primary",
2358
- borderRadius: "rounded-md",
2359
- border: { widthClass: "border-2", colorToken: "primary" },
1800
+ borderRadius: "rounded-full",
1801
+ border: { widthClass: "border-2", colorToken: "accent" },
2360
1802
  effects: {
2361
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
1803
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
2362
1804
  }
2363
1805
  },
2364
1806
  {
@@ -2368,8 +1810,8 @@ var inkStamp = defineButtonPersonality({
2368
1810
  priority: 3,
2369
1811
  background: { type: "transparent" },
2370
1812
  textColorToken: "text",
2371
- borderRadius: "rounded-md",
2372
- border: { widthClass: "border-2", colorToken: "border" },
1813
+ borderRadius: "rounded-full",
1814
+ border: { widthClass: "border", colorToken: "border" },
2373
1815
  effects: {
2374
1816
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2375
1817
  }
@@ -2380,44 +1822,38 @@ var inkStamp = defineButtonPersonality({
2380
1822
  enabled: true,
2381
1823
  priority: 3,
2382
1824
  background: { type: "transparent" },
2383
- textColorToken: "accent",
2384
- borderRadius: "rounded-none",
1825
+ textColorToken: "primary",
1826
+ borderRadius: "rounded-full",
2385
1827
  sizes: {
2386
- sm: { padding: "0.375rem 0", fontSize: "text-xs" },
2387
- md: { padding: "0.5rem 0", fontSize: "text-sm" },
2388
- lg: { padding: "0.625rem 0", fontSize: "text-base" },
2389
- xl: { padding: "0.75rem 0", fontSize: "text-lg" }
1828
+ sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
1829
+ md: { padding: "0.5rem 1rem" },
1830
+ lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
1831
+ xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
2390
1832
  },
2391
1833
  effects: {
2392
- base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
1834
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
2393
1835
  }
2394
1836
  }
2395
1837
  ]
2396
1838
  }
2397
1839
  });
2398
1840
 
2399
- // ../theme-core/src/buttons/personalities/pebble.ts
2400
- var pebble = defineButtonPersonality({
2401
- id: "pebble",
2402
- name: "Pebble",
2403
- description: "Generous pill buttons with a soft hover lift.",
2404
- tags: { tone: "classic", energy: "calm", motion: "standard", era: "organic" },
1841
+ // ../theme-core/src/buttons/personalities/soft-pill.ts
1842
+ var softPill = defineButtonPersonality({
1843
+ id: "soft-pill",
1844
+ name: "Soft Pill",
1845
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
1846
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
2405
1847
  buttonSystem: {
2406
1848
  global: {
2407
1849
  cornerStyle: "pill",
2408
- shadow: "none",
1850
+ shadow: "low",
2409
1851
  textTransform: "none",
2410
1852
  fontWeight: 500,
2411
1853
  borderWidth: 2,
2412
- hoverTransform: "none",
1854
+ hoverTransform: "lift",
2413
1855
  hoverColor: "none"
2414
1856
  },
2415
- sizes: {
2416
- sm: { padding: "0.625rem 1.75rem", fontSize: "text-sm" },
2417
- md: { padding: "0.875rem 2.25rem" },
2418
- lg: { padding: "1.125rem 2.75rem", fontSize: "text-lg" },
2419
- xl: { padding: "1.5rem 3.5rem", fontSize: "text-xl" }
2420
- },
2421
1857
  variants: [
2422
1858
  {
2423
1859
  id: "primary",
@@ -2427,11 +1863,10 @@ var pebble = defineButtonPersonality({
2427
1863
  background: { type: "solid", colorToken: "primary" },
2428
1864
  textColorToken: "primaryForeground",
2429
1865
  borderRadius: "rounded-full",
1866
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
2430
1867
  effects: {
2431
- hover: [
2432
- { effectId: "scale-up", options: { scale: "1.03" } },
2433
- { effectId: "drop-shadow", options: { intensity: "medium" } }
2434
- ]
1868
+ hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
1869
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
2435
1870
  }
2436
1871
  },
2437
1872
  {
@@ -2442,9 +1877,9 @@ var pebble = defineButtonPersonality({
2442
1877
  background: { type: "transparent" },
2443
1878
  textColorToken: "primary",
2444
1879
  borderRadius: "rounded-full",
2445
- border: { widthClass: "border-2", colorToken: "accent" },
1880
+ border: { widthClass: "border-2", colorToken: "primary" },
2446
1881
  effects: {
2447
- hover: [{ effectId: "background-on-hover", options: { colorToken: "accent" } }]
1882
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2448
1883
  }
2449
1884
  },
2450
1885
  {
@@ -2466,86 +1901,7 @@ var pebble = defineButtonPersonality({
2466
1901
  enabled: true,
2467
1902
  priority: 3,
2468
1903
  background: { type: "transparent" },
2469
- textColorToken: "primary",
2470
- borderRadius: "rounded-full",
2471
- sizes: {
2472
- sm: { padding: "0.375rem 0.875rem", fontSize: "text-sm" },
2473
- md: { padding: "0.5rem 1rem" },
2474
- lg: { padding: "0.625rem 1.25rem", fontSize: "text-lg" },
2475
- xl: { padding: "0.75rem 1.5rem", fontSize: "text-xl" }
2476
- },
2477
- effects: {
2478
- hover: [{ effectId: "opacity-reduce", options: { reduction: 30 } }]
2479
- }
2480
- }
2481
- ]
2482
- }
2483
- });
2484
-
2485
- // ../theme-core/src/buttons/personalities/soft-pill.ts
2486
- var softPill = defineButtonPersonality({
2487
- id: "soft-pill",
2488
- name: "Soft Pill",
2489
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
2490
- tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
2491
- buttonSystem: {
2492
- global: {
2493
- cornerStyle: "pill",
2494
- shadow: "low",
2495
- textTransform: "none",
2496
- fontWeight: 500,
2497
- borderWidth: 2,
2498
- hoverTransform: "lift",
2499
- hoverColor: "none"
2500
- },
2501
- variants: [
2502
- {
2503
- id: "primary",
2504
- name: "Primary",
2505
- enabled: true,
2506
- priority: 1,
2507
- background: { type: "solid", colorToken: "primary" },
2508
- textColorToken: "primaryForeground",
2509
- borderRadius: "rounded-full",
2510
- shadow: { elevation: "low", softness: "soft", position: "bottom" },
2511
- effects: {
2512
- hover: [{ effectId: "lift", options: { translateY: "-1px" } }],
2513
- active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
2514
- }
2515
- },
2516
- {
2517
- id: "secondary",
2518
- name: "Secondary",
2519
- enabled: true,
2520
- priority: 2,
2521
- background: { type: "transparent" },
2522
- textColorToken: "primary",
2523
- borderRadius: "rounded-full",
2524
- border: { widthClass: "border-2", colorToken: "primary" },
2525
- effects: {
2526
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2527
- }
2528
- },
2529
- {
2530
- id: "outline",
2531
- name: "Outline",
2532
- enabled: true,
2533
- priority: 3,
2534
- background: { type: "transparent" },
2535
- textColorToken: "text",
2536
- borderRadius: "rounded-full",
2537
- border: { widthClass: "border", colorToken: "border" },
2538
- effects: {
2539
- hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
2540
- }
2541
- },
2542
- {
2543
- id: "ghost",
2544
- name: "Ghost",
2545
- enabled: true,
2546
- priority: 3,
2547
- background: { type: "transparent" },
2548
- textColorToken: "text",
1904
+ textColorToken: "text",
2549
1905
  borderRadius: "rounded-full",
2550
1906
  effects: {
2551
1907
  hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
@@ -2568,49 +1924,101 @@ var personalitiesById = new Map(
2568
1924
  buttonPersonalities.map((p) => [p.id, p])
2569
1925
  );
2570
1926
 
1927
+ // ../theme-core/src/palette/variants/types.ts
1928
+ import { z as z17 } from "zod";
1929
+
1930
+ // ../theme-core/src/schema.ts
1931
+ import { z as z16 } from "zod";
1932
+
1933
+ // ../theme-core/src/lib/media.ts
1934
+ import z6 from "zod";
1935
+ var hotspotSchema = z6.object({
1936
+ x: z6.number().min(0).max(1),
1937
+ y: z6.number().min(0).max(1),
1938
+ radius: z6.number().optional()
1939
+ });
1940
+ var rotationSchema = z6.union([z6.literal(0), z6.literal(90), z6.literal(180), z6.literal(270)]);
1941
+ var rectSchema = z6.tuple([z6.number(), z6.number(), z6.number(), z6.number()]);
1942
+ var aspectCropSchema = z6.object({
1943
+ aspect: z6.preprocess((value) => value == null ? void 0 : value, z6.string().optional()),
1944
+ rect: z6.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
1945
+ hotspot: z6.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
1946
+ rotation: z6.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
1947
+ });
1948
+ var transformSchema = z6.object({
1949
+ aspectCrops: z6.preprocess((value) => {
1950
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
1951
+ return void 0;
1952
+ }
1953
+ return value;
1954
+ }, z6.record(z6.string(), aspectCropSchema.catch({}))).optional(),
1955
+ rect: rectSchema.optional(),
1956
+ hotspot: hotspotSchema.optional(),
1957
+ rotation: rotationSchema.optional()
1958
+ });
1959
+ var mediaSchema = z6.object({
1960
+ type: z6.enum(["image", "video", "audio", "document", "spreadsheet", "archive"]),
1961
+ purpose: z6.string().optional(),
1962
+ placeholder: z6.boolean().default(true).optional(),
1963
+ assetId: z6.string().optional(),
1964
+ identifier: z6.string().optional(),
1965
+ src: z6.string().optional(),
1966
+ alt: z6.string().optional(),
1967
+ filename: z6.string().optional(),
1968
+ mimeType: z6.string().optional(),
1969
+ width: z6.number().optional(),
1970
+ height: z6.number().optional(),
1971
+ storageBucket: z6.string().optional(),
1972
+ storagePath: z6.string().optional(),
1973
+ transform: transformSchema.optional()
1974
+ });
1975
+
1976
+ // ../theme-core/src/buttons/generateButtonCss.ts
1977
+ var BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
1978
+
2571
1979
  // ../theme-core/src/cards/types.ts
2572
- import { z as z10 } from "zod";
2573
- var cardSpacingSchema = z10.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
2574
- var gradientDirectionSchema2 = z10.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
2575
- var cardBackgroundSchema = z10.discriminatedUnion("type", [
2576
- z10.object({ type: z10.literal("solid"), colorToken: z10.string() }),
2577
- z10.object({
2578
- type: z10.literal("gradient"),
2579
- fromToken: z10.string(),
2580
- toToken: z10.string(),
1980
+ import { z as z7 } from "zod";
1981
+ var cardSpacingSchema = z7.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
1982
+ var gradientDirectionSchema2 = z7.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
1983
+ var cardBackgroundSchema = z7.discriminatedUnion("type", [
1984
+ z7.object({ type: z7.literal("solid"), colorToken: z7.string() }),
1985
+ z7.object({
1986
+ type: z7.literal("gradient"),
1987
+ fromToken: z7.string(),
1988
+ toToken: z7.string(),
2581
1989
  direction: gradientDirectionSchema2
2582
1990
  }),
2583
- z10.object({ type: z10.literal("transparent") })
1991
+ z7.object({ type: z7.literal("transparent") })
2584
1992
  ]);
2585
- var cardBorderSchema = z10.object({
2586
- widthClass: z10.string(),
2587
- colorToken: z10.string()
2588
- });
2589
- var cardVariantSchema = z10.object({
2590
- id: z10.string(),
2591
- name: z10.string().min(1).max(20),
2592
- enabled: z10.boolean(),
2593
- priority: z10.union([z10.literal(1), z10.literal(2), z10.literal(3)]),
1993
+ var cardBorderSchema = z7.object({
1994
+ widthClass: z7.string(),
1995
+ colorToken: z7.string()
1996
+ });
1997
+ var cardVariantSchema = z7.object({
1998
+ id: z7.string(),
1999
+ name: z7.string().min(1).max(20),
2000
+ enabled: z7.boolean(),
2001
+ priority: z7.union([z7.literal(1), z7.literal(2), z7.literal(3)]),
2594
2002
  // Appearance (token-based)
2595
2003
  background: cardBackgroundSchema,
2596
2004
  spacing: cardSpacingSchema,
2597
2005
  // Optional overrides (uses theme defaults if not specified)
2598
- shadow: z10.object({
2599
- elevation: z10.enum(["none", "low", "medium", "high"]),
2600
- softness: z10.enum(["crisp", "soft", "hard"]).nullable(),
2601
- position: z10.enum(["bottom", "bottom-right"]).default("bottom")
2006
+ shadow: z7.object({
2007
+ elevation: z7.enum(["none", "low", "medium", "high"]),
2008
+ softness: z7.enum(["crisp", "soft", "hard"]).nullable(),
2009
+ position: z7.enum(["bottom", "bottom-right"]).default("bottom")
2602
2010
  }).optional(),
2603
- corners: z10.enum(["square", "soft", "rounded", "pill"]).optional(),
2011
+ corners: z7.enum(["square", "soft", "rounded", "pill"]).optional(),
2604
2012
  // Border (optional)
2605
2013
  border: cardBorderSchema.optional()
2606
2014
  });
2607
- var cardSystemSchema = z10.object({
2608
- variants: z10.array(cardVariantSchema).min(1).max(3)
2015
+ var cardSystemSchema = z7.object({
2016
+ variants: z7.array(cardVariantSchema).min(1).max(3)
2609
2017
  });
2610
2018
 
2611
2019
  // ../theme-core/src/accordions/types.ts
2612
- import { z as z11 } from "zod";
2613
- var accordionIconSchema = z11.enum([
2020
+ import { z as z8 } from "zod";
2021
+ var accordionIconSchema = z8.enum([
2614
2022
  "plus-minus",
2615
2023
  // + becomes - (swap or rotate 90°)
2616
2024
  "chevron",
@@ -2622,180 +2030,180 @@ var accordionIconSchema = z11.enum([
2622
2030
  "circle-plus-minus"
2623
2031
  // ⊕ becomes ⊖ (swap with fade)
2624
2032
  ]);
2625
- var accordionSystemSchema = z11.object({
2033
+ var accordionSystemSchema = z8.object({
2626
2034
  // Visual styling (solid color only - gradients can be added later if needed)
2627
- background: z11.object({
2628
- type: z11.literal("solid"),
2629
- colorToken: z11.string()
2035
+ background: z8.object({
2036
+ type: z8.literal("solid"),
2037
+ colorToken: z8.string()
2630
2038
  }),
2631
2039
  // Spacing (padding inside items)
2632
- spacing: z11.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
2040
+ spacing: z8.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
2633
2041
  // Border radius (null = inherit from theme.corners)
2634
- corners: z11.enum(["square", "soft", "rounded", "pill"]).nullable(),
2042
+ corners: z8.enum(["square", "soft", "rounded", "pill"]).nullable(),
2635
2043
  // Border styling (null = inherit from theme.border)
2636
- border: z11.object({
2637
- widthClass: z11.string(),
2044
+ border: z8.object({
2045
+ widthClass: z8.string(),
2638
2046
  // e.g., 'border', 'border-2', 'border-0'
2639
- colorToken: z11.string()
2047
+ colorToken: z8.string()
2640
2048
  }).nullable(),
2641
2049
  // Shadow (null = inherit from theme.shadow)
2642
- shadow: z11.object({
2643
- elevation: z11.enum(["none", "low", "medium", "high"]),
2644
- softness: z11.enum(["soft", "crisp", "hard"]).nullable(),
2645
- position: z11.enum(["bottom", "bottom-right"])
2050
+ shadow: z8.object({
2051
+ elevation: z8.enum(["none", "low", "medium", "high"]),
2052
+ softness: z8.enum(["soft", "crisp", "hard"]).nullable(),
2053
+ position: z8.enum(["bottom", "bottom-right"])
2646
2054
  }).nullable(),
2647
2055
  // Icon style and animation
2648
- icon: z11.object({
2056
+ icon: z8.object({
2649
2057
  style: accordionIconSchema,
2650
- position: z11.enum(["left", "right"]),
2651
- size: z11.enum(["sm", "md", "lg"])
2058
+ position: z8.enum(["left", "right"]),
2059
+ size: z8.enum(["sm", "md", "lg"])
2652
2060
  }),
2653
2061
  // Trigger (question) styling
2654
- trigger: z11.object({
2655
- textColorToken: z11.string(),
2656
- fontWeight: z11.enum(["regular", "medium", "semibold", "bold"]).nullable()
2062
+ trigger: z8.object({
2063
+ textColorToken: z8.string(),
2064
+ fontWeight: z8.enum(["regular", "medium", "semibold", "bold"]).nullable()
2657
2065
  // null = inherit from theme
2658
2066
  }),
2659
2067
  // Hover state styling
2660
- hover: z11.object({
2661
- backgroundColorToken: z11.string().optional(),
2662
- textColorToken: z11.string().optional(),
2663
- borderColorToken: z11.string().optional()
2068
+ hover: z8.object({
2069
+ backgroundColorToken: z8.string().optional(),
2070
+ textColorToken: z8.string().optional(),
2071
+ borderColorToken: z8.string().optional()
2664
2072
  }),
2665
2073
  // Content (answer) styling
2666
- content: z11.object({
2667
- textColorToken: z11.string()
2074
+ content: z8.object({
2075
+ textColorToken: z8.string()
2668
2076
  })
2669
2077
  });
2670
2078
 
2671
2079
  // ../theme-core/src/inputs/types.ts
2672
- import { z as z12 } from "zod";
2673
- var inputSystemSchema = z12.object({
2080
+ import { z as z9 } from "zod";
2081
+ var inputSystemSchema = z9.object({
2674
2082
  // Base styling (applied to all inputs)
2675
- base: z12.object({
2676
- background: z12.union([
2677
- z12.object({
2678
- type: z12.literal("solid"),
2679
- colorToken: z12.string()
2083
+ base: z9.object({
2084
+ background: z9.union([
2085
+ z9.object({
2086
+ type: z9.literal("solid"),
2087
+ colorToken: z9.string()
2680
2088
  }),
2681
- z12.object({
2682
- type: z12.literal("transparent")
2089
+ z9.object({
2090
+ type: z9.literal("transparent")
2683
2091
  })
2684
2092
  ]),
2685
- textColorToken: z12.string(),
2686
- border: z12.object({
2687
- widthClass: z12.string(),
2093
+ textColorToken: z9.string(),
2094
+ border: z9.object({
2095
+ widthClass: z9.string(),
2688
2096
  // e.g., 'border', 'border-2'
2689
- colorToken: z12.string(),
2690
- style: z12.enum(["all", "underline"]).optional()
2097
+ colorToken: z9.string(),
2098
+ style: z9.enum(["all", "underline"]).optional()
2691
2099
  }),
2692
- corners: z12.enum(["square", "soft", "rounded", "pill"]).nullable(),
2100
+ corners: z9.enum(["square", "soft", "rounded", "pill"]).nullable(),
2693
2101
  // null = inherit from theme.corners
2694
- shadow: z12.object({
2695
- elevation: z12.enum(["none", "low", "medium"]),
2696
- softness: z12.enum(["soft", "crisp", "hard"]).nullable()
2102
+ shadow: z9.object({
2103
+ elevation: z9.enum(["none", "low", "medium"]),
2104
+ softness: z9.enum(["soft", "crisp", "hard"]).nullable()
2697
2105
  }).nullable(),
2698
- spacing: z12.enum(["compact", "cozy", "medium", "comfortable"]),
2106
+ spacing: z9.enum(["compact", "cozy", "medium", "comfortable"]),
2699
2107
  // padding inside inputs
2700
- fontSize: z12.enum(["sm", "base", "lg"])
2108
+ fontSize: z9.enum(["sm", "base", "lg"])
2701
2109
  }),
2702
2110
  // Label styling
2703
- label: z12.object({
2704
- textColorToken: z12.string(),
2705
- fontWeight: z12.enum(["regular", "medium", "semibold", "bold", "black"]),
2706
- fontSize: z12.enum(["2xs", "xs", "sm", "base"]),
2707
- textTransform: z12.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
2708
- letterSpacing: z12.enum(["normal", "wide", "wider", "widest"]).optional(),
2709
- opacity: z12.number().min(0.2).max(1).optional()
2111
+ label: z9.object({
2112
+ textColorToken: z9.string(),
2113
+ fontWeight: z9.enum(["regular", "medium", "semibold", "bold", "black"]),
2114
+ fontSize: z9.enum(["2xs", "xs", "sm", "base"]),
2115
+ textTransform: z9.enum(["none", "uppercase", "lowercase", "capitalize"]).optional(),
2116
+ letterSpacing: z9.enum(["normal", "wide", "wider", "widest"]).optional(),
2117
+ opacity: z9.number().min(0.2).max(1).optional()
2710
2118
  }),
2711
2119
  // Focus state
2712
- focus: z12.object({
2713
- ringColorToken: z12.string(),
2714
- ringWidth: z12.enum(["0", "1", "2", "3"]),
2715
- borderColorToken: z12.string().optional()
2120
+ focus: z9.object({
2121
+ ringColorToken: z9.string(),
2122
+ ringWidth: z9.enum(["0", "1", "2", "3"]),
2123
+ borderColorToken: z9.string().optional()
2716
2124
  // Change border color on focus
2717
2125
  }),
2718
2126
  // Error state (for validation feedback)
2719
- error: z12.object({
2720
- borderColorToken: z12.string(),
2721
- textColorToken: z12.string()
2127
+ error: z9.object({
2128
+ borderColorToken: z9.string(),
2129
+ textColorToken: z9.string()
2722
2130
  }),
2723
2131
  // Disabled state
2724
- disabled: z12.object({
2725
- backgroundColorToken: z12.string(),
2726
- textColorToken: z12.string(),
2727
- opacity: z12.number().min(0.3).max(0.7)
2132
+ disabled: z9.object({
2133
+ backgroundColorToken: z9.string(),
2134
+ textColorToken: z9.string(),
2135
+ opacity: z9.number().min(0.3).max(0.7)
2728
2136
  })
2729
2137
  });
2730
2138
 
2731
2139
  // ../theme-core/src/gradients/types.ts
2732
- import { z as z13 } from "zod";
2733
- var gradientStopSchema = z13.object({
2734
- color: z13.string(),
2140
+ import { z as z10 } from "zod";
2141
+ var gradientStopSchema = z10.object({
2142
+ color: z10.string(),
2735
2143
  // Theme color token name (e.g., 'primary-500')
2736
- position: z13.number().min(0).max(100)
2144
+ position: z10.number().min(0).max(100)
2737
2145
  // Percentage 0-100
2738
2146
  });
2739
- var gradientConfigSchema = z13.object({
2740
- type: z13.enum(["linear", "radial"]),
2741
- angle: z13.number().min(0).max(360).optional(),
2147
+ var gradientConfigSchema = z10.object({
2148
+ type: z10.enum(["linear", "radial"]),
2149
+ angle: z10.number().min(0).max(360).optional(),
2742
2150
  // For linear gradients (degrees)
2743
- position: z13.string().optional(),
2151
+ position: z10.string().optional(),
2744
2152
  // For radial gradients ('center', 'top left', etc.)
2745
- stops: z13.array(gradientStopSchema).min(2)
2153
+ stops: z10.array(gradientStopSchema).min(2)
2746
2154
  });
2747
2155
 
2748
2156
  // ../theme-core/src/navigation/types.ts
2749
- import { z as z15 } from "zod";
2157
+ import { z as z12 } from "zod";
2750
2158
 
2751
2159
  // ../theme-core/src/interactive/baseSchema.ts
2752
- import { z as z14 } from "zod";
2753
- var interactiveTypographySchema = z14.object({
2160
+ import { z as z11 } from "zod";
2161
+ var interactiveTypographySchema = z11.object({
2754
2162
  /** Font family source */
2755
- typography: z14.enum(["body", "heading"]).default("body"),
2163
+ typography: z11.enum(["body", "heading"]).default("body"),
2756
2164
  /** Font weight */
2757
- fontWeight: z14.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
2165
+ fontWeight: z11.enum(["regular", "medium", "semibold", "bold"]).default("medium"),
2758
2166
  /** Text transform */
2759
- textTransform: z14.enum(["none", "uppercase", "capitalize"]).default("none"),
2167
+ textTransform: z11.enum(["none", "uppercase", "capitalize"]).default("none"),
2760
2168
  /** Italic style */
2761
- italic: z14.boolean().default(false)
2169
+ italic: z11.boolean().default(false)
2762
2170
  });
2763
- var effectApplicationSchema2 = z14.object({
2171
+ var effectApplicationSchema2 = z11.object({
2764
2172
  /** Effect preset ID */
2765
- effectId: z14.string(),
2173
+ effectId: z11.string(),
2766
2174
  /** User-provided customization options */
2767
- options: z14.record(z14.string(), z14.any()).optional()
2175
+ options: z11.record(z11.string(), z11.any()).optional()
2768
2176
  });
2769
- var effectCompositionSchema = z14.object({
2177
+ var effectCompositionSchema = z11.object({
2770
2178
  /** Effects always applied */
2771
- base: z14.array(effectApplicationSchema2).optional(),
2179
+ base: z11.array(effectApplicationSchema2).optional(),
2772
2180
  /** Effects applied on hover */
2773
- hover: z14.array(effectApplicationSchema2).optional(),
2181
+ hover: z11.array(effectApplicationSchema2).optional(),
2774
2182
  /** Effects applied on active/pressed */
2775
- active: z14.array(effectApplicationSchema2).optional(),
2183
+ active: z11.array(effectApplicationSchema2).optional(),
2776
2184
  /** Effects applied on focus */
2777
- focus: z14.array(effectApplicationSchema2).optional()
2185
+ focus: z11.array(effectApplicationSchema2).optional()
2778
2186
  });
2779
2187
 
2780
2188
  // ../theme-core/src/navigation/types.ts
2781
- var navLinkPaddingSchema = z15.enum(["none", "compact", "default"]);
2782
- var navLinkPaddingXSchema = z15.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
2783
- var navLinkBorderRadiusSchema = z15.enum(["none", "sm", "md", "full"]);
2784
- var navLinkTextSizeSchema = z15.enum(["xs", "sm", "base", "lg"]);
2785
- var navLinkLetterSpacingSchema = z15.enum(["normal", "wide", "wider", "widest"]);
2786
- var navLinkStyleSchema = z15.object({
2189
+ var navLinkPaddingSchema = z12.enum(["none", "compact", "default"]);
2190
+ var navLinkPaddingXSchema = z12.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
2191
+ var navLinkBorderRadiusSchema = z12.enum(["none", "sm", "md", "full"]);
2192
+ var navLinkTextSizeSchema = z12.enum(["xs", "sm", "base", "lg"]);
2193
+ var navLinkLetterSpacingSchema = z12.enum(["normal", "wide", "wider", "widest"]);
2194
+ var navLinkStyleSchema = z12.object({
2787
2195
  /** Display name for the style */
2788
- name: z15.string().min(1).max(30).optional(),
2196
+ name: z12.string().min(1).max(30).optional(),
2789
2197
  /** Typography settings (inherited from interactive base) */
2790
2198
  ...interactiveTypographySchema.shape,
2791
2199
  /** Text color token */
2792
- colorToken: z15.string().default("text"),
2200
+ colorToken: z12.string().default("text"),
2793
2201
  /** Optional text size override */
2794
2202
  textSize: navLinkTextSizeSchema.optional(),
2795
2203
  /** Optional letter spacing override */
2796
2204
  letterSpacing: navLinkLetterSpacingSchema.optional(),
2797
2205
  /** Hover/active color token (for color-change effects) */
2798
- hoverColorToken: z15.string().nullable().optional(),
2206
+ hoverColorToken: z12.string().nullable().optional(),
2799
2207
  /** Padding preset */
2800
2208
  padding: navLinkPaddingSchema.default("compact"),
2801
2209
  /** Horizontal padding override (overrides horizontal component of padding preset) */
@@ -2807,7 +2215,7 @@ var navLinkStyleSchema = z15.object({
2807
2215
  });
2808
2216
 
2809
2217
  // ../theme-core/src/customCss/validation.ts
2810
- import { z as z16 } from "zod";
2218
+ import { z as z13 } from "zod";
2811
2219
  var FORBIDDEN_SELECTORS = [":root", "html", "body"];
2812
2220
  var UNIVERSAL_SELECTOR = "*";
2813
2221
  var REMOTE_URL_PATTERN = /url\s*\(\s*['"]?(https?:|\/\/)/i;
@@ -2849,7 +2257,7 @@ function containsForbiddenSelector(selector) {
2849
2257
  }
2850
2258
  return false;
2851
2259
  }
2852
- var selectorSchema = z16.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
2260
+ var selectorSchema = z13.string().min(1, "Selector cannot be empty").max(200, "Selector too long (max 200 characters)").refine(
2853
2261
  (s) => !containsForbiddenSelector(s),
2854
2262
  { message: "Global selectors (:root, html, body, *) are not allowed" }
2855
2263
  );
@@ -2859,38 +2267,38 @@ function containsRemoteUrl(value) {
2859
2267
  function containsJavascriptUrl(value) {
2860
2268
  return JAVASCRIPT_URL_PATTERN.test(value);
2861
2269
  }
2862
- var declarationValueSchema = z16.string().max(500, "Declaration value too long (max 500 characters)").refine(
2270
+ var declarationValueSchema = z13.string().max(500, "Declaration value too long (max 500 characters)").refine(
2863
2271
  (v) => !containsRemoteUrl(v),
2864
2272
  { message: "Remote url() references are not allowed. Use local paths, data URIs, or fragment IDs." }
2865
2273
  ).refine(
2866
2274
  (v) => !containsJavascriptUrl(v),
2867
2275
  { message: "javascript: URLs are not allowed" }
2868
2276
  );
2869
- var declarationsSchema = z16.record(
2870
- z16.string().min(1).max(100),
2277
+ var declarationsSchema = z13.record(
2278
+ z13.string().min(1).max(100),
2871
2279
  // property name
2872
2280
  declarationValueSchema
2873
2281
  // property value
2874
2282
  );
2875
- var customCssRuleSchema = z16.object({
2876
- id: z16.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
2283
+ var customCssRuleSchema = z13.object({
2284
+ id: z13.string().min(1, "Rule ID is required").max(50, "Rule ID too long"),
2877
2285
  selector: selectorSchema,
2878
2286
  declarations: declarationsSchema
2879
2287
  });
2880
2288
  var blockCustomCssRuleSchema = customCssRuleSchema.extend({
2881
- blockKind: z16.string().min(1, "Block kind is required").max(50, "Block kind too long")
2289
+ blockKind: z13.string().min(1, "Block kind is required").max(50, "Block kind too long")
2882
2290
  });
2883
- var customCssRulesSchema = z16.array(customCssRuleSchema).optional();
2884
- var blockCustomCssRulesSchema = z16.array(blockCustomCssRuleSchema).optional();
2291
+ var customCssRulesSchema = z13.array(customCssRuleSchema).optional();
2292
+ var blockCustomCssRulesSchema = z13.array(blockCustomCssRuleSchema).optional();
2885
2293
 
2886
2294
  // ../theme-core/src/customCss/atRuleValidation.ts
2887
- import { z as z17 } from "zod";
2295
+ import { z as z14 } from "zod";
2888
2296
  var KEYFRAME_OFFSET_PATTERN = /^(from|to|\d{1,3}%)$/i;
2889
2297
  var ANIMATION_NAME_PATTERN = /^[a-zA-Z_-][a-zA-Z0-9_-]*$/;
2890
2298
  var BLOCKED_AT_RULES = ["@import", "@charset"];
2891
2299
  var BLOCKED_AT_RULE_PATTERN = /@(?:import|charset)\b/i;
2892
- var ruleIdSchema = z17.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
2893
- var nestedRuleSchema = z17.object({
2300
+ var ruleIdSchema = z14.string().min(1, "Rule ID is required").max(50, "Rule ID too long");
2301
+ var nestedRuleSchema = z14.object({
2894
2302
  selector: selectorSchema,
2895
2303
  declarations: declarationsSchema
2896
2304
  });
@@ -2902,146 +2310,146 @@ function isValidKeyframeOffset(offset) {
2902
2310
  const value = parseInt(match[1], 10);
2903
2311
  return value >= 0 && value <= 100;
2904
2312
  }
2905
- var keyframeOffsetSchema = z17.string().transform((offset) => offset.trim()).refine(
2313
+ var keyframeOffsetSchema = z14.string().transform((offset) => offset.trim()).refine(
2906
2314
  (offset) => KEYFRAME_OFFSET_PATTERN.test(offset),
2907
2315
  { message: 'Invalid keyframe offset. Use percentages (0%, 50%, 100%) or "from"/"to"' }
2908
2316
  ).refine(
2909
2317
  isValidKeyframeOffset,
2910
2318
  { message: "Keyframe offset must be between 0% and 100%" }
2911
2319
  );
2912
- var animationNameSchema = z17.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
2320
+ var animationNameSchema = z14.string().min(1, "Animation name is required").max(50, "Animation name too long").refine(
2913
2321
  (name) => ANIMATION_NAME_PATTERN.test(name),
2914
2322
  { message: "Invalid animation name. Use letters, numbers, dashes, underscores (start with letter, dash, or underscore)" }
2915
2323
  );
2916
- var keyframeSchema = z17.object({
2324
+ var keyframeSchema = z14.object({
2917
2325
  offset: keyframeOffsetSchema,
2918
2326
  declarations: declarationsSchema
2919
2327
  });
2920
- var keyframesAtRuleSchema = z17.object({
2328
+ var keyframesAtRuleSchema = z14.object({
2921
2329
  id: ruleIdSchema,
2922
- type: z17.literal("keyframes"),
2330
+ type: z14.literal("keyframes"),
2923
2331
  name: animationNameSchema,
2924
- frames: z17.array(keyframeSchema).min(1, "At least one keyframe is required")
2332
+ frames: z14.array(keyframeSchema).min(1, "At least one keyframe is required")
2925
2333
  });
2926
- var fontFaceDeclarationsSchema = z17.record(z17.string().min(1).max(100), declarationValueSchema).refine(
2334
+ var fontFaceDeclarationsSchema = z14.record(z14.string().min(1).max(100), declarationValueSchema).refine(
2927
2335
  (decls) => "fontFamily" in decls || "font-family" in decls,
2928
2336
  { message: "font-family is required in @font-face" }
2929
2337
  );
2930
- var fontFaceAtRuleSchema = z17.object({
2338
+ var fontFaceAtRuleSchema = z14.object({
2931
2339
  id: ruleIdSchema,
2932
- type: z17.literal("font-face"),
2340
+ type: z14.literal("font-face"),
2933
2341
  declarations: fontFaceDeclarationsSchema
2934
2342
  });
2935
- var mediaQuerySchema = z17.string().min(1, "Media query is required").max(200, "Media query too long");
2936
- var mediaAtRuleSchema = z17.object({
2343
+ var mediaQuerySchema = z14.string().min(1, "Media query is required").max(200, "Media query too long");
2344
+ var mediaAtRuleSchema = z14.object({
2937
2345
  id: ruleIdSchema,
2938
- type: z17.literal("media"),
2346
+ type: z14.literal("media"),
2939
2347
  query: mediaQuerySchema,
2940
- rules: z17.array(nestedRuleSchema).min(1, "At least one rule is required")
2348
+ rules: z14.array(nestedRuleSchema).min(1, "At least one rule is required")
2941
2349
  });
2942
- var supportsConditionSchema = z17.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
2943
- var supportsAtRuleSchema = z17.object({
2350
+ var supportsConditionSchema = z14.string().min(1, "Supports condition is required").max(200, "Supports condition too long");
2351
+ var supportsAtRuleSchema = z14.object({
2944
2352
  id: ruleIdSchema,
2945
- type: z17.literal("supports"),
2353
+ type: z14.literal("supports"),
2946
2354
  condition: supportsConditionSchema,
2947
- rules: z17.array(nestedRuleSchema).min(1, "At least one rule is required")
2355
+ rules: z14.array(nestedRuleSchema).min(1, "At least one rule is required")
2948
2356
  });
2949
2357
  function containsBlockedAtRule(css) {
2950
2358
  return BLOCKED_AT_RULE_PATTERN.test(css);
2951
2359
  }
2952
- var rawCssSchema = z17.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
2360
+ var rawCssSchema = z14.string().min(1, "CSS is required").max(5e3, "Raw CSS too long (max 5000 characters)").refine(
2953
2361
  (css) => css.trim().startsWith("@"),
2954
2362
  { message: "Raw at-rule must start with @" }
2955
2363
  ).refine(
2956
2364
  (css) => !containsBlockedAtRule(css),
2957
2365
  { message: `Blocked at-rules: ${BLOCKED_AT_RULES.join(", ")}. Use typed at-rules or local assets instead.` }
2958
2366
  );
2959
- var rawAtRuleSchema = z17.object({
2367
+ var rawAtRuleSchema = z14.object({
2960
2368
  id: ruleIdSchema,
2961
- type: z17.literal("raw"),
2369
+ type: z14.literal("raw"),
2962
2370
  css: rawCssSchema
2963
2371
  });
2964
- var customCssAtRuleSchema = z17.discriminatedUnion("type", [
2372
+ var customCssAtRuleSchema = z14.discriminatedUnion("type", [
2965
2373
  keyframesAtRuleSchema,
2966
2374
  fontFaceAtRuleSchema,
2967
2375
  mediaAtRuleSchema,
2968
2376
  supportsAtRuleSchema,
2969
2377
  rawAtRuleSchema
2970
2378
  ]);
2971
- var customCssAtRulesSchema = z17.array(customCssAtRuleSchema).optional();
2379
+ var customCssAtRulesSchema = z14.array(customCssAtRuleSchema).optional();
2972
2380
 
2973
2381
  // ../theme-core/src/shared/componentStyles.ts
2974
- import { z as z18 } from "zod";
2975
- var componentBorderSchema = z18.object({
2976
- width: z18.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
2977
- style: z18.enum(["solid", "dashed"]).default("solid"),
2978
- colorToken: z18.string().optional()
2382
+ import { z as z15 } from "zod";
2383
+ var componentBorderSchema = z15.object({
2384
+ width: z15.enum(["none", "hairline", "thin", "medium", "thick"]).default("none"),
2385
+ style: z15.enum(["solid", "dashed"]).default("solid"),
2386
+ colorToken: z15.string().optional()
2979
2387
  // defaults to "border" if not set
2980
2388
  });
2981
- var componentShadowSchema = z18.object({
2982
- elevation: z18.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
2389
+ var componentShadowSchema = z15.object({
2390
+ elevation: z15.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("sm")
2983
2391
  });
2984
2392
 
2985
2393
  // ../theme-core/src/schema.ts
2986
- var axesSchema = z19.object({
2987
- tone: z19.enum(["minimal", "classic", "bold"]),
2988
- energy: z19.enum(["calm", "vibrant"]),
2989
- density: z19.enum(["airy", "regular", "compact"]),
2990
- mediaBias: z19.enum(["text", "media", "mixed"]),
2991
- conversionBias: z19.enum(["low", "med", "high"]),
2992
- motion: z19.enum(["subtle", "standard", "expressive"])
2993
- });
2994
- var colourHexString = z19.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
2995
- var paletteColorSchema = z19.object({
2996
- name: z19.string().min(1),
2394
+ var axesSchema = z16.object({
2395
+ tone: z16.enum(["minimal", "classic", "bold"]),
2396
+ energy: z16.enum(["calm", "vibrant"]),
2397
+ density: z16.enum(["airy", "regular", "compact"]),
2398
+ mediaBias: z16.enum(["text", "media", "mixed"]),
2399
+ conversionBias: z16.enum(["low", "med", "high"]),
2400
+ motion: z16.enum(["subtle", "standard", "expressive"])
2401
+ });
2402
+ var colourHexString = z16.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
2403
+ var paletteColorSchema = z16.object({
2404
+ name: z16.string().min(1),
2997
2405
  hex: colourHexString
2998
2406
  });
2999
- var paletteMetaSchema = z19.object({
3000
- mode: z19.enum(["light", "dark"])
2407
+ var paletteMetaSchema = z16.object({
2408
+ mode: z16.enum(["light", "dark"])
3001
2409
  });
3002
- var paletteSchema = z19.object({
3003
- colors: z19.array(paletteColorSchema),
2410
+ var paletteSchema = z16.object({
2411
+ colors: z16.array(paletteColorSchema),
3004
2412
  meta: paletteMetaSchema
3005
2413
  });
3006
- var typographyStyleSchema = z19.object({
3007
- family: z19.string().min(1),
3008
- weight: z19.enum(["light", "regular", "medium", "semibold", "bold"]),
3009
- letterSpacing: z19.enum(["tight", "normal", "loose"]),
3010
- lineHeight: z19.enum(["normal", "relaxed", "loose"])
2414
+ var typographyStyleSchema = z16.object({
2415
+ family: z16.string().min(1),
2416
+ weight: z16.enum(["light", "regular", "medium", "semibold", "bold"]),
2417
+ letterSpacing: z16.enum(["tight", "normal", "loose"]),
2418
+ lineHeight: z16.enum(["normal", "relaxed", "loose"])
3011
2419
  });
3012
2420
  var bodyTypographyStyleSchema = typographyStyleSchema.extend({
3013
- size: z19.enum(["md", "lg", "xl"])
2421
+ size: z16.enum(["md", "lg", "xl"])
3014
2422
  });
3015
- var headingSizeSchema = z19.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
3016
- var headingTypographyOverridesSchema = z19.object({
3017
- weight: z19.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
3018
- letterSpacing: z19.enum(["tight", "normal", "loose"]).nullable().optional(),
2423
+ var headingSizeSchema = z16.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
2424
+ var headingTypographyOverridesSchema = z16.object({
2425
+ weight: z16.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
2426
+ letterSpacing: z16.enum(["tight", "normal", "loose"]).nullable().optional(),
3019
2427
  size: headingSizeSchema.nullable().optional(),
3020
- lineHeight: z19.enum(["normal", "relaxed", "loose"]).nullable().optional(),
3021
- italic: z19.boolean().nullable().optional(),
3022
- colorToken: z19.string().min(1).nullable().optional()
2428
+ lineHeight: z16.enum(["normal", "relaxed", "loose"]).nullable().optional(),
2429
+ italic: z16.boolean().nullable().optional(),
2430
+ colorToken: z16.string().min(1).nullable().optional()
3023
2431
  // Palette token name for heading color
3024
2432
  });
3025
2433
  var headingTypographyStyleSchema = typographyStyleSchema.extend({
3026
- case: z19.enum(["uppercase", "normal", "smallCaps"]).nullable(),
3027
- italic: z19.boolean().nullable(),
3028
- colorToken: z19.string().min(1).nullable().optional()
2434
+ case: z16.enum(["uppercase", "normal", "smallCaps"]).nullable(),
2435
+ italic: z16.boolean().nullable(),
2436
+ colorToken: z16.string().min(1).nullable().optional()
3029
2437
  // Palette token name for heading color
3030
2438
  });
3031
- var proseLinkUnderlineStyleSchema = z19.enum(["solid", "dotted", "dashed"]);
3032
- var proseLinkUnderlineThicknessSchema = z19.enum(["auto", "fromFont", "thin", "medium", "thick"]);
3033
- var proseLinkUnderlineOffsetSchema = z19.enum(["auto", "tight", "normal", "loose"]);
3034
- var proseLinkStyleSchema = z19.object({
3035
- colorToken: z19.string().min(1).optional(),
3036
- hoverColorToken: z19.string().min(1).optional(),
3037
- underline: z19.boolean().optional(),
3038
- decorationColorToken: z19.string().min(1).optional(),
3039
- hoverDecorationColorToken: z19.string().min(1).optional(),
2439
+ var proseLinkUnderlineStyleSchema = z16.enum(["solid", "dotted", "dashed"]);
2440
+ var proseLinkUnderlineThicknessSchema = z16.enum(["auto", "fromFont", "thin", "medium", "thick"]);
2441
+ var proseLinkUnderlineOffsetSchema = z16.enum(["auto", "tight", "normal", "loose"]);
2442
+ var proseLinkStyleSchema = z16.object({
2443
+ colorToken: z16.string().min(1).optional(),
2444
+ hoverColorToken: z16.string().min(1).optional(),
2445
+ underline: z16.boolean().optional(),
2446
+ decorationColorToken: z16.string().min(1).optional(),
2447
+ hoverDecorationColorToken: z16.string().min(1).optional(),
3040
2448
  underlineStyle: proseLinkUnderlineStyleSchema.optional(),
3041
2449
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
3042
2450
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
3043
2451
  });
3044
- var semanticSpacingSchema = z19.enum([
2452
+ var semanticSpacingSchema = z16.enum([
3045
2453
  "none",
3046
2454
  "compact",
3047
2455
  "cozy",
@@ -3049,62 +2457,62 @@ var semanticSpacingSchema = z19.enum([
3049
2457
  "comfortable",
3050
2458
  "spacious"
3051
2459
  ]);
3052
- var boxRoundedSchema = z19.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
3053
- var boxBackgroundOverlaySchema = z19.object({
3054
- type: z19.enum(["none", "color", "gradient"]).nullable().optional(),
3055
- color: z19.string().nullable().optional(),
3056
- gradient: z19.string().nullable().optional(),
3057
- opacity: z19.number().min(0).max(1).nullable().optional()
3058
- });
3059
- var boxBackgroundSchema = z19.object({
3060
- type: z19.enum(["color", "gradient", "image"]).optional(),
3061
- color: z19.string().nullable().optional(),
3062
- gradient: z19.string().nullable().optional(),
2460
+ var boxRoundedSchema = z16.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
2461
+ var boxBackgroundOverlaySchema = z16.object({
2462
+ type: z16.enum(["none", "color", "gradient"]).nullable().optional(),
2463
+ color: z16.string().nullable().optional(),
2464
+ gradient: z16.string().nullable().optional(),
2465
+ opacity: z16.number().min(0).max(1).nullable().optional()
2466
+ });
2467
+ var boxBackgroundSchema = z16.object({
2468
+ type: z16.enum(["color", "gradient", "image"]).optional(),
2469
+ color: z16.string().nullable().optional(),
2470
+ gradient: z16.string().nullable().optional(),
3063
2471
  image: mediaSchema.nullable().optional(),
3064
- objectFit: z19.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
3065
- scale: z19.string().nullable().optional(),
3066
- position: z19.string().nullable().optional(),
3067
- opacity: z19.number().min(0).max(1).nullable().optional(),
2472
+ objectFit: z16.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
2473
+ scale: z16.string().nullable().optional(),
2474
+ position: z16.string().nullable().optional(),
2475
+ opacity: z16.number().min(0).max(1).nullable().optional(),
3068
2476
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
3069
- textColor: z19.string().nullable().optional(),
3070
- headingColor: z19.string().nullable().optional()
2477
+ textColor: z16.string().nullable().optional(),
2478
+ headingColor: z16.string().nullable().optional()
3071
2479
  });
3072
- var sectionStylesOverrideSchema = z19.object({
2480
+ var sectionStylesOverrideSchema = z16.object({
3073
2481
  background: boxBackgroundSchema.nullable().optional(),
3074
2482
  spacing: semanticSpacingSchema.nullable().optional(),
3075
- minHeight: z19.enum(["none", "hero", "immersive"]).nullable().optional()
2483
+ minHeight: z16.enum(["none", "hero", "immersive"]).nullable().optional()
3076
2484
  });
3077
- var containerStylesOverrideSchema = z19.object({
2485
+ var containerStylesOverrideSchema = z16.object({
3078
2486
  background: boxBackgroundSchema.nullable().optional(),
3079
2487
  spacing: semanticSpacingSchema.nullable().optional(),
3080
- raised: z19.boolean().nullable().optional(),
2488
+ raised: z16.boolean().nullable().optional(),
3081
2489
  rounded: boxRoundedSchema.nullable().optional(),
3082
- fullWidth: z19.boolean().nullable().optional()
2490
+ fullWidth: z16.boolean().nullable().optional()
3083
2491
  });
3084
- var cardBorderOverrideSchema = z19.object({
3085
- enabled: z19.boolean().nullable().optional(),
3086
- width: z19.enum(["none", "1", "2", "3"]).nullable().optional(),
3087
- colorToken: z19.string().nullable().optional()
2492
+ var cardBorderOverrideSchema = z16.object({
2493
+ enabled: z16.boolean().nullable().optional(),
2494
+ width: z16.enum(["none", "1", "2", "3"]).nullable().optional(),
2495
+ colorToken: z16.string().nullable().optional()
3088
2496
  });
3089
- var cardStylesOverrideSchema = z19.object({
2497
+ var cardStylesOverrideSchema = z16.object({
3090
2498
  background: boxBackgroundSchema.nullable().optional(),
3091
2499
  border: cardBorderOverrideSchema.nullable().optional(),
3092
2500
  spacing: semanticSpacingSchema.nullable().optional(),
3093
- raised: z19.boolean().nullable().optional(),
2501
+ raised: z16.boolean().nullable().optional(),
3094
2502
  rounded: boxRoundedSchema.nullable().optional()
3095
2503
  });
3096
- var blockStyleOverridesSchema = z19.object({
2504
+ var blockStyleOverridesSchema = z16.object({
3097
2505
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
3098
2506
  containerStyles: containerStylesOverrideSchema.nullable().optional(),
3099
2507
  cardStyles: cardStylesOverrideSchema.nullable().optional()
3100
2508
  });
3101
- var blockThemeOverrideSchema = z19.object({
3102
- typography: z19.object({
2509
+ var blockThemeOverrideSchema = z16.object({
2510
+ typography: z16.object({
3103
2511
  proseLinkStyle: proseLinkStyleSchema.optional()
3104
2512
  }).optional(),
3105
2513
  styles: blockStyleOverridesSchema.optional()
3106
2514
  });
3107
- var typographyScaleSchema = z19.enum([
2515
+ var typographyScaleSchema = z16.enum([
3108
2516
  // New intuitive names
3109
2517
  "compact",
3110
2518
  // ratio 1.2 (was minorThird)
@@ -3117,9 +2525,9 @@ var typographyScaleSchema = z19.enum([
3117
2525
  "majorThird",
3118
2526
  "perfectFourth"
3119
2527
  ]);
3120
- var typographySchema = z19.object({
2528
+ var typographySchema = z16.object({
3121
2529
  body: bodyTypographyStyleSchema,
3122
- headings: z19.object({
2530
+ headings: z16.object({
3123
2531
  default: headingTypographyStyleSchema,
3124
2532
  h1: headingTypographyOverridesSchema,
3125
2533
  h2: headingTypographyOverridesSchema,
@@ -3132,41 +2540,41 @@ var typographySchema = z19.object({
3132
2540
  scale: typographyScaleSchema,
3133
2541
  proseLinkStyle: proseLinkStyleSchema.optional()
3134
2542
  });
3135
- var spaceSchema = z19.enum(["comfortable", "standard", "dense"]);
3136
- var corners = z19.enum(["square", "soft", "rounded", "pill"]);
3137
- var shadow = z19.object({
3138
- elevation: z19.enum(["none", "low", "medium", "high"]),
3139
- softness: z19.enum(["crisp", "soft", "hard"]).nullable(),
3140
- position: z19.enum(["bottom", "bottom-right"]).default("bottom")
2543
+ var spaceSchema = z16.enum(["comfortable", "standard", "dense"]);
2544
+ var corners = z16.enum(["square", "soft", "rounded", "pill"]);
2545
+ var shadow = z16.object({
2546
+ elevation: z16.enum(["none", "low", "medium", "high"]),
2547
+ softness: z16.enum(["crisp", "soft", "hard"]).nullable(),
2548
+ position: z16.enum(["bottom", "bottom-right"]).default("bottom")
3141
2549
  });
3142
- var border = z19.object({
3143
- width: z19.enum(["none", "hairline", "thin", "thick"]),
3144
- style: z19.enum(["solid", "dashed"])
2550
+ var border = z16.object({
2551
+ width: z16.enum(["none", "hairline", "thin", "thick"]),
2552
+ style: z16.enum(["solid", "dashed"])
3145
2553
  });
3146
- var motion = z19.object({
3147
- level: z19.enum(["off", "low", "medium", "high"]),
3148
- easing: z19.enum(["standard", "snappy", "gentle"]).nullable()
2554
+ var motion = z16.object({
2555
+ level: z16.enum(["off", "low", "medium", "high"]),
2556
+ easing: z16.enum(["standard", "snappy", "gentle"]).nullable()
3149
2557
  });
3150
- var buttonStyle = z19.object({
2558
+ var buttonStyle = z16.object({
3151
2559
  shape: corners
3152
2560
  // Used for --radius-control CSS variable
3153
2561
  });
3154
- var cardStyle = z19.object({
3155
- elevation: z19.enum(["none", "low", "medium", "high"]),
3156
- border: z19.enum(["none", "subtle", "defined"]),
2562
+ var cardStyle = z16.object({
2563
+ elevation: z16.enum(["none", "low", "medium", "high"]),
2564
+ border: z16.enum(["none", "subtle", "defined"]),
3157
2565
  shape: corners,
3158
- headerStyle: z19.enum(["plain", "accentBar", "subtleBg"]).nullable(),
3159
- mediaTreatment: z19.enum(["square", "rounded", "bleed"]).nullable()
2566
+ headerStyle: z16.enum(["plain", "accentBar", "subtleBg"]).nullable(),
2567
+ mediaTreatment: z16.enum(["square", "rounded", "bleed"]).nullable()
3160
2568
  });
3161
- var inputStyle = z19.object({
2569
+ var inputStyle = z16.object({
3162
2570
  shape: corners,
3163
- border: z19.enum(["subtle", "defined", "underline"]),
3164
- focus: z19.enum(["glow", "ring", "underline"]),
3165
- label: z19.enum(["inside", "above"])
2571
+ border: z16.enum(["subtle", "defined", "underline"]),
2572
+ focus: z16.enum(["glow", "ring", "underline"]),
2573
+ label: z16.enum(["inside", "above"])
3166
2574
  });
3167
- var headerVariant = z19.enum(["classic", "centered", "transparent", "floating", "editorial"]);
3168
- var headerPositioning = z19.enum(["static", "sticky", "fixed"]);
3169
- var headerNavStyle = z19.enum([
2575
+ var headerVariant = z16.enum(["classic", "centered", "transparent", "floating", "editorial"]);
2576
+ var headerPositioning = z16.enum(["static", "sticky", "fixed"]);
2577
+ var headerNavStyle = z16.enum([
3170
2578
  "minimal",
3171
2579
  "underline",
3172
2580
  "underline-grow",
@@ -3175,82 +2583,82 @@ var headerNavStyle = z19.enum([
3175
2583
  "frosted",
3176
2584
  "solid"
3177
2585
  ]);
3178
- var navFontWeight = z19.enum(["regular", "medium", "semibold", "bold"]);
3179
- var headerMaxWidth = z19.enum(["container", "full"]);
3180
- var headerContainerSchema = z19.object({
3181
- rounded: z19.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
3182
- border: z19.boolean().default(true),
3183
- shadow: z19.boolean().default(true),
3184
- padding: z19.enum(["sm", "md", "lg"]).default("md"),
3185
- tint: z19.string().nullable().optional(),
3186
- opacity: z19.number().min(0).max(1).default(0.12)
2586
+ var navFontWeight = z16.enum(["regular", "medium", "semibold", "bold"]);
2587
+ var headerMaxWidth = z16.enum(["container", "full"]);
2588
+ var headerContainerSchema = z16.object({
2589
+ rounded: z16.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
2590
+ border: z16.boolean().default(true),
2591
+ shadow: z16.boolean().default(true),
2592
+ padding: z16.enum(["sm", "md", "lg"]).default("md"),
2593
+ tint: z16.string().nullable().optional(),
2594
+ opacity: z16.number().min(0).max(1).default(0.12)
3187
2595
  }).optional();
3188
2596
  var headerBorderSchema = componentBorderSchema.extend({
3189
- position: z19.enum(["bottom", "top", "both", "none"]).default("bottom")
2597
+ position: z16.enum(["bottom", "top", "both", "none"]).default("bottom")
3190
2598
  }).optional();
3191
- var logoStyleSchema = z19.object({
3192
- fontFamily: z19.enum(["heading", "body"]).default("heading"),
3193
- letterSpacing: z19.enum(["normal", "wide", "wider", "widest"]).default("normal"),
3194
- gradient: z19.boolean().default(false)
2599
+ var logoStyleSchema = z16.object({
2600
+ fontFamily: z16.enum(["heading", "body"]).default("heading"),
2601
+ letterSpacing: z16.enum(["normal", "wide", "wider", "widest"]).default("normal"),
2602
+ gradient: z16.boolean().default(false)
3195
2603
  }).optional();
3196
- var headerLogoTextSchema = z19.object({
3197
- mobileWrapLines: z19.union([z19.literal(1), z19.literal(2)]).optional(),
3198
- mobileMaxWidth: z19.enum(["xs", "sm", "md"]).optional(),
3199
- hideOnShrink: z19.boolean().optional()
2604
+ var headerLogoTextSchema = z16.object({
2605
+ mobileWrapLines: z16.union([z16.literal(1), z16.literal(2)]).optional(),
2606
+ mobileMaxWidth: z16.enum(["xs", "sm", "md"]).optional(),
2607
+ hideOnShrink: z16.boolean().optional()
3200
2608
  }).optional();
3201
- var navEffectsSchema = z19.object({
3202
- underlineGradient: z19.boolean().default(false),
3203
- glow: z19.boolean().default(false),
3204
- glowColor: z19.string().optional(),
3205
- neumorphic: z19.boolean().default(false)
2609
+ var navEffectsSchema = z16.object({
2610
+ underlineGradient: z16.boolean().default(false),
2611
+ glow: z16.boolean().default(false),
2612
+ glowColor: z16.string().optional(),
2613
+ neumorphic: z16.boolean().default(false)
3206
2614
  }).optional();
3207
- var dropdownStyleSchema = z19.object({
2615
+ var dropdownStyleSchema = z16.object({
3208
2616
  // Container styling
3209
- background: z19.string().default("surface"),
2617
+ background: z16.string().default("surface"),
3210
2618
  // color token
3211
- textColor: z19.string().default("text"),
2619
+ textColor: z16.string().default("text"),
3212
2620
  // color token
3213
- borderColor: z19.string().nullable().default("border"),
2621
+ borderColor: z16.string().nullable().default("border"),
3214
2622
  // null = no border
3215
- shadow: z19.enum(["none", "sm", "md", "lg"]).default("md"),
3216
- borderRadius: z19.enum(["none", "sm", "md", "lg"]).default("md"),
2623
+ shadow: z16.enum(["none", "sm", "md", "lg"]).default("md"),
2624
+ borderRadius: z16.enum(["none", "sm", "md", "lg"]).default("md"),
3217
2625
  // Link hover states (explicit control)
3218
- hoverBackground: z19.string().nullable().optional(),
2626
+ hoverBackground: z16.string().nullable().optional(),
3219
2627
  // color token, null = transparent
3220
- hoverTextColor: z19.string().nullable().optional(),
2628
+ hoverTextColor: z16.string().nullable().optional(),
3221
2629
  // color token, null = inherit
3222
2630
  // Typography
3223
- textTransform: z19.enum(["none", "uppercase", "capitalize"]).default("none"),
3224
- letterSpacing: z19.enum(["normal", "wide", "wider"]).default("normal"),
3225
- fontWeight: z19.enum(["regular", "medium", "semibold", "bold"]).optional(),
2631
+ textTransform: z16.enum(["none", "uppercase", "capitalize"]).default("none"),
2632
+ letterSpacing: z16.enum(["normal", "wide", "wider"]).default("normal"),
2633
+ fontWeight: z16.enum(["regular", "medium", "semibold", "bold"]).optional(),
3226
2634
  // optional = inherit from navWeight
3227
- textSize: z19.enum(["xs", "sm", "base", "lg"]).optional()
2635
+ textSize: z16.enum(["xs", "sm", "base", "lg"]).optional()
3228
2636
  // optional = no override (browser default)
3229
2637
  }).optional();
3230
- var headerCtaGapSchema = z19.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
3231
- var navContainerSchema = z19.object({
3232
- type: z19.enum(["none", "pill", "glass"]).default("none"),
3233
- tint: z19.string().nullable().optional(),
3234
- opacity: z19.number().min(0).max(1).default(0.15)
2638
+ var headerCtaGapSchema = z16.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
2639
+ var navContainerSchema = z16.object({
2640
+ type: z16.enum(["none", "pill", "glass"]).default("none"),
2641
+ tint: z16.string().nullable().optional(),
2642
+ opacity: z16.number().min(0).max(1).default(0.15)
3235
2643
  }).default({ type: "none", tint: null, opacity: 0.15 });
3236
- var headerBackgroundSchema = z19.object({
3237
- type: z19.enum(["color", "gradient", "image"]),
3238
- color: z19.string().nullable().optional(),
2644
+ var headerBackgroundSchema = z16.object({
2645
+ type: z16.enum(["color", "gradient", "image"]),
2646
+ color: z16.string().nullable().optional(),
3239
2647
  gradient: gradientConfigSchema.nullable().optional(),
3240
2648
  image: mediaSchema.nullable().optional(),
3241
- textColor: z19.string().nullable().optional()
2649
+ textColor: z16.string().nullable().optional()
3242
2650
  });
3243
- var headerSchema = z19.object({
2651
+ var headerSchema = z16.object({
3244
2652
  variant: headerVariant,
3245
2653
  positioning: headerPositioning,
3246
- shrinkOnScroll: z19.boolean(),
2654
+ shrinkOnScroll: z16.boolean(),
3247
2655
  maxWidth: headerMaxWidth,
3248
2656
  logoOverride: mediaSchema.nullable().optional(),
3249
2657
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
3250
- textColor: z19.string().nullable().optional(),
2658
+ textColor: z16.string().nullable().optional(),
3251
2659
  // Site title and general header text
3252
2660
  navStyle: headerNavStyle,
3253
- navColor: z19.string().nullable().optional(),
2661
+ navColor: z16.string().nullable().optional(),
3254
2662
  // Nav links (inherits textColor if not set)
3255
2663
  navWeight: navFontWeight.default("medium"),
3256
2664
  // New fields for header system enhancement
@@ -3269,50 +2677,50 @@ var headerSchema = z19.object({
3269
2677
  // Dropdown menu styling (nav dropdowns and mobile drawer)
3270
2678
  dropdownStyle: dropdownStyleSchema
3271
2679
  });
3272
- var footerVariant = z19.enum(["simple", "columns", "split"]);
3273
- var footerMaxWidth = z19.enum(["container", "full"]);
3274
- var footerMode = z19.enum(["default", "blocks", "default+blocks", "none"]);
3275
- var footerNavLayoutMode = z19.enum(["stack", "inline", "inline-wrap"]);
3276
- var footerNavLayoutAlign = z19.enum(["start", "center", "end", "space-between"]);
3277
- var footerSpacing = z19.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
3278
- var footerLogoPlacement = z19.enum(["left", "right", "above", "below"]);
3279
- var footerLogoSize = z19.enum(["sm", "md", "lg", "xl"]);
3280
- var footerLogoMaxHeight = z19.enum(["sm", "md", "lg", "xl"]);
3281
- var footerBottomTextLinkStyleSchema = z19.object({
3282
- colorToken: z19.string().optional(),
3283
- hoverColorToken: z19.string().nullable().optional(),
3284
- decorationColorToken: z19.string().nullable().optional(),
3285
- underline: z19.boolean().optional()
3286
- });
3287
- var footerBottomBarSchema = z19.object({
3288
- enabled: z19.boolean().optional(),
3289
- fullBleed: z19.boolean().optional(),
2680
+ var footerVariant = z16.enum(["simple", "columns", "split"]);
2681
+ var footerMaxWidth = z16.enum(["container", "full"]);
2682
+ var footerMode = z16.enum(["default", "blocks", "default+blocks", "none"]);
2683
+ var footerNavLayoutMode = z16.enum(["stack", "inline", "inline-wrap"]);
2684
+ var footerNavLayoutAlign = z16.enum(["start", "center", "end", "space-between"]);
2685
+ var footerSpacing = z16.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
2686
+ var footerLogoPlacement = z16.enum(["left", "right", "above", "below"]);
2687
+ var footerLogoSize = z16.enum(["sm", "md", "lg", "xl"]);
2688
+ var footerLogoMaxHeight = z16.enum(["sm", "md", "lg", "xl"]);
2689
+ var footerBottomTextLinkStyleSchema = z16.object({
2690
+ colorToken: z16.string().optional(),
2691
+ hoverColorToken: z16.string().nullable().optional(),
2692
+ decorationColorToken: z16.string().nullable().optional(),
2693
+ underline: z16.boolean().optional()
2694
+ });
2695
+ var footerBottomBarSchema = z16.object({
2696
+ enabled: z16.boolean().optional(),
2697
+ fullBleed: z16.boolean().optional(),
3290
2698
  background: headerBackgroundSchema.optional(),
3291
- textColor: z19.string().nullable().optional(),
3292
- textAlign: z19.enum(["left", "center", "right"]).optional(),
2699
+ textColor: z16.string().nullable().optional(),
2700
+ textAlign: z16.enum(["left", "center", "right"]).optional(),
3293
2701
  paddingY: footerSpacing.optional(),
3294
2702
  paddingX: footerSpacing.optional(),
3295
- borderTop: z19.object({
3296
- colorToken: z19.string().nullable().optional(),
3297
- width: z19.enum(["none", "thin", "medium", "thick"]).optional()
2703
+ borderTop: z16.object({
2704
+ colorToken: z16.string().nullable().optional(),
2705
+ width: z16.enum(["none", "thin", "medium", "thick"]).optional()
3298
2706
  }).optional()
3299
2707
  });
3300
- var footerNavLayoutSchema = z19.object({
2708
+ var footerNavLayoutSchema = z16.object({
3301
2709
  layout: footerNavLayoutMode.optional(),
3302
2710
  align: footerNavLayoutAlign.optional(),
3303
2711
  gapX: footerSpacing.optional(),
3304
2712
  gapY: footerSpacing.optional(),
3305
- columns: z19.number().int().min(1).max(6).optional()
2713
+ columns: z16.number().int().min(1).max(6).optional()
3306
2714
  });
3307
- var footerLogoSchema = z19.object({
3308
- showLogo: z19.boolean().default(true),
3309
- showLogoText: z19.boolean().optional(),
2715
+ var footerLogoSchema = z16.object({
2716
+ showLogo: z16.boolean().default(true),
2717
+ showLogoText: z16.boolean().optional(),
3310
2718
  placement: footerLogoPlacement.optional(),
3311
2719
  size: footerLogoSize.optional(),
3312
2720
  maxHeight: footerLogoMaxHeight.optional(),
3313
- align: z19.enum(["start", "center", "end"]).optional()
2721
+ align: z16.enum(["start", "center", "end"]).optional()
3314
2722
  });
3315
- var footerSchema = z19.object({
2723
+ var footerSchema = z16.object({
3316
2724
  /**
3317
2725
  * SDK-only footer rendering mode.
3318
2726
  *
@@ -3321,11 +2729,11 @@ var footerSchema = z19.object({
3321
2729
  mode: footerMode.optional(),
3322
2730
  variant: footerVariant,
3323
2731
  maxWidth: footerMaxWidth,
3324
- showLogoText: z19.boolean().optional(),
2732
+ showLogoText: z16.boolean().optional(),
3325
2733
  background: headerBackgroundSchema.default({ type: "color", color: "surface" }),
3326
2734
  // Footer nav styling (independent from header)
3327
2735
  navStyle: headerNavStyle.default("minimal"),
3328
- navColor: z19.string().nullable().optional(),
2736
+ navColor: z16.string().nullable().optional(),
3329
2737
  navWeight: navFontWeight.default("medium"),
3330
2738
  // Full nav link customization (overrides navStyle if set)
3331
2739
  navLinkStyle: navLinkStyleSchema.optional(),
@@ -3336,15 +2744,15 @@ var footerSchema = z19.object({
3336
2744
  logo: footerLogoSchema.optional(),
3337
2745
  bottomBar: footerBottomBarSchema.optional()
3338
2746
  });
3339
- var containerPaddingPresetSchema = z19.enum(["tight", "compact", "default", "relaxed"]);
3340
- var layoutSchema = z19.object({
3341
- containerPadding: z19.object({
2747
+ var containerPaddingPresetSchema = z16.enum(["tight", "compact", "default", "relaxed"]);
2748
+ var layoutSchema = z16.object({
2749
+ containerPadding: z16.object({
3342
2750
  mobile: containerPaddingPresetSchema.optional(),
3343
2751
  tablet: containerPaddingPresetSchema.optional(),
3344
2752
  desktop: containerPaddingPresetSchema.optional()
3345
2753
  }).optional()
3346
2754
  }).optional();
3347
- var heroTypographySizeSchema = z19.enum([
2755
+ var heroTypographySizeSchema = z16.enum([
3348
2756
  "sm",
3349
2757
  "base",
3350
2758
  "lg",
@@ -3355,14 +2763,14 @@ var heroTypographySizeSchema = z19.enum([
3355
2763
  "5xl",
3356
2764
  "6xl"
3357
2765
  ]);
3358
- var heroTypographyLineHeightSchema = z19.enum(["tight", "snug", "normal", "relaxed"]);
3359
- var heroResponsiveTypographySchema = z19.object({
2766
+ var heroTypographyLineHeightSchema = z16.enum(["tight", "snug", "normal", "relaxed"]);
2767
+ var heroResponsiveTypographySchema = z16.object({
3360
2768
  headlineSize: heroTypographySizeSchema.optional(),
3361
2769
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
3362
2770
  subheadlineSize: heroTypographySizeSchema.optional(),
3363
2771
  subheadlineLineHeight: heroTypographyLineHeightSchema.optional()
3364
2772
  });
3365
- var heroTypographySchema = z19.object({
2773
+ var heroTypographySchema = z16.object({
3366
2774
  headlineSize: heroTypographySizeSchema.optional(),
3367
2775
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
3368
2776
  subheadlineSize: heroTypographySizeSchema.optional(),
@@ -3371,24 +2779,24 @@ var heroTypographySchema = z19.object({
3371
2779
  microHeadlineLineHeight: heroTypographyLineHeightSchema.optional(),
3372
2780
  microSubheadlineSize: heroTypographySizeSchema.optional(),
3373
2781
  microSubheadlineLineHeight: heroTypographyLineHeightSchema.optional(),
3374
- responsive: z19.object({
2782
+ responsive: z16.object({
3375
2783
  tablet: heroResponsiveTypographySchema.optional(),
3376
2784
  mobile: heroResponsiveTypographySchema.optional()
3377
2785
  }).optional()
3378
2786
  });
3379
- var heroSchema = z19.object({
2787
+ var heroSchema = z16.object({
3380
2788
  typography: heroTypographySchema.optional()
3381
2789
  }).optional();
3382
- var gradientsSchema = z19.object({
3383
- button: z19.string().min(1).nullable().optional(),
3384
- hero: z19.string().min(1).nullable().optional(),
3385
- background: z19.string().min(1).nullable().optional()
3386
- });
3387
- var themeSchema = z19.object({
3388
- name: z19.string().min(1).max(30),
3389
- description: z19.string().min(1).max(400),
3390
- rationale: z19.string().min(1).max(400),
3391
- siteStyleId: z19.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
2790
+ var gradientsSchema = z16.object({
2791
+ button: z16.string().min(1).nullable().optional(),
2792
+ hero: z16.string().min(1).nullable().optional(),
2793
+ background: z16.string().min(1).nullable().optional()
2794
+ });
2795
+ var themeSchema = z16.object({
2796
+ name: z16.string().min(1).max(30),
2797
+ description: z16.string().min(1).max(400),
2798
+ rationale: z16.string().min(1).max(400),
2799
+ siteStyleId: z16.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
3392
2800
  axes: axesSchema,
3393
2801
  palette: paletteSchema,
3394
2802
  typography: typographySchema,
@@ -3415,16 +2823,16 @@ var themeSchema = z19.object({
3415
2823
  // Block-specific customization (Tier 3)
3416
2824
  // blockCustomVars: Per-block CSS variable overrides as bare values
3417
2825
  // Example: { "event-registration": { "--step-color": "#6d28d9" } }
3418
- blockCustomVars: z19.record(
3419
- z19.string(),
2826
+ blockCustomVars: z16.record(
2827
+ z16.string(),
3420
2828
  // block kind (matches data-block attribute)
3421
- z19.record(z19.string(), z19.string())
2829
+ z16.record(z16.string(), z16.string())
3422
2830
  // { '--var-name': 'value' }
3423
2831
  ).optional(),
3424
2832
  // Structured block-kind theme overrides (v1: typography prose-link style only)
3425
2833
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
3426
- blockOverrides: z19.record(
3427
- z19.string(),
2834
+ blockOverrides: z16.record(
2835
+ z16.string(),
3428
2836
  blockThemeOverrideSchema
3429
2837
  ).optional(),
3430
2838
  // Structured custom CSS rules
@@ -3460,22 +2868,21 @@ var themeSchema = z19.object({
3460
2868
  * }
3461
2869
  * ```
3462
2870
  */
3463
- styleGroups: z19.record(z19.string(), z19.array(z19.string())).optional()
2871
+ styleGroups: z16.record(z16.string(), z16.array(z16.string())).optional()
3464
2872
  });
3465
- var themesTurnSchema = z19.object({
3466
- message: z19.string().min(1),
3467
- themes: z19.array(themeSchema).length(3)
2873
+ var themesTurnSchema = z16.object({
2874
+ message: z16.string().min(1),
2875
+ themes: z16.array(themeSchema).length(3)
3468
2876
  });
3469
2877
 
3470
2878
  // ../theme-core/src/palette/variants/types.ts
3471
- import { z as z20 } from "zod";
3472
2879
  function asPaletteVariantId(value) {
3473
2880
  if (value.length === 0) {
3474
2881
  throw new Error("PaletteVariantId must be a non-empty string");
3475
2882
  }
3476
2883
  return value;
3477
2884
  }
3478
- var paletteVariantIdSchema = z20.string().min(1).transform((value) => asPaletteVariantId(value));
2885
+ var paletteVariantIdSchema = z17.string().min(1).transform((value) => asPaletteVariantId(value));
3479
2886
  var PALETTE_TOKEN_NAMES = [
3480
2887
  "primary",
3481
2888
  "primaryForeground",
@@ -3491,19 +2898,19 @@ var PALETTE_TOKEN_NAMES = [
3491
2898
  "text",
3492
2899
  "border"
3493
2900
  ];
3494
- var paletteTokenNameSchema = z20.enum(PALETTE_TOKEN_NAMES);
2901
+ var paletteTokenNameSchema = z17.enum(PALETTE_TOKEN_NAMES);
3495
2902
  var HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
3496
- var hexColorSchema = z20.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
2903
+ var hexColorSchema = z17.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
3497
2904
  var variantPaletteColorSchema = paletteColorSchema.extend({
3498
2905
  name: paletteTokenNameSchema
3499
2906
  });
3500
- var paletteVariantSchema = z20.object({
2907
+ var paletteVariantSchema = z17.object({
3501
2908
  id: paletteVariantIdSchema,
3502
- name: z20.string().min(1),
3503
- description: z20.string().min(1),
2909
+ name: z17.string().min(1),
2910
+ description: z17.string().min(1),
3504
2911
  tags: styleTagsSchema,
3505
- mode: z20.enum(["light", "dark"]),
3506
- colors: z20.array(variantPaletteColorSchema).min(1)
2912
+ mode: z17.enum(["light", "dark"]),
2913
+ colors: z17.array(variantPaletteColorSchema).min(1)
3507
2914
  });
3508
2915
  function definePaletteVariant(input) {
3509
2916
  return {
@@ -3515,7 +2922,7 @@ function definePaletteVariant(input) {
3515
2922
  colors: input.colors
3516
2923
  };
3517
2924
  }
3518
- var paletteOverridesSchema = z20.object({
2925
+ var paletteOverridesSchema = z17.object({
3519
2926
  primary: hexColorSchema.optional(),
3520
2927
  primaryForeground: hexColorSchema.optional(),
3521
2928
  secondary: hexColorSchema.optional(),
@@ -3803,28 +3210,679 @@ var warmNeutralForest = definePaletteVariant({
3803
3210
  ]
3804
3211
  });
3805
3212
 
3806
- // ../theme-core/src/palette/variants/index.ts
3807
- var paletteVariants = [
3808
- // Brand-led family
3809
- brandLedCool,
3810
- brandLedWarm,
3811
- brandLedJewel,
3812
- // Warm-neutral family
3813
- warmNeutralClay,
3814
- warmNeutralCream,
3815
- warmNeutralForest,
3816
- // High-contrast family
3817
- highContrastInk,
3818
- highContrastCharcoal,
3819
- highContrastMonochrome,
3820
- // Soft-natural family
3821
- softNaturalSage,
3822
- softNaturalStone,
3823
- softNaturalWatercolor
3213
+ // ../theme-core/src/palette/variants/index.ts
3214
+ var paletteVariants = [
3215
+ // Brand-led family
3216
+ brandLedCool,
3217
+ brandLedWarm,
3218
+ brandLedJewel,
3219
+ // Warm-neutral family
3220
+ warmNeutralClay,
3221
+ warmNeutralCream,
3222
+ warmNeutralForest,
3223
+ // High-contrast family
3224
+ highContrastInk,
3225
+ highContrastCharcoal,
3226
+ highContrastMonochrome,
3227
+ // Soft-natural family
3228
+ softNaturalSage,
3229
+ softNaturalStone,
3230
+ softNaturalWatercolor
3231
+ ];
3232
+ var paletteVariantsById = new Map(
3233
+ paletteVariants.map((v) => [v.id, v])
3234
+ );
3235
+
3236
+ // ../theme-core/src/site-styles/sourceCatalogs.ts
3237
+ var generatedContentFrames = [
3238
+ plainFrame,
3239
+ panelFrame("inset"),
3240
+ panelFrame("raised"),
3241
+ flushPanelFrame({ bleed: "start" })
3242
+ ];
3243
+ var userContentFrames = [
3244
+ ...generatedContentFrames,
3245
+ panelFrame("editorial"),
3246
+ flushPanelFrame({ bleed: "end" }),
3247
+ flushPanelFrame({ bleed: "both" })
3248
+ ];
3249
+ var generatedDesignOptionCatalog = {
3250
+ source: "generated",
3251
+ sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
3252
+ contentFrames: generatedContentFrames,
3253
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
3254
+ transitions: ["none", "soft-fade-short", "soft-fade-long"],
3255
+ emphases: ["low", "medium", "high"],
3256
+ detachedCustom: false
3257
+ };
3258
+ var userDesignOptionCatalog = {
3259
+ source: "user",
3260
+ sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
3261
+ contentFrames: userContentFrames,
3262
+ itemSurfaces: [
3263
+ ...generatedDesignOptionCatalog.itemSurfaces,
3264
+ "inset",
3265
+ "editorial"
3266
+ ],
3267
+ transitions: [
3268
+ ...generatedDesignOptionCatalog.transitions,
3269
+ "wave-edge",
3270
+ "angle-edge"
3271
+ ],
3272
+ emphases: generatedDesignOptionCatalog.emphases,
3273
+ detachedCustom: false
3274
+ };
3275
+ var advancedDesignOptionCatalog = {
3276
+ source: "advanced",
3277
+ sectionSurfaces: userDesignOptionCatalog.sectionSurfaces,
3278
+ contentFrames: userDesignOptionCatalog.contentFrames,
3279
+ itemSurfaces: userDesignOptionCatalog.itemSurfaces,
3280
+ transitions: userDesignOptionCatalog.transitions,
3281
+ emphases: userDesignOptionCatalog.emphases,
3282
+ detachedCustom: true
3283
+ };
3284
+
3285
+ // ../theme-core/src/site-styles/curatedSiteStyles.ts
3286
+ var curatedSiteStyleIdValues = [
3287
+ "site-style:calm-studio",
3288
+ "site-style:clear-professional",
3289
+ "site-style:warm-editorial",
3290
+ "site-style:bright-community",
3291
+ "site-style:quiet-luxury",
3292
+ "site-style:practical-services",
3293
+ "site-style:modern-wellness",
3294
+ "site-style:bold-launch"
3295
+ ];
3296
+ var quietBudget = {
3297
+ accentDensity: "low",
3298
+ panelDensity: "medium",
3299
+ transitionMix: "quiet",
3300
+ primaryCtaLimit: 2,
3301
+ mediaDensity: "medium",
3302
+ decorativeRepetition: "low"
3303
+ };
3304
+ var balancedBudget = {
3305
+ accentDensity: "medium",
3306
+ panelDensity: "medium",
3307
+ transitionMix: "balanced",
3308
+ primaryCtaLimit: 3,
3309
+ mediaDensity: "medium",
3310
+ decorativeRepetition: "medium"
3311
+ };
3312
+ var expressiveBudget = {
3313
+ accentDensity: "high",
3314
+ panelDensity: "high",
3315
+ transitionMix: "expressive",
3316
+ primaryCtaLimit: 3,
3317
+ mediaDensity: "high",
3318
+ decorativeRepetition: "medium"
3319
+ };
3320
+ function uniqueContentFrameKinds() {
3321
+ const kinds = [...new Set(
3322
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
3323
+ )];
3324
+ const firstKind = kinds[0];
3325
+ if (!firstKind) {
3326
+ throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
3327
+ }
3328
+ return [firstKind, ...kinds.slice(1)];
3329
+ }
3330
+ var generatedContentFrameKinds = uniqueContentFrameKinds();
3331
+ function defineCuratedSiteStyle(input) {
3332
+ return {
3333
+ id: asSiteStyleId(input.id),
3334
+ name: input.name,
3335
+ description: input.description,
3336
+ generationBrief: input.generationBrief,
3337
+ selectionKeywords: input.selectionKeywords ?? [],
3338
+ template: {
3339
+ id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
3340
+ name: input.name,
3341
+ version: 1,
3342
+ tokenRecipes: input.tokenRecipes,
3343
+ compositionBudget: input.compositionBudget,
3344
+ supportedSectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
3345
+ supportedContentFrames: generatedContentFrameKinds,
3346
+ supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
3347
+ supportedTransitions: generatedDesignOptionCatalog.transitions
3348
+ },
3349
+ buttonPersonalityChoices: input.buttonPersonalityChoices,
3350
+ paletteVariantChoices: input.paletteVariantChoices
3351
+ };
3352
+ }
3353
+ function buttonChoice(id, note) {
3354
+ return note ? { id: asButtonPersonalityId(id), note } : { id: asButtonPersonalityId(id) };
3355
+ }
3356
+ function paletteChoice(id, note) {
3357
+ return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
3358
+ }
3359
+ var curatedSiteStyles = [
3360
+ defineCuratedSiteStyle({
3361
+ id: "site-style:calm-studio",
3362
+ name: "Calm Studio",
3363
+ description: "Soft, measured, and spacious for intimate appointment or class businesses.",
3364
+ generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
3365
+ tokenRecipes: {
3366
+ palette: "soft-natural",
3367
+ contrast: "standard",
3368
+ radius: "soft",
3369
+ shadow: "subtle",
3370
+ typography: "friendly-sans",
3371
+ spacing: "airy",
3372
+ motion: "subtle"
3373
+ },
3374
+ compositionBudget: quietBudget,
3375
+ buttonPersonalityChoices: [
3376
+ buttonChoice("soft-pill"),
3377
+ buttonChoice("pebble"),
3378
+ buttonChoice("editorial-link"),
3379
+ buttonChoice("brushed-wash")
3380
+ ],
3381
+ paletteVariantChoices: [
3382
+ paletteChoice("soft-natural-sage"),
3383
+ paletteChoice("soft-natural-stone"),
3384
+ paletteChoice("warm-neutral-clay"),
3385
+ paletteChoice("soft-natural-watercolor")
3386
+ ]
3387
+ }),
3388
+ defineCuratedSiteStyle({
3389
+ id: "site-style:clear-professional",
3390
+ name: "Clear Professional",
3391
+ description: "Crisp, trustworthy, and direct for local services and consultancies.",
3392
+ generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
3393
+ tokenRecipes: {
3394
+ palette: "brand-led",
3395
+ contrast: "strong",
3396
+ radius: "soft",
3397
+ shadow: "subtle",
3398
+ typography: "clean-sans",
3399
+ spacing: "regular",
3400
+ motion: "subtle"
3401
+ },
3402
+ compositionBudget: balancedBudget,
3403
+ buttonPersonalityChoices: [
3404
+ buttonChoice("confident-chip"),
3405
+ buttonChoice("soft-pill"),
3406
+ buttonChoice("editorial-link")
3407
+ ],
3408
+ paletteVariantChoices: [
3409
+ paletteChoice("brand-led-cool"),
3410
+ paletteChoice("high-contrast-ink"),
3411
+ paletteChoice("brand-led-jewel")
3412
+ ]
3413
+ }),
3414
+ defineCuratedSiteStyle({
3415
+ id: "site-style:warm-editorial",
3416
+ name: "Warm Editorial",
3417
+ description: "Story-led and textured for educators, makers, venues, and retreats.",
3418
+ generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
3419
+ tokenRecipes: {
3420
+ palette: "warm-neutral",
3421
+ contrast: "standard",
3422
+ radius: "square",
3423
+ shadow: "none",
3424
+ typography: "serif-editorial",
3425
+ spacing: "airy",
3426
+ motion: "subtle"
3427
+ },
3428
+ compositionBudget: balancedBudget,
3429
+ buttonPersonalityChoices: [
3430
+ buttonChoice("editorial-link"),
3431
+ buttonChoice("soft-pill"),
3432
+ buttonChoice("brushed-wash")
3433
+ ],
3434
+ paletteVariantChoices: [
3435
+ paletteChoice("warm-neutral-cream"),
3436
+ paletteChoice("warm-neutral-clay"),
3437
+ paletteChoice("warm-neutral-forest"),
3438
+ paletteChoice("soft-natural-stone")
3439
+ ]
3440
+ }),
3441
+ defineCuratedSiteStyle({
3442
+ id: "site-style:bright-community",
3443
+ name: "Bright Community",
3444
+ description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
3445
+ generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
3446
+ tokenRecipes: {
3447
+ palette: "brand-led",
3448
+ contrast: "standard",
3449
+ radius: "rounded",
3450
+ shadow: "subtle",
3451
+ typography: "friendly-sans",
3452
+ spacing: "regular",
3453
+ motion: "expressive"
3454
+ },
3455
+ compositionBudget: balancedBudget,
3456
+ buttonPersonalityChoices: [
3457
+ buttonChoice("pebble"),
3458
+ buttonChoice("brushed-wash"),
3459
+ buttonChoice("confident-chip")
3460
+ ],
3461
+ paletteVariantChoices: [
3462
+ paletteChoice("brand-led-warm"),
3463
+ paletteChoice("brand-led-jewel"),
3464
+ paletteChoice("soft-natural-watercolor")
3465
+ ]
3466
+ }),
3467
+ defineCuratedSiteStyle({
3468
+ id: "site-style:quiet-luxury",
3469
+ name: "Quiet Luxury",
3470
+ description: "Minimal, confident, and refined for premium experiences and private services.",
3471
+ generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
3472
+ selectionKeywords: [
3473
+ "luxury",
3474
+ "premium",
3475
+ "boutique",
3476
+ "bespoke",
3477
+ "exclusive"
3478
+ ],
3479
+ tokenRecipes: {
3480
+ palette: "high-contrast",
3481
+ contrast: "strong",
3482
+ radius: "square",
3483
+ shadow: "none",
3484
+ typography: "classic-serif",
3485
+ spacing: "airy",
3486
+ motion: "none"
3487
+ },
3488
+ compositionBudget: quietBudget,
3489
+ buttonPersonalityChoices: [
3490
+ buttonChoice("editorial-link"),
3491
+ buttonChoice("confident-chip"),
3492
+ buttonChoice("soft-pill")
3493
+ ],
3494
+ paletteVariantChoices: [
3495
+ paletteChoice("high-contrast-charcoal"),
3496
+ paletteChoice("high-contrast-ink"),
3497
+ paletteChoice("warm-neutral-cream")
3498
+ ]
3499
+ }),
3500
+ defineCuratedSiteStyle({
3501
+ id: "site-style:practical-services",
3502
+ name: "Practical Services",
3503
+ description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
3504
+ generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
3505
+ selectionKeywords: [
3506
+ "repair",
3507
+ "plumb",
3508
+ "electric",
3509
+ "cleaning",
3510
+ "landscap",
3511
+ "contractor"
3512
+ ],
3513
+ tokenRecipes: {
3514
+ palette: "brand-led",
3515
+ contrast: "maximum",
3516
+ radius: "soft",
3517
+ shadow: "subtle",
3518
+ typography: "clean-sans",
3519
+ spacing: "compact",
3520
+ motion: "none"
3521
+ },
3522
+ compositionBudget: quietBudget,
3523
+ buttonPersonalityChoices: [
3524
+ buttonChoice("confident-chip"),
3525
+ buttonChoice("pebble"),
3526
+ buttonChoice("ink-stamp")
3527
+ ],
3528
+ paletteVariantChoices: [
3529
+ paletteChoice("brand-led-cool"),
3530
+ paletteChoice("high-contrast-ink"),
3531
+ paletteChoice("brand-led-warm")
3532
+ ]
3533
+ }),
3534
+ defineCuratedSiteStyle({
3535
+ id: "site-style:modern-wellness",
3536
+ name: "Modern Wellness",
3537
+ description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
3538
+ generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
3539
+ tokenRecipes: {
3540
+ palette: "soft-natural",
3541
+ contrast: "standard",
3542
+ radius: "rounded",
3543
+ shadow: "subtle",
3544
+ typography: "clean-sans",
3545
+ spacing: "airy",
3546
+ motion: "subtle"
3547
+ },
3548
+ compositionBudget: balancedBudget,
3549
+ buttonPersonalityChoices: [
3550
+ buttonChoice("soft-pill"),
3551
+ buttonChoice("pebble"),
3552
+ buttonChoice("confident-chip")
3553
+ ],
3554
+ paletteVariantChoices: [
3555
+ paletteChoice("soft-natural-sage"),
3556
+ paletteChoice("soft-natural-stone"),
3557
+ paletteChoice("warm-neutral-forest")
3558
+ ]
3559
+ }),
3560
+ defineCuratedSiteStyle({
3561
+ id: "site-style:bold-launch",
3562
+ name: "Bold Launch",
3563
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
3564
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
3565
+ selectionKeywords: [
3566
+ "launch",
3567
+ "campaign",
3568
+ "preorder",
3569
+ "pre-order",
3570
+ "waitlist",
3571
+ "drop"
3572
+ ],
3573
+ tokenRecipes: {
3574
+ palette: "high-contrast",
3575
+ contrast: "maximum",
3576
+ radius: "pill",
3577
+ shadow: "layered",
3578
+ typography: "clean-sans",
3579
+ spacing: "regular",
3580
+ motion: "expressive"
3581
+ },
3582
+ compositionBudget: expressiveBudget,
3583
+ buttonPersonalityChoices: [
3584
+ buttonChoice("ink-stamp"),
3585
+ buttonChoice("confident-chip"),
3586
+ buttonChoice("brushed-wash"),
3587
+ buttonChoice("pebble")
3588
+ ],
3589
+ paletteVariantChoices: [
3590
+ paletteChoice("high-contrast-monochrome"),
3591
+ paletteChoice("high-contrast-ink"),
3592
+ paletteChoice("brand-led-jewel"),
3593
+ paletteChoice("brand-led-warm")
3594
+ ]
3595
+ })
3596
+ ];
3597
+ var curatedSiteStylesById = new Map(
3598
+ curatedSiteStyles.map((style) => [style.id, style])
3599
+ );
3600
+
3601
+ // ../theme-core/src/site-styles/designState.ts
3602
+ import { z as z18 } from "zod";
3603
+
3604
+ // ../theme-core/src/site-styles/rawStyleFields.ts
3605
+ var themeV2RuntimeStyleFieldNames = [
3606
+ "_frameStyles",
3607
+ "_sectionStyles",
3608
+ "_containerStyles",
3609
+ "_cardStyles",
3610
+ // styleGroup is legacy runtime transition wiring rather than a nested
3611
+ // override object, but normal editors should still never see it directly.
3612
+ "styleGroup"
3824
3613
  ];
3825
- var paletteVariantsById = new Map(
3826
- paletteVariants.map((v) => [v.id, v])
3614
+ var themeV2BlockSpecificRawStyleFieldNames = [
3615
+ "_contentCardStyles",
3616
+ "_textCardStyles"
3617
+ ];
3618
+ var themeV2NormalEditorRawStyleFieldNames = [
3619
+ ...themeV2RuntimeStyleFieldNames,
3620
+ ...themeV2BlockSpecificRawStyleFieldNames
3621
+ ];
3622
+ var themeV2NormalEditorRawStyleFieldNameSet = new Set(
3623
+ themeV2NormalEditorRawStyleFieldNames
3624
+ );
3625
+
3626
+ // ../theme-core/src/site-styles/designState.ts
3627
+ var themeV2DesignStateSchemaVersion = 1;
3628
+ var designResolutionPolicySchema = z18.enum(["generated", "user", "admin", "sdk"]);
3629
+ var runtimeStyleFieldNameSchema = z18.enum(themeV2RuntimeStyleFieldNames);
3630
+ var nonEmptyRuntimeStyleFieldNamesSchema = z18.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
3631
+ fields3[0],
3632
+ ...fields3.slice(1)
3633
+ ]);
3634
+ var heroLegibilityStrategySchema = z18.enum([
3635
+ "none",
3636
+ "scrim-gradient",
3637
+ "solid-panel"
3638
+ ]);
3639
+ function uniqueNonEmpty(values) {
3640
+ const uniqueValues = [...new Set(values)];
3641
+ const firstValue = uniqueValues[0];
3642
+ if (!firstValue) {
3643
+ throw new Error("Expected at least one Theme V2 design state option.");
3644
+ }
3645
+ return [firstValue, ...uniqueValues.slice(1)];
3646
+ }
3647
+ var userPanelTreatments = uniqueNonEmpty(
3648
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
3649
+ );
3650
+ var userFlushTreatments = uniqueNonEmpty(
3651
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
3652
+ );
3653
+ var userFlushBleeds = uniqueNonEmpty(
3654
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
3655
+ );
3656
+ var contentFrameIntentSchema = z18.discriminatedUnion("kind", [
3657
+ z18.object({ kind: z18.literal("plain") }).strict(),
3658
+ z18.object({
3659
+ kind: z18.literal("panel"),
3660
+ treatment: z18.enum(userPanelTreatments)
3661
+ }).strict(),
3662
+ z18.object({
3663
+ kind: z18.literal("flush-panel"),
3664
+ treatment: z18.enum(userFlushTreatments),
3665
+ bleed: z18.enum(userFlushBleeds)
3666
+ }).strict()
3667
+ ]);
3668
+ var blockDesignPlanSchema = z18.object({
3669
+ blockId: z18.string().min(1).transform(asDesignBlockId),
3670
+ blockKind: z18.string().min(1),
3671
+ purpose: z18.string().min(1),
3672
+ sectionSurface: z18.enum(userDesignOptionCatalog.sectionSurfaces),
3673
+ contentFrame: contentFrameIntentSchema,
3674
+ itemSurface: z18.enum(userDesignOptionCatalog.itemSurfaces),
3675
+ transitionAfter: z18.enum(userDesignOptionCatalog.transitions),
3676
+ emphasis: z18.enum(userDesignOptionCatalog.emphases),
3677
+ heroLegibility: heroLegibilityStrategySchema.optional()
3678
+ }).strict();
3679
+ var styleAuthoritySchema = z18.discriminatedUnion("kind", [
3680
+ z18.object({
3681
+ kind: z18.literal("theme-v2"),
3682
+ source: designResolutionPolicySchema,
3683
+ siteStyleId: z18.string().min(1).transform(asSiteStyleId),
3684
+ templateId: z18.string().min(1).transform(asDesignSystemTemplateId),
3685
+ templateVersion: z18.number().int().nonnegative(),
3686
+ resolverVersion: z18.number().int().nonnegative()
3687
+ }).strict(),
3688
+ z18.object({
3689
+ kind: z18.literal("legacy-raw"),
3690
+ reason: z18.enum(["pre-theme-v2", "manual-runtime-fields"])
3691
+ }).strict(),
3692
+ z18.object({
3693
+ kind: z18.literal("advanced-detached"),
3694
+ reason: z18.literal("detached-custom-runtime-fields")
3695
+ }).strict()
3696
+ ]);
3697
+ var blockRuntimeStyleAuthoritySchema = z18.object({
3698
+ unit: z18.literal("block-runtime-fields"),
3699
+ blockId: z18.string().min(1).transform(asDesignBlockId),
3700
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
3701
+ authority: styleAuthoritySchema
3702
+ }).strict();
3703
+ var persistedPageDesignStateV1Schema = z18.object({
3704
+ schemaVersion: z18.literal(themeV2DesignStateSchemaVersion),
3705
+ siteStyleId: z18.string().min(1).transform(asSiteStyleId),
3706
+ templateId: z18.string().min(1).transform(asDesignSystemTemplateId),
3707
+ templateVersion: z18.number().int().nonnegative(),
3708
+ resolverVersion: z18.number().int().nonnegative(),
3709
+ rhythmPresetId: z18.string().min(1),
3710
+ blocks: z18.array(blockDesignPlanSchema),
3711
+ styleAuthorities: z18.array(blockRuntimeStyleAuthoritySchema)
3712
+ }).strict();
3713
+
3714
+ // ../theme-core/src/site-styles/generatedSchemas.ts
3715
+ import { z as z19 } from "zod";
3716
+ function uniqueNonEmpty2(values) {
3717
+ const uniqueValues = [...new Set(values)];
3718
+ const firstValue = uniqueValues[0];
3719
+ if (!firstValue) {
3720
+ throw new Error("Expected at least one generated schema option.");
3721
+ }
3722
+ return [firstValue, ...uniqueValues.slice(1)];
3723
+ }
3724
+ var generatedPanelTreatments = uniqueNonEmpty2(
3725
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
3827
3726
  );
3727
+ var generatedFlushTreatments = uniqueNonEmpty2(
3728
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
3729
+ );
3730
+ var generatedFlushBleeds = uniqueNonEmpty2(
3731
+ generatedDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
3732
+ );
3733
+ var generatedPanelFrameSchema = z19.object({
3734
+ kind: z19.literal("panel"),
3735
+ treatment: z19.enum(generatedPanelTreatments)
3736
+ }).strict();
3737
+ var generatedFlushPanelFrameSchema = z19.object({
3738
+ kind: z19.literal("flush-panel"),
3739
+ treatment: z19.enum(generatedFlushTreatments),
3740
+ bleed: z19.enum(generatedFlushBleeds)
3741
+ }).strict();
3742
+ var generatedContentFrameIntentSchema = z19.discriminatedUnion("kind", [
3743
+ z19.object({ kind: z19.literal("plain") }).strict(),
3744
+ generatedPanelFrameSchema,
3745
+ generatedFlushPanelFrameSchema
3746
+ ]);
3747
+ var generatedSiteStyleIdSchema = z19.enum(curatedSiteStyleIdValues).transform(asSiteStyleId);
3748
+ function generatedChoiceSchema(valueSchema) {
3749
+ return z19.discriminatedUnion("kind", [
3750
+ z19.object({
3751
+ source: z19.literal("generated"),
3752
+ kind: z19.literal("auto")
3753
+ }).strict(),
3754
+ z19.object({
3755
+ source: z19.literal("generated"),
3756
+ kind: z19.literal("explicit"),
3757
+ value: valueSchema
3758
+ }).strict()
3759
+ ]);
3760
+ }
3761
+ var generatedBlockDesignIntentSchema = z19.object({
3762
+ sectionSurface: generatedChoiceSchema(
3763
+ z19.enum(generatedDesignOptionCatalog.sectionSurfaces)
3764
+ ),
3765
+ contentFrame: generatedChoiceSchema(generatedContentFrameIntentSchema),
3766
+ itemSurface: generatedChoiceSchema(
3767
+ z19.enum(generatedDesignOptionCatalog.itemSurfaces)
3768
+ ),
3769
+ transitionAfter: generatedChoiceSchema(
3770
+ z19.enum(generatedDesignOptionCatalog.transitions)
3771
+ ),
3772
+ emphasis: generatedChoiceSchema(
3773
+ z19.enum(generatedDesignOptionCatalog.emphases)
3774
+ )
3775
+ }).strict();
3776
+ var generatedMediaCompositionIntentSchema = z19.enum([
3777
+ "none",
3778
+ "supporting",
3779
+ "dominant"
3780
+ ]);
3781
+ var generatedDecorativeCompositionIntentSchema = z19.enum([
3782
+ "none",
3783
+ "supporting"
3784
+ ]);
3785
+ var generatedHeroLegibilityStrategySchema = z19.enum([
3786
+ "none",
3787
+ "scrim-gradient"
3788
+ ]);
3789
+ var generatedBlockMediaIntentSchema = z19.object({
3790
+ media: generatedMediaCompositionIntentSchema,
3791
+ decorative: generatedDecorativeCompositionIntentSchema,
3792
+ heroLegibility: generatedChoiceSchema(generatedHeroLegibilityStrategySchema)
3793
+ }).strict();
3794
+ var generatedBoundaryIntentSchema = z19.object({
3795
+ transitionAfter: generatedChoiceSchema(
3796
+ z19.enum(generatedDesignOptionCatalog.transitions)
3797
+ )
3798
+ }).strict();
3799
+ var generatedPageDesignBlockIntentSchema = z19.object({
3800
+ blockId: z19.string().min(1),
3801
+ blockKind: z19.string().min(1),
3802
+ purpose: z19.string().min(1),
3803
+ design: generatedBlockDesignIntentSchema,
3804
+ mediaIntent: generatedBlockMediaIntentSchema,
3805
+ boundaryIntent: generatedBoundaryIntentSchema
3806
+ }).strict();
3807
+ var generatedPageDesignIntentSchema = z19.object({
3808
+ siteStyleId: generatedSiteStyleIdSchema,
3809
+ blocks: z19.array(generatedPageDesignBlockIntentSchema)
3810
+ }).strict();
3811
+
3812
+ // ../theme-core/src/site-styles/pageDesignIntent.ts
3813
+ import { z as z20 } from "zod";
3814
+ var pageDesignIntentSchemaVersion = 1;
3815
+ var pageDesignUserPinnedAppearanceChoiceSchema = z20.object({
3816
+ kind: z20.literal("user-pinned"),
3817
+ value: z20.string().min(1).transform(asAppearancePresetId)
3818
+ }).strict();
3819
+ var pageDesignUserPinnedBoundaryChoiceSchema = z20.object({
3820
+ kind: z20.literal("user-pinned"),
3821
+ value: z20.string().min(1).transform(asBoundaryOptionId)
3822
+ }).strict();
3823
+ var pageDesignBlockLookPinSchema = z20.object({
3824
+ blockId: z20.string().min(1).transform(asDesignBlockId),
3825
+ blockKind: z20.string().min(1),
3826
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
3827
+ }).strict();
3828
+ var pageDesignBoundaryPinSchema = z20.object({
3829
+ boundaryId: z20.string().min(1).transform(asDesignBoundaryId),
3830
+ previousBlockId: z20.string().min(1).transform(asDesignBlockId),
3831
+ nextBlockId: z20.string().min(1).transform(asDesignBlockId),
3832
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
3833
+ }).strict().superRefine((pin, ctx) => {
3834
+ const expectedBoundaryId = makeBoundaryId(
3835
+ pin.previousBlockId,
3836
+ pin.nextBlockId
3837
+ );
3838
+ if (pin.boundaryId !== expectedBoundaryId) {
3839
+ ctx.addIssue({
3840
+ code: z20.ZodIssueCode.custom,
3841
+ path: ["boundaryId"],
3842
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
3843
+ });
3844
+ }
3845
+ });
3846
+ var pageDesignIntentV1Schema = z20.object({
3847
+ schemaVersion: z20.literal(pageDesignIntentSchemaVersion),
3848
+ siteStyleId: z20.string().min(1).transform(asSiteStyleId),
3849
+ pageFlowPresetId: z20.string().min(1).transform(asPageFlowPresetId),
3850
+ blockLookPins: z20.array(pageDesignBlockLookPinSchema),
3851
+ boundaryPins: z20.array(pageDesignBoundaryPinSchema)
3852
+ }).strict().superRefine((intent, ctx) => {
3853
+ addDuplicateStringIssues(ctx, {
3854
+ values: intent.blockLookPins.map((pin) => pin.blockId),
3855
+ path: ["blockLookPins"],
3856
+ label: "block Look pin"
3857
+ });
3858
+ addDuplicateStringIssues(ctx, {
3859
+ values: intent.boundaryPins.map(
3860
+ (pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)
3861
+ ),
3862
+ path: ["boundaryPins"],
3863
+ label: "boundary pin"
3864
+ });
3865
+ });
3866
+ function addDuplicateStringIssues(ctx, input) {
3867
+ const seen = /* @__PURE__ */ new Set();
3868
+ const duplicates = /* @__PURE__ */ new Set();
3869
+ for (const value of input.values) {
3870
+ if (seen.has(value)) {
3871
+ duplicates.add(value);
3872
+ }
3873
+ seen.add(value);
3874
+ }
3875
+ for (const duplicate of duplicates) {
3876
+ ctx.addIssue({
3877
+ code: z20.ZodIssueCode.custom,
3878
+ path: [...input.path],
3879
+ message: `Duplicate ${input.label}: ${duplicate}.`
3880
+ });
3881
+ }
3882
+ }
3883
+ function boundaryKey(previousBlockId, nextBlockId) {
3884
+ return makeBoundaryId(previousBlockId, nextBlockId);
3885
+ }
3828
3886
 
3829
3887
  // ../theme-core/src/site-styles/runtimeCompiler.ts
3830
3888
  function defineDesignRuntimeRules(rules) {
@@ -5091,7 +5149,8 @@ function ctaButton(opts) {
5091
5149
  },
5092
5150
  size: {
5093
5151
  $bind: {
5094
- from: sizePath
5152
+ from: sizePath,
5153
+ fallback: opts?.sizeFallback ?? "md"
5095
5154
  }
5096
5155
  },
5097
5156
  ...opts?.className ? { className: opts.className } : {},
@@ -9450,14 +9509,16 @@ var headerCta = ctaButton({
9450
9509
  whenPath: "menu.ctaItem.label",
9451
9510
  variantPath: "menu.ctaItem.variant",
9452
9511
  linkPath: "menu.ctaItem.link",
9453
- className: `header-cta btn-sm ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
9512
+ sizeFallback: "sm",
9513
+ className: `header-cta ${desktopOnlyDisplay("inline-flex")} rb-ml-6`
9454
9514
  });
9455
9515
  var mobileCta = ctaButton({
9456
9516
  basePath: "menu.ctaItem",
9457
9517
  whenPath: "menu.ctaItem.label",
9458
9518
  variantPath: "menu.ctaItem.variant",
9459
9519
  linkPath: "menu.ctaItem.link",
9460
- className: "nav-mobile-cta btn-md rb-w-full"
9520
+ sizeFallback: "md",
9521
+ className: "nav-mobile-cta rb-w-full"
9461
9522
  });
9462
9523
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
9463
9524
  {