meno-core 1.0.48 → 1.0.50

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 (89) hide show
  1. package/build-astro.ts +6 -2
  2. package/dist/build-static.js +7 -7
  3. package/dist/chunks/{chunk-D5E3OKSL.js → chunk-56EUSC6D.js} +5 -5
  4. package/dist/chunks/{chunk-3FHJUHAS.js → chunk-7NIC4I3V.js} +300 -43
  5. package/dist/chunks/chunk-7NIC4I3V.js.map +7 -0
  6. package/dist/chunks/{chunk-B2RTLDXY.js → chunk-AZQYF6KE.js} +132 -1
  7. package/dist/chunks/chunk-AZQYF6KE.js.map +7 -0
  8. package/dist/chunks/{chunk-TPQ7APVQ.js → chunk-CVLFID6V.js} +473 -73
  9. package/dist/chunks/chunk-CVLFID6V.js.map +7 -0
  10. package/dist/chunks/{chunk-NP76N4HQ.js → chunk-EDQSMAMP.js} +13 -2
  11. package/dist/chunks/{chunk-NP76N4HQ.js.map → chunk-EDQSMAMP.js.map} +2 -2
  12. package/dist/chunks/{chunk-RQSTH2BS.js → chunk-H4JSCDNW.js} +2 -2
  13. package/dist/chunks/{chunk-EK4KESLU.js → chunk-J23ZX5AP.js} +8 -2
  14. package/dist/chunks/{chunk-EK4KESLU.js.map → chunk-J23ZX5AP.js.map} +2 -2
  15. package/dist/chunks/{chunk-UUA5LEWF.js → chunk-LPVETICS.js} +156 -8
  16. package/dist/chunks/chunk-LPVETICS.js.map +7 -0
  17. package/dist/chunks/{chunk-BJRKEPMP.js → chunk-PQ2HRXDR.js} +5 -2
  18. package/dist/chunks/chunk-PQ2HRXDR.js.map +7 -0
  19. package/dist/chunks/{chunk-NKUV77SR.js → chunk-YWJJD5D6.js} +133 -37
  20. package/dist/chunks/chunk-YWJJD5D6.js.map +7 -0
  21. package/dist/chunks/{configService-IGJEC3MC.js → configService-VOY2MY2K.js} +3 -3
  22. package/dist/entries/server-router.js +9 -9
  23. package/dist/entries/server-router.js.map +2 -2
  24. package/dist/lib/client/index.js +92 -32
  25. package/dist/lib/client/index.js.map +3 -3
  26. package/dist/lib/server/index.js +14 -12
  27. package/dist/lib/server/index.js.map +2 -2
  28. package/dist/lib/shared/index.js +46 -10
  29. package/dist/lib/shared/index.js.map +3 -3
  30. package/entries/server-router.tsx +6 -2
  31. package/lib/client/core/ComponentBuilder.test.ts +34 -0
  32. package/lib/client/core/ComponentBuilder.ts +33 -4
  33. package/lib/client/core/builders/embedBuilder.ts +28 -7
  34. package/lib/client/core/builders/linkNodeBuilder.ts +28 -7
  35. package/lib/client/core/builders/localeListBuilder.ts +30 -11
  36. package/lib/client/styles/StyleInjector.ts +3 -2
  37. package/lib/client/templateEngine.ts +24 -0
  38. package/lib/client/theme.ts +4 -4
  39. package/lib/server/cssGenerator.test.ts +64 -1
  40. package/lib/server/cssGenerator.ts +48 -9
  41. package/lib/server/fileWatcher.test.ts +134 -0
  42. package/lib/server/fileWatcher.ts +100 -32
  43. package/lib/server/jsonLoader.ts +1 -0
  44. package/lib/server/providers/fileSystemCMSProvider.test.ts +163 -0
  45. package/lib/server/providers/fileSystemCMSProvider.ts +240 -19
  46. package/lib/server/routes/index.ts +1 -1
  47. package/lib/server/routes/pages.ts +23 -1
  48. package/lib/server/services/cmsService.test.ts +246 -0
  49. package/lib/server/services/cmsService.ts +122 -5
  50. package/lib/server/services/configService.ts +6 -0
  51. package/lib/server/services/fileWatcherService.ts +17 -0
  52. package/lib/server/ssr/attributeBuilder.ts +41 -0
  53. package/lib/server/ssr/htmlGenerator.test.ts +113 -0
  54. package/lib/server/ssr/htmlGenerator.ts +62 -7
  55. package/lib/server/ssr/liveReloadIntegration.test.ts +209 -0
  56. package/lib/server/ssr/ssrRenderer.test.ts +564 -0
  57. package/lib/server/ssr/ssrRenderer.ts +228 -49
  58. package/lib/server/webflow/buildWebflow.ts +1 -1
  59. package/lib/server/websocketManager.test.ts +61 -6
  60. package/lib/server/websocketManager.ts +25 -1
  61. package/lib/shared/cssGeneration.test.ts +267 -1
  62. package/lib/shared/cssGeneration.ts +240 -18
  63. package/lib/shared/cssProperties.test.ts +275 -1
  64. package/lib/shared/cssProperties.ts +223 -7
  65. package/lib/shared/interfaces/contentProvider.ts +39 -6
  66. package/lib/shared/pathSecurity.ts +16 -0
  67. package/lib/shared/responsiveScaling.test.ts +143 -0
  68. package/lib/shared/responsiveScaling.ts +253 -2
  69. package/lib/shared/themeDefaults.test.ts +3 -3
  70. package/lib/shared/themeDefaults.ts +3 -3
  71. package/lib/shared/types/api.ts +10 -1
  72. package/lib/shared/types/cms.ts +46 -12
  73. package/lib/shared/types/index.ts +1 -0
  74. package/lib/shared/utilityClassConfig.ts +3 -0
  75. package/lib/shared/utilityClassMapper.test.ts +123 -0
  76. package/lib/shared/utilityClassMapper.ts +179 -8
  77. package/lib/shared/validation/schemas.test.ts +93 -0
  78. package/lib/shared/validation/schemas.ts +71 -16
  79. package/lib/shared/validation/validators.ts +26 -1
  80. package/package.json +1 -1
  81. package/dist/chunks/chunk-3FHJUHAS.js.map +0 -7
  82. package/dist/chunks/chunk-B2RTLDXY.js.map +0 -7
  83. package/dist/chunks/chunk-BJRKEPMP.js.map +0 -7
  84. package/dist/chunks/chunk-NKUV77SR.js.map +0 -7
  85. package/dist/chunks/chunk-TPQ7APVQ.js.map +0 -7
  86. package/dist/chunks/chunk-UUA5LEWF.js.map +0 -7
  87. /package/dist/chunks/{chunk-D5E3OKSL.js.map → chunk-56EUSC6D.js.map} +0 -0
  88. /package/dist/chunks/{chunk-RQSTH2BS.js.map → chunk-H4JSCDNW.js.map} +0 -0
  89. /package/dist/chunks/{configService-IGJEC3MC.js.map → configService-VOY2MY2K.js.map} +0 -0
