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
@@ -6,25 +6,25 @@ import {
6
6
  PageService,
7
7
  WebSocketManager,
8
8
  createServer
9
- } from "../chunks/chunk-NKUV77SR.js";
9
+ } from "../chunks/chunk-YWJJD5D6.js";
10
10
  import {
11
11
  CMSService,
12
12
  FileSystemCMSProvider,
13
13
  loadProjectConfig,
14
14
  migrateTemplatesDirectory
15
- } from "../chunks/chunk-TPQ7APVQ.js";
15
+ } from "../chunks/chunk-CVLFID6V.js";
16
16
  import {
17
17
  configService
18
- } from "../chunks/chunk-BJRKEPMP.js";
18
+ } from "../chunks/chunk-PQ2HRXDR.js";
19
19
  import {
20
20
  projectPaths
21
21
  } from "../chunks/chunk-I7YIGZXT.js";
22
22
  import "../chunks/chunk-WQFG7PAH.js";
23
- import "../chunks/chunk-RQSTH2BS.js";
24
- import "../chunks/chunk-EK4KESLU.js";
25
- import "../chunks/chunk-NP76N4HQ.js";
26
- import "../chunks/chunk-3FHJUHAS.js";
27
- import "../chunks/chunk-B2RTLDXY.js";
23
+ import "../chunks/chunk-H4JSCDNW.js";
24
+ import "../chunks/chunk-J23ZX5AP.js";
25
+ import "../chunks/chunk-EDQSMAMP.js";
26
+ import "../chunks/chunk-7NIC4I3V.js";
27
+ import "../chunks/chunk-AZQYF6KE.js";
28
28
  import "../chunks/chunk-UB44F4Z2.js";
29
29
  import "../chunks/chunk-2QK6U5UK.js";
30
30
  import "../chunks/chunk-KSBZ2L7C.js";
@@ -37,7 +37,7 @@ var pageService = new PageService(pageCache, pageProvider);
37
37
  var componentService = new ComponentService();
38
38
  var wsManager = new WebSocketManager();
39
39
  var cmsProvider = new FileSystemCMSProvider(projectPaths.templates(), projectPaths.cms());
