meno-core 1.0.53 → 1.1.0
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.
- package/.claude/settings.local.json +1 -3
- package/bin/cli.ts +66 -261
- package/build-astro.ts +150 -128
- package/dist/bin/cli.js +42 -185
- package/dist/bin/cli.js.map +2 -2
- package/dist/chunks/chunk-2AR55GYH.js +42 -0
- package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
- package/dist/chunks/{chunk-JGWFTO6P.js → chunk-2IIQK7T3.js} +2624 -1389
- package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
- package/dist/chunks/chunk-4ZRU52J2.js +169 -0
- package/dist/chunks/chunk-4ZRU52J2.js.map +7 -0
- package/dist/chunks/{chunk-UB44F4Z2.js → chunk-5X4HCN7J.js} +5 -7
- package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
- package/dist/chunks/{chunk-WQFG7PAH.js → chunk-7CCVOL5M.js} +15 -19
- package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
- package/dist/chunks/{chunk-YBLHKYFF.js → chunk-AR7LHIFY.js} +8 -2
- package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
- package/dist/chunks/{chunk-O3NAGJP4.js → chunk-NUP7H7D3.js} +135 -41
- package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
- package/dist/chunks/{chunk-X754AHS5.js → chunk-QWTQZHG3.js} +194 -90
- package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
- package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-XTKNX4FW.js} +216 -87
- package/dist/chunks/chunk-XTKNX4FW.js.map +7 -0
- package/dist/chunks/{fs-JGINUXGL.js → fs-G3ANWEFP.js} +2 -2
- package/dist/lib/client/index.js +1003 -475
- package/dist/lib/client/index.js.map +3 -3
- package/dist/lib/server/index.js +14393 -6371
- package/dist/lib/server/index.js.map +4 -4
- package/dist/lib/shared/index.js +342 -101
- package/dist/lib/shared/index.js.map +4 -4
- package/dist/lib/shared/richtext/index.js +1 -1
- package/dist/lib/test-utils/index.js +64 -80
- package/dist/lib/test-utils/index.js.map +2 -2
- package/entries/client-router.tsx +10 -8
- package/lib/client/ClientInitializer.ts +8 -8
- package/lib/client/ErrorBoundary.test.tsx +246 -186
- package/lib/client/ErrorBoundary.tsx +183 -132
- package/lib/client/componentRegistry.test.ts +96 -108
- package/lib/client/componentRegistry.ts +1 -3
- package/lib/client/contexts/ThemeContext.tsx +3 -2
- package/lib/client/core/ComponentBuilder.test.ts +663 -560
- package/lib/client/core/ComponentBuilder.ts +427 -155
- package/lib/client/core/ComponentRenderer.test.tsx +2 -4
- package/lib/client/core/ComponentRenderer.tsx +46 -33
- package/lib/client/core/builders/embedBuilder.ts +242 -54
- package/lib/client/core/builders/linkBuilder.ts +72 -45
- package/lib/client/core/builders/linkNodeBuilder.ts +79 -54
- package/lib/client/core/builders/listBuilder.ts +155 -89
- package/lib/client/core/builders/localeListBuilder.ts +97 -62
- package/lib/client/core/builders/types.ts +5 -5
- package/lib/client/core/cmsTemplateProcessor.ts +8 -9
- package/lib/client/elementRegistry.ts +3 -3
- package/lib/client/fontFamiliesService.test.ts +2 -10
- package/lib/client/fontFamiliesService.ts +3 -3
- package/lib/client/hmr/HMRManager.tsx +47 -30
- package/lib/client/hmrCssReload.ts +49 -14
- package/lib/client/hmrWebSocket.ts +14 -19
- package/lib/client/hooks/useColorVariables.test.ts +21 -21
- package/lib/client/hooks/useColorVariables.ts +23 -18
- package/lib/client/hooks/usePropertyAutocomplete.ts +4 -6
- package/lib/client/hooks/useVariables.ts +6 -4
- package/lib/client/hydration/HydrationUtils.test.ts +24 -25
- package/lib/client/hydration/HydrationUtils.ts +3 -4
- package/lib/client/i18nConfigService.test.ts +2 -7
- package/lib/client/i18nConfigService.ts +2 -2
- package/lib/client/meno-filter/MenoFilter.test.ts +47 -49
- package/lib/client/meno-filter/MenoFilter.ts +14 -15
- package/lib/client/meno-filter/bindings.ts +18 -43
- package/lib/client/meno-filter/init.ts +4 -4
- package/lib/client/meno-filter/renderer.ts +30 -32
- package/lib/client/meno-filter/script.generated.ts +1 -3
- package/lib/client/meno-filter/ui.ts +4 -6
- package/lib/client/meno-filter/updates.ts +18 -23
- package/lib/client/meno-filter/utils.ts +1 -1
- package/lib/client/navigation.test.ts +174 -178
- package/lib/client/navigation.ts +0 -1
- package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
- package/lib/client/responsiveStyleResolver.test.ts +234 -232
- package/lib/client/responsiveStyleResolver.ts +74 -20
- package/lib/client/routing/RouteLoader.test.ts +24 -25
- package/lib/client/routing/RouteLoader.ts +27 -35
- package/lib/client/routing/Router.tsx +210 -153
- package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
- package/lib/client/scripts/ScriptExecutor.ts +18 -36
- package/lib/client/services/PrefetchService.test.ts +3 -3
- package/lib/client/services/PrefetchService.ts +23 -29
- package/lib/client/styleProcessor.test.ts +9 -9
- package/lib/client/styleProcessor.ts +24 -15
- package/lib/client/styles/StyleInjector.test.ts +122 -115
- package/lib/client/styles/StyleInjector.ts +10 -7
- package/lib/client/styles/UtilityClassCollector.ts +62 -28
- package/lib/client/styles/cspNonce.test.ts +2 -5
- package/lib/client/templateEngine.test.ts +554 -488
- package/lib/client/templateEngine.ts +203 -73
- package/lib/client/theme.test.ts +1 -1
- package/lib/client/theme.ts +0 -1
- package/lib/client/utils/toast.ts +0 -1
- package/lib/server/__integration__/api-routes.test.ts +8 -4
- package/lib/server/__integration__/cms-integration.test.ts +1 -4
- package/lib/server/__integration__/server-lifecycle.test.ts +4 -5
- package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
- package/lib/server/__integration__/static-assets.test.ts +3 -3
- package/lib/server/__integration__/test-helpers.ts +87 -74
- package/lib/server/ab/generateFunctions.ts +12 -10
- package/lib/server/astro/cmsPageEmitter.ts +26 -42
- package/lib/server/astro/componentEmitter.ts +35 -43
- package/lib/server/astro/cssCollector.ts +10 -26
- package/lib/server/astro/nodeToAstro.test.ts +1754 -34
- package/lib/server/astro/nodeToAstro.ts +232 -216
- package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +115 -119
- package/lib/server/astro/normalizeOrphanTemplateProps.ts +11 -18
- package/lib/server/astro/pageEmitter.ts +9 -13
- package/lib/server/astro/tailwindMapper.test.ts +10 -37
- package/lib/server/astro/tailwindMapper.ts +33 -40
- package/lib/server/astro/templateTransformer.ts +17 -20
- package/lib/server/createServer.ts +7 -19
- package/lib/server/cssGenerator.test.ts +35 -44
- package/lib/server/cssGenerator.ts +8 -19
- package/lib/server/fileWatcher.test.ts +164 -13
- package/lib/server/fileWatcher.ts +209 -124
- package/lib/server/index.ts +14 -17
- package/lib/server/jsonLoader.test.ts +39 -2
- package/lib/server/jsonLoader.ts +39 -34
- package/lib/server/middleware/cors.test.ts +21 -21
- package/lib/server/middleware/cors.ts +28 -4
- package/lib/server/middleware/errorHandler.test.ts +7 -5
- package/lib/server/middleware/errorHandler.ts +3 -8
- package/lib/server/middleware/index.ts +0 -1
- package/lib/server/middleware/logger.test.ts +10 -8
- package/lib/server/middleware/logger.ts +17 -29
- package/lib/server/migrateTemplates.ts +3 -3
- package/lib/server/pageCache.test.ts +76 -77
- package/lib/server/pageCache.ts +0 -1
- package/lib/server/projectContext.ts +5 -4
- package/lib/server/providers/fileSystemCMSProvider.test.ts +142 -99
- package/lib/server/providers/fileSystemCMSProvider.ts +62 -38
- package/lib/server/routes/api/cms.test.ts +26 -14
- package/lib/server/routes/api/cms.ts +9 -14
- package/lib/server/routes/api/colors.test.ts +2 -2
- package/lib/server/routes/api/components.ts +31 -35
- package/lib/server/routes/api/config.ts +3 -4
- package/lib/server/routes/api/core-routes.ts +49 -76
- package/lib/server/routes/api/enums.test.ts +2 -2
- package/lib/server/routes/api/functions.ts +9 -17
- package/lib/server/routes/api/index.ts +3 -6
- package/lib/server/routes/api/pages.ts +8 -11
- package/lib/server/routes/api/shared.test.ts +1 -1
- package/lib/server/routes/api/shared.ts +12 -9
- package/lib/server/routes/api/variables.test.ts +3 -5
- package/lib/server/routes/api/variables.ts +1 -1
- package/lib/server/routes/index.ts +25 -28
- package/lib/server/routes/pages.ts +35 -31
- package/lib/server/routes/static.ts +17 -6
- package/lib/server/runtime/bundler.ts +98 -61
- package/lib/server/runtime/fs.ts +16 -26
- package/lib/server/runtime/httpServer.ts +8 -12
- package/lib/server/services/ColorService.test.ts +3 -3
- package/lib/server/services/ColorService.ts +37 -29
- package/lib/server/services/EnumService.test.ts +4 -8
- package/lib/server/services/EnumService.ts +11 -3
- package/lib/server/services/VariableService.test.ts +8 -12
- package/lib/server/services/VariableService.ts +11 -3
- package/lib/server/services/cmsService.test.ts +158 -120
- package/lib/server/services/cmsService.ts +36 -146
- package/lib/server/services/componentService.test.ts +125 -45
- package/lib/server/services/componentService.ts +70 -46
- package/lib/server/services/configService.test.ts +22 -45
- package/lib/server/services/configService.ts +50 -27
- package/lib/server/services/fileWatcherService.ts +42 -8
- package/lib/server/services/index.ts +0 -1
- package/lib/server/services/pageService.test.ts +8 -10
- package/lib/server/services/pageService.ts +32 -18
- package/lib/server/ssr/attributeBuilder.ts +18 -8
- package/lib/server/ssr/buildErrorOverlay.ts +11 -12
- package/lib/server/ssr/clientDataInjector.ts +7 -21
- package/lib/server/ssr/cmsSSRProcessor.ts +4 -8
- package/lib/server/ssr/cssCollector.ts +1 -1
- package/lib/server/ssr/errorOverlay.test.ts +1 -1
- package/lib/server/ssr/errorOverlay.ts +3 -9
- package/lib/server/ssr/htmlGenerator.nonce.test.ts +9 -14
- package/lib/server/ssr/htmlGenerator.test.ts +120 -44
- package/lib/server/ssr/htmlGenerator.ts +126 -91
- package/lib/server/ssr/imageMetadata.test.ts +3 -1
- package/lib/server/ssr/imageMetadata.ts +27 -21
- package/lib/server/ssr/jsCollector.test.ts +8 -18
- package/lib/server/ssr/jsCollector.ts +3 -8
- package/lib/server/ssr/liveReloadIntegration.test.ts +76 -36
- package/lib/server/ssr/metaTagGenerator.ts +2 -2
- package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
- package/lib/server/ssr/ssrRenderer.test.ts +316 -256
- package/lib/server/ssr/ssrRenderer.ts +795 -243
- package/lib/server/ssrRenderer.test.ts +1048 -954
- package/lib/server/utils/jsonLineMapper.test.ts +28 -28
- package/lib/server/utils/jsonLineMapper.ts +7 -7
- package/lib/server/validateStyleCoverage.ts +18 -21
- package/lib/server/websocketManager.ts +28 -19
- package/lib/shared/attributeNodeUtils.test.ts +15 -15
- package/lib/shared/attributeNodeUtils.ts +5 -12
- package/lib/shared/breakpoints.test.ts +5 -5
- package/lib/shared/breakpoints.ts +4 -11
- package/lib/shared/cmsQuery.test.ts +81 -0
- package/lib/shared/cmsQuery.ts +92 -0
- package/lib/shared/cmsQueryParser.test.ts +50 -42
- package/lib/shared/cmsQueryParser.ts +60 -38
- package/lib/shared/colorConversions.ts +9 -9
- package/lib/shared/colorVariableUtils.test.ts +27 -5
- package/lib/shared/colorVariableUtils.ts +21 -12
- package/lib/shared/componentRefs.ts +1 -5
- package/lib/shared/constants.test.ts +3 -3
- package/lib/shared/constants.ts +8 -8
- package/lib/shared/cssGeneration.test.ts +285 -144
- package/lib/shared/cssGeneration.ts +217 -531
- package/lib/shared/cssNamedColors.ts +152 -30
- package/lib/shared/cssProperties.test.ts +69 -70
- package/lib/shared/cssProperties.ts +298 -114
- package/lib/shared/elementClassName.test.ts +109 -109
- package/lib/shared/elementClassName.ts +3 -3
- package/lib/shared/elementUtils.ts +12 -16
- package/lib/shared/errorLogger.test.ts +12 -12
- package/lib/shared/errorLogger.ts +2 -10
- package/lib/shared/errors.test.ts +2 -13
- package/lib/shared/errors.ts +2 -8
- package/lib/shared/expressionEvaluator.test.ts +145 -0
- package/lib/shared/expressionEvaluator.ts +52 -24
- package/lib/shared/fontLoader.test.ts +32 -18
- package/lib/shared/fontLoader.ts +2 -2
- package/lib/shared/friendlyError.ts +2 -3
- package/lib/shared/gradientUtils.test.ts +3 -7
- package/lib/shared/gradientUtils.ts +17 -14
- package/lib/shared/hrefRefs.test.ts +2 -2
- package/lib/shared/hrefRefs.ts +2 -10
- package/lib/shared/i18n.test.ts +4 -4
- package/lib/shared/i18n.ts +18 -38
- package/lib/shared/index.ts +27 -0
- package/lib/shared/inlineSvgStyleRules.ts +14 -13
- package/lib/shared/interactiveStyleMappings.test.ts +32 -54
- package/lib/shared/interactiveStyleMappings.ts +11 -24
- package/lib/shared/interactiveStyles.test.ts +165 -188
- package/lib/shared/interfaces/contentProvider.ts +1 -1
- package/lib/shared/itemTemplateUtils.test.ts +11 -17
- package/lib/shared/itemTemplateUtils.ts +27 -39
- package/lib/shared/jsonRepair.ts +16 -10
- package/lib/shared/libraryLoader.test.ts +21 -55
- package/lib/shared/libraryLoader.ts +7 -22
- package/lib/shared/linkUtils.ts +1 -1
- package/lib/shared/logger.test.ts +66 -0
- package/lib/shared/logger.ts +94 -0
- package/lib/shared/markdown.ts +25 -0
- package/lib/shared/netlifyLocale404.test.ts +179 -0
- package/lib/shared/netlifyLocale404.ts +110 -0
- package/lib/shared/nodeUtils.test.ts +28 -16
- package/lib/shared/nodeUtils.ts +76 -23
- package/lib/shared/pathArrayUtils.test.ts +1 -2
- package/lib/shared/pathArrayUtils.ts +1 -1
- package/lib/shared/pathSecurity.ts +2 -2
- package/lib/shared/pathUtils.test.ts +4 -6
- package/lib/shared/pathUtils.ts +42 -49
- package/lib/shared/paths/Path.test.ts +2 -2
- package/lib/shared/paths/Path.ts +0 -1
- package/lib/shared/paths/PathConverter.test.ts +1 -1
- package/lib/shared/paths/PathConverter.ts +17 -20
- package/lib/shared/paths/PathUtils.ts +13 -13
- package/lib/shared/paths/PathValidator.test.ts +2 -15
- package/lib/shared/paths/PathValidator.ts +12 -10
- package/lib/shared/paths/index.ts +1 -2
- package/lib/shared/permissions.test.ts +168 -0
- package/lib/shared/permissions.ts +162 -0
- package/lib/shared/propResolver.test.ts +240 -244
- package/lib/shared/propResolver.ts +15 -26
- package/lib/shared/pxToRem.test.ts +7 -6
- package/lib/shared/pxToRem.ts +2 -5
- package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +12 -6
- package/lib/shared/registry/ClientRegistry.ts +0 -2
- package/lib/shared/registry/ComponentRegistry.test.ts +46 -32
- package/lib/shared/registry/ComponentRegistry.ts +12 -9
- package/lib/shared/registry/NodeTypeDefinition.ts +16 -9
- package/lib/shared/registry/RegistryManager.ts +1 -2
- package/lib/shared/registry/SSRRegistry.ts +0 -2
- package/lib/shared/registry/createNodeType.ts +7 -9
- package/lib/shared/registry/defineNodeType.ts +2 -6
- package/lib/shared/registry/fieldPresets.ts +3 -1
- package/lib/shared/registry/index.ts +0 -1
- package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
- package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
- package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
- package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +48 -19
- package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
- package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
- package/lib/shared/registry/nodeTypes/ListNodeType.ts +117 -77
- package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
- package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
- package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +12 -8
- package/lib/shared/registry/nodeTypes/index.ts +26 -3
- package/lib/shared/responsiveScaling.test.ts +16 -34
- package/lib/shared/responsiveScaling.ts +61 -42
- package/lib/shared/responsiveStyleUtils.test.ts +0 -1
- package/lib/shared/responsiveStyleUtils.ts +11 -13
- package/lib/shared/richtext/htmlToTiptap.test.ts +139 -130
- package/lib/shared/richtext/htmlToTiptap.ts +2 -4
- package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
- package/lib/shared/richtext/types.ts +1 -8
- package/lib/shared/slugTranslator.test.ts +13 -13
- package/lib/shared/slugTranslator.ts +12 -16
- package/lib/shared/slugify.ts +9 -15
- package/lib/shared/styleNodeUtils.test.ts +8 -8
- package/lib/shared/styleNodeUtils.ts +18 -20
- package/lib/shared/styleUtils.test.ts +87 -61
- package/lib/shared/styleUtils.ts +5 -6
- package/lib/shared/themeDefaults.test.ts +11 -14
- package/lib/shared/themeDefaults.ts +3 -4
- package/lib/shared/tree/PathBuilder.test.ts +63 -145
- package/lib/shared/tree/PathBuilder.ts +59 -47
- package/lib/shared/treePathUtils.test.ts +51 -12
- package/lib/shared/treePathUtils.ts +91 -60
- package/lib/shared/types/api.ts +105 -8
- package/lib/shared/types/cms.test.ts +34 -0
- package/lib/shared/types/cms.ts +90 -34
- package/lib/shared/types/comment.ts +49 -16
- package/lib/shared/types/components.ts +51 -25
- package/lib/shared/types/errors.test.ts +1 -6
- package/lib/shared/types/errors.ts +3 -7
- package/lib/shared/types/experiments.ts +28 -28
- package/lib/shared/types/index.ts +25 -2
- package/lib/shared/types/permissions.ts +139 -0
- package/lib/shared/types/styles.ts +0 -1
- package/lib/shared/types/variables.test.ts +4 -13
- package/lib/shared/types/variables.ts +51 -30
- package/lib/shared/types.ts +1 -2
- package/lib/shared/utilityClassConfig.ts +751 -321
- package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
- package/lib/shared/utilityClassMapper.test.ts +433 -95
- package/lib/shared/utilityClassMapper.ts +322 -249
- package/lib/shared/utilityClassNames.test.ts +38 -0
- package/lib/shared/utilityClassNames.ts +458 -0
- package/lib/shared/utils.test.ts +2 -10
- package/lib/shared/utils.ts +19 -10
- package/lib/shared/validation/cmsValidators.ts +2 -1
- package/lib/shared/validation/commentValidators.test.ts +53 -0
- package/lib/shared/validation/commentValidators.ts +12 -1
- package/lib/shared/validation/index.ts +1 -0
- package/lib/shared/validation/permissionsValidators.test.ts +49 -0
- package/lib/shared/validation/permissionsValidators.ts +49 -0
- package/lib/shared/validation/propValidator.test.ts +19 -21
- package/lib/shared/validation/propValidator.ts +13 -18
- package/lib/shared/validation/schemas.test.ts +64 -32
- package/lib/shared/validation/schemas.ts +616 -345
- package/lib/shared/validation/validators.test.ts +3 -8
- package/lib/shared/validation/validators.ts +89 -68
- package/lib/shared/viewportUnits.integration.test.ts +14 -10
- package/lib/shared/viewportUnits.test.ts +24 -23
- package/lib/shared/viewportUnits.ts +12 -5
- package/lib/test-utils/dom-setup.ts +1 -1
- package/lib/test-utils/factories/ConsoleMockFactory.ts +10 -14
- package/lib/test-utils/factories/DomMockFactory.ts +17 -23
- package/lib/test-utils/factories/EventMockFactory.ts +7 -13
- package/lib/test-utils/factories/FetchMockFactory.ts +39 -57
- package/lib/test-utils/factories/ServerMockFactory.ts +6 -10
- package/lib/test-utils/factories/StoreMockFactory.ts +18 -29
- package/lib/test-utils/fixtures.ts +45 -45
- package/lib/test-utils/helpers/asyncHelpers.test.ts +15 -18
- package/lib/test-utils/helpers/asyncHelpers.ts +11 -20
- package/lib/test-utils/helpers.ts +1 -5
- package/lib/test-utils/index.ts +0 -4
- package/lib/test-utils/mockFactories.ts +13 -19
- package/lib/test-utils/mocks.ts +6 -4
- package/package.json +3 -5
- package/scripts/build-for-publish.mjs +2 -4
- package/scripts/build-meno-filter.ts +4 -7
- package/tsconfig.json +1 -0
- package/vite.config.ts +4 -4
- package/build-next.ts +0 -1361
- package/build-static.test.ts +0 -424
- package/build-static.ts +0 -1074
- package/dist/build-static.js +0 -36
- package/dist/chunks/chunk-2MHDV5BF.js +0 -251
- package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
- package/dist/chunks/chunk-AZQYF6KE.js +0 -559
- package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
- package/dist/chunks/chunk-GZHGVVW3.js +0 -322
- package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
- package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
- package/dist/chunks/chunk-I7YIGZXT.js +0 -467
- package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
- package/dist/chunks/chunk-IGYR22T6.js +0 -6192
- package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
- package/dist/chunks/chunk-JGP5A3Y5.js +0 -1136
- package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
- package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
- package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
- package/dist/chunks/chunk-QB2LNO4W.js +0 -77
- package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
- package/dist/chunks/chunk-R6XHAFBF.js +0 -3821
- package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
- package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
- package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
- package/dist/chunks/chunk-X754AHS5.js.map +0 -7
- package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
- package/dist/chunks/configService-R3OGU2UD.js +0 -13
- package/dist/chunks/configService-R3OGU2UD.js.map +0 -7
- package/dist/chunks/constants-STK2YBIW.js +0 -46
- package/dist/chunks/constants-STK2YBIW.js.map +0 -7
- package/dist/chunks/fs-JGINUXGL.js.map +0 -7
- package/dist/entries/server-router.js +0 -67
- package/dist/entries/server-router.js.map +0 -7
- package/entries/server-router.tsx +0 -81
- package/lib/server/providers/fileSystemPageProvider.ts +0 -160
- package/lib/server/webflow/buildWebflow.ts +0 -635
- package/lib/server/webflow/index.ts +0 -23
- package/lib/server/webflow/nodeToWebflow.test.ts +0 -3170
- package/lib/server/webflow/nodeToWebflow.ts +0 -2435
- package/lib/server/webflow/styleMapper.test.ts +0 -389
- package/lib/server/webflow/styleMapper.ts +0 -695
- package/lib/server/webflow/templateWrapper.ts +0 -49
- package/lib/server/webflow/types.ts +0 -396
- /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
|
@@ -4,31 +4,28 @@
|
|
|
4
4
|
* Covers both page and component contexts
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { test, expect, describe } from
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
describe("generateInteractiveCSS", () => {
|
|
17
|
-
describe("Page element styles", () => {
|
|
18
|
-
test("should generate hover styles for page element", () => {
|
|
7
|
+
import { test, expect, describe } from 'bun:test';
|
|
8
|
+
import { generateInteractiveCSS, generateAllInteractiveCSS } from './cssGeneration';
|
|
9
|
+
import { generateElementClassName, type ElementClassContext } from './elementClassName';
|
|
10
|
+
import type { InteractiveStyles, ResponsiveStyleObject } from './types/styles';
|
|
11
|
+
import { DEFAULT_BREAKPOINTS } from './breakpoints';
|
|
12
|
+
|
|
13
|
+
describe('generateInteractiveCSS', () => {
|
|
14
|
+
describe('Page element styles', () => {
|
|
15
|
+
test('should generate hover styles for page element', () => {
|
|
19
16
|
const ctx: ElementClassContext = {
|
|
20
|
-
fileType:
|
|
21
|
-
fileName:
|
|
22
|
-
label:
|
|
17
|
+
fileType: 'page',
|
|
18
|
+
fileName: 'about',
|
|
19
|
+
label: 'button',
|
|
23
20
|
path: [0],
|
|
24
21
|
};
|
|
25
22
|
const elementClass = generateElementClassName(ctx);
|
|
26
23
|
const interactiveStyles: InteractiveStyles = [
|
|
27
24
|
{
|
|
28
|
-
postfix:
|
|
25
|
+
postfix: ':hover',
|
|
29
26
|
style: {
|
|
30
|
-
backgroundColor:
|
|
31
|
-
color:
|
|
27
|
+
backgroundColor: 'primary',
|
|
28
|
+
color: 'white',
|
|
32
29
|
},
|
|
33
30
|
},
|
|
34
31
|
];
|
|
@@ -36,22 +33,22 @@ describe("generateInteractiveCSS", () => {
|
|
|
36
33
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
37
34
|
|
|
38
35
|
expect(css).toContain(`.${elementClass}:hover`);
|
|
39
|
-
expect(css).toContain(
|
|
40
|
-
expect(css).toContain(
|
|
36
|
+
expect(css).toContain('background-color: var(--primary)');
|
|
37
|
+
expect(css).toContain('color: var(--white)');
|
|
41
38
|
});
|
|
42
39
|
|
|
43
|
-
test(
|
|
40
|
+
test('should generate active styles for page element', () => {
|
|
44
41
|
const ctx: ElementClassContext = {
|
|
45
|
-
fileType:
|
|
46
|
-
fileName:
|
|
42
|
+
fileType: 'page',
|
|
43
|
+
fileName: 'index',
|
|
47
44
|
path: [0, 1],
|
|
48
45
|
};
|
|
49
46
|
const elementClass = generateElementClassName(ctx);
|
|
50
47
|
const interactiveStyles: InteractiveStyles = [
|
|
51
48
|
{
|
|
52
|
-
postfix:
|
|
49
|
+
postfix: ':active',
|
|
53
50
|
style: {
|
|
54
|
-
transform:
|
|
51
|
+
transform: 'scale(0.98)',
|
|
55
52
|
},
|
|
56
53
|
},
|
|
57
54
|
];
|
|
@@ -59,23 +56,23 @@ describe("generateInteractiveCSS", () => {
|
|
|
59
56
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
60
57
|
|
|
61
58
|
expect(css).toContain(`.${elementClass}:active`);
|
|
62
|
-
expect(css).toContain(
|
|
59
|
+
expect(css).toContain('transform: scale(0.98)');
|
|
63
60
|
});
|
|
64
61
|
|
|
65
|
-
test(
|
|
62
|
+
test('should generate focus styles for page element', () => {
|
|
66
63
|
const ctx: ElementClassContext = {
|
|
67
|
-
fileType:
|
|
68
|
-
fileName:
|
|
69
|
-
label:
|
|
64
|
+
fileType: 'page',
|
|
65
|
+
fileName: 'contact',
|
|
66
|
+
label: 'input',
|
|
70
67
|
path: [0, 2],
|
|
71
68
|
};
|
|
72
69
|
const elementClass = generateElementClassName(ctx);
|
|
73
70
|
const interactiveStyles: InteractiveStyles = [
|
|
74
71
|
{
|
|
75
|
-
postfix:
|
|
72
|
+
postfix: ':focus',
|
|
76
73
|
style: {
|
|
77
|
-
outline:
|
|
78
|
-
outlineOffset:
|
|
74
|
+
outline: '2px solid var(--primary)',
|
|
75
|
+
outlineOffset: '2px',
|
|
79
76
|
},
|
|
80
77
|
},
|
|
81
78
|
];
|
|
@@ -83,23 +80,23 @@ describe("generateInteractiveCSS", () => {
|
|
|
83
80
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
84
81
|
|
|
85
82
|
expect(css).toContain(`.${elementClass}:focus`);
|
|
86
|
-
expect(css).toContain(
|
|
83
|
+
expect(css).toContain('outline: 2px solid var(--primary)');
|
|
87
84
|
});
|
|
88
85
|
});
|
|
89
86
|
|
|
90
|
-
describe(
|
|
91
|
-
test(
|
|
87
|
+
describe('Component element styles', () => {
|
|
88
|
+
test('should generate hover styles for component element', () => {
|
|
92
89
|
const ctx: ElementClassContext = {
|
|
93
|
-
fileType:
|
|
94
|
-
fileName:
|
|
90
|
+
fileType: 'component',
|
|
91
|
+
fileName: 'Button',
|
|
95
92
|
path: [0],
|
|
96
93
|
};
|
|
97
94
|
const elementClass = generateElementClassName(ctx);
|
|
98
95
|
const interactiveStyles: InteractiveStyles = [
|
|
99
96
|
{
|
|
100
|
-
postfix:
|
|
97
|
+
postfix: ':hover',
|
|
101
98
|
style: {
|
|
102
|
-
backgroundColor:
|
|
99
|
+
backgroundColor: 'primary-dark',
|
|
103
100
|
},
|
|
104
101
|
},
|
|
105
102
|
];
|
|
@@ -109,22 +106,22 @@ describe("generateInteractiveCSS", () => {
|
|
|
109
106
|
// Component class should have c_ prefix
|
|
110
107
|
expect(elementClass).toMatch(/^c_button_/);
|
|
111
108
|
expect(css).toContain(`.${elementClass}:hover`);
|
|
112
|
-
expect(css).toContain(
|
|
109
|
+
expect(css).toContain('background-color: var(--primary-dark)');
|
|
113
110
|
});
|
|
114
111
|
|
|
115
|
-
test(
|
|
112
|
+
test('should generate interactive styles for named component element', () => {
|
|
116
113
|
const ctx: ElementClassContext = {
|
|
117
|
-
fileType:
|
|
118
|
-
fileName:
|
|
119
|
-
label:
|
|
114
|
+
fileType: 'component',
|
|
115
|
+
fileName: 'Navigation',
|
|
116
|
+
label: 'hamburger',
|
|
120
117
|
path: [0, 0],
|
|
121
118
|
};
|
|
122
119
|
const elementClass = generateElementClassName(ctx);
|
|
123
120
|
const interactiveStyles: InteractiveStyles = [
|
|
124
121
|
{
|
|
125
|
-
postfix:
|
|
122
|
+
postfix: ':hover',
|
|
126
123
|
style: {
|
|
127
|
-
opacity:
|
|
124
|
+
opacity: '0.8',
|
|
128
125
|
},
|
|
129
126
|
},
|
|
130
127
|
];
|
|
@@ -132,57 +129,57 @@ describe("generateInteractiveCSS", () => {
|
|
|
132
129
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
133
130
|
|
|
134
131
|
// Named element should have predictable class
|
|
135
|
-
expect(elementClass).toBe(
|
|
136
|
-
expect(css).toContain(
|
|
137
|
-
expect(css).toContain(
|
|
132
|
+
expect(elementClass).toBe('c_navigation_hamburger');
|
|
133
|
+
expect(css).toContain('.c_navigation_hamburger:hover');
|
|
134
|
+
expect(css).toContain('opacity: 0.8');
|
|
138
135
|
});
|
|
139
136
|
|
|
140
|
-
test(
|
|
137
|
+
test('should generate multiple interactive states for component', () => {
|
|
141
138
|
const ctx: ElementClassContext = {
|
|
142
|
-
fileType:
|
|
143
|
-
fileName:
|
|
144
|
-
label:
|
|
139
|
+
fileType: 'component',
|
|
140
|
+
fileName: 'Card',
|
|
141
|
+
label: 'link',
|
|
145
142
|
path: [0, 1],
|
|
146
143
|
};
|
|
147
144
|
const elementClass = generateElementClassName(ctx);
|
|
148
145
|
const interactiveStyles: InteractiveStyles = [
|
|
149
146
|
{
|
|
150
|
-
postfix:
|
|
151
|
-
style: { color:
|
|
147
|
+
postfix: ':hover',
|
|
148
|
+
style: { color: 'primary' },
|
|
152
149
|
},
|
|
153
150
|
{
|
|
154
|
-
postfix:
|
|
155
|
-
style: { color:
|
|
151
|
+
postfix: ':active',
|
|
152
|
+
style: { color: 'primary-dark' },
|
|
156
153
|
},
|
|
157
154
|
{
|
|
158
|
-
postfix:
|
|
159
|
-
style: { outline:
|
|
155
|
+
postfix: ':focus',
|
|
156
|
+
style: { outline: 'none', boxShadow: '0 0 0 2px var(--primary)' },
|
|
160
157
|
},
|
|
161
158
|
];
|
|
162
159
|
|
|
163
160
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
164
161
|
|
|
165
|
-
expect(css).toContain(
|
|
166
|
-
expect(css).toContain(
|
|
167
|
-
expect(css).toContain(
|
|
162
|
+
expect(css).toContain('.c_card_link:hover');
|
|
163
|
+
expect(css).toContain('.c_card_link:active');
|
|
164
|
+
expect(css).toContain('.c_card_link:focus');
|
|
168
165
|
});
|
|
169
166
|
});
|
|
170
167
|
|
|
171
|
-
describe(
|
|
172
|
-
test(
|
|
168
|
+
describe('Prefix selectors (checkbox/sibling patterns)', () => {
|
|
169
|
+
test('should handle prefix selector for toggle pattern', () => {
|
|
173
170
|
const ctx: ElementClassContext = {
|
|
174
|
-
fileType:
|
|
175
|
-
fileName:
|
|
176
|
-
label:
|
|
171
|
+
fileType: 'component',
|
|
172
|
+
fileName: 'Navigation',
|
|
173
|
+
label: 'menu',
|
|
177
174
|
path: [0, 1],
|
|
178
175
|
};
|
|
179
176
|
const elementClass = generateElementClassName(ctx);
|
|
180
177
|
const interactiveStyles: InteractiveStyles = [
|
|
181
178
|
{
|
|
182
|
-
prefix:
|
|
183
|
-
postfix:
|
|
179
|
+
prefix: '#menu-toggle:checked ~ ',
|
|
180
|
+
postfix: '',
|
|
184
181
|
style: {
|
|
185
|
-
display:
|
|
182
|
+
display: 'block',
|
|
186
183
|
},
|
|
187
184
|
},
|
|
188
185
|
];
|
|
@@ -190,239 +187,219 @@ describe("generateInteractiveCSS", () => {
|
|
|
190
187
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
191
188
|
|
|
192
189
|
// Prefix selectors should come before the class
|
|
193
|
-
expect(css).toContain(
|
|
194
|
-
expect(css).toContain(
|
|
190
|
+
expect(css).toContain('#menu-toggle:checked ~ .c_navigation_menu');
|
|
191
|
+
expect(css).toContain('display: block');
|
|
195
192
|
});
|
|
196
193
|
|
|
197
|
-
test(
|
|
194
|
+
test('should handle prefix selector with complex sibling', () => {
|
|
198
195
|
const ctx: ElementClassContext = {
|
|
199
|
-
fileType:
|
|
200
|
-
fileName:
|
|
201
|
-
label:
|
|
196
|
+
fileType: 'component',
|
|
197
|
+
fileName: 'Accordion',
|
|
198
|
+
label: 'content',
|
|
202
199
|
path: [0, 0, 1],
|
|
203
200
|
};
|
|
204
201
|
const elementClass = generateElementClassName(ctx);
|
|
205
202
|
const interactiveStyles: InteractiveStyles = [
|
|
206
203
|
{
|
|
207
|
-
prefix:
|
|
208
|
-
postfix:
|
|
204
|
+
prefix: 'input:checked + label + ',
|
|
205
|
+
postfix: '',
|
|
209
206
|
style: {
|
|
210
|
-
maxHeight:
|
|
211
|
-
opacity:
|
|
207
|
+
maxHeight: '500px',
|
|
208
|
+
opacity: '1',
|
|
212
209
|
},
|
|
213
210
|
},
|
|
214
211
|
];
|
|
215
212
|
|
|
216
213
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
217
214
|
|
|
218
|
-
expect(css).toContain(
|
|
215
|
+
expect(css).toContain('input:checked + label + .c_accordion_content');
|
|
219
216
|
});
|
|
220
217
|
});
|
|
221
218
|
|
|
222
|
-
describe(
|
|
223
|
-
test(
|
|
219
|
+
describe('Responsive interactive styles', () => {
|
|
220
|
+
test('should generate responsive hover styles with breakpoints', () => {
|
|
224
221
|
const ctx: ElementClassContext = {
|
|
225
|
-
fileType:
|
|
226
|
-
fileName:
|
|
227
|
-
label:
|
|
222
|
+
fileType: 'page',
|
|
223
|
+
fileName: 'index',
|
|
224
|
+
label: 'hero-button',
|
|
228
225
|
path: [0, 0],
|
|
229
226
|
};
|
|
230
227
|
const elementClass = generateElementClassName(ctx);
|
|
231
228
|
const interactiveStyles: InteractiveStyles = [
|
|
232
229
|
{
|
|
233
|
-
postfix:
|
|
230
|
+
postfix: ':hover',
|
|
234
231
|
style: {
|
|
235
232
|
base: {
|
|
236
|
-
padding:
|
|
233
|
+
padding: '20px 40px',
|
|
237
234
|
},
|
|
238
235
|
tablet: {
|
|
239
|
-
padding:
|
|
236
|
+
padding: '16px 32px',
|
|
240
237
|
},
|
|
241
238
|
mobile: {
|
|
242
|
-
padding:
|
|
239
|
+
padding: '12px 24px',
|
|
243
240
|
},
|
|
244
241
|
} as ResponsiveStyleObject,
|
|
245
242
|
},
|
|
246
243
|
];
|
|
247
244
|
|
|
248
|
-
const css = generateInteractiveCSS(
|
|
249
|
-
elementClass,
|
|
250
|
-
interactiveStyles,
|
|
251
|
-
DEFAULT_BREAKPOINTS
|
|
252
|
-
);
|
|
245
|
+
const css = generateInteractiveCSS(elementClass, interactiveStyles, DEFAULT_BREAKPOINTS);
|
|
253
246
|
|
|
254
247
|
// Base styles
|
|
255
|
-
expect(css).toContain(
|
|
256
|
-
expect(css).toContain(
|
|
248
|
+
expect(css).toContain('.p_index_hero-button:hover');
|
|
249
|
+
expect(css).toContain('padding: 20px 40px');
|
|
257
250
|
|
|
258
251
|
// Tablet breakpoint
|
|
259
|
-
expect(css).toContain(
|
|
260
|
-
expect(css).toContain(
|
|
252
|
+
expect(css).toContain('@media (max-width: 1024px)');
|
|
253
|
+
expect(css).toContain('padding: 16px 32px');
|
|
261
254
|
|
|
262
255
|
// Mobile breakpoint
|
|
263
|
-
expect(css).toContain(
|
|
264
|
-
expect(css).toContain(
|
|
256
|
+
expect(css).toContain('@media (max-width: 540px)');
|
|
257
|
+
expect(css).toContain('padding: 12px 24px');
|
|
265
258
|
});
|
|
266
259
|
|
|
267
|
-
test(
|
|
260
|
+
test('should generate responsive styles for component element', () => {
|
|
268
261
|
const ctx: ElementClassContext = {
|
|
269
|
-
fileType:
|
|
270
|
-
fileName:
|
|
271
|
-
label:
|
|
262
|
+
fileType: 'component',
|
|
263
|
+
fileName: 'Card',
|
|
264
|
+
label: 'container',
|
|
272
265
|
path: [0],
|
|
273
266
|
};
|
|
274
267
|
const elementClass = generateElementClassName(ctx);
|
|
275
268
|
const interactiveStyles: InteractiveStyles = [
|
|
276
269
|
{
|
|
277
|
-
postfix:
|
|
270
|
+
postfix: ':hover',
|
|
278
271
|
style: {
|
|
279
272
|
base: {
|
|
280
|
-
boxShadow:
|
|
273
|
+
boxShadow: '0 8px 24px rgba(0,0,0,0.15)',
|
|
281
274
|
},
|
|
282
275
|
tablet: {
|
|
283
|
-
boxShadow:
|
|
276
|
+
boxShadow: '0 4px 12px rgba(0,0,0,0.1)',
|
|
284
277
|
},
|
|
285
278
|
} as ResponsiveStyleObject,
|
|
286
279
|
},
|
|
287
280
|
];
|
|
288
281
|
|
|
289
|
-
const css = generateInteractiveCSS(
|
|
290
|
-
elementClass,
|
|
291
|
-
interactiveStyles,
|
|
292
|
-
DEFAULT_BREAKPOINTS
|
|
293
|
-
);
|
|
282
|
+
const css = generateInteractiveCSS(elementClass, interactiveStyles, DEFAULT_BREAKPOINTS);
|
|
294
283
|
|
|
295
|
-
expect(css).toContain(
|
|
296
|
-
expect(css).toContain(
|
|
297
|
-
expect(css).toContain(
|
|
284
|
+
expect(css).toContain('.c_card_container:hover');
|
|
285
|
+
expect(css).toContain('box-shadow: 0 8px 24px rgba(0,0,0,0.15)');
|
|
286
|
+
expect(css).toContain('@media (max-width: 1024px)');
|
|
298
287
|
});
|
|
299
288
|
});
|
|
300
289
|
});
|
|
301
290
|
|
|
302
|
-
describe(
|
|
303
|
-
test(
|
|
291
|
+
describe('generateAllInteractiveCSS', () => {
|
|
292
|
+
test('should generate CSS for multiple page elements', () => {
|
|
304
293
|
const stylesMap = new Map<string, InteractiveStyles>();
|
|
305
294
|
|
|
306
295
|
// First element
|
|
307
296
|
const ctx1: ElementClassContext = {
|
|
308
|
-
fileType:
|
|
309
|
-
fileName:
|
|
310
|
-
label:
|
|
297
|
+
fileType: 'page',
|
|
298
|
+
fileName: 'index',
|
|
299
|
+
label: 'button1',
|
|
311
300
|
path: [0],
|
|
312
301
|
};
|
|
313
|
-
stylesMap.set(generateElementClassName(ctx1), [
|
|
314
|
-
{ postfix: ":hover", style: { backgroundColor: "primary" } },
|
|
315
|
-
]);
|
|
302
|
+
stylesMap.set(generateElementClassName(ctx1), [{ postfix: ':hover', style: { backgroundColor: 'primary' } }]);
|
|
316
303
|
|
|
317
304
|
// Second element
|
|
318
305
|
const ctx2: ElementClassContext = {
|
|
319
|
-
fileType:
|
|
320
|
-
fileName:
|
|
321
|
-
label:
|
|
306
|
+
fileType: 'page',
|
|
307
|
+
fileName: 'index',
|
|
308
|
+
label: 'button2',
|
|
322
309
|
path: [1],
|
|
323
310
|
};
|
|
324
|
-
stylesMap.set(generateElementClassName(ctx2), [
|
|
325
|
-
{ postfix: ":hover", style: { backgroundColor: "secondary" } },
|
|
326
|
-
]);
|
|
311
|
+
stylesMap.set(generateElementClassName(ctx2), [{ postfix: ':hover', style: { backgroundColor: 'secondary' } }]);
|
|
327
312
|
|
|
328
313
|
const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
|
|
329
314
|
|
|
330
|
-
expect(css).toContain(
|
|
331
|
-
expect(css).toContain(
|
|
332
|
-
expect(css).toContain(
|
|
333
|
-
expect(css).toContain(
|
|
315
|
+
expect(css).toContain('.p_index_button1:hover');
|
|
316
|
+
expect(css).toContain('.p_index_button2:hover');
|
|
317
|
+
expect(css).toContain('background-color: var(--primary)');
|
|
318
|
+
expect(css).toContain('background-color: var(--secondary)');
|
|
334
319
|
});
|
|
335
320
|
|
|
336
|
-
test(
|
|
321
|
+
test('should generate CSS for multiple component elements', () => {
|
|
337
322
|
const stylesMap = new Map<string, InteractiveStyles>();
|
|
338
323
|
|
|
339
324
|
// Component element 1
|
|
340
325
|
const ctx1: ElementClassContext = {
|
|
341
|
-
fileType:
|
|
342
|
-
fileName:
|
|
326
|
+
fileType: 'component',
|
|
327
|
+
fileName: 'Button',
|
|
343
328
|
path: [0],
|
|
344
329
|
};
|
|
345
|
-
stylesMap.set(generateElementClassName(ctx1), [
|
|
346
|
-
{ postfix: ":hover", style: { opacity: "0.9" } },
|
|
347
|
-
]);
|
|
330
|
+
stylesMap.set(generateElementClassName(ctx1), [{ postfix: ':hover', style: { opacity: '0.9' } }]);
|
|
348
331
|
|
|
349
332
|
// Component element 2
|
|
350
333
|
const ctx2: ElementClassContext = {
|
|
351
|
-
fileType:
|
|
352
|
-
fileName:
|
|
353
|
-
label:
|
|
334
|
+
fileType: 'component',
|
|
335
|
+
fileName: 'Card',
|
|
336
|
+
label: 'header',
|
|
354
337
|
path: [0, 0],
|
|
355
338
|
};
|
|
356
|
-
stylesMap.set(generateElementClassName(ctx2), [
|
|
357
|
-
{ postfix: ":hover", style: { color: "primary" } },
|
|
358
|
-
]);
|
|
339
|
+
stylesMap.set(generateElementClassName(ctx2), [{ postfix: ':hover', style: { color: 'primary' } }]);
|
|
359
340
|
|
|
360
341
|
const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
|
|
361
342
|
|
|
362
343
|
expect(css).toMatch(/\.c_button_\w+:hover/);
|
|
363
|
-
expect(css).toContain(
|
|
344
|
+
expect(css).toContain('.c_card_header:hover');
|
|
364
345
|
});
|
|
365
346
|
|
|
366
|
-
test(
|
|
347
|
+
test('should generate CSS for mixed page and component elements', () => {
|
|
367
348
|
const stylesMap = new Map<string, InteractiveStyles>();
|
|
368
349
|
|
|
369
350
|
// Page element
|
|
370
351
|
const pageCtx: ElementClassContext = {
|
|
371
|
-
fileType:
|
|
372
|
-
fileName:
|
|
373
|
-
label:
|
|
352
|
+
fileType: 'page',
|
|
353
|
+
fileName: 'about',
|
|
354
|
+
label: 'cta',
|
|
374
355
|
path: [0, 2],
|
|
375
356
|
};
|
|
376
|
-
stylesMap.set(generateElementClassName(pageCtx), [
|
|
377
|
-
{ postfix: ":hover", style: { transform: "scale(1.05)" } },
|
|
378
|
-
]);
|
|
357
|
+
stylesMap.set(generateElementClassName(pageCtx), [{ postfix: ':hover', style: { transform: 'scale(1.05)' } }]);
|
|
379
358
|
|
|
380
359
|
// Component element
|
|
381
360
|
const compCtx: ElementClassContext = {
|
|
382
|
-
fileType:
|
|
383
|
-
fileName:
|
|
384
|
-
label:
|
|
361
|
+
fileType: 'component',
|
|
362
|
+
fileName: 'Navigation',
|
|
363
|
+
label: 'link',
|
|
385
364
|
path: [0, 1],
|
|
386
365
|
};
|
|
387
|
-
stylesMap.set(generateElementClassName(compCtx), [
|
|
388
|
-
{ postfix: ":hover", style: { color: "primary" } },
|
|
389
|
-
]);
|
|
366
|
+
stylesMap.set(generateElementClassName(compCtx), [{ postfix: ':hover', style: { color: 'primary' } }]);
|
|
390
367
|
|
|
391
368
|
const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
|
|
392
369
|
|
|
393
370
|
// Should contain both page and component styles
|
|
394
|
-
expect(css).toContain(
|
|
395
|
-
expect(css).toContain(
|
|
371
|
+
expect(css).toContain('.p_about_cta:hover');
|
|
372
|
+
expect(css).toContain('.c_navigation_link:hover');
|
|
396
373
|
});
|
|
397
374
|
|
|
398
|
-
test(
|
|
375
|
+
test('should return empty string for empty map', () => {
|
|
399
376
|
const stylesMap = new Map<string, InteractiveStyles>();
|
|
400
377
|
|
|
401
378
|
const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
|
|
402
379
|
|
|
403
|
-
expect(css).toBe(
|
|
380
|
+
expect(css).toBe('');
|
|
404
381
|
});
|
|
405
382
|
});
|
|
406
383
|
|
|
407
|
-
describe(
|
|
384
|
+
describe('Interactive styles class consistency', () => {
|
|
408
385
|
/**
|
|
409
386
|
* These tests verify that the same element class is generated
|
|
410
387
|
* for the same component element regardless of where the component
|
|
411
388
|
* is placed on a page.
|
|
412
389
|
*/
|
|
413
|
-
describe(
|
|
414
|
-
test(
|
|
390
|
+
describe('Component path independence', () => {
|
|
391
|
+
test('same relative path produces same class for same component', () => {
|
|
415
392
|
// When a Button component is on a page, the root element
|
|
416
393
|
// should always get the same class regardless of page position
|
|
417
394
|
const ctx1: ElementClassContext = {
|
|
418
|
-
fileType:
|
|
419
|
-
fileName:
|
|
395
|
+
fileType: 'component',
|
|
396
|
+
fileName: 'Button',
|
|
420
397
|
path: [0], // Relative to component root
|
|
421
398
|
};
|
|
422
399
|
|
|
423
400
|
const ctx2: ElementClassContext = {
|
|
424
|
-
fileType:
|
|
425
|
-
fileName:
|
|
401
|
+
fileType: 'component',
|
|
402
|
+
fileName: 'Button',
|
|
426
403
|
path: [0], // Same relative path
|
|
427
404
|
};
|
|
428
405
|
|
|
@@ -432,45 +409,45 @@ describe("Interactive styles class consistency", () => {
|
|
|
432
409
|
expect(class1).toBe(class2);
|
|
433
410
|
});
|
|
434
411
|
|
|
435
|
-
test(
|
|
412
|
+
test('CSS can be generated once and reused for component instances', () => {
|
|
436
413
|
// Generate CSS for a component's interactive styles once
|
|
437
414
|
const ctx: ElementClassContext = {
|
|
438
|
-
fileType:
|
|
439
|
-
fileName:
|
|
440
|
-
label:
|
|
415
|
+
fileType: 'component',
|
|
416
|
+
fileName: 'Button',
|
|
417
|
+
label: 'root',
|
|
441
418
|
path: [0],
|
|
442
419
|
};
|
|
443
420
|
const elementClass = generateElementClassName(ctx);
|
|
444
421
|
|
|
445
422
|
const interactiveStyles: InteractiveStyles = [
|
|
446
|
-
{ postfix:
|
|
447
|
-
{ postfix:
|
|
423
|
+
{ postfix: ':hover', style: { backgroundColor: 'primary' } },
|
|
424
|
+
{ postfix: ':active', style: { backgroundColor: 'primary-dark' } },
|
|
448
425
|
];
|
|
449
426
|
|
|
450
427
|
const css = generateInteractiveCSS(elementClass, interactiveStyles);
|
|
451
428
|
|
|
452
429
|
// The CSS uses the component class, not page-specific classes
|
|
453
|
-
expect(css).toContain(
|
|
454
|
-
expect(css).toContain(
|
|
430
|
+
expect(css).toContain('.c_button_root:hover');
|
|
431
|
+
expect(css).toContain('.c_button_root:active');
|
|
455
432
|
|
|
456
433
|
// This CSS can be applied to any instance of the Button component
|
|
457
434
|
// because all instances will have the same element class
|
|
458
435
|
});
|
|
459
436
|
});
|
|
460
437
|
|
|
461
|
-
describe(
|
|
462
|
-
test(
|
|
438
|
+
describe('Page vs Component class differentiation', () => {
|
|
439
|
+
test('page and component elements with same name have different classes', () => {
|
|
463
440
|
const pageCtx: ElementClassContext = {
|
|
464
|
-
fileType:
|
|
465
|
-
fileName:
|
|
466
|
-
label:
|
|
441
|
+
fileType: 'page',
|
|
442
|
+
fileName: 'button', // Page named "button"
|
|
443
|
+
label: 'root',
|
|
467
444
|
path: [0],
|
|
468
445
|
};
|
|
469
446
|
|
|
470
447
|
const compCtx: ElementClassContext = {
|
|
471
|
-
fileType:
|
|
472
|
-
fileName:
|
|
473
|
-
label:
|
|
448
|
+
fileType: 'component',
|
|
449
|
+
fileName: 'button', // Component named "button"
|
|
450
|
+
label: 'root',
|
|
474
451
|
path: [0],
|
|
475
452
|
};
|
|
476
453
|
|
|
@@ -105,7 +105,7 @@ export interface ComponentProvider {
|
|
|
105
105
|
/** Schema info extracted from a page file */
|
|
106
106
|
export interface CMSSchemaInfo {
|
|
107
107
|
schema: CMSSchema;
|
|
108
|
-
pagePath: string;
|
|
108
|
+
pagePath: string; // Path to the page file containing this schema
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|