@@ -1,17 +1,23 @@
1
1
  import {
2
2
  DEFAULT_BREAKPOINTS,
3
+ DEFAULT_FLUID_RANGE,
3
4
  DEFAULT_I18N_CONFIG,
5
+ SCALABLE_CSS_PROPERTIES,
4
6
  applyRemConversion,
7
+ buildFluidClampWithExplicitMin,
8
+ buildFluidPropertyValue,
5
9
  convertPxToRem,
6
10
  getBreakpointName,
7
11
  getBreakpointValues,
8
12
  getScaleMultiplier,
13
+ getSmallestBreakpointName,
9
14
  isI18nValue,
15
+ parseValue,
10
16
  resolveI18nInProps,
11
17
  resolveI18nValue,
12
18
  scalePropertyValue,
13
19
  shouldConvertProperty
14
- } from "./chunk-B2RTLDXY.js";
20
+ } from "./chunk-AZQYF6KE.js";
15
21
  import {
16
22
  isTiptapDocument,
17
23
  tiptapToHtml
@@ -28,16 +34,25 @@ import {
28
34
 
29
35
  // lib/shared/validation/schemas.ts
30
36
  import { z } from "zod";
31
- var BasePropTypeSchema, PropTypeSchema, BasePropDefinitionSchema, EnumsConfigSchema, ListItemSchemaSchema, ListPropDefinitionSchema, PropDefinitionSchema, StyleMappingSchema, BooleanMappingSchema, IfConditionSchema, LinkMappingSchema, HtmlMappingSchema, StyleObjectSchema, ResponsiveStyleObjectSchema, StyleValueSchema, InteractiveStyleRuleSchema, InteractiveStylesSchema, SlotMarkerSchema, ComponentNodeSchema, HtmlNodeSchema, ComponentInstanceNodeSchema, EmbedNodeSchema, LinkNodeSchema, LocaleListNodeSchema, ListNodeSchemaBasic, ScriptLoadModeSchema, LibraryPositionSchema, ScriptTypeSchema, JSLibraryConfigSchema, CSSLibraryConfigSchema, LibrariesConfigSchema, StructuredComponentDefinitionSchema, ComponentDefinitionSchema, I18nOrStringSchema, LibraryMergeModeSchema, PageLibrariesConfigSchema, CustomCodeConfigSchema, PageMetaDataBaseSchema, PageMetaDataSchema, LineRangeSchema, JSONPageSchema, PageDataWithComponentSchema, PageDataSchema, CMSFieldTypeSchema, CMSFieldDefinitionSchema, CMSClientDataStrategySchema, CMSClientDataConfigSchema, CMSSchemaSchema, CMSItemSchema, CMSFilterConditionSchema, CMSSortConfigSchema, CMSListQuerySchema, CMSListNodeSchema, PageCmsConfigSchema, PageMetaDataWithCMSSchema;
37
+ var BasePropTypeSchema, PropTypeSchema, I18nValueObjectSchema, BasePropDefinitionSchema, EnumsConfigSchema, ListItemSchemaSchema, ListPropDefinitionSchema, PropDefinitionSchema, StyleMappingSchema, BooleanMappingSchema, IfConditionSchema, LinkMappingSchema, HtmlMappingSchema, StyleObjectSchema, ResponsiveStyleObjectSchema, StyleValueSchema, InteractiveStyleRuleSchema, InteractiveStylesSchema, SlotMarkerSchema, ComponentNodeSchema, HtmlNodeSchema, ComponentInstanceNodeSchema, EmbedNodeSchema, LinkNodeSchema, LocaleListNodeSchema, ListNodeSchemaBasic, ScriptLoadModeSchema, LibraryPositionSchema, ScriptTypeSchema, JSLibraryConfigSchema, CSSLibraryConfigSchema, LibrariesConfigSchema, StructuredComponentDefinitionSchema, ComponentDefinitionSchema, I18nOrStringSchema, LibraryMergeModeSchema, PageLibrariesConfigSchema, CustomCodeConfigSchema, PageMetaDataBaseSchema, PageMetaDataSchema, LineRangeSchema, JSONPageSchema, PageDataWithComponentSchema, PageDataSchema, CMSFieldTypeSchema, CMSFieldDefinitionSchema, CMSClientDataStrategySchema, CMSClientDataConfigSchema, CMSSchemaSchema, CMSItemSchema, CMSDraftItemSchema, CMSFilterConditionSchema, CMSSortConfigSchema, CMSListQuerySchema, CMSListNodeSchema, PageCmsConfigSchema, PageMetaDataWithCMSSchema;
32
38
  var init_schemas = __esm({
33
39
  "lib/shared/validation/schemas.ts"() {
34
40
  "use strict";
35
41
  init_constants();
36
42
  BasePropTypeSchema = z.enum(["string", "select", "boolean", "number", "link", "file", "rich-text", "embed"]);
37
43
  PropTypeSchema = z.enum(["string", "select", "boolean", "number", "link", "file", "rich-text", "embed", "list"]);
44
+ I18nValueObjectSchema = z.object({
45
+ _i18n: z.literal(true)
46
+ }).passthrough();
38
47
  BasePropDefinitionSchema = z.object({
39
48
  type: BasePropTypeSchema,
40
- default: z.union([z.string(), z.number(), z.boolean(), z.object({ href: z.string(), target: z.string().optional() })]).optional(),
49
+ default: z.union([
50
+ z.string(),
51
+ z.number(),
52
+ z.boolean(),
53
+ z.object({ href: z.string(), target: z.string().optional() }),
54
+ I18nValueObjectSchema
55
+ ]).optional(),
41
56
  options: z.array(z.string()).readonly().optional(),
42
57
  enumName: z.string().optional(),
43
58
  // For 'select' type: reference to project-level enum
@@ -51,7 +66,16 @@ var init_schemas = __esm({
51
66
  ListPropDefinitionSchema = z.object({
52
67
  type: z.literal("list"),
53
68
  itemSchema: ListItemSchemaSchema,
54
- default: z.array(z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.object({ href: z.string(), target: z.string().optional() }), z.null()]))).optional()
69
+ // List-item field values can be any primitive, a link object, an `_i18n`
70
+ // object (resolved by the SSR pipeline), or null.
71
+ default: z.array(z.record(z.string(), z.union([
72
+ z.string(),
73
+ z.number(),
74
+ z.boolean(),
75
+ z.object({ href: z.string(), target: z.string().optional() }),
76
+ I18nValueObjectSchema,
77
+ z.null()
78
+ ]))).optional()
55
79
  }).passthrough();
56
80
  PropDefinitionSchema = z.union([
57
81
  ListPropDefinitionSchema,
@@ -113,8 +137,9 @@ var init_schemas = __esm({
113
137
  SlotMarkerSchema = z.lazy(() => z.object({
114
138
  type: z.literal(NODE_TYPE.SLOT),
115
139
  default: z.union([
116
- z.array(z.union([ComponentNodeSchema, z.string()])),
117
- z.string()
140
+ z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),
141
+ z.string(),
142
+ I18nValueObjectSchema
118
143
  ]).optional()
119
144
  }).passthrough());
120
145
  HtmlNodeSchema = z.lazy(() => z.object({
@@ -125,12 +150,13 @@ var init_schemas = __esm({
125
150
  style: StyleValueSchema.optional(),
126
151
  interactiveStyles: InteractiveStylesSchema.optional(),
127
152
  generateElementClass: z.boolean().optional(),
128
- attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
153
+ attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema])).optional(),
129
154
  props: z.record(z.string(), z.any()).optional(),
130
155
  // Allow props for backward compatibility
131
156
  children: z.union([
132
- z.array(z.union([ComponentNodeSchema, z.string()])),
133
- z.string()
157
+ z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),
158
+ z.string(),
159
+ I18nValueObjectSchema
134
160
  ]).optional()
135
161
  }).passthrough());
136
162
  ComponentInstanceNodeSchema = z.lazy(() => z.object({
@@ -142,34 +168,36 @@ var init_schemas = __esm({
142
168
  style: StyleValueSchema.optional(),
143
169
  interactiveStyles: InteractiveStylesSchema.optional(),
144
170
  generateElementClass: z.boolean().optional(),
145
- attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
171
+ attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema])).optional(),
146
172
  children: z.union([
147
- z.array(z.union([ComponentNodeSchema, z.string()])),
148
- z.string()
173
+ z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),
174
+ z.string(),
175
+ I18nValueObjectSchema
149
176
  ]).optional()
150
177
  }).passthrough());
151
178
  EmbedNodeSchema = z.lazy(() => z.object({
152
179
  type: z.literal(NODE_TYPE.EMBED),
153
- html: z.union([z.string(), HtmlMappingSchema]),
180
+ html: z.union([z.string(), HtmlMappingSchema, I18nValueObjectSchema]),
154
181
  label: z.string().optional(),
155
182
  if: IfConditionSchema.optional(),
156
183
  style: StyleValueSchema.optional(),
157
184
  interactiveStyles: InteractiveStylesSchema.optional(),
158
185
  generateElementClass: z.boolean().optional(),
159
- attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional()
186
+ attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema])).optional()
160
187
  }).passthrough());
161
188
  LinkNodeSchema = z.lazy(() => z.object({
162
189
  type: z.literal(NODE_TYPE.LINK),
163
- href: z.union([z.string(), LinkMappingSchema]),
190
+ href: z.union([z.string(), LinkMappingSchema, I18nValueObjectSchema]),
164
191
  label: z.string().optional(),
165
192
  if: IfConditionSchema.optional(),
166
193
  style: StyleValueSchema.optional(),
167
194
  interactiveStyles: InteractiveStylesSchema.optional(),
168
195
  generateElementClass: z.boolean().optional(),
169
- attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
196
+ attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema])).optional(),
170
197
  children: z.union([
171
- z.array(z.union([ComponentNodeSchema, z.string()])),
172
- z.string()
198
+ z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),
199
+ z.string(),
200
+ I18nValueObjectSchema
173
201
  ]).optional()
174
202
  }).passthrough());
