meno-core 1.0.54 → 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/bin/cli.ts +19 -205
- package/build-astro.ts +31 -27
- package/dist/bin/cli.js +15 -154
- package/dist/bin/cli.js.map +2 -2
- package/dist/chunks/{chunk-7HWQUVTU.js → chunk-2IIQK7T3.js} +1353 -347
- package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
- package/dist/chunks/{chunk-3XER4E5W.js → chunk-4ZRU52J2.js} +6 -5
- package/dist/chunks/{chunk-3XER4E5W.js.map → chunk-4ZRU52J2.js.map} +2 -2
- package/dist/chunks/{chunk-NVRBTSQG.js → chunk-5X4HCN7J.js} +4 -4
- package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
- package/dist/chunks/{chunk-FZITJSSS.js → chunk-7CCVOL5M.js} +14 -14
- package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
- package/dist/chunks/{chunk-HIZMY3EP.js → chunk-AR7LHIFY.js} +8 -2
- package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
- package/dist/chunks/{chunk-AE3QK5QW.js → chunk-NUP7H7D3.js} +31 -26
- package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
- package/dist/chunks/{chunk-5ETZFREW.js → chunk-QWTQZHG3.js} +186 -79
- package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
- package/dist/chunks/{chunk-STDY3OVM.js → chunk-XTKNX4FW.js} +3 -3
- package/dist/chunks/{chunk-STDY3OVM.js.map → chunk-XTKNX4FW.js.map} +2 -2
- package/dist/chunks/{fs-ZI5JEU7V.js → fs-G3ANWEFP.js} +2 -2
- package/dist/lib/client/index.js +381 -159
- package/dist/lib/client/index.js.map +3 -3
- package/dist/lib/server/index.js +14345 -6265
- package/dist/lib/server/index.js.map +4 -4
- package/dist/lib/shared/index.js +292 -87
- 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 +27 -21
- package/dist/lib/test-utils/index.js.map +2 -2
- package/lib/client/ErrorBoundary.test.tsx +147 -90
- package/lib/client/ErrorBoundary.tsx +8 -5
- package/lib/client/componentRegistry.ts +0 -1
- package/lib/client/core/ComponentBuilder.test.ts +150 -0
- package/lib/client/core/ComponentBuilder.ts +112 -12
- package/lib/client/core/ComponentRenderer.test.tsx +1 -2
- package/lib/client/core/builders/embedBuilder.ts +1 -1
- package/lib/client/core/builders/linkBuilder.ts +2 -2
- package/lib/client/core/builders/linkNodeBuilder.ts +1 -1
- package/lib/client/core/builders/listBuilder.ts +41 -4
- package/lib/client/core/builders/localeListBuilder.ts +2 -2
- package/lib/client/core/cmsTemplateProcessor.ts +1 -2
- package/lib/client/hmr/HMRManager.tsx +39 -30
- package/lib/client/hmrCssReload.ts +35 -6
- package/lib/client/hmrWebSocket.ts +5 -5
- package/lib/client/hooks/useColorVariables.ts +12 -9
- package/lib/client/hooks/usePropertyAutocomplete.ts +1 -1
- package/lib/client/hooks/useVariables.ts +3 -1
- package/lib/client/meno-filter/MenoFilter.test.ts +28 -28
- package/lib/client/meno-filter/MenoFilter.ts +9 -6
- package/lib/client/meno-filter/bindings.ts +3 -3
- package/lib/client/meno-filter/init.ts +3 -3
- package/lib/client/meno-filter/renderer.ts +8 -4
- package/lib/client/meno-filter/ui.ts +1 -1
- package/lib/client/meno-filter/updates.ts +3 -2
- package/lib/client/meno-filter/utils.ts +1 -1
- package/lib/client/navigation.test.ts +40 -44
- package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
- package/lib/client/responsiveStyleResolver.test.ts +5 -5
- package/lib/client/responsiveStyleResolver.ts +61 -4
- package/lib/client/routing/RouteLoader.test.ts +1 -1
- package/lib/client/routing/RouteLoader.ts +8 -3
- package/lib/client/routing/Router.tsx +181 -152
- package/lib/client/scripts/ScriptExecutor.ts +3 -3
- package/lib/client/services/PrefetchService.test.ts +1 -1
- package/lib/client/services/PrefetchService.ts +13 -5
- package/lib/client/styleProcessor.ts +9 -3
- package/lib/client/styles/StyleInjector.ts +1 -1
- package/lib/client/styles/UtilityClassCollector.ts +54 -13
- package/lib/client/templateEngine.test.ts +17 -23
- package/lib/client/templateEngine.ts +7 -13
- package/lib/client/theme.test.ts +1 -1
- package/lib/server/__integration__/server-lifecycle.test.ts +3 -1
- package/lib/server/__integration__/static-assets.test.ts +2 -2
- package/lib/server/__integration__/test-helpers.ts +3 -4
- package/lib/server/astro/cmsPageEmitter.ts +4 -5
- package/lib/server/astro/componentEmitter.ts +11 -8
- package/lib/server/astro/nodeToAstro.test.ts +4 -4
- package/lib/server/astro/nodeToAstro.ts +41 -36
- package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +11 -11
- package/lib/server/astro/normalizeOrphanTemplateProps.ts +7 -6
- package/lib/server/astro/pageEmitter.ts +1 -1
- package/lib/server/astro/templateTransformer.ts +3 -3
- package/lib/server/createServer.ts +2 -2
- package/lib/server/cssGenerator.ts +2 -2
- package/lib/server/fileWatcher.test.ts +41 -4
- package/lib/server/fileWatcher.ts +102 -23
- package/lib/server/index.ts +7 -16
- package/lib/server/jsonLoader.test.ts +3 -3
- package/lib/server/jsonLoader.ts +8 -5
- package/lib/server/middleware/cors.test.ts +1 -1
- package/lib/server/middleware/cors.ts +2 -2
- package/lib/server/middleware/errorHandler.test.ts +2 -2
- package/lib/server/middleware/logger.test.ts +3 -3
- package/lib/server/middleware/logger.ts +7 -7
- package/lib/server/migrateTemplates.ts +3 -3
- package/lib/server/projectContext.ts +1 -1
- package/lib/server/providers/fileSystemCMSProvider.test.ts +18 -4
- package/lib/server/providers/fileSystemCMSProvider.ts +27 -18
- package/lib/server/routes/api/cms.ts +1 -1
- package/lib/server/routes/api/colors.test.ts +2 -2
- package/lib/server/routes/api/components.ts +1 -1
- package/lib/server/routes/api/config.ts +3 -3
- package/lib/server/routes/api/core-routes.ts +2 -2
- package/lib/server/routes/api/enums.test.ts +2 -2
- package/lib/server/routes/api/functions.ts +1 -1
- package/lib/server/routes/api/variables.test.ts +2 -2
- package/lib/server/routes/index.ts +2 -2
- package/lib/server/routes/pages.ts +1 -2
- package/lib/server/routes/static.ts +1 -2
- package/lib/server/runtime/bundler.ts +65 -43
- package/lib/server/runtime/fs.ts +13 -13
- package/lib/server/runtime/httpServer.ts +3 -3
- package/lib/server/services/ColorService.test.ts +3 -3
- package/lib/server/services/ColorService.ts +5 -2
- package/lib/server/services/EnumService.test.ts +2 -2
- package/lib/server/services/EnumService.ts +4 -1
- package/lib/server/services/VariableService.test.ts +7 -7
- package/lib/server/services/VariableService.ts +5 -2
- package/lib/server/services/cmsService.test.ts +44 -44
- package/lib/server/services/cmsService.ts +17 -97
- package/lib/server/services/componentService.test.ts +10 -16
- package/lib/server/services/componentService.ts +20 -12
- package/lib/server/services/configService.test.ts +13 -14
- package/lib/server/services/configService.ts +30 -0
- package/lib/server/services/fileWatcherService.ts +2 -2
- package/lib/server/services/pageService.test.ts +7 -7
- package/lib/server/services/pageService.ts +18 -5
- package/lib/server/ssr/attributeBuilder.ts +2 -2
- package/lib/server/ssr/cmsSSRProcessor.ts +1 -2
- package/lib/server/ssr/errorOverlay.ts +1 -1
- package/lib/server/ssr/htmlGenerator.nonce.test.ts +6 -5
- package/lib/server/ssr/htmlGenerator.test.ts +0 -1
- package/lib/server/ssr/htmlGenerator.ts +7 -7
- package/lib/server/ssr/imageMetadata.ts +2 -2
- package/lib/server/ssr/jsCollector.test.ts +5 -5
- package/lib/server/ssr/liveReloadIntegration.test.ts +7 -8
- package/lib/server/ssr/ssrRenderer.branches.test.ts +9 -9
- package/lib/server/ssr/ssrRenderer.test.ts +125 -15
- package/lib/server/ssr/ssrRenderer.ts +206 -38
- package/lib/server/ssrRenderer.test.ts +6 -6
- package/lib/server/utils/jsonLineMapper.ts +7 -7
- package/lib/server/validateStyleCoverage.ts +0 -1
- package/lib/server/websocketManager.ts +12 -0
- package/lib/shared/breakpoints.test.ts +5 -5
- package/lib/shared/cmsQuery.test.ts +81 -0
- package/lib/shared/cmsQuery.ts +92 -0
- package/lib/shared/cmsQueryParser.ts +11 -7
- package/lib/shared/colorConversions.ts +9 -9
- package/lib/shared/colorVariableUtils.test.ts +22 -0
- package/lib/shared/colorVariableUtils.ts +19 -5
- package/lib/shared/constants.ts +4 -0
- package/lib/shared/cssGeneration.test.ts +23 -0
- package/lib/shared/cssGeneration.ts +40 -27
- package/lib/shared/cssProperties.test.ts +64 -64
- package/lib/shared/cssProperties.ts +2 -2
- package/lib/shared/elementClassName.ts +2 -2
- package/lib/shared/errorLogger.test.ts +12 -12
- package/lib/shared/expressionEvaluator.test.ts +27 -1
- package/lib/shared/expressionEvaluator.ts +9 -0
- package/lib/shared/fontLoader.test.ts +13 -13
- package/lib/shared/fontLoader.ts +2 -2
- package/lib/shared/gradientUtils.test.ts +2 -2
- package/lib/shared/gradientUtils.ts +15 -8
- package/lib/shared/hrefRefs.test.ts +2 -2
- package/lib/shared/hrefRefs.ts +1 -1
- package/lib/shared/i18n.test.ts +3 -3
- package/lib/shared/i18n.ts +5 -4
- package/lib/shared/index.ts +23 -0
- package/lib/shared/inlineSvgStyleRules.ts +12 -9
- package/lib/shared/interactiveStyleMappings.test.ts +21 -21
- package/lib/shared/interactiveStyleMappings.ts +2 -8
- package/lib/shared/itemTemplateUtils.test.ts +5 -5
- package/lib/shared/itemTemplateUtils.ts +9 -5
- package/lib/shared/jsonRepair.ts +8 -8
- package/lib/shared/libraryLoader.test.ts +6 -6
- 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/nodeUtils.test.ts +13 -9
- package/lib/shared/nodeUtils.ts +27 -4
- package/lib/shared/pathSecurity.ts +1 -1
- package/lib/shared/pathUtils.ts +1 -2
- package/lib/shared/paths/PathConverter.ts +3 -3
- package/lib/shared/paths/PathUtils.ts +4 -3
- package/lib/shared/paths/PathValidator.ts +1 -1
- package/lib/shared/permissions.test.ts +168 -0
- package/lib/shared/permissions.ts +162 -0
- package/lib/shared/propResolver.test.ts +1 -1
- package/lib/shared/propResolver.ts +1 -1
- package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +5 -3
- package/lib/shared/registry/ClientRegistry.ts +0 -1
- package/lib/shared/registry/ComponentRegistry.test.ts +3 -3
- package/lib/shared/registry/ComponentRegistry.ts +6 -1
- package/lib/shared/registry/NodeTypeDefinition.ts +2 -2
- package/lib/shared/registry/SSRRegistry.ts +0 -1
- package/lib/shared/registry/fieldPresets.ts +3 -1
- package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
- package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +1 -1
- package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
- package/lib/shared/registry/nodeTypes/ListNodeType.ts +43 -7
- package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
- package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +6 -1
- package/lib/shared/registry/nodeTypes/index.ts +16 -1
- package/lib/shared/responsiveScaling.test.ts +1 -3
- package/lib/shared/responsiveScaling.ts +6 -5
- package/lib/shared/responsiveStyleUtils.test.ts +0 -1
- package/lib/shared/richtext/htmlToTiptap.test.ts +116 -116
- package/lib/shared/richtext/htmlToTiptap.ts +1 -1
- package/lib/shared/styleNodeUtils.ts +17 -14
- package/lib/shared/themeDefaults.test.ts +0 -3
- package/lib/shared/tree/PathBuilder.test.ts +1 -7
- package/lib/shared/tree/PathBuilder.ts +15 -13
- package/lib/shared/treePathUtils.test.ts +49 -2
- package/lib/shared/treePathUtils.ts +40 -4
- package/lib/shared/types/api.ts +105 -7
- package/lib/shared/types/cms.test.ts +34 -0
- package/lib/shared/types/cms.ts +65 -13
- package/lib/shared/types/components.ts +24 -0
- package/lib/shared/types/errors.test.ts +1 -1
- package/lib/shared/types/index.ts +23 -0
- package/lib/shared/types/permissions.ts +139 -0
- package/lib/shared/types/variables.ts +3 -3
- package/lib/shared/utilityClassConfig.ts +103 -0
- package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
- package/lib/shared/utilityClassMapper.test.ts +253 -26
- package/lib/shared/utilityClassMapper.ts +160 -29
- package/lib/shared/utilityClassNames.test.ts +38 -0
- package/lib/shared/utilityClassNames.ts +155 -23
- 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 +1 -1
- package/lib/shared/validation/propValidator.ts +1 -1
- package/lib/shared/validation/schemas.test.ts +41 -0
- package/lib/shared/validation/schemas.ts +159 -13
- package/lib/shared/validation/validators.test.ts +2 -2
- package/lib/shared/viewportUnits.test.ts +13 -0
- package/lib/shared/viewportUnits.ts +12 -5
- package/lib/test-utils/factories/ConsoleMockFactory.ts +7 -7
- package/lib/test-utils/factories/DomMockFactory.ts +10 -4
- package/lib/test-utils/factories/ServerMockFactory.ts +1 -1
- package/lib/test-utils/factories/StoreMockFactory.ts +5 -5
- package/lib/test-utils/mockFactories.ts +1 -1
- package/lib/test-utils/mocks.ts +3 -3
- package/package.json +3 -5
- package/scripts/build-for-publish.mjs +2 -4
- package/scripts/build-meno-filter.ts +3 -3
- package/tsconfig.json +1 -0
- package/vite.config.ts +1 -1
- package/build-next.ts +0 -1374
- package/build-static.test.ts +0 -453
- package/build-static.ts +0 -1072
- package/dist/build-static.js +0 -37
- package/dist/chunks/chunk-2FN4UOVO.js +0 -6465
- package/dist/chunks/chunk-2FN4UOVO.js.map +0 -7
- package/dist/chunks/chunk-5ETZFREW.js.map +0 -7
- package/dist/chunks/chunk-7E4IF5L7.js +0 -245
- package/dist/chunks/chunk-7E4IF5L7.js.map +0 -7
- package/dist/chunks/chunk-7HWQUVTU.js.map +0 -7
- package/dist/chunks/chunk-AE3QK5QW.js.map +0 -7
- package/dist/chunks/chunk-F6KTJYGV.js +0 -322
- package/dist/chunks/chunk-F6KTJYGV.js.map +0 -7
- package/dist/chunks/chunk-FZITJSSS.js.map +0 -7
- package/dist/chunks/chunk-GSYYA5GX.js +0 -77
- package/dist/chunks/chunk-GSYYA5GX.js.map +0 -7
- package/dist/chunks/chunk-HIZMY3EP.js.map +0 -7
- package/dist/chunks/chunk-I2WEGYA7.js +0 -424
- package/dist/chunks/chunk-I2WEGYA7.js.map +0 -7
- package/dist/chunks/chunk-JNO3CNLJ.js +0 -464
- package/dist/chunks/chunk-JNO3CNLJ.js.map +0 -7
- package/dist/chunks/chunk-NVRBTSQG.js.map +0 -7
- package/dist/chunks/chunk-Q4OBWKXG.js +0 -1143
- package/dist/chunks/chunk-Q4OBWKXG.js.map +0 -7
- package/dist/chunks/chunk-QTE32Y53.js +0 -3829
- package/dist/chunks/chunk-QTE32Y53.js.map +0 -7
- package/dist/chunks/configService-PRJZF7Y6.js +0 -14
- package/dist/chunks/configService-PRJZF7Y6.js.map +0 -7
- package/dist/chunks/constants-KIQEYMAM.js +0 -46
- package/dist/chunks/constants-KIQEYMAM.js.map +0 -7
- package/dist/chunks/fs-ZI5JEU7V.js.map +0 -7
- package/dist/entries/server-router.js +0 -62
- package/dist/entries/server-router.js.map +0 -7
- package/entries/server-router.tsx +0 -75
- package/lib/server/providers/fileSystemPageProvider.test.ts +0 -84
- package/lib/server/providers/fileSystemPageProvider.ts +0 -179
- package/lib/server/webflow/buildWebflow.ts +0 -623
- package/lib/server/webflow/index.ts +0 -23
- package/lib/server/webflow/nodeToWebflow.test.ts +0 -3102
- package/lib/server/webflow/nodeToWebflow.ts +0 -2372
- package/lib/server/webflow/styleMapper.test.ts +0 -348
- package/lib/server/webflow/styleMapper.ts +0 -687
- package/lib/server/webflow/templateWrapper.ts +0 -49
- package/lib/server/webflow/types.ts +0 -389
- /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/shared/fontCss.ts", "../../lib/shared/logger.ts", "../../lib/shared/types/components.ts", "../../lib/shared/types/errors.ts", "../../lib/shared/types/colors.ts", "../../lib/shared/types/variables.ts", "../../lib/shared/types/comment.ts", "../../lib/shared/types/permissions.ts", "../../lib/shared/slugify.ts", "../../lib/shared/slugTranslator.ts", "../../lib/shared/libraryLoader.ts", "../../lib/shared/pathSecurity.ts", "../../lib/shared/componentRefs.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Pure `@font-face` / preload generation from a list of font configs.\n *\n * No filesystem or project-context coupling \u2014 the caller passes the `fonts`\n * array (read however it likes). This is the single source of truth for font\n * CSS formatting, shared by every renderer:\n * - meno-core SSR \u2192 via {@link ../shared/fontLoader} (cached config)\n * - meno-core JSON\u2192Astro \u2192 build-astro.ts\n * - meno-astro dialect twin \u2192 meno-astro/server `loadFontCss` \u2192 BaseLayout.astro\n *\n * Keeping it server-free means the Astro `BaseLayout` can import it without\n * dragging meno-core's server runtime into the build.\n */\n\nexport interface FontConfig {\n path: string;\n family?: string;\n weight?: number;\n weightMax?: number; // If set, font is variable with weight range [weight, weightMax]\n style?: 'normal' | 'italic';\n fontDisplay?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n unicodeRange?: string;\n /** Legacy alias for `path` (emitted by the website-import flow). */\n src?: string;\n}\n\n/** Detect the `@font-face` `format()` value from a file extension. */\nfunction getFontFormat(path: string): string {\n if (path.endsWith('.woff2')) return 'woff2';\n if (path.endsWith('.woff')) return 'woff';\n if (path.endsWith('.ttf')) return 'truetype';\n if (path.endsWith('.otf')) return 'opentype';\n return 'truetype';\n}\n\n/** Font `type` attribute for a `<link rel=\"preload\">`. */\nfunction getFontMimeType(path: string): string {\n if (path.endsWith('.woff2')) return 'font/woff2';\n if (path.endsWith('.woff')) return 'font/woff';\n if (path.endsWith('.ttf')) return 'font/ttf';\n if (path.endsWith('.otf')) return 'font/otf';\n return 'font/ttf';\n}\n\n/**\n * Derive a family name from a path when none is configured.\n * Example: \"/fonts/geomanist-regular.ttf\" -> \"Geomanist Regular\".\n */\nexport function extractFamilyName(path: string): string {\n const filename = path.split('/').pop() || 'Font';\n const name = filename.replace(/\\.(ttf|woff2?|otf)$/i, '');\n return name\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\n/** Build the `@font-face` rules for the given fonts (empty string for none). */\nexport function fontFaceCss(fonts: FontConfig[]): string {\n return (fonts || [])\n .filter((font) => font.path || font.src)\n .map((font) => {\n // Support both \"path\" (standard) and \"src\" (legacy from website import)\n const fontPath = (font.path || font.src) as string;\n const format = getFontFormat(fontPath);\n const family = font.family || extractFamilyName(fontPath);\n const weight = font.weight ?? 400;\n const weightMax = font.weightMax;\n const style = font.style ?? 'normal';\n const fontDisplay = font.fontDisplay;\n\n // Variable fonts use weight range syntax: \"100 900\"\n const fontWeight = weightMax != null ? `${weight} ${weightMax}` : weight;\n const unicodeRange = font.unicodeRange;\n\n return `@font-face {\n font-family: '${family}';\n src: url('${fontPath}') format('${format}');\n font-weight: ${fontWeight};\n font-style: ${style};${fontDisplay ? `\\n font-display: ${fontDisplay};` : ''}${unicodeRange ? `\\n unicode-range: ${unicodeRange};` : ''}\n}`;\n })\n .join('\\n\\n');\n}\n\n/**\n * Build `<link rel=\"preload\">` tags for the given fonts (empty string for none).\n * `crossorigin` is required for the preloaded font to be reused by the CSS.\n */\nexport function fontPreloadLinks(fonts: FontConfig[]): string {\n if (!fonts || fonts.length === 0) return '';\n\n return fonts\n .filter((font) => font.path || font.src)\n .map((font) => {\n const fontPath = (font.path || font.src) as string;\n const mimeType = getFontMimeType(fontPath);\n return `<link rel=\"preload\" href=\"${fontPath}\" as=\"font\" type=\"${mimeType}\" crossorigin>`;\n })\n .join('\\n ');\n}\n", "/**\n * Leveled logger \u2014 the single console abstraction for Meno runtime/server code.\n *\n * Why: the codebase had hundreds of raw `console.*` calls with no way to gate\n * verbosity in the field (a packaged desktop app emits everything, with no level\n * control and no telemetry path). This module adds:\n * - levels (silent < error < warn < info < debug), gated by `MENO_LOG_LEVEL`\n * (or `NODE_ENV`: `production` \u2192 warn, otherwise \u2192 debug);\n * - per-scope loggers (`createLogger('AstroProvider')`) that prefix messages;\n * - a pluggable sink (`setLogSink`) so the Electron main process / telemetry can\n * capture logs and crashes instead of (or in addition to) the console.\n *\n * Isomorphic: works in Node and the browser. Error reporting still flows through\n * `errorLogger` (`logRuntimeError`/`logNetworkError`); this is for general\n * debug/info/warn/error console output.\n */\n\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';\n\nconst LEVEL_RANK: Record<LogLevel, number> = { silent: 0, error: 1, warn: 2, info: 3, debug: 4 };\n\n/** A record forwarded to the sink for every emitted log line. */\nexport interface LogRecord {\n level: Exclude<LogLevel, 'silent'>;\n scope: string;\n message: string;\n args: unknown[];\n timestamp: number;\n}\n\ntype LogSink = (record: LogRecord) => void;\n\nlet sink: LogSink | null = null;\n\n/** Install a sink (telemetry / Electron capture). Pass `null` to remove. */\nexport function setLogSink(next: LogSink | null): void {\n sink = next;\n}\n\nfunction defaultLevel(): LogLevel {\n const env = typeof process !== 'undefined' ? process.env : undefined;\n const explicit = env?.MENO_LOG_LEVEL?.toLowerCase();\n if (explicit && explicit in LEVEL_RANK) return explicit as LogLevel;\n return env?.NODE_ENV === 'production' ? 'warn' : 'debug';\n}\n\nlet currentLevel: LogLevel = defaultLevel();\n\n/** Override the active level at runtime (e.g. a debug toggle in the app). */\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level;\n}\n\n/** The active level (resolved from env at module load unless overridden). */\nexport function getLogLevel(): LogLevel {\n return currentLevel;\n}\n\nconst CONSOLE: Record<Exclude<LogLevel, 'silent'>, (...a: unknown[]) => void> = {\n error: (...a) => console.error(...a),\n warn: (...a) => console.warn(...a),\n info: (...a) => console.info(...a),\n debug: (...a) => console.debug(...a),\n};\n\nfunction emit(level: Exclude<LogLevel, 'silent'>, scope: string, message: string, args: unknown[]): void {\n if (LEVEL_RANK[level] > LEVEL_RANK[currentLevel]) return;\n const prefix = scope ? `[${scope}]` : '';\n CONSOLE[level](`${prefix} ${message}`.trimStart(), ...args);\n sink?.({ level, scope, message, args, timestamp: Date.now() });\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n /** A child logger nested under this scope (`parent:child`). */\n child(scope: string): Logger;\n}\n\n/** Create a scoped logger. `scope` is prefixed to every line and forwarded to the sink. */\nexport function createLogger(scope = ''): Logger {\n return {\n debug: (message, ...args) => emit('debug', scope, message, args),\n info: (message, ...args) => emit('info', scope, message, args),\n warn: (message, ...args) => emit('warn', scope, message, args),\n error: (message, ...args) => emit('error', scope, message, args),\n child: (childScope) => createLogger(scope ? `${scope}:${childScope}` : childScope),\n };\n}\n\n/** A default unscoped logger for ad-hoc use. Prefer a scoped `createLogger('Area')`. */\nexport const logger = createLogger();\n", "/**\n * Component Definition Types\n * Improved type safety with stricter types\n */\n\nimport type { ComponentNode } from './nodes';\nimport type { LibrariesConfig } from './libraries';\n\n/**\n * Prop type definitions\n */\nexport type PropType = 'string' | 'select' | 'boolean' | 'number' | 'link' | 'file' | 'rich-text' | 'embed' | 'list';\n\n/**\n * Project-level enum configuration\n * Keys are enum names, values are arrays of options\n */\nexport type EnumsConfig = Record<string, readonly string[]>;\n\n/**\n * Internationalization (i18n) value object\n * Keys are locale codes (e.g., 'en', 'pl', 'de')\n * Values can be strings (for string props) or arrays (for list props)\n */\nexport interface I18nValue {\n _i18n: true;\n [locale: string]: string | unknown[] | true; // true is for the _i18n marker, arrays for list props\n}\n\n/**\n * Locale configuration with metadata\n */\nexport interface LocaleConfig {\n code: string; // URL prefix & translation key (e.g., \"en\", \"pl\")\n name: string; // English name for admin UI (e.g., \"Polish\")\n nativeName: string; // Native name for public UI (e.g., \"Polski\")\n langTag: string; // BCP 47 language tag for SEO (e.g., \"pl-PL\")\n icon?: string; // Optional flag icon path (e.g., \"/icons/flag-en.svg\")\n}\n\n/**\n * Internationalization configuration\n */\nexport interface I18nConfig {\n defaultLocale: string;\n locales: LocaleConfig[];\n}\n\n/**\n * Value resolver function type\n * Used for transforming field values (e.g., i18n resolution)\n */\nexport type ValueResolver = (value: unknown) => unknown;\n\n/**\n * Link prop value type\n */\nexport interface LinkPropValue {\n href: string;\n target?: '_blank';\n}\n\n/**\n * Base prop definition without list-specific fields\n */\nexport interface BasePropDefinition {\n type: Exclude<PropType, 'list'>;\n default?: string | number | boolean | I18nValue | LinkPropValue;\n options?: readonly string[]; // Required for \"select\" type (inline options)\n enumName?: string; // For \"select\" type: reference to project-level enum\n accept?: string; // For \"file\" type: MIME pattern like \"image/*\", \"video/*\"\n editor?: 'basic' | 'extended'; // For 'rich-text' type: which editor to use\n}\n\n/**\n * List item schema - defines the structure of each item in a list prop\n * Uses the same prop types as component interfaces (except nested lists)\n */\nexport type ListItemSchema = Record<string, BasePropDefinition>;\n\n/**\n * List item value type\n * Supports i18n values for localized string fields\n */\nexport type ListItemValue = Record<string, string | number | boolean | LinkPropValue | I18nValue | null>;\n\n/**\n * List prop definition - for array/list data\n */\nexport interface ListPropDefinition {\n type: 'list';\n /** Schema defining the structure of each list item */\n itemSchema: ListItemSchema;\n /** Default value is an array of items */\n default?: ListItemValue[];\n}\n\n/**\n * Prop definition with improved type safety\n */\nexport type PropDefinition = BasePropDefinition | ListPropDefinition;\n\n/**\n * Type guard to check if a prop definition is a list type\n */\nexport function isListPropDefinition(def: PropDefinition): def is ListPropDefinition {\n return def.type === 'list';\n}\n\n/**\n * Type guard to check if a prop definition is a base (non-list) type\n */\nexport function isBasePropDefinition(def: PropDefinition): def is BasePropDefinition {\n return def.type !== 'list';\n}\n\n/**\n * Structured component definition\n */\nexport interface StructuredComponentDefinition {\n interface?: Record<string, PropDefinition>;\n structure?: ComponentNode;\n javascript?: string; // Vanilla JS code to be rendered at end of HTML\n css?: string; // CSS code to be rendered in <style> tag in <head>\n category?: string; // Component category for organization\n /**\n * Define which props are available as JavaScript variables (Astro-style define:vars)\n * - true: all props from interface are exposed\n * - string[]: only specified props are exposed\n * - undefined: no automatic prop injection (backward compatible)\n */\n defineVars?: true | string[];\n /** External JS/CSS libraries required by this component */\n libraries?: LibrariesConfig;\n /** Whether instances of this component can have styles applied to the wrapper */\n acceptsStyles?: boolean;\n /**\n * Verbatim frontmatter passthrough \u2014 hand-authored `.astro` frontmatter statements the\n * codec can't model (foreign `import`s, helper `const`/`function`s, `import.meta.env`\n * access, etc.). Captured byte-for-byte on parse and re-emitted unchanged so a component\n * carrying arbitrary frontmatter round-trips. Emit-side it is appended after the\n * generated frontmatter consts. See the dialect spec \u00A710 (escape hatches).\n */\n _frontmatter?: string;\n}\n\n/**\n * Component definition\n * Supports both new format (just component) and legacy format (type/props/children/component)\n */\nexport interface ComponentDefinition {\n type?: string; // Legacy format\n props?: Record<string, unknown>; // Legacy format\n children?: unknown[]; // Legacy format\n component: StructuredComponentDefinition;\n}\n\n/**\n * Line range for element line number tracking\n */\nexport interface LineRange {\n startLine: number;\n endLine: number;\n}\n\n/**\n * JSON page structure\n */\nexport interface JSONPage {\n meta?: import('./api').PageMetaData;\n components?: Record<string, ComponentDefinition>;\n root?: ComponentNode;\n _lineMap?: Record<string, LineRange>;\n /**\n * Verbatim frontmatter passthrough \u2014 hand-authored `.astro` frontmatter statements the\n * codec can't model (foreign `import`s, top-level `const`/`function`s, `getStaticPaths`\n * helpers, `import.meta.env` access, etc.). Captured byte-for-byte on parse and re-emitted\n * unchanged so a page carrying arbitrary frontmatter round-trips instead of being flagged\n * read-only. Emit-side it is appended after the generated `const meta`/frontmatter consts.\n * See the dialect spec \u00A710 (escape hatches).\n */\n _frontmatter?: string;\n /**\n * Set when the source file renders under Astro but is outside the meno-astro dialect\n * (can't be modeled into a node tree) \u2014 e.g. a hand-authored SSR page with arbitrary\n * frontmatter. The editor shows a read-only info state instead of a (lossy) tree, and the\n * Astro page provider's save() no-ops to protect the hand-authored source from clobber.\n */\n _unsupported?: { reason: string };\n}\n\n/**\n * Page data type that can be either a JSONPage or a component definition structure\n */\nexport type PageData =\n | JSONPage\n | {\n component: {\n structure?: ComponentNode;\n interface?: Record<string, PropDefinition>;\n javascript?: string;\n css?: string;\n acceptsStyles?: boolean;\n };\n };\n\n/**\n * Page data with component structure (for type narrowing)\n */\nexport interface PageDataWithComponent {\n component: {\n structure?: ComponentNode;\n interface?: Record<string, PropDefinition>;\n javascript?: string;\n css?: string;\n libraries?: LibrariesConfig;\n acceptsStyles?: boolean;\n };\n}\n", "/**\n * Error Types\n * Structured error types for validation and type safety\n */\n\n/**\n * Validation error with context\n */\nexport interface ValidationError {\n path?: string;\n message: string;\n receivedValue?: unknown;\n expectedType?: string;\n}\n\n/**\n * Type safety error\n * Errors from type mismatches or invalid data structures\n */\nexport interface TypeSafetyError extends Error {\n readonly path?: string;\n readonly receivedValue?: unknown;\n readonly expectedType?: string;\n}\n\n/**\n * Result type for operations that can fail\n * Replaces null returns with explicit success/failure\n */\nexport type Result<T> = { success: true; data: T } | { success: false; error: ValidationError };\n\n/**\n * Create a validation error\n */\nexport function createValidationError(\n message: string,\n options?: {\n path?: string;\n receivedValue?: unknown;\n expectedType?: string;\n },\n): ValidationError {\n return {\n message,\n ...options,\n };\n}\n\n/**\n * Create a type safety error\n */\nexport function createTypeSafetyError(\n message: string,\n options?: {\n path?: string;\n receivedValue?: unknown;\n expectedType?: string;\n },\n): TypeSafetyError {\n const error = new Error(message) as TypeSafetyError;\n Object.defineProperty(error, 'path', { value: options?.path, writable: false });\n Object.defineProperty(error, 'receivedValue', { value: options?.receivedValue, writable: false });\n Object.defineProperty(error, 'expectedType', { value: options?.expectedType, writable: false });\n return error;\n}\n", "/**\n * Color Variables Types\n * Handles color variable definitions and configuration\n */\n\n/**\n * Color variables configuration\n * Maps semantic color names to their hex/rgb values\n */\nexport interface ColorVariables {\n colors: Record<string, string>;\n}\n\n/**\n * Theme configuration with color set and metadata\n */\nexport interface Theme {\n label: string;\n colors: Record<string, string>;\n}\n\n/**\n * Theme configuration file structure\n * Supports multiple named themes with a default theme\n */\nexport interface ThemeConfig {\n default: string;\n palette?: Record<string, string>;\n themes: Record<string, Theme>;\n}\n\n/**\n * Resolve a color value through the palette.\n * If value matches a palette key, returns the palette hex; otherwise returns value as-is.\n */\nexport function resolvePaletteColor(value: string, palette?: Record<string, string>): string {\n if (!palette) return value;\n return palette[value] ?? value;\n}\n\n/**\n * Color variable entry for editor display\n */\nexport interface ColorVariableEntry {\n name: string;\n value: string;\n}\n\n/**\n * Theme entry for theme selector\n */\nexport interface ThemeEntry {\n name: string;\n label: string;\n}\n", "/**\n * CSS Variables Types\n * Defines types for the variables.json configuration file\n */\n\n/**\n * Category type for a CSS variable\n * Maps to responsiveScales categories for automatic responsive scaling\n * 'none' means no responsive scaling is applied\n */\nexport type VariableType = 'fontSize' | 'padding' | 'margin' | 'gap' | 'borderRadius' | 'size' | 'none';\n\n/**\n * UI filtering group for a CSS variable.\n * Controls which variables appear in the picker based on the CSS property being edited.\n */\nexport type VariableGroup =\n | 'font-family'\n | 'font-size'\n | 'font-weight'\n | 'line-height'\n | 'letter-spacing'\n | 'margin'\n | 'padding'\n | 'gap'\n | 'size'\n | 'position'\n | 'border-radius'\n | 'border-width'\n | 'outline'\n | 'shadow'\n | 'filter'\n | 'duration'\n | 'aspect-ratio'\n | 'opacity'\n | 'z-index'\n | 'text-align'\n | 'other';\n\n/** Predefined variable groups for UI dropdowns */\nexport const VARIABLE_GROUPS: { value: VariableGroup; label: string }[] = [\n { value: 'font-family', label: 'Font Family' },\n { value: 'font-size', label: 'Font Size' },\n { value: 'font-weight', label: 'Font Weight' },\n { value: 'line-height', label: 'Line Height' },\n { value: 'letter-spacing', label: 'Letter Spacing' },\n { value: 'margin', label: 'Margin' },\n { value: 'padding', label: 'Padding' },\n { value: 'gap', label: 'Gap' },\n { value: 'size', label: 'Size' },\n { value: 'position', label: 'Position' },\n { value: 'border-radius', label: 'Border Radius' },\n { value: 'border-width', label: 'Border Width' },\n { value: 'outline', label: 'Outline' },\n { value: 'shadow', label: 'Shadow' },\n { value: 'filter', label: 'Filter' },\n { value: 'duration', label: 'Duration' },\n { value: 'aspect-ratio', label: 'Aspect Ratio' },\n { value: 'opacity', label: 'Opacity' },\n { value: 'z-index', label: 'Z-Index' },\n { value: 'text-align', label: 'Text Align' },\n { value: 'other', label: 'Other' },\n];\n\n/** All valid group string values */\nexport const VARIABLE_GROUP_VALUES: VariableGroup[] = VARIABLE_GROUPS.map((g) => g.value);\n\n/** Maps CSS property names to variable groups */\nconst CSS_PROPERTY_TO_GROUP: Record<string, VariableGroup> = {\n 'font-family': 'font-family',\n 'font-size': 'font-size',\n 'font-weight': 'font-weight',\n 'line-height': 'line-height',\n 'letter-spacing': 'letter-spacing',\n 'text-align': 'text-align',\n opacity: 'opacity',\n 'z-index': 'z-index',\n top: 'position',\n right: 'position',\n bottom: 'position',\n left: 'position',\n inset: 'position',\n 'inset-block': 'position',\n 'inset-inline': 'position',\n 'inset-block-start': 'position',\n 'inset-block-end': 'position',\n 'inset-inline-start': 'position',\n 'inset-inline-end': 'position',\n 'box-shadow': 'shadow',\n 'text-shadow': 'shadow',\n filter: 'filter',\n 'backdrop-filter': 'filter',\n 'aspect-ratio': 'aspect-ratio',\n 'transition-duration': 'duration',\n 'animation-duration': 'duration',\n 'transition-delay': 'duration',\n 'animation-delay': 'duration',\n};\n\n/** Prefix-based mappings for CSS properties */\nconst CSS_PROPERTY_PREFIX_GROUPS: { prefix: string; group: VariableGroup }[] = [\n { prefix: 'margin', group: 'margin' },\n { prefix: 'padding', group: 'padding' },\n { prefix: 'gap', group: 'gap' },\n { prefix: 'row-gap', group: 'gap' },\n { prefix: 'column-gap', group: 'gap' },\n { prefix: 'width', group: 'size' },\n { prefix: 'height', group: 'size' },\n { prefix: 'min-width', group: 'size' },\n { prefix: 'max-width', group: 'size' },\n { prefix: 'min-height', group: 'size' },\n { prefix: 'max-height', group: 'size' },\n { prefix: 'border-radius', group: 'border-radius' },\n { prefix: 'border-top-left-radius', group: 'border-radius' },\n { prefix: 'border-top-right-radius', group: 'border-radius' },\n { prefix: 'border-bottom-left-radius', group: 'border-radius' },\n { prefix: 'border-bottom-right-radius', group: 'border-radius' },\n { prefix: 'border-width', group: 'border-width' },\n { prefix: 'border-top-width', group: 'border-width' },\n { prefix: 'border-right-width', group: 'border-width' },\n { prefix: 'border-bottom-width', group: 'border-width' },\n { prefix: 'border-left-width', group: 'border-width' },\n { prefix: 'outline-width', group: 'outline' },\n { prefix: 'outline-offset', group: 'outline' },\n];\n\n/**\n * Determines which variable group a CSS property belongs to.\n * Returns null if no group matches (show all variables).\n */\nexport function getGroupForProperty(prop: string): VariableGroup | null {\n // Normalize camelCase to kebab-case (e.g., \"fontFamily\" \u2192 \"font-family\")\n const normalized = prop.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n\n // Exact match first\n if (normalized in CSS_PROPERTY_TO_GROUP) {\n return CSS_PROPERTY_TO_GROUP[normalized] ?? null;\n }\n // Prefix-based match (handles margin-top, padding-left, etc.)\n for (const { prefix, group } of CSS_PROPERTY_PREFIX_GROUPS) {\n if (normalized === prefix || normalized.startsWith(`${prefix}-`)) {\n return group;\n }\n }\n return null;\n}\n\n/**\n * A single CSS custom property definition\n */\nexport interface CSSVariable {\n /** Display name (e.g., \"H1 Font Size\") */\n name: string;\n /** Optional prop name alias for organizational purposes */\n prop_name?: string;\n /** CSS custom property name (e.g., \"--h1-fs\") */\n cssVar: string;\n /** Base value (e.g., \"48px\") */\n value: string;\n /** Category for responsive scaling */\n type: VariableType;\n /** Optional per-variable breakpoint scale overrides */\n scales?: Record<string, string>;\n /** Optional UI filtering group for the variable picker */\n group?: VariableGroup;\n}\n\n/**\n * Variables configuration file structure (variables.json)\n */\nexport interface VariablesConfig {\n variables: CSSVariable[];\n}\n\n/** Predefined variable scaling types for UI dropdowns */\nexport const VARIABLE_TYPES: { value: VariableType; label: string }[] = [\n { value: 'fontSize', label: 'Font Size' },\n { value: 'padding', label: 'Padding' },\n { value: 'margin', label: 'Margin' },\n { value: 'gap', label: 'Gap' },\n { value: 'borderRadius', label: 'Border Radius' },\n { value: 'size', label: 'Width / Height' },\n { value: 'none', label: 'None' },\n];\n\n/** All valid variable scaling type values */\nexport const VARIABLE_TYPE_VALUES: VariableType[] = VARIABLE_TYPES.map((t) => t.value);\n\n/**\n * Returns an abbreviation for a variable group by taking the first letter of each word.\n * e.g. 'letter-spacing' -> 'ls', 'font-size' -> 'fs', 'spacing' -> 's'\n */\nexport function getGroupAbbreviation(group: string): string {\n return group\n .split('-')\n .map((w) => w[0] || '')\n .join('');\n}\n\n/**\n * Infers a default scaling type from a variable group and optional CSS property.\n */\nexport function getDefaultScalingType(group: string, _cssProperty?: string): VariableType {\n if (group === 'font-size') return 'fontSize';\n if (group === 'margin') return 'margin';\n if (group === 'padding') return 'padding';\n if (group === 'gap') return 'gap';\n if (group === 'border-radius') return 'borderRadius';\n if (group === 'size') return 'size';\n return 'none';\n}\n\n/**\n * Generates a short CSS variable name with collision detection.\n * e.g. name=\"Heading\", group=\"letter-spacing\" -> \"--h-ls\"\n * If taken, extends prefix: \"--he-ls\", \"--hea-ls\", etc.\n */\nexport function generateShortCssVar(name: string, group: string, existingVariables: CSSVariable[]): string {\n const trimmed = name.trim();\n if (!trimmed) return '--';\n if (!group) {\n // No group: just kebab-case the name\n const base =\n '--' +\n trimmed\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n return ensureUnique(base, existingVariables);\n }\n\n const groupAbbr = getGroupAbbreviation(group);\n const kebabName = trimmed\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n const words = kebabName.split('-').filter(Boolean);\n const existingNames = new Set(existingVariables.map((v) => v.cssVar));\n\n // Try progressively longer prefixes from the name\n // Start with first letter of each word, then extend first word\n const initials = words.map((w) => w[0] || '').join('');\n const initialCandidate = `--${initials}-${groupAbbr}`;\n if (!existingNames.has(initialCandidate)) return initialCandidate;\n\n // Extend first word progressively\n const firstWord = words[0] || '';\n for (let len = 2; len <= firstWord.length; len++) {\n const prefix =\n firstWord.slice(0, len) +\n (words.length > 1\n ? words\n .slice(1)\n .map((w) => w[0] || '')\n .join('')\n : '');\n const candidate = `--${prefix}-${groupAbbr}`;\n if (!existingNames.has(candidate)) return candidate;\n }\n\n // Full kebab name with group abbreviation\n const fullCandidate = `--${kebabName}-${groupAbbr}`;\n if (!existingNames.has(fullCandidate)) return fullCandidate;\n\n // Numeric suffix fallback\n let i = 2;\n while (existingNames.has(`${fullCandidate}-${i}`)) i++;\n return `${fullCandidate}-${i}`;\n}\n\nfunction ensureUnique(base: string, existingVariables: CSSVariable[]): string {\n const existingNames = new Set(existingVariables.map((v) => v.cssVar));\n if (!existingNames.has(base)) return base;\n let i = 2;\n while (existingNames.has(`${base}-${i}`)) i++;\n return `${base}-${i}`;\n}\n", "/**\n * Comment / Pin Types\n *\n * Comments are Figma-style pins placed on components in the studio canvas.\n * One file per pin (thread embedded). Storage layout (status as top folder):\n * {projectRoot}/comments/<status>/<pageSlug>--<seq>--<titleSlug>.json\n * e.g. comments/open/blog__post--3--hero-is-too-dark.json\n *\n * Pins are an authoring-time concept \u2014 they live in studio only.\n */\n\n/** Workflow status. No custom statuses for MVP. */\nexport type CommentStatus = 'open' | 'in-progress' | 'ready-for-review' | 'resolved' | 'closed';\n\nexport const COMMENT_STATUSES: readonly CommentStatus[] = [\n 'open',\n 'in-progress',\n 'ready-for-review',\n 'resolved',\n 'closed',\n] as const;\n\n/** Identifies the GitHub user who authored a thread entry. */\nexport interface CommentAuthor {\n /** GitHub login. `\"local\"` for non-electron / unauthenticated runs. */\n login: string;\n name?: string;\n avatarUrl?: string;\n}\n\n/**\n * Identity fingerprint for the anchored node \u2014 used to detect orphan pins\n * when the tree shifts. Mirrors the shape of `nodesMatch()` in NodeStore.\n */\nexport interface CommentNodeIdentity {\n /** `'component'` or `'node'` (HTML). */\n kind: 'component' | 'node';\n /** Component name (when kind=component) or HTML tag (when kind=node). */\n name: string;\n /** Editor-set label, used to disambiguate same-type siblings. */\n label?: string;\n}\n\n/**\n * One step of a {@link CommentAnchor.nodeRef}: a node addressed by its TYPE and\n * its occurrence among same-type siblings, rather than its raw child index. E.g.\n * `{ kind:'component', name:'HomeProducts', nth:0 }` = \"the first HomeProducts\n * under this parent\". Move-invariant: reordering/inserting/deleting siblings of\n * OTHER types doesn't change it (only reordering same-type instances does).\n */\nexport interface CommentNodeRefSegment {\n kind: 'component' | 'node';\n /** Component name (kind=component) or HTML tag / node type (kind=node). */\n name: string;\n /** 0-based occurrence among same-(kind,name) siblings under the same parent. */\n nth: number;\n}\n\n/**\n * Where the pin sits. Pins are ELEMENT-ANCHORED: a comment attaches to the\n * specific node/component the user picked (exactly like a selection), not to a\n * spot on the page. The anchor's source of truth is `nodeRef` \u2014 a type +\n * occurrence path from the page root (e.g. `HomeProducts[0]` \u2192\n * `Section[2] > Heading[4]`) \u2014 so a pin survives the section being moved,\n * inserted before, or its differently-typed siblings being deleted. `nodePath`\n * is a create-time positional snapshot kept only as a fallback for legacy pins\n * (no `nodeRef`). `cmsItemIndexPath` disambiguates which CMS-list copy was\n * clicked. The pin is drawn over the resolved element's rect;\n * `offsetXPercent`/`offsetYPercent` place it WITHIN that rect.\n *\n * The identity resolves to a DOM element in both the same-origin SSR canvas and\n * the cross-origin Astro play DOM (nodeRef \u2192 live nodePath \u2192 existing x-ray\n * pipeline), and survives the JSON\u2192.astro migration. When the node can no longer\n * be resolved the comment is \"detached\".\n */\nexport interface CommentAnchor {\n /**\n * Type + occurrence path from the page root \u2014 the move-resilient source of\n * truth for the anchored node. Absent only on legacy pins (fall back to\n * `nodePath`).\n */\n nodeRef?: CommentNodeRefSegment[];\n /** Create-time positional snapshot of the anchored node (fallback for legacy pins). */\n nodePath: number[];\n /**\n * CMS-list item path disambiguating which list copy the anchored element\n * belongs to (parallel to SelectionStore's `selectedCMSItemIndexPath`).\n * Absent when the element is not inside a CMS list.\n */\n cmsItemIndexPath?: number[];\n /** Identity fingerprint of the anchored node, used to detect orphan pins. */\n nodeIdentity: CommentNodeIdentity;\n /** Horizontal position WITHIN the anchored element's rect, 0..1 (default 0.5). */\n offsetXPercent: number;\n /** Vertical position WITHIN the anchored element's rect, 0..1 (default 0.5). */\n offsetYPercent: number;\n /**\n * Breakpoint frame this pin was placed on (e.g. `'base'`, `'tablet'`,\n * `'mobile'`). A pin is only shown on the frame where it was pinned. When\n * unset, the pin renders on every frame (or pins created before this field).\n */\n breakpoint?: string;\n}\n\n/** One message in a comment's thread (initial + replies). */\nexport interface CommentThreadEntry {\n id: string;\n author: CommentAuthor;\n /** ISO timestamp. */\n createdAt: string;\n text: string;\n /** When this entry transitioned the comment status, the target status. */\n statusChange: CommentStatus | null;\n}\n\n/** A pinned comment. */\nexport interface Comment {\n _id: string;\n _filename: string;\n /** Page path the pin lives on (e.g. `\"blog/post\"`). */\n _pagePath: string;\n /** Stable per-page badge number. Server assigns at create time. */\n _seq: number;\n /** ISO timestamps. */\n _createdAt: string;\n _updatedAt: string;\n /** Git HEAD SHA captured at create time, or null when unavailable. */\n _commitSha: string | null;\n anchor: CommentAnchor;\n status: CommentStatus;\n thread: CommentThreadEntry[];\n}\n", "/**\n * Permission Types\n *\n * Per-resource, soft (UI-coordination) edit permissions keyed by GitHub\n * identity. The policy lives in `.meno/permissions.json` at the project root\n * (committed, so every clone resolves the SAME policy locally). GitHub stays\n * the identity + grouping authority (logins, teams, repo-admin bit); this model\n * owns what those map to in editor terms.\n *\n * Enforcement tier is SOFT: these types drive UI gating (read-only editor\n * paths, disabled save), not an adversarial security boundary \u2014 a user with the\n * clone can always edit files directly. Hard enforcement (a CI check on PRs)\n * is a later, additive layer that reads the same policy file.\n *\n * This module is pure data + types; the resolver lives in `../permissions.ts`.\n */\n\n/** Permission tiers, lowest \u2192 highest capability. */\nexport type PermissionRole = 'viewer' | 'editor' | 'admin';\n\nexport const PERMISSION_ROLES = ['viewer', 'editor', 'admin'] as const satisfies readonly PermissionRole[];\n\n/**\n * The editable unit kinds of a Meno project. Mirrors the on-disk layout:\n * - `page` \u2192 `src/pages/<slug>.astro` (id = page slug, e.g. `blog/post`)\n * - `component` \u2192 `src/components/<Name>.astro` (id = component name)\n * - `cms` \u2192 `src/content/<collectionId>/` (id = collection id; items inherit)\n * - `config` \u2192 root config files (id = a {@link ConfigArea})\n */\nexport type ResourceKind = 'page' | 'component' | 'cms' | 'config';\n\nexport const RESOURCE_KINDS: readonly ResourceKind[] = ['page', 'component', 'cms', 'config'] as const;\n\n/**\n * Named global-config capabilities (the `config` resource kind's id namespace):\n * - `project` \u2192 `project.config.json` (site URL, breakpoints, fonts, \u2026)\n * - `colors` \u2192 `colors.json`\n * - `variables` \u2192 `variables.json`\n * - `i18n` \u2192 locale config inside `project.config.json`\n *\n * NOTE: `i18n` lives *inside* `project.config.json`, so the CI checker (which\n * maps whole files) enforces it at `project` granularity \u2014 granting `i18n`\n * without `project` is advisory only (no file maps to it on its own), and\n * granting `project` implies `i18n`.\n */\nexport type ConfigArea = 'project' | 'colors' | 'variables' | 'i18n';\n\nexport const CONFIG_AREAS: readonly ConfigArea[] = ['project', 'colors', 'variables', 'i18n'] as const;\n\n/**\n * A reference to one editable resource, checked against a {@link PermissionRule}.\n * `id` is matched against the rule's glob list for `kind` (see\n * `matchesPermissionPattern`).\n */\nexport interface ResourceRef {\n kind: ResourceKind;\n /** page slug | component name | collection id | config area. */\n id: string;\n}\n\n/**\n * Per-resource-kind allow-lists. Each entry is a glob pattern (`*` matches any\n * run of characters, including `/`) matched against a {@link ResourceRef.id}.\n * Only consulted for the `editor` role \u2014 `viewer` edits nothing, `admin`\n * edits everything. An absent/empty list for a kind means \"no resources of\n * that kind\".\n */\nexport interface PermissionRule {\n /** Page slugs, e.g. `[\"blog/*\", \"about\"]`. */\n pages?: string[];\n /** Component names, e.g. `[\"Card\", \"*Hero\"]`. */\n components?: string[];\n /** CMS collection ids, e.g. `[\"posts\", \"*\"]`. */\n cms?: string[];\n /** Config areas, e.g. `[\"colors\", \"variables\"]` or `[\"*\"]`. */\n config?: string[];\n}\n\n/**\n * One person's or team's grant. `role` defaults to `editor` when `allow` is\n * present, otherwise `viewer`.\n */\nexport interface PermissionGrant {\n role?: PermissionRole;\n /** Editable resources \u2014 only meaningful for the `editor` role. */\n allow?: PermissionRule;\n}\n\n/** Current `version` value written by this app. */\nexport const CURRENT_PERMISSIONS_VERSION = 1;\n\n/**\n * The committed `.meno/permissions.json` document. Logins/team slugs are\n * matched case-insensitively (GitHub logins are case-insensitive).\n */\nexport interface PermissionsPolicy {\n /** Schema version. {@link CURRENT_PERMISSIONS_VERSION} for documents this app writes. */\n version: number;\n /** Role for authenticated users not listed in `members`/`teams`. Defaults to `viewer`. */\n defaultRole?: PermissionRole;\n /** Per-GitHub-login grants. */\n members?: Record<string, PermissionGrant>;\n /** Per-GitHub-team-slug grants (a user's grants are the union over their teams). */\n teams?: Record<string, PermissionGrant>;\n}\n\n/**\n * Who is asking, resolved from the GitHub session. `login: null` means\n * unauthenticated / no GitHub identity (a local project, or a non-electron\n * run) \u2014 see {@link PermissionsPolicy} handling in the resolver.\n */\nexport interface PermissionIdentity {\n /** GitHub login, or `null` when unauthenticated. */\n login: string | null;\n /** GitHub team slugs the user belongs to (for `teams` grants). */\n teams?: string[];\n /**\n * GitHub repo `permissions.admin`. Repo admins are ALWAYS treated as admin\n * here (bootstrap safety \u2014 a policy can't lock the repo owner out).\n */\n isRepoAdmin?: boolean;\n}\n\n/**\n * The resolved capability set for one identity against one policy. Plain,\n * serializable data (no methods) so it can live in a store; query it with\n * `canEdit()` from `../permissions.ts`.\n */\nexport interface ResolvedPermissions {\n login: string | null;\n /** Effective top role after merging member + team grants (and repo-admin). */\n role: PermissionRole;\n /** `true` for `admin` role or a GitHub repo admin. Admins edit everything. */\n isAdmin: boolean;\n /** May the user edit `.meno/permissions.json` itself? Admins only. */\n canManagePolicy: boolean;\n /** Merged allow-lists from all matching grants (consulted for the `editor` role). */\n allow: Required<PermissionRule>;\n}\n", "/**\n * Slugify utilities for CMS filenames\n * Converts text to URL-safe slugs and handles i18n value extraction\n */\n\nimport { isI18nValue } from './i18n';\n\n/**\n * Convert string to URL-safe slug\n * - Lowercase\n * - Remove diacritics (accented characters)\n * - Replace spaces with hyphens\n * - Remove special characters\n */\nexport function slugify(text: string): string {\n if (!text) return '';\n\n return text\n .toLowerCase()\n .normalize('NFD') // Decompose accented chars (\u00E9 -> e + \u0301)\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s-]/g, '') // Remove special chars\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Collapse multiple hyphens\n .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens\n}\n\n/**\n * Extract string value from potentially i18n field\n * Uses specified locale if i18n, or returns string directly\n *\n * @param value - String or i18n object\n * @param defaultLocale - Locale to use for i18n extraction (default: 'en')\n * @returns Extracted string value\n */\nexport function extractStringValue(value: unknown, defaultLocale: string = 'en'): string {\n // Direct string\n if (typeof value === 'string') {\n return value;\n }\n\n // i18n object: { _i18n: true, en: \"hello\", pl: \"cze\u015B\u0107\" }\n if (isI18nValue(value)) {\n // Try default locale first\n if (typeof value[defaultLocale] === 'string') {\n return value[defaultLocale] as string;\n }\n // Fall back to first available locale\n for (const key of Object.keys(value)) {\n if (key !== '_i18n' && typeof value[key] === 'string') {\n return value[key] as string;\n }\n }\n }\n\n // Not a string or i18n object\n return '';\n}\n\n/**\n * Generate a unique filename from base slug\n * Appends -1, -2, etc. suffix if duplicate exists\n *\n * @param baseSlug - Base slug to use\n * @param existingFilenames - Array of existing filenames to check against\n * @returns Unique filename\n */\nexport function generateUniqueFilename(baseSlug: string, existingFilenames: string[]): string {\n if (!baseSlug) {\n baseSlug = 'untitled';\n }\n\n // If base slug is unique, use it directly\n if (!existingFilenames.includes(baseSlug)) {\n return baseSlug;\n }\n\n // Append counter suffix until unique\n let counter = 1;\n let candidate = `${baseSlug}-${counter}`;\n while (existingFilenames.includes(candidate)) {\n counter++;\n candidate = `${baseSlug}-${counter}`;\n }\n\n return candidate;\n}\n\n/**\n * Generate filename from item data\n * Extracts title field value, slugifies it, and ensures uniqueness\n *\n * @param item - CMS item data\n * @param titleField - Name of the field to use for title (default: 'title')\n * @param existingFilenames - Array of existing filenames\n * @param defaultLocale - Default locale for i18n extraction\n * @returns Unique filename\n */\nexport function generateFilenameFromItem(\n item: Record<string, unknown>,\n titleField: string = 'title',\n existingFilenames: string[] = [],\n defaultLocale: string = 'en',\n): string {\n // Try to get title from specified field\n const titleValue = item[titleField];\n const titleString = extractStringValue(titleValue, defaultLocale);\n const baseSlug = slugify(titleString);\n\n return generateUniqueFilename(baseSlug, existingFilenames);\n}\n", "/**\n * Slug Translation Service\n * Handles translation of URL slugs between locales\n */\n\nimport type { I18nConfig } from './types';\n\n/**\n * Slug mapping for a single page\n */\nexport interface SlugMap {\n pageId: string;\n slugs: Record<string, string>;\n}\n\n/**\n * Index entry for reverse lookup (slug+locale \u2192 pageId)\n */\ninterface SlugIndexEntry {\n pageId: string;\n slugs: Record<string, string>;\n}\n\n/**\n * Build reverse lookup index: \"locale:slug\" \u2192 SlugIndexEntry\n * This allows quick lookup of pageId from any locale's slug\n */\nexport function buildSlugIndex(mappings: SlugMap[]): Map<string, SlugIndexEntry> {\n const index = new Map<string, SlugIndexEntry>();\n\n for (const mapping of mappings) {\n for (const [locale, slug] of Object.entries(mapping.slugs)) {\n // Key format: \"locale:slug\" (e.g., \"pl:o-nas\" or \"en:about\")\n const key = `${locale}:${slug}`;\n index.set(key, {\n pageId: mapping.pageId,\n slugs: mapping.slugs,\n });\n }\n }\n\n return index;\n}\n\n/**\n * Find page by slug and locale\n * @returns The SlugIndexEntry if found, undefined otherwise\n */\nexport function findPageBySlug(\n slug: string,\n locale: string,\n index: Map<string, SlugIndexEntry>,\n): SlugIndexEntry | undefined {\n const key = `${locale}:${slug}`;\n return index.get(key);\n}\n\n/**\n * Translate a path to another locale\n *\n * @param currentPath - Current URL path (e.g., \"/pl/o-nas\" or \"/about\")\n * @param targetLocale - Target locale (e.g., \"en\")\n * @param currentLocale - Current locale (e.g., \"pl\")\n * @param defaultLocale - Default locale that doesn't use prefix (e.g., \"en\")\n * @param index - Slug index from buildSlugIndex()\n * @returns Translated path (e.g., \"/about\" for en default, \"/de/uber\" for de)\n */\nexport function translatePath(\n currentPath: string,\n targetLocale: string,\n currentLocale: string,\n defaultLocale: string,\n index: Map<string, SlugIndexEntry>,\n): string {\n // Extract slug from current path (remove locale prefix if present)\n let slug = currentPath;\n\n // Remove leading slash\n if (slug.startsWith('/')) {\n slug = slug.substring(1);\n }\n\n // Remove locale prefix if present (e.g., \"pl/o-nas\" \u2192 \"o-nas\")\n // Also handle case where slug IS the locale (e.g., \"pl\" for Polish homepage)\n if (currentLocale !== defaultLocale) {\n if (slug.startsWith(`${currentLocale}/`)) {\n slug = slug.substring(currentLocale.length + 1);\n } else if (slug === currentLocale) {\n // Path is just the locale prefix (e.g., \"/pl\" \u2192 index page)\n slug = '';\n }\n }\n\n // Handle root path\n if (slug === '' || slug === '/') {\n slug = '';\n }\n\n // Look up page by current slug and locale\n let entry = findPageBySlug(slug, currentLocale, index);\n\n // If not found for current locale, try default locale\n // This handles cases like /de/about where German uses the English slug\n if (!entry && currentLocale !== defaultLocale) {\n entry = findPageBySlug(slug, defaultLocale, index);\n }\n\n if (!entry) {\n // No translation found - return path with just locale prefix change\n if (targetLocale === defaultLocale) {\n return slug === '' ? '/' : `/${slug}`;\n }\n return slug === '' ? `/${targetLocale}` : `/${targetLocale}/${slug}`;\n }\n\n // Get translated slug for target locale\n const targetSlug = entry.slugs[targetLocale] ?? entry.slugs[defaultLocale] ?? slug;\n\n // Build target path\n if (targetLocale === defaultLocale) {\n return targetSlug === '' ? '/' : `/${targetSlug}`;\n }\n return targetSlug === '' ? `/${targetLocale}` : `/${targetLocale}/${targetSlug}`;\n}\n\n/**\n * Locale link information for locale switcher\n */\nexport interface LocaleLink {\n locale: string; // Locale code (e.g., \"pl\")\n langTag: string; // BCP 47 language tag (e.g., \"pl-PL\")\n name: string; // English name (e.g., \"Polish\")\n nativeName: string; // Display name in native language (e.g., \"Polski\")\n path: string; // Translated path for this locale\n isCurrent: boolean; // Whether this is the current locale\n}\n\n/**\n * Get all available locales with their translated paths for the current page\n * Useful for rendering locale switcher\n *\n * @param currentPath - Current URL path\n * @param currentLocale - Current locale\n * @param i18nConfig - i18n configuration with locales\n * @param index - Slug index\n * @returns Array of LocaleLink objects\n */\nexport function getLocaleLinks(\n currentPath: string,\n currentLocale: string,\n i18nConfig: I18nConfig,\n index: Map<string, SlugIndexEntry>,\n): LocaleLink[] {\n return i18nConfig.locales.map((localeConfig) => ({\n locale: localeConfig.code,\n langTag: localeConfig.langTag,\n name: localeConfig.name,\n nativeName: localeConfig.nativeName,\n path: translatePath(currentPath, localeConfig.code, currentLocale, i18nConfig.defaultLocale, index),\n isCurrent: localeConfig.code === currentLocale,\n }));\n}\n\n/**\n * Build the URL a page is served at for a given locale.\n *\n * Conventions (match what `translatePath` / the routing layer at\n * packages/core/lib/server/routes/pages.ts produces):\n * - Default locale paths are bare: \"/\" or \"/{slug}\"\n * - Non-default locale paths are locale-prefixed: \"/{locale}\" or \"/{locale}/{slug}\"\n * - An empty slug (e.g. for the index page) collapses to the root.\n *\n * Used by the slug/page-rename flow to compute the (old, new) href pair\n * for cascade rewrites in incoming links.\n */\nexport function buildPageUrlForLocale(slug: string, locale: string, defaultLocale: string): string {\n const cleanSlug = slug.replace(/^\\/+/, '');\n if (locale === defaultLocale) {\n return cleanSlug === '' ? '/' : `/${cleanSlug}`;\n }\n return cleanSlug === '' ? `/${locale}` : `/${locale}/${cleanSlug}`;\n}\n\n/**\n * Resolve a slug to its pageId (for server-side page loading)\n *\n * @param slug - URL slug (e.g., \"o-nas\")\n * @param locale - Current locale (e.g., \"pl\")\n * @param index - Slug index\n * @returns pageId if found (e.g., \"about\"), undefined otherwise\n */\nexport function resolveSlugToPageId(\n slug: string,\n locale: string,\n index: Map<string, SlugIndexEntry>,\n): string | undefined {\n const entry = findPageBySlug(slug, locale, index);\n return entry?.pageId;\n}\n", "/**\n * Library Loader\n * Generates HTML tags for external JS/CSS libraries\n */\n\nimport type { JSLibraryConfig, CSSLibraryConfig, LibrariesConfig, PageLibrariesConfig } from './types/libraries';\nimport type { ComponentDefinition } from './types/components';\n\n/**\n * Escape HTML special characters in attribute values\n */\nfunction escapeAttr(str: string): string {\n return str.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/**\n * Merge global and page-level library configurations\n * @param global Global libraries from project.config.json\n * @param page Page-level libraries from page meta\n * @returns Merged library configuration\n */\nexport function mergeLibraries(global: LibrariesConfig, page?: PageLibrariesConfig): LibrariesConfig {\n if (!page) {\n return global;\n }\n\n if (page.mode === 'replace') {\n return {\n js: page.js || [],\n css: page.css || [],\n };\n }\n\n // Default: extend\n return {\n js: [...(global.js || []), ...(page.js || [])],\n css: [...(global.css || []), ...(page.css || [])],\n };\n}\n\n/**\n * Generate <script> tag for a JS library\n * @param lib JavaScript library configuration\n * @returns HTML script tag string\n */\nexport function generateScriptTag(lib: JSLibraryConfig): string {\n const attrs: string[] = [`src=\"${escapeAttr(lib.url)}\"`];\n\n if (lib.type === 'module') {\n attrs.push('type=\"module\"');\n } else {\n // Default to defer for better performance\n const mode = lib.mode || 'defer';\n attrs.push(mode);\n }\n\n return `<script ${attrs.join(' ')}></script>`;\n}\n\n/**\n * Generate inline <style> tag with CSS content\n * @param content CSS content to embed\n * @param media Optional media query attribute\n * @returns HTML style tag string\n */\nexport function generateInlineStyleTag(content: string, media?: string): string {\n const attrs = media ? ` media=\"${escapeAttr(media)}\"` : '';\n return `<style${attrs}>${content}</style>`;\n}\n\n/**\n * Generate <link> tag for a CSS library\n * @param lib CSS library configuration\n * @returns HTML link tag string\n */\nexport function generateStylesheetTag(lib: CSSLibraryConfig): string {\n const attrs: string[] = ['rel=\"stylesheet\"', `href=\"${escapeAttr(lib.url)}\"`];\n\n if (lib.media) {\n attrs.push(`media=\"${escapeAttr(lib.media)}\"`);\n }\n\n return `<link ${attrs.join(' ')}>`;\n}\n\n/**\n * Generated library tags grouped by position\n */\nexport interface LibraryTags {\n /** CSS tags for <head> */\n headCSS: string;\n /** JS tags for <head> */\n headJS: string;\n /** JS tags for before </body> */\n bodyEndJS: string;\n}\n\n/**\n * Generate all library tags grouped by position\n * @param libs Library configuration\n * @param inlineContents Optional map of URL \u2192 CSS content for inline embedding\n * @returns Object with tags grouped by position\n */\nexport function generateLibraryTags(libs: LibrariesConfig, inlineContents?: Map<string, string>): LibraryTags {\n const headCSS: string[] = [];\n const headJS: string[] = [];\n const bodyEndJS: string[] = [];\n\n // CSS always goes in head\n for (const css of libs.css || []) {\n const inlineContent = inlineContents?.get(css.url);\n if (inlineContent !== undefined) {\n headCSS.push(generateInlineStyleTag(inlineContent, css.media));\n } else {\n headCSS.push(generateStylesheetTag(css));\n }\n }\n\n // JS can go in head or body-end\n for (const js of libs.js || []) {\n const tag = generateScriptTag(js);\n if (js.position === 'head') {\n headJS.push(tag);\n } else {\n // Default to body-end\n bodyEndJS.push(tag);\n }\n }\n\n return {\n headCSS: headCSS.join('\\n '),\n headJS: headJS.join('\\n '),\n bodyEndJS: bodyEndJS.join('\\n '),\n };\n}\n\n/**\n * Collect library configurations from all component definitions, deduplicated by URL\n * @param globalComponents Global component definitions\n * @param pageComponents Page-specific component definitions\n * @returns Combined library configuration from all components\n */\nexport function collectComponentLibraries(\n globalComponents: Record<string, ComponentDefinition> = {},\n pageComponents: Record<string, ComponentDefinition> = {},\n): LibrariesConfig {\n const seenJS = new Set<string>();\n const seenCSS = new Set<string>();\n const jsLibs: JSLibraryConfig[] = [];\n const cssLibs: CSSLibraryConfig[] = [];\n\n const collect = (components: Record<string, ComponentDefinition>) => {\n for (const component of Object.values(components)) {\n const libs = component?.component?.libraries;\n if (!libs) continue;\n\n for (const js of libs.js || []) {\n if (!seenJS.has(js.url)) {\n seenJS.add(js.url);\n jsLibs.push(js);\n }\n }\n for (const css of libs.css || []) {\n if (!seenCSS.has(css.url)) {\n seenCSS.add(css.url);\n cssLibs.push(css);\n }\n }\n }\n };\n\n collect(globalComponents);\n collect(pageComponents);\n\n return { js: jsLibs, css: cssLibs };\n}\n\n/**\n * Origins extracted from library URLs, grouped by resource type\n */\nexport interface LibraryOrigins {\n /** Origins for script-src (from JS library URLs) */\n scriptOrigins: Set<string>;\n /** Origins for style-src (from CSS library URLs) */\n styleOrigins: Set<string>;\n}\n\n/**\n * Extract unique origin domains from library URLs for CSP headers.\n * Skips relative URLs (/, ./, ../) since they're covered by 'self'.\n * Silently skips malformed URLs.\n */\nexport function extractLibraryOrigins(libs: LibrariesConfig): LibraryOrigins {\n const scriptOrigins = new Set<string>();\n const styleOrigins = new Set<string>();\n\n for (const js of libs.js || []) {\n const origin = safeOrigin(js.url);\n if (origin) scriptOrigins.add(origin);\n }\n\n for (const css of libs.css || []) {\n const origin = safeOrigin(css.url);\n if (origin) styleOrigins.add(origin);\n }\n\n return { scriptOrigins, styleOrigins };\n}\n\n/**\n * Filter libraries based on context (editor, build, or preview).\n * Removes CSS libraries that have the corresponding disable flag set.\n * JS libraries pass through unchanged.\n * Preview context (dev server on port 8080) returns all libraries unfiltered.\n */\nexport function filterLibrariesByContext(\n libs: LibrariesConfig,\n context: 'editor' | 'build' | 'preview',\n): LibrariesConfig {\n if (context === 'preview') return libs;\n const key = context === 'editor' ? 'disableEditor' : 'disableBuild';\n return {\n js: libs.js,\n css: (libs.css || []).filter((css) => !css[key]),\n };\n}\n\nfunction safeOrigin(url: string): string | null {\n if (!url || url.startsWith('/') || url.startsWith('./') || url.startsWith('../')) {\n return null;\n }\n try {\n return new URL(url).origin;\n } catch {\n return null;\n }\n}\n", "/**\n * Path Security Utilities\n * Provides path traversal protection for file system operations\n */\n\nimport { resolve, sep } from 'node:path';\n\n/**\n * Error thrown when a path traversal attack is detected\n */\nexport class PathTraversalError extends Error {\n constructor(\n public readonly requestedPath: string,\n public readonly rootPath: string,\n ) {\n super(`Path traversal detected: \"${requestedPath}\" escapes root \"${rootPath}\"`);\n this.name = 'PathTraversalError';\n }\n}\n\n/**\n * Check if a resolved path is within the allowed root directory\n * Uses path.resolve() to normalize and handle .. sequences\n *\n * @param requestedPath - The path to validate (can be relative or absolute)\n * @param rootPath - The root directory that paths must be within\n * @returns true if the path is within root, false otherwise\n */\nexport function isPathWithinRoot(requestedPath: string, rootPath: string): boolean {\n const normalizedRoot = resolve(rootPath);\n const normalizedPath = resolve(rootPath, requestedPath);\n\n // Check that normalized path starts with root + separator\n // Adding separator prevents /project-backup from matching /project\n return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + sep);\n}\n\n/**\n * Resolve a path safely, throwing if it would escape the root\n *\n * @param rootPath - The root directory\n * @param segments - Path segments to join\n * @returns The resolved path\n * @throws PathTraversalError if path escapes root\n */\nexport function resolveSafePath(rootPath: string, ...segments: string[]): string {\n const normalizedRoot = resolve(rootPath);\n const normalizedPath = resolve(normalizedRoot, ...segments);\n\n if (!normalizedPath.startsWith(normalizedRoot + sep) && normalizedPath !== normalizedRoot) {\n throw new PathTraversalError(segments.join(sep), rootPath);\n }\n\n return normalizedPath;\n}\n\n/**\n * Validate that a filename/identifier contains no path traversal sequences\n * Use for collection names, filenames, etc.\n *\n * @param name - The name to validate\n * @returns true if safe, false if contains traversal sequences\n */\nexport function isSafePathSegment(name: string): boolean {\n // Reject empty names\n if (!name || name.trim() === '') return false;\n\n // Reject names with path separators\n if (name.includes('/') || name.includes('\\\\')) return false;\n\n // Reject . and ..\n if (name === '.' || name === '..') return false;\n\n // Reject names starting with .. (e.g., \"..foo\")\n if (name.startsWith('..')) return false;\n\n // Reject null bytes (used in some attacks)\n if (name.includes('\\0')) return false;\n\n return true;\n}\n\n/**\n * Regex for valid CMS identifiers (collection names, filenames)\n * Allows alphanumeric, underscore, hyphen\n */\nexport const SAFE_IDENTIFIER_REGEX = /^[a-zA-Z0-9_-]+$/;\n\n/**\n * Validate a CMS identifier (stricter than isSafePathSegment)\n * Use for collection IDs and filenames that should only contain safe chars\n */\nexport function isValidIdentifier(name: string): boolean {\n return SAFE_IDENTIFIER_REGEX.test(name);\n}\n\n/**\n * Suffix used for CMS draft files: `{filename}.draft.json`. The provider must\n * never accept user-supplied filenames ending in `.draft`, because that would\n * clash with the draft-suffix convention and let a user shadow another item's\n * draft file.\n */\nexport const CMS_DRAFT_SUFFIX = '.draft';\n\n/**\n * True when a user-supplied CMS filename collides with the reserved `.draft`\n * suffix. Use as a hard reject in CMS provider write paths.\n */\nexport function isReservedDraftFilename(filename: string): boolean {\n return filename.endsWith(CMS_DRAFT_SUFFIX);\n}\n", "/**\n * Component reference utilities \u2014 shared helpers for walking a node tree and\n * rewriting `{ type: \"component\", component: \"<name>\" }` references.\n *\n * Lives in `shared/` (not `server/`) because both the rename API on the server\n * and the in-editor pageData sync on the client need the same walker. Pure \u2014\n * no fs, no imports outside this file.\n */\n\n/**\n * Rewrite every `{ type: \"component\", component: \"<oldName>\" }` reference\n * inside `node` to point at `newName`. Returns true if any references were\n * rewritten. Mutates `node` in place.\n *\n * Matching is structural \u2014 node type + component-name equality \u2014 so a name\n * like \"Button\" will never collide with HTML tags, CSS classes, prop strings,\n * embedded SVG/HTML, or any user copy that happens to contain the word.\n */\nexport function rewriteComponentRefs(node: unknown, oldName: string, newName: string): boolean {\n if (!node || typeof node !== 'object') return false;\n let changed = false;\n\n const n = node as any;\n if (n.type === 'component' && n.component === oldName) {\n n.component = newName;\n changed = true;\n }\n\n const children = n.children;\n if (Array.isArray(children)) {\n for (const child of children) {\n if (child && typeof child === 'object') {\n if (rewriteComponentRefs(child, oldName, newName)) changed = true;\n }\n }\n } else if (children && typeof children === 'object') {\n if (rewriteComponentRefs(children, oldName, newName)) changed = true;\n }\n\n return changed;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -858,10 +858,10 @@ function matchesAbbreviation(property, input) {
|
|
|
858
858
|
if (!input) return false;
|
|
859
859
|
let propertyIndex = 0;
|
|
860
860
|
for (let inputIndex = 0; inputIndex < input.length; inputIndex++) {
|
|
861
|
-
const inputChar = input[inputIndex];
|
|
861
|
+
const inputChar = input[inputIndex] ?? "";
|
|
862
862
|
let found = false;
|
|
863
863
|
while (propertyIndex < property.length) {
|
|
864
|
-
const propChar = property[propertyIndex];
|
|
864
|
+
const propChar = property[propertyIndex] ?? "";
|
|
865
865
|
const isWordBoundary = propertyIndex === 0 || propChar === propChar.toUpperCase() && propChar !== propChar.toLowerCase();
|
|
866
866
|
if (isWordBoundary && inputChar.toLowerCase() === propChar.toLowerCase()) {
|
|
867
867
|
found = true;
|
|
@@ -976,4 +976,4 @@ export {
|
|
|
976
976
|
UNITLESS_PROPERTIES,
|
|
977
977
|
appendsPxByDefault
|
|
978
978
|
};
|
|
979
|
-
//# sourceMappingURL=chunk-
|
|
979
|
+
//# sourceMappingURL=chunk-XTKNX4FW.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/shared/cssProperties.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * CSS Property Definition structure\n */\ninterface CSSPropertyDefinition {\n values?: readonly string[];\n type?: 'string' | 'select' | 'boolean' | 'number';\n}\n\n/**\n * CSS Properties with their valid values and metadata\n * Used for autocomplete suggestions for both property names and values\n */\nexport const CSS_PROPERTIES_DEFINITION: Record<string, CSSPropertyDefinition> = {\n // Display & Layout\n display: {\n values: ['block', 'flex', 'grid', 'inline', 'inline-block', 'inline-flex', 'inline-grid', 'none'],\n type: 'select',\n },\n position: {\n values: ['static', 'relative', 'absolute', 'fixed', 'sticky'],\n type: 'select',\n },\n top: { type: 'string' },\n right: { type: 'string' },\n bottom: { type: 'string' },\n left: { type: 'string' },\n inset: { type: 'string' },\n zIndex: { type: 'number' },\n\n // Dimensions\n width: { type: 'string' },\n height: { type: 'string' },\n minWidth: { type: 'string' },\n maxWidth: { type: 'string' },\n minHeight: { type: 'string' },\n maxHeight: { type: 'string' },\n aspectRatio: { type: 'string' },\n\n // Spacing\n margin: { type: 'string' },\n marginTop: { type: 'string' },\n marginRight: { type: 'string' },\n marginBottom: { type: 'string' },\n marginLeft: { type: 'string' },\n padding: { type: 'string' },\n paddingTop: { type: 'string' },\n paddingRight: { type: 'string' },\n paddingBottom: { type: 'string' },\n paddingLeft: { type: 'string' },\n gap: { type: 'string' },\n rowGap: { type: 'string' },\n columnGap: { type: 'string' },\n\n // Borders\n border: { type: 'string' },\n borderWidth: { type: 'string' },\n borderStyle: {\n values: ['solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset', 'none'],\n type: 'select',\n },\n borderColor: { type: 'string' },\n borderTop: { type: 'string' },\n borderRight: { type: 'string' },\n borderBottom: { type: 'string' },\n borderLeft: { type: 'string' },\n borderRadius: { type: 'string' },\n borderTopLeftRadius: { type: 'string' },\n borderTopRightRadius: { type: 'string' },\n borderBottomLeftRadius: { type: 'string' },\n borderBottomRightRadius: { type: 'string' },\n\n // Background & Colors\n background: { type: 'string' },\n backgroundColor: { type: 'string' },\n backgroundImage: { type: 'string' },\n backgroundSize: {\n values: ['auto', 'cover', 'contain'],\n type: 'select',\n },\n backgroundPosition: {\n values: ['top', 'bottom', 'left', 'right', 'center'],\n type: 'select',\n },\n backgroundRepeat: {\n values: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'],\n type: 'select',\n },\n backgroundAttachment: {\n values: ['scroll', 'fixed', 'local'],\n type: 'select',\n },\n backgroundOrigin: {\n values: ['border-box', 'padding-box', 'content-box'],\n type: 'select',\n },\n backgroundBlendMode: {\n values: [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ],\n type: 'select',\n },\n // Gradient-text recipe (`background: linear-gradient(...); background-clip:\n // text; -webkit-background-clip: text; -webkit-text-fill-color: transparent`).\n // The `Webkit*` capitalization is intentional \u2014 utilityClassMapper's\n // camel\u2192kebab emitter only prepends `-` when the first letter is uppercase,\n // so `WebkitBackgroundClip` round-trips back to `-webkit-background-clip`.\n backgroundClip: {\n values: ['border-box', 'padding-box', 'content-box', 'text'],\n type: 'select',\n },\n WebkitBackgroundClip: {\n values: ['border-box', 'padding-box', 'content-box', 'text'],\n type: 'select',\n },\n WebkitTextFillColor: { type: 'string' },\n WebkitTextStroke: { type: 'string' },\n WebkitTextStrokeWidth: { type: 'string' },\n WebkitTextStrokeColor: { type: 'string' },\n color: { type: 'string' },\n opacity: { type: 'number' },\n\n // Flexbox\n flex: { type: 'string' },\n flexDirection: {\n values: ['row', 'column', 'row-reverse', 'column-reverse'],\n type: 'select',\n },\n flexWrap: {\n values: ['nowrap', 'wrap', 'wrap-reverse'],\n type: 'select',\n },\n flexFlow: { type: 'string' },\n justifyContent: {\n values: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly'],\n type: 'select',\n },\n alignItems: {\n values: ['flex-start', 'flex-end', 'center', 'stretch', 'baseline'],\n type: 'select',\n },\n alignContent: {\n values: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'stretch'],\n type: 'select',\n },\n alignSelf: {\n values: ['auto', 'flex-start', 'flex-end', 'center', 'stretch', 'baseline'],\n type: 'select',\n },\n flexGrow: { type: 'number' },\n flexShrink: { type: 'number' },\n flexBasis: { type: 'string' },\n order: { type: 'number' },\n\n // Grid\n grid: { type: 'string' },\n gridTemplateColumns: { type: 'string' },\n gridTemplateRows: { type: 'string' },\n gridTemplateAreas: { type: 'string' },\n gridGap: { type: 'string' },\n gridColumn: { type: 'string' },\n gridRow: { type: 'string' },\n gridArea: { type: 'string' },\n gridAutoFlow: {\n values: ['row', 'column', 'row dense', 'column dense'],\n type: 'select',\n },\n gridAutoColumns: { type: 'string' },\n gridAutoRows: { type: 'string' },\n justifyItems: {\n values: ['start', 'end', 'center', 'stretch'],\n type: 'select',\n },\n justifySelf: {\n values: ['auto', 'start', 'end', 'center', 'stretch'],\n type: 'select',\n },\n placeContent: { type: 'string' },\n placeItems: { type: 'string' },\n placeSelf: { type: 'string' },\n\n // Text & Font\n fontSize: { type: 'string' },\n fontWeight: {\n values: ['100', '200', '300', '400', '500', '600', '700', '800', '900', 'normal', 'bold'],\n type: 'select',\n },\n fontFamily: { type: 'string' },\n fontStyle: {\n values: ['normal', 'italic', 'oblique'],\n type: 'select',\n },\n lineHeight: { type: 'string' },\n textAlign: {\n values: ['left', 'right', 'center', 'justify', 'start', 'end'],\n type: 'select',\n },\n textDecoration: {\n values: ['none', 'underline', 'overline', 'line-through'],\n type: 'select',\n },\n textDecorationLine: {\n values: ['none', 'underline', 'overline', 'line-through'],\n type: 'select',\n },\n textDecorationStyle: {\n values: ['solid', 'double', 'dotted', 'dashed', 'wavy'],\n type: 'select',\n },\n textDecorationColor: { type: 'string' },\n textDecorationThickness: { type: 'string' },\n textUnderlineOffset: { type: 'string' },\n textUnderlinePosition: { type: 'string' },\n textTransform: {\n values: ['none', 'capitalize', 'uppercase', 'lowercase'],\n type: 'select',\n },\n textRendering: {\n values: ['auto', 'optimizeSpeed', 'optimizeLegibility', 'geometricPrecision'],\n type: 'select',\n },\n fontVariant: { type: 'string' },\n fontStretch: { type: 'string' },\n fontFeatureSettings: { type: 'string' },\n fontVariationSettings: { type: 'string' },\n fontKerning: {\n values: ['auto', 'normal', 'none'],\n type: 'select',\n },\n WebkitFontSmoothing: {\n values: ['auto', 'none', 'antialiased', 'subpixel-antialiased'],\n type: 'select',\n },\n MozOsxFontSmoothing: {\n values: ['auto', 'grayscale'],\n type: 'select',\n },\n hyphens: {\n values: ['none', 'manual', 'auto'],\n type: 'select',\n },\n WebkitHyphens: {\n values: ['none', 'manual', 'auto'],\n type: 'select',\n },\n writingMode: {\n values: ['horizontal-tb', 'vertical-rl', 'vertical-lr'],\n type: 'select',\n },\n direction: {\n values: ['ltr', 'rtl'],\n type: 'select',\n },\n tabSize: { type: 'string' },\n wordWrap: {\n values: ['normal', 'break-word'],\n type: 'select',\n },\n letterSpacing: { type: 'string' },\n wordSpacing: { type: 'string' },\n wordBreak: {\n values: ['normal', 'break-all', 'keep-all', 'break-word'],\n type: 'select',\n },\n overflowWrap: {\n values: ['normal', 'break-word', 'anywhere'],\n type: 'select',\n },\n textWrap: {\n values: ['wrap', 'nowrap', 'balance', 'pretty', 'stable'],\n type: 'select',\n },\n textIndent: { type: 'string' },\n verticalAlign: {\n values: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super'],\n type: 'select',\n },\n\n // Box Shadow & Effects\n boxShadow: { type: 'string' },\n textShadow: { type: 'string' },\n filter: { type: 'string' },\n backdropFilter: { type: 'string' },\n WebkitBackdropFilter: { type: 'string' },\n transform: { type: 'string' },\n transformOrigin: { type: 'string' },\n transformStyle: {\n values: ['flat', 'preserve-3d'],\n type: 'select',\n },\n perspective: { type: 'string' },\n perspectiveOrigin: { type: 'string' },\n transition: { type: 'string' },\n transitionProperty: { type: 'string' },\n transitionDuration: { type: 'string' },\n transitionTimingFunction: { type: 'string' },\n transitionDelay: { type: 'string' },\n animation: { type: 'string' },\n backfaceVisibility: {\n values: ['visible', 'hidden'],\n type: 'select',\n },\n mixBlendMode: {\n values: [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ],\n type: 'select',\n },\n isolation: {\n values: ['auto', 'isolate'],\n type: 'select',\n },\n willChange: { type: 'string' },\n imageRendering: {\n values: ['auto', 'crisp-edges', 'pixelated', 'smooth'],\n type: 'select',\n },\n clipPath: { type: 'string' },\n WebkitClipPath: { type: 'string' },\n // Mask family \u2014 gradient/SVG masks. Emit both the standard and `-webkit-`\n // form because Safari still needs the prefix.\n maskImage: { type: 'string' },\n WebkitMaskImage: { type: 'string' },\n maskSize: { type: 'string' },\n WebkitMaskSize: { type: 'string' },\n maskPosition: { type: 'string' },\n WebkitMaskPosition: { type: 'string' },\n maskRepeat: { type: 'string' },\n WebkitMaskRepeat: { type: 'string' },\n maskOrigin: { type: 'string' },\n WebkitMaskOrigin: { type: 'string' },\n maskClip: { type: 'string' },\n WebkitMaskClip: { type: 'string' },\n maskComposite: { type: 'string' },\n WebkitMaskComposite: { type: 'string' },\n maskMode: { type: 'string' },\n maskType: {\n values: ['luminance', 'alpha'],\n type: 'select',\n },\n\n // Overflow & Content\n overflow: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n overflowX: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n overflowY: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n whiteSpace: {\n values: ['normal', 'nowrap', 'pre', 'pre-wrap', 'pre-line'],\n type: 'select',\n },\n textOverflow: {\n values: ['clip', 'ellipsis'],\n type: 'select',\n },\n visibility: {\n values: ['visible', 'hidden', 'collapse'],\n type: 'select',\n },\n content: { type: 'string' },\n\n // Cursor & Interaction\n cursor: {\n values: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'not-allowed', 'help'],\n type: 'select',\n },\n pointerEvents: {\n values: ['auto', 'none'],\n type: 'select',\n },\n userSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n WebkitUserSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n MozUserSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n caretColor: { type: 'string' },\n appearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n WebkitAppearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n MozAppearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n\n // Outline\n outline: { type: 'string' },\n outlineWidth: { type: 'string' },\n outlineStyle: {\n values: ['none', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset'],\n type: 'select',\n },\n outlineColor: { type: 'string' },\n outlineOffset: { type: 'string' },\n\n // Lists\n listStyle: { type: 'string' },\n listStyleType: {\n values: [\n 'none',\n 'disc',\n 'circle',\n 'square',\n 'decimal',\n 'decimal-leading-zero',\n 'lower-roman',\n 'upper-roman',\n 'lower-alpha',\n 'upper-alpha',\n ],\n type: 'select',\n },\n listStylePosition: {\n values: ['inside', 'outside'],\n type: 'select',\n },\n\n // Miscellaneous\n float: {\n values: ['left', 'right', 'none'],\n type: 'select',\n },\n clear: {\n values: ['left', 'right', 'both', 'none'],\n type: 'select',\n },\n boxSizing: {\n values: ['content-box', 'border-box'],\n type: 'select',\n },\n objectFit: {\n values: ['fill', 'contain', 'cover', 'scale-down'],\n type: 'select',\n },\n objectPosition: {\n values: ['top', 'bottom', 'left', 'right', 'center'],\n type: 'select',\n },\n resize: {\n values: ['none', 'both', 'horizontal', 'vertical'],\n type: 'select',\n },\n scrollBehavior: {\n values: ['auto', 'smooth'],\n type: 'select',\n },\n scrollSnapType: { type: 'string' },\n scrollSnapAlign: {\n values: ['none', 'start', 'end', 'center'],\n type: 'select',\n },\n scrollSnapStop: {\n values: ['normal', 'always'],\n type: 'select',\n },\n scrollMarginTop: { type: 'string' },\n scrollMarginRight: { type: 'string' },\n scrollMarginBottom: { type: 'string' },\n scrollMarginLeft: { type: 'string' },\n scrollPaddingTop: { type: 'string' },\n scrollPaddingRight: { type: 'string' },\n scrollPaddingBottom: { type: 'string' },\n scrollPaddingLeft: { type: 'string' },\n overscrollBehavior: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n overscrollBehaviorX: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n overscrollBehaviorY: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n // CSS Containment \u2014 container queries depend on these.\n containerType: {\n values: ['normal', 'size', 'inline-size'],\n type: 'select',\n },\n containerName: { type: 'string' },\n accentColor: { type: 'string' },\n\n // SVG\n stroke: { type: 'string' },\n strokeWidth: { type: 'string' },\n strokeDasharray: { type: 'string' },\n strokeDashoffset: { type: 'string' },\n strokeLinecap: {\n values: ['butt', 'round', 'square'],\n type: 'select',\n },\n strokeLinejoin: {\n values: ['miter', 'round', 'bevel'],\n type: 'select',\n },\n strokeOpacity: { type: 'number' },\n fill: { type: 'string' },\n fillOpacity: { type: 'number' },\n fillRule: {\n values: ['nonzero', 'evenodd'],\n type: 'select',\n },\n};\n\n/**\n * Common CSS properties for autocomplete suggestions (camelCase for React/JS)\n * Derived from CSS_PROPERTIES_DEFINITION keys\n */\nexport const CSS_PROPERTIES = Object.keys(CSS_PROPERTIES_DEFINITION);\n\n/**\n * Popularity tiers for CSS properties (lower = more common).\n * Properties not listed default to tier 3.\n * Used to sort autocomplete suggestions within each match group.\n */\nconst CSS_PROPERTY_PRIORITY: Record<string, number> = {\n // Tier 1: Most commonly used\n display: 1,\n position: 1,\n width: 1,\n height: 1,\n margin: 1,\n padding: 1,\n color: 1,\n backgroundColor: 1,\n fontSize: 1,\n fontWeight: 1,\n border: 1,\n borderRadius: 1,\n flex: 1,\n flexDirection: 1,\n justifyContent: 1,\n alignItems: 1,\n gap: 1,\n opacity: 1,\n overflow: 1,\n zIndex: 1,\n top: 1,\n right: 1,\n bottom: 1,\n left: 1,\n cursor: 1,\n background: 1,\n boxShadow: 1,\n transition: 1,\n transform: 1,\n lineHeight: 1,\n textAlign: 1,\n\n // Tier 2: Common but less frequent\n maxWidth: 2,\n maxHeight: 2,\n minWidth: 3,\n minHeight: 3,\n marginTop: 2,\n marginBottom: 2,\n marginLeft: 2,\n marginRight: 2,\n paddingTop: 2,\n paddingBottom: 2,\n paddingLeft: 2,\n paddingRight: 2,\n fontFamily: 2,\n fontStyle: 2,\n textDecoration: 2,\n textTransform: 2,\n letterSpacing: 2,\n borderWidth: 2,\n borderStyle: 2,\n borderColor: 2,\n borderBottom: 2,\n borderTop: 2,\n flexWrap: 2,\n flexGrow: 2,\n flexShrink: 2,\n flexBasis: 2,\n alignSelf: 2,\n gridTemplateColumns: 2,\n gridTemplateRows: 2,\n backgroundImage: 2,\n backgroundSize: 2,\n backgroundPosition: 2,\n whiteSpace: 2,\n textOverflow: 2,\n visibility: 2,\n pointerEvents: 2,\n userSelect: 2,\n boxSizing: 2,\n objectFit: 2,\n filter: 2,\n animation: 2,\n outline: 2,\n inset: 2,\n};\n\nfunction getPropertyPriority(property: string): number {\n return CSS_PROPERTY_PRIORITY[property] ?? 3;\n}\n\n/**\n * CSS Property Groups for organizing styles in the editor\n * Order determines display order in the UI\n */\nexport const CSS_PROPERTY_GROUPS: Record<string, string[]> = {\n Layout: ['display'],\n Spacing: [\n 'margin',\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'padding',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n ],\n Size: ['width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'aspectRatio'],\n Position: ['position', 'top', 'right', 'bottom', 'left', 'inset', 'zIndex'],\n Flexbox: [\n 'flex',\n 'flexDirection',\n 'flexWrap',\n 'flexFlow',\n 'justifyContent',\n 'alignItems',\n 'alignContent',\n 'gap',\n 'rowGap',\n 'columnGap',\n 'alignSelf',\n 'flexGrow',\n 'flexShrink',\n 'flexBasis',\n 'order',\n ],\n Grid: [\n 'grid',\n 'gridTemplateColumns',\n 'gridTemplateRows',\n 'gridTemplateAreas',\n 'gridGap',\n 'gridColumn',\n 'gridRow',\n 'gridArea',\n 'gridAutoFlow',\n 'gridAutoColumns',\n 'gridAutoRows',\n 'justifyItems',\n 'justifySelf',\n 'placeContent',\n 'placeItems',\n 'placeSelf',\n ],\n Typography: [\n 'fontWeight',\n 'fontSize',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'color',\n 'textAlign',\n 'textDecoration',\n 'textTransform',\n 'letterSpacing',\n 'wordSpacing',\n 'wordBreak',\n 'overflowWrap',\n 'textIndent',\n 'verticalAlign',\n ],\n Background: [\n 'background',\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundSize',\n 'backgroundPosition',\n 'backgroundRepeat',\n 'opacity',\n ],\n Borders: [\n 'borderRadius',\n 'borderTopLeftRadius',\n 'borderTopRightRadius',\n 'borderBottomLeftRadius',\n 'borderBottomRightRadius',\n 'border',\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n ],\n Outline: ['outline', 'outlineWidth', 'outlineStyle', 'outlineColor', 'outlineOffset'],\n Effects: [\n 'boxShadow',\n 'textShadow',\n 'filter',\n 'backdropFilter',\n 'transform',\n 'transformOrigin',\n 'transition',\n 'animation',\n 'backfaceVisibility',\n 'mixBlendMode',\n 'clipPath',\n ],\n Overflow: ['overflow', 'overflowX', 'overflowY', 'whiteSpace', 'textOverflow', 'visibility', 'content'],\n Interaction: ['cursor', 'pointerEvents', 'userSelect'],\n Lists: ['listStyle', 'listStyleType', 'listStylePosition'],\n Other: ['float', 'clear', 'boxSizing', 'objectFit', 'objectPosition', 'resize', 'scrollBehavior', 'accentColor'],\n SVG: [\n 'stroke',\n 'strokeWidth',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeLinecap',\n 'strokeLinejoin',\n 'strokeOpacity',\n 'fill',\n 'fillOpacity',\n 'fillRule',\n ],\n};\n\n/**\n * Get the group name for a CSS property\n * @param propertyName - The CSS property name\n * @returns The group name or 'Other' if not found\n */\nexport function getPropertyGroup(propertyName: string): string {\n for (const [groupName, properties] of Object.entries(CSS_PROPERTY_GROUPS)) {\n if (properties.includes(propertyName)) {\n return groupName;\n }\n }\n return 'Other';\n}\n\n/**\n * Subset of CSS properties shown as \"always-visible\" rows in the visual style\n * editor mode (Webflow-like). Each property here renders even when unset, so\n * the user can see at a glance which properties are available and click an\n * empty row to start typing a value.\n *\n * Keys must be group names from CSS_PROPERTY_GROUPS so the visual editor can\n * reuse the same group headers as list mode.\n */\nexport const VISUAL_MODE_PROPERTIES: Record<string, string[]> = {\n Layout: ['display'],\n Grid: ['gridTemplateColumns'],\n Flexbox: ['flexDirection', 'flexWrap', 'justifyContent', 'alignItems', 'gap', 'flexGrow', 'flexShrink', 'flexBasis'],\n Spacing: [\n 'margin',\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'padding',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n ],\n Size: ['width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight'],\n Position: ['position', 'top', 'right', 'bottom', 'left', 'zIndex'],\n Typography: [\n 'fontFamily',\n 'fontWeight',\n 'fontSize',\n 'lineHeight',\n 'color',\n 'letterSpacing',\n 'textAlign',\n 'textTransform',\n 'textDecoration',\n ],\n Background: [\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundSize',\n 'backgroundPosition',\n 'backgroundRepeat',\n 'opacity',\n ],\n Borders: ['borderRadius', 'borderWidth', 'borderStyle', 'borderColor'],\n Effects: ['boxShadow', 'transform', 'transition', 'filter'],\n Overflow: ['overflow', 'whiteSpace'],\n Interaction: ['cursor', 'pointerEvents'],\n};\n\nconst VISUAL_MODE_PROPERTIES_SET = new Set(Object.values(VISUAL_MODE_PROPERTIES).flat());\n\n/**\n * True if `prop` belongs to the always-visible visual-mode list.\n */\nexport function isVisualModeProperty(prop: string): boolean {\n return VISUAL_MODE_PROPERTIES_SET.has(prop);\n}\n\n/**\n * Context used by visual-mode visibility rules. Captures everything a rule\n * needs to decide whether a property row is meaningful for the currently\n * selected element. Built once per render in `StyleEditor`.\n */\nexport interface VisualModeRuleContext {\n /** Effective `display` of the selected element \u2014 getComputedStyle().display\n * with declared (instance/inherited/effective) merge as fallback when the\n * iframe hasn't loaded yet. Defaults to 'block'. */\n display: string;\n /** Effective `display` of the DOM parent \u2014 used for flex/grid item props\n * whose applicability depends on the parent's layout mode. '' when no\n * parent is reachable (root element, iframe missing). */\n parentDisplay: string;\n /** Effective `position` of the selected element. Defaults to 'static'. */\n position: string;\n /** Lowercase HTML tag name of the selected element ('div', 'img', 'ul'\u2026). */\n tagName: string;\n /** True if any of paddingTop / paddingRight / paddingBottom / paddingLeft\n * is set anywhere in the cascade (instance + inherited + effective).\n * When true, the panel shows the four longhand rows and hides `padding`. */\n hasPaddingLonghand: boolean;\n /** Same as `hasPaddingLonghand` for the four `margin*` longhands. */\n hasMarginLonghand: boolean;\n /** True if `backgroundImage` (or the `background` shorthand) is set anywhere\n * in the cascade. Drives visibility of background-image-only properties\n * like `backgroundPosition` / `backgroundSize` / `backgroundRepeat`. */\n hasBackgroundImage: boolean;\n}\n\nexport type VisualModeRule = (ctx: VisualModeRuleContext) => boolean;\n\nconst isFlexDisplay = (d: string) => d === 'flex' || d === 'inline-flex';\nconst isGridDisplay = (d: string) => d === 'grid' || d === 'inline-grid';\nconst isListTag = (t: string) => t === 'ul' || t === 'ol' || t === 'li';\nconst isMediaTag = (t: string) => t === 'img' || t === 'video';\n\n/**\n * Visibility rules for the visual-mode style panel. Each entry is a predicate\n * that returns true when the row should be rendered for the current element\n * context. Properties without an entry are always visible. Properties that\n * are *explicitly set* on the element bypass these rules (the explicit-value\n * override is enforced by the caller, not here).\n */\nexport const VISUAL_MODE_RULES: Record<string, VisualModeRule> = {\n // Flex/Grid CONTAINER props \u2014 own display must be flex/grid.\n flexDirection: (ctx) => isFlexDisplay(ctx.display),\n flexWrap: (ctx) => isFlexDisplay(ctx.display),\n justifyContent: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n alignItems: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n alignContent: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n gap: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n rowGap: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n columnGap: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n gridTemplateColumns: (ctx) => isGridDisplay(ctx.display),\n gridTemplateRows: (ctx) => isGridDisplay(ctx.display),\n gridTemplateAreas: (ctx) => isGridDisplay(ctx.display),\n gridGap: (ctx) => isGridDisplay(ctx.display),\n gridAutoFlow: (ctx) => isGridDisplay(ctx.display),\n gridAutoColumns: (ctx) => isGridDisplay(ctx.display),\n gridAutoRows: (ctx) => isGridDisplay(ctx.display),\n justifyItems: (ctx) => isGridDisplay(ctx.display),\n placeItems: (ctx) => isGridDisplay(ctx.display),\n placeContent: (ctx) => isGridDisplay(ctx.display),\n\n // Flex/Grid ITEM props \u2014 PARENT display must be flex/grid.\n flex: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexFlow: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexGrow: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexShrink: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexBasis: (ctx) => isFlexDisplay(ctx.parentDisplay),\n alignSelf: (ctx) => isFlexDisplay(ctx.parentDisplay) || isGridDisplay(ctx.parentDisplay),\n justifySelf: (ctx) => isGridDisplay(ctx.parentDisplay),\n placeSelf: (ctx) => isGridDisplay(ctx.parentDisplay),\n order: (ctx) => isFlexDisplay(ctx.parentDisplay) || isGridDisplay(ctx.parentDisplay),\n gridArea: (ctx) => isGridDisplay(ctx.parentDisplay),\n gridColumn: (ctx) => isGridDisplay(ctx.parentDisplay),\n gridRow: (ctx) => isGridDisplay(ctx.parentDisplay),\n\n // Position-dependent inset properties.\n top: (ctx) => ctx.position !== 'static',\n right: (ctx) => ctx.position !== 'static',\n bottom: (ctx) => ctx.position !== 'static',\n left: (ctx) => ctx.position !== 'static',\n inset: (ctx) => ctx.position !== 'static',\n zIndex: (ctx) => ctx.position !== 'static',\n\n // Tag-based.\n objectFit: (ctx) => isMediaTag(ctx.tagName),\n objectPosition: (ctx) => isMediaTag(ctx.tagName),\n listStyle: (ctx) => isListTag(ctx.tagName),\n listStyleType: (ctx) => isListTag(ctx.tagName),\n listStylePosition: (ctx) => isListTag(ctx.tagName),\n\n // Padding/margin shorthand-vs-longhand auto-toggle.\n // When ANY longhand is set, hide shorthand; otherwise hide longhands.\n padding: (ctx) => !ctx.hasPaddingLonghand,\n paddingTop: (ctx) => ctx.hasPaddingLonghand,\n paddingRight: (ctx) => ctx.hasPaddingLonghand,\n paddingBottom: (ctx) => ctx.hasPaddingLonghand,\n paddingLeft: (ctx) => ctx.hasPaddingLonghand,\n margin: (ctx) => !ctx.hasMarginLonghand,\n marginTop: (ctx) => ctx.hasMarginLonghand,\n marginRight: (ctx) => ctx.hasMarginLonghand,\n marginBottom: (ctx) => ctx.hasMarginLonghand,\n marginLeft: (ctx) => ctx.hasMarginLonghand,\n\n // Background-image-only props \u2014 meaningless without a background image.\n backgroundPosition: (ctx) => ctx.hasBackgroundImage,\n backgroundSize: (ctx) => ctx.hasBackgroundImage,\n backgroundRepeat: (ctx) => ctx.hasBackgroundImage,\n};\n\n/**\n * True if `prop` should be visible in the visual-mode panel given `ctx`.\n * Properties without an entry in `VISUAL_MODE_RULES` default to visible.\n * Callers are responsible for the explicit-value override (a property that\n * the user has set must remain visible regardless of the rule outcome).\n */\nexport function isVisualModeRowVisible(prop: string, ctx: VisualModeRuleContext): boolean {\n const rule = VISUAL_MODE_RULES[prop];\n return rule ? rule(ctx) : true;\n}\n\n/**\n * Check if property matches the abbreviation pattern\n * For example, \"bC\" matches \"backgroundColor\" (b\u2192b, C\u2192C capital letter)\n */\nfunction matchesAbbreviation(property: string, input: string): boolean {\n if (!input) return false;\n\n let propertyIndex = 0;\n\n for (let inputIndex = 0; inputIndex < input.length; inputIndex++) {\n const inputChar = input[inputIndex];\n let found = false;\n\n // Search from current position to end of property for a match at a word boundary\n while (propertyIndex < property.length) {\n const propChar = property[propertyIndex];\n // Word boundary = first character OR capital letter\n const isWordBoundary =\n propertyIndex === 0 || (propChar === propChar.toUpperCase() && propChar !== propChar.toLowerCase());\n\n if (isWordBoundary && inputChar.toLowerCase() === propChar.toLowerCase()) {\n // Match found at word boundary\n found = true;\n propertyIndex++; // Move past this character for next search\n break;\n }\n\n propertyIndex++;\n }\n\n if (!found) {\n return false; // Couldn't find this input character at a word boundary\n }\n }\n\n return true;\n}\n\n/**\n * Direction-abbreviation shortcuts. When the user types one of these exact\n * inputs, the mapped property is forced to the top of the suggestions list\n * (ahead of startsWith matches like `placeContent` for \"pl\"). \"u\" stands for\n * \"up\" \u2014 a natural mnemonic for `Top`.\n */\nconst PROPERTY_SHORTCUTS: Record<string, string> = {\n pl: 'paddingLeft',\n pr: 'paddingRight',\n pt: 'paddingTop',\n pu: 'paddingTop',\n pb: 'paddingBottom',\n ml: 'marginLeft',\n mr: 'marginRight',\n mt: 'marginTop',\n mu: 'marginTop',\n mb: 'marginBottom',\n};\n\n/**\n * Filter CSS properties based on input value\n * Supports both startsWith matching and camelCase abbreviation matching\n */\nexport function filterCSSProperties(input: string): string[] {\n const normalizedInput = (input ?? '').trim();\n if (!normalizedInput) {\n return CSS_PROPERTIES.slice(0, 15); // Show first 15 by default\n }\n\n // First, try startsWith matching (exact prefix match)\n const startsWithMatches = CSS_PROPERTIES.filter((prop) =>\n prop.toLowerCase().startsWith(normalizedInput.toLowerCase()),\n );\n\n // Then, try abbreviation/fuzzy matching\n const abbreviationMatches = CSS_PROPERTIES.filter(\n (prop) => matchesAbbreviation(prop, normalizedInput) && !startsWithMatches.includes(prop), // Don't duplicate startsWith matches\n );\n\n // Sort each group by popularity, then combine: exact matches first, then fuzzy matches\n const byPriority = (a: string, b: string) => getPropertyPriority(a) - getPropertyPriority(b);\n\n const combined = [...startsWithMatches.sort(byPriority), ...abbreviationMatches.sort(byPriority)];\n\n const shortcut = PROPERTY_SHORTCUTS[normalizedInput.toLowerCase()];\n if (shortcut) {\n return [shortcut, ...combined.filter((prop) => prop !== shortcut)];\n }\n\n return combined;\n}\n\n/**\n * Get available values for a specific CSS property\n * @param propertyName - The CSS property name (e.g., 'flexDirection')\n * @returns Array of valid values for the property, or empty array if property has no predefined values\n */\nexport function getPropertyValues(propertyName: string): string[] {\n const values = CSS_PROPERTIES_DEFINITION[propertyName]?.values;\n return values ? Array.from(values) : [];\n}\n\n/**\n * Filter values for a specific CSS property based on input\n * Supports substring matching and returns values that contain the input\n * @param propertyName - The CSS property name (e.g., 'flexDirection')\n * @param input - The user input to filter values by\n * @returns Filtered array of valid values for the property\n */\nexport function filterPropertyValues(propertyName: string, input: string): string[] {\n const values = getPropertyValues(propertyName);\n if (!values.length) {\n return []; // No predefined values for this property\n }\n\n const normalizedInput = (input ?? '').trim().toLowerCase();\n if (!normalizedInput) {\n return values; // Return all values if no input\n }\n\n // Filter values that contain the input (substring match)\n return values.filter((value) => value.toLowerCase().includes(normalizedInput));\n}\n\n/**\n * Get the property type for a CSS property\n * @param propertyName - The CSS property name\n * @returns The property type ('string' | 'select' | 'boolean' | 'number') or undefined\n */\nexport function getPropertyType(propertyName: string): 'string' | 'select' | 'boolean' | 'number' | undefined {\n return CSS_PROPERTIES_DEFINITION[propertyName]?.type;\n}\n\n/**\n * CSS properties whose numeric values are unitless by spec \u2014 `font-weight: 400`,\n * `line-height: 1.5`, `opacity: 0.8`, `z-index: 10`, etc. The auto-px commit\n * normalizer must NOT append `px` to bare numbers for these.\n */\nexport const UNITLESS_PROPERTIES: ReadonlySet<string> = new Set([\n 'fontWeight',\n 'lineHeight',\n 'opacity',\n 'fillOpacity',\n 'strokeOpacity',\n 'stopOpacity',\n 'zIndex',\n 'order',\n 'flexGrow',\n 'flexShrink',\n 'flex',\n 'columnCount',\n 'columns',\n 'tabSize',\n 'orphans',\n 'widows',\n 'gridRow',\n 'gridColumn',\n 'gridRowStart',\n 'gridRowEnd',\n 'gridColumnStart',\n 'gridColumnEnd',\n 'animationIterationCount',\n 'aspectRatio',\n 'scale',\n]);\n\n/**\n * Whether bare numeric values for `propertyName` should be treated as pixels at\n * commit time (e.g. typing `52` for `width` becomes `52px`). Unitless props,\n * `select`/`boolean` keyword props, and existing `number`-typed entries return false.\n */\nexport function appendsPxByDefault(propertyName: string): boolean {\n if (UNITLESS_PROPERTIES.has(propertyName)) return false;\n const def = CSS_PROPERTIES_DEFINITION[propertyName];\n if (def?.type === 'select' || def?.type === 'boolean' || def?.type === 'number') return false;\n return true;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * CSS Property Definition structure\n */\ninterface CSSPropertyDefinition {\n values?: readonly string[];\n type?: 'string' | 'select' | 'boolean' | 'number';\n}\n\n/**\n * CSS Properties with their valid values and metadata\n * Used for autocomplete suggestions for both property names and values\n */\nexport const CSS_PROPERTIES_DEFINITION: Record<string, CSSPropertyDefinition> = {\n // Display & Layout\n display: {\n values: ['block', 'flex', 'grid', 'inline', 'inline-block', 'inline-flex', 'inline-grid', 'none'],\n type: 'select',\n },\n position: {\n values: ['static', 'relative', 'absolute', 'fixed', 'sticky'],\n type: 'select',\n },\n top: { type: 'string' },\n right: { type: 'string' },\n bottom: { type: 'string' },\n left: { type: 'string' },\n inset: { type: 'string' },\n zIndex: { type: 'number' },\n\n // Dimensions\n width: { type: 'string' },\n height: { type: 'string' },\n minWidth: { type: 'string' },\n maxWidth: { type: 'string' },\n minHeight: { type: 'string' },\n maxHeight: { type: 'string' },\n aspectRatio: { type: 'string' },\n\n // Spacing\n margin: { type: 'string' },\n marginTop: { type: 'string' },\n marginRight: { type: 'string' },\n marginBottom: { type: 'string' },\n marginLeft: { type: 'string' },\n padding: { type: 'string' },\n paddingTop: { type: 'string' },\n paddingRight: { type: 'string' },\n paddingBottom: { type: 'string' },\n paddingLeft: { type: 'string' },\n gap: { type: 'string' },\n rowGap: { type: 'string' },\n columnGap: { type: 'string' },\n\n // Borders\n border: { type: 'string' },\n borderWidth: { type: 'string' },\n borderStyle: {\n values: ['solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset', 'none'],\n type: 'select',\n },\n borderColor: { type: 'string' },\n borderTop: { type: 'string' },\n borderRight: { type: 'string' },\n borderBottom: { type: 'string' },\n borderLeft: { type: 'string' },\n borderRadius: { type: 'string' },\n borderTopLeftRadius: { type: 'string' },\n borderTopRightRadius: { type: 'string' },\n borderBottomLeftRadius: { type: 'string' },\n borderBottomRightRadius: { type: 'string' },\n\n // Background & Colors\n background: { type: 'string' },\n backgroundColor: { type: 'string' },\n backgroundImage: { type: 'string' },\n backgroundSize: {\n values: ['auto', 'cover', 'contain'],\n type: 'select',\n },\n backgroundPosition: {\n values: ['top', 'bottom', 'left', 'right', 'center'],\n type: 'select',\n },\n backgroundRepeat: {\n values: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'],\n type: 'select',\n },\n backgroundAttachment: {\n values: ['scroll', 'fixed', 'local'],\n type: 'select',\n },\n backgroundOrigin: {\n values: ['border-box', 'padding-box', 'content-box'],\n type: 'select',\n },\n backgroundBlendMode: {\n values: [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ],\n type: 'select',\n },\n // Gradient-text recipe (`background: linear-gradient(...); background-clip:\n // text; -webkit-background-clip: text; -webkit-text-fill-color: transparent`).\n // The `Webkit*` capitalization is intentional \u2014 utilityClassMapper's\n // camel\u2192kebab emitter only prepends `-` when the first letter is uppercase,\n // so `WebkitBackgroundClip` round-trips back to `-webkit-background-clip`.\n backgroundClip: {\n values: ['border-box', 'padding-box', 'content-box', 'text'],\n type: 'select',\n },\n WebkitBackgroundClip: {\n values: ['border-box', 'padding-box', 'content-box', 'text'],\n type: 'select',\n },\n WebkitTextFillColor: { type: 'string' },\n WebkitTextStroke: { type: 'string' },\n WebkitTextStrokeWidth: { type: 'string' },\n WebkitTextStrokeColor: { type: 'string' },\n color: { type: 'string' },\n opacity: { type: 'number' },\n\n // Flexbox\n flex: { type: 'string' },\n flexDirection: {\n values: ['row', 'column', 'row-reverse', 'column-reverse'],\n type: 'select',\n },\n flexWrap: {\n values: ['nowrap', 'wrap', 'wrap-reverse'],\n type: 'select',\n },\n flexFlow: { type: 'string' },\n justifyContent: {\n values: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly'],\n type: 'select',\n },\n alignItems: {\n values: ['flex-start', 'flex-end', 'center', 'stretch', 'baseline'],\n type: 'select',\n },\n alignContent: {\n values: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'stretch'],\n type: 'select',\n },\n alignSelf: {\n values: ['auto', 'flex-start', 'flex-end', 'center', 'stretch', 'baseline'],\n type: 'select',\n },\n flexGrow: { type: 'number' },\n flexShrink: { type: 'number' },\n flexBasis: { type: 'string' },\n order: { type: 'number' },\n\n // Grid\n grid: { type: 'string' },\n gridTemplateColumns: { type: 'string' },\n gridTemplateRows: { type: 'string' },\n gridTemplateAreas: { type: 'string' },\n gridGap: { type: 'string' },\n gridColumn: { type: 'string' },\n gridRow: { type: 'string' },\n gridArea: { type: 'string' },\n gridAutoFlow: {\n values: ['row', 'column', 'row dense', 'column dense'],\n type: 'select',\n },\n gridAutoColumns: { type: 'string' },\n gridAutoRows: { type: 'string' },\n justifyItems: {\n values: ['start', 'end', 'center', 'stretch'],\n type: 'select',\n },\n justifySelf: {\n values: ['auto', 'start', 'end', 'center', 'stretch'],\n type: 'select',\n },\n placeContent: { type: 'string' },\n placeItems: { type: 'string' },\n placeSelf: { type: 'string' },\n\n // Text & Font\n fontSize: { type: 'string' },\n fontWeight: {\n values: ['100', '200', '300', '400', '500', '600', '700', '800', '900', 'normal', 'bold'],\n type: 'select',\n },\n fontFamily: { type: 'string' },\n fontStyle: {\n values: ['normal', 'italic', 'oblique'],\n type: 'select',\n },\n lineHeight: { type: 'string' },\n textAlign: {\n values: ['left', 'right', 'center', 'justify', 'start', 'end'],\n type: 'select',\n },\n textDecoration: {\n values: ['none', 'underline', 'overline', 'line-through'],\n type: 'select',\n },\n textDecorationLine: {\n values: ['none', 'underline', 'overline', 'line-through'],\n type: 'select',\n },\n textDecorationStyle: {\n values: ['solid', 'double', 'dotted', 'dashed', 'wavy'],\n type: 'select',\n },\n textDecorationColor: { type: 'string' },\n textDecorationThickness: { type: 'string' },\n textUnderlineOffset: { type: 'string' },\n textUnderlinePosition: { type: 'string' },\n textTransform: {\n values: ['none', 'capitalize', 'uppercase', 'lowercase'],\n type: 'select',\n },\n textRendering: {\n values: ['auto', 'optimizeSpeed', 'optimizeLegibility', 'geometricPrecision'],\n type: 'select',\n },\n fontVariant: { type: 'string' },\n fontStretch: { type: 'string' },\n fontFeatureSettings: { type: 'string' },\n fontVariationSettings: { type: 'string' },\n fontKerning: {\n values: ['auto', 'normal', 'none'],\n type: 'select',\n },\n WebkitFontSmoothing: {\n values: ['auto', 'none', 'antialiased', 'subpixel-antialiased'],\n type: 'select',\n },\n MozOsxFontSmoothing: {\n values: ['auto', 'grayscale'],\n type: 'select',\n },\n hyphens: {\n values: ['none', 'manual', 'auto'],\n type: 'select',\n },\n WebkitHyphens: {\n values: ['none', 'manual', 'auto'],\n type: 'select',\n },\n writingMode: {\n values: ['horizontal-tb', 'vertical-rl', 'vertical-lr'],\n type: 'select',\n },\n direction: {\n values: ['ltr', 'rtl'],\n type: 'select',\n },\n tabSize: { type: 'string' },\n wordWrap: {\n values: ['normal', 'break-word'],\n type: 'select',\n },\n letterSpacing: { type: 'string' },\n wordSpacing: { type: 'string' },\n wordBreak: {\n values: ['normal', 'break-all', 'keep-all', 'break-word'],\n type: 'select',\n },\n overflowWrap: {\n values: ['normal', 'break-word', 'anywhere'],\n type: 'select',\n },\n textWrap: {\n values: ['wrap', 'nowrap', 'balance', 'pretty', 'stable'],\n type: 'select',\n },\n textIndent: { type: 'string' },\n verticalAlign: {\n values: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super'],\n type: 'select',\n },\n\n // Box Shadow & Effects\n boxShadow: { type: 'string' },\n textShadow: { type: 'string' },\n filter: { type: 'string' },\n backdropFilter: { type: 'string' },\n WebkitBackdropFilter: { type: 'string' },\n transform: { type: 'string' },\n transformOrigin: { type: 'string' },\n transformStyle: {\n values: ['flat', 'preserve-3d'],\n type: 'select',\n },\n perspective: { type: 'string' },\n perspectiveOrigin: { type: 'string' },\n transition: { type: 'string' },\n transitionProperty: { type: 'string' },\n transitionDuration: { type: 'string' },\n transitionTimingFunction: { type: 'string' },\n transitionDelay: { type: 'string' },\n animation: { type: 'string' },\n backfaceVisibility: {\n values: ['visible', 'hidden'],\n type: 'select',\n },\n mixBlendMode: {\n values: [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ],\n type: 'select',\n },\n isolation: {\n values: ['auto', 'isolate'],\n type: 'select',\n },\n willChange: { type: 'string' },\n imageRendering: {\n values: ['auto', 'crisp-edges', 'pixelated', 'smooth'],\n type: 'select',\n },\n clipPath: { type: 'string' },\n WebkitClipPath: { type: 'string' },\n // Mask family \u2014 gradient/SVG masks. Emit both the standard and `-webkit-`\n // form because Safari still needs the prefix.\n maskImage: { type: 'string' },\n WebkitMaskImage: { type: 'string' },\n maskSize: { type: 'string' },\n WebkitMaskSize: { type: 'string' },\n maskPosition: { type: 'string' },\n WebkitMaskPosition: { type: 'string' },\n maskRepeat: { type: 'string' },\n WebkitMaskRepeat: { type: 'string' },\n maskOrigin: { type: 'string' },\n WebkitMaskOrigin: { type: 'string' },\n maskClip: { type: 'string' },\n WebkitMaskClip: { type: 'string' },\n maskComposite: { type: 'string' },\n WebkitMaskComposite: { type: 'string' },\n maskMode: { type: 'string' },\n maskType: {\n values: ['luminance', 'alpha'],\n type: 'select',\n },\n\n // Overflow & Content\n overflow: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n overflowX: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n overflowY: {\n values: ['visible', 'hidden', 'scroll', 'auto'],\n type: 'select',\n },\n whiteSpace: {\n values: ['normal', 'nowrap', 'pre', 'pre-wrap', 'pre-line'],\n type: 'select',\n },\n textOverflow: {\n values: ['clip', 'ellipsis'],\n type: 'select',\n },\n visibility: {\n values: ['visible', 'hidden', 'collapse'],\n type: 'select',\n },\n content: { type: 'string' },\n\n // Cursor & Interaction\n cursor: {\n values: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'not-allowed', 'help'],\n type: 'select',\n },\n pointerEvents: {\n values: ['auto', 'none'],\n type: 'select',\n },\n userSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n WebkitUserSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n MozUserSelect: {\n values: ['auto', 'none', 'text', 'all'],\n type: 'select',\n },\n caretColor: { type: 'string' },\n appearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n WebkitAppearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n MozAppearance: {\n values: ['none', 'auto', 'menulist-button', 'textfield'],\n type: 'select',\n },\n\n // Outline\n outline: { type: 'string' },\n outlineWidth: { type: 'string' },\n outlineStyle: {\n values: ['none', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset'],\n type: 'select',\n },\n outlineColor: { type: 'string' },\n outlineOffset: { type: 'string' },\n\n // Lists\n listStyle: { type: 'string' },\n listStyleType: {\n values: [\n 'none',\n 'disc',\n 'circle',\n 'square',\n 'decimal',\n 'decimal-leading-zero',\n 'lower-roman',\n 'upper-roman',\n 'lower-alpha',\n 'upper-alpha',\n ],\n type: 'select',\n },\n listStylePosition: {\n values: ['inside', 'outside'],\n type: 'select',\n },\n\n // Miscellaneous\n float: {\n values: ['left', 'right', 'none'],\n type: 'select',\n },\n clear: {\n values: ['left', 'right', 'both', 'none'],\n type: 'select',\n },\n boxSizing: {\n values: ['content-box', 'border-box'],\n type: 'select',\n },\n objectFit: {\n values: ['fill', 'contain', 'cover', 'scale-down'],\n type: 'select',\n },\n objectPosition: {\n values: ['top', 'bottom', 'left', 'right', 'center'],\n type: 'select',\n },\n resize: {\n values: ['none', 'both', 'horizontal', 'vertical'],\n type: 'select',\n },\n scrollBehavior: {\n values: ['auto', 'smooth'],\n type: 'select',\n },\n scrollSnapType: { type: 'string' },\n scrollSnapAlign: {\n values: ['none', 'start', 'end', 'center'],\n type: 'select',\n },\n scrollSnapStop: {\n values: ['normal', 'always'],\n type: 'select',\n },\n scrollMarginTop: { type: 'string' },\n scrollMarginRight: { type: 'string' },\n scrollMarginBottom: { type: 'string' },\n scrollMarginLeft: { type: 'string' },\n scrollPaddingTop: { type: 'string' },\n scrollPaddingRight: { type: 'string' },\n scrollPaddingBottom: { type: 'string' },\n scrollPaddingLeft: { type: 'string' },\n overscrollBehavior: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n overscrollBehaviorX: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n overscrollBehaviorY: {\n values: ['auto', 'contain', 'none'],\n type: 'select',\n },\n // CSS Containment \u2014 container queries depend on these.\n containerType: {\n values: ['normal', 'size', 'inline-size'],\n type: 'select',\n },\n containerName: { type: 'string' },\n accentColor: { type: 'string' },\n\n // SVG\n stroke: { type: 'string' },\n strokeWidth: { type: 'string' },\n strokeDasharray: { type: 'string' },\n strokeDashoffset: { type: 'string' },\n strokeLinecap: {\n values: ['butt', 'round', 'square'],\n type: 'select',\n },\n strokeLinejoin: {\n values: ['miter', 'round', 'bevel'],\n type: 'select',\n },\n strokeOpacity: { type: 'number' },\n fill: { type: 'string' },\n fillOpacity: { type: 'number' },\n fillRule: {\n values: ['nonzero', 'evenodd'],\n type: 'select',\n },\n};\n\n/**\n * Common CSS properties for autocomplete suggestions (camelCase for React/JS)\n * Derived from CSS_PROPERTIES_DEFINITION keys\n */\nexport const CSS_PROPERTIES = Object.keys(CSS_PROPERTIES_DEFINITION);\n\n/**\n * Popularity tiers for CSS properties (lower = more common).\n * Properties not listed default to tier 3.\n * Used to sort autocomplete suggestions within each match group.\n */\nconst CSS_PROPERTY_PRIORITY: Record<string, number> = {\n // Tier 1: Most commonly used\n display: 1,\n position: 1,\n width: 1,\n height: 1,\n margin: 1,\n padding: 1,\n color: 1,\n backgroundColor: 1,\n fontSize: 1,\n fontWeight: 1,\n border: 1,\n borderRadius: 1,\n flex: 1,\n flexDirection: 1,\n justifyContent: 1,\n alignItems: 1,\n gap: 1,\n opacity: 1,\n overflow: 1,\n zIndex: 1,\n top: 1,\n right: 1,\n bottom: 1,\n left: 1,\n cursor: 1,\n background: 1,\n boxShadow: 1,\n transition: 1,\n transform: 1,\n lineHeight: 1,\n textAlign: 1,\n\n // Tier 2: Common but less frequent\n maxWidth: 2,\n maxHeight: 2,\n minWidth: 3,\n minHeight: 3,\n marginTop: 2,\n marginBottom: 2,\n marginLeft: 2,\n marginRight: 2,\n paddingTop: 2,\n paddingBottom: 2,\n paddingLeft: 2,\n paddingRight: 2,\n fontFamily: 2,\n fontStyle: 2,\n textDecoration: 2,\n textTransform: 2,\n letterSpacing: 2,\n borderWidth: 2,\n borderStyle: 2,\n borderColor: 2,\n borderBottom: 2,\n borderTop: 2,\n flexWrap: 2,\n flexGrow: 2,\n flexShrink: 2,\n flexBasis: 2,\n alignSelf: 2,\n gridTemplateColumns: 2,\n gridTemplateRows: 2,\n backgroundImage: 2,\n backgroundSize: 2,\n backgroundPosition: 2,\n whiteSpace: 2,\n textOverflow: 2,\n visibility: 2,\n pointerEvents: 2,\n userSelect: 2,\n boxSizing: 2,\n objectFit: 2,\n filter: 2,\n animation: 2,\n outline: 2,\n inset: 2,\n};\n\nfunction getPropertyPriority(property: string): number {\n return CSS_PROPERTY_PRIORITY[property] ?? 3;\n}\n\n/**\n * CSS Property Groups for organizing styles in the editor\n * Order determines display order in the UI\n */\nexport const CSS_PROPERTY_GROUPS: Record<string, string[]> = {\n Layout: ['display'],\n Spacing: [\n 'margin',\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'padding',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n ],\n Size: ['width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'aspectRatio'],\n Position: ['position', 'top', 'right', 'bottom', 'left', 'inset', 'zIndex'],\n Flexbox: [\n 'flex',\n 'flexDirection',\n 'flexWrap',\n 'flexFlow',\n 'justifyContent',\n 'alignItems',\n 'alignContent',\n 'gap',\n 'rowGap',\n 'columnGap',\n 'alignSelf',\n 'flexGrow',\n 'flexShrink',\n 'flexBasis',\n 'order',\n ],\n Grid: [\n 'grid',\n 'gridTemplateColumns',\n 'gridTemplateRows',\n 'gridTemplateAreas',\n 'gridGap',\n 'gridColumn',\n 'gridRow',\n 'gridArea',\n 'gridAutoFlow',\n 'gridAutoColumns',\n 'gridAutoRows',\n 'justifyItems',\n 'justifySelf',\n 'placeContent',\n 'placeItems',\n 'placeSelf',\n ],\n Typography: [\n 'fontWeight',\n 'fontSize',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'color',\n 'textAlign',\n 'textDecoration',\n 'textTransform',\n 'letterSpacing',\n 'wordSpacing',\n 'wordBreak',\n 'overflowWrap',\n 'textIndent',\n 'verticalAlign',\n ],\n Background: [\n 'background',\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundSize',\n 'backgroundPosition',\n 'backgroundRepeat',\n 'opacity',\n ],\n Borders: [\n 'borderRadius',\n 'borderTopLeftRadius',\n 'borderTopRightRadius',\n 'borderBottomLeftRadius',\n 'borderBottomRightRadius',\n 'border',\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n ],\n Outline: ['outline', 'outlineWidth', 'outlineStyle', 'outlineColor', 'outlineOffset'],\n Effects: [\n 'boxShadow',\n 'textShadow',\n 'filter',\n 'backdropFilter',\n 'transform',\n 'transformOrigin',\n 'transition',\n 'animation',\n 'backfaceVisibility',\n 'mixBlendMode',\n 'clipPath',\n ],\n Overflow: ['overflow', 'overflowX', 'overflowY', 'whiteSpace', 'textOverflow', 'visibility', 'content'],\n Interaction: ['cursor', 'pointerEvents', 'userSelect'],\n Lists: ['listStyle', 'listStyleType', 'listStylePosition'],\n Other: ['float', 'clear', 'boxSizing', 'objectFit', 'objectPosition', 'resize', 'scrollBehavior', 'accentColor'],\n SVG: [\n 'stroke',\n 'strokeWidth',\n 'strokeDasharray',\n 'strokeDashoffset',\n 'strokeLinecap',\n 'strokeLinejoin',\n 'strokeOpacity',\n 'fill',\n 'fillOpacity',\n 'fillRule',\n ],\n};\n\n/**\n * Get the group name for a CSS property\n * @param propertyName - The CSS property name\n * @returns The group name or 'Other' if not found\n */\nexport function getPropertyGroup(propertyName: string): string {\n for (const [groupName, properties] of Object.entries(CSS_PROPERTY_GROUPS)) {\n if (properties.includes(propertyName)) {\n return groupName;\n }\n }\n return 'Other';\n}\n\n/**\n * Subset of CSS properties shown as \"always-visible\" rows in the visual style\n * editor mode (Webflow-like). Each property here renders even when unset, so\n * the user can see at a glance which properties are available and click an\n * empty row to start typing a value.\n *\n * Keys must be group names from CSS_PROPERTY_GROUPS so the visual editor can\n * reuse the same group headers as list mode.\n */\nexport const VISUAL_MODE_PROPERTIES: Record<string, string[]> = {\n Layout: ['display'],\n Grid: ['gridTemplateColumns'],\n Flexbox: ['flexDirection', 'flexWrap', 'justifyContent', 'alignItems', 'gap', 'flexGrow', 'flexShrink', 'flexBasis'],\n Spacing: [\n 'margin',\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'padding',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n ],\n Size: ['width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight'],\n Position: ['position', 'top', 'right', 'bottom', 'left', 'zIndex'],\n Typography: [\n 'fontFamily',\n 'fontWeight',\n 'fontSize',\n 'lineHeight',\n 'color',\n 'letterSpacing',\n 'textAlign',\n 'textTransform',\n 'textDecoration',\n ],\n Background: [\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundSize',\n 'backgroundPosition',\n 'backgroundRepeat',\n 'opacity',\n ],\n Borders: ['borderRadius', 'borderWidth', 'borderStyle', 'borderColor'],\n Effects: ['boxShadow', 'transform', 'transition', 'filter'],\n Overflow: ['overflow', 'whiteSpace'],\n Interaction: ['cursor', 'pointerEvents'],\n};\n\nconst VISUAL_MODE_PROPERTIES_SET = new Set(Object.values(VISUAL_MODE_PROPERTIES).flat());\n\n/**\n * True if `prop` belongs to the always-visible visual-mode list.\n */\nexport function isVisualModeProperty(prop: string): boolean {\n return VISUAL_MODE_PROPERTIES_SET.has(prop);\n}\n\n/**\n * Context used by visual-mode visibility rules. Captures everything a rule\n * needs to decide whether a property row is meaningful for the currently\n * selected element. Built once per render in `StyleEditor`.\n */\nexport interface VisualModeRuleContext {\n /** Effective `display` of the selected element \u2014 getComputedStyle().display\n * with declared (instance/inherited/effective) merge as fallback when the\n * iframe hasn't loaded yet. Defaults to 'block'. */\n display: string;\n /** Effective `display` of the DOM parent \u2014 used for flex/grid item props\n * whose applicability depends on the parent's layout mode. '' when no\n * parent is reachable (root element, iframe missing). */\n parentDisplay: string;\n /** Effective `position` of the selected element. Defaults to 'static'. */\n position: string;\n /** Lowercase HTML tag name of the selected element ('div', 'img', 'ul'\u2026). */\n tagName: string;\n /** True if any of paddingTop / paddingRight / paddingBottom / paddingLeft\n * is set anywhere in the cascade (instance + inherited + effective).\n * When true, the panel shows the four longhand rows and hides `padding`. */\n hasPaddingLonghand: boolean;\n /** Same as `hasPaddingLonghand` for the four `margin*` longhands. */\n hasMarginLonghand: boolean;\n /** True if `backgroundImage` (or the `background` shorthand) is set anywhere\n * in the cascade. Drives visibility of background-image-only properties\n * like `backgroundPosition` / `backgroundSize` / `backgroundRepeat`. */\n hasBackgroundImage: boolean;\n}\n\nexport type VisualModeRule = (ctx: VisualModeRuleContext) => boolean;\n\nconst isFlexDisplay = (d: string) => d === 'flex' || d === 'inline-flex';\nconst isGridDisplay = (d: string) => d === 'grid' || d === 'inline-grid';\nconst isListTag = (t: string) => t === 'ul' || t === 'ol' || t === 'li';\nconst isMediaTag = (t: string) => t === 'img' || t === 'video';\n\n/**\n * Visibility rules for the visual-mode style panel. Each entry is a predicate\n * that returns true when the row should be rendered for the current element\n * context. Properties without an entry are always visible. Properties that\n * are *explicitly set* on the element bypass these rules (the explicit-value\n * override is enforced by the caller, not here).\n */\nexport const VISUAL_MODE_RULES: Record<string, VisualModeRule> = {\n // Flex/Grid CONTAINER props \u2014 own display must be flex/grid.\n flexDirection: (ctx) => isFlexDisplay(ctx.display),\n flexWrap: (ctx) => isFlexDisplay(ctx.display),\n justifyContent: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n alignItems: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n alignContent: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n gap: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n rowGap: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n columnGap: (ctx) => isFlexDisplay(ctx.display) || isGridDisplay(ctx.display),\n gridTemplateColumns: (ctx) => isGridDisplay(ctx.display),\n gridTemplateRows: (ctx) => isGridDisplay(ctx.display),\n gridTemplateAreas: (ctx) => isGridDisplay(ctx.display),\n gridGap: (ctx) => isGridDisplay(ctx.display),\n gridAutoFlow: (ctx) => isGridDisplay(ctx.display),\n gridAutoColumns: (ctx) => isGridDisplay(ctx.display),\n gridAutoRows: (ctx) => isGridDisplay(ctx.display),\n justifyItems: (ctx) => isGridDisplay(ctx.display),\n placeItems: (ctx) => isGridDisplay(ctx.display),\n placeContent: (ctx) => isGridDisplay(ctx.display),\n\n // Flex/Grid ITEM props \u2014 PARENT display must be flex/grid.\n flex: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexFlow: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexGrow: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexShrink: (ctx) => isFlexDisplay(ctx.parentDisplay),\n flexBasis: (ctx) => isFlexDisplay(ctx.parentDisplay),\n alignSelf: (ctx) => isFlexDisplay(ctx.parentDisplay) || isGridDisplay(ctx.parentDisplay),\n justifySelf: (ctx) => isGridDisplay(ctx.parentDisplay),\n placeSelf: (ctx) => isGridDisplay(ctx.parentDisplay),\n order: (ctx) => isFlexDisplay(ctx.parentDisplay) || isGridDisplay(ctx.parentDisplay),\n gridArea: (ctx) => isGridDisplay(ctx.parentDisplay),\n gridColumn: (ctx) => isGridDisplay(ctx.parentDisplay),\n gridRow: (ctx) => isGridDisplay(ctx.parentDisplay),\n\n // Position-dependent inset properties.\n top: (ctx) => ctx.position !== 'static',\n right: (ctx) => ctx.position !== 'static',\n bottom: (ctx) => ctx.position !== 'static',\n left: (ctx) => ctx.position !== 'static',\n inset: (ctx) => ctx.position !== 'static',\n zIndex: (ctx) => ctx.position !== 'static',\n\n // Tag-based.\n objectFit: (ctx) => isMediaTag(ctx.tagName),\n objectPosition: (ctx) => isMediaTag(ctx.tagName),\n listStyle: (ctx) => isListTag(ctx.tagName),\n listStyleType: (ctx) => isListTag(ctx.tagName),\n listStylePosition: (ctx) => isListTag(ctx.tagName),\n\n // Padding/margin shorthand-vs-longhand auto-toggle.\n // When ANY longhand is set, hide shorthand; otherwise hide longhands.\n padding: (ctx) => !ctx.hasPaddingLonghand,\n paddingTop: (ctx) => ctx.hasPaddingLonghand,\n paddingRight: (ctx) => ctx.hasPaddingLonghand,\n paddingBottom: (ctx) => ctx.hasPaddingLonghand,\n paddingLeft: (ctx) => ctx.hasPaddingLonghand,\n margin: (ctx) => !ctx.hasMarginLonghand,\n marginTop: (ctx) => ctx.hasMarginLonghand,\n marginRight: (ctx) => ctx.hasMarginLonghand,\n marginBottom: (ctx) => ctx.hasMarginLonghand,\n marginLeft: (ctx) => ctx.hasMarginLonghand,\n\n // Background-image-only props \u2014 meaningless without a background image.\n backgroundPosition: (ctx) => ctx.hasBackgroundImage,\n backgroundSize: (ctx) => ctx.hasBackgroundImage,\n backgroundRepeat: (ctx) => ctx.hasBackgroundImage,\n};\n\n/**\n * True if `prop` should be visible in the visual-mode panel given `ctx`.\n * Properties without an entry in `VISUAL_MODE_RULES` default to visible.\n * Callers are responsible for the explicit-value override (a property that\n * the user has set must remain visible regardless of the rule outcome).\n */\nexport function isVisualModeRowVisible(prop: string, ctx: VisualModeRuleContext): boolean {\n const rule = VISUAL_MODE_RULES[prop];\n return rule ? rule(ctx) : true;\n}\n\n/**\n * Check if property matches the abbreviation pattern\n * For example, \"bC\" matches \"backgroundColor\" (b\u2192b, C\u2192C capital letter)\n */\nfunction matchesAbbreviation(property: string, input: string): boolean {\n if (!input) return false;\n\n let propertyIndex = 0;\n\n for (let inputIndex = 0; inputIndex < input.length; inputIndex++) {\n const inputChar = input[inputIndex] ?? '';\n let found = false;\n\n // Search from current position to end of property for a match at a word boundary\n while (propertyIndex < property.length) {\n const propChar = property[propertyIndex] ?? '';\n // Word boundary = first character OR capital letter\n const isWordBoundary =\n propertyIndex === 0 || (propChar === propChar.toUpperCase() && propChar !== propChar.toLowerCase());\n\n if (isWordBoundary && inputChar.toLowerCase() === propChar.toLowerCase()) {\n // Match found at word boundary\n found = true;\n propertyIndex++; // Move past this character for next search\n break;\n }\n\n propertyIndex++;\n }\n\n if (!found) {\n return false; // Couldn't find this input character at a word boundary\n }\n }\n\n return true;\n}\n\n/**\n * Direction-abbreviation shortcuts. When the user types one of these exact\n * inputs, the mapped property is forced to the top of the suggestions list\n * (ahead of startsWith matches like `placeContent` for \"pl\"). \"u\" stands for\n * \"up\" \u2014 a natural mnemonic for `Top`.\n */\nconst PROPERTY_SHORTCUTS: Record<string, string> = {\n pl: 'paddingLeft',\n pr: 'paddingRight',\n pt: 'paddingTop',\n pu: 'paddingTop',\n pb: 'paddingBottom',\n ml: 'marginLeft',\n mr: 'marginRight',\n mt: 'marginTop',\n mu: 'marginTop',\n mb: 'marginBottom',\n};\n\n/**\n * Filter CSS properties based on input value\n * Supports both startsWith matching and camelCase abbreviation matching\n */\nexport function filterCSSProperties(input: string): string[] {\n const normalizedInput = (input ?? '').trim();\n if (!normalizedInput) {\n return CSS_PROPERTIES.slice(0, 15); // Show first 15 by default\n }\n\n // First, try startsWith matching (exact prefix match)\n const startsWithMatches = CSS_PROPERTIES.filter((prop) =>\n prop.toLowerCase().startsWith(normalizedInput.toLowerCase()),\n );\n\n // Then, try abbreviation/fuzzy matching\n const abbreviationMatches = CSS_PROPERTIES.filter(\n (prop) => matchesAbbreviation(prop, normalizedInput) && !startsWithMatches.includes(prop), // Don't duplicate startsWith matches\n );\n\n // Sort each group by popularity, then combine: exact matches first, then fuzzy matches\n const byPriority = (a: string, b: string) => getPropertyPriority(a) - getPropertyPriority(b);\n\n const combined = [...startsWithMatches.sort(byPriority), ...abbreviationMatches.sort(byPriority)];\n\n const shortcut = PROPERTY_SHORTCUTS[normalizedInput.toLowerCase()];\n if (shortcut) {\n return [shortcut, ...combined.filter((prop) => prop !== shortcut)];\n }\n\n return combined;\n}\n\n/**\n * Get available values for a specific CSS property\n * @param propertyName - The CSS property name (e.g., 'flexDirection')\n * @returns Array of valid values for the property, or empty array if property has no predefined values\n */\nexport function getPropertyValues(propertyName: string): string[] {\n const values = CSS_PROPERTIES_DEFINITION[propertyName]?.values;\n return values ? Array.from(values) : [];\n}\n\n/**\n * Filter values for a specific CSS property based on input\n * Supports substring matching and returns values that contain the input\n * @param propertyName - The CSS property name (e.g., 'flexDirection')\n * @param input - The user input to filter values by\n * @returns Filtered array of valid values for the property\n */\nexport function filterPropertyValues(propertyName: string, input: string): string[] {\n const values = getPropertyValues(propertyName);\n if (!values.length) {\n return []; // No predefined values for this property\n }\n\n const normalizedInput = (input ?? '').trim().toLowerCase();\n if (!normalizedInput) {\n return values; // Return all values if no input\n }\n\n // Filter values that contain the input (substring match)\n return values.filter((value) => value.toLowerCase().includes(normalizedInput));\n}\n\n/**\n * Get the property type for a CSS property\n * @param propertyName - The CSS property name\n * @returns The property type ('string' | 'select' | 'boolean' | 'number') or undefined\n */\nexport function getPropertyType(propertyName: string): 'string' | 'select' | 'boolean' | 'number' | undefined {\n return CSS_PROPERTIES_DEFINITION[propertyName]?.type;\n}\n\n/**\n * CSS properties whose numeric values are unitless by spec \u2014 `font-weight: 400`,\n * `line-height: 1.5`, `opacity: 0.8`, `z-index: 10`, etc. The auto-px commit\n * normalizer must NOT append `px` to bare numbers for these.\n */\nexport const UNITLESS_PROPERTIES: ReadonlySet<string> = new Set([\n 'fontWeight',\n 'lineHeight',\n 'opacity',\n 'fillOpacity',\n 'strokeOpacity',\n 'stopOpacity',\n 'zIndex',\n 'order',\n 'flexGrow',\n 'flexShrink',\n 'flex',\n 'columnCount',\n 'columns',\n 'tabSize',\n 'orphans',\n 'widows',\n 'gridRow',\n 'gridColumn',\n 'gridRowStart',\n 'gridRowEnd',\n 'gridColumnStart',\n 'gridColumnEnd',\n 'animationIterationCount',\n 'aspectRatio',\n 'scale',\n]);\n\n/**\n * Whether bare numeric values for `propertyName` should be treated as pixels at\n * commit time (e.g. typing `52` for `width` becomes `52px`). Unitless props,\n * `select`/`boolean` keyword props, and existing `number`-typed entries return false.\n */\nexport function appendsPxByDefault(propertyName: string): boolean {\n if (UNITLESS_PROPERTIES.has(propertyName)) return false;\n const def = CSS_PROPERTIES_DEFINITION[propertyName];\n if (def?.type === 'select' || def?.type === 'boolean' || def?.type === 'number') return false;\n return true;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
serveFile,
|
|
12
12
|
spawnProcess,
|
|
13
13
|
writeFile
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-7CCVOL5M.js";
|
|
15
15
|
import "./chunk-KSBZ2L7C.js";
|
|
16
16
|
export {
|
|
17
17
|
ensureDir,
|
|
@@ -27,4 +27,4 @@ export {
|
|
|
27
27
|
spawnProcess,
|
|
28
28
|
writeFile
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=fs-
|
|
30
|
+
//# sourceMappingURL=fs-G3ANWEFP.js.map
|