40
- var cmsService = new CMSService(cmsProvider);
40
+ var cmsService = new CMSService(cmsProvider, { previewMode: true });
41
41
  var fileWatcherService = new FileWatcherService(
42
42
  componentService,
43
43
  pageService,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../entries/server-router.tsx"],
4
- "sourcesContent": ["/**\n * Server Router\n * Main entry point for the development server\n * Uses the createServer factory with all services initialized\n */\n\nimport { PageCache } from '../lib/server/pageCache';\nimport { WebSocketManager } from '../lib/server/websocketManager';\nimport { PageService, ComponentService, FileWatcherService } from '../lib/server/services';\nimport { CMSService } from '../lib/server/services/cmsService';\nimport { createServer } from '../lib/server/createServer';\nimport { loadProjectConfig } from '../lib/shared/fontLoader';\nimport { FileSystemPageProvider } from '../lib/server/providers/fileSystemPageProvider';\nimport { FileSystemCMSProvider } from '../lib/server/providers/fileSystemCMSProvider';\nimport { configService } from '../lib/server/services/configService';\nimport { projectPaths } from '../lib/server/projectContext';\nimport { migrateTemplatesDirectory } from '../lib/server/migrateTemplates';\n\n// Auto-migrate pages/templates/ \u2192 templates/ if needed\nawait migrateTemplatesDirectory();\n\n// Initialize services\nconst pageCache = new PageCache();\nconst pageProvider = new FileSystemPageProvider(projectPaths.pages(), projectPaths.templates());\nconst pageService = new PageService(pageCache, pageProvider);\nconst componentService = new ComponentService();\nconst wsManager = new WebSocketManager();\n\n// Initialize CMS services\nconst cmsProvider = new FileSystemCMSProvider(projectPaths.templates(), projectPaths.cms());\nconst cmsService = new CMSService(cmsProvider);\n\n// Initialize file watcher with CMS service for template change detection\nconst fileWatcherService = new FileWatcherService(\n componentService,\n pageService,\n pageCache,\n wsManager,\n cmsService\n);\n\n// Initialize server data\nasync function initialize() {\n // Load centralized config first\n await configService.load();\n\n // Load project config for fonts (uses legacy loader for now)\n await loadProjectConfig();\n\n // Load global components first\n await componentService.loadAllComponents();\n\n // Load all pages\n await pageService.loadAllPages();\n\n // Initialize CMS service (extract schemas from pages)\n await cmsService.initialize();\n\n // Setup file watchers\n fileWatcherService.initialize();\n}\n\n// Initialize before starting server\nawait initialize();\n\n// Create and start server using the factory\nconst { server, port } = await createServer({\n pageService,\n componentService,\n wsManager,\n cmsService,\n cmsProvider,\n});\n\nconsole.log(`Server with routing and HMR running at http://localhost:${port}`);\nconsole.log(`Available pages:`, pageService.getAllPagePaths());\nconsole.log(`Edit any JSON file to see instant hot reloading!`);\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM,0BAA0B;AAGhC,IAAM,YAAY,IAAI,UAAU;AAChC,IAAM,eAAe,IAAI,uBAAuB,aAAa,MAAM,GAAG,aAAa,UAAU,CAAC;AAC9F,IAAM,cAAc,IAAI,YAAY,WAAW,YAAY;AAC3D,IAAM,mBAAmB,IAAI,iBAAiB;AAC9C,IAAM,YAAY,IAAI,iBAAiB;AAGvC,IAAM,cAAc,IAAI,sBAAsB,aAAa,UAAU,GAAG,aAAa,IAAI,CAAC;AAC1F,IAAM,aAAa,IAAI,WAAW,WAAW;AAG7C,IAAM,qBAAqB,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,eAAe,aAAa;AAE1B,QAAM,cAAc,KAAK;AAGzB,QAAM,kBAAkB;AAGxB,QAAM,iBAAiB,kBAAkB;AAGzC,QAAM,YAAY,aAAa;AAG/B,QAAM,WAAW,WAAW;AAG5B,qBAAmB,WAAW;AAChC;AAGA,MAAM,WAAW;AAGjB,IAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,aAAa;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,QAAQ,IAAI,2DAA2D,IAAI,EAAE;AAC7E,QAAQ,IAAI,oBAAoB,YAAY,gBAAgB,CAAC;AAC7D,QAAQ,IAAI,kDAAkD;",
4
+ "sourcesContent": ["/**\n * Server Router\n * Main entry point for the development server\n * Uses the createServer factory with all services initialized\n */\n\nimport { PageCache } from '../lib/server/pageCache';\nimport { WebSocketManager } from '../lib/server/websocketManager';\nimport { PageService, ComponentService, FileWatcherService } from '../lib/server/services';\nimport { CMSService } from '../lib/server/services/cmsService';\nimport { createServer } from '../lib/server/createServer';\nimport { loadProjectConfig } from '../lib/shared/fontLoader';\nimport { FileSystemPageProvider } from '../lib/server/providers/fileSystemPageProvider';\nimport { FileSystemCMSProvider } from '../lib/server/providers/fileSystemCMSProvider';\nimport { configService } from '../lib/server/services/configService';\nimport { projectPaths } from '../lib/server/projectContext';\nimport { migrateTemplatesDirectory } from '../lib/server/migrateTemplates';\n\n// Auto-migrate pages/templates/ \u2192 templates/ if needed\nawait migrateTemplatesDirectory();\n\n// Initialize services\nconst pageCache = new PageCache();\nconst pageProvider = new FileSystemPageProvider(projectPaths.pages(), projectPaths.templates());\nconst pageService = new PageService(pageCache, pageProvider);\nconst componentService = new ComponentService();\nconst wsManager = new WebSocketManager();\n\n// Initialize CMS services. The service runs in preview mode so SSR-facing\n// reads merge drafts over published content \u2014 the localhost dev runtime\n// reflects unpublished edits. Production builds (build-static / build-astro\n// / Webflow export) construct the service without the flag and only ever\n// serve published content.\nconst cmsProvider = new FileSystemCMSProvider(projectPaths.templates(), projectPaths.cms());\nconst cmsService = new CMSService(cmsProvider, { previewMode: true });\n\n// Initialize file watcher with CMS service for template change detection\nconst fileWatcherService = new FileWatcherService(\n componentService,\n pageService,\n pageCache,\n wsManager,\n cmsService\n);\n\n// Initialize server data\nasync function initialize() {\n // Load centralized config first\n await configService.load();\n\n // Load project config for fonts (uses legacy loader for now)\n await loadProjectConfig();\n\n // Load global components first\n await componentService.loadAllComponents();\n\n // Load all pages\n await pageService.loadAllPages();\n\n // Initialize CMS service (extract schemas from pages)\n await cmsService.initialize();\n\n // Setup file watchers\n fileWatcherService.initialize();\n}\n\n// Initialize before starting server\nawait initialize();\n\n// Create and start server using the factory\nconst { server, port } = await createServer({\n pageService,\n componentService,\n wsManager,\n cmsService,\n cmsProvider,\n});\n\nconsole.log(`Server with routing and HMR running at http://localhost:${port}`);\nconsole.log(`Available pages:`, pageService.getAllPagePaths());\nconsole.log(`Edit any JSON file to see instant hot reloading!`);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM,0BAA0B;AAGhC,IAAM,YAAY,IAAI,UAAU;AAChC,IAAM,eAAe,IAAI,uBAAuB,aAAa,MAAM,GAAG,aAAa,UAAU,CAAC;AAC9F,IAAM,cAAc,IAAI,YAAY,WAAW,YAAY;AAC3D,IAAM,mBAAmB,IAAI,iBAAiB;AAC9C,IAAM,YAAY,IAAI,iBAAiB;AAOvC,IAAM,cAAc,IAAI,sBAAsB,aAAa,UAAU,GAAG,aAAa,IAAI,CAAC;AAC1F,IAAM,aAAa,IAAI,WAAW,aAAa,EAAE,aAAa,KAAK,CAAC;AAGpE,IAAM,qBAAqB,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,eAAe,aAAa;AAE1B,QAAM,cAAc,KAAK;AAGzB,QAAM,kBAAkB;AAGxB,QAAM,iBAAiB,kBAAkB;AAGzC,QAAM,YAAY,aAAa;AAG/B,QAAM,WAAW,WAAW;AAG5B,qBAAmB,WAAW;AAChC;AAGA,MAAM,WAAW;AAGjB,IAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,aAAa;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,QAAQ,IAAI,2DAA2D,IAAI,EAAE;AAC7E,QAAQ,IAAI,oBAAoB,YAAY,gBAAgB,CAAC;AAC7D,QAAQ,IAAI,kDAAkD;",
6
6
  "names": []
7
7
  }
@@ -12,12 +12,12 @@ import {
12
12
  resolveLinkMapping,
13
13
  resolveStyleMapping,
14
14
  skipEmptyTemplateAttributes
15
- } from "../../chunks/chunk-NP76N4HQ.js";
15
+ } from "../../chunks/chunk-EDQSMAMP.js";
16
16
  import {
17
17
  filterCSSProperties,
18
18
  logNetworkError,
19
19
  logRuntimeError
20
- } from "../../chunks/chunk-UUA5LEWF.js";
20
+ } from "../../chunks/chunk-LPVETICS.js";
21
21
  import {
22
22
  BaseComponentRegistry,
23
23
  DEFAULT_PREFETCH_CONFIG,
@@ -59,19 +59,20 @@ import {
59
59
  singularize,
60
60
  sortClassesByPropertyOrder,
61
61
  validatePageData
62
- } from "../../chunks/chunk-3FHJUHAS.js";
62
+ } from "../../chunks/chunk-7NIC4I3V.js";
63
63
  import {
64
64
  DEFAULT_BREAKPOINTS,
65
65
  DEFAULT_I18N_CONFIG,
66
66
  DEFAULT_REM_CONFIG,
67
67
  DEFAULT_RESPONSIVE_SCALES,
68
68
  getBreakpointValues,
69
+ isI18nValue,
69
70
  migrateI18nConfig,
70
71
  normalizeBreakpointConfig,
71
72
  parseLocaleFromPath,
72
73
  resolveI18nValue,
73
74
  setStoredLocale
74
- } from "../../chunks/chunk-B2RTLDXY.js";
75
+ } from "../../chunks/chunk-AZQYF6KE.js";
75
76
  import {
76
77
  isTiptapDocument,
77
78
  tiptapToHtml
@@ -636,7 +637,7 @@ function setI18nConfig(config) {
636
637
 
637
638
  // lib/client/core/cmsTemplateProcessor.ts
638
639
  init_constants();
639
- function isI18nValue(value) {
640
+ function isI18nValue2(value) {
640
641
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
641
642
  return false;
642
643
  }
@@ -669,7 +670,7 @@ function processCMSTemplate(template, cmsItem, locale) {
669
670
  return "";
670
671
  }
671
672
  }
672
- if (isI18nValue(value)) {
673
+ if (isI18nValue2(value)) {
673
674
  value = resolveI18nValue2(value, effectiveLocale, config);
674
675
  }
675
676
  if (value === null || value === void 0) {
@@ -758,7 +759,12 @@ function buildEmbed(node, ctx, deps) {
758
759
  i18nResolver
759
760
  );
760
761
  }
761
- const utilityClasses = responsiveStylesToClasses(processedStyle);
762
+ const scales = getCachedResponsiveScalesConfig();
763
+ const fluidActive = scales?.enabled === true && scales?.mode === "fluid";
764
+ const utilityClasses = responsiveStylesToClasses(
765
+ processedStyle,
766
+ { fluidActive, responsiveScales: scales ?? void 0 }
767
+ );
762
768
  UtilityClassCollector.collect(utilityClasses);
763
769
  classNames.push(...utilityClasses);
764
770
  }
@@ -793,7 +799,12 @@ function buildEmbed(node, ctx, deps) {
793
799
  const previewClasses = [];
794
800
  for (const rule of nodeInteractiveStyles) {
795
801
  if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {
796
- const styleClasses = responsiveStylesToClasses(rule.style);
802
+ const previewScales = getCachedResponsiveScalesConfig();
803
+ const previewFluidActive = previewScales?.enabled === true && previewScales?.mode === "fluid";
804
+ const styleClasses = responsiveStylesToClasses(
805
+ rule.style,
806
+ { fluidActive: previewFluidActive, responsiveScales: previewScales ?? void 0 }
807
+ );
797
808
  UtilityClassCollector.collect(styleClasses);
798
809
  previewClasses.push(...styleClasses);
799
810
  }
@@ -804,9 +815,12 @@ function buildEmbed(node, ctx, deps) {
804
815
  }
805
816
  }
806
817
  }
807
- if (extractedAttributes.className) {
808
- const attrClasses = extractedAttributes.className.split(/\s+/);
809
- classNames.push(...attrClasses);
818
+ if ("class" in extractedAttributes || "className" in extractedAttributes) {
819
+ const attrClass = extractedAttributes.class ?? extractedAttributes.className ?? "";
820
+ if (attrClass) {
821
+ classNames.push(...attrClass.split(/\s+/));
822
+ }
823
+ delete extractedAttributes.class;
810
824
  delete extractedAttributes.className;
811
825
  }
812
826
  if (classNames.length > 0) {
@@ -890,7 +904,12 @@ function buildLinkNode(node, children, ctx, deps) {
890
904
  i18nResolver
891
905
  );
892
906
  }
893
- const utilityClasses = responsiveStylesToClasses(processedStyle);
907
+ const scales = getCachedResponsiveScalesConfig();
908
+ const fluidActive = scales?.enabled === true && scales?.mode === "fluid";
909
+ const utilityClasses = responsiveStylesToClasses(
910
+ processedStyle,
911
+ { fluidActive, responsiveScales: scales ?? void 0 }
912
+ );
894
913
  UtilityClassCollector.collect(utilityClasses);
895
914
  classNames.push(...utilityClasses);
896
915
  }
@@ -925,7 +944,12 @@ function buildLinkNode(node, children, ctx, deps) {
925
944
  const previewClasses = [];
926
945
  for (const rule of nodeInteractiveStyles) {
927
946
  if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {
928
- const styleClasses = responsiveStylesToClasses(rule.style);
947
+ const previewScales = getCachedResponsiveScalesConfig();
948
+ const previewFluidActive = previewScales?.enabled === true && previewScales?.mode === "fluid";
949
+ const styleClasses = responsiveStylesToClasses(
950
+ rule.style,
951
+ { fluidActive: previewFluidActive, responsiveScales: previewScales ?? void 0 }
952
+ );
929
953
  UtilityClassCollector.collect(styleClasses);
930
954
  previewClasses.push(...styleClasses);
931
955
  }
@@ -936,9 +960,12 @@ function buildLinkNode(node, children, ctx, deps) {
936
960
  }
937
961
  }
938
962
  }
939
- if (extractedAttributes.className) {
940
- const attrClasses = extractedAttributes.className.split(/\s+/);
941
- classNames.push(...attrClasses);
963
+ if ("class" in extractedAttributes || "className" in extractedAttributes) {
964
+ const attrClass = extractedAttributes.class ?? extractedAttributes.className ?? "";
965
+ if (attrClass) {
966
+ classNames.push(...attrClass.split(/\s+/));
967
+ }
968
+ delete extractedAttributes.class;
942
969
  delete extractedAttributes.className;
943
970
  }
944
971
  if (deps.getCurrentPagePath && typeof node.href === "string") {
@@ -1024,8 +1051,13 @@ function buildLocaleList(node, ctx, deps) {
1024
1051
  localeListProps["data-cms-item-index"] = cmsItemIndexPath.join(".");
1025
1052
  }
1026
1053
  let classNames = [];
1054
+ const scales = getCachedResponsiveScalesConfig();
1055
+ const fluidActive = scales?.enabled === true && scales?.mode === "fluid";
1027
1056
  if (node.style) {
1028
- const utilityClasses = responsiveStylesToClasses(node.style);
1057
+ const utilityClasses = responsiveStylesToClasses(
1058
+ node.style,
1059
+ { fluidActive, responsiveScales: scales ?? void 0 }
1060
+ );
1029
1061
  UtilityClassCollector.collect(utilityClasses);
1030
1062
  classNames.push(...utilityClasses);
1031
1063
  }
@@ -1060,7 +1092,10 @@ function buildLocaleList(node, ctx, deps) {
1060
1092
  const previewClasses = [];
1061
1093
  for (const rule of nodeInteractiveStyles) {
1062
1094
  if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {
1063
- const styleClasses = responsiveStylesToClasses(rule.style);
1095
+ const styleClasses = responsiveStylesToClasses(
1096
+ rule.style,
1097
+ { fluidActive, responsiveScales: scales ?? void 0 }
1098
+ );
1064
1099
  UtilityClassCollector.collect(styleClasses);
1065
1100
  previewClasses.push(...styleClasses);
1066
1101
  }
@@ -1071,9 +1106,12 @@ function buildLocaleList(node, ctx, deps) {
1071
1106
  }
1072
1107
  }
1073
1108
  }
1074
- if (extractedAttributes.className) {
1075
- const attrClasses = extractedAttributes.className.split(/\s+/);
1076
- classNames.push(...attrClasses);
1109
+ if ("class" in extractedAttributes || "className" in extractedAttributes) {
1110
+ const attrClass = extractedAttributes.class ?? extractedAttributes.className ?? "";
1111
+ if (attrClass) {
1112
+ classNames.push(...attrClass.split(/\s+/));
1113
+ }
1114
+ delete extractedAttributes.class;
1077
1115
  delete extractedAttributes.className;
1078
1116
  }
1079
1117
  if (classNames.length > 0) {
@@ -1093,10 +1131,10 @@ function buildLocaleList(node, ctx, deps) {
1093
1131
  const showFlag = node.showFlag !== false;
1094
1132
  const configLocales = i18nConfig?.locales || [];
1095
1133
  const currentLocaleCode = locale || i18nConfig?.defaultLocale || "en";
1096
- const itemClasses = node.itemStyle ? responsiveStylesToClasses(node.itemStyle) : [];
1097
- const activeItemClasses = node.activeItemStyle ? responsiveStylesToClasses(node.activeItemStyle) : [];
1098
- const separatorClasses = node.separatorStyle ? responsiveStylesToClasses(node.separatorStyle) : [];
1099
- const flagClasses = node.flagStyle ? responsiveStylesToClasses(node.flagStyle) : [];
1134
+ const itemClasses = node.itemStyle ? responsiveStylesToClasses(node.itemStyle, { fluidActive, responsiveScales: scales ?? void 0 }) : [];
1135
+ const activeItemClasses = node.activeItemStyle ? responsiveStylesToClasses(node.activeItemStyle, { fluidActive, responsiveScales: scales ?? void 0 }) : [];
1136
+ const separatorClasses = node.separatorStyle ? responsiveStylesToClasses(node.separatorStyle, { fluidActive, responsiveScales: scales ?? void 0 }) : [];
1137
+ const flagClasses = node.flagStyle ? responsiveStylesToClasses(node.flagStyle, { fluidActive, responsiveScales: scales ?? void 0 }) : [];
1100
1138
  UtilityClassCollector.collect(itemClasses);
1101
1139
  UtilityClassCollector.collect(activeItemClasses);
1102
1140
  UtilityClassCollector.collect(separatorClasses);
@@ -1643,7 +1681,12 @@ var ComponentBuilder = class {
1643
1681
  getCachedStyleClasses(style) {
1644
1682
  let cached = this.styleClassCache.get(style);
1645
1683
  if (!cached) {
1646
- cached = responsiveStylesToClasses(style);
1684
+ const scales = getCachedResponsiveScalesConfig();
1685
+ const fluidActive = scales?.enabled === true && scales?.mode === "fluid";
1686
+ cached = responsiveStylesToClasses(
1687
+ style,
1688
+ { fluidActive, responsiveScales: scales ?? void 0 }
1689
+ );
1647
1690
  this.styleClassCache.set(style, cached);
1648
1691
  }
1649
1692
  UtilityClassCollector.collect(cached);
@@ -1818,6 +1861,12 @@ var ComponentBuilder = class {
1818
1861
  componentResolvedProps = null
1819
1862
  } = options;
1820
1863
  if (!node) return null;
1864
+ if (isI18nValue(node)) {
1865
+ const i18nResolveConfig = i18nConfig ?? DEFAULT_I18N_CONFIG;
1866
+ const i18nEffectiveLocale = locale || i18nResolveConfig.defaultLocale;
1867
+ const resolved = resolveI18nValue(node, i18nEffectiveLocale, i18nResolveConfig);
1868
+ return this.buildComponent({ ...options, node: resolved });
1869
+ }
1821
1870
  const ctx = {
1822
1871
  key,
1823
1872
  elementPath,
@@ -2151,10 +2200,20 @@ var ComponentBuilder = class {
2151
2200
  return result;
2152
2201
  }
2153
2202
  /**
2154
- * Extract and merge attributes from node
2203
+ * Extract and merge attributes from node. Resolves any `_i18n` value
2204
+ * objects on attribute values to the active locale's string before
2205
+ * downstream template / CMS processing, mirroring the SSR path.
2155
2206
  */
2156
2207
  mergeAttributes(props, node, ctx) {
2157
2208
  let extractedAttributes = extractAttributesFromNode(node);
2209
+ const attrI18nConfig = ctx.i18nConfig ?? DEFAULT_I18N_CONFIG;
2210
+ const attrEffectiveLocale = ctx.locale || attrI18nConfig.defaultLocale;
2211
+ for (const [key, value] of Object.entries(extractedAttributes)) {
2212
+ if (isI18nValue(value)) {
2213
+ extractedAttributes = { ...extractedAttributes };
2214
+ extractedAttributes[key] = resolveI18nValue(value, attrEffectiveLocale, attrI18nConfig);
2215
+ }
2216
+ }
2158
2217
  const originalAttributes = { ...extractedAttributes };
2159
2218
  if (ctx.cmsContext && Object.keys(extractedAttributes).length > 0) {
2160
2219
  extractedAttributes = processCMSPropsTemplate(
@@ -3201,7 +3260,8 @@ ${originalCSS}`);
3201
3260
  if (interactiveStylesMap.size === 0) return;
3202
3261
  const breakpointConfig2 = getCachedBreakpointConfig() || DEFAULT_BREAKPOINTS;
3203
3262
  const remConversionConfig2 = getCachedRemConversionConfig() || void 0;
3204
- const interactiveCSS = generateAllInteractiveCSS(interactiveStylesMap, breakpointConfig2, remConversionConfig2);
3263
+ const responsiveScalesConfig2 = getCachedResponsiveScalesConfig() || void 0;
3264
+ const interactiveCSS = generateAllInteractiveCSS(interactiveStylesMap, breakpointConfig2, remConversionConfig2, responsiveScalesConfig2);
3205
3265
  if (!interactiveCSS) return;
3206
3266
  if (document.head) {
3207
3267
  let styleTag = document.getElementById(interactiveStyleId);
@@ -4237,9 +4297,9 @@ var lightThemeColors = {
4237
4297
  backgroundTertiary: "#eaeef2",
4238
4298
  border: "#d0d7de",
4239
4299
  borderSecondary: "#d1d5da",
4240
- text: "#24292e",
4300
+ text: "#1a1a1a",
4241
4301
  textSecondary: "#586069",
4242
- textMuted: "#6a737d",
4302
+ textMuted: "#525a63",
4243
4303
  codeString: "#032f62",
4244
4304
  codeNumber: "#005cc5",
4245
4305
  codeKey: "#005cc5",
@@ -4284,9 +4344,9 @@ var darkThemeColors = {
4284
4344
  backgroundTertiary: "#252525",
4285
4345
  border: "#333333",
4286
4346
  borderSecondary: "#444444",
4287
- text: "#cccccc",
4347
+ text: "#ebebeb",
4288
4348
  textSecondary: "#cccccc",
4289
- textMuted: "#888888",
4349
+ textMuted: "#b0b0b0",
4290
4350
  codeString: "#ffffff",
4291
4351
  codeNumber: "#b5cea8",
4292
4352
  codeKey: "#9cdcfe",