175
203
  LocaleListNodeSchema = z.lazy(() => z.object({
@@ -186,7 +214,7 @@ var init_schemas = __esm({
186
214
  showSeparator: z.boolean().optional(),
187
215
  showFlag: z.boolean().optional(),
188
216
  flagStyle: StyleValueSchema.optional(),
189
- attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional()
217
+ attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema])).optional()
190
218
  }).passthrough());
191
219
  ListNodeSchemaBasic = z.lazy(() => z.object({
192
220
  type: z.union([z.literal(NODE_TYPE.LIST), z.literal("cms-list")]),
@@ -208,7 +236,7 @@ var init_schemas = __esm({
208
236
  offset: z.number().optional(),
209
237
  excludeCurrentItem: z.boolean().optional(),
210
238
  emitTemplate: z.boolean().optional(),
211
- children: z.array(z.union([ComponentNodeSchema, z.string()])).optional()
239
+ children: z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])).optional()
212
240
  }).passthrough());
213
241
  ComponentNodeSchema = z.union([
214
242
  HtmlNodeSchema,
@@ -361,6 +389,12 @@ var init_schemas = __esm({
361
389
  _filename: z.string().optional(),
362
390
  _createdAt: z.string().optional()
363
391
  }).passthrough();
392
+ CMSDraftItemSchema = z.object({
393
+ _id: z.string().optional(),
394
+ _slug: z.string().optional(),
395
+ _filename: z.string().optional(),
396
+ _createdAt: z.string().optional()
397
+ }).passthrough();
364
398
  CMSFilterConditionSchema = z.object({
365
399
  field: z.string(),
366
400
  operator: z.enum(["eq", "neq", "gt", "gte", "lt", "lte", "contains", "in"]).optional(),
@@ -1867,6 +1901,24 @@ function validateCMSItem(data) {
1867
1901
  };
1868
1902
  }
1869
1903
  }
1904
+ function validateCMSDraftItem(data) {
1905
+ try {
1906
+ const result = CMSDraftItemSchema.safeParse(data);
1907
+ if (result.success) {
1908
+ return { valid: true, data: result.data };
1909
+ }
1910
+ return { valid: false, errors: zodToValidationErrors(result.error) };
1911
+ } catch (error) {
1912
+ return {
1913
+ valid: false,
1914
+ errors: [{
1915
+ path: "root",
1916
+ message: error instanceof Error ? error.message : "Unknown validation error",
1917
+ code: "UNKNOWN"
1918
+ }]
1919
+ };
1920
+ }
1921
+ }
1870
1922
 
1871
1923
  // lib/shared/types/cms.ts
1872
1924
  var IRREGULAR_PLURALS = {
@@ -3020,6 +3072,8 @@ var prefixToCSSProperty = {
3020
3072
  lst: "list-style",
3021
3073
  lstt: "list-style-type",
3022
3074
  lstp: "list-style-position",
3075
+ // Display
3076
+ d: "display",
3023
3077
  // Flexbox
3024
3078
  fd: "flex-direction",
3025
3079
  jc: "justify-content",
@@ -3254,6 +3308,17 @@ function isStyleMapping(value) {
3254
3308
  function sanitizeClassValue(value) {
3255
3309
  return value.replace(/\s+/g, "-").replace(/[()]/g, "").replace(/,/g, "_").replace(/%/g, "p").replace(/\./g, "d").replace(/[^\w-]/g, "");
3256
3310
  }
3311
+ function shortHash(input) {
3312
+ let hash = 2166136261;
3313
+ for (let i = 0; i < input.length; i++) {
3314
+ hash ^= input.charCodeAt(i);
3315
+ hash = Math.imul(hash, 16777619);
3316
+ }
3317
+ return (hash >>> 0).toString(36);
3318
+ }
3319
+ function hasIllegalClassChars(className) {
3320
+ return /[^\w-]/.test(className);
3321
+ }
3257
3322
  function propertyValueToClass(prop, value) {
3258
3323
  const prefix = propertyMap[prop];
3259
3324
  if (!prefix) {
@@ -3331,6 +3396,9 @@ function propertyValueToClass(prop, value) {
3331
3396
  if (!className) {
3332
3397
  className = `${prefix}-${stringValue}`;
3333
3398
  }
3399
+ if (hasIllegalClassChars(className)) {
3400
+ className = `${prefix}-h${shortHash(stringValue)}`;
3401
+ }
3334
3402
  registerStyleValue(className, value);
3335
3403
  return className;
3336
3404
  }
@@ -3355,24 +3423,85 @@ function stylesToClasses(styles) {
3355
3423
  }
3356
3424
  return classes;
3357
3425
  }
3358
- function responsiveStylesToClasses(styles) {
3426
+ var CONTAINER_RESERVED_VALUES = /* @__PURE__ */ new Set(["auto", "inherit", "initial", "unset", ""]);
3427
+ function transformContainerIntent(style) {
3428
+ const w = style.width;
3429
+ const mw = style.maxWidth;
3430
+ if (w == null || mw == null) return style;
3431
+ if (typeof w !== "string" || typeof mw !== "string") return style;
3432
+ if (w !== mw) return style;
3433
+ if (CONTAINER_RESERVED_VALUES.has(w.trim())) return style;
3434
+ return {
3435
+ ...style,
3436
+ width: "calc(100% - var(--site-margin) * 2)",
3437
+ marginLeft: "auto",
3438
+ marginRight: "auto"
3439
+ };
3440
+ }
3441
+ function consumeMobileIntoBaseClamp(base, mobile, responsiveScales) {
3442
+ const fluidRange = responsiveScales.fluidRange ?? DEFAULT_FLUID_RANGE;
3443
+ const patchedBase = { ...base };
3444
+ const patchedMobile = { ...mobile };
3445
+ for (const prop of Object.keys(base)) {
3446
+ if (!SCALABLE_CSS_PROPERTIES.has(prop)) continue;
3447
+ const mobileRaw = mobile[prop];
3448
+ if (mobileRaw == null || mobileRaw === "") continue;
3449
+ const baseRaw = base[prop];
3450
+ if (baseRaw == null || baseRaw === "") continue;
3451
+ if (typeof baseRaw !== "string" && typeof baseRaw !== "number") continue;
3452
+ if (typeof mobileRaw !== "string" && typeof mobileRaw !== "number") continue;
3453
+ const baseParsed = parseValue(String(baseRaw));
3454
+ const mobileParsed = parseValue(String(mobileRaw));
3455
+ if (!baseParsed || !mobileParsed) continue;
3456
+ if (baseParsed.unit !== mobileParsed.unit) continue;
3457
+ if (baseParsed.unit === "%" || baseParsed.unit === "em") continue;
3458
+ const clampValue = buildFluidClampWithExplicitMin(
3459
+ mobileParsed.value,
3460
+ baseParsed.value,
3461
+ baseParsed.unit,
3462
+ fluidRange.min,
3463
+ fluidRange.max
3464
+ );
3465
+ patchedBase[prop] = clampValue;
3466
+ delete patchedMobile[prop];
3467
+ }
3468
+ return { patchedBase, patchedMobile };
3469
+ }
3470
+ function responsiveStylesToClasses(styles, options) {
3359
3471
  if (!styles) return [];
3472
+ const fluidActive = options?.fluidActive === true;
3473
+ const responsiveScales = options?.responsiveScales;
3360
3474
  const classes = [];
3361
3475
  if ("base" in styles || "tablet" in styles || "mobile" in styles) {
3362
3476
  const responsiveStyles = styles;
3363
- if (responsiveStyles.base) {
3364
- classes.push(...stylesToClasses(responsiveStyles.base));
3477
+ let baseSource = responsiveStyles.base;
3478
+ let mobileSource = responsiveStyles.mobile;
3479
+ if (fluidActive && responsiveScales?.enabled === true && baseSource && mobileSource) {
3480
+ const { patchedBase, patchedMobile } = consumeMobileIntoBaseClamp(
3481
+ baseSource,
3482
+ mobileSource,
3483
+ responsiveScales
3484
+ );
3485
+ baseSource = patchedBase;
3486
+ mobileSource = patchedMobile;
3487
+ }
3488
+ if (baseSource) {
3489
+ const base = fluidActive ? transformContainerIntent(baseSource) : baseSource;
3490
+ classes.push(...stylesToClasses(base));
3365
3491
  }
3366
3492
  if (responsiveStyles.tablet) {
3367
- const tabletClasses = stylesToClasses(responsiveStyles.tablet);
3493
+ const tablet = fluidActive ? transformContainerIntent(responsiveStyles.tablet) : responsiveStyles.tablet;
3494
+ const tabletClasses = stylesToClasses(tablet);
3368
3495
  classes.push(...tabletClasses.map((cls) => `t-${cls}`));
3369
3496
  }
3370
- if (responsiveStyles.mobile) {
3371
- const mobileClasses = stylesToClasses(responsiveStyles.mobile);
3497
+ if (mobileSource && Object.keys(mobileSource).length > 0) {
3498
+ const mobile = fluidActive ? transformContainerIntent(mobileSource) : mobileSource;
3499
+ const mobileClasses = stylesToClasses(mobile);
3372
3500
  classes.push(...mobileClasses.map((cls) => `mob-${cls}`));
3373
3501
  }
3374
3502
  } else {
3375
- classes.push(...stylesToClasses(styles));
3503
+ const flat = fluidActive ? transformContainerIntent(styles) : styles;
3504
+ classes.push(...stylesToClasses(flat));
3376
3505
  }
3377
3506
  return classes;
3378
3507
  }
@@ -3400,6 +3529,12 @@ function classToStyle(className) {
3400
3529
  }
3401
3530
  }
3402
3531
  if (!prop) return null;
3532
+ if (/^h[0-9a-z]+$/.test(value)) {
3533
+ const registered = getStyleValue(cleanClass);
3534
+ if (registered != null) {
3535
+ return { prop, value: String(registered) };
3536
+ }
3537
+ }
3403
3538
  if (value.includes("background") || value.includes("text") || value.includes("border")) {
3404
3539
  return { prop, value: `var(--${value})` };
3405
3540
  }
@@ -3643,7 +3778,7 @@ function convertComponentPathToPagePath(componentPath, componentInstancePath, co
3643
3778
  }
3644
3779
 
3645
3780
  // lib/shared/elementClassName.ts
3646
- function shortHash(input) {
3781
+ function shortHash2(input) {
3647
3782
  let hash = 5381;
3648
3783
  for (let i = 0; i < input.length; i++) {
3649
3784
  hash = (hash << 5) + hash ^ input.charCodeAt(i);
@@ -3660,7 +3795,7 @@ function generateElementClassName(ctx) {
3660
3795
  return `${prefix}_${sanitizedFileName}_${sanitizeName(ctx.label)}`;
3661
3796
  }
3662
3797
  const pathString = pathToString(ctx.path);
3663
- const hash = shortHash(`${ctx.fileName}:${pathString}`);
3798
+ const hash = shortHash2(`${ctx.fileName}:${pathString}`);
3664
3799
  return `${prefix}_${sanitizedFileName}_${hash}`;
3665
3800
  }
3666
3801
  function isElementClassName(className) {
@@ -4019,6 +4154,9 @@ function getClassPropertyOrder(className) {
4019
4154
  function sortClassesByPropertyOrder(classes) {
4020
4155
  return Array.from(classes).sort((a, b) => getClassPropertyOrder(a) - getClassPropertyOrder(b));
4021
4156
  }
4157
+ function getResponsiveMode(scales) {
4158
+ return scales?.mode ?? "breakpoints";
4159
+ }
4022
4160
  var AUTO_RESPONSIVE_TYPE_MAP = {
4023
4161
  "padding": "padding",
4024
4162
  "padding-left": "padding",
@@ -4115,12 +4253,30 @@ function extractPropertyAndValue(className) {
4115
4253
  const classValue = className.substring(knownPrefix.length + 1);
4116
4254
  const cssProp = prefixToCSSProperty[knownPrefix];
4117
4255
  if (cssProp) {
4256
+ if (/^h[0-9a-z]+$/.test(classValue)) {
4257
+ return null;
4258
+ }
4118
4259
  return { property: cssProp, value: classValue };
4119
4260
  }
4120
4261
  }
4121
4262
  }
4122
4263
  return null;
4123
4264
  }
4265
+ function resolveScalablePropertyValue(className) {
4266
+ const direct = extractPropertyAndValue(className);
4267
+ if (direct) return direct;
4268
+ for (const knownPrefix of SORTED_PREFIXES) {
4269
+ if (!className.startsWith(knownPrefix + "-")) continue;
4270
+ const classValue = className.substring(knownPrefix.length + 1);
4271
+ if (!/^h[0-9a-z]+$/.test(classValue)) continue;
4272
+ const cssProp = prefixToCSSProperty[knownPrefix];
4273
+ if (!cssProp) continue;
4274
+ const registered = getStyleValue(className);
4275
+ if (registered == null || registered === "") continue;
4276
+ return { property: cssProp, value: String(registered) };
4277
+ }
4278
+ return null;
4279
+ }
4124
4280
  function generateRuleForClass(className) {
4125
4281
  if (utilityClassRules[className]) {
4126
4282
  return utilityClassRules[className];
@@ -4253,6 +4409,80 @@ function generateRuleForClass(className) {
4253
4409
  }
4254
4410
  return `${cssProp}: ${value};`;
4255
4411
  }
4412
+ function applyFluidToUtilityRule(rule, className, responsiveScales, breakpoints) {
4413
+ const propValue = resolveScalablePropertyValue(className);
4414
+ if (!propValue) return rule;
4415
+ const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];
4416
+ if (!category) return rule;
4417
+ const scaleConfig = responsiveScales[category];
4418
+ if (!scaleConfig) return rule;
4419
+ const smallest = getSmallestBreakpointName(breakpoints);
4420
+ if (!smallest) return rule;
4421
+ const scale = scaleConfig[smallest];
4422
+ if (scale == null || scale === 1) return rule;
4423
+ const range = responsiveScales.fluidRange ?? DEFAULT_FLUID_RANGE;
4424
+ const baseRef = responsiveScales.baseReference ?? 16;
4425
+ const fluidValue = buildFluidPropertyValue(
4426
+ propValue.value,
4427
+ scale,
4428
+ range.min,
4429
+ range.max,
4430
+ baseRef
4431
+ );
4432
+ if (!fluidValue) return rule;
4433
+ return `${propValue.property}: ${fluidValue};`;
4434
+ }
4435
+ function applyFluidToStyle(style, responsiveScales, breakpoints) {
4436
+ const range = responsiveScales.fluidRange ?? DEFAULT_FLUID_RANGE;
4437
+ const baseRef = responsiveScales.baseReference ?? 16;
4438
+ const smallest = getSmallestBreakpointName(breakpoints);
4439
+ if (!smallest) return style;
4440
+ const out = {};
4441
+ for (const [prop, value] of Object.entries(style)) {
4442
+ if (typeof value === "object" && value !== null && "_mapping" in value) {
4443
+ out[prop] = value;
4444
+ continue;
4445
+ }
4446
+ if (value == null || value === "") {
4447
+ out[prop] = value;
4448
+ continue;
4449
+ }
4450
+ const scale = getScaleMultiplier(
4451
+ responsiveScales,
4452
+ prop,
4453
+ smallest
4454
+ );
4455
+ if (scale == null || scale === 1) {
4456
+ out[prop] = value;
4457
+ continue;
4458
+ }
4459
+ const fluidValue = buildFluidPropertyValue(
4460
+ String(value),
4461
+ scale,
4462
+ range.min,
4463
+ range.max,
4464
+ baseRef
4465
+ );
4466
+ out[prop] = fluidValue ?? value;
4467
+ }
4468
+ return out;
4469
+ }
4470
+ var CONTAINER_RESERVED_VALUES2 = /* @__PURE__ */ new Set(["auto", "inherit", "initial", "unset", ""]);
4471
+ function applyContainerPattern(style, fluidActive) {
4472
+ if (!fluidActive) return style;
4473
+ const w = style.width;
4474
+ const mw = style.maxWidth;
4475
+ if (w == null || mw == null) return style;
4476
+ if (typeof w !== "string" || typeof mw !== "string") return style;
4477
+ if (w !== mw) return style;
4478
+ if (CONTAINER_RESERVED_VALUES2.has(w.trim())) return style;
4479
+ return {
4480
+ ...style,
4481
+ width: "calc(100% - var(--site-margin) * 2)",
4482
+ marginLeft: "auto",
4483
+ marginRight: "auto"
4484
+ };
4485
+ }
4256
4486
  function generateUtilityCSS(usedClasses, breakpoints = DEFAULT_BREAKPOINTS, responsiveScales, remConfig) {
4257
4487
  const css = [];
4258
4488
  const baseClasses = /* @__PURE__ */ new Set();
@@ -4286,7 +4516,7 @@ function generateUtilityCSS(usedClasses, breakpoints = DEFAULT_BREAKPOINTS, resp
4286
4516
  if (!matched) {
4287
4517
  baseClasses.add(className);
4288
4518
  if (responsiveScales?.enabled) {
4289
- const propValue = extractPropertyAndValue(className);
4519
+ const propValue = resolveScalablePropertyValue(className);
4290
4520
  if (propValue) {
4291
4521
  const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];
4292
4522
  if (category && responsiveScales[category]) {
@@ -4296,18 +4526,23 @@ function generateUtilityCSS(usedClasses, breakpoints = DEFAULT_BREAKPOINTS, resp
4296
4526
  }
4297
4527
  }
4298
4528
  }
4529
+ const mode = getResponsiveMode(responsiveScales);
4530
+ const fluidActive = responsiveScales?.enabled === true && mode === "fluid";
4299
4531
  for (const className of sortClassesByPropertyOrder(baseClasses)) {
4300
- const rule = generateRuleForClass(className);
4532
+ let rule = generateRuleForClass(className);
4301
4533
  if (rule) {
4534
+ if (fluidActive && autoResponsiveClasses.has(className)) {
4535
+ rule = applyFluidToUtilityRule(rule, className, responsiveScales, breakpoints);
4536
+ }
4302
4537
  const escapedClassName = escapeCSSClassName(className);
4303
4538
  const finalRule = applyRemConversion(rule, remConfig);
4304
4539
  css.push(`.${escapedClassName} { ${finalRule} }`);
4305
4540
  }
4306
4541
  }
4307
4542
  const autoResponsiveMediaQueries = {};
4308
- if (responsiveScales?.enabled) {
4543
+ if (responsiveScales?.enabled && !fluidActive) {
4309
4544
  for (const className of autoResponsiveClasses) {
4310
- const propValue = extractPropertyAndValue(className);
4545
+ const propValue = resolveScalablePropertyValue(className);
4311
4546
  if (!propValue) continue;
4312
4547
  const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];
4313
4548
  if (!category) continue;
@@ -4392,13 +4627,21 @@ function generateSingleClassCSS(className, breakpoints = DEFAULT_BREAKPOINTS, re
4392
4627
  }
4393
4628
  }
4394
4629
  if (!matched) {
4395
- const rule = generateRuleForClass(className);
4630
+ let rule = generateRuleForClass(className);
4396
4631
  if (!rule) return "";
4632
+ const mode = getResponsiveMode(responsiveScales);
4633
+ const fluidActive = responsiveScales?.enabled === true && mode === "fluid";
4634
+ if (fluidActive) {
4635
+ const propValue = resolveScalablePropertyValue(className);
4636
+ if (propValue && AUTO_RESPONSIVE_TYPE_MAP[propValue.property]) {
4637
+ rule = applyFluidToUtilityRule(rule, className, responsiveScales, breakpoints);
4638
+ }
4639
+ }
4397
4640
  const escapedClassName = escapeCSSClassName(className);
4398
4641
  const finalRule = applyRemConversion(rule, remConfig);
4399
4642
  css.push(`.${escapedClassName} { ${finalRule} }`);
4400
- if (responsiveScales?.enabled) {
4401
- const propValue = extractPropertyAndValue(className);
4643
+ if (responsiveScales?.enabled && !fluidActive) {
4644
+ const propValue = resolveScalablePropertyValue(className);
4402
4645
  if (propValue) {
4403
4646
  const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];
4404
4647
  if (category) {
@@ -4536,6 +4779,8 @@ function generateInteractiveCSS(elementClass, interactiveStyles, breakpoints = D
4536
4779
  const css = [];
4537
4780
  const breakpointValues = getBreakpointValues(breakpoints);
4538
4781
  const scalingEnabled = responsiveScales?.enabled === true;
4782
+ const mode = getResponsiveMode(responsiveScales);
4783
+ const fluidActive = scalingEnabled && mode === "fluid";
4539
4784
  for (const rule of interactiveStyles) {
4540
4785
  const { prefix, postfix, style } = rule;
4541
4786
  const fullSelector = `${prefix || ""}.${elementClass}${postfix || ""}`;
@@ -4545,7 +4790,12 @@ function generateInteractiveCSS(elementClass, interactiveStyles, breakpoints = D
4545
4790
  if (isResponsiveStyle2(style)) {
4546
4791
  const responsive = style;
4547
4792
  if (responsive.base && Object.keys(responsive.base).length > 0) {
4548
- const properties = applyRemConversion(styleObjectToCSS(responsive.base), remConfig);
4793
+ let baseStyle = responsive.base;
4794
+ if (fluidActive) {
4795
+ baseStyle = applyContainerPattern(baseStyle, true);
4796
+ baseStyle = applyFluidToStyle(baseStyle, responsiveScales, breakpoints);
4797
+ }
4798
+ const properties = applyRemConversion(styleObjectToCSS(baseStyle), remConfig);
4549
4799
  if (properties) {
4550
4800
  css.push(`${fullSelector} { ${properties}; }`);
4551
4801
  }
@@ -4554,9 +4804,9 @@ function generateInteractiveCSS(elementClass, interactiveStyles, breakpoints = D
4554
4804
  const explicit = responsive[breakpointName];
4555
4805
  let merged = null;
4556
4806
  if (explicit && Object.keys(explicit).length > 0) {
4557
- merged = { ...explicit };
4807
+ merged = fluidActive ? applyContainerPattern({ ...explicit }, true) : { ...explicit };
4558
4808
  }
4559
- if (scalingEnabled && responsive.base) {
4809
+ if (scalingEnabled && !fluidActive && responsive.base) {
4560
4810
  const scaled = scaleStyleForBreakpoint(
4561
4811
  responsive.base,
4562
4812
  responsiveScales,
@@ -4579,11 +4829,16 @@ function generateInteractiveCSS(elementClass, interactiveStyles, breakpoints = D
4579
4829
  } else {
4580
4830
  const flatStyle = style;
4581
4831
  if (Object.keys(flatStyle).length > 0) {
4582
- const properties = applyRemConversion(styleObjectToCSS(flatStyle), remConfig);
4832
+ let baseFlat = flatStyle;
4833
+ if (fluidActive) {
4834
+ baseFlat = applyContainerPattern(baseFlat, true);
4835
+ baseFlat = applyFluidToStyle(baseFlat, responsiveScales, breakpoints);
4836
+ }
4837
+ const properties = applyRemConversion(styleObjectToCSS(baseFlat), remConfig);
4583
4838
  if (properties) {
4584
4839
  css.push(`${fullSelector} { ${properties}; }`);
4585
4840
  }
4586
- if (scalingEnabled) {
4841
+ if (scalingEnabled && !fluidActive) {
4587
4842
  for (const [breakpointName, breakpointValue] of sortedBreakpoints) {
4588
4843
  const scaled = scaleStyleForBreakpoint(
4589
4844
  flatStyle,
@@ -4665,6 +4920,7 @@ export {
4665
4920
  validatePageMetaData,
4666
4921
  validateCMSSchema,
4667
4922
  validateCMSItem,
4923
+ validateCMSDraftItem,
4668
4924
  singularize,
4669
4925
  isItemDraftForLocale,
4670
4926
  isItemFullyPublished,
@@ -4789,7 +5045,7 @@ export {
4789
5045
  pathsEqual,
4790
5046
  convertPagePathToComponentPath,
4791
5047
  convertComponentPathToPagePath,
4792
- shortHash,
5048
+ shortHash2 as shortHash,
4793
5049
  generateElementClassName,
4794
5050
  isElementClassName,
4795
5051
  parseElementClassName,
@@ -4805,10 +5061,11 @@ export {
4805
5061
  isCssNamedColor,
4806
5062
  sortClassesByPropertyOrder,
4807
5063
  generateRuleForClass,
5064
+ applyContainerPattern,
4808
5065
  generateUtilityCSS,
4809
5066
  generateSingleClassCSS,
4810
5067
  extractUtilityClassesFromHTML,
4811
5068
  generateInteractiveCSS,
4812
5069
  generateAllInteractiveCSS
4813
5070
  };
4814
- //# sourceMappingURL=chunk-3FHJUHAS.js.map
5071
+ //# sourceMappingURL=chunk-7NIC4I3V.js.map