meno-core 1.0.47 → 1.0.48
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/build-astro.ts +2 -2
- package/dist/build-static.js +7 -7
- package/dist/chunks/{chunk-FED5MME6.js → chunk-3FHJUHAS.js} +5 -4
- package/dist/chunks/chunk-3FHJUHAS.js.map +7 -0
- package/dist/chunks/{chunk-XSWR3QLI.js → chunk-B2RTLDXY.js} +130 -130
- package/dist/chunks/chunk-B2RTLDXY.js.map +7 -0
- package/dist/chunks/{chunk-ZTKHJQ2Z.js → chunk-BJRKEPMP.js} +2 -2
- package/dist/chunks/{chunk-LJFB5EBT.js → chunk-D5E3OKSL.js} +5 -5
- package/dist/chunks/{chunk-KITQJYZV.js → chunk-EK4KESLU.js} +33 -3
- package/dist/chunks/chunk-EK4KESLU.js.map +7 -0
- package/dist/chunks/{chunk-47UNLQUU.js → chunk-NKUV77SR.js} +43 -10
- package/dist/chunks/chunk-NKUV77SR.js.map +7 -0
- package/dist/chunks/{chunk-BCLGRZ3U.js → chunk-NP76N4HQ.js} +2 -2
- package/dist/chunks/{chunk-IF3RATBY.js → chunk-RQSTH2BS.js} +2 -2
- package/dist/chunks/{chunk-FGUZOYJX.js → chunk-TPQ7APVQ.js} +23 -75
- package/dist/chunks/chunk-TPQ7APVQ.js.map +7 -0
- package/dist/chunks/{configService-DYCUEURL.js → configService-IGJEC3MC.js} +3 -3
- package/dist/entries/server-router.js +8 -8
- package/dist/lib/client/index.js +13 -3
- package/dist/lib/client/index.js.map +2 -2
- package/dist/lib/server/index.js +1737 -296
- package/dist/lib/server/index.js.map +4 -4
- package/dist/lib/shared/index.js +8 -4
- package/dist/lib/shared/index.js.map +1 -1
- package/lib/client/core/ComponentBuilder.test.ts +17 -0
- package/lib/client/core/ComponentBuilder.ts +17 -0
- package/lib/server/index.ts +1 -1
- package/lib/server/jsonLoader.test.ts +0 -17
- package/lib/server/jsonLoader.ts +0 -81
- package/lib/server/routes/api/variables.ts +4 -2
- package/lib/server/ssr/htmlGenerator.test.ts +1 -2
- package/lib/server/ssr/htmlGenerator.ts +2 -2
- package/lib/server/ssr/ssrRenderer.test.ts +56 -1
- package/lib/server/ssr/ssrRenderer.ts +34 -28
- package/lib/server/utils/jsonLineMapper.test.ts +53 -1
- package/lib/server/utils/jsonLineMapper.ts +43 -3
- package/lib/server/webflow/buildWebflow.ts +343 -123
- package/lib/server/webflow/index.ts +1 -0
- package/lib/server/webflow/nodeToWebflow.test.ts +3170 -0
- package/lib/server/webflow/nodeToWebflow.ts +2141 -129
- package/lib/server/webflow/styleMapper.test.ts +389 -0
- package/lib/server/webflow/styleMapper.ts +517 -63
- package/lib/server/webflow/templateWrapper.ts +49 -0
- package/lib/server/webflow/types.ts +218 -18
- package/lib/shared/elementClassName.test.ts +15 -0
- package/lib/shared/elementClassName.ts +7 -3
- package/lib/shared/registry/nodeTypes/ListNodeType.ts +1 -1
- package/lib/shared/types/index.ts +1 -0
- package/lib/shared/types/variables.ts +37 -0
- package/package.json +1 -1
- package/dist/chunks/chunk-47UNLQUU.js.map +0 -7
- package/dist/chunks/chunk-FED5MME6.js.map +0 -7
- package/dist/chunks/chunk-FGUZOYJX.js.map +0 -7
- package/dist/chunks/chunk-KITQJYZV.js.map +0 -7
- package/dist/chunks/chunk-XSWR3QLI.js.map +0 -7
- /package/dist/chunks/{chunk-ZTKHJQ2Z.js.map → chunk-BJRKEPMP.js.map} +0 -0
- /package/dist/chunks/{chunk-LJFB5EBT.js.map → chunk-D5E3OKSL.js.map} +0 -0
- /package/dist/chunks/{chunk-BCLGRZ3U.js.map → chunk-NP76N4HQ.js.map} +0 -0
- /package/dist/chunks/{chunk-IF3RATBY.js.map → chunk-RQSTH2BS.js.map} +0 -0
- /package/dist/chunks/{configService-DYCUEURL.js.map → configService-IGJEC3MC.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/shared/validation/schemas.ts", "../../lib/shared/registry/ComponentRegistry.ts", "../../lib/shared/registry/ClientRegistry.ts", "../../lib/shared/registry/SSRRegistry.ts", "../../lib/shared/registry/RegistryManager.ts", "../../lib/shared/registry/BaseNodeTypeRegistry.ts", "../../lib/shared/registry/ClientNodeTypeRegistry.ts", "../../lib/shared/registry/SSRNodeTypeRegistry.ts", "../../lib/shared/registry/NodeTypeManager.ts", "../../lib/shared/registry/defineNodeType.ts", "../../lib/shared/registry/createNodeType.ts", "../../lib/shared/registry/fieldPresets.ts", "../../lib/shared/registry/nodeTypes/HtmlNodeType.ts", "../../lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts", "../../lib/shared/registry/nodeTypes/SlotMarkerType.ts", "../../lib/shared/registry/nodeTypes/EmbedNodeType.ts", "../../lib/shared/registry/nodeTypes/LinkNodeType.ts", "../../lib/shared/registry/nodeTypes/LocaleListNodeType.ts", "../../lib/shared/registry/nodeTypes/ListNodeType.ts", "../../lib/shared/registry/nodeTypes/index.ts", "../../lib/shared/registry/index.ts", "../../lib/shared/types/prefetch.ts", "../../lib/shared/validation/validators.ts", "../../lib/shared/types/cms.ts", "../../lib/shared/globalTemplateContext.ts", "../../lib/shared/expressionEvaluator.ts", "../../lib/shared/itemTemplateUtils.ts", "../../lib/shared/styleUtils.ts", "../../lib/shared/responsiveStyleUtils.ts", "../../lib/shared/nodeUtils.ts", "../../lib/shared/validation/propValidator.ts", "../../lib/shared/propResolver.ts", "../../lib/shared/styleValueRegistry.ts", "../../lib/shared/utilityClassConfig.ts", "../../lib/shared/utilityClassMapper.ts", "../../lib/shared/paths/Path.ts", "../../lib/shared/paths/PathValidator.ts", "../../lib/shared/paths/PathConverter.ts", "../../lib/shared/paths/PathUtils.ts", "../../lib/shared/elementClassName.ts", "../../lib/shared/interactiveStyleMappings.ts", "../../lib/shared/linkUtils.ts", "../../lib/shared/cssNamedColors.ts", "../../lib/shared/cssGeneration.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Validation Schemas\n * Zod schemas for runtime validation of JSON data structures\n * All schemas use .passthrough() to maintain backward compatibility with unknown fields\n *\n * Note: Node type definitions also define their own schemas for TypeScript type inference.\n * The schemas here are the authoritative source for VALIDATION (with proper recursive\n * ComponentNode references). Node type files use simplified schemas for type inference.\n */\n\nimport { z } from 'zod';\nimport type { StyleObject, StyleMapping, LinkMapping, HtmlMapping } from '../types/styles';\nimport { NODE_TYPE } from '../constants';\n\n/**\n * Prop type schema - validates PropType values (excluding list for base definition)\n */\nexport const BasePropTypeSchema = z.enum(['string', 'select', 'boolean', 'number', 'link', 'file', 'rich-text', 'embed']);\n\n/**\n * Full prop type schema including list\n */\nexport const PropTypeSchema = z.enum(['string', 'select', 'boolean', 'number', 'link', 'file', 'rich-text', 'embed', 'list']);\n\n/**\n * Base prop definition schema (for non-list props)\n */\nexport const BasePropDefinitionSchema = z.object({\n type: BasePropTypeSchema,\n default: z.union([z.string(), z.number(), z.boolean(), z.object({ href: z.string(), target: z.string().optional() })]).optional(),\n options: z.array(z.string()).readonly().optional(),\n enumName: z.string().optional(), // For 'select' type: reference to project-level enum\n accept: z.string().optional(), // For 'file' type: MIME pattern like \"image/*\", \"video/*\"\n editor: z.enum(['basic', 'extended']).optional(), // For 'rich-text' type: which editor to use\n}).passthrough();\n\n/**\n * Project-level enums configuration schema\n * Keys are enum names, values are arrays of options\n */\nexport const EnumsConfigSchema = z.record(z.string(), z.array(z.string()));\n\n/**\n * List item schema - defines structure of each item in a list prop\n */\nexport const ListItemSchemaSchema = z.record(z.string(), BasePropDefinitionSchema);\n\n/**\n * List prop definition schema\n */\nexport const ListPropDefinitionSchema = z.object({\n type: z.literal('list'),\n itemSchema: ListItemSchemaSchema,\n default: z.array(z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.object({ href: z.string(), target: z.string().optional() }), z.null()]))).optional(),\n}).passthrough();\n\n/**\n * Prop definition schema (union of base and list)\n * Validates prop definitions from component interfaces\n */\nexport const PropDefinitionSchema = z.union([\n ListPropDefinitionSchema,\n BasePropDefinitionSchema,\n]);\n\n/**\n * Style mapping schema\n */\nexport const StyleMappingSchema: z.ZodType<StyleMapping> = z.object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z.record(z.string(), z.union([z.string(), z.number()])),\n}).passthrough();\n\n/**\n * Boolean mapping schema - for conditional rendering (if property)\n * Maps component prop values to boolean results\n */\nexport const BooleanMappingSchema = z.object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z.record(z.string(), z.boolean()),\n}).passthrough();\n\n/**\n * If condition schema - can be boolean, string template, or mapping\n */\nexport const IfConditionSchema = z.union([\n z.boolean(),\n z.string(),\n BooleanMappingSchema,\n]);\n\n/**\n * Link mapping schema - for link node href mappings\n * values is optional - when missing, acts as passthrough for link-type props\n */\nexport const LinkMappingSchema: z.ZodType<LinkMapping> = z.object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z.record(z.string(), z.object({\n href: z.string(),\n target: z.string().optional(),\n })).optional(),\n}).passthrough();\n\n/**\n * HTML mapping schema - for embed node html content mappings\n * values is optional - when missing, acts as passthrough for string-type props\n */\nexport const HtmlMappingSchema: z.ZodType<HtmlMapping> = z.object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z.record(z.string(), z.string()).optional(),\n}).passthrough();\n\n/**\n * Style object schema - flat style object\n */\nexport const StyleObjectSchema: z.ZodType<StyleObject> = z.record(\n z.string(),\n z.union([\n z.string(),\n z.number(),\n StyleMappingSchema,\n ])\n);\n\n/**\n * Responsive style object schema\n */\nexport const ResponsiveStyleObjectSchema = z.object({\n base: StyleObjectSchema.optional(),\n tablet: StyleObjectSchema.optional(),\n mobile: StyleObjectSchema.optional(),\n}).passthrough();\n\n/**\n * Style value schema - can be either flat or responsive\n */\nexport const StyleValueSchema = z.union([\n StyleObjectSchema,\n ResponsiveStyleObjectSchema,\n]);\n\n/**\n * Interactive style rule schema\n * Validates prefix/postfix selector parts for interactive styles\n * CSS pattern: {prefix}.element{postfix}\n */\nexport const InteractiveStyleRuleSchema = z.object({\n name: z.string().optional(),\n prefix: z.string().optional(),\n postfix: z.string().optional(),\n style: StyleValueSchema,\n previewProp: z.string().optional(),\n});\n\n/**\n * Interactive styles schema - array of rules\n */\nexport const InteractiveStylesSchema = z.array(InteractiveStyleRuleSchema);\n\n// ============================================================================\n// Node Type Schemas (Validation)\n// These schemas handle proper recursive validation with ComponentNode references.\n// Node type files also have schemas for TypeScript type inference.\n// ============================================================================\n\n/**\n * Slot marker schema\n * default: Optional default content when instance has no children\n * Can be an array of ComponentNodes or a string\n */\nexport const SlotMarkerSchema: z.ZodType<any> = z.lazy(() => z.object({\n type: z.literal(NODE_TYPE.SLOT),\n default: z.union([\n z.array(z.union([ComponentNodeSchema, z.string()])),\n z.string(),\n ]).optional(),\n}).passthrough());\n\n/**\n * Component node schema - discriminated union (forward declaration)\n * Uses z.ZodType<any> because schema is more permissive than TypeScript types\n */\nlet ComponentNodeSchema: z.ZodType<any>;\n\n/**\n * HTML node schema - recursive definition\n */\nexport const HtmlNodeSchema: z.ZodType<any> = z.lazy(() => z.object({\n type: z.literal(NODE_TYPE.NODE),\n tag: z.string(),\n label: z.string().optional(),\n if: IfConditionSchema.optional(),\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(),\n generateElementClass: z.boolean().optional(),\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n props: z.record(z.string(), z.any()).optional(), // Allow props for backward compatibility\n children: z.union([\n z.array(z.union([ComponentNodeSchema, z.string()])),\n z.string(),\n ]).optional(),\n}).passthrough());\n\n/**\n * Component instance node schema - recursive definition\n */\nexport const ComponentInstanceNodeSchema: z.ZodType<any> = z.lazy(() => z.object({\n type: z.literal(NODE_TYPE.COMPONENT),\n component: z.string(),\n label: z.string().optional(),\n if: IfConditionSchema.optional(),\n props: z.record(z.string(), z.any()).optional(),\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(),\n generateElementClass: z.boolean().optional(),\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n children: z.union([\n z.array(z.union([ComponentNodeSchema, z.string()])),\n z.string(),\n ]).optional(),\n}).passthrough());\n\n/**\n * Embed node schema - for rendering custom HTML/SVG content\n */\nexport const EmbedNodeSchema: z.ZodType<any> = z.lazy(() => z.object({\n type: z.literal(NODE_TYPE.EMBED),\n html: z.union([z.string(), HtmlMappingSchema]),\n label: z.string().optional(),\n if: IfConditionSchema.optional(),\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(),\n generateElementClass: z.boolean().optional(),\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n}).passthrough());\n\n/**\n * Link node schema - renders as div in editor, <a> in SSR\n */\nexport const LinkNodeSchema: z.ZodType<any> = z.lazy(() => z.object({\n type: z.literal(NODE_TYPE.LINK),\n href: z.union([z.string(), LinkMappingSchema]),\n label: z.string().optional(),\n if: IfConditionSchema.optional(),\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(),\n generateElementClass: z.boolean().optional(),\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n children: z.union([\n z.array(z.union([ComponentNodeSchema, z.string()])),\n z.string(),\n ]).optional(),\n}).passthrough());\n\n/**\n * Locale list node schema - renders locale switcher links\n */\nexport const LocaleListNodeSchema: z.ZodType<any> = z.lazy(() => z.object({\n type: z.literal(NODE_TYPE.LOCALE_LIST),\n label: z.string().optional(),\n if: IfConditionSchema.optional(),\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(),\n generateElementClass: z.boolean().optional(),\n itemStyle: StyleValueSchema.optional(),\n activeItemStyle: StyleValueSchema.optional(),\n separatorStyle: StyleValueSchema.optional(),\n showCurrent: z.boolean().optional(),\n showSeparator: z.boolean().optional(),\n showFlag: z.boolean().optional(),\n flagStyle: StyleValueSchema.optional(),\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n}).passthrough());\n\n/**\n * Unified List node schema (basic version for ComponentNodeSchema union)\n * Handles both prop-based lists and CMS collection-based lists.\n * Uses sourceType to distinguish: 'prop' (default) or 'collection'.\n * Also supports legacy 'cms-list' type for backward compatibility.\n */\nexport const ListNodeSchemaBasic: z.ZodType<any> = z.lazy(() => z.object({\n type: z.union([z.literal(NODE_TYPE.LIST), z.literal('cms-list')]), // Support both for migration\n sourceType: z.enum(['prop', 'collection']).optional(), // defaults to 'prop'\n source: z.string().optional(), // Source prop name or collection name\n collection: z.string().optional(), // Legacy field for cms-list migration\n label: z.string().optional(),\n if: IfConditionSchema.optional(),\n itemAs: z.string().optional(),\n // Collection-specific options\n items: z.union([z.string(), z.array(z.string())]).optional(),\n filter: z.unknown().optional(),\n sort: z.unknown().optional(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n excludeCurrentItem: z.boolean().optional(),\n emitTemplate: z.boolean().optional(),\n children: z.array(z.union([ComponentNodeSchema, z.string()])).optional(),\n}).passthrough());\n\n/**\n * @deprecated Use ListNodeSchemaBasic instead.\n * Kept for backward compatibility during migration.\n */\nexport const CMSListNodeSchemaBasic = ListNodeSchemaBasic;\n\n/**\n * Component node schema - discriminated union (now defined after dependencies)\n */\nComponentNodeSchema = z.union([\n HtmlNodeSchema,\n ComponentInstanceNodeSchema,\n SlotMarkerSchema,\n EmbedNodeSchema,\n LinkNodeSchema,\n LocaleListNodeSchema,\n ListNodeSchemaBasic,\n]);\n\n// Export ComponentNodeSchema\nexport { ComponentNodeSchema };\n\n// ============================================================================\n// Library Schemas\n// ============================================================================\n\n/**\n * Script load mode schema\n */\nexport const ScriptLoadModeSchema = z.enum(['async', 'defer']);\n\n/**\n * Library position schema\n */\nexport const LibraryPositionSchema = z.enum(['head', 'body-end']);\n\n/**\n * Script type schema\n */\nexport const ScriptTypeSchema = z.enum(['classic', 'module']);\n\n/**\n * JavaScript library schema\n */\nexport const JSLibraryConfigSchema = z.object({\n url: z.string().min(1),\n mode: ScriptLoadModeSchema.optional(),\n position: LibraryPositionSchema.optional(),\n type: ScriptTypeSchema.optional(),\n}).passthrough();\n\n/**\n * CSS library schema\n */\nexport const CSSLibraryConfigSchema = z.object({\n url: z.string().min(1),\n media: z.string().optional(),\n inline: z.boolean().optional(),\n}).passthrough();\n\n/**\n * Libraries config schema\n */\nexport const LibrariesConfigSchema = z.object({\n js: z.array(JSLibraryConfigSchema).optional(),\n css: z.array(CSSLibraryConfigSchema).optional(),\n}).passthrough();\n\n/**\n * Structured component definition schema\n */\nexport const StructuredComponentDefinitionSchema = z.object({\n interface: z.record(z.string(), PropDefinitionSchema).optional(),\n structure: ComponentNodeSchema.optional(),\n javascript: z.string().optional(),\n css: z.string().optional(),\n category: z.string().optional(),\n libraries: LibrariesConfigSchema.optional(),\n acceptsStyles: z.boolean().optional(),\n}).passthrough();\n\n/**\n * Component definition schema\n * Accepts both legacy format (with type/props/children) and new format (just component)\n * New format checked first since it's more common\n */\nexport const ComponentDefinitionSchema = z.union([\n // New format: { component: {...} }\n z.object({\n component: StructuredComponentDefinitionSchema,\n }).passthrough(),\n // Legacy format: { type, props?, children?, component }\n z.object({\n type: z.string(),\n props: z.record(z.string(), z.any()).optional(),\n children: z.array(z.any()).optional(),\n component: StructuredComponentDefinitionSchema,\n }).passthrough(),\n]);\n\n/**\n * I18n value schema - accepts either a string or an i18n object\n */\nconst I18nOrStringSchema = z.union([\n z.string(),\n z.object({\n _i18n: z.literal(true),\n }).passthrough(),\n]);\n\n/**\n * Library merge mode schema\n */\nexport const LibraryMergeModeSchema = z.enum(['extend', 'replace']);\n\n/**\n * Page libraries config schema (with merge mode)\n */\nexport const PageLibrariesConfigSchema = z.object({\n js: z.array(JSLibraryConfigSchema).optional(),\n css: z.array(CSSLibraryConfigSchema).optional(),\n mode: LibraryMergeModeSchema.optional(),\n}).passthrough();\n\n/**\n * Page metadata schema (base version without CMS - used internally)\n * Note: CMS fields added via PageMetaDataWithCMSSchema after CMS schemas are defined\n */\nconst CustomCodeConfigSchema = z.object({\n head: z.string().optional(),\n bodyStart: z.string().optional(),\n bodyEnd: z.string().optional(),\n}).passthrough();\n\nconst PageMetaDataBaseSchema = z.object({\n title: I18nOrStringSchema.optional(),\n description: I18nOrStringSchema.optional(),\n keywords: I18nOrStringSchema.optional(),\n ogTitle: I18nOrStringSchema.optional(),\n ogDescription: I18nOrStringSchema.optional(),\n ogImage: z.string().optional(),\n ogType: z.string().optional(),\n slugs: z.record(z.string(), z.string()).optional(),\n draft: z.boolean().optional(),\n libraries: PageLibrariesConfigSchema.optional(),\n customCode: CustomCodeConfigSchema.optional(),\n}).passthrough();\n\n// Temporary export for backward compatibility - will be replaced with full schema below\nexport const PageMetaDataSchema = PageMetaDataBaseSchema;\n\n/**\n * Line range schema for element line number tracking\n */\nexport const LineRangeSchema = z.object({\n startLine: z.number(),\n endLine: z.number(),\n});\n\n/**\n * JSON page schema\n * Requires at least one field to prevent empty objects from matching\n */\nexport const JSONPageSchema = z.object({\n components: z.record(z.string(), ComponentDefinitionSchema).optional(),\n root: ComponentNodeSchema.optional(),\n meta: PageMetaDataSchema.optional(),\n _lineMap: z.record(z.string(), LineRangeSchema).optional(),\n}).passthrough().refine((data) => {\n // Require at least one field to be present\n return data.meta !== undefined || data.components !== undefined || data.root !== undefined;\n}, {\n message: \"JSONPage must have at least one of: meta, components, or root\"\n});\n\n/**\n * Page data with component schema\n */\nexport const PageDataWithComponentSchema = z.object({\n component: z.object({\n structure: ComponentNodeSchema.optional(),\n interface: z.record(z.string(), PropDefinitionSchema).optional(),\n javascript: z.string().optional(),\n css: z.string().optional(),\n acceptsStyles: z.boolean().optional(),\n }).passthrough(),\n}).passthrough();\n\n/**\n * Page data schema - union of JSONPage and PageDataWithComponent\n * PageDataWithComponent checked first because it's more specific\n */\nexport const PageDataSchema = z.union([\n PageDataWithComponentSchema,\n JSONPageSchema,\n]);\n\n// ============================================================================\n// CMS Schemas\n// ============================================================================\n\n/**\n * CMS field type schema\n */\nexport const CMSFieldTypeSchema = z.enum([\n 'string', 'text', 'rich-text', 'number', 'boolean', 'image', 'file', 'date', 'select', 'reference'\n]);\n\n/**\n * CMS field definition schema\n */\nexport const CMSFieldDefinitionSchema = z.object({\n type: CMSFieldTypeSchema,\n required: z.boolean().optional(),\n default: z.unknown().optional(),\n label: z.string().optional(),\n description: z.string().optional(),\n options: z.array(z.string()).optional(),\n accept: z.string().optional(),\n collection: z.string().optional(),\n multiple: z.boolean().optional(),\n}).passthrough();\n\n/**\n * CMS client data strategy schema\n */\nexport const CMSClientDataStrategySchema = z.enum(['auto', 'inline', 'static']);\n\n/**\n * CMS client data config schema\n * Configures client-side data exposure for dynamic filtering\n */\nexport const CMSClientDataConfigSchema = z.object({\n enabled: z.boolean(),\n strategy: CMSClientDataStrategySchema,\n threshold: z.number().positive().optional(),\n fields: z.array(z.string()).optional(),\n}).passthrough();\n\n/**\n * CMS schema schema (defines collection structure)\n */\nexport const CMSSchemaSchema = z.object({\n id: z.string(),\n name: z.string(),\n slugField: z.string(),\n urlPattern: z.string(),\n fields: z.record(CMSFieldDefinitionSchema),\n clientData: CMSClientDataConfigSchema.optional(),\n}).passthrough();\n\n/**\n * CMS item schema (content entry)\n */\nexport const CMSItemSchema = z.object({\n _id: z.string(),\n _slug: z.string().optional(),\n _filename: z.string().optional(),\n _createdAt: z.string().optional(),\n}).passthrough();\n\n/**\n * CMS filter condition schema\n */\nexport const CMSFilterConditionSchema = z.object({\n field: z.string(),\n operator: z.enum(['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'contains', 'in']).optional(),\n value: z.unknown(),\n});\n\n/**\n * CMS sort config schema\n */\nexport const CMSSortConfigSchema = z.object({\n field: z.string(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n/**\n * CMSList query schema\n */\nexport const CMSListQuerySchema = z.object({\n collection: z.string(),\n filter: z.union([\n CMSFilterConditionSchema,\n z.array(CMSFilterConditionSchema),\n z.record(z.unknown()),\n ]).optional(),\n sort: z.union([CMSSortConfigSchema, z.array(CMSSortConfigSchema)]).optional(),\n limit: z.number().positive().optional(),\n offset: z.number().nonnegative().optional(),\n});\n\n/**\n * CMSList node schema - special built-in node for rendering CMS item lists\n * Children are repeated for each item with named context variables:\n * - {{<itemAs>.field}} - Access CMS item fields (e.g., {{post.title}})\n * - {{<itemAs>Index}}, {{<itemAs>First}}, {{<itemAs>Last}} - Position info\n * Legacy {{item.field}}, {{itemIndex}}, etc. still supported\n */\nexport const CMSListNodeSchema = z.object({\n type: z.literal('cms-list'),\n collection: z.string(),\n if: IfConditionSchema.optional(),\n itemAs: z.string().optional(),\n items: z.union([z.string(), z.array(z.string())]).optional(),\n filter: z.union([\n CMSFilterConditionSchema,\n z.array(CMSFilterConditionSchema),\n z.record(z.unknown()),\n ]).optional(),\n sort: z.union([CMSSortConfigSchema, z.array(CMSSortConfigSchema)]).optional(),\n limit: z.number().positive().optional(),\n offset: z.number().nonnegative().optional(),\n excludeCurrentItem: z.boolean().optional(),\n children: z.array(z.unknown()).optional(),\n}).passthrough();\n\n/**\n * Page CMS config schema (embedded in page meta)\n */\nexport const PageCmsConfigSchema = z.object({\n id: z.string(),\n name: z.string(),\n slugField: z.string(),\n urlPattern: z.string(),\n fields: z.record(CMSFieldDefinitionSchema),\n}).passthrough();\n\n/**\n * Page metadata schema with CMS support\n * Extends base schema with source and cms fields\n */\nexport const PageMetaDataWithCMSSchema = z.object({\n title: z.union([z.string(), z.object({ _i18n: z.literal(true) }).passthrough()]).optional(),\n description: z.union([z.string(), z.object({ _i18n: z.literal(true) }).passthrough()]).optional(),\n keywords: z.union([z.string(), z.object({ _i18n: z.literal(true) }).passthrough()]).optional(),\n ogTitle: z.union([z.string(), z.object({ _i18n: z.literal(true) }).passthrough()]).optional(),\n ogDescription: z.union([z.string(), z.object({ _i18n: z.literal(true) }).passthrough()]).optional(),\n ogImage: z.string().optional(),\n ogType: z.string().optional(),\n slugs: z.record(z.string(), z.string()).optional(),\n source: z.enum(['static', 'cms']).optional(),\n cms: PageCmsConfigSchema.optional(),\n draft: z.boolean().optional(),\n libraries: PageLibrariesConfigSchema.optional(),\n customCode: CustomCodeConfigSchema.optional(),\n}).passthrough();\n", "/**\n * Base Component Registry\n * Abstract base class for component registries\n * Provides common functionality for client and SSR registries\n */\n\nimport type { ComponentDefinition } from '../types';\n\n/**\n * Base registry class with common functionality\n */\nexport abstract class BaseComponentRegistry {\n protected registry: Record<string, ComponentDefinition> = {};\n private listeners: Set<() => void> = new Set();\n \n /**\n * Register a component with the given name\n */\n register(name: string, definition: ComponentDefinition): void {\n this.registry[name] = definition;\n this.notify();\n }\n \n /**\n * Get a component by name\n */\n get(name: string): ComponentDefinition | undefined {\n return this.registry[name];\n }\n \n /**\n * Check if a component exists\n */\n has(name: string): boolean {\n return name in this.registry;\n }\n \n /**\n * Clear all registered components\n */\n clear(): void {\n this.registry = {};\n this.notify();\n }\n \n /**\n * Merge components into the registry\n * Existing components with the same name will be overwritten\n */\n merge(components: Record<string, ComponentDefinition>): void {\n Object.assign(this.registry, components);\n this.notify();\n }\n \n /**\n * Get all registered components\n */\n getAll(): Record<string, ComponentDefinition> {\n return { ...this.registry };\n }\n \n /**\n * Get list of registered component names\n */\n getNames(): string[] {\n return Object.keys(this.registry);\n }\n \n /**\n * Remove a component by name\n */\n remove(name: string): boolean {\n if (this.has(name)) {\n delete this.registry[name];\n this.notify();\n return true;\n }\n return false;\n }\n\n /**\n * Subscribe to registry changes. Returns an unsubscribe function.\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n protected notify(): void {\n for (const listener of this.listeners) {\n try {\n listener();\n } catch (err) {\n }\n }\n }\n}\n\n", "/**\n * Client Component Registry\n * Extends base registry with client-specific functionality\n */\n\nimport { BaseComponentRegistry } from './ComponentRegistry';\nimport type { ComponentDefinition } from '../types';\n\nexport class ClientRegistry extends BaseComponentRegistry {\n /**\n * Client-specific methods can be added here\n * For now, it's the same as base registry\n */\n}\n\n", "/**\n * SSR Component Registry\n * Extends base registry with SSR-specific functionality\n */\n\nimport { BaseComponentRegistry } from './ComponentRegistry';\nimport type { ComponentDefinition } from '../types';\n\nexport class SSRRegistry extends BaseComponentRegistry {\n /**\n * SSR-specific methods can be added here\n * For now, it's the same as base registry\n */\n}\n\n", "/**\n * Registry Manager\n * Manages multiple component registries (client, SSR, etc.)\n */\n\nimport type { ComponentDefinition } from '../types';\nimport { ClientRegistry } from './ClientRegistry';\nimport { SSRRegistry } from './SSRRegistry';\n\nexport class RegistryManager {\n private clientRegistry: ClientRegistry;\n private ssrRegistry: SSRRegistry;\n\n constructor() {\n this.clientRegistry = new ClientRegistry();\n this.ssrRegistry = new SSRRegistry();\n }\n\n /**\n * Get the client registry\n */\n getClient(): ClientRegistry {\n return this.clientRegistry;\n }\n\n /**\n * Get the SSR registry\n */\n getSSR(): SSRRegistry {\n return this.ssrRegistry;\n }\n\n /**\n * Sync components from one registry to another\n */\n sync(from: 'client' | 'ssr', to: 'client' | 'ssr'): void {\n const source = from === 'client' ? this.clientRegistry : this.ssrRegistry;\n const target = to === 'client' ? this.clientRegistry : this.ssrRegistry;\n \n const components = source.getAll();\n target.merge(components);\n }\n\n /**\n * Register a component in all registries\n */\n registerAll(name: string, definition: ComponentDefinition): void {\n this.clientRegistry.register(name, definition);\n this.ssrRegistry.register(name, definition);\n }\n\n /**\n * Clear all registries\n */\n clearAll(): void {\n this.clientRegistry.clear();\n this.ssrRegistry.clear();\n }\n}\n\n", "/**\n * Base Node Type Registry\n * Abstract base class for node type registries\n * Provides common functionality for client and SSR registries\n */\n\nimport type { ComponentNode } from '../types/nodes';\nimport type { NodeTypeDefinition, NodeCategory, TreeIcon } from './NodeTypeDefinition';\n\n/**\n * Node label info returned by getNodeLabel\n */\nexport interface NodeLabelInfo {\n label: string;\n icon: TreeIcon;\n}\n\n/**\n * Base registry class with common functionality\n */\nexport abstract class BaseNodeTypeRegistry {\n protected registry: Map<string, NodeTypeDefinition> = new Map();\n private listeners: Set<() => void> = new Set();\n private nodeTypeCache: WeakMap<object, NodeTypeDefinition | null> = new WeakMap();\n\n /**\n * Register a node type definition\n */\n register(definition: NodeTypeDefinition): void {\n if (!definition.type) {\n throw new Error('Node type definition must have a type');\n }\n this.registry.set(definition.type, definition);\n this.nodeTypeCache = new WeakMap(); // Clear cache on registration\n this.notify();\n }\n\n /**\n * Register multiple node type definitions at once\n */\n registerAll(definitions: NodeTypeDefinition[]): void {\n for (const definition of definitions) {\n if (!definition.type) {\n throw new Error('Node type definition must have a type');\n }\n this.registry.set(definition.type, definition);\n }\n this.nodeTypeCache = new WeakMap(); // Clear cache on registration\n this.notify();\n }\n\n /**\n * Get a node type definition by type string\n */\n get(type: string): NodeTypeDefinition | undefined {\n return this.registry.get(type);\n }\n\n /**\n * Check if a node type is registered\n */\n has(type: string): boolean {\n return this.registry.has(type);\n }\n\n /**\n * Get all registered node types\n */\n getAll(): NodeTypeDefinition[] {\n return Array.from(this.registry.values());\n }\n\n /**\n * Get node types by category\n */\n getByCategory(category: NodeCategory): NodeTypeDefinition[] {\n return this.getAll().filter((def) => def.category === category);\n }\n\n /**\n * Get list of registered type names\n */\n getNames(): string[] {\n return Array.from(this.registry.keys());\n }\n\n /**\n * Find node type definition by node object using type guards\n * Uses WeakMap caching for performance\n */\n findByNode(node: ComponentNode): NodeTypeDefinition | undefined {\n if (!node || typeof node !== 'object') {\n return undefined;\n }\n\n // Check cache first\n const cached = this.nodeTypeCache.get(node);\n if (cached !== undefined) {\n return cached || undefined;\n }\n\n // Linear search through registered types\n for (const definition of this.registry.values()) {\n if (definition.typeGuard(node)) {\n this.nodeTypeCache.set(node, definition);\n return definition;\n }\n }\n\n // Cache miss result too\n this.nodeTypeCache.set(node, null);\n return undefined;\n }\n\n /**\n * Check if a node matches a specific type\n * More efficient than findByNode when you know the type\n */\n isType<T extends ComponentNode>(node: unknown, type: string): node is T {\n const definition = this.registry.get(type);\n if (!definition) {\n return false;\n }\n return definition.typeGuard(node);\n }\n\n /**\n * Get node label info for tree display\n */\n getNodeLabel(node: ComponentNode): NodeLabelInfo | undefined {\n const definition = this.findByNode(node);\n if (!definition) {\n return undefined;\n }\n return {\n label: definition.treeDisplay.getLabel(node),\n icon: definition.treeDisplay.icon,\n };\n }\n\n /**\n * Get default node for a type\n */\n createDefault(type: string): ComponentNode | undefined {\n const definition = this.registry.get(type);\n if (!definition) {\n return undefined;\n }\n return definition.defaultFactory();\n }\n\n /**\n * Remove a node type by type string\n */\n remove(type: string): boolean {\n if (this.has(type)) {\n this.registry.delete(type);\n this.nodeTypeCache = new WeakMap(); // Clear cache\n this.notify();\n return true;\n }\n return false;\n }\n\n /**\n * Clear all registered node types\n */\n clear(): void {\n this.registry.clear();\n this.nodeTypeCache = new WeakMap();\n this.notify();\n }\n\n /**\n * Subscribe to registry changes. Returns an unsubscribe function.\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Get the number of registered node types\n */\n get size(): number {\n return this.registry.size;\n }\n\n protected notify(): void {\n for (const listener of this.listeners) {\n try {\n listener();\n } catch {\n // Silent fail - don't let one listener break others\n }\n }\n }\n}\n", "/**\n * Client Node Type Registry\n * Registry specialized for client-side (React) rendering\n */\n\nimport type { ReactElement } from 'react';\nimport type { ComponentNode } from '../types/nodes';\nimport { BaseNodeTypeRegistry } from './BaseNodeTypeRegistry';\nimport type { ClientRenderContext } from './NodeTypeDefinition';\n\n/**\n * Client-side node type registry\n * Extends base registry with client rendering capabilities\n */\nexport class ClientNodeTypeRegistry extends BaseNodeTypeRegistry {\n /**\n * Render a node using the registered renderer\n * Returns null if no renderer is found for the node type\n */\n renderNode(node: ComponentNode, context: ClientRenderContext): ReactElement | null {\n const definition = this.findByNode(node);\n if (!definition) {\n return null;\n }\n return definition.clientRenderer(node as any, context);\n }\n\n /**\n * Check if a node can be rendered by this registry\n */\n canRender(node: ComponentNode): boolean {\n return this.findByNode(node) !== undefined;\n }\n}\n", "/**\n * SSR Node Type Registry\n * Registry specialized for server-side rendering (HTML strings)\n */\n\nimport type { ComponentNode } from '../types/nodes';\nimport { BaseNodeTypeRegistry } from './BaseNodeTypeRegistry';\nimport type { SSRRenderContext } from './NodeTypeDefinition';\n\n/**\n * Server-side node type registry\n * Extends base registry with SSR rendering capabilities\n */\nexport class SSRNodeTypeRegistry extends BaseNodeTypeRegistry {\n /**\n * Render a node to HTML string using the registered renderer\n * Returns empty string if no renderer is found for the node type\n */\n renderNode(node: ComponentNode, context: SSRRenderContext): string {\n const definition = this.findByNode(node);\n if (!definition) {\n return '';\n }\n return definition.ssrRenderer(node as any, context);\n }\n\n /**\n * Check if a node can be rendered by this registry\n */\n canRender(node: ComponentNode): boolean {\n return this.findByNode(node) !== undefined;\n }\n}\n", "/**\n * Node Type Manager\n * Global singleton managing both client and SSR registries\n */\n\nimport { ClientNodeTypeRegistry } from './ClientNodeTypeRegistry';\nimport { SSRNodeTypeRegistry } from './SSRNodeTypeRegistry';\nimport type { NodeTypeDefinition } from './NodeTypeDefinition';\n\n/**\n * Manages both client and SSR node type registries\n * Ensures both registries stay in sync\n */\nexport class NodeTypeManager {\n private clientRegistry: ClientNodeTypeRegistry;\n private ssrRegistry: SSRNodeTypeRegistry;\n\n constructor() {\n this.clientRegistry = new ClientNodeTypeRegistry();\n this.ssrRegistry = new SSRNodeTypeRegistry();\n }\n\n /**\n * Get the client-side registry\n */\n getClient(): ClientNodeTypeRegistry {\n return this.clientRegistry;\n }\n\n /**\n * Get the SSR registry\n */\n getSSR(): SSRNodeTypeRegistry {\n return this.ssrRegistry;\n }\n\n /**\n * Register a node type in both registries\n */\n register(definition: NodeTypeDefinition): void {\n this.clientRegistry.register(definition);\n this.ssrRegistry.register(definition);\n }\n\n /**\n * Register multiple node types in both registries\n */\n registerAll(definitions: NodeTypeDefinition[]): void {\n this.clientRegistry.registerAll(definitions);\n this.ssrRegistry.registerAll(definitions);\n }\n\n /**\n * Check if a node type is registered\n */\n has(type: string): boolean {\n return this.clientRegistry.has(type);\n }\n\n /**\n * Get a node type definition\n */\n get(type: string): NodeTypeDefinition | undefined {\n return this.clientRegistry.get(type);\n }\n\n /**\n * Get all registered node types\n */\n getAll(): NodeTypeDefinition[] {\n return this.clientRegistry.getAll();\n }\n\n /**\n * Get list of registered type names\n */\n getNames(): string[] {\n return this.clientRegistry.getNames();\n }\n\n /**\n * Clear both registries\n */\n clear(): void {\n this.clientRegistry.clear();\n this.ssrRegistry.clear();\n }\n}\n\n/**\n * Global singleton node type manager\n * Use this instance throughout the application\n */\nexport const globalNodeTypeManager = new NodeTypeManager();\n", "/**\n * defineNodeType Helper\n * Type-safe helper function to create node type definitions\n */\n\nimport type { ComponentNode } from '../types/nodes';\nimport type {\n NodeTypeDefinition,\n NodeTypeDefinitionInput,\n NodeCapabilities,\n} from './NodeTypeDefinition';\n\n/**\n * Default capabilities for node types\n */\nconst DEFAULT_CAPABILITIES: NodeCapabilities = {\n canHaveChildren: true,\n canHaveStyle: true,\n canHaveAttributes: true,\n canBeNested: true,\n requiresProps: [],\n};\n\n/**\n * Create a node type definition with sensible defaults\n * Provides type safety and validation at definition time\n */\nexport function defineNodeType<TNode extends ComponentNode>(\n input: NodeTypeDefinitionInput<TNode>\n): NodeTypeDefinition<TNode> {\n // Validate required fields\n if (!input.type) {\n throw new Error('Node type definition must have a type');\n }\n if (!input.displayName) {\n throw new Error('Node type definition must have a displayName');\n }\n if (!input.schema) {\n throw new Error('Node type definition must have a schema');\n }\n if (!input.typeGuard) {\n throw new Error('Node type definition must have a typeGuard');\n }\n if (!input.clientRenderer) {\n throw new Error('Node type definition must have a clientRenderer');\n }\n if (!input.ssrRenderer) {\n throw new Error('Node type definition must have an ssrRenderer');\n }\n if (!input.treeDisplay) {\n throw new Error('Node type definition must have treeDisplay');\n }\n if (!input.defaultFactory) {\n throw new Error('Node type definition must have a defaultFactory');\n }\n\n return {\n type: input.type,\n displayName: input.displayName,\n category: input.category ?? 'core',\n schema: input.schema,\n typeGuard: input.typeGuard,\n clientRenderer: input.clientRenderer,\n ssrRenderer: input.ssrRenderer,\n treeDisplay: input.treeDisplay,\n propsEditor: input.propsEditor,\n defaultFactory: input.defaultFactory,\n capabilities: {\n ...DEFAULT_CAPABILITIES,\n ...input.capabilities,\n },\n };\n}\n", "/**\n * createNodeType Helper\n * Simplified API for creating node type definitions with auto-generated type guards\n * and inferred TypeScript types from Zod schemas\n */\n\nimport type { ReactElement } from 'react';\nimport type { ZodType, z } from 'zod';\nimport type {\n NodeTypeDefinition,\n NodeCapabilities,\n NodeCategory,\n TreeIcon,\n ClientRenderContext,\n SSRRenderContext,\n EditableField,\n} from './NodeTypeDefinition';\n\n/**\n * Default capabilities for node types\n */\nconst DEFAULT_CAPABILITIES: NodeCapabilities = {\n canHaveChildren: true,\n canHaveStyle: true,\n canHaveAttributes: true,\n canBeNested: true,\n requiresProps: [],\n};\n\n/**\n * Create a type guard function from a type string value\n * Automatically generates the type guard based on the node's type field\n */\nfunction createTypeGuard<T>(typeValue: string) {\n return (node: unknown): node is T =>\n node !== null &&\n typeof node === 'object' &&\n 'type' in node &&\n (node as { type: unknown }).type === typeValue;\n}\n\n/**\n * Input configuration for createNodeType\n * Schema is the single source of truth - TypeScript types are inferred from it\n */\nexport interface CreateNodeTypeInput<TSchema extends ZodType> {\n /** The type discriminator value (e.g., 'image', 'video') */\n type: string;\n\n /** Human-readable display name (e.g., 'Image', 'Video') */\n displayName: string;\n\n /** Category for grouping in command palette */\n category?: NodeCategory;\n\n /** Zod schema - single source of truth for validation and type inference */\n schema: TSchema;\n\n /** Default values for creating new nodes (type field is auto-added) */\n defaultValues: Omit<Partial<z.infer<TSchema>>, 'type'>;\n\n /** Tree display configuration */\n treeDisplay: {\n icon: TreeIcon;\n getLabel?: (node: z.infer<TSchema>) => string;\n };\n\n /** Client-side React renderer */\n clientRenderer: (node: z.infer<TSchema>, context: ClientRenderContext) => ReactElement | null;\n\n /** Server-side HTML string renderer */\n ssrRenderer: (node: z.infer<TSchema>, context: SSRRenderContext) => string;\n\n /** Optional capabilities override */\n capabilities?: Partial<NodeCapabilities>;\n\n /** Optional custom props editor component */\n propsEditor?: React.ComponentType<{\n node: z.infer<TSchema>;\n selectedPath: string | null;\n onPropChange?: (path: string, propName: string, newValue: unknown) => void;\n themeColors?: Record<string, string>;\n }>;\n\n /** Editable fields for auto-generated props editor UI */\n editableFields?: EditableField[];\n}\n\n/**\n * Create a complete node type definition from a simplified configuration\n *\n * Benefits over defineNodeType:\n * - Type guards are auto-generated from the type string\n * - Default factory is auto-generated from defaultValues\n * - TypeScript types are inferred from the Zod schema\n * - Less boilerplate, single source of truth\n *\n * @example\n * ```ts\n * const schema = z.object({\n * type: z.literal('image'),\n * src: z.string(),\n * alt: z.string().optional(),\n * });\n *\n * export type ImageNode = z.infer<typeof schema>;\n * export const ImageNodeSchema = schema;\n *\n * export const ImageNodeType = createNodeType({\n * type: 'image',\n * displayName: 'Image',\n * schema,\n * defaultValues: { src: '', alt: '' },\n * treeDisplay: { icon: 'IMAGE' },\n * clientRenderer: (node, ctx) => h('img', { src: node.src, alt: node.alt }),\n * ssrRenderer: (node, ctx) => `<img src=\"${node.src}\" alt=\"${node.alt || ''}\" />`,\n * });\n * ```\n */\nexport function createNodeType<TSchema extends ZodType>(\n input: CreateNodeTypeInput<TSchema>\n): NodeTypeDefinition<z.infer<TSchema>> {\n type TNode = z.infer<TSchema>;\n\n // Validate required fields\n if (!input.type) {\n throw new Error('Node type definition must have a type');\n }\n if (!input.displayName) {\n throw new Error('Node type definition must have a displayName');\n }\n if (!input.schema) {\n throw new Error('Node type definition must have a schema');\n }\n if (!input.clientRenderer) {\n throw new Error('Node type definition must have a clientRenderer');\n }\n if (!input.ssrRenderer) {\n throw new Error('Node type definition must have an ssrRenderer');\n }\n if (!input.treeDisplay) {\n throw new Error('Node type definition must have treeDisplay');\n }\n\n return {\n type: input.type,\n displayName: input.displayName,\n category: input.category ?? 'core',\n schema: input.schema as ZodType<TNode>,\n\n // Auto-generated type guard\n typeGuard: createTypeGuard<TNode>(input.type),\n\n // Auto-generated default factory\n defaultFactory: (): TNode => ({\n type: input.type,\n ...input.defaultValues,\n } as TNode),\n\n treeDisplay: {\n icon: input.treeDisplay.icon,\n getLabel: input.treeDisplay.getLabel ?? (() => input.displayName),\n },\n\n clientRenderer: input.clientRenderer,\n ssrRenderer: input.ssrRenderer,\n propsEditor: input.propsEditor,\n editableFields: input.editableFields,\n\n capabilities: {\n ...DEFAULT_CAPABILITIES,\n ...input.capabilities,\n },\n };\n}\n", "/**\n * Generic Field Type Factories for Node Types\n *\n * Configurable field factories that can be used for any property.\n * Each factory creates an EditableField with the specified configuration.\n *\n * @example\n * import { textField, urlField, imageField, booleanField, selectField } from '../fieldPresets';\n *\n * editableFields: [\n * urlField({ name: 'src', label: 'Video Source', required: true }),\n * imageField({ name: 'poster', label: 'Poster Image' }),\n * selectField({ name: 'preload', label: 'Preload', options: ['auto', 'metadata', 'none'] }),\n * booleanField({ name: 'controls', label: 'Show Controls', group: 'Playback' }),\n * ],\n */\n\nimport type { EditableField } from './NodeTypeDefinition';\n\n// ============================================\n// Field Configuration Types\n// ============================================\n\ninterface BaseFieldConfig {\n name: string;\n label: string;\n required?: boolean;\n group?: string;\n}\n\ninterface TextFieldConfig extends BaseFieldConfig {\n placeholder?: string;\n}\n\ninterface SelectFieldConfig extends BaseFieldConfig {\n options: string[];\n}\n\n// ============================================\n// Generic Field Type Factories\n// ============================================\n\n/** Text input field */\nexport const textField = (config: TextFieldConfig): EditableField => ({\n name: config.name,\n label: config.label,\n type: 'string',\n required: config.required,\n placeholder: config.placeholder,\n group: config.group,\n});\n\n/** URL input field */\nexport const urlField = (config: TextFieldConfig): EditableField => ({\n name: config.name,\n label: config.label,\n type: 'url',\n required: config.required,\n placeholder: config.placeholder ?? 'https://...',\n group: config.group,\n});\n\n/** Image URL field (can add picker UI later) */\nexport const imageField = (config: BaseFieldConfig): EditableField => ({\n name: config.name,\n label: config.label,\n type: 'url',\n required: config.required,\n placeholder: 'https://example.com/image.jpg',\n group: config.group,\n});\n\n/** Number input field */\nexport const numberField = (config: TextFieldConfig): EditableField => ({\n name: config.name,\n label: config.label,\n type: 'number',\n required: config.required,\n placeholder: config.placeholder,\n group: config.group,\n});\n\n/** Boolean toggle field */\nexport const booleanField = (config: BaseFieldConfig): EditableField => ({\n name: config.name,\n label: config.label,\n type: 'boolean',\n group: config.group,\n});\n\n/** Select dropdown field */\nexport const selectField = (config: SelectFieldConfig): EditableField => ({\n name: config.name,\n label: config.label,\n type: 'select',\n options: config.options,\n required: config.required,\n group: config.group,\n});\n\n/** Textarea field (multiline text) */\nexport const textareaField = (config: TextFieldConfig): EditableField => ({\n name: config.name,\n label: config.label,\n type: 'text',\n required: config.required,\n placeholder: config.placeholder,\n group: config.group,\n});\n", "/**\n * HTML Node Type Definition\n * HTML element nodes (div, span, header, etc.)\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport { StyleValueSchema, InteractiveStylesSchema, IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\n\n// Forward reference for ComponentNode schema (recursive)\nconst ComponentNodeSchemaRef: z.ZodType<any> = z.lazy(() => z.any());\n\n// Schema is the SINGLE source of truth\nconst HtmlNodeSchemaInternal = z.object({\n type: z.literal('node'),\n tag: z.string(),\n label: z.string().optional(), // Custom label displayed in structure tree\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(), // Interactive CSS rules (hover, active, etc.)\n generateElementClass: z.boolean().optional(), // Generate element class without styles (for custom CSS)\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n props: z.record(z.string(), z.any()).optional(), // Backward compatibility\n children: z.union([\n z.array(z.union([ComponentNodeSchemaRef, z.string()])),\n z.string(),\n ]).optional(),\n}).passthrough();\n\n// TypeScript type inferred from schema\nexport type HtmlNode = z.infer<typeof HtmlNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const HtmlNodeSchema = HtmlNodeSchemaInternal;\n\nexport const HtmlNodeType = createNodeType({\n type: 'node',\n displayName: 'HTML Element',\n category: 'core',\n schema: HtmlNodeSchemaInternal,\n\n defaultValues: {\n tag: 'div',\n style: { base: {} },\n children: [],\n },\n\n treeDisplay: {\n icon: 'HTML_ELEMENT',\n getLabel: (node) => node.tag,\n },\n\n clientRenderer: (node, context) => {\n const props: Record<string, any> = { key: context.key };\n\n // Prevent form submission in editor\n if (node.tag === 'form') {\n props.onSubmit = (e: React.FormEvent) => e.preventDefault();\n }\n\n // Void elements cannot have children\n const voidElements = ['img', 'br', 'hr', 'input', 'meta', 'link', 'area', 'base', 'col', 'embed', 'param', 'source', 'track', 'wbr'];\n if (voidElements.includes(node.tag.toLowerCase())) {\n return h(node.tag, props);\n }\n\n const children = context.buildChildren(\n node.children as any,\n context.elementPath,\n context.parentComponentName,\n context.componentContext\n );\n\n return h(node.tag, props, children);\n },\n\n ssrRenderer: (node, context) => {\n const childrenHTML = context.renderChildren(node.children as any, context);\n // Void elements don't have closing tags\n const voidElements = ['img', 'br', 'hr', 'input', 'meta', 'link', 'area', 'base', 'col', 'embed', 'param', 'source', 'track', 'wbr'];\n if (voidElements.includes(node.tag.toLowerCase())) {\n return `<${node.tag} />`;\n }\n return `<${node.tag}>${childrenHTML}</${node.tag}>`;\n },\n\n capabilities: {\n canHaveChildren: true,\n requiresProps: ['tag'],\n },\n});\n", "/**\n * Component Instance Node Type Definition\n * Instances of registered components\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport { StyleValueSchema, InteractiveStylesSchema, IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\n\n// Forward reference for ComponentNode schema (recursive)\nconst ComponentNodeSchemaRef: z.ZodType<any> = z.lazy(() => z.any());\n\n// Schema is the SINGLE source of truth\nconst ComponentInstanceNodeSchemaInternal = z.object({\n type: z.literal('component'),\n component: z.string(),\n label: z.string().optional(), // Custom label displayed in structure tree\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n props: z.record(z.string(), z.any()).optional(),\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(), // Interactive CSS rules (hover, active, etc.)\n generateElementClass: z.boolean().optional(), // Generate element class without styles (for custom CSS)\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n children: z.union([\n z.array(z.union([ComponentNodeSchemaRef, z.string()])),\n z.string(),\n ]).optional(),\n}).passthrough();\n\n// TypeScript type inferred from schema\nexport type ComponentInstanceNode = z.infer<typeof ComponentInstanceNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const ComponentInstanceNodeSchema = ComponentInstanceNodeSchemaInternal;\n\nexport const ComponentInstanceNodeType = createNodeType({\n type: 'component',\n displayName: 'Component',\n category: 'core',\n schema: ComponentInstanceNodeSchemaInternal,\n\n defaultValues: {\n component: '',\n props: {},\n style: { base: {} },\n children: [],\n },\n\n treeDisplay: {\n icon: 'COMPONENT',\n getLabel: (node) => node.component,\n },\n\n clientRenderer: (node, context) => {\n const definition = context.getComponentDefinition(node.component);\n if (!definition) {\n return h('div', { key: context.key }, `[Unknown component: ${node.component}]`);\n }\n return h('div', { key: context.key }, `[Component: ${node.component}]`);\n },\n\n ssrRenderer: (node, context) => {\n const definition = context.getComponentDefinition(node.component);\n if (!definition) {\n return `<!-- Unknown component: ${context.escapeHtml(node.component)} -->`;\n }\n return `<!-- Component: ${context.escapeHtml(node.component)} -->`;\n },\n\n capabilities: {\n canHaveChildren: true,\n requiresProps: ['component'],\n },\n});\n", "/**\n * Slot Marker Node Type Definition\n * Indicates where instance children should be placed in a component\n */\n\nimport { z } from 'zod';\nimport { createNodeType } from '../createNodeType';\n\n// Schema is the SINGLE source of truth\n// Note: default uses z.any() to avoid circular reference with ComponentNodeSchema\n// Full validation is done via the schema in validation/schemas.ts\nconst SlotMarkerSchemaInternal = z.object({\n type: z.literal('slot'),\n default: z.union([\n z.array(z.any()),\n z.string(),\n ]).optional(),\n}).passthrough();\n\n// TypeScript type inferred from schema\nexport type SlotMarker = z.infer<typeof SlotMarkerSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const SlotMarkerSchema = SlotMarkerSchemaInternal;\n\nexport const SlotMarkerType = createNodeType({\n type: 'slot',\n displayName: 'Slot',\n category: 'special',\n schema: SlotMarkerSchemaInternal,\n\n defaultValues: {},\n\n treeDisplay: {\n icon: 'SLOT_MARKER',\n getLabel: () => 'slot',\n },\n\n clientRenderer: (_node, _context) => {\n // Slot markers are replaced with instance children during component rendering\n return null;\n },\n\n ssrRenderer: (_node, _context) => {\n // Slot markers are replaced with instance children during component rendering\n return '';\n },\n\n capabilities: {\n canHaveChildren: false,\n canHaveStyle: false,\n canHaveAttributes: false,\n requiresProps: [],\n },\n});\n", "/**\n * Embed Node Type Definition\n * Renders custom HTML/SVG content\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport { StyleValueSchema, InteractiveStylesSchema, IfConditionSchema, HtmlMappingSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\nimport { textareaField } from '../fieldPresets';\n\n// Schema is the SINGLE source of truth\nconst EmbedNodeSchemaInternal = z.object({\n type: z.literal('embed'),\n html: z.union([z.string(), HtmlMappingSchema]),\n label: z.string().optional(), // Custom label displayed in structure tree\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(), // Interactive CSS rules (hover, active, etc.)\n generateElementClass: z.boolean().optional(), // Generate element class without styles (for custom CSS)\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n}).passthrough();\n\n// TypeScript type inferred from schema\nexport type EmbedNode = z.infer<typeof EmbedNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const EmbedNodeSchema = EmbedNodeSchemaInternal;\n\nexport const EmbedNodeType = createNodeType({\n type: 'embed',\n displayName: 'Embed',\n category: 'content',\n schema: EmbedNodeSchemaInternal,\n\n defaultValues: {\n html: '',\n style: { base: {} },\n },\n\n treeDisplay: {\n icon: 'HTML_ELEMENT',\n getLabel: () => 'Embed',\n },\n\n editableFields: [\n textareaField({ name: 'html', label: 'HTML Content', required: true, placeholder: '<svg>...</svg>' }),\n ],\n\n clientRenderer: (node, context) => {\n const htmlContent = typeof node.html === 'string' ? node.html : '';\n return h('div', {\n key: context.key,\n dangerouslySetInnerHTML: { __html: htmlContent },\n });\n },\n\n ssrRenderer: (node, _context) => {\n const htmlContent = typeof node.html === 'string' ? node.html : '';\n return `<div>${htmlContent}</div>`;\n },\n\n capabilities: {\n canHaveChildren: false,\n requiresProps: ['html'],\n },\n});\n", "/**\n * Link Node Type Definition\n * Renders as div in editor, <a> tag in SSR\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport { StyleValueSchema, InteractiveStylesSchema, LinkMappingSchema, IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\nimport { urlField } from '../fieldPresets';\n\n// Forward reference for ComponentNode schema (recursive)\n// This will be resolved when schemas.ts imports this and builds the union\nconst ComponentNodeSchemaRef: z.ZodType<any> = z.lazy(() => z.any());\n\n// Schema is the SINGLE source of truth\nconst LinkNodeSchemaInternal = z.object({\n type: z.literal('link'),\n href: z.union([z.string(), LinkMappingSchema]),\n label: z.string().optional(), // Custom label displayed in structure tree\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n style: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(), // Interactive CSS rules (hover, active, etc.)\n generateElementClass: z.boolean().optional(), // Generate element class without styles (for custom CSS)\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n children: z.union([\n z.array(z.union([ComponentNodeSchemaRef, z.string()])),\n z.string(),\n ]).optional(),\n}).passthrough();\n\n// TypeScript type inferred from schema\nexport type LinkNode = z.infer<typeof LinkNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const LinkNodeSchema = LinkNodeSchemaInternal;\n\nexport const LinkNodeType = createNodeType({\n type: 'link',\n displayName: 'Link',\n category: 'content',\n schema: LinkNodeSchemaInternal,\n\n defaultValues: {\n href: '#',\n style: { base: {} },\n children: [],\n },\n\n treeDisplay: {\n icon: 'HTML_ELEMENT',\n getLabel: () => 'Link',\n },\n\n editableFields: [\n urlField({ name: 'href', label: 'Link URL', required: true }),\n ],\n\n clientRenderer: (node, context) => {\n const children = context.buildChildren(\n node.children as any,\n context.elementPath,\n context.parentComponentName,\n context.componentContext\n );\n return h('div', { key: context.key }, children);\n },\n\n ssrRenderer: (node, context) => {\n const href = typeof node.href === 'string' ? node.href : '#';\n const childrenHTML = context.renderChildren(node.children as any, context);\n return `<a href=\"${context.escapeHtml(href)}\" class=\"olink\">${childrenHTML}</a>`;\n },\n\n capabilities: {\n canHaveChildren: true,\n requiresProps: ['href'],\n },\n});\n", "/**\n * Locale List Node Type Definition\n * Renders locale switcher links\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport { StyleValueSchema, InteractiveStylesSchema, IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\n\n// Schema is the SINGLE source of truth\nconst LocaleListNodeSchemaInternal = z.object({\n type: z.literal('locale-list'),\n label: z.string().optional(), // Custom label displayed in structure tree\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n style: StyleValueSchema.optional(),\n itemStyle: StyleValueSchema.optional(),\n activeItemStyle: StyleValueSchema.optional(),\n separatorStyle: StyleValueSchema.optional(),\n showCurrent: z.boolean().optional(),\n showSeparator: z.boolean().optional(),\n showFlag: z.boolean().optional(),\n flagStyle: StyleValueSchema.optional(),\n interactiveStyles: InteractiveStylesSchema.optional(), // Interactive CSS rules (hover, active, etc.)\n generateElementClass: z.boolean().optional(), // Generate element class without styles (for custom CSS)\n displayType: z.enum(['code', 'name', 'nativeName']).optional(), // How to display locale text\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n}).passthrough();\n\n// TypeScript type inferred from schema\nexport type LocaleListNode = z.infer<typeof LocaleListNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const LocaleListNodeSchema = LocaleListNodeSchemaInternal;\n\nexport const LocaleListNodeType = createNodeType({\n type: 'locale-list',\n displayName: 'LocaleList',\n category: 'special',\n schema: LocaleListNodeSchemaInternal,\n\n defaultValues: {\n style: { base: {} },\n showCurrent: true,\n showSeparator: true,\n showFlag: true,\n displayType: 'nativeName',\n },\n\n treeDisplay: {\n icon: 'HTML_ELEMENT',\n getLabel: () => 'LocaleList',\n },\n\n clientRenderer: (_node, context) => {\n // In editor, shows placeholder\n return h('div', {\n key: context.key,\n 'data-locale-list': 'true',\n }, '[Locale List]');\n },\n\n ssrRenderer: (_node, _context) => {\n // Placeholder - full implementation renders actual locale links\n return '<div class=\"locale-list\">[Locale List]</div>';\n },\n\n capabilities: {\n canHaveChildren: false,\n requiresProps: [],\n },\n});\n", "/**\n * Unified List Node Type Definition\n * Renders children for each item from either component props or CMS collections.\n *\n * Replaces both the original 'list' and 'cms-list' node types with a unified\n * implementation that uses sourceType to determine data source.\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport { IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\nimport { NODE_TYPE } from '../../constants';\n\n// Filter condition schema (shared with CMS list queries)\nconst CMSFilterConditionSchema = z.object({\n field: z.string(),\n operator: z.enum(['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'contains', 'in']).optional(),\n value: z.unknown(),\n});\n\n// Sort configuration schema\nconst CMSSortConfigSchema = z.union([\n z.object({\n field: z.string(),\n order: z.enum(['asc', 'desc']).optional(),\n }),\n z.array(z.object({\n field: z.string(),\n order: z.enum(['asc', 'desc']).optional(),\n })),\n]);\n\n// Schema is the SINGLE source of truth\nconst ListNodeSchemaInternal = z.object({\n type: z.literal('list'),\n /**\n * Data source type:\n * - 'prop': Read items from component props (default)\n * - 'collection': Query items from CMS collection\n */\n sourceType: z.enum(['prop', 'collection']).default('prop'),\n /**\n * Source identifier:\n * - For sourceType 'prop': Prop name (e.g., \"items\") or template expression (e.g., \"{{category.items}}\")\n * - For sourceType 'collection': Collection name (e.g., \"posts\", \"authors\")\n */\n source: z.string(),\n label: z.string().optional(), // Custom label displayed in structure tree\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n /**\n * Variable name for item in templates.\n * - For sourceType 'prop': defaults to 'item'\n * - For sourceType 'collection': defaults to singularized collection name\n */\n itemAs: z.string().optional(),\n\n // Collection-only options (ignored when sourceType: 'prop')\n /** Direct item IDs or template expression for referenced items (e.g., \"{{post.authorId}}\") */\n items: z.union([z.string(), z.array(z.string())]).optional(),\n /** Filter conditions */\n filter: z.union([\n CMSFilterConditionSchema,\n z.array(CMSFilterConditionSchema),\n z.record(z.unknown()),\n ]).optional(),\n /** Sort configuration */\n sort: CMSSortConfigSchema.optional(),\n /** Exclude the current CMS item from the list (useful for \"related items\" sections) */\n excludeCurrentItem: z.boolean().optional(),\n /**\n * Emit item template for dynamic client-side rendering.\n * When true, SSR emits a `<template data-meno-item>` element with unprocessed\n * {{item.field}} placeholders. MenoFilter uses this to render items beyond\n * the SSR'd limit dynamically.\n */\n emitTemplate: z.boolean().optional(),\n\n // Shared options\n /** Maximum number of items to return */\n limit: z.number().optional(),\n /** Number of items to skip */\n offset: z.number().optional(),\n /** Children are repeated for each item */\n children: z.array(z.unknown()).optional(),\n /** @deprecated Legacy property - use source + sourceType instead */\n collection: z.union([z.string(), z.array(z.any())]).optional(),\n}).passthrough();\n\n// TypeScript type inferred from schema\nexport type ListNode = z.infer<typeof ListNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const ListNodeSchema = ListNodeSchemaInternal;\n\nexport const ListNodeType = createNodeType({\n type: NODE_TYPE.LIST,\n displayName: 'List',\n category: 'special',\n schema: ListNodeSchemaInternal,\n\n defaultValues: {\n sourceType: 'prop',\n source: '{{items}}',\n itemAs: 'item',\n children: [],\n },\n\n treeDisplay: {\n icon: 'ARRAY',\n getLabel: (node) => {\n const listNode = node as ListNode;\n const sourceType = listNode.sourceType || 'prop';\n const prefix = sourceType === 'collection' ? 'CMS List' : 'List';\n return listNode.source ? `${prefix}: ${listNode.source}` : prefix;\n },\n },\n\n clientRenderer: (node, context) => {\n const listNode = node as ListNode;\n const sourceType = listNode.sourceType || 'prop';\n const isCollection = sourceType === 'collection';\n // Different styling for collection vs prop lists\n const bgColor = isCollection ? 'rgba(139, 92, 246, 0.1)' : 'rgba(59, 130, 246, 0.1)';\n const borderColor = isCollection ? 'rgba(139, 92, 246, 0.5)' : 'rgba(59, 130, 246, 0.5)';\n const textColor = isCollection ? '#8b5cf6' : '#3b82f6';\n const label = isCollection ? 'CMS List' : 'List';\n\n return h('div', {\n key: context.key,\n 'data-list': 'true',\n 'data-source-type': sourceType,\n 'data-source': listNode.source,\n style: {\n padding: '8px 12px',\n background: bgColor,\n border: `1px dashed ${borderColor}`,\n borderRadius: '4px',\n color: textColor,\n fontSize: '12px',\n },\n }, `[${label}: ${listNode.source || 'No source'}]`);\n },\n\n ssrRenderer: (_node, _context) => {\n // Placeholder - actual SSR is handled by processList in ssrRenderer.ts\n return '<!-- list rendered by processList -->';\n },\n\n capabilities: {\n canHaveChildren: true,\n requiresProps: ['source'],\n },\n\n editableFields: [\n {\n name: 'sourceType',\n label: 'Source Type',\n type: 'select',\n required: false,\n options: ['prop', 'collection'],\n },\n {\n name: 'source',\n label: 'Source',\n type: 'string',\n required: true,\n placeholder: 'e.g., items or posts'\n },\n {\n name: 'itemAs',\n label: 'Item Variable',\n type: 'string',\n required: false,\n placeholder: 'default: item (prop) or singular (collection)'\n }\n ],\n});\n", "/**\n * Node Types Index\n * Exports all built-in node type definitions, schemas, and types\n *\n * This is the single source of truth for node type definitions.\n * Types are inferred from Zod schemas, eliminating duplication.\n */\n\nimport { globalNodeTypeManager } from '../NodeTypeManager';\nimport type { NodeTypeDefinition } from '../NodeTypeDefinition';\n\n// Import all node type definitions (each file exports type, schema, and definition)\nimport { HtmlNodeType, HtmlNodeSchema, type HtmlNode } from './HtmlNodeType';\nimport { ComponentInstanceNodeType, ComponentInstanceNodeSchema, type ComponentInstanceNode } from './ComponentInstanceNodeType';\nimport { SlotMarkerType, SlotMarkerSchema, type SlotMarker } from './SlotMarkerType';\nimport { EmbedNodeType, EmbedNodeSchema, type EmbedNode } from './EmbedNodeType';\nimport { LinkNodeType, LinkNodeSchema, type LinkNode } from './LinkNodeType';\nimport { LocaleListNodeType, LocaleListNodeSchema, type LocaleListNode } from './LocaleListNodeType';\nimport { ListNodeType, ListNodeSchema, type ListNode } from './ListNodeType';\n\n/**\n * All built-in node type definitions\n * Type assertion needed because TypeScript sees each as a specific generic type\n */\nexport const builtInNodeTypes: NodeTypeDefinition[] = [\n HtmlNodeType as NodeTypeDefinition,\n ComponentInstanceNodeType as NodeTypeDefinition,\n SlotMarkerType as NodeTypeDefinition,\n EmbedNodeType as NodeTypeDefinition,\n LinkNodeType as NodeTypeDefinition,\n LocaleListNodeType as NodeTypeDefinition,\n ListNodeType as NodeTypeDefinition,\n];\n\n/**\n * Export all schemas for use in validation/schemas.ts\n */\nexport const nodeSchemas = {\n html: HtmlNodeSchema,\n component: ComponentInstanceNodeSchema,\n slot: SlotMarkerSchema,\n embed: EmbedNodeSchema,\n link: LinkNodeSchema,\n localeList: LocaleListNodeSchema,\n list: ListNodeSchema,\n};\n\n/**\n * Register all built-in node types with the global manager\n * Call this early in app lifecycle (client and server entry points)\n */\nexport function registerBuiltInNodeTypes(): void {\n globalNodeTypeManager.registerAll(builtInNodeTypes);\n}\n\n// Re-export individual node types for direct access\nexport { HtmlNodeType, HtmlNodeSchema, type HtmlNode } from './HtmlNodeType';\nexport { ComponentInstanceNodeType, ComponentInstanceNodeSchema, type ComponentInstanceNode } from './ComponentInstanceNodeType';\nexport { SlotMarkerType, SlotMarkerSchema, type SlotMarker } from './SlotMarkerType';\nexport { EmbedNodeType, EmbedNodeSchema, type EmbedNode } from './EmbedNodeType';\nexport { LinkNodeType, LinkNodeSchema, type LinkNode } from './LinkNodeType';\nexport { LocaleListNodeType, LocaleListNodeSchema, type LocaleListNode } from './LocaleListNodeType';\nexport { ListNodeType, ListNodeSchema, type ListNode } from './ListNodeType';\n\n/**\n * Discriminated union of all component node types\n * This is the single source of truth for ComponentNode type\n */\nexport type ComponentNode =\n | HtmlNode\n | ComponentInstanceNode\n | SlotMarker\n | EmbedNode\n | LinkNode\n | LocaleListNode\n | ListNode;\n", "/**\n * Component Registry System\n * Unified registry system for client and SSR\n */\n\n// Component registries\nexport { BaseComponentRegistry } from './ComponentRegistry';\nexport { ClientRegistry } from './ClientRegistry';\nexport { SSRRegistry } from './SSRRegistry';\nexport { RegistryManager } from './RegistryManager';\n\n// Node type registries\nexport { BaseNodeTypeRegistry } from './BaseNodeTypeRegistry';\nexport type { NodeLabelInfo } from './BaseNodeTypeRegistry';\nexport { ClientNodeTypeRegistry } from './ClientNodeTypeRegistry';\nexport { SSRNodeTypeRegistry } from './SSRNodeTypeRegistry';\nexport { NodeTypeManager, globalNodeTypeManager } from './NodeTypeManager';\nexport { defineNodeType } from './defineNodeType';\nexport { createNodeType } from './createNodeType';\nexport type { CreateNodeTypeInput } from './createNodeType';\nexport type {\n NodeTypeDefinition,\n NodeTypeDefinitionInput,\n TreeIcon,\n NodeCategory,\n TreeDisplayConfig,\n NodeCapabilities,\n ClientRenderContext,\n SSRRenderContext,\n ClientNodeRenderer,\n SSRNodeRenderer,\n PropsEditorProps,\n EditableField,\n EditableFieldType,\n} from './NodeTypeDefinition';\n\n// Field presets for node types\nexport * from './fieldPresets';\n\n// Built-in node types\nexport {\n registerBuiltInNodeTypes,\n builtInNodeTypes,\n HtmlNodeType,\n ComponentInstanceNodeType,\n SlotMarkerType,\n EmbedNodeType,\n LinkNodeType,\n LocaleListNodeType,\n} from './nodeTypes';\n\n", "/**\n * Prefetch configuration types for Astro-style link prefetching\n *\n * Supports multiple strategies:\n * - hover: Prefetch on mouseenter/focus (default)\n * - tap: Prefetch on mousedown/touchstart (conservative)\n * - viewport: Prefetch when link enters viewport\n * - load: Prefetch all links on page load\n */\n\n/**\n * Prefetch strategies matching Astro's approach\n */\nexport type PrefetchStrategy = 'hover' | 'tap' | 'viewport' | 'load';\n\n/**\n * Prefetch configuration options\n */\nexport interface PrefetchConfig {\n /** Whether prefetching is enabled (default: false) */\n enabled: boolean;\n\n /** Default strategy for all links (default: 'hover') */\n defaultStrategy: PrefetchStrategy;\n\n /** Debounce time for hover events in ms (default: 65) */\n hoverDebounce: number;\n\n /** Maximum number of cached pages (LRU cache, default: 10) */\n maxCacheSize: number;\n\n /** TTL for cached pages in ms (default: 5 minutes) */\n cacheTTL: number;\n\n /** Respect user's save-data preference (default: true) */\n respectSaveData: boolean;\n\n /** Slow connection threshold in Mbps - fall back to tap (default: 2) */\n slowConnectionThreshold: number;\n}\n\n/**\n * Default prefetch configuration\n */\nexport const DEFAULT_PREFETCH_CONFIG: PrefetchConfig = {\n enabled: false,\n defaultStrategy: 'hover',\n hoverDebounce: 65,\n maxCacheSize: 10,\n cacheTTL: 5 * 60 * 1000, // 5 minutes\n respectSaveData: true,\n slowConnectionThreshold: 2,\n};\n\n/**\n * Cached page entry with timestamp for TTL management\n */\nexport interface CachedPageEntry {\n /** Parsed page data (ComponentNode tree) */\n data: unknown;\n /** Timestamp when cached */\n timestamp: number;\n /** Page-specific components */\n components?: Record<string, unknown>;\n}\n\n/**\n * Connection quality info for adaptive prefetching\n * Uses Network Information API when available\n */\nexport interface ConnectionInfo {\n /** User has enabled data saver mode */\n saveData: boolean;\n /** Effective connection type */\n effectiveType: 'slow-2g' | '2g' | '3g' | '4g' | 'unknown';\n /** Estimated downlink speed in Mbps */\n downlink: number;\n}\n", "/**\n * Validation Utilities\n * Runtime validation functions using zod schemas\n * All validators return ValidationResult<T> with detailed error information\n */\n\nimport type { ZodError, ZodType } from 'zod';\nimport type { PropDefinition, ComponentDefinition, StructuredComponentDefinition, PageData, PageDataWithComponent } from '../types/components';\nimport type { ComponentNode } from '../types/nodes';\nimport type { PageMetaData } from '../types/api';\nimport type { CMSSchema, CMSItem } from '../types/cms';\nimport {\n PropDefinitionSchema,\n ComponentNodeSchema,\n ComponentDefinitionSchema,\n StructuredComponentDefinitionSchema,\n PageDataSchema,\n PageDataWithComponentSchema,\n PageMetaDataSchema,\n CMSSchemaSchema,\n CMSItemSchema,\n} from './schemas';\n\n/**\n * Structured validation error with path and code\n */\nexport interface ValidationError {\n path: string;\n message: string;\n code?: 'INVALID_TYPE' | 'MISSING_REQUIRED' | 'INVALID_VALUE' | 'UNKNOWN';\n}\n\n/**\n * Validation result type - always includes error details on failure\n */\nexport type ValidationResult<T> =\n | { valid: true; data: T }\n | { valid: false; errors: ValidationError[] };\n\n/**\n * Convert Zod errors to ValidationError format\n */\nfunction zodToValidationErrors(zodError: ZodError): ValidationError[] {\n return zodError.errors.map(err => ({\n path: err.path.join('.') || 'root',\n message: err.message,\n code: 'INVALID_TYPE' as const,\n }));\n}\n\n/**\n * Validate and throw on failure - convenience helper\n */\nexport function validateOrThrow<T>(\n data: unknown,\n validator: (data: unknown) => ValidationResult<T>,\n errorMessage?: string\n): T {\n const result = validator(data);\n if (!result.valid) {\n const details = result.errors.map(e => `${e.path}: ${e.message}`).join('; ');\n throw new Error(errorMessage ? `${errorMessage}: ${details}` : details);\n }\n return result.data;\n}\n\n/**\n * Validate a prop definition\n * @returns ValidationResult with error details on failure\n */\nexport function validatePropDefinition(propDef: unknown): ValidationResult<PropDefinition> {\n try {\n const result = PropDefinitionSchema.safeParse(propDef);\n if (result.success) {\n return { valid: true, data: result.data as PropDefinition };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate a component node\n * @returns ValidationResult with error details on failure\n */\nexport function validateComponentNode(node: unknown): ValidationResult<ComponentNode> {\n try {\n const result = ComponentNodeSchema.safeParse(node);\n if (result.success) {\n return { valid: true, data: result.data as ComponentNode };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate a structured component definition\n * @returns ValidationResult with error details on failure\n */\nexport function validateStructuredComponentDefinition(def: unknown): ValidationResult<StructuredComponentDefinition> {\n try {\n const result = StructuredComponentDefinitionSchema.safeParse(def);\n if (result.success) {\n return { valid: true, data: result.data as StructuredComponentDefinition };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate a component definition\n * @returns ValidationResult with error details on failure\n */\nexport function validateComponentDefinition(def: unknown): ValidationResult<ComponentDefinition> {\n try {\n const result = ComponentDefinitionSchema.safeParse(def);\n if (result.success) {\n return { valid: true, data: result.data as ComponentDefinition };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate page data\n * @returns ValidationResult with error details on failure\n */\nexport function validatePageData(data: unknown): ValidationResult<PageData> {\n try {\n const result = PageDataSchema.safeParse(data);\n if (result.success) {\n return { valid: true, data: result.data as PageData };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate page data with component structure\n * @returns ValidationResult with error details on failure\n */\nexport function validatePageDataWithComponent(data: unknown): ValidationResult<PageDataWithComponent> {\n try {\n const result = PageDataWithComponentSchema.safeParse(data);\n if (result.success) {\n return { valid: true, data: result.data as PageDataWithComponent };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate page metadata\n * @returns ValidationResult with error details on failure\n */\nexport function validatePageMetaData(data: unknown): ValidationResult<PageMetaData> {\n try {\n const result = PageMetaDataSchema.safeParse(data);\n if (result.success) {\n return { valid: true, data: result.data as PageMetaData };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate with detailed error information using a custom schema\n * @returns ValidationResult with error details on failure\n */\nexport function validateWithDetails<T>(\n data: unknown,\n schema: ZodType<T>\n): ValidationResult<T> {\n try {\n const result = schema.safeParse(data);\n if (result.success) {\n return { valid: true, data: result.data };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n// ============================================================================\n// CMS Validators\n// ============================================================================\n\n/**\n * Validate a CMS schema\n * @returns ValidationResult with error details on failure\n */\nexport function validateCMSSchema(data: unknown): ValidationResult<CMSSchema> {\n try {\n const result = CMSSchemaSchema.safeParse(data);\n if (result.success) {\n return { valid: true, data: result.data as CMSSchema };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n/**\n * Validate a CMS item\n * @returns ValidationResult with error details on failure\n */\nexport function validateCMSItem(data: unknown): ValidationResult<CMSItem> {\n try {\n const result = CMSItemSchema.safeParse(data);\n if (result.success) {\n return { valid: true, data: result.data as CMSItem };\n }\n return { valid: false, errors: zodToValidationErrors(result.error) };\n } catch (error) {\n return {\n valid: false,\n errors: [{\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n }],\n };\n }\n}\n\n\n", "/**\n * CMS Types\n * Defines schema structure and content items for CMS collections\n */\n\n/** Field types supported by CMS */\nexport type CMSFieldType =\n | 'string' // Single-line text (auto-localizable when project has multiple locales)\n | 'text' // Multi-line text (auto-localizable when project has multiple locales)\n | 'rich-text' // Rich text with formatting (auto-localizable when project has multiple locales)\n | 'number' // Numeric value\n | 'boolean' // True/false\n | 'image' // Image URL/path\n | 'file' // File URL/path (any file type)\n | 'date' // ISO date string\n | 'select' // Single selection from options\n | 'reference'; // Reference to another collection item\n\n/** Single field definition in a schema */\nexport interface CMSFieldDefinition {\n type: CMSFieldType;\n required?: boolean;\n default?: unknown;\n label?: string; // Display label in editor\n description?: string; // Help text\n options?: string[]; // For 'select' type\n accept?: string; // For 'file' type - MIME filter (e.g. \"application/pdf\", \"*/*\")\n collection?: string; // For 'reference' type - target collection ID\n multiple?: boolean; // For 'reference' type - allows array of IDs\n}\n\n/** Data delivery strategy for client-side CMS data */\nexport type CMSClientDataStrategy = 'auto' | 'inline' | 'static';\n\n/**\n * Configuration for exposing CMS data to client-side JavaScript.\n * Enables dynamic filtering/sorting on static websites.\n */\nexport interface CMSClientDataConfig {\n /** Enable client-side data exposure */\n enabled: boolean;\n /**\n * Data delivery strategy:\n * - 'auto': Choose based on collection size (inline < threshold, static >= threshold)\n * - 'inline': Embed JSON directly in HTML (best for < 500 items)\n * - 'static': Generate separate JSON files (best for large collections)\n */\n strategy: CMSClientDataStrategy;\n /** Threshold for auto strategy switch (default: 500 items) */\n threshold?: number;\n /**\n * Fields to expose to client (for security/size control).\n * System fields (_id, _url, _filename) are always included.\n * Empty array or undefined = include all fields.\n */\n fields?: string[];\n}\n\n/** CMS Schema - defines collection structure (embedded in page meta.cms) */\nexport interface CMSSchema {\n /** Unique identifier for the collection */\n id: string;\n /** Display name for the collection */\n name: string;\n /** Which field to use for URL slug */\n slugField: string;\n /** URL pattern, e.g., \"/blog/{{slug}}\" */\n urlPattern: string;\n /** Field definitions */\n fields: Record<string, CMSFieldDefinition>;\n /** Client-side data configuration for dynamic filtering */\n clientData?: CMSClientDataConfig;\n}\n\n/**\n * CMS Item - actual content entry (stored as individual JSON file)\n *\n * Note on _filename vs _slug:\n * - _filename: Stable identifier used for file storage and API operations. Never changes after creation.\n * - _slug: Derived from filename for backward compatibility. Use _filename instead in new code.\n */\nexport interface CMSItem {\n /** Unique identifier for the item */\n _id: string;\n /**\n * @deprecated Use _filename instead. Kept for backward compatibility.\n * Derived from the filename on disk.\n */\n _slug?: string;\n /**\n * Stable filename identifier (without .json extension).\n * Used for file storage and API operations. Never changes after creation,\n * even if the slug field value changes.\n */\n _filename?: string;\n /** ISO timestamp when item was created */\n _createdAt?: string;\n /**\n * Locale codes where this item is in draft state.\n * undefined or [] = published for all locales (backward compatible).\n * ['fr', 'de'] = French and German are draft, other locales published.\n */\n _draftLocales?: string[];\n /**\n * Computed URL path for this item based on collection's urlPattern.\n * Available when item is returned with URL context (e.g., in CMSList or template pages).\n * Example: \"/blog/my-post\" for urlPattern \"/blog/{{slug}}\"\n */\n _url?: string;\n /** User-defined fields based on schema */\n [field: string]: unknown;\n}\n\n/** CMS Collection - schema + items */\nexport interface CMSCollection {\n schema: CMSSchema;\n items: CMSItem[];\n}\n\n/** Resolved CMS route match */\nexport interface CMSRouteMatch {\n collection: string;\n slug: string;\n item: CMSItem;\n pagePath: string; // Path to the template page file\n}\n\n/** Filter operators for CMS queries */\nexport type CMSFilterOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'in';\n\n/** Single filter condition */\nexport interface CMSFilterCondition {\n field: string;\n operator?: CMSFilterOperator; // defaults to 'eq'\n value: unknown;\n}\n\n/** Sort configuration */\nexport interface CMSSortConfig {\n field: string;\n order?: 'asc' | 'desc'; // defaults to 'asc'\n}\n\n/** CMSList query configuration */\nexport interface CMSListQuery {\n collection: string;\n filter?: CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>;\n sort?: CMSSortConfig | CMSSortConfig[];\n limit?: number;\n offset?: number;\n /** When set, excludes items that are draft for this locale */\n excludeDraftLocale?: string;\n}\n\n/**\n * @deprecated CMSListNode is now replaced by ListNode with sourceType: 'collection'.\n * This type alias is kept for backward compatibility during migration.\n * Import ListNode from '../registry/nodeTypes/ListNodeType' instead.\n */\nexport type CMSListNode = import('../registry/nodeTypes/ListNodeType').ListNode;\n\n/**\n * Configuration for nested CMS list placeholders.\n * Serialized to data-cms-config attribute for client-side hydration\n * when parent cms-list has emitTemplate: true.\n */\nexport interface NestedCMSListConfig {\n /** Collection to query */\n collection: string;\n /** Variable name for item in templates */\n itemAs?: string;\n /** Direct item IDs or template expression for referenced items */\n items?: string | string[];\n /** Filter conditions (may contain template expressions like {{parent.field}}) */\n filter?: CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>;\n /** Sort configuration */\n sort?: CMSSortConfig | CMSSortConfig[];\n /** Maximum number of items to return */\n limit?: number;\n /** Number of items to skip */\n offset?: number;\n /** Exclude the current CMS item from the list */\n excludeCurrentItem?: boolean;\n}\n\n/**\n * Item context for CMS List template rendering\n * Available when rendering children inside a CMSList\n * @deprecated Use TemplateContext with named contexts instead\n */\nexport interface ItemContext {\n /** Type discriminator (optional for backward compat) */\n _type?: 'item';\n /** Current CMS item data */\n item: CMSItem;\n /** Zero-based index of current item */\n itemIndex: number;\n /** True if this is the first item */\n itemFirst: boolean;\n /** True if this is the last item */\n itemLast: boolean;\n}\n\n/**\n * Template context for CMS List rendering with named contexts.\n * Supports nested lists where parent contexts are preserved.\n *\n * Example:\n * ```\n * {\n * _type: 'template',\n * post: { _id: '1', title: 'Hello' },\n * postIndex: 0,\n * postFirst: true,\n * postLast: false,\n * author: { _id: '2', name: 'John' },\n * authorIndex: 0,\n * authorFirst: true,\n * authorLast: true,\n * // Legacy context also included for backward compatibility\n * item: { _id: '2', name: 'John' },\n * itemIndex: 0,\n * itemFirst: true,\n * itemLast: true\n * }\n * ```\n */\nexport interface TemplateContext {\n /** Type discriminator for distinguishing from ItemContext */\n _type: 'template';\n [key: string]: CMSItem | number | boolean | 'template' | undefined;\n}\n\n// ============================================================================\n// Singularization Helper\n// ============================================================================\n\n/** Lookup table for irregular plurals */\nconst IRREGULAR_PLURALS: Record<string, string> = {\n categories: 'category',\n children: 'child',\n people: 'person',\n men: 'man',\n women: 'woman',\n feet: 'foot',\n teeth: 'tooth',\n geese: 'goose',\n mice: 'mouse',\n indices: 'index',\n vertices: 'vertex',\n matrices: 'matrix',\n};\n\n/**\n * Convert a collection name to its singular form for use as item variable name.\n * Used when itemAs is not explicitly specified.\n *\n * @example\n * singularize('posts') // 'post'\n * singularize('categories') // 'category'\n * singularize('author') // 'author'\n */\nexport function singularize(collection: string): string {\n // Check irregular plurals first\n if (IRREGULAR_PLURALS[collection]) {\n return IRREGULAR_PLURALS[collection];\n }\n // Handle -ies -> -y (e.g., \"stories\" -> \"story\")\n if (collection.endsWith('ies')) {\n return collection.slice(0, -3) + 'y';\n }\n // Handle -es for words ending in s, x, z, ch, sh\n if (collection.endsWith('ses') || collection.endsWith('xes') ||\n collection.endsWith('zes') || collection.endsWith('ches') ||\n collection.endsWith('shes')) {\n return collection.slice(0, -2);\n }\n // Simple rule: remove trailing 's' if present\n return collection.endsWith('s') ? collection.slice(0, -1) : collection;\n}\n\n/**\n * Describes a location where a CMS item is referenced.\n * Used for delete warnings and reference tracking.\n */\nexport interface ReferenceLocation {\n /** Collection containing the reference */\n collection: string;\n /** Item ID that has the reference */\n itemId: string;\n /** Slug for display (optional) */\n itemSlug?: string;\n /** Filename for display (optional) */\n itemFilename?: string;\n /** Field name containing the reference */\n fieldName: string;\n}\n\n/** Check if a CMS item is in draft state for a specific locale */\nexport function isItemDraftForLocale(item: CMSItem, locale: string): boolean {\n return item._draftLocales?.includes(locale) === true;\n}\n\n/** Check if a CMS item is fully published (not draft for any locale) */\nexport function isItemFullyPublished(item: CMSItem): boolean {\n return !item._draftLocales || item._draftLocales.length === 0;\n}\n", "/**\n * Global Template Context\n * Provides global variables available in all template expressions.\n *\n * Used for environment-level variables like isEditorMode that need\n * to be accessible across all components without prop drilling.\n */\n\n/**\n * Global template variables available in all {{expression}} evaluations\n */\nexport interface GlobalTemplateVariables {\n /** True when running in editor mode (disables autoplay, etc.) */\n isEditorMode: boolean;\n}\n\nconst defaultValues: GlobalTemplateVariables = {\n isEditorMode: false,\n};\n\nlet globalContext: GlobalTemplateVariables = { ...defaultValues };\n\n/**\n * Set global template variables\n * Called during client initialization to set environment-level values\n */\nexport function setGlobalTemplateContext(values: Partial<GlobalTemplateVariables>): void {\n globalContext = { ...globalContext, ...values };\n}\n\n/**\n * Get current global template variables\n * Used by template evaluation to merge with props context\n */\nexport function getGlobalTemplateContext(): GlobalTemplateVariables {\n return globalContext;\n}\n\n/**\n * Reset global template context to defaults\n * Useful for testing\n */\nexport function resetGlobalTemplateContext(): void {\n globalContext = { ...defaultValues };\n}\n", "/**\n * Safe Expression Evaluator\n * Evaluates template expressions using jsep parser\n *\n * Security: Uses jsep for safe expression parsing instead of eval/new Function()\n * Supports: ternary, binary, logical, unary operators, member access, arrays\n */\n\nimport jsep from 'jsep';\nimport type { Expression } from 'jsep';\n\n/**\n * Safely evaluates a jsep AST node against a context object\n * Only supports whitelisted node types for security\n */\nfunction evaluateNode(node: Expression, context: Record<string, unknown>): unknown {\n switch (node.type) {\n case 'Identifier':\n // Simple variable lookup\n return context[(node as jsep.Identifier).name];\n\n case 'Literal':\n // String, number, boolean literals\n return (node as jsep.Literal).value;\n\n case 'MemberExpression': {\n // Property access: obj.prop or obj[expr]\n const memberNode = node as jsep.MemberExpression;\n const obj = evaluateNode(memberNode.object, context);\n if (obj === null || obj === undefined) return undefined;\n\n let key: string | number;\n if (memberNode.computed) {\n // Bracket notation: obj[expr]\n const keyValue = evaluateNode(memberNode.property, context);\n if (typeof keyValue !== 'string' && typeof keyValue !== 'number') {\n return undefined;\n }\n key = keyValue;\n } else {\n // Dot notation: obj.prop\n key = (memberNode.property as jsep.Identifier).name;\n }\n\n if (typeof obj !== 'object') return undefined;\n return (obj as Record<string | number, unknown>)[key];\n }\n\n case 'BinaryExpression':\n case 'LogicalExpression': {\n // Operators: +, -, *, /, %, ===, !==, ==, !=, <, >, <=, >=, &&, ||\n // Note: jsep classifies && and || as BinaryExpression by default\n const binaryNode = node as jsep.BinaryExpression;\n\n // Handle logical operators with short-circuit evaluation\n if (binaryNode.operator === '&&') {\n const left = evaluateNode(binaryNode.left, context);\n return left ? evaluateNode(binaryNode.right, context) : left;\n }\n if (binaryNode.operator === '||') {\n const left = evaluateNode(binaryNode.left, context);\n return left ? left : evaluateNode(binaryNode.right, context);\n }\n\n // Evaluate both sides for non-logical operators\n const left = evaluateNode(binaryNode.left, context);\n const right = evaluateNode(binaryNode.right, context);\n\n switch (binaryNode.operator) {\n case '+':\n // String concatenation or addition\n if (typeof left === 'string' || typeof right === 'string') {\n return String(left ?? '') + String(right ?? '');\n }\n return (left as number) + (right as number);\n case '-': return (left as number) - (right as number);\n case '*': return (left as number) * (right as number);\n case '/': return (left as number) / (right as number);\n case '%': return (left as number) % (right as number);\n case '===': return left === right;\n case '!==': return left !== right;\n case '==': return left == right;\n case '!=': return left != right;\n case '<': return (left as number) < (right as number);\n case '>': return (left as number) > (right as number);\n case '<=': return (left as number) <= (right as number);\n case '>=': return (left as number) >= (right as number);\n default:\n throw new Error(`Unsupported operator: ${binaryNode.operator}`);\n }\n }\n\n case 'ConditionalExpression': {\n // Ternary: condition ? consequent : alternate\n const condNode = node as jsep.ConditionalExpression;\n const test = evaluateNode(condNode.test, context);\n return test\n ? evaluateNode(condNode.consequent, context)\n : evaluateNode(condNode.alternate, context);\n }\n\n case 'UnaryExpression': {\n // Unary operators: !, -, +\n const unaryNode = node as jsep.UnaryExpression;\n const arg = evaluateNode(unaryNode.argument, context);\n\n switch (unaryNode.operator) {\n case '!': return !arg;\n case '-': return -(arg as number);\n case '+': return +(arg as number);\n default:\n throw new Error(`Unsupported unary operator: ${unaryNode.operator}`);\n }\n }\n\n case 'ArrayExpression': {\n // Array literals: [1, 2, 3]\n const arrayNode = node as jsep.ArrayExpression;\n return arrayNode.elements.map(el =>\n el ? evaluateNode(el, context) : undefined\n );\n }\n\n case 'CallExpression': {\n // Function calls - only allow safe built-in methods\n // For security, we don't allow arbitrary function calls\n throw new Error('Function calls are not supported in template expressions');\n }\n\n case 'Compound':\n // Multiple expressions - not supported for security\n throw new Error('Compound expressions are not supported');\n\n default:\n throw new Error(`Unsupported expression type: ${node.type}`);\n }\n}\n\n/**\n * Safely evaluates a template expression using jsep\n * Returns undefined for parse errors or evaluation failures\n */\nexport function safeEvaluate(expression: string, context: Record<string, unknown>): unknown {\n try {\n const ast = jsep(expression);\n return evaluateNode(ast, context);\n } catch {\n // Return undefined for parse errors (e.g., undefined variables)\n return undefined;\n }\n}\n\n/**\n * Check if an expression contains operators (needs evaluation vs simple field access)\n * Used to determine whether to use the expression evaluator or simple field lookup\n */\nexport function isComplexExpression(expression: string): boolean {\n // Check for operators that require evaluation\n // Excludes dots (.) which are used for simple field access\n return /[?:+\\-*/%<>=!&|]/.test(expression);\n}\n", "/**\n * Item Template Utilities\n *\n * Shared utilities for processing CMS List item templates.\n *\n * Named context patterns (recommended):\n * - {{post.title}} - Access CMS item fields via named variable\n * - {{postIndex}} - Zero-based index of current item\n * - {{postFirst}} - Boolean, true if first item\n * - {{postLast}} - Boolean, true if last item\n *\n * Expression patterns (for conditional logic):\n * - {{item.isOpen ? \"is-open\" : \"\"}} - Ternary expressions\n * - {{itemIndex > 0 ? \"not-first\" : \"first\"}} - Comparisons\n * - {{item.active && item.visible ? \"show\" : \"hide\"}} - Logical operators\n *\n * Legacy patterns (still supported):\n * - {{item.field}} - Access CMS item fields\n * - {{itemIndex}}, {{itemFirst}}, {{itemLast}} - Position info\n */\n\nimport type { ItemContext, TemplateContext, CMSItem, CMSSchema } from './types/cms';\nimport type { ValueResolver, I18nConfig } from './types/components';\nimport { isRichTextMarker, richTextMarkerToHtml } from './propResolver';\nimport { safeEvaluate, isComplexExpression } from './expressionEvaluator';\nimport { getGlobalTemplateContext } from './globalTemplateContext';\nimport { isI18nValue, resolveI18nValue, DEFAULT_I18N_CONFIG } from './i18n';\n\nexport type { ValueResolver };\n\n/**\n * Type guard to check if context is a TemplateContext (with _type discriminator).\n */\nexport function isTemplateContext(ctx: ItemContext | TemplateContext): ctx is TemplateContext {\n return '_type' in ctx && ctx._type === 'template';\n}\n\n/**\n * Type guard to check if context is an ItemContext (legacy format).\n */\nexport function isItemContext(ctx: ItemContext | TemplateContext): ctx is ItemContext {\n return !('_type' in ctx) || ctx._type === 'item';\n}\n\n/**\n * Get a nested value from an object using dot notation path.\n * Example: getNestedValue({a: {b: 1}}, 'a.b') returns 1\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const keys = path.split('.');\n let value: unknown = obj;\n for (const key of keys) {\n if (value && typeof value === 'object' && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return undefined;\n }\n }\n return value;\n}\n\n/**\n * Check if a string contains any item template patterns (legacy or named).\n * Matches patterns like {{item.field}}, {{itemIndex}}, {{post.title}}, {{postIndex}}, etc.\n * Also matches expression patterns like {{item.isOpen ? \"open\" : \"closed\"}}.\n */\nexport function hasItemTemplates(text: string): boolean {\n // Match any {{...}} pattern that references a context variable\n // This includes:\n // - Simple field access: {{word.path}}\n // - Position variables: {{wordIndex}}, {{wordFirst}}, {{wordLast}} anywhere in expression\n // - Field access anywhere: {{2 * item.price}}, {{0.4+itemIndex*0.2}}\n return /\\{\\{(?:\\w+\\.[^}]+|[^}]*\\b\\w+(?:Index|First|Last)\\b[^}]*|[^}]*\\b\\w+\\.\\w+[^}]*)\\}\\}/.test(text);\n}\n\n/**\n * Format a template value for string interpolation.\n * Handles null/undefined, rich-text markers, and type coercion.\n */\nfunction formatTemplateValue(value: unknown, resolveValue?: ValueResolver): string {\n if (resolveValue && value !== null && value !== undefined) {\n value = resolveValue(value);\n }\n if (value === null || value === undefined) {\n return '';\n }\n // Handle rich-text markers\n if (typeof value === 'object' && '__richtext__' in value && typeof (value as unknown as { html: string }).html === 'string') {\n return (value as unknown as { html: string }).html;\n }\n return String(value);\n}\n\n/**\n * Build a flat evaluation context from ItemContext/TemplateContext.\n * Used for expression evaluation with safeEvaluate.\n */\nfunction buildEvalContext(ctx: ItemContext | TemplateContext): Record<string, unknown> {\n const evalContext: Record<string, unknown> = {\n ...getGlobalTemplateContext(),\n };\n\n for (const [key, value] of Object.entries(ctx)) {\n if (key === '_type') continue;\n evalContext[key] = value;\n }\n\n return evalContext;\n}\n\n/**\n * Process item template strings with named context support.\n * Handles both legacy ({{item.field}}) and named ({{post.field}}) patterns.\n * Also supports expressions like {{item.isOpen ? \"open\" : \"closed\"}}.\n *\n * @param text - The text containing template placeholders\n * @param ctx - The template context with named item data\n * @param resolveValue - Optional function to transform values (e.g., resolve i18n)\n */\nexport function processItemTemplate(\n text: string,\n ctx: ItemContext | TemplateContext,\n resolveValue?: ValueResolver\n): string {\n // Process all {{...}} patterns\n let result = text.replace(/\\{\\{([^}]+)\\}\\}/g, (match, expression) => {\n const trimmed = expression.trim();\n\n // Check if this is a complex expression (has operators like ?, :, <, >, etc.)\n if (isComplexExpression(trimmed)) {\n // Build flat context for expression evaluation\n const evalContext = buildEvalContext(ctx);\n const evaluated = safeEvaluate(trimmed, evalContext);\n if (evaluated === undefined) {\n return match; // Keep original if evaluation fails\n }\n return formatTemplateValue(evaluated, resolveValue);\n }\n\n // Simple field access patterns - use optimized processing\n // Check for {{varName.fieldPath}} pattern\n const fieldMatch = trimmed.match(/^(\\w+)\\.(.+)$/);\n if (fieldMatch) {\n const [, varName, fieldPath] = fieldMatch;\n const item = (ctx as TemplateContext)[varName];\n if (item && typeof item === 'object') {\n const value = getNestedValue(item as Record<string, unknown>, fieldPath.trim());\n return formatTemplateValue(value, resolveValue);\n }\n return match; // Keep original if variable not found\n }\n\n // Check for {{varNameIndex}}, {{varNameFirst}}, {{varNameLast}} patterns\n const posMatch = trimmed.match(/^(\\w+)(Index|First|Last)$/);\n if (posMatch) {\n const key = trimmed;\n const value = (ctx as TemplateContext)[key];\n if (value !== undefined) {\n return String(value);\n }\n return match; // Keep original if not found\n }\n\n // Keep original if pattern not recognized\n return match;\n });\n\n return result;\n}\n\n/**\n * Process named context templates like {{post.title}}, {{postIndex}}, etc.\n * Supports multiple named contexts for nested lists (e.g., post + author).\n */\nfunction processNamedTemplates(\n text: string,\n ctx: TemplateContext,\n resolveValue?: ValueResolver\n): string {\n let result = text;\n\n // Process {{varName.field}} patterns\n result = result.replace(/\\{\\{(\\w+)\\.([^}]+)\\}\\}/g, (match, varName, fieldPath) => {\n const item = ctx[varName];\n if (!item || typeof item !== 'object') {\n return match; // Keep original if variable not found\n }\n const value = getNestedValue(item as Record<string, unknown>, fieldPath.trim());\n return formatTemplateValue(value, resolveValue);\n });\n\n // Process {{varNameIndex}}, {{varNameFirst}}, {{varNameLast}} patterns\n result = result.replace(/\\{\\{(\\w+)(Index|First|Last)\\}\\}/g, (match, varName, suffix) => {\n const key = `${varName}${suffix}`;\n const value = ctx[key];\n if (value === undefined) {\n return match; // Keep original if not found\n }\n return String(value);\n });\n\n return result;\n}\n\n/**\n * Resolve a complete template expression (e.g., \"{{item.features}}\") to its raw value.\n * Returns undefined if the template is not a single complete expression or can't be resolved.\n * Unlike processItemTemplate which always returns a string, this preserves the original type\n * (arrays, objects, numbers, booleans).\n */\nfunction resolveCompleteTemplateRaw(\n template: string,\n ctx: ItemContext | TemplateContext,\n resolveValue?: ValueResolver\n): unknown {\n // Only handle single complete template expressions like {{varName.field}}\n const match = template.match(/^\\{\\{(\\w+)\\.([^}]+)\\}\\}$/);\n if (!match) return undefined;\n\n const [, varName, fieldPath] = match;\n\n // Check for complex expressions (ternary, comparisons, etc.) - not raw-resolvable\n const trimmedField = fieldPath.trim();\n if (/[?:<>=!&|+\\-*/%]/.test(trimmedField)) return undefined;\n\n const item = (ctx as TemplateContext)[varName];\n if (!item || typeof item !== 'object') return undefined;\n\n const value = getNestedValue(item as Record<string, unknown>, trimmedField);\n if (value === undefined) return undefined;\n\n // Apply resolveValue if provided (e.g., i18n resolution)\n if (resolveValue) {\n return resolveValue(value);\n }\n return value;\n}\n\n/**\n * Process item templates in an object's values (for props/attributes).\n * Recursively processes nested objects.\n *\n * @param props - Object containing template strings\n * @param ctx - The template context with item data\n * @param resolveValue - Optional function to transform values (e.g., resolve i18n)\n */\nexport function processItemPropsTemplate(\n props: Record<string, unknown>,\n ctx: ItemContext | TemplateContext,\n resolveValue?: ValueResolver\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string' && hasItemTemplates(value)) {\n // If the entire value is a single complete template expression (e.g., \"{{item.features}}\"),\n // resolve to the raw value to preserve type (arrays, objects, numbers).\n // This prevents arrays/objects from being stringified to \"[object Object]\".\n const rawValue = resolveCompleteTemplateRaw(value.trim(), ctx, resolveValue);\n if (rawValue !== undefined) {\n result[key] = rawValue;\n } else {\n result[key] = processItemTemplate(value, ctx, resolveValue);\n }\n } else if (Array.isArray(value)) {\n // Process arrays - recursively handle each element\n result[key] = value.map(item => {\n if (typeof item === 'string' && hasItemTemplates(item)) {\n return processItemTemplate(item, ctx, resolveValue);\n } else if (item && typeof item === 'object' && !Array.isArray(item)) {\n return processItemPropsTemplate(item as Record<string, unknown>, ctx, resolveValue);\n } else if (Array.isArray(item)) {\n // Handle nested arrays recursively\n return processItemPropsTemplate({ _arr: item }, ctx, resolveValue)._arr;\n }\n return item;\n });\n } else if (value && typeof value === 'object') {\n // Recursively process nested objects (not arrays or null)\n result[key] = processItemPropsTemplate(value as Record<string, unknown>, ctx, resolveValue);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Resolve a template expression that returns raw values (for items property).\n * Returns the raw value from context, not stringified.\n *\n * @example\n * resolveItemsTemplate(\"{{post.authorId}}\", { post: { authorId: \"author-1\" } })\n * // Returns: \"author-1\"\n *\n * resolveItemsTemplate(\"{{post.tagIds}}\", { post: { tagIds: [\"tag-1\", \"tag-2\"] } })\n * // Returns: [\"tag-1\", \"tag-2\"]\n */\nexport function resolveItemsTemplate(\n template: string,\n ctx: TemplateContext\n): string | string[] | undefined {\n // Match single template expression: {{varName.field}}\n const match = template.match(/^\\{\\{(\\w+)\\.([^}]+)\\}\\}$/);\n if (!match) {\n // Not a template, return as-is (could be a direct ID)\n return template;\n }\n\n const [, varName, fieldPath] = match;\n const item = ctx[varName];\n if (!item || typeof item !== 'object') {\n return undefined;\n }\n\n const value = getNestedValue(item as Record<string, unknown>, fieldPath.trim());\n if (value === null || value === undefined) {\n return undefined;\n }\n\n // Return as string or string array\n if (Array.isArray(value)) {\n return value.map(v => String(v));\n }\n return String(value);\n}\n\n/**\n * Resolve a template expression to its raw value (without stringification).\n * Returns undefined if template cannot be resolved.\n * Useful for checking if a value is an object (like link-type fields).\n *\n * @example\n * resolveTemplateRawValue(\"{{article.link}}\", { article: { link: { href: \"/about\", target: \"_blank\" } } })\n * // Returns: { href: \"/about\", target: \"_blank\" }\n */\nexport function resolveTemplateRawValue(\n template: string,\n ctx: TemplateContext\n): unknown {\n // Match single template expression: {{varName.field}}\n const match = template.match(/^\\{\\{(\\w+)\\.([^}]+)\\}\\}$/);\n if (!match) return undefined;\n\n const [, varName, fieldPath] = match;\n const item = ctx[varName];\n if (!item || typeof item !== 'object') return undefined;\n\n return getNestedValue(item as Record<string, unknown>, fieldPath.trim());\n}\n\n/**\n * Build a template context for a CMS item with the given variable name.\n * Includes both named context and legacy context for backward compatibility.\n *\n * @param varName - The variable name (e.g., \"post\", \"author\")\n * @param item - The CMS item data\n * @param index - Zero-based index\n * @param total - Total number of items\n * @param parentContext - Optional parent context to preserve (for nested lists)\n */\nexport function buildTemplateContext(\n varName: string,\n item: CMSItem,\n index: number,\n total: number,\n parentContext?: TemplateContext\n): TemplateContext {\n const isFirst = index === 0;\n const isLast = index === total - 1;\n\n // If parent context exists and has an 'item' key, preserve it as 'parentItem'\n // This allows nested lists to access parent data via {{parentItem.field}}\n const parentItem = parentContext?.item;\n\n return {\n // Preserve parent context (for nested lists)\n ...parentContext,\n // Preserve parent's item as parentItem for nested access\n ...(parentItem !== undefined ? { parentItem } : {}),\n // Type discriminator\n _type: 'template',\n // Named context\n [varName]: item,\n [`${varName}Index`]: index,\n [`${varName}First`]: isFirst,\n [`${varName}Last`]: isLast,\n // Legacy context (always updated to current item for backward compatibility)\n item,\n itemIndex: index,\n itemFirst: isFirst,\n itemLast: isLast,\n };\n}\n\n/**\n * Build the URL path for a CMS item based on the collection's URL pattern.\n * Resolves i18n slug values to the appropriate locale.\n *\n * @param urlPattern - The URL pattern from schema (e.g., \"/blog/{{slug}}\")\n * @param item - The CMS item\n * @param slugField - The field name that contains the slug value\n * @param locale - Optional locale for i18n slug resolution\n * @param i18nConfig - Optional i18n configuration\n * @returns The computed URL path (e.g., \"/blog/my-post\")\n *\n * @example\n * buildItemUrl('/blog/{{slug}}', { slug: 'hello-world' }, 'slug')\n * // Returns: '/blog/hello-world'\n *\n * @example\n * // With i18n slug\n * buildItemUrl('/blog/{{slug}}', { slug: { _i18n: true, en: 'hello', pl: 'czesc' } }, 'slug', 'pl')\n * // Returns: '/blog/czesc'\n */\nexport function buildItemUrl(\n urlPattern: string,\n item: CMSItem,\n slugField: string,\n locale?: string,\n i18nConfig?: I18nConfig\n): string {\n // Get slug from the schema-defined slugField, fall back to _filename, _slug, or _id\n let slug = item[slugField] ?? item._filename ?? item._slug ?? item._id;\n\n // Resolve i18n slug to locale-specific value\n if (isI18nValue(slug)) {\n const config = i18nConfig || DEFAULT_I18N_CONFIG;\n const effectiveLocale = locale || config.defaultLocale;\n slug = resolveI18nValue(slug, effectiveLocale, config) as string;\n }\n\n return urlPattern.replace('{{slug}}', String(slug));\n}\n\n/**\n * Add computed _url field to a CMS item based on schema's URL pattern.\n * Creates a shallow copy of the item with _url added.\n *\n * @param item - The CMS item to enhance\n * @param schema - The CMS schema containing urlPattern and slugField\n * @param locale - Optional locale for i18n slug resolution\n * @param i18nConfig - Optional i18n configuration\n * @returns A new item object with _url computed field added\n */\nexport function addItemUrl(\n item: CMSItem,\n schema: CMSSchema,\n locale?: string,\n i18nConfig?: I18nConfig\n): CMSItem {\n return {\n ...item,\n _url: buildItemUrl(schema.urlPattern, item, schema.slugField, locale, i18nConfig),\n };\n}\n\n/**\n * Add computed _url field to multiple CMS items.\n *\n * @param items - Array of CMS items to enhance\n * @param schema - The CMS schema containing urlPattern and slugField\n * @param locale - Optional locale for i18n slug resolution\n * @param i18nConfig - Optional i18n configuration\n * @returns Array of items with _url computed field added\n */\nexport function addItemUrls(\n items: CMSItem[],\n schema: CMSSchema,\n locale?: string,\n i18nConfig?: I18nConfig\n): CMSItem[] {\n return items.map(item => addItemUrl(item, schema, locale, i18nConfig));\n}\n", "/**\n * Shared Style Utilities\n */\n\nimport type { ResponsiveStyleObject, StyleValue, StyleObject } from './types';\n\n/**\n * Check if a style value is a responsive style object\n */\nexport function isResponsiveStyle(style: StyleValue): style is ResponsiveStyleObject {\n if (!style || typeof style !== 'object' || Array.isArray(style)) {\n return false;\n }\n \n // Check if it has base, tablet, or mobile keys (indicating responsive format)\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Type guard to check if a value is a StyleObject\n */\nexport function isStyleObject(style: unknown): style is StyleObject {\n if (!style || typeof style !== 'object' || Array.isArray(style)) {\n return false;\n }\n \n // StyleObject is a record of string keys to string | number | StyleMapping values\n // Check that it's not a ResponsiveStyleObject (which has base/tablet/mobile keys)\n // Use proper type narrowing instead of assertion\n if (!('base' in style) && !('tablet' in style) && !('mobile' in style)) {\n // All values should be string, number, or objects with _mapping property\n const obj = style as Record<string, unknown>;\n return Object.values(obj).every(value => {\n if (typeof value === 'string' || typeof value === 'number') {\n return true;\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return '_mapping' in value; // StyleMapping\n }\n return false;\n });\n }\n \n return false; // This is a ResponsiveStyleObject, not a StyleObject\n}\n\n/**\n * Type guard to check if a value is a StyleValue (either StyleObject or ResponsiveStyleObject)\n */\nexport function isStyleValue(style: unknown): style is StyleValue {\n if (!style || typeof style !== 'object' || Array.isArray(style)) {\n return false;\n }\n \n // Check if it's a ResponsiveStyleObject\n if (isResponsiveStyle(style as StyleValue)) {\n return true;\n }\n\n // Check if it's a StyleObject\n return isStyleObject(style);\n}\n\n", "/**\n * Shared Responsive Style Utilities\n * Handles merging of responsive styles with different strategies\n */\n\nimport type { ResponsiveStyleObject, StyleObject, StyleValue } from './types';\nimport type { BreakpointConfig, BreakpointName } from './breakpoints';\nimport { DEFAULT_BREAKPOINTS, getBreakpointName, getBreakpointValues } from './breakpoints';\nimport { isResponsiveStyle } from './styleUtils';\n\n/**\n * Merge strategy for responsive styles\n * - 'all': Merge all breakpoints (base \u2192 tablet \u2192 mobile) for editor preview\n * - 'viewport': Merge only up to current breakpoint based on viewport width\n */\nexport type MergeStrategy = 'all' | 'viewport';\n\n/**\n * Merge responsive styles into a single style object\n * \n * @param responsiveStyle - The responsive style object to merge\n * @param strategy - 'all' merges all breakpoints, 'viewport' merges based on active breakpoint\n * @param viewportWidth - Viewport width in pixels (required for 'viewport' strategy)\n * @param breakpoints - Breakpoint configuration (optional, defaults to DEFAULT_BREAKPOINTS)\n */\nexport function mergeResponsiveStyles(\n responsiveStyle: ResponsiveStyleObject,\n strategy: MergeStrategy = 'all',\n viewportWidth?: number,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS\n): StyleObject {\n // Start with base styles\n const merged: StyleObject = { ...(responsiveStyle.base || {}) };\n\n // Extract breakpoint values for comparisons\n const breakpointValues = getBreakpointValues(breakpoints);\n\n if (strategy === 'all') {\n // Merge all breakpoints in order: base \u2192 breakpoints sorted by value descending\n // Get all breakpoint names and sort by breakpoint value (descending)\n const breakpointEntries = Object.entries(breakpointValues);\n breakpointEntries.sort((a, b) => b[1] - a[1]); // Sort descending by value\n\n // Apply breakpoint styles in order (largest to smallest)\n for (const [name] of breakpointEntries) {\n if (responsiveStyle[name]) {\n Object.assign(merged, responsiveStyle[name]);\n }\n }\n } else if (strategy === 'viewport' && viewportWidth !== undefined) {\n // Merge only up to active breakpoint based on viewport width\n const activeBreakpoint = getBreakpointName(viewportWidth, breakpoints);\n\n // If active breakpoint is 'base', only apply base styles (already done above)\n if (activeBreakpoint === 'base') {\n // Base styles already applied, don't apply any other breakpoints\n return merged;\n }\n\n // Get all breakpoint names and sort by breakpoint value (descending)\n // so larger breakpoints apply first, then smaller ones override \u2014 matching CSS cascade\n const breakpointEntries = Object.entries(breakpointValues);\n breakpointEntries.sort((a, b) => b[1] - a[1]); // Sort descending by value\n\n // Apply styles for breakpoints whose range includes this viewport width\n // A breakpoint with max-width N only applies when viewportWidth <= N\n for (const [name, value] of breakpointEntries) {\n if (viewportWidth <= value && responsiveStyle[name]) {\n Object.assign(merged, responsiveStyle[name]);\n }\n }\n }\n\n return merged;\n}\n\n/**\n * Normalize a style value - if it's responsive, merge it; if it's flat, return as-is\n * Uses 'all' strategy by default for editor compatibility\n */\nexport function normalizeStyle(\n style: StyleValue | null | undefined,\n strategy: MergeStrategy = 'all',\n viewportWidth?: number,\n breakpoints?: BreakpointConfig\n): StyleObject | null {\n if (!style) return null;\n \n if (isResponsiveStyle(style)) {\n return mergeResponsiveStyles(style, strategy, viewportWidth, breakpoints);\n }\n \n // Legacy flat style object\n return style as StyleObject;\n}\n\n/**\n * Get breakpoint names that have non-empty styles defined\n * Always includes 'base' if the responsive style exists\n */\nexport function getAvailableBreakpoints(\n responsiveStyle: ResponsiveStyleObject | null | undefined\n): BreakpointName[] {\n if (!responsiveStyle) return [];\n \n const available: BreakpointName[] = [];\n \n // Always include 'base' if it exists and has styles\n if (responsiveStyle.base && Object.keys(responsiveStyle.base).length > 0) {\n available.push('base');\n }\n \n // Check all other breakpoint properties (excluding 'base')\n for (const [key, value] of Object.entries(responsiveStyle)) {\n if (key !== 'base' && value && typeof value === 'object' && Object.keys(value).length > 0) {\n available.push(key);\n }\n }\n \n return available;\n}\n\n/**\n * Convert breakpoint name to viewport width for style resolution\n * Used when resolving styles based on selected breakpoint in editor\n */\nexport function breakpointToViewportWidth(\n breakpoint: BreakpointName,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS\n): number {\n // Extract breakpoint values for comparisons\n const breakpointValues = getBreakpointValues(breakpoints);\n\n if (breakpoint === 'base') {\n // Use a large viewport width to ensure only base styles are applied\n // Get the largest breakpoint value and add 1\n const values = Object.values(breakpointValues);\n const maxValue = values.length > 0 ? Math.max(...values) : 1024;\n return maxValue + 1;\n }\n\n // Return the breakpoint value, or a default if not found\n return breakpointValues[breakpoint] ?? 1024;\n}\n", "/**\n * Node type utilities and type guards\n * Provides helper functions for working with ComponentNode types\n */\n\nimport type { ComponentNode, ComponentInstanceNode, HtmlNode, SlotMarker, EmbedNode, LinkNode, LocaleListNode, ComponentDefinition, StructuredComponentDefinition } from './types';\nimport type { ListNode } from './registry/nodeTypes/ListNodeType';\n\n// For backward compatibility during migration\ntype CMSListNode = ListNode;\nimport { NODE_TYPE } from './constants';\n\n/**\n * Set of HTML void elements that cannot have children.\n * These are self-closing tags like <img />, <br />, <input />, etc.\n */\nexport const VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n]);\n\n/**\n * Check if an HTML tag is a void element (self-closing, cannot have children)\n */\nexport function isVoidElement(tag: string): boolean {\n return VOID_ELEMENTS.has(tag.toLowerCase());\n}\n\n/**\n * Check if a node is an empty container that can accept children.\n * Returns true for HTML nodes (non-void) and component instances\n * that have no children (undefined or empty array).\n * Returns false for void elements, slot markers, embed nodes, list nodes,\n * null/undefined, and nodes that already have children.\n */\nexport function isEmptyContainer(node: ComponentNode | null | undefined): boolean {\n if (!node) return false;\n\n // HTML node: must be non-void and have no children\n if (isHtmlNode(node)) {\n if (isVoidElement(node.tag)) return false;\n const children = node.children;\n return children === undefined || (Array.isArray(children) && children.length === 0);\n }\n\n // Component instance: must have no children\n if (isComponentNode(node)) {\n const children = node.children;\n return children === undefined || (Array.isArray(children) && children.length === 0);\n }\n\n // All other node types (slot, embed, list, link, etc.) are not containers\n return false;\n}\n\n/**\n * Type guard to check if a node is a component instance\n */\nexport function isComponentNode(node: ComponentNode | null | undefined): node is ComponentInstanceNode {\n return node?.type === NODE_TYPE.COMPONENT;\n}\n\n/**\n * Type guard to check if a node is an HTML element\n */\nexport function isHtmlNode(node: ComponentNode | null | undefined): node is HtmlNode {\n return node?.type === NODE_TYPE.NODE;\n}\n\n/**\n * Get the component name from a ComponentNode (for component instances)\n */\nexport function getComponentName(node: ComponentNode): string | undefined {\n return isComponentNode(node) ? node.component : undefined;\n}\n\n/**\n * Get the tag name from a ComponentNode (for HTML nodes)\n */\nexport function getTagName(node: ComponentNode): string | undefined {\n return isHtmlNode(node) ? node.tag : undefined;\n}\n\n/**\n * Get the display name (tag or component name) from a ComponentNode\n * Uses registry for automatic display name resolution\n */\nexport function getDisplayName(node: ComponentNode): string {\n // Dynamic names for component/html nodes\n if (isComponentNode(node)) {\n return node.component;\n }\n if (isHtmlNode(node)) {\n return node.tag;\n }\n\n // Use registry for all other node types\n const { globalNodeTypeManager } = require('./registry');\n const definition = globalNodeTypeManager.getClient().findByNode(node);\n return definition?.displayName || 'Unknown';\n}\n\n/**\n * Extract node properties (tag/component, props) based on node type\n * Returns an object with tag, componentName, and props\n */\nexport function extractNodeProperties(node: ComponentNode): {\n tag?: string;\n componentName?: string;\n props: Record<string, unknown>;\n} {\n if (isComponentNode(node)) {\n return {\n componentName: node.component,\n props: node.props || {}\n };\n }\n if (isHtmlNode(node)) {\n return {\n tag: node.tag,\n props: {}\n };\n }\n return { props: {} };\n}\n\n/**\n * Check if a tag name is likely a component (as opposed to HTML element)\n * This is a heuristic based on naming conventions:\n * - Components typically start with uppercase (e.g., \"Card\", \"Button\")\n * - HTML elements are lowercase (e.g., \"div\", \"span\")\n * \n * Note: This is not foolproof, but works for most cases.\n * For accurate detection, use component registry lookup.\n */\nexport function isLikelyComponentTag(tag: string): boolean {\n if (!tag) return false;\n // Components typically start with uppercase letter\n return tag.length > 0 && tag[0] === tag[0].toUpperCase() && tag[0] !== tag[0].toLowerCase();\n}\n\n/**\n * Type guard to check if a node is a slot marker\n */\nexport function isSlotMarker(node: ComponentNode | null | undefined): node is SlotMarker {\n return node?.type === NODE_TYPE.SLOT;\n}\n\n/**\n * Check whether a component definition's structure contains any slot marker.\n *\n * Used by callers that decide whether to preserve a component instance's\n * `children` (e.g. the Figma paste swap) \u2014 there is no point passing children\n * to a component whose template will never render them.\n */\nexport function componentHasSlot(def: ComponentDefinition | undefined | null): boolean {\n const structure = def?.component?.structure;\n if (!structure) return false;\n return structureContainsSlot(structure);\n}\n\nfunction structureContainsSlot(node: unknown): boolean {\n if (node == null) return false;\n if (Array.isArray(node)) {\n for (const item of node) {\n if (structureContainsSlot(item)) return true;\n }\n return false;\n }\n if (typeof node !== 'object') return false;\n const obj = node as Record<string, unknown>;\n if (obj.type === NODE_TYPE.SLOT) return true;\n if (obj.children !== undefined) return structureContainsSlot(obj.children);\n return false;\n}\n\n/**\n * Type guard to check if a node is an embed node\n */\nexport function isEmbedNode(node: ComponentNode | null | undefined): node is EmbedNode {\n return node?.type === NODE_TYPE.EMBED;\n}\n\n/**\n * Type guard to check if a node is a link node\n */\nexport function isLinkNode(node: ComponentNode | null | undefined): node is LinkNode {\n return node?.type === NODE_TYPE.LINK;\n}\n\n/**\n * Type guard to check if a node is a locale list node\n */\nexport function isLocaleListNode(node: ComponentNode | null | undefined): node is LocaleListNode {\n return node?.type === NODE_TYPE.LOCALE_LIST;\n}\n\n/**\n * Type guard to check if a node is a CMS list node\n * @deprecated Use isListNode() and check sourceType === 'collection' instead.\n * Kept for backward compatibility during migration.\n */\nexport function isCMSListNode(node: unknown): node is ListNode {\n if (node === null || typeof node !== 'object') return false;\n const n = node as Record<string, unknown>;\n // Support both old cms-list type and new list with sourceType: 'collection'\n return n.type === 'cms-list' || (n.type === NODE_TYPE.LIST && n.sourceType === 'collection');\n}\n\n/**\n * Type guard to check if a node is a list node (unified type)\n */\nexport function isListNode(node: unknown): node is ListNode {\n if (node === null || typeof node !== 'object') return false;\n const n = node as Record<string, unknown>;\n // Support both old cms-list type (for migration) and new list type\n return n.type === NODE_TYPE.LIST || n.type === 'cms-list';\n}\n\n/**\n * Validate that a node type is valid\n */\nexport function isValidNodeType(type: string): type is typeof NODE_TYPE[keyof typeof NODE_TYPE] {\n return type === NODE_TYPE.NODE || type === NODE_TYPE.COMPONENT || type === NODE_TYPE.SLOT ||\n type === NODE_TYPE.EMBED || type === NODE_TYPE.LINK || type === NODE_TYPE.LOCALE_LIST ||\n type === NODE_TYPE.LIST || type === 'cms-list'; // 'cms-list' supported for migration\n}\n\n/**\n * Check if a node can have children property (excludes SlotMarker)\n */\nexport function canHaveChildren(node: ComponentNode | null | undefined): node is Exclude<ComponentNode, SlotMarker> {\n return node !== null && node !== undefined && !isSlotMarker(node);\n}\n\n/**\n * Check if a node can have style property (excludes SlotMarker)\n */\nexport function canHaveStyle(node: ComponentNode | null | undefined): node is Exclude<ComponentNode, SlotMarker> {\n return node !== null && node !== undefined && !isSlotMarker(node);\n}\n\n/**\n * Type guard: node has a children array\n */\nexport function hasChildren(node: unknown): node is { children: (ComponentNode | string)[] } {\n return node != null && typeof node === 'object' && 'children' in node && Array.isArray(node.children);\n}\n\n/**\n * Type guard: node has an if condition\n */\nexport function hasIf(node: ComponentNode): node is ComponentNode & { if: IfCondition } {\n return 'if' in node && node.if !== undefined;\n}\n\n/**\n * Check if a node is marked as slot content\n */\nexport function isSlotContent(node: unknown): boolean {\n return node != null && typeof node === 'object' && '_isSlotContent' in node && (node as Record<string, unknown>)._isSlotContent === true;\n}\n\n/**\n * Type guard to check if a value is a StructuredComponentDefinition\n */\nexport function isStructuredComponentDefinition(comp: unknown): comp is StructuredComponentDefinition {\n if (!comp || typeof comp !== 'object') {\n return false;\n }\n // Check for required structure properties (interface, structure are optional but structure should be an object if present)\n const obj = comp as Record<string, unknown>;\n // Must have at least one of: interface, structure, javascript, css\n return (\n ('interface' in obj || 'structure' in obj || 'javascript' in obj || 'css' in obj) &&\n (obj.structure === undefined || (typeof obj.structure === 'object' && obj.structure !== null))\n );\n}\n\n/**\n * Check if a ComponentDefinition has a structure property\n */\nexport function hasComponentStructure(comp: ComponentDefinition): boolean {\n return comp.component?.structure !== undefined;\n}\n\n/**\n * Check if a ComponentDefinition has a css property\n */\nexport function hasComponentCss(comp: ComponentDefinition): boolean {\n return comp.component?.css !== undefined && typeof comp.component.css === 'string';\n}\n\n/**\n * Get the node type definition from the registry\n * This is a convenience function that uses the global node type registry\n * to find the type definition for a node.\n *\n * @param node - The node to get the type definition for\n * @returns The node type definition, or undefined if not found\n *\n * @example\n * const node = { type: 'image', src: 'test.jpg' };\n * const definition = getNodeTypeDefinition(node);\n * if (definition) {\n * console.log(definition.displayName); // \"Image\"\n * }\n */\nexport function getNodeTypeDefinition(node: ComponentNode | null | undefined) {\n if (!node) return undefined;\n // Import dynamically to avoid circular dependencies\n // The globalNodeTypeManager will be initialized by the app entry point\n const { globalNodeTypeManager } = require('./registry');\n return globalNodeTypeManager.getClient().findByNode(node);\n}\n\n/**\n * Check if a node matches a specific type using the registry\n * This is an alternative to the individual type guards that uses\n * the centralized node type registry.\n *\n * @param node - The node to check\n * @param nodeType - The node type constant (e.g., NODE_TYPE.EMBED)\n * @returns true if the node matches the type\n *\n * @example\n * import { NODE_TYPE } from './constants';\n * const node = { type: 'embed', html: '<div>test</div>' };\n * if (isNodeType(node, NODE_TYPE.EMBED)) {\n * // node is an EmbedNode\n * }\n */\nexport function isNodeType(node: ComponentNode | null | undefined, nodeType: string): boolean {\n if (!node) return false;\n // Import dynamically to avoid circular dependencies\n const { globalNodeTypeManager } = require('./registry');\n return globalNodeTypeManager.getClient().isType(node, nodeType);\n}\n\n/**\n * Boolean mapping type for conditional rendering\n */\nexport interface BooleanMapping {\n _mapping: true;\n prop: string;\n values: Record<string, boolean>;\n}\n\n/**\n * If condition type - can be boolean, string template, or mapping\n */\nexport type IfCondition = boolean | string | BooleanMapping;\n\n/**\n * Check if a value is a boolean mapping\n */\nexport function isBooleanMapping(value: unknown): value is BooleanMapping {\n return (\n value !== null &&\n typeof value === 'object' &&\n '_mapping' in value &&\n (value as BooleanMapping)._mapping === true &&\n 'prop' in value &&\n typeof (value as BooleanMapping).prop === 'string' &&\n 'values' in value &&\n typeof (value as BooleanMapping).values === 'object'\n );\n}\n\n/**\n * Evaluate the if condition on a node to determine if it should be rendered.\n * Returns true if the node should be rendered, false if it should be skipped.\n *\n * @param node - The node to evaluate\n * @param props - Optional component props for resolving mappings\n * @returns true if the node should be rendered, false otherwise\n *\n * @example\n * // No if property = render\n * evaluateNodeIf({ type: 'node', tag: 'div' }) // true\n *\n * // Boolean value\n * evaluateNodeIf({ type: 'node', tag: 'div', if: true }) // true\n * evaluateNodeIf({ type: 'node', tag: 'div', if: false }) // false\n *\n * // Mapping value\n * evaluateNodeIf(\n * { type: 'node', tag: 'div', if: { _mapping: true, prop: 'visible', values: { true: true, false: false } } },\n * { visible: 'true' }\n * ) // true\n */\nexport function evaluateNodeIf(\n node: ComponentNode,\n props?: Record<string, unknown>\n): boolean {\n const ifValue = hasIf(node) ? node.if : undefined;\n\n // No if property = render (default true)\n if (ifValue === undefined) {\n return true;\n }\n\n // Boolean value\n if (typeof ifValue === 'boolean') {\n return ifValue;\n }\n\n // Mapping value - resolve using component props\n if (isBooleanMapping(ifValue)) {\n if (!props) {\n // No props available, default to true\n return true;\n }\n const propValue = props[ifValue.prop];\n const mappedValue = ifValue.values[String(propValue)];\n // If no mapping found for this prop value, default to true\n return mappedValue !== undefined ? Boolean(mappedValue) : true;\n }\n\n // String template - needs context to resolve, default to true here\n // (actual template resolution happens in the rendering context)\n if (typeof ifValue === 'string') {\n return true;\n }\n\n // Unknown type, default to true\n return true;\n}\n\n/**\n * Mark a node and all descendants as slot content.\n * Used to distinguish page-defined children (passed to component slots)\n * from component-defined structure.\n *\n * When a page contains <Stack><Text>Hello</Text></Stack>, the <Text> element\n * is page content that happens to be rendered inside the Stack component's slot.\n * For interactive styles, these elements should use the page context (p_pagename_xxx)\n * not the component context (c_stack_xxx).\n *\n * @param node - The node to mark (can be array, single node, string, number, or null)\n * @returns The same node with _isSlotContent: true added to all object nodes\n */\nexport function markAsSlotContent<T extends ComponentNode | ComponentNode[] | string | number | null | undefined>(\n node: T\n): T {\n if (!node || typeof node !== 'object') return node;\n\n if (Array.isArray(node)) {\n return node.map(markAsSlotContent) as T;\n }\n\n // Mark this node\n (node as Record<string, unknown>)._isSlotContent = true;\n\n // Recursively mark children\n if ('children' in node && node.children) {\n if (Array.isArray(node.children)) {\n node.children = node.children.map(child =>\n typeof child === 'object' && child !== null ? markAsSlotContent(child) : child\n ) as typeof node.children;\n } else if (typeof node.children === 'object') {\n markAsSlotContent(node.children as ComponentNode);\n }\n }\n\n return node;\n}\n\n", "/**\n * Prop Validator\n * Validates component props against their interface definitions\n * Provides type checking and coercion for runtime safety\n */\n\nimport type { PropDefinition } from '../types/components';\nimport { isI18nValue } from '../i18n';\nimport { isTiptapDocument } from '../richtext/types';\n\n/**\n * Validation error with context for prop validation\n */\nexport interface PropValidationError {\n propName: string;\n message: string;\n receivedValue: unknown;\n expectedType: string;\n}\n\n/**\n * Validation result\n */\nexport type PropValidationResult =\n | { valid: true; props: Record<string, unknown> }\n | { valid: false; errors: PropValidationError[]; props: Record<string, unknown> };\n\n/**\n * Coerce a value to the expected type if safe\n * Returns the coerced value or undefined if coercion is not safe\n * Note: i18n values are passed through unchanged for later resolution\n */\nfunction coerceValue(value: unknown, expectedType: PropDefinition['type']): unknown {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n // Pass through i18n values unchanged - they will be resolved later by resolveI18nInProps\n if (isI18nValue(value)) {\n return value;\n }\n\n switch (expectedType) {\n case 'string':\n return String(value);\n \n case 'number':\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const num = Number(value);\n if (!isNaN(num) && isFinite(num)) {\n return num;\n }\n }\n return undefined;\n \n case 'boolean':\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n const lower = value.toLowerCase();\n if (lower === 'true' || lower === '1') {\n return true;\n }\n if (lower === 'false' || lower === '0') {\n return false;\n }\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n return undefined;\n \n case 'select':\n return String(value);\n \n default:\n return value;\n }\n}\n\n/**\n * Validate a single prop value against its definition\n */\nfunction validateSingleProp(\n propName: string,\n propDef: PropDefinition,\n value: unknown\n): { valid: boolean; error?: PropValidationError; coercedValue?: unknown } {\n // If value is undefined, it's valid (will use default)\n if (value === undefined) {\n return { valid: true };\n }\n\n const { type } = propDef;\n // Options is only available on select type (from BasePropDefinition)\n const options = 'options' in propDef ? propDef.options : undefined;\n\n // Type checking and coercion\n let coercedValue: unknown;\n let typeValid = false;\n\n switch (type) {\n case 'string':\n coercedValue = coerceValue(value, 'string');\n // Accept both strings and i18n values (i18n values will be resolved later)\n typeValid = typeof coercedValue === 'string' || isI18nValue(coercedValue);\n break;\n\n case 'number':\n coercedValue = coerceValue(value, 'number');\n typeValid = typeof coercedValue === 'number';\n break;\n\n case 'boolean':\n coercedValue = coerceValue(value, 'boolean');\n typeValid = typeof coercedValue === 'boolean';\n break;\n\n case 'select':\n coercedValue = coerceValue(value, 'select');\n typeValid = typeof coercedValue === 'string';\n if (typeValid && options) {\n // Validate against allowed options\n if (!options.includes(coercedValue as string)) {\n return {\n valid: false,\n error: {\n propName,\n message: `Value \"${coercedValue}\" is not in allowed options: ${options.join(', ')}`,\n receivedValue: value,\n expectedType: `select(${options.join('|')})`,\n },\n };\n }\n }\n break;\n\n case 'link':\n // Link type accepts either:\n // 1. An object with href (and optional target): { href: \"/path\", target: \"_blank\" }\n // 2. A plain string URL (coerced to { href: string }): \"/path\" or \"https://...\"\n if (typeof value === 'object' && value !== null && 'href' in value) {\n coercedValue = value;\n typeValid = true;\n } else if (typeof value === 'string') {\n // Coerce string to link object for convenience (e.g., from CMS templates)\n coercedValue = value;\n typeValid = true;\n } else {\n typeValid = false;\n }\n break;\n\n case 'rich-text':\n // Rich-text accepts both strings and i18n values (i18n values will be resolved later)\n // Coerce numbers/booleans to strings (e.g. from CMS template resolution like {{item.value}})\n coercedValue = (typeof value === 'number' || typeof value === 'boolean') ? String(value) : value;\n typeValid = typeof coercedValue === 'string' || isI18nValue(coercedValue) || isTiptapDocument(coercedValue);\n break;\n\n case 'file':\n // File type accepts string values - pass through without coercion\n coercedValue = value;\n typeValid = typeof value === 'string';\n break;\n\n case 'embed':\n // Embed type stores raw HTML string\n coercedValue = value;\n typeValid = typeof value === 'string';\n break;\n\n case 'list':\n // List type accepts arrays and i18n values (i18n values will be resolved later)\n coercedValue = value;\n typeValid = Array.isArray(value) || isI18nValue(value);\n break;\n\n default:\n return {\n valid: false,\n error: {\n propName,\n message: `Unknown prop type: ${type}`,\n receivedValue: value,\n expectedType: type,\n },\n };\n }\n\n if (!typeValid) {\n return {\n valid: false,\n error: {\n propName,\n message: `Expected ${type}, got ${typeof value}`,\n receivedValue: value,\n expectedType: type,\n },\n };\n }\n\n return { valid: true, coercedValue };\n}\n\n/**\n * Validate component props against their interface definition\n * \n * @param propDefs - Component interface definition (prop name -> PropDefinition)\n * @param passedProps - Props passed to the component instance\n * @returns Validation result with validated/coerced props and any errors\n * \n * @example\n * ```typescript\n * const result = validateComponentProps(\n * { title: { type: 'string', default: 'Hello' } },\n * { title: 'World', count: 123 }\n * );\n * if (result.valid) {\n * console.log(result.props); // { title: 'World', count: 123 }\n * }\n * ```\n */\nexport function validateComponentProps(\n propDefs: Record<string, PropDefinition>,\n passedProps: Record<string, unknown>\n): PropValidationResult {\n const errors: PropValidationError[] = [];\n const validatedProps: Record<string, unknown> = {};\n\n // Validate props defined in interface\n for (const [propName, propDef] of Object.entries(propDefs)) {\n const value = passedProps[propName];\n const validation = validateSingleProp(propName, propDef, value);\n\n if (validation.valid) {\n // Use coerced value if available, otherwise use original or default\n validatedProps[propName] = validation.coercedValue !== undefined\n ? validation.coercedValue\n : (value !== undefined ? value : propDef.default);\n } else {\n // Validation failed - log error but use default if available (backward compatibility)\n if (validation.error) {\n errors.push(validation.error);\n }\n // Use default value if available, otherwise use original value (graceful degradation)\n validatedProps[propName] = propDef.default !== undefined\n ? propDef.default\n : value;\n }\n }\n\n // Preserve unknown props for backward compatibility (but log warnings)\n for (const [propName, value] of Object.entries(passedProps)) {\n if (!(propName in propDefs)) {\n // Unknown prop - preserve it but log a warning (backward compatibility)\n validatedProps[propName] = value;\n }\n }\n\n if (errors.length > 0) {\n return { valid: false, errors, props: validatedProps };\n }\n\n return { valid: true, props: validatedProps };\n}\n\n\n", "/**\n * Shared prop resolution utility\n * Resolves component props by applying defaults from interface definitions\n * Used by both client (React) and server (SSR) rendering\n */\n\nimport type { StructuredComponentDefinition, ComponentNode, PropDefinition, I18nConfig } from './types';\nimport { validateComponentProps } from './validation/propValidator';\nimport { resolveI18nInProps } from './i18n';\nimport { isTiptapDocument, tiptapToHtml, type TiptapDocument } from './richtext';\n\n/**\n * Rich-text marker object for content\n * Supports both legacy HTML strings and Tiptap JSON documents\n * Used to signal that content should be rendered as HTML, not escaped text\n */\nexport interface RichTextMarker {\n __richtext__: true;\n /** Format of the source content */\n format: 'html' | 'tiptap';\n /** HTML string (for legacy HTML content) */\n html?: string;\n /** Tiptap document (for Tiptap JSON content) */\n json?: TiptapDocument;\n}\n\n/**\n * Type guard for rich-text marker objects\n */\nexport function isRichTextMarker(value: unknown): value is RichTextMarker {\n if (typeof value !== 'object' || value === null) return false;\n const marker = value as Record<string, unknown>;\n if (marker.__richtext__ !== true) return false;\n // Support both old format (just html) and new format (format + html/json)\n return typeof marker.html === 'string' || marker.format !== undefined;\n}\n\n/**\n * Convert RichTextMarker to HTML string for rendering\n */\nexport function richTextMarkerToHtml(marker: RichTextMarker): string {\n if (marker.format === 'tiptap' && marker.json) {\n return tiptapToHtml(marker.json);\n }\n return marker.html || '';\n}\n\n/**\n * Wraps rich-text prop values in marker objects\n * This allows the template engine to detect HTML content and render it appropriately\n * Supports both legacy HTML strings and Tiptap JSON documents\n */\nfunction wrapRichTextProps(\n props: Record<string, unknown>,\n propDefs: Record<string, PropDefinition>\n): Record<string, unknown> {\n const result = { ...props };\n\n for (const [propName, propDef] of Object.entries(propDefs)) {\n if (propDef?.type === 'rich-text') {\n const value = result[propName];\n\n // Already a marker - skip\n if (isRichTextMarker(value)) {\n continue;\n }\n\n // Tiptap JSON document\n if (isTiptapDocument(value)) {\n result[propName] = {\n __richtext__: true,\n format: 'tiptap',\n json: value,\n } as RichTextMarker;\n continue;\n }\n\n // Legacy HTML string\n if (typeof value === 'string' && value.length > 0) {\n result[propName] = {\n __richtext__: true,\n format: 'html',\n html: value,\n } as RichTextMarker;\n }\n }\n }\n\n return result;\n}\n\nexport interface ResolvePropsOptions {\n propDefs: Record<string, PropDefinition>;\n passedProps: Record<string, unknown>;\n children: Array<ComponentNode | string> | string | ComponentNode | null | undefined;\n locale?: string;\n i18nConfig?: I18nConfig;\n}\n\n/**\n * Resolves component props by applying defaults and merging with passed props\n * Now includes validation for type safety\n * \n * @param options - Object containing prop definitions, passed props, and children\n * @returns Resolved props object with defaults applied and validated\n */\nexport function resolveComponentProps(options: ResolvePropsOptions): Record<string, unknown> {\n const { propDefs, passedProps, children = [], locale, i18nConfig } = options;\n \n // Validate props against interface definition\n // This provides runtime type checking while maintaining backward compatibility\n try {\n const validationResult = validateComponentProps(propDefs, passedProps);\n \n if (!validationResult.valid && validationResult.errors.length > 0) {\n // Log validation errors but continue (graceful degradation)\n }\n \n // Use validated props (includes coerced values and defaults)\n const validatedProps = validationResult.props;\n \n // Handle children prop separately (not validated by prop validator)\n const resolvedProps: Record<string, unknown> = { ...validatedProps };\n \n // Apply children handling\n if ('children' in propDefs) {\n const childrenPropDef = propDefs.children;\n if (childrenPropDef && typeof childrenPropDef === 'object' && 'default' in childrenPropDef) {\n resolvedProps.children = Array.isArray(children) && children.length > 0 \n ? children \n : childrenPropDef.default;\n } else {\n resolvedProps.children = Array.isArray(children) && children.length > 0 \n ? children \n : undefined;\n }\n } else if (Array.isArray(children) && children.length > 0) {\n // Children passed but not in interface - allow it (backward compatibility)\n resolvedProps.children = children;\n }\n\n // Resolve i18n translations FIRST (before rich-text wrapping)\n // This ensures I18nValue objects in rich-text props get resolved to strings\n // before being wrapped in RichTextMarker objects\n let result = resolvedProps;\n if (locale && i18nConfig) {\n result = resolveI18nInProps(result, locale, i18nConfig);\n }\n\n // Wrap rich-text props in marker objects for HTML rendering\n // Must happen AFTER i18n resolution so HTML strings get properly wrapped\n return wrapRichTextProps(result, propDefs);\n } catch (error) {\n // Fallback to original behavior if validation fails (backward compatibility)\n const resolvedProps: Record<string, unknown> = {};\n \n // Apply defaults and passed props (original logic)\n for (const [propName, propDef] of Object.entries(propDefs)) {\n if (propDef && typeof propDef === 'object' && 'default' in propDef) {\n if (propName === 'children') {\n resolvedProps.children = Array.isArray(children) && children.length > 0 \n ? children \n : propDef.default;\n } else {\n resolvedProps[propName] = passedProps[propName] !== undefined \n ? passedProps[propName] \n : propDef.default;\n }\n } else {\n if (propName === 'children') {\n resolvedProps.children = Array.isArray(children) && children.length > 0 \n ? children \n : undefined;\n } else {\n resolvedProps[propName] = passedProps[propName];\n }\n }\n }\n\n // Wrap rich-text props in marker objects for HTML rendering (fallback path)\n return wrapRichTextProps(resolvedProps, propDefs);\n }\n}\n\n/**\n * Resolves props from a structured component definition\n *\n * @param componentDef - Structured component definition\n * @param passedProps - Props passed to the component instance\n * @param children - Children passed to the component instance\n * @param locale - Optional locale for i18n resolution\n * @param i18nConfig - Optional i18n configuration\n * @returns Resolved props object\n */\nexport function resolvePropsFromDefinition(\n componentDef: StructuredComponentDefinition,\n passedProps: Record<string, unknown> = {},\n children: Array<ComponentNode | string> | string | ComponentNode | null | undefined = [],\n locale?: string,\n i18nConfig?: I18nConfig\n): Record<string, unknown> {\n const propDefs = componentDef.interface || {};\n return resolveComponentProps({\n propDefs,\n passedProps,\n children,\n locale,\n i18nConfig,\n });\n}\n\n", "/**\n * Style Value Registry\n * Maps utility class names to their original CSS values\n * Eliminates lossy reverse-engineering of CSS values from class names\n */\n\n// Global registry mapping class names to original CSS values\nconst registry = new Map<string, string | number>();\n\n// Registry for dynamic/fallback classes that include the CSS property name\n// Used for properties not in the standard propertyMap\nconst dynamicRegistry = new Map<string, { property: string; value: string | number }>();\n\n/**\n * Register a style value for a class name\n * Called when generating utility class names from style objects\n */\nexport function registerStyleValue(className: string, value: string | number): void {\n registry.set(className, value);\n}\n\n/**\n * Register a dynamic style (property + value) for a class name\n * Used for properties not in propertyMap that need dynamic class generation\n */\nexport function registerDynamicStyle(className: string, property: string, value: string | number): void {\n dynamicRegistry.set(className, { property, value });\n}\n\n/**\n * Get the original style value for a class name\n * Returns undefined if not registered (fallback to reverse-engineering)\n */\nexport function getStyleValue(className: string): string | number | undefined {\n return registry.get(className);\n}\n\n/**\n * Get the dynamic style (property + value) for a class name\n * Returns undefined if not registered\n */\nexport function getDynamicStyle(className: string): { property: string; value: string | number } | undefined {\n return dynamicRegistry.get(className);\n}\n\n/**\n * Check if a class name is registered in the dynamic registry\n */\nexport function isDynamicClass(className: string): boolean {\n return dynamicRegistry.has(className);\n}\n\n/**\n * Get all registered dynamic class names\n */\nexport function getAllDynamicClasses(): string[] {\n return Array.from(dynamicRegistry.keys());\n}\n\n/**\n * Clear all registered values\n * Useful for testing or resetting state\n */\nexport function clearRegistry(): void {\n registry.clear();\n dynamicRegistry.clear();\n}\n\n/**\n * Serialize registry for SSR embedding\n * Returns JSON string of all entries (both standard and dynamic)\n */\nexport function serializeRegistry(): string {\n return JSON.stringify({\n standard: Array.from(registry.entries()),\n dynamic: Array.from(dynamicRegistry.entries()),\n });\n}\n\n/**\n * Hydrate registry from SSR-embedded data\n * Call on client to restore server-side registered values\n */\nexport function hydrateRegistry(data: string): void {\n const parsed = JSON.parse(data);\n\n // Handle both old format (array) and new format (object with standard/dynamic)\n if (Array.isArray(parsed)) {\n // Old format: just standard entries\n for (const [key, value] of parsed as [string, string | number][]) {\n registry.set(key, value);\n }\n } else {\n // New format: { standard, dynamic }\n if (parsed.standard) {\n for (const [key, value] of parsed.standard as [string, string | number][]) {\n registry.set(key, value);\n }\n }\n if (parsed.dynamic) {\n for (const [key, value] of parsed.dynamic as [string, { property: string; value: string | number }][]) {\n dynamicRegistry.set(key, value);\n }\n }\n }\n}\n", "/**\n * Centralized configuration for utility class mappings\n * Single source of truth for property-to-prefix and CSS generation\n */\n\n// Mapping of CSS properties to utility class prefixes\nexport const propertyMap: Record<string, string> = {\n // Padding\n padding: 'p',\n paddingTop: 'pt',\n paddingRight: 'pr',\n paddingBottom: 'pb',\n paddingLeft: 'pl',\n paddingInline: 'px',\n paddingBlock: 'py',\n\n // Margin\n margin: 'm',\n marginTop: 'mt',\n marginRight: 'mr',\n marginBottom: 'mb',\n marginLeft: 'ml',\n marginInline: 'mx',\n marginBlock: 'my',\n\n // Display & Layout\n display: 'd',\n flexDirection: 'fd',\n justifyContent: 'jc',\n alignItems: 'ai',\n alignContent: 'ac',\n flex: 'flex',\n flexWrap: 'fw',\n gap: 'g',\n rowGap: 'rg',\n columnGap: 'cg',\n\n // Sizing\n width: 'w',\n height: 'h',\n maxWidth: 'mw',\n maxHeight: 'mh',\n minWidth: 'miw',\n minHeight: 'mih',\n aspectRatio: 'ar',\n\n // Colors & Background\n backgroundColor: 'bgc',\n background: 'bg',\n backgroundImage: 'bgi',\n color: 'c',\n\n // Borders & Radius\n border: 'b',\n borderRadius: 'br',\n borderTop: 'bt',\n borderRight: 'border-r',\n borderBottom: 'bb',\n borderLeft: 'bl',\n borderTopLeftRadius: 'brtl',\n borderTopRightRadius: 'brtr',\n borderBottomLeftRadius: 'brbl',\n borderBottomRightRadius: 'brbr',\n borderColor: 'bc',\n\n // Text\n fontSize: 'fs',\n fontWeight: 'fe',\n fontFamily: 'ff',\n textAlign: 'ta',\n textDecoration: 'td',\n textTransform: 'tt',\n lineHeight: 'lh',\n letterSpacing: 'ls',\n wordBreak: 'wb',\n overflowWrap: 'ow',\n textIndent: 'ti',\n verticalAlign: 'va',\n whiteSpace: 'whs',\n\n // Lists\n listStyle: 'lst',\n listStyleType: 'lstt',\n listStylePosition: 'lstp',\n\n // Transform & Effects\n opacity: 'o',\n transform: 'tm',\n transformOrigin: 'tmo',\n boxShadow: 'bsh',\n textShadow: 'ts',\n filter: 'flt',\n backdropFilter: 'bdf',\n backfaceVisibility: 'bfv',\n mixBlendMode: 'mbm',\n clipPath: 'cp',\n\n // Positioning\n position: 'pos',\n top: 'top',\n right: 'r',\n bottom: 'bo',\n left: 'l',\n inset: 'ins',\n zIndex: 'z',\n\n // Grid Layout\n gridTemplateColumns: 'gtc',\n gridTemplateRows: 'gtr',\n gridTemplateAreas: 'gta',\n gridGap: 'gg',\n gridAutoFlow: 'gaf',\n gridColumn: 'gc',\n gridRow: 'gr',\n gridArea: 'ga',\n gridAutoRows: 'gar',\n gridAutoColumns: 'gac',\n justifyItems: 'ji',\n justifySelf: 'jse',\n placeContent: 'plc',\n placeItems: 'pli',\n placeSelf: 'pls',\n\n // Flexbox extras\n flexGrow: 'fg',\n flexShrink: 'fsh',\n flexBasis: 'fb',\n order: 'ord',\n alignSelf: 'as',\n\n // Outline\n outline: 'ol',\n outlineWidth: 'olw',\n outlineStyle: 'ols',\n outlineColor: 'olc',\n outlineOffset: 'olo',\n\n // Other\n overflow: 'ov',\n overflowX: 'ovx',\n overflowY: 'ovy',\n cursor: 'cu',\n pointerEvents: 'pe',\n userSelect: 'us',\n transition: 'tn',\n objectFit: 'objf',\n objectPosition: 'objp',\n boxSizing: 'bsz',\n visibility: 'vis',\n resize: 'rsz',\n scrollBehavior: 'scb',\n accentColor: 'acc',\n};\n\n// Mapping of prefixes to CSS property names for dynamic rule generation\nexport const prefixToCSSProperty: Record<string, string> = {\n // Spacing\n p: 'padding',\n pt: 'padding-top',\n pr: 'padding-right',\n pb: 'padding-bottom',\n pl: 'padding-left',\n px: 'padding',\n py: 'padding',\n m: 'margin',\n mt: 'margin-top',\n mr: 'margin-right',\n mb: 'margin-bottom',\n ml: 'margin-left',\n mx: 'margin',\n my: 'margin',\n g: 'gap',\n rg: 'row-gap',\n cg: 'column-gap',\n\n // Sizing\n w: 'width',\n h: 'height',\n mw: 'max-width',\n mh: 'max-height',\n miw: 'min-width',\n mih: 'min-height',\n ar: 'aspect-ratio',\n\n // Colors & Background\n bgc: 'background-color',\n bg: 'background',\n bgi: 'background-image',\n c: 'color',\n bc: 'border-color',\n\n // Borders\n b: 'border',\n br: 'border-radius',\n brtl: 'border-top-left-radius',\n brtr: 'border-top-right-radius',\n brbl: 'border-bottom-left-radius',\n brbr: 'border-bottom-right-radius',\n bt: 'border-top',\n bb: 'border-bottom',\n bl: 'border-left',\n 'border-r': 'border-right',\n\n // Text\n fs: 'font-size',\n fe: 'font-weight',\n ff: 'font-family',\n ta: 'text-align',\n td: 'text-decoration',\n tt: 'text-transform',\n lh: 'line-height',\n ls: 'letter-spacing',\n wb: 'word-break',\n ow: 'overflow-wrap',\n ti: 'text-indent',\n va: 'vertical-align',\n whs: 'white-space',\n\n // Lists\n lst: 'list-style',\n lstt: 'list-style-type',\n lstp: 'list-style-position',\n\n // Flexbox\n fd: 'flex-direction',\n jc: 'justify-content',\n ai: 'align-items',\n ac: 'align-content',\n as: 'align-self',\n flex: 'flex',\n fw: 'flex-wrap',\n fg: 'flex-grow',\n fsh: 'flex-shrink',\n fb: 'flex-basis',\n ord: 'order',\n\n // Grid\n gtc: 'grid-template-columns',\n gtr: 'grid-template-rows',\n gta: 'grid-template-areas',\n gg: 'grid-gap',\n gaf: 'grid-auto-flow',\n gc: 'grid-column',\n gr: 'grid-row',\n ga: 'grid-area',\n gar: 'grid-auto-rows',\n gac: 'grid-auto-columns',\n ji: 'justify-items',\n jse: 'justify-self',\n plc: 'place-content',\n pli: 'place-items',\n pls: 'place-self',\n\n // Effects\n o: 'opacity',\n tm: 'transform',\n tmo: 'transform-origin',\n bsh: 'box-shadow',\n ts: 'text-shadow',\n flt: 'filter',\n bdf: 'backdrop-filter',\n bfv: 'backface-visibility',\n mbm: 'mix-blend-mode',\n cp: 'clip-path',\n\n // Positioning\n pos: 'position',\n top: 'top',\n r: 'right',\n bo: 'bottom',\n l: 'left',\n ins: 'inset',\n z: 'z-index',\n\n // Outline\n ol: 'outline',\n olw: 'outline-width',\n ols: 'outline-style',\n olc: 'outline-color',\n olo: 'outline-offset',\n\n // Other\n ov: 'overflow',\n ovx: 'overflow-x',\n ovy: 'overflow-y',\n cu: 'cursor',\n pe: 'pointer-events',\n us: 'user-select',\n tn: 'transition',\n objf: 'object-fit',\n objp: 'object-position',\n bsz: 'box-sizing',\n vis: 'visibility',\n rsz: 'resize',\n scb: 'scroll-behavior',\n acc: 'accent-color',\n};\n\n// Special value mappings for specific properties\nexport const specialValueMappings: Record<string, Record<string, string>> = {\n display: {\n flex: 'f',\n grid: 'g',\n block: 'b',\n inline: 'i',\n 'inline-block': 'ib',\n none: 'h',\n 'inline-flex': 'if',\n 'inline-grid': 'ig',\n },\n flexDirection: {\n column: 'fd-col',\n row: 'fd-row',\n },\n justifyContent: {\n center: 'jc-c',\n 'flex-start': 'jc-s',\n 'flex-end': 'jc-e',\n 'space-between': 'jc-b',\n 'space-around': 'jc-a',\n 'space-evenly': 'jc-e',\n },\n alignItems: {\n center: 'ai-c',\n 'flex-start': 'ai-s',\n 'flex-end': 'ai-e',\n stretch: 'ai-s',\n baseline: 'ai-b',\n },\n overflow: {\n hidden: 'o-h',\n auto: 'o-a',\n scroll: 'o-s',\n visible: 'o-v',\n },\n cursor: {\n pointer: 'cursor-pointer',\n default: 'cursor-default',\n },\n pointerEvents: {\n none: 'pe-none',\n auto: 'pe-auto',\n },\n userSelect: {\n none: 'us-none',\n auto: 'us-auto',\n text: 'us-text',\n all: 'us-all',\n },\n whiteSpace: {\n normal: 'whs-normal',\n nowrap: 'whs-nowrap',\n pre: 'whs-pre',\n 'pre-wrap': 'whs-pre-wrap',\n 'pre-line': 'whs-pre-line',\n },\n // Note: CSS functions (blur, translateY, scale, rotate, repeat) are now handled\n // dynamically in utilityClassMapper.ts - no need to hardcode specific values here\n};\n\n// Reverse mapping for class-to-style conversion\nexport const classToStyleSpecialCases: Record<string, { prop: string; value: string }> = {\n f: { prop: 'display', value: 'flex' },\n 'fd-col': { prop: 'flexDirection', value: 'column' },\n 'fd-row': { prop: 'flexDirection', value: 'row' },\n g: { prop: 'display', value: 'grid' },\n b: { prop: 'display', value: 'block' },\n i: { prop: 'display', value: 'inline' },\n ib: { prop: 'display', value: 'inline-block' },\n h: { prop: 'display', value: 'none' },\n 'if': { prop: 'display', value: 'inline-flex' },\n ig: { prop: 'display', value: 'inline-grid' },\n 'jc-c': { prop: 'justifyContent', value: 'center' },\n 'jc-s': { prop: 'justifyContent', value: 'flex-start' },\n 'jc-e': { prop: 'justifyContent', value: 'flex-end' },\n 'jc-b': { prop: 'justifyContent', value: 'space-between' },\n 'jc-a': { prop: 'justifyContent', value: 'space-around' },\n 'ai-c': { prop: 'alignItems', value: 'center' },\n 'ai-s': { prop: 'alignItems', value: 'flex-start' },\n 'ai-e': { prop: 'alignItems', value: 'flex-end' },\n 'ai-b': { prop: 'alignItems', value: 'baseline' },\n 'o-h': { prop: 'overflow', value: 'hidden' },\n 'o-a': { prop: 'overflow', value: 'auto' },\n 'o-s': { prop: 'overflow', value: 'scroll' },\n 'o-v': { prop: 'overflow', value: 'visible' },\n 'cursor-pointer': { prop: 'cursor', value: 'pointer' },\n 'cursor-default': { prop: 'cursor', value: 'default' },\n 'pe-none': { prop: 'pointerEvents', value: 'none' },\n 'pe-auto': { prop: 'pointerEvents', value: 'auto' },\n 'us-none': { prop: 'userSelect', value: 'none' },\n 'us-auto': { prop: 'userSelect', value: 'auto' },\n 'us-text': { prop: 'userSelect', value: 'text' },\n 'us-all': { prop: 'userSelect', value: 'all' },\n 'whs-normal': { prop: 'whiteSpace', value: 'normal' },\n 'whs-nowrap': { prop: 'whiteSpace', value: 'nowrap' },\n 'whs-pre': { prop: 'whiteSpace', value: 'pre' },\n 'whs-pre-wrap': { prop: 'whiteSpace', value: 'pre-wrap' },\n 'whs-pre-line': { prop: 'whiteSpace', value: 'pre-line' },\n // Grid template columns\n 'gtc-2': { prop: 'gridTemplateColumns', value: 'repeat(2, 1fr)' },\n 'gtc-3': { prop: 'gridTemplateColumns', value: 'repeat(3, 1fr)' },\n 'gtc-4': { prop: 'gridTemplateColumns', value: 'repeat(4, 1fr)' },\n 'gtc-5': { prop: 'gridTemplateColumns', value: 'repeat(5, 1fr)' },\n 'gtc-6': { prop: 'gridTemplateColumns', value: 'repeat(6, 1fr)' },\n // Backdrop filter\n 'bdf-blur-4': { prop: 'backdropFilter', value: 'blur(4px)' },\n 'bdf-blur-8': { prop: 'backdropFilter', value: 'blur(8px)' },\n 'bdf-blur-10': { prop: 'backdropFilter', value: 'blur(10px)' },\n // Transform\n 'tm-ty-0': { prop: 'transform', value: 'translateY(0)' },\n 'tm-ty-n10': { prop: 'transform', value: 'translateY(-10px)' },\n 'tm-ty-n50p': { prop: 'transform', value: 'translateY(-50%)' },\n // Filter\n 'flt-blur-1': { prop: 'filter', value: 'blur(1px)' },\n // Shadow presets (reverse mapping)\n 'sh-0': { prop: 'boxShadow', value: 'none' },\n 'sh-1': { prop: 'boxShadow', value: '0 1px 2px rgba(0, 0, 0, 0.05)' },\n 'sh-2': { prop: 'boxShadow', value: '0 4px 12px rgba(0, 0, 0, 0.1)' },\n 'sh-3': { prop: 'boxShadow', value: '0 8px 24px rgba(0, 0, 0, 0.15)' },\n 'sh-4': { prop: 'boxShadow', value: '0 12px 32px rgba(0, 0, 0, 0.2)' },\n // Gradient presets (reverse mapping)\n 'gr-1': { prop: 'background', value: 'linear-gradient(90deg, rgba(10,22,40,0.85) 0%, rgba(10,22,40,0.2) 100%)' },\n 'gr-2': { prop: 'background', value: 'linear-gradient(0deg, #a9e8fd, #00aee8 25%, #0f1335 72%)' },\n // Border presets (reverse mapping)\n 'bd-0': { prop: 'border', value: '1px solid var(--border)' },\n 'bd-1': { prop: 'border', value: '1px solid var(--border-light)' },\n};\n\n// ============================================================================\n// STYLE PRESETS\n// Predefined values for complex CSS properties (shadows, gradients, borders)\n// Usage: boxShadow: \"2\" \u2192 class \"sh-2\" \u2192 \"box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1)\"\n// ============================================================================\n\n// Shadow presets: sh-0, sh-1, sh-2, sh-3, sh-4\nexport const shadowPresets: Record<string, string> = {\n '0': 'none',\n '1': '0 1px 2px rgba(0, 0, 0, 0.05)',\n '2': '0 4px 12px rgba(0, 0, 0, 0.1)',\n '3': '0 8px 24px rgba(0, 0, 0, 0.15)',\n '4': '0 12px 32px rgba(0, 0, 0, 0.2)',\n};\n\n// Gradient presets: gr-1, gr-2\nexport const gradientPresets: Record<string, string> = {\n '1': 'linear-gradient(90deg, rgba(10,22,40,0.85) 0%, rgba(10,22,40,0.2) 100%)',\n '2': 'linear-gradient(0deg, #a9e8fd, #00aee8 25%, #0f1335 72%)',\n};\n\n// Border presets: bd-0, bd-1\nexport const borderPresets: Record<string, string> = {\n '0': '1px solid var(--border)',\n '1': '1px solid var(--border-light)',\n};\n", "/**\n * Maps CSS property values to utility class names\n * Example: { padding: \"10px\", display: \"flex\" } \u2192 [\"p-10px\", \"flex\"]\n * Uses centralized configuration from utilityClassConfig.ts\n */\n\nimport type { ResponsiveStyleObject, StyleObject, StyleMapping } from './types';\nimport {\n propertyMap,\n specialValueMappings,\n classToStyleSpecialCases,\n shadowPresets,\n gradientPresets,\n borderPresets,\n} from './utilityClassConfig';\nimport { registerStyleValue, registerDynamicStyle } from './styleValueRegistry';\n\n// Function name abbreviations for shorter class names\nconst functionAbbreviations: Record<string, string> = {\n blur: 'bl',\n translateY: 'ty',\n translateX: 'tx',\n translate: 't',\n scale: 'sc',\n scaleX: 'scx',\n scaleY: 'scy',\n rotate: 'ro',\n skew: 'sk',\n skewX: 'skx',\n skewY: 'sky',\n repeat: 're',\n minmax: 'mm',\n calc: 'ca',\n};\n\n/**\n * Check if a value is a StyleMapping object\n */\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return typeof value === 'object' && value !== null && '_mapping' in value && (value as StyleMapping)._mapping === true;\n}\n\n/**\n * Sanitize a value for use in a CSS class name\n * Replaces special characters with safe alternatives\n */\nfunction sanitizeClassValue(value: string): string {\n return value\n .replace(/\\s+/g, '-') // spaces to hyphens\n .replace(/[()]/g, '') // remove parentheses\n .replace(/,/g, '_') // commas to underscores\n .replace(/%/g, 'p') // percent to 'p'\n .replace(/\\./g, 'd') // dots to 'd' (for decimals)\n .replace(/[^\\w-]/g, ''); // remove other special chars\n}\n\n/**\n * Converts a CSS property value to a utility class name\n * Example: { prop: \"padding\", value: \"10px\" } \u2192 \"p-10px\"\n *\n * For properties not in propertyMap, generates a dynamic class using\n * a shortened property name prefix (e.g., \"textOverflow\" \u2192 \"txov-ellipsis\")\n */\nfunction propertyValueToClass(prop: string, value: string | number): string | null {\n const prefix = propertyMap[prop];\n\n // For properties not in propertyMap, generate a dynamic fallback class\n if (!prefix) {\n const stringValue = String(value);\n // Generate a short prefix from the property name (first 2-4 chars of each word)\n // e.g., \"textOverflow\" \u2192 \"txov\", \"WebkitBackgroundClip\" \u2192 \"wbbg\"\n const dynamicPrefix = prop\n .replace(/([A-Z])/g, '-$1') // camelCase to kebab\n .toLowerCase()\n .split('-')\n .filter(Boolean)\n .map(word => word.slice(0, 2)) // first 2 chars of each word\n .join('');\n\n // Sanitize value for class name\n const sanitizedValue = sanitizeClassValue(stringValue);\n const className = `${dynamicPrefix}-${sanitizedValue}`;\n\n // Convert camelCase to kebab-case for CSS property\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n\n // Register in dynamic registry with property info\n registerDynamicStyle(className, cssProperty, value);\n return className;\n }\n\n let stringValue = String(value);\n\n // Strip outer quotes from fontFamily values (e.g. \"Space Grotesk\" \u2192 Space Grotesk)\n if (prop === 'fontFamily') {\n stringValue = stringValue.split(',').map(font => {\n const trimmed = font.trim();\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n }).join(', ');\n }\n\n let className: string | null = null;\n\n // Check for special value mappings first\n if (specialValueMappings[prop]) {\n const mapping = specialValueMappings[prop];\n if (mapping[stringValue]) {\n className = mapping[stringValue];\n }\n }\n\n // Check for preset values (e.g., boxShadow: \"2\" \u2192 sh-2)\n if (!className && prop === 'boxShadow' && shadowPresets[stringValue]) {\n className = `sh-${stringValue}`;\n }\n if (!className && (prop === 'background' || prop === 'backgroundImage') && gradientPresets[stringValue]) {\n className = `gr-${stringValue}`;\n }\n if (!className && prop === 'border' && borderPresets[stringValue]) {\n className = `bd-${stringValue}`;\n }\n\n // Handle CSS function values: blur(), translateY(), rotate(), scale(), repeat(), etc.\n // Uses abbreviations for shorter class names: blur(8px) \u2192 bl8, translateY(-15px) \u2192 tyn15\n if (!className && stringValue.includes('(') && stringValue.includes(')')) {\n const funcMatch = stringValue.match(/^([a-zA-Z]+)\\((.+)\\)$/);\n if (funcMatch) {\n const [, funcName, args] = funcMatch;\n const abbrev = functionAbbreviations[funcName] || funcName.slice(0, 2);\n const argNormalized = args\n .replace(/,\\s*/g, '-') // \"3, 1fr\" \u2192 \"3-1fr\"\n .replace(/\\s+/g, '') // Remove spaces\n .replace(/-(\\d)/g, 'n$1') // \"-15px\" \u2192 \"n15px\"\n .replace(/px$/i, '') // Remove trailing px for brevity\n .replace(/%$/, 'p'); // \"50%\" \u2192 \"50p\"\n className = `${prefix}-${abbrev}${argNormalized}`;\n }\n }\n\n // CSS variables (e.g., var(--background))\n if (!className && stringValue.includes('var(')) {\n const varMatch = stringValue.match(/var\\((--[\\w-]+)\\)/);\n if (varMatch) {\n const varName = varMatch[1].replace('--', '');\n className = `${prefix}-${varName}`;\n }\n }\n\n // Detect variable names for color/background properties (e.g., color: \"text\" \u2192 c-text)\n // These are stored as plain names without var() wrapper and should be treated as variables\n if (!className &&\n (prop === 'color' || prop === 'backgroundColor' || prop === 'borderColor') &&\n !stringValue.match(/^\\d/) && !stringValue.includes('#') && !stringValue.includes('rgb')) {\n className = `${prefix}-${stringValue}`;\n }\n\n // Direct values (with units)\n if (!className && (stringValue.match(/^\\d+px$/) || stringValue.match(/^\\d+em$/))) {\n className = `${prefix}-${stringValue}`;\n }\n\n // Percentage values - convert % to p (e.g., \"50%\" \u2192 \"50p\")\n if (!className && stringValue.match(/^\\d+%$/)) {\n const percentValue = stringValue.replace('%', 'p');\n className = `${prefix}-${percentValue}`;\n }\n\n // Handle values with spaces by replacing spaces with hyphens (e.g., \"92px 0\" \u2192 \"p-92px-0\")\n if (!className && stringValue.includes(' ')) {\n const spacedValue = stringValue.replace(/\\s+/g, '-');\n className = `${prefix}-${spacedValue}`;\n }\n\n // Special handling for margin/padding \"auto\"\n if (!className && stringValue === 'auto') {\n className = `${prefix}-auto`;\n }\n\n // Handle values with slash (e.g., aspectRatio \"1/1\" \u2192 \"ar-1s1\")\n if (!className && stringValue.includes('/')) {\n const slashValue = stringValue.replace(/\\//g, 's');\n className = `${prefix}-${slashValue}`;\n }\n\n // For other cases, append the value\n if (!className) {\n className = `${prefix}-${stringValue}`;\n }\n\n // Register original value for CSS generation (single registration point)\n registerStyleValue(className, value);\n return className;\n}\n\n// Get property order from propertyMap for consistent class ordering\nconst propertyOrder = Object.keys(propertyMap);\n\n/**\n * Convert a style object to an array of utility classes\n * Example: { padding: \"10px\", display: \"flex\" } \u2192 [\"p-10px\", \"flex\"]\n *\n * Properties are sorted according to propertyMap order to ensure\n * dependent properties (like borderColor) come after their base (border)\n *\n * StyleMapping values are filtered out - they are handled at render time\n */\nexport function stylesToClasses(\n styles: StyleObject | Record<string, string | number> | null | undefined\n): string[] {\n if (!styles) return [];\n\n // Sort properties by their order in propertyMap\n // This ensures border comes before borderColor, etc.\n const sortedProps = Object.keys(styles).sort((a, b) => {\n const indexA = propertyOrder.indexOf(a);\n const indexB = propertyOrder.indexOf(b);\n // Unknown properties go to the end\n const orderA = indexA === -1 ? Infinity : indexA;\n const orderB = indexB === -1 ? Infinity : indexB;\n return orderA - orderB;\n });\n\n const classes: string[] = [];\n for (const prop of sortedProps) {\n const value = styles[prop];\n // Skip StyleMapping values - they are resolved at render time, not converted to classes\n if (isStyleMapping(value)) continue;\n const className = propertyValueToClass(prop, value);\n if (className) {\n classes.push(className);\n }\n }\n return classes;\n}\n\n/**\n * Convert a responsive style object to utility classes with responsive prefixes\n * Example: { base: { padding: \"10px\" }, tablet: { padding: \"24px\" } }\n * \u2192 [\"p-10px\", \"t-p-24px\"]\n *\n * Also handles flat merged style objects:\n * Example: { padding: \"10px\", display: \"flex\" } \u2192 [\"p-10px\", \"flex\"]\n */\nexport function responsiveStylesToClasses(\n styles: StyleObject | ResponsiveStyleObject | null | undefined\n): string[] {\n if (!styles) return [];\n\n const classes: string[] = [];\n\n // Check if this is a responsive style object (has base/tablet/mobile properties)\n if ('base' in styles || 'tablet' in styles || 'mobile' in styles) {\n const responsiveStyles = styles as ResponsiveStyleObject;\n\n // Base styles (no prefix)\n if (responsiveStyles.base) {\n classes.push(...stylesToClasses(responsiveStyles.base));\n }\n\n // Tablet styles (t- prefix)\n if (responsiveStyles.tablet) {\n const tabletClasses = stylesToClasses(responsiveStyles.tablet);\n classes.push(...tabletClasses.map((cls) => `t-${cls}`));\n }\n\n // Mobile styles (mob- prefix to avoid conflict with margin)\n if (responsiveStyles.mobile) {\n const mobileClasses = stylesToClasses(responsiveStyles.mobile);\n classes.push(...mobileClasses.map((cls) => `mob-${cls}`));\n }\n } else {\n // Flat style object - treat all as base classes\n classes.push(...stylesToClasses(styles as StyleObject));\n }\n\n return classes;\n}\n\n/**\n * Parse a utility class back to CSS property and value\n * Example: \"p-10px\" \u2192 { padding: \"10px\" }\n */\nexport function classToStyle(className: string): { prop: string; value: string } | null {\n // Remove responsive prefixes for parsing\n let cleanClass = className;\n let responsivePrefix = '';\n\n if (className.startsWith('t-')) {\n responsivePrefix = 't';\n cleanClass = className.slice(2);\n } else if (className.startsWith('mob-')) {\n responsivePrefix = 'mob';\n cleanClass = className.slice(4);\n }\n\n // Check special cases from config\n if (classToStyleSpecialCases[cleanClass]) {\n return classToStyleSpecialCases[cleanClass];\n }\n\n // Parse prefix-value pattern (e.g., \"p-10px\", \"m-20px\")\n const match = cleanClass.match(/^([a-z-]+)-(.*?)$/);\n if (!match) return null;\n\n const [, prefix, value] = match;\n\n // Find the property from the prefix\n let prop = '';\n for (const [key, val] of Object.entries(propertyMap)) {\n if (val === prefix) {\n prop = key;\n break;\n }\n }\n\n if (!prop) return null;\n\n // Handle CSS variables\n if (value.includes('background') || value.includes('text') || value.includes('border')) {\n return { prop, value: `var(--${value})` };\n }\n\n return { prop, value };\n}\n\n/**\n * Convert utility classes back to a style object\n * Example: [\"p-10px\", \"t-p-24px\"] \u2192 { base: { padding: \"10px\" }, tablet: { padding: \"24px\" } }\n */\nexport function classesToStyles(classes: string[]): ResponsiveStyleObject | null {\n const styles: ResponsiveStyleObject = { base: {}, tablet: {}, mobile: {} };\n\n for (const className of classes) {\n let breakpoint: 'base' | 'tablet' | 'mobile' = 'base';\n let cleanClass = className;\n\n if (className.startsWith('t-')) {\n breakpoint = 'tablet';\n cleanClass = className.slice(2);\n } else if (className.startsWith('mob-')) {\n breakpoint = 'mobile';\n cleanClass = className.slice(4);\n }\n\n const styleEntry = classToStyle(cleanClass);\n if (styleEntry) {\n if (!styles[breakpoint]) {\n styles[breakpoint] = {};\n }\n styles[breakpoint]![styleEntry.prop] = styleEntry.value;\n }\n }\n\n // Clean up empty breakpoints\n if (Object.keys(styles.tablet || {}).length === 0) delete styles.tablet;\n if (Object.keys(styles.mobile || {}).length === 0) delete styles.mobile;\n\n return Object.keys(styles.base || {}).length > 0 ? styles : null;\n}\n", "/**\n * Path Type Definition\n * Single source of truth for Path type\n */\n\n/**\n * Path is represented as a number array: [0,0,1]\n * Root is represented as [0]\n */\nexport type Path = number[];\n\n/**\n * Path string constants\n */\nexport const ROOT_STRING = 'root';\nexport const ROOT_0_STRING = 'root_0';\nexport const CHILDREN_SEPARATOR = '_children_';\nconst ROOT_PREFIX = 'root_';\nconst CHILDREN_TOKEN = 'children';\nconst PATH_SEPARATOR = '_';\n\nexport { ROOT_PREFIX, CHILDREN_TOKEN, PATH_SEPARATOR };\n\n", "/**\n * Path Validation\n * Validates path arrays and provides error handling\n */\n\nimport type { Path } from './Path';\n\n/**\n * Custom error classes for path operations\n */\nexport class InvalidPathError extends Error {\n constructor(message: string, public readonly path: unknown, public readonly index?: number) {\n super(message);\n this.name = 'InvalidPathError';\n }\n}\n\nexport class PathConversionError extends Error {\n constructor(message: string, public readonly input: unknown) {\n super(message);\n this.name = 'PathConversionError';\n }\n}\n\n/**\n * Validate that a path contains only valid numeric values\n * @throws {InvalidPathError} If path contains invalid values\n */\nexport function validatePath(path: Path): void {\n if (!Array.isArray(path)) {\n throw new InvalidPathError('Path must be an array', path);\n }\n \n for (let i = 0; i < path.length; i++) {\n const value = path[i];\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new InvalidPathError(\n `Invalid path value at index ${i}: expected number, got ${typeof value}`,\n path,\n i\n );\n }\n }\n}\n\n/**\n * Check if path is root\n * [0] -> true, [] -> true, [0,1] -> false\n */\nexport function isRootPath(path: Path): boolean {\n return path.length === 0 || (path.length === 1 && path[0] === 0);\n}\n\n", "/**\n * Path Conversion Utilities\n * Handles conversion between array paths and string paths\n */\n\nimport type { Path } from './Path';\nimport { ROOT_STRING, ROOT_0_STRING, CHILDREN_SEPARATOR, ROOT_PREFIX, CHILDREN_TOKEN, PATH_SEPARATOR } from './Path';\nimport { validatePath, PathConversionError } from './PathValidator';\n\n/**\n * Normalize path input to Path array\n * Accepts both Path arrays and string paths, converts to Path array\n * @param input - Path array or string path\n * @returns Normalized Path array\n */\nexport function normalizePathInput(input: Path | string): Path {\n if (typeof input === 'string') {\n return stringToPath(input);\n }\n if (!Array.isArray(input)) {\n throw new PathConversionError('Path input must be an array or string', input);\n }\n return input;\n}\n\n/**\n * Convert array path to string for Map keys and DOM attributes\n * [0,0,1] -> \"0,0,1\"\n */\nexport function pathToString(path: Path): string {\n return path.join(',');\n}\n\n/**\n * Convert string path to array path\n * \"0,0,1\" -> [0,0,1] (comma-separated format from pathToString)\n * \"0\" -> [0]\n * \"root\" -> [0]\n */\nexport function stringToPath(str: string): Path {\n if (!str || str === ROOT_STRING || str === ROOT_0_STRING) {\n return [0];\n }\n\n // Parse comma-separated format: \"0,0,1\" -> [0, 0, 1]\n return str.split(',').map(s => {\n const num = parseInt(s, 10);\n if (isNaN(num)) {\n throw new PathConversionError(`Invalid numeric index: ${s}`, str);\n }\n return num;\n });\n}\n\n/**\n * Convert array path to legacy string format (for backward compatibility)\n * Converts Path arrays to legacy string format used by TreeNode.path and iframe messages\n * \n * @param path - Path array to convert (e.g., [0,0,1])\n * @returns Legacy string path (e.g., \"root_0_children_0_children_1\")\n */\nexport function pathToLegacyString(path: Path): string {\n if (path.length === 0 || (path.length === 1 && path[0] === 0)) {\n return ROOT_0_STRING;\n }\n \n // Build: root_0_children_0_children_1\n let result = ROOT_0_STRING;\n for (let i = 1; i < path.length; i++) {\n result += `${CHILDREN_SEPARATOR}${path[i]}`;\n }\n \n return result;\n}\n\n/**\n * Convert DOM path string to tree path array\n * DOM paths: \"root\", \"root_children_0\"\n * Tree paths: [0], [0,0]\n */\nexport function domPathStringToTreePath(domPath: string): Path {\n if (domPath === ROOT_STRING || domPath === '') {\n return [0];\n }\n \n // Remove \"root_\" prefix and parse\n const cleanPath = domPath.startsWith(ROOT_PREFIX) \n ? domPath.substring(ROOT_PREFIX.length)\n : domPath;\n \n // Parse \"children_0_children_1\" -> [0, 1]\n const parts = cleanPath.split(PATH_SEPARATOR);\n const path: Path = [0]; // Tree paths always start with [0]\n \n for (let i = 0; i < parts.length; i++) {\n if (parts[i] === CHILDREN_TOKEN && i + 1 < parts.length) {\n const indexStr = parts[i + 1];\n const index = parseInt(indexStr, 10);\n if (!isNaN(index) && indexStr === String(index)) {\n // Valid numeric index\n path.push(index);\n i++;\n }\n // Invalid index segments are silently skipped\n }\n }\n \n return path;\n}\n\n/**\n * Convert tree path array to DOM path string\n * Converts Path arrays to DOM path strings used for element registration and highlighting\n * \n * @param path - Path array or string (e.g., [0,0,1] or \"root_0_children_0_children_1\")\n * @returns DOM path string (e.g., \"root_children_0_children_1\")\n * @throws {InvalidPathError} If path contains invalid values\n */\nexport function treePathToDomPathString(path: Path | string): string {\n // Handle string input (backward compatibility)\n if (typeof path === 'string') {\n const pathArray = stringToPath(path);\n return treePathToDomPathString(pathArray);\n }\n \n // Validate path before processing\n validatePath(path);\n \n if (path.length === 0 || (path.length === 1 && path[0] === 0)) {\n return ROOT_STRING;\n }\n \n // Build: root_children_0_children_1\n let result = ROOT_STRING;\n for (let i = 1; i < path.length; i++) {\n result += `${CHILDREN_SEPARATOR}${path[i]}`;\n }\n \n return result;\n}\n\n", "/**\n * Path Utility Functions\n * Common operations on paths\n */\n\nimport type { Path } from './Path';\nimport type { ComponentNode } from '../types';\nimport { isRootPath } from './PathValidator';\nimport { normalizePathInput } from './PathConverter';\nimport { isSlotMarker } from '../nodeUtils';\n\n/**\n * Calculate path offset caused by slot expansion\n *\n * When a component structure contains {type: \"children\"} markers,\n * they are replaced with actual instance children during rendering.\n * This changes indices for all subsequent elements.\n *\n * Example:\n * Component structure: [children_marker, Card, Button]\n * If children_marker expands to 3 children: [child1, child2, child3, Card, Button]\n * Original indices: [0, 1, 2]\n * Actual indices: [0,1,2, 3, 4]\n * Offset for index 1: +2 (expanded from 1 to 3 children)\n * Offset for index 2: +2\n *\n * @param componentPath - Path in component context (e.g., [0, 0, 2])\n * @param componentStructure - Component definition structure\n * @param instanceChildren - Actual children from component instance\n * @returns Offset to add to path indices due to slot expansion\n */\nfunction calculateChildrenExpansionOffset(\n componentPath: Path,\n componentStructure: ComponentNode | undefined,\n instanceChildren: ComponentNode['children'] | undefined\n): number {\n if (!componentStructure || !Array.isArray(instanceChildren)) {\n return 0;\n }\n\n // Count actual children (accounting for marker expansion)\n const childrenCount = Array.isArray(instanceChildren) ? instanceChildren.length : (instanceChildren ? 1 : 0);\n\n let offset = 0;\n let currentNode = componentStructure;\n\n // Walk the component structure following the path\n for (let i = 1; i < componentPath.length; i++) {\n const index = componentPath[i];\n\n // Get children of current node\n if (!currentNode || !Array.isArray((currentNode as any).children)) {\n break;\n }\n\n const children = (currentNode as any).children;\n\n // Check if first level has a slot marker that affects the index\n if (i === 1 && Array.isArray(children) && children.length > 0 && isSlotMarker(children[0])) {\n // Children marker is at index 0, so indices 0 to (childrenCount - 1) map to children\n const pageFirstIndex = index;\n\n // If page index is within the children range, it's a child (no offset)\n if (pageFirstIndex < childrenCount) {\n // Keep original offset (0)\n } else {\n // Page index is after slot expansion\n // Subtract the offset (childrenCount - 1) to get component index\n offset = childrenCount - 1;\n }\n }\n\n // Move to next node in the path\n if (index < children.length) {\n currentNode = (children[index] as any) as ComponentNode;\n } else {\n break;\n }\n }\n\n return offset;\n}\n\n/**\n * Get parent path\n * [0,0,1] -> [0,0]\n * [0] -> [0] (root has no parent, return itself)\n */\nexport function getParentPath(path: Path): Path {\n if (path.length <= 1) {\n return [0]; // Root\n }\n return path.slice(0, -1);\n}\n\n/**\n * Get child path by appending index\n * [0,0] + 1 -> [0,0,1]\n */\nexport function getChildPath(parent: Path, index: number): Path {\n return [...parent, index];\n}\n\n/**\n * Check if path1 is ancestor of path2\n * [0,0] is ancestor of [0,0,1] -> true\n */\nexport function isAncestorPath(ancestor: Path, descendant: Path): boolean {\n if (ancestor.length >= descendant.length) {\n return false;\n }\n return ancestor.every((val, idx) => val === descendant[idx]);\n}\n\n/**\n * Get depth of path\n * [0] -> 0, [0,1] -> 1, [0,1,2] -> 2\n */\nexport function getPathDepth(path: Path): number {\n return Math.max(0, path.length - 1);\n}\n\n/**\n * Build all parent paths for tree expansion\n * [0,0,1] -> [[0], [0,0]]\n */\nexport function buildParentPaths(path: Path): Path[] {\n if (isRootPath(path)) {\n return [];\n }\n \n const parents: Path[] = [];\n for (let i = 1; i < path.length; i++) {\n parents.push(path.slice(0, i));\n }\n \n return parents;\n}\n\n/**\n * Compare two paths for equality\n * Accepts both Path arrays and strings, normalizes before comparison\n *\n * @param path1 - First path (Path array or string)\n * @param path2 - Second path (Path array or string)\n * @returns True if paths are equal\n */\nexport function pathsEqual(path1: Path | string, path2: Path | string): boolean {\n const normalizedPath1 = normalizePathInput(path1);\n const normalizedPath2 = normalizePathInput(path2);\n\n if (normalizedPath1.length !== normalizedPath2.length) {\n return false;\n }\n return normalizedPath1.every((val, idx) => val === normalizedPath2[idx]);\n}\n\n/**\n * Convert page-context path to component-context path\n *\n * When editing a component, paths from the canvas are in page context\n * (full path including component instance location). This function converts\n * them to component-context paths (relative to component definition root).\n *\n * Accounts for {type: \"children\"} expansion when provided with component\n * structure and instance children.\n *\n * @param pagePath - Path in page context (e.g., [0, 0, 1, 0, 0])\n * @param componentInstancePath - Path to component instance in page (e.g., [0, 0, 1])\n * @param componentStructure - Component definition structure (for children offset calculation)\n * @param instanceChildren - Actual children from component instance (for children offset calculation)\n * @returns Path in component context (e.g., [0, 0, 0]) or null if not within component\n *\n * @example\n * convertPagePathToComponentPath([0, 0, 1, 0, 0], [0, 0, 1])\n * // Returns: [0, 0, 0]\n *\n * convertPagePathToComponentPath([0, 0, 2], [0, 0, 1])\n * // Returns: null (not within component instance)\n *\n * convertPagePathToComponentPath([0, 0, 1, 4], [0, 0, 1], structure, [child1, child2, child3])\n * // If structure has slot marker at index 0:\n * // Returns: [0, 1] (not [0, 4] - offset back by -3)\n */\nexport function convertPagePathToComponentPath(\n pagePath: Path,\n componentInstancePath: Path,\n componentStructure?: ComponentNode,\n instanceChildren?: ComponentNode['children']\n): Path | null {\n // Check if pagePath starts with componentInstancePath\n // Path must be within or equal to component instance\n const isWithinComponent = isAncestorPath(componentInstancePath, pagePath) ||\n pathsEqual(pagePath, componentInstancePath);\n\n if (!isWithinComponent) {\n return null; // Path is not within the component instance\n }\n\n // Extract suffix (indices after component instance path)\n const suffix = pagePath.slice(componentInstancePath.length);\n\n // If we need to account for slot expansion, build the component path to calculate offset\n let adjustedSuffix = suffix;\n if (suffix.length > 0 && componentStructure && Array.isArray(instanceChildren)) {\n const childrenCount = instanceChildren.length;\n\n // Check if first level has a slot marker that affects the index\n if (\n Array.isArray(componentStructure.children) &&\n componentStructure.children.length > 0 &&\n isSlotMarker(componentStructure.children[0])\n ) {\n // Children marker is at index 0, so indices 0 to (childrenCount - 1) map to children\n const pageFirstIndex = suffix[0];\n\n // If page index is within the children range, it's a child (no component path)\n if (pageFirstIndex < childrenCount) {\n // This element is from instance children, not part of component structure\n // We can still return the path but know it's an instance child\n // Keep the original suffix\n adjustedSuffix = suffix;\n } else {\n // Page index is after slot expansion\n // Subtract the offset (childrenCount - 1) to get component index\n const offset = childrenCount - 1;\n adjustedSuffix = [suffix[0] - offset, ...suffix.slice(1)];\n }\n }\n }\n\n // Component paths always start with [0] (component root)\n return [0, ...adjustedSuffix];\n}\n\n/**\n * Convert component-context path to page-context path\n *\n * When editing a component, tree selections use component-context paths.\n * To highlight in the canvas, we need to convert them to page-context paths\n * (full path including component instance location).\n *\n * Accounts for {type: \"children\"} expansion when provided with component\n * structure and instance children.\n *\n * @param componentPath - Path in component context (e.g., [0, 0, 0])\n * @param componentInstancePath - Path to component instance in page (e.g., [0, 0, 1])\n * @param componentStructure - Component definition structure (for children offset calculation)\n * @param instanceChildren - Actual children from component instance (for children offset calculation)\n * @returns Path in page context (e.g., [0, 0, 1, 0, 0])\n *\n * @example\n * convertComponentPathToPagePath([0, 0, 0], [0, 0, 1])\n * // Returns: [0, 0, 1, 0, 0]\n *\n * convertComponentPathToPagePath([0], [0, 0, 1])\n * // Returns: [0, 0, 1] (component root maps to instance)\n *\n * convertComponentPathToPagePath([0, 1], [0, 0, 1], structure, [child1, child2, child3])\n * // If structure has slot marker at index 0:\n * // Returns: [0, 0, 1, 4] (not [0, 0, 1, 1] - offset by +3)\n */\nexport function convertComponentPathToPagePath(\n componentPath: Path,\n componentInstancePath: Path,\n componentStructure?: ComponentNode,\n instanceChildren?: ComponentNode['children']\n): Path {\n // Component paths start with [0] (component root)\n if (componentPath.length === 1 && componentPath[0] === 0) {\n // Component root maps to the component instance path\n return componentInstancePath;\n }\n\n // Extract suffix (everything after component root [0])\n const suffix = componentPath.slice(1);\n\n // Calculate offset caused by slot expansion\n const offset = calculateChildrenExpansionOffset(componentPath, componentStructure, instanceChildren);\n\n // Apply offset to first level index if slot expansion occurred\n let adjustedSuffix = suffix;\n if (offset > 0 && suffix.length > 0) {\n adjustedSuffix = [suffix[0] + offset, ...suffix.slice(1)];\n }\n\n // Append adjusted suffix to component instance path\n return [...componentInstancePath, ...adjustedSuffix];\n}\n\n", "/**\n * Element Class Name Generation\n * Generates unique, stable CSS class names for elements based on their context\n *\n * Format:\n * - Components: c_<componentName>_<elementName|hash>\n * - Pages: p_<pageName>_<elementName|hash>\n *\n * Examples:\n * - c_navigation_hamburger (component \"Navigation\", element named \"Hamburger\")\n * - p_about_grid5 (page \"about\", element named \"Grid5\")\n * - c_navigation_a42e3 (component \"Navigation\", unnamed element with path hash)\n */\n\nimport type { Path } from './paths';\nimport { pathToString } from './paths';\n\n/**\n * Context for generating element class names\n */\nexport interface ElementClassContext {\n /** Type of file: 'component' or 'page' */\n fileType: 'component' | 'page';\n /** Name of the component or page (without extension) */\n fileName: string;\n /** Element's label if set */\n label?: string;\n /** Element's path in the tree */\n path: Path;\n}\n\n/**\n * Simple djb2 hash function that works in browser and server\n * Returns a short alphanumeric string\n */\nexport function shortHash(input: string): string {\n let hash = 5381;\n for (let i = 0; i < input.length; i++) {\n hash = ((hash << 5) + hash) ^ input.charCodeAt(i);\n }\n // Take the LAST 5 base36 chars: the low-order digits change with every\n // input byte, so sibling paths that share a long prefix and differ only\n // in their final index still produce distinct hashes. Slicing from the\n // start kept the high-order digits, which barely move when only the\n // last char of the input changes \u2014 every set of siblings collided.\n return Math.abs(hash).toString(36).slice(-5);\n}\n\n/**\n * Sanitize a name to be a valid CSS class name\n * - Lowercase\n * - Replace non-alphanumeric with underscore\n * - Remove leading/trailing underscores\n * - Collapse multiple underscores\n */\nfunction sanitizeName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '');\n}\n\n/**\n * Generate a unique CSS class name for an element\n *\n * @param ctx - Context containing file type, name, and element info\n * @returns CSS class name like \"c_navigation_hamburger\" or \"p_about_a42e3\"\n */\nexport function generateElementClassName(ctx: ElementClassContext): string {\n const prefix = ctx.fileType === 'component' ? 'c' : 'p';\n const sanitizedFileName = sanitizeName(ctx.fileName);\n\n if (ctx.label) {\n return `${prefix}_${sanitizedFileName}_${sanitizeName(ctx.label)}`;\n }\n\n // Generate hash from file name + path for unnamed elements\n const pathString = pathToString(ctx.path);\n const hash = shortHash(`${ctx.fileName}:${pathString}`);\n return `${prefix}_${sanitizedFileName}_${hash}`;\n}\n\n/**\n * Check if a class name is an element-specific class (c_ or p_ prefix)\n */\nexport function isElementClassName(className: string): boolean {\n return /^[cp]_[a-z0-9_-]+_[a-z0-9_-]+$/.test(className);\n}\n\n/**\n * Parse an element class name into its components\n * Returns null if not a valid element class name\n */\nexport function parseElementClassName(\n className: string\n): { fileType: 'component' | 'page'; fileName: string; elementName: string } | null {\n const match = className.match(/^([cp])_([a-z0-9_-]+)_([a-z0-9_-]+)$/);\n if (!match) return null;\n\n return {\n fileType: match[1] === 'c' ? 'component' : 'page',\n fileName: match[2],\n elementName: match[3],\n };\n}\n", "/**\n * Interactive Style Mappings Utilities\n *\n * Extracts StyleMappings from interactive styles and replaces them with CSS variable references.\n * This enables component instances to have different hover/focus/etc. styles based on props\n * while sharing the same CSS rules.\n *\n * @example\n * const { resolvedStyles, mappings } = extractInteractiveStyleMappings([\n * { selector: ':hover', style: { base: { backgroundColor: { _mapping: true, prop: 'variant', values: { primary: '#0070f3' } } } } }\n * ]);\n * // resolvedStyles[0].style.base.backgroundColor === 'var(--is-0)'\n */\n\nimport type {\n InteractiveStyles,\n InteractiveStyleRule,\n StyleMapping,\n StyleObject,\n ResponsiveStyleObject,\n} from './types/styles';\nimport type { PropDefinition } from './types/components';\n\n/**\n * Type guard to check if a value is a StyleMapping\n */\nexport function isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\n/**\n * Extracted mapping information\n */\nexport interface ExtractedMapping {\n /** Index of the rule in the interactiveStyles array */\n ruleIndex: number;\n /** Breakpoint name (null for flat styles, 'base'/'tablet'/'mobile' for responsive) */\n breakpoint: string | null;\n /** CSS property name */\n property: string;\n /** The original StyleMapping object */\n mapping: StyleMapping;\n /** Flat index for variable naming: 0, 1, 2, 3... */\n variableIndex: number;\n}\n\n/**\n * Result of extracting mappings from interactive styles\n */\nexport interface ExtractionResult {\n /** Interactive styles with mappings replaced by var() references */\n resolvedStyles: InteractiveStyles;\n /** Extracted mappings with generated variable names */\n mappings: ExtractedMapping[];\n}\n\n/**\n * Generate CSS variable name from index\n * Variable names are: --is-0, --is-1, --is-2, etc.\n */\nexport function getVariableName(index: number): string {\n return `--is-${index}`;\n}\n\n/**\n * Check if a style object (flat or responsive) contains any mappings\n */\nfunction hasAnyMappings(style: StyleObject | ResponsiveStyleObject): boolean {\n // Check if it's a responsive style (has 'base' or known breakpoint keys)\n const isResponsive = 'base' in style || Object.keys(style).some(key =>\n key === 'base' || key === 'tablet' || key === 'mobile'\n );\n\n if (isResponsive) {\n const responsive = style as ResponsiveStyleObject;\n for (const breakpointStyle of Object.values(responsive)) {\n if (breakpointStyle) {\n for (const value of Object.values(breakpointStyle)) {\n if (isStyleMapping(value)) return true;\n }\n }\n }\n } else {\n const flat = style as StyleObject;\n for (const value of Object.values(flat)) {\n if (isStyleMapping(value)) return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if interactive styles contain any mappings\n */\nexport function hasInteractiveStyleMappings(interactiveStyles: InteractiveStyles): boolean {\n for (const rule of interactiveStyles) {\n if (hasAnyMappings(rule.style)) return true;\n }\n return false;\n}\n\n/**\n * Extract mappings from interactive styles and replace with CSS variable references\n *\n * @param interactiveStyles - Array of interactive style rules\n * @returns Object with resolved styles (var() references) and extracted mappings\n */\nexport function extractInteractiveStyleMappings(\n interactiveStyles: InteractiveStyles\n): ExtractionResult {\n const mappings: ExtractedMapping[] = [];\n let variableIndex = 0;\n\n const resolvedStyles: InteractiveStyles = interactiveStyles.map((rule, ruleIndex) => {\n const style = rule.style;\n\n // Check if it's a responsive style\n const isResponsive = 'base' in style || Object.keys(style).some(key =>\n key === 'base' || key === 'tablet' || key === 'mobile'\n );\n\n if (isResponsive) {\n const responsive = style as ResponsiveStyleObject;\n const resolvedResponsive: ResponsiveStyleObject = {};\n\n for (const [breakpointName, breakpointStyle] of Object.entries(responsive)) {\n if (!breakpointStyle) continue;\n\n const resolvedBreakpointStyle: StyleObject = {};\n\n for (const [prop, value] of Object.entries(breakpointStyle)) {\n if (isStyleMapping(value)) {\n // Extract the mapping\n mappings.push({\n ruleIndex,\n breakpoint: breakpointName,\n property: prop,\n mapping: value,\n variableIndex,\n });\n\n // Replace with var() reference\n resolvedBreakpointStyle[prop] = `var(${getVariableName(variableIndex)})`;\n variableIndex++;\n } else {\n resolvedBreakpointStyle[prop] = value;\n }\n }\n\n resolvedResponsive[breakpointName] = resolvedBreakpointStyle;\n }\n\n return {\n ...rule,\n style: resolvedResponsive,\n };\n } else {\n // Flat style object\n const flat = style as StyleObject;\n const resolvedFlat: StyleObject = {};\n\n for (const [prop, value] of Object.entries(flat)) {\n if (isStyleMapping(value)) {\n // Extract the mapping\n mappings.push({\n ruleIndex,\n breakpoint: null,\n property: prop,\n mapping: value,\n variableIndex,\n });\n\n // Replace with var() reference\n resolvedFlat[prop] = `var(${getVariableName(variableIndex)})`;\n variableIndex++;\n } else {\n resolvedFlat[prop] = value;\n }\n }\n\n return {\n ...rule,\n style: resolvedFlat,\n };\n }\n });\n\n return { resolvedStyles, mappings };\n}\n\n/**\n * Resolve extracted mappings to CSS variable values based on component props\n *\n * @param mappings - Extracted mappings from extractInteractiveStyleMappings\n * @param props - Component props to resolve against\n * @returns Object mapping variable names to resolved values: { '--is-0': '#0070f3', '--is-1': '#0055cc' }\n */\nexport function resolveExtractedMappings(\n mappings: ExtractedMapping[],\n props: Record<string, unknown>\n): Record<string, string> {\n const cssVariables: Record<string, string> = {};\n\n for (const extracted of mappings) {\n const { mapping, variableIndex } = extracted;\n const propValue = props[mapping.prop];\n\n // Skip if prop value is undefined or null\n if (propValue === undefined || propValue === null) {\n continue;\n }\n\n // Convert prop value to string for lookup\n const propValueStr = String(propValue);\n\n // Look up the resolved style value\n const resolvedValue = mapping.values[propValueStr];\n\n // Skip if prop value not in mapping (e.g., variant='purple' with only 'primary'/'secondary' defined)\n if (resolvedValue === undefined) {\n continue;\n }\n\n const variableName = getVariableName(variableIndex);\n cssVariables[variableName] = String(resolvedValue);\n }\n\n return cssVariables;\n}\n\n/**\n * Create a StyleMapping from component prop definitions\n *\n * @param componentPropDefs - Component prop definitions\n * @param currentValue - Current style value to use as default for first option\n * @returns StyleMapping object or null if no props available\n *\n * @example\n * const mapping = createStyleMappingFromProps(\n * { variant: { type: 'select', options: ['primary', 'secondary'] } },\n * '#0070f3'\n * );\n * // Returns: { _mapping: true, prop: 'variant', values: { primary: '#0070f3', secondary: '' } }\n */\nexport function createStyleMappingFromProps(\n componentPropDefs: Record<string, PropDefinition>,\n currentValue: string | number\n): StyleMapping | null {\n // Find a prop to map to (prefer 'variant' if it exists, otherwise use first prop)\n const propToMap = componentPropDefs.variant ? 'variant' : Object.keys(componentPropDefs)[0];\n\n if (!propToMap) {\n return null;\n }\n\n // Get options for the prop if it's a select type\n const propDef = componentPropDefs[propToMap];\n const options = propDef?.type === 'select' && Array.isArray(propDef.options) ? propDef.options : [];\n\n // Create mapping with current value as default for first option\n const mappingValues: Record<string, string | number> = {};\n if (options.length > 0) {\n mappingValues[options[0]] = currentValue;\n // Add other options with empty/default values\n options.slice(1).forEach((opt: string) => {\n mappingValues[opt] = '';\n });\n } else {\n // No options, create a default mapping\n mappingValues['default'] = currentValue;\n }\n\n return {\n _mapping: true,\n prop: propToMap,\n values: mappingValues\n };\n}\n", "/**\n * Link utility functions for URL path matching.\n * Used to determine if a navigation link points to the current page.\n */\n\n/**\n * Normalize a URL path for comparison (strip trailing slash, query string, hash)\n */\nexport function normalizePath(path: string): string {\n let normalized = path.split('?')[0].split('#')[0];\n if (normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\n/**\n * Check if a link href matches the current page path.\n * Only matches internal links (starts with /, not //).\n */\nexport function isCurrentLink(href: string, currentPagePath: string): boolean {\n if (!href.startsWith('/') || href.startsWith('//')) return false;\n return normalizePath(href) === normalizePath(currentPagePath);\n}\n", "/**\n * CSS Named Colors\n * Complete set of CSS Level 4 named colors + keywords\n * Used to distinguish named colors from CSS variable references\n */\n\nexport const CSS_NAMED_COLORS: ReadonlySet<string> = new Set([\n // CSS Level 4 named colors\n 'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure',\n 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood',\n 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan',\n 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki',\n 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon',\n 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet',\n 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue',\n 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia',\n 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'grey',\n 'honeydew', 'hotpink',\n 'indianred', 'indigo', 'ivory',\n 'khaki',\n 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan',\n 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon',\n 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow',\n 'lime', 'limegreen', 'linen',\n 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple',\n 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred',\n 'midnightblue', 'mintcream', 'mistyrose', 'moccasin',\n 'navajowhite', 'navy',\n 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid',\n 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff',\n 'peru', 'pink', 'plum', 'powderblue', 'purple',\n 'rebeccapurple', 'red', 'rosybrown', 'royalblue',\n 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue',\n 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue',\n 'tan', 'teal', 'thistle', 'tomato', 'turquoise',\n 'violet',\n 'wheat', 'white', 'whitesmoke',\n 'yellow', 'yellowgreen',\n // CSS color keywords\n 'transparent', 'currentcolor',\n // CSS-wide keywords (should never be wrapped in var())\n 'inherit', 'initial', 'unset', 'revert',\n]);\n\nexport function isCssNamedColor(value: string): boolean {\n return CSS_NAMED_COLORS.has(value.toLowerCase());\n}\n", "/**\n * Shared CSS Generation Module\n * Unified CSS generation logic for both editor and static render systems\n * Used by both client and server to ensure consistent CSS output\n */\n\nimport { prefixToCSSProperty, propertyMap } from './utilityClassConfig';\nimport { getStyleValue, getDynamicStyle, isDynamicClass } from './styleValueRegistry';\nimport { isCssNamedColor } from './cssNamedColors';\nimport type { BreakpointConfig, LegacyBreakpointConfig } from './breakpoints';\nimport { DEFAULT_BREAKPOINTS, getBreakpointValues } from './breakpoints';\nimport type { ResponsiveScales, CSSPropertyType } from './responsiveScaling';\nimport { scalePropertyValue, getScaleMultiplier } from './responsiveScaling';\nimport type { InteractiveStyles, StyleObject, ResponsiveStyleObject, StyleValue } from './types/styles';\nimport type { RemConversionConfig } from './pxToRem';\nimport { applyRemConversion, convertPxToRem, shouldConvertProperty } from './pxToRem';\n\n/** Sorted prefix list (longest first) \u2014 cached at module level to avoid re-sorting per call */\nconst SORTED_PREFIXES: readonly string[] = Object.keys(prefixToCSSProperty)\n .sort((a, b) => b.length - a.length);\n\n/**\n * Map from CSS property (kebab-case) to its index in propertyMap.\n * Shorthands like 'border' have lower indices than longhands like 'border-color',\n * so sorting by this index ensures shorthand CSS rules appear before longhand rules.\n */\nconst cssPropertyOrderMap: Map<string, number> = (() => {\n const map = new Map<string, number>();\n const props = Object.keys(propertyMap);\n for (let i = 0; i < props.length; i++) {\n // Convert camelCase key to kebab-case CSS property\n const kebab = props[i].replace(/([A-Z])/g, '-$1').toLowerCase();\n map.set(kebab, i);\n }\n return map;\n})();\n\n/**\n * Get the property-order index for a utility class name.\n * Returns the position of the class's CSS property in propertyMap,\n * or Infinity for unknown classes (placed last).\n */\nfunction getClassPropertyOrder(className: string): number {\n // Try dynamic prefix-based lookup\n const extracted = extractPropertyAndValue(className);\n if (extracted) {\n const idx = cssPropertyOrderMap.get(extracted.property);\n if (idx !== undefined) return idx;\n }\n\n // Try predefined rules (e.g. 'f' \u2192 display: flex)\n const rule = utilityClassRules[className];\n if (rule) {\n const propMatch = rule.match(/^([a-z-]+):/);\n if (propMatch) {\n const idx = cssPropertyOrderMap.get(propMatch[1]);\n if (idx !== undefined) return idx;\n }\n }\n\n return Infinity;\n}\n\n/**\n * Sort utility class names by CSS property precedence.\n * Ensures shorthands (border) appear before longhands (border-color) in CSS output.\n */\nexport function sortClassesByPropertyOrder(classes: Iterable<string>): string[] {\n return Array.from(classes).sort((a, b) => getClassPropertyOrder(a) - getClassPropertyOrder(b));\n}\n\n/** CSS property \u2192 responsive scale category mapping (used by generateUtilityCSS and generateSingleClassCSS) */\nconst AUTO_RESPONSIVE_TYPE_MAP: Record<string, string> = {\n 'padding': 'padding',\n 'padding-left': 'padding',\n 'padding-right': 'padding',\n 'padding-top': 'padding',\n 'padding-bottom': 'padding',\n 'margin': 'margin',\n 'margin-left': 'margin',\n 'margin-right': 'margin',\n 'margin-top': 'margin',\n 'margin-bottom': 'margin',\n 'font-size': 'fontSize',\n 'gap': 'gap',\n 'row-gap': 'gap',\n 'column-gap': 'gap',\n 'border-radius': 'borderRadius',\n 'border-top-left-radius': 'borderRadius',\n 'border-top-right-radius': 'borderRadius',\n 'border-bottom-left-radius': 'borderRadius',\n 'border-bottom-right-radius': 'borderRadius',\n 'width': 'size',\n 'height': 'size',\n 'max-width': 'size',\n 'max-height': 'size',\n 'min-width': 'size',\n 'min-height': 'size',\n};\n\n/**\n * Escape special characters in CSS class names using backslash notation\n * Characters that have special meaning in CSS selectors need to be escaped\n */\nfunction escapeCSSClassName(className: string): string {\n // Escape special characters with backslash\n // This includes: . # [ ] ( ) { } ; : , > + ~ % etc.\n return className.replace(/[.#[\\](){};<>+~:,%\\/\\s]/g, '\\\\$&');\n}\n\n// Define all possible utility class rules\nconst utilityClassRules: Record<string, string> = {\n // Display utilities (short forms from specialValueMappings)\n f: 'display: flex;',\n 'fd-col': 'flex-direction: column;',\n 'fd-row': 'flex-direction: row;',\n g: 'display: grid;',\n b: 'display: block;',\n i: 'display: inline;',\n ib: 'display: inline-block;',\n h: 'display: none;',\n 'if': 'display: inline-flex;',\n ig: 'display: inline-grid;',\n\n // Justify Content (short forms)\n 'jc-c': 'justify-content: center;',\n 'jc-s': 'justify-content: flex-start;',\n 'jc-e': 'justify-content: flex-end;',\n 'jc-b': 'justify-content: space-between;',\n 'jc-a': 'justify-content: space-around;',\n\n // Align Items (short forms)\n 'ai-c': 'align-items: center;',\n 'ai-s': 'align-items: flex-start;',\n 'ai-e': 'align-items: flex-end;',\n 'ai-b': 'align-items: baseline;',\n\n // Overflow (short forms)\n 'o-h': 'overflow: hidden;',\n 'o-a': 'overflow: auto;',\n 'o-s': 'overflow: scroll;',\n 'o-v': 'overflow: visible;',\n\n // Cursor (full forms)\n 'cursor-pointer': 'cursor: pointer;',\n 'cursor-default': 'cursor: default;',\n\n // Pointer events\n 'pe-none': 'pointer-events: none;',\n 'pe-auto': 'pointer-events: auto;',\n\n // User select\n 'us-none': 'user-select: none;',\n 'us-auto': 'user-select: auto;',\n 'us-text': 'user-select: text;',\n 'us-all': 'user-select: all;',\n\n // White space\n 'whs-normal': 'white-space: normal;',\n 'whs-nowrap': 'white-space: nowrap;',\n 'whs-pre': 'white-space: pre;',\n 'whs-pre-wrap': 'white-space: pre-wrap;',\n 'whs-pre-line': 'white-space: pre-line;',\n\n // Shadow presets\n 'sh-0': 'box-shadow: none;',\n 'sh-1': 'box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);',\n 'sh-2': 'box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);',\n 'sh-3': 'box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);',\n 'sh-4': 'box-shadow: 0 12px 32px rgba(0, 0, 0, 0.2);',\n\n // Gradient presets\n 'gr-1': 'background: linear-gradient(90deg, rgba(10,22,40,0.85) 0%, rgba(10,22,40,0.2) 100%);',\n 'gr-2': 'background: linear-gradient(0deg, #a9e8fd, #00aee8 25%, #0f1335 72%);',\n\n // Border presets\n 'bd-0': 'border: 1px solid var(--border);',\n 'bd-1': 'border: 1px solid var(--border-light);',\n\n // Note: CSS functions (blur, translateY, scale, rotate, repeat) are now handled\n // dynamically via the styleValueRegistry - no need to hardcode specific values here\n};\n\n/**\n * Extract CSS property and value from a utility class\n * Returns { property: CSS property name, value: CSS value } or null if not a dynamic class\n */\nfunction extractPropertyAndValue(className: string): { property: string; value: string } | null {\n // Parse prefix-value pattern (e.g., \"p-10px\", \"fs-48px\")\n for (const knownPrefix of SORTED_PREFIXES) {\n if (className.startsWith(knownPrefix + '-')) {\n const classValue = className.substring(knownPrefix.length + 1);\n const cssProp = prefixToCSSProperty[knownPrefix];\n if (cssProp) {\n return { property: cssProp, value: classValue };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Generate CSS rule for a utility class\n * Handles dynamic classes like p-10px, m-20px, fs-48px, etc.\n */\nexport function generateRuleForClass(className: string): string | null {\n // Check if it's a predefined rule\n if (utilityClassRules[className]) {\n return utilityClassRules[className];\n }\n\n // Parse prefix-value pattern (e.g., \"p-10px\", \"fs-48px\", \"p-92px-0\", \"bgc-background-light\")\n // Try to match known prefixes first by checking longest prefixes first\n let prefix = '';\n let classValue = '';\n\n for (const knownPrefix of SORTED_PREFIXES) {\n if (className.startsWith(knownPrefix + '-')) {\n prefix = knownPrefix;\n classValue = className.substring(knownPrefix.length + 1); // +1 for the hyphen\n break;\n }\n }\n\n if (!prefix || !classValue) {\n // Check dynamic registry for classes with unknown prefixes\n const dynamicStyle = getDynamicStyle(className);\n if (dynamicStyle) {\n return `${dynamicStyle.property}: ${dynamicStyle.value};`;\n }\n return null;\n }\n\n // Look up the CSS property from prefix\n const cssProp = prefixToCSSProperty[prefix];\n if (!cssProp) {\n // Check dynamic registry for classes with unknown prefixes\n const dynamicStyle = getDynamicStyle(className);\n if (dynamicStyle) {\n return `${dynamicStyle.property}: ${dynamicStyle.value};`;\n }\n return null;\n }\n\n // Handle border-side classes (bt-, bb-, bl-, border-r-) with special syntax FIRST\n // Generate ONLY width and style, NOT color - allows bc- to control color independently\n // e.g., bt-1px-solid \u2192 \"border-top-width: 1px; border-top-style: solid;\"\n // This must come BEFORE registry check to ensure consistent output\n const borderSideMap: Record<string, string> = {\n 'bt': 'border-top',\n 'bb': 'border-bottom',\n 'bl': 'border-left',\n 'border-r': 'border-right',\n };\n if (borderSideMap[prefix] && classValue.includes('-')) {\n const parts = classValue.split('-');\n const width = parts[0];\n const borderStyle = parts[1] || 'solid';\n const side = borderSideMap[prefix];\n return `${side}-width: ${width}; ${side}-style: ${borderStyle};`;\n }\n\n // Check registry for original value first (avoids lossy reverse-engineering)\n const originalValue = getStyleValue(className);\n if (originalValue !== undefined) {\n return `${cssProp}: ${originalValue};`;\n }\n\n // FALLBACK: Reverse-engineer value from class name for backward compatibility\n // (for classes extracted from HTML that weren't registered)\n\n // Handle border with special syntax BEFORE hyphen conversion (e.g., b-1px-solid-text)\n // This needs the original hyphenated format to parse correctly\n if (prefix === 'b' && classValue.includes('-')) {\n const parts = classValue.split('-');\n const width = parts[0];\n const borderStyle = parts[1] || 'solid';\n const borderColor = parts[2] ? `var(--${parts[2]})` : 'currentColor';\n return `border: ${width} ${borderStyle} ${borderColor};`;\n }\n\n // Handle border-radius with CSS variables (e.g., br-background)\n if (prefix === 'br' && classValue.includes('-') && !classValue.match(/^\\d+px$/)) {\n return `border-radius: var(--${classValue});`;\n }\n\n // Convert hyphenated values back to spaces, but preserve negative numbers\n // Handle cases like:\n // - \"92px-0\" \u2192 \"92px 0\" (space between values)\n // - \"-0.015\" \u2192 \"-0.015\" (negative number)\n // - \"0-5px\" \u2192 \"0 5px\" (space between values)\n // - \"1px-solid\" \u2192 \"1px solid\" (border shorthand)\n // - \"translateY(-100vh)\" \u2192 \"translateY(-100vh)\" (preserve negatives in functions)\n let value = classValue;\n\n // Pattern to match CSS values that should be preceded by a space instead of hyphen\n // Includes: digits, auto, inherit, initial, unset, border style keywords, and CSS function names\n const valuePattern = /\\d|auto|inherit|initial|unset|solid|dashed|dotted|double|groove|ridge|inset|outset|none|hidden|minmax|repeat|clamp|calc|min|max|fit-content|var/;\n\n // Only convert hyphens that are NOT inside parentheses (function arguments)\n // This preserves negative values like translateY(-100vh) while still handling\n // multi-value shorthand like \"10px-20px\" \u2192 \"10px 20px\"\n const hasParentheses = value.includes('(');\n\n if (hasParentheses) {\n // Convert hyphens to spaces, handling both inside and outside parentheses\n // Inside parentheses: convert hyphens after commas (they were space separators)\n // - \"repeat(3,-1fr)\" \u2192 \"repeat(3, 1fr)\" (single hyphen = space)\n // - \"clamp(-10px,--5px,-10px)\" \u2192 \"clamp(-10px, -5px, 10px)\" (double hyphen = space + negative)\n let result = '';\n let depth = 0;\n let afterComma = false;\n for (let i = 0; i < value.length; i++) {\n const char = value[i];\n if (char === '(') {\n depth++;\n result += char;\n afterComma = false;\n } else if (char === ')') {\n depth--;\n result += char;\n afterComma = false;\n } else if (char === ',') {\n result += char;\n afterComma = true;\n } else if (char === '-' && afterComma && depth > 0) {\n // Hyphen after comma inside parentheses - convert to space\n // Check if next char is also hyphen (indicating actual negative number)\n if (value[i + 1] === '-') {\n // Double hyphen: \",--\" means \", -\" (space followed by negative)\n result += ' ';\n // Don't skip the next hyphen - let it be added normally\n } else {\n // Single hyphen: \",-\" means \", \" (just a space separator)\n result += ' ';\n }\n afterComma = false;\n } else if (char === '-' && depth > 0 && i > 0) {\n // Hyphens inside parentheses (not after comma) - convert if followed by digit/value\n // This handles cases like \"#0f1442-94%\" \u2192 \"#0f1442 94%\"\n const rest = value.substring(i + 1);\n if (valuePattern.test(rest[0] || '')) {\n result += ' ';\n } else {\n result += char;\n }\n afterComma = false;\n } else if (char === '-' && depth === 0 && i > 0) {\n // Hyphens outside parentheses - convert if followed by value pattern\n const rest = value.substring(i + 1);\n if (valuePattern.test(rest[0] || '')) {\n result += ' ';\n } else {\n result += char;\n }\n afterComma = false;\n } else {\n result += char;\n afterComma = false;\n }\n }\n value = result;\n } else if (value.startsWith('-')) {\n // For negative values, only replace hyphens that come after the first character\n // This way \"-0.015\" stays as is, but \"-10px-5px\" becomes \"-10px 5px\"\n value = value[0] + value.substring(1).replace(new RegExp(`-(?=${valuePattern.source})`, 'g'), ' ');\n } else {\n // For positive values, replace hyphens normally\n value = value.replace(new RegExp(`-(?=${valuePattern.source})`, 'g'), ' ');\n }\n\n // Convert 'p' suffix to '%' for percentage values (e.g., \"50p\" \u2192 \"50%\")\n value = value.replace(/(\\d+)p(?!\\w)/g, '$1%');\n\n // Handle special multi-property prefixes\n if (prefix === 'px') {\n // padding-left and padding-right\n return `padding-left: ${value}; padding-right: ${value};`;\n }\n if (prefix === 'py') {\n // padding-top and padding-bottom\n return `padding-top: ${value}; padding-bottom: ${value};`;\n }\n if (prefix === 'mx') {\n // margin-left and margin-right\n return `margin-left: ${value}; margin-right: ${value};`;\n }\n if (prefix === 'my') {\n // margin-top and margin-bottom\n return `margin-top: ${value}; margin-bottom: ${value};`;\n }\n\n // Handle CSS variables for color properties\n // For color (c), background-color (bgc), and border-color (bc), treat as CSS variables\n // unless it's a hex color (#...) or RGB value\n if ((prefix === 'bgc' || prefix === 'bg' || prefix === 'c' || prefix === 'bc')) {\n // If it's not a hex color, RGB value, or pixel value, treat it as a CSS variable name\n // Unless it's a CSS named color (red, blue, transparent, etc.) \u2014 use directly\n if (!value.startsWith('#') && !value.includes('rgb') && !value.includes('px')) {\n if (isCssNamedColor(value)) {\n return `${cssProp}: ${value};`;\n }\n return `${cssProp}: var(--${value});`;\n }\n }\n\n // Standard case: prefix-value (e.g., p-10px, fs-48px, ta-center)\n return `${cssProp}: ${value};`;\n}\n\n/**\n * Generate CSS for all utility classes used in the application\n * Scans through all classes and generates the necessary CSS rules\n * Optionally applies responsive scaling based on configuration\n */\nexport function generateUtilityCSS(\n usedClasses: Set<string>,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n responsiveScales?: ResponsiveScales,\n remConfig?: RemConversionConfig\n): string {\n const css: string[] = [];\n const baseClasses = new Set<string>();\n const autoResponsiveClasses = new Set<string>(); // Classes that should get auto-scaling\n\n // Extract breakpoint values for CSS media queries\n const breakpointValues = getBreakpointValues(breakpoints);\n\n // Create a map for responsive breakpoint classes\n // Map from prefix (e.g., 't', 'm') to the class name and breakpoint info\n type BreakpointClassMap = Record<string, { classes: Set<string>; breakpointName: string; value: number }>;\n const responsiveClasses: BreakpointClassMap = {};\n\n // Initialize responsive class sets for each breakpoint\n for (const [breakpointName, breakpointValue] of Object.entries(breakpointValues)) {\n // Generate prefix from breakpoint name, avoiding conflicts with property prefixes\n // For 'mobile', use 'mob' to avoid conflict with 'margin' (m-), etc.\n let prefix = breakpointName.charAt(0).toLowerCase();\n if (breakpointName.toLowerCase() === 'mobile') {\n prefix = 'mob'; // Use 'mob' instead of 'm' to avoid margin conflict\n }\n\n responsiveClasses[prefix] = {\n classes: new Set<string>(),\n breakpointName,\n value: breakpointValue\n };\n }\n\n // Separate classes by breakpoint\n for (const className of usedClasses) {\n let matched = false;\n\n // Try to match against any responsive breakpoint prefix\n for (const prefix of Object.keys(responsiveClasses)) {\n if (className.startsWith(`${prefix}-`) && className.length > prefix.length + 1) {\n const potentialClass = className.substring(prefix.length + 1);\n const rule = generateRuleForClass(potentialClass);\n\n // If it generates a valid rule and doesn't look like a margin value, treat as breakpoint class\n // Margin values are typically: auto, 0, or pixel/percentage values (like 10px, 92px, 50p)\n if (rule && !potentialClass.match(/^(auto|0|[\\d.]+px|[\\d.]+p)$/)) {\n responsiveClasses[prefix].classes.add(potentialClass);\n matched = true;\n break;\n }\n }\n }\n\n if (!matched) {\n baseClasses.add(className);\n\n // Check if this class should get auto-responsive scaling\n if (responsiveScales?.enabled) {\n const propValue = extractPropertyAndValue(className);\n if (propValue) {\n const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];\n if (category && responsiveScales[category as keyof ResponsiveScales]) {\n autoResponsiveClasses.add(className);\n }\n }\n }\n }\n }\n\n // Generate base rules \u2014 sorted so shorthands (border) appear before longhands (border-color)\n for (const className of sortClassesByPropertyOrder(baseClasses)) {\n const rule = generateRuleForClass(className);\n if (rule) {\n // Escape special characters in class name for CSS selector\n const escapedClassName = escapeCSSClassName(className);\n const finalRule = applyRemConversion(rule, remConfig);\n css.push(`.${escapedClassName} { ${finalRule} }`);\n }\n }\n\n // Map to collect auto-responsive media queries by breakpoint\n type MediaQueryMap = Record<string, { classes: Array<{ className: string; rule: string }>; value: number }>;\n const autoResponsiveMediaQueries: MediaQueryMap = {};\n\n // Generate auto-responsive rules for classes with enabled scaling\n if (responsiveScales?.enabled) {\n for (const className of autoResponsiveClasses) {\n const propValue = extractPropertyAndValue(className);\n if (!propValue) continue;\n\n const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];\n if (!category) continue;\n\n const scaleConfig = responsiveScales[category as keyof ResponsiveScales] as any;\n if (!scaleConfig) continue;\n\n const baseRef = responsiveScales.baseReference || 16;\n const escapedClassName = escapeCSSClassName(className);\n\n // Generate scaled rules for each breakpoint\n for (const [breakpointName, breakpointValue] of Object.entries(breakpointValues)) {\n // Use the actual breakpoint name to look up the scale\n // This allows custom breakpoints like 'small', 'large', etc. to have their own scales\n const scale = scaleConfig[breakpointName];\n if (!scale) continue;\n\n const scaledValue = scalePropertyValue(propValue.value, baseRef, scale);\n if (!scaledValue) continue;\n\n // Initialize media query entry if not exists\n if (!autoResponsiveMediaQueries[breakpointName]) {\n autoResponsiveMediaQueries[breakpointName] = {\n classes: [],\n value: breakpointValue\n };\n }\n\n const finalScaledValue = (remConfig?.enabled && shouldConvertProperty(propValue.property))\n ? convertPxToRem(scaledValue, remConfig.baseFontSize)\n : scaledValue;\n autoResponsiveMediaQueries[breakpointName].classes.push({\n className: escapedClassName,\n rule: `${propValue.property}: ${finalScaledValue};`\n });\n }\n }\n }\n\n // Generate media queries in two separate sections:\n // 1. Auto-responsive classes FIRST (baseline responsive behavior)\n // 2. Manual breakpoint classes AFTER (explicit overrides)\n // This ensures manual t-, mob- classes always override auto-responsive rules\n\n // Sort auto-responsive media queries by breakpoint value (descending)\n const sortedAutoResponsive = Object.entries(autoResponsiveMediaQueries)\n .sort(([, a], [, b]) => b.value - a.value);\n\n // Generate auto-responsive media queries first\n for (const [breakpointName, mq] of sortedAutoResponsive) {\n if (mq.classes.length === 0) continue;\n\n css.push(`@media (max-width: ${mq.value}px) {`);\n for (const { className, rule } of mq.classes) {\n css.push(` .${className} { ${rule} }`);\n }\n css.push('}');\n }\n\n // Sort manual responsive classes by breakpoint value (descending)\n const sortedManualResponsive = Object.entries(responsiveClasses)\n .filter(([, info]) => info.classes.size > 0)\n .sort(([, a], [, b]) => b.value - a.value);\n\n // Generate manual breakpoint media queries after\n for (const [prefix, breakpointInfo] of sortedManualResponsive) {\n const rules: string[] = [];\n\n for (const className of breakpointInfo.classes) {\n const rule = generateRuleForClass(className);\n if (rule) {\n const escapedClassName = escapeCSSClassName(className);\n const finalRule = applyRemConversion(rule, remConfig);\n rules.push(` .${prefix}-${escapedClassName} { ${finalRule} }`);\n }\n }\n\n if (rules.length > 0) {\n css.push(`@media (max-width: ${breakpointInfo.value}px) {`);\n css.push(...rules);\n css.push('}');\n }\n }\n\n return css.join('\\n');\n}\n\n/**\n * Generate complete CSS for a single utility class.\n * Returns the base rule (optionally wrapped in @media for responsive-prefixed classes)\n * plus auto-responsive scaling rules if enabled.\n *\n * Used by the client-side StyleInjector for per-class incremental injection,\n * avoiding the batch overhead of generateUtilityCSS.\n */\nexport function generateSingleClassCSS(\n className: string,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n responsiveScales?: ResponsiveScales,\n remConfig?: RemConversionConfig\n): string {\n const breakpointValues = getBreakpointValues(breakpoints);\n const css: string[] = [];\n\n // Build responsive prefix map: prefix \u2192 { breakpointName, value }\n const responsivePrefixes: Record<string, { breakpointName: string; value: number }> = {};\n for (const [breakpointName, breakpointValue] of Object.entries(breakpointValues)) {\n let prefix = breakpointName.charAt(0).toLowerCase();\n if (breakpointName.toLowerCase() === 'mobile') {\n prefix = 'mob';\n }\n responsivePrefixes[prefix] = { breakpointName, value: breakpointValue };\n }\n\n // Check if class has a responsive prefix (e.g. \"t-fs-16px\", \"mob-p-10px\")\n let matched = false;\n for (const prefix of Object.keys(responsivePrefixes)) {\n if (className.startsWith(`${prefix}-`) && className.length > prefix.length + 1) {\n const potentialClass = className.substring(prefix.length + 1);\n const rule = generateRuleForClass(potentialClass);\n\n // Only treat as responsive if it generates a valid rule and isn't a margin value\n if (rule && !potentialClass.match(/^(auto|0|[\\d.]+px|[\\d.]+p)$/)) {\n const escapedClassName = escapeCSSClassName(className);\n const escapedInnerClass = escapeCSSClassName(potentialClass);\n const bpValue = responsivePrefixes[prefix].value;\n const finalRule = applyRemConversion(rule, remConfig);\n css.push(`@media (max-width: ${bpValue}px) {\\n .${prefix}-${escapedInnerClass} { ${finalRule} }\\n}`);\n matched = true;\n break;\n }\n }\n }\n\n if (!matched) {\n // Base (non-responsive) class\n const rule = generateRuleForClass(className);\n if (!rule) return '';\n\n const escapedClassName = escapeCSSClassName(className);\n const finalRule = applyRemConversion(rule, remConfig);\n css.push(`.${escapedClassName} { ${finalRule} }`);\n\n // Auto-responsive scaling\n if (responsiveScales?.enabled) {\n const propValue = extractPropertyAndValue(className);\n if (propValue) {\n const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];\n if (category) {\n const scaleConfig = responsiveScales[category as keyof ResponsiveScales] as Record<string, number> | undefined;\n if (scaleConfig) {\n const baseRef = responsiveScales.baseReference || 16;\n\n // Sort breakpoints descending (largest first) for proper cascade\n const sortedBps = Object.entries(breakpointValues)\n .sort(([, a], [, b]) => b - a);\n\n for (const [breakpointName, breakpointValue] of sortedBps) {\n const scale = scaleConfig[breakpointName];\n if (!scale) continue;\n\n const scaledValue = scalePropertyValue(propValue.value, baseRef, scale);\n if (!scaledValue) continue;\n\n const finalScaledValue = (remConfig?.enabled && shouldConvertProperty(propValue.property))\n ? convertPxToRem(scaledValue, remConfig.baseFontSize)\n : scaledValue;\n css.push(`@media (max-width: ${breakpointValue}px) {\\n .${escapedClassName} { ${propValue.property}: ${finalScaledValue}; }\\n}`);\n }\n }\n }\n }\n }\n }\n\n return css.join('\\n');\n}\n\n/**\n * Extract all utility classes from a rendered HTML string\n * Identifies utility classes by checking against known prefixes from propertyMap\n */\nexport function extractUtilityClassesFromHTML(html: string): Set<string> {\n const classes = new Set<string>();\n const classRegex = /class=\"([^\"]*)\"/g;\n let match;\n\n // Get all known utility prefixes from propertyMap\n const knownPrefixes = new Set(Object.values(propertyMap));\n // Also include special/short form prefixes from utilityClassRules\n const specialPrefixes = new Set([\n // Display short forms\n 'f', 'fd-col', 'fd-row', 'g', 'b', 'i', 'ib', 'h', 'if', 'ig',\n // Justify content\n 'jc-c', 'jc-s', 'jc-e', 'jc-b', 'jc-a',\n // Align items\n 'ai-c', 'ai-s', 'ai-e', 'ai-b',\n // Overflow\n 'o-h', 'o-a', 'o-s', 'o-v',\n // Cursor\n 'cursor-pointer', 'cursor-default',\n // White space\n 'whs-normal', 'whs-nowrap', 'whs-pre', 'whs-pre-wrap', 'whs-pre-line',\n ]);\n\n while ((match = classRegex.exec(html)) !== null) {\n const classString = match[1];\n const classList = classString.split(/\\s+/);\n\n for (const className of classList) {\n // Skip empty class names\n if (!className || className.length === 0) continue;\n\n // Check if it's a special/short form class\n if (specialPrefixes.has(className)) {\n classes.add(className);\n continue;\n }\n\n // Check for responsive prefix (like 't-', 'mob-', 's-', etc.) and process accordingly\n let classToCheck = className;\n let hasResponsivePrefix = false;\n\n // Extract responsive prefix if present\n // Check for multi-letter prefix first (e.g., 'mob-' for mobile)\n if (className.startsWith('mob-') && className.length > 4) {\n classToCheck = className.substring(4); // Remove 'mob-' prefix\n hasResponsivePrefix = true;\n }\n // Then check for single-letter prefixes (t-, s-, l-, x-, u-)\n else if (className.length > 2 && className.charAt(1) === '-' && className.match(/^[a-z]-/)) {\n const firstChar = className.charAt(0);\n // Only treat as responsive prefix if it looks like a breakpoint indicator\n // Common breakpoint prefixes: t (tablet), s (small), x (extra), u (ultra)\n // NOTE: We exclude 'm' because it conflicts with margin prefix - use 'mob' instead\n // NOTE: We exclude 'l' because it conflicts with left property prefix - use 'lg' instead\n if (['t', 's', 'x', 'u'].includes(firstChar)) {\n classToCheck = className.substring(2); // Remove responsive prefix\n hasResponsivePrefix = true;\n }\n }\n\n // Check if it starts with a known prefix\n // Handle both single-letter (like 'p-', 'w-') and multi-letter (like 'jc-', 'ai-')\n for (const prefix of knownPrefixes) {\n if (classToCheck === prefix) {\n // Exact match (like 'f' for flex, 'g' for grid)\n classes.add(className);\n break;\n } else if (classToCheck.startsWith(prefix + '-')) {\n // Prefix with hyphen separator (like 'p-10px', 'fs-16px', or 't-p-10px')\n classes.add(className);\n break;\n }\n }\n\n // Also check special prefixes for responsive classes\n if (hasResponsivePrefix && !classes.has(className)) {\n for (const specialPrefix of specialPrefixes) {\n if (classToCheck === specialPrefix) {\n classes.add(className);\n break;\n } else if (classToCheck.startsWith(specialPrefix + '-')) {\n classes.add(className);\n break;\n }\n }\n }\n\n // Check if it's a dynamic class (registered in the dynamic registry)\n // This handles classes for properties not in propertyMap\n if (!classes.has(className) && isDynamicClass(className)) {\n classes.add(className);\n }\n }\n }\n\n return classes;\n}\n\n// ============================================================================\n// Interactive Styles CSS Generation\n// ============================================================================\n\n/**\n * Check if a style object is responsive (has base/breakpoint structure)\n */\nfunction isResponsiveStyle(style: StyleValue): style is ResponsiveStyleObject {\n return (\n typeof style === 'object' &&\n style !== null &&\n ('base' in style || 'tablet' in style || 'mobile' in style)\n );\n}\n\n/**\n * Convert a flat style object to CSS property declarations\n * Returns string like \"padding: 10px; background-color: var(--primary);\"\n */\nfunction styleObjectToCSS(style: StyleObject): string {\n const declarations: string[] = [];\n\n for (const [prop, value] of Object.entries(style)) {\n // Skip mapping objects\n if (typeof value === 'object' && value !== null && '_mapping' in value) {\n continue;\n }\n\n // Convert camelCase to kebab-case\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n\n // Handle CSS variable references for color properties\n let cssValue = String(value);\n if (\n (prop === 'backgroundColor' || prop === 'color' || prop === 'borderColor') &&\n !cssValue.startsWith('#') &&\n !cssValue.startsWith('rgb') &&\n !cssValue.startsWith('var(') &&\n !cssValue.includes('(')\n ) {\n cssValue = `var(--${cssValue})`;\n }\n\n declarations.push(`${cssProperty}: ${cssValue}`);\n }\n\n return declarations.join('; ');\n}\n\n/**\n * Generate CSS rules for interactive styles\n *\n * @param elementClass - The element's unique class (e.g., 'c_navigation_hamburger')\n * @param interactiveStyles - Array of selector-style rules\n * @param breakpoints - Breakpoint config for responsive styles\n * @returns CSS string with all interactive rules\n *\n * Example output:\n * ```css\n * #menu-toggle:checked ~ .c_navigation_hamburger { transform: rotate(45deg); }\n * .c_navigation_hamburger:hover { background-color: var(--primary); }\n * @media (max-width: 1024px) {\n * .c_navigation_hamburger:hover { padding: 24px; }\n * }\n * ```\n */\nexport function generateInteractiveCSS(\n elementClass: string,\n interactiveStyles: InteractiveStyles,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n remConfig?: RemConversionConfig,\n responsiveScales?: ResponsiveScales\n): string {\n const css: string[] = [];\n\n // Extract breakpoint values for CSS media queries\n const breakpointValues = getBreakpointValues(breakpoints);\n const scalingEnabled = responsiveScales?.enabled === true;\n\n for (const rule of interactiveStyles) {\n const { prefix, postfix, style } = rule;\n\n // Build full selector: {prefix}.element{postfix}\n const fullSelector = `${prefix || ''}.${elementClass}${postfix || ''}`;\n\n // Breakpoint styles (sorted by value descending)\n const sortedBreakpoints = Object.entries(breakpointValues).sort(\n ([, a], [, b]) => b - a\n );\n\n if (isResponsiveStyle(style)) {\n // Generate responsive rules\n const responsive = style as ResponsiveStyleObject;\n\n // Base styles\n if (responsive.base && Object.keys(responsive.base).length > 0) {\n const properties = applyRemConversion(styleObjectToCSS(responsive.base), remConfig);\n if (properties) {\n css.push(`${fullSelector} { ${properties}; }`);\n }\n }\n\n for (const [breakpointName, breakpointValue] of sortedBreakpoints) {\n const explicit = responsive[breakpointName];\n\n // Merge explicit breakpoint styles with auto-scaled values derived\n // from the base, skipping any property the author explicitly set.\n let merged: StyleObject | null = null;\n if (explicit && Object.keys(explicit).length > 0) {\n merged = { ...explicit };\n }\n\n if (scalingEnabled && responsive.base) {\n const scaled = scaleStyleForBreakpoint(\n responsive.base,\n responsiveScales!,\n breakpointName,\n new Set(Object.keys(explicit ?? {}))\n );\n if (Object.keys(scaled).length > 0) {\n merged = { ...(merged ?? {}), ...scaled };\n }\n }\n\n if (merged && Object.keys(merged).length > 0) {\n const properties = applyRemConversion(styleObjectToCSS(merged), remConfig);\n if (properties) {\n css.push(\n `@media (max-width: ${breakpointValue}px) { ${fullSelector} { ${properties}; } }`\n );\n }\n }\n }\n } else {\n // Flat style object\n const flatStyle = style as StyleObject;\n if (Object.keys(flatStyle).length > 0) {\n const properties = applyRemConversion(styleObjectToCSS(flatStyle), remConfig);\n if (properties) {\n css.push(`${fullSelector} { ${properties}; }`);\n }\n\n // Auto-scale the flat style into each enabled breakpoint.\n if (scalingEnabled) {\n for (const [breakpointName, breakpointValue] of sortedBreakpoints) {\n const scaled = scaleStyleForBreakpoint(\n flatStyle,\n responsiveScales!,\n breakpointName,\n new Set()\n );\n if (Object.keys(scaled).length === 0) continue;\n const scaledProps = applyRemConversion(styleObjectToCSS(scaled), remConfig);\n if (!scaledProps) continue;\n css.push(\n `@media (max-width: ${breakpointValue}px) { ${fullSelector} { ${scaledProps}; } }`\n );\n }\n }\n }\n }\n }\n\n return css.join('\\n');\n}\n\n/**\n * Build a new style object containing auto-scaled values for every property\n * in a given base style that falls into a scale category at `breakpointName`.\n * Properties listed in `skipProperties` are left out (the author has set an\n * explicit override at that breakpoint).\n */\nfunction scaleStyleForBreakpoint(\n baseStyle: StyleObject,\n responsiveScales: ResponsiveScales,\n breakpointName: string,\n skipProperties: Set<string>\n): StyleObject {\n const result: StyleObject = {};\n const baseRef = responsiveScales.baseReference ?? 16;\n\n for (const [property, value] of Object.entries(baseStyle)) {\n if (skipProperties.has(property)) continue;\n if (typeof value === 'object' && value !== null && '_mapping' in value) continue;\n if (value == null) continue;\n\n const strValue = String(value);\n if (strValue === '') continue;\n\n const scale = getScaleMultiplier(\n responsiveScales,\n property as CSSPropertyType,\n breakpointName\n );\n if (scale == null) continue;\n\n const scaledValue = scalePropertyValue(strValue, baseRef, scale);\n if (scaledValue == null || scaledValue === strValue) continue;\n\n result[property] = scaledValue;\n }\n\n return result;\n}\n\n/**\n * Collect and generate CSS for all interactive styles in a page/component\n *\n * @param interactiveStylesMap - Map of element class to interactive styles\n * @param breakpoints - Breakpoint config\n * @returns Combined CSS string\n */\nexport function generateAllInteractiveCSS(\n interactiveStylesMap: Map<string, InteractiveStyles>,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n remConfig?: RemConversionConfig,\n responsiveScales?: ResponsiveScales\n): string {\n const cssBlocks: string[] = [];\n\n for (const [elementClass, styles] of interactiveStylesMap) {\n const css = generateInteractiveCSS(elementClass, styles, breakpoints, remConfig, responsiveScales);\n if (css) {\n cssBlocks.push(css);\n }\n }\n\n return cssBlocks.join('\\n\\n');\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DEFAULT_CAPABILITIES", "z", "z", "h", "ComponentNodeSchemaRef", "z", "z", "h", "z", "h", "ComponentNodeSchemaRef", "z", "h", "z", "h", "CMSFilterConditionSchema", "CMSSortConfigSchema", "left", "globalNodeTypeManager", "stringValue", "className", "isStyleMapping", "isResponsiveStyle"]
|
|
7
|
+
}
|