meno-core 1.1.1 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/chunks/{chunk-7ZLF4NE5.js → chunk-3JXK2QFU.js} +2 -2
  2. package/dist/chunks/{chunk-QWTQZHG3.js → chunk-FQBIC2OB.js} +1 -1
  3. package/dist/chunks/chunk-FQBIC2OB.js.map +7 -0
  4. package/dist/chunks/{chunk-J4IPTP5X.js → chunk-LOZL5HOF.js} +29 -3
  5. package/dist/chunks/chunk-LOZL5HOF.js.map +7 -0
  6. package/dist/lib/client/index.js +2 -2
  7. package/dist/lib/server/index.js +812 -218
  8. package/dist/lib/server/index.js.map +4 -4
  9. package/dist/lib/shared/index.js +4 -2
  10. package/dist/lib/shared/index.js.map +1 -1
  11. package/lib/client/scripts/formHandler.ts +17 -0
  12. package/lib/server/index.ts +19 -0
  13. package/lib/server/middleware/cors.test.ts +1 -1
  14. package/lib/server/middleware/cors.ts +1 -1
  15. package/lib/server/routes/api/functions.ts +2 -2
  16. package/lib/server/services/ColorService.ts +38 -7
  17. package/lib/server/services/VariableService.ts +34 -5
  18. package/lib/server/themeCssCodec.test.ts +154 -0
  19. package/lib/server/themeCssCodec.ts +488 -0
  20. package/lib/server/themeCssStore.test.ts +139 -0
  21. package/lib/server/themeCssStore.ts +210 -0
  22. package/lib/shared/nodeUtils.ts +18 -0
  23. package/lib/shared/types/colors.ts +6 -2
  24. package/lib/shared/types/variables.ts +14 -7
  25. package/lib/shared/utilityClassMapper.test.ts +10 -0
  26. package/lib/shared/utilityClassMapper.ts +9 -1
  27. package/lib/shared/validation/schemas.test.ts +78 -0
  28. package/lib/shared/validation/schemas.ts +53 -5
  29. package/package.json +1 -1
  30. package/dist/chunks/chunk-J4IPTP5X.js.map +0 -7
  31. package/dist/chunks/chunk-QWTQZHG3.js.map +0 -7
  32. /package/dist/chunks/{chunk-7ZLF4NE5.js.map → chunk-3JXK2QFU.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../lib/shared/errorLogger.ts", "../../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/IslandNodeType.ts", "../../lib/shared/markdown.ts", "../../lib/shared/registry/nodeTypes/MarkdownNodeType.ts", "../../lib/shared/registry/nodeTypes/CustomNodeType.ts", "../../lib/shared/registry/nodeTypes/index.ts", "../../lib/shared/registry/index.ts", "../../lib/shared/breakpoints.ts", "../../lib/shared/responsiveScaling.ts", "../../lib/shared/types/prefetch.ts", "../../lib/shared/validation/validators.ts", "../../lib/shared/types/cms.ts", "../../lib/shared/expressionEvaluator.ts", "../../lib/shared/globalTemplateContext.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/utilityClassConfig.ts", "../../lib/shared/cssNamedColors.ts", "../../lib/shared/tailwindThemeScale.ts", "../../lib/shared/utilityClassNames.ts", "../../lib/shared/styleValueRegistry.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/viewportUnits.ts", "../../lib/shared/friendlyError.ts", "../../lib/shared/pxToRem.ts", "../../lib/shared/cssGeneration.ts"],
4
+ "sourcesContent": ["/**\n * Error Logger\n * Centralized error logging with optional telemetry integration\n */\n\nimport type { ErrorCategory } from './errors';\n\ninterface ErrorLogEntry {\n location: string;\n category: ErrorCategory;\n error: unknown;\n context?: Record<string, unknown>;\n timestamp: number;\n}\n\ntype ErrorHandler = (entry: ErrorLogEntry) => void;\n\nlet errorHandler: ErrorHandler | null = null;\n\n/**\n * Set custom error handler (for telemetry integration)\n */\nexport function setErrorHandler(handler: ErrorHandler | null): void {\n errorHandler = handler;\n}\n\n/**\n * Check if running in development mode\n */\nfunction isDevelopment(): boolean {\n // Check for Node.js environment\n if (typeof process !== 'undefined' && process.env?.NODE_ENV) {\n return process.env.NODE_ENV === 'development';\n }\n // Browser environment - assume development if no production indicators\n return true;\n}\n\n/**\n * Log runtime error with context\n * Use for graceful degradation scenarios where error is handled but should be visible\n */\nexport function logRuntimeError(location: string, error: unknown, context?: Record<string, unknown>): void {\n const entry: ErrorLogEntry = {\n location,\n category: 'runtime',\n error,\n context,\n timestamp: Date.now(),\n };\n\n // Development: always log to console\n if (isDevelopment()) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[${location}] ${errorMessage}`, context ?? '');\n }\n\n // Custom handler (telemetry, etc.)\n errorHandler?.(entry);\n}\n\n/**\n * Log network/API error\n */\nexport function logNetworkError(location: string, error: unknown, context?: Record<string, unknown>): void {\n const entry: ErrorLogEntry = {\n location,\n category: 'network',\n error,\n context,\n timestamp: Date.now(),\n };\n\n if (isDevelopment()) {\n console.error(`[${location}] Network error:`, error, context ?? '');\n }\n\n errorHandler?.(entry);\n}\n", "/**\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([\n 'string',\n 'select',\n 'boolean',\n 'number',\n 'link',\n 'file',\n 'rich-text',\n 'embed',\n]);\n\n/**\n * Full prop type schema including list\n */\nexport const PropTypeSchema = z.enum([\n 'string',\n 'select',\n 'boolean',\n 'number',\n 'link',\n 'file',\n 'rich-text',\n 'embed',\n 'list',\n]);\n\n/**\n * `_i18n` value object schema. Used wherever a localizable string can appear:\n * - Prop defaults (`BasePropDefinitionSchema.default`)\n * - Node `children` (text content on `type: \"node\"`, `\"link\"`, `\"component\"`,\n * and basic list nodes)\n * - Attribute values (`attributes` records on every node type)\n *\n * The runtime resolves these objects to the active locale's string at the\n * earliest dispatch point in both the SSR renderer (`renderNode`) and the\n * client builder (`ComponentBuilder.buildComponent`). The schema accepts the\n * shape so the editor's load path doesn't reject files that contain it.\n */\nexport const I18nValueObjectSchema = z\n .object({\n _i18n: z.literal(true),\n })\n .passthrough();\n\n/**\n * Base prop definition schema (for non-list props).\n * `default` accepts a literal value (string/number/boolean/link) OR an\n * `_i18n` value object \u2014 the SSR pipeline resolves the latter to the active\n * locale's string via `resolveI18nInProps` at render time, so localized prop\n * defaults are first-class. The `I18nOrStringSchema` proper is defined later\n * in this file; we inline the matching shape here to keep the validator\n * tolerant of localized defaults.\n */\nexport const BasePropDefinitionSchema = z\n .object({\n type: BasePropTypeSchema,\n default: z\n .union([\n z.string(),\n z.number(),\n z.boolean(),\n z.object({ href: z.string(), target: z.string().optional() }),\n I18nValueObjectSchema,\n ])\n .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 })\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\n .object({\n type: z.literal('list'),\n itemSchema: ListItemSchemaSchema,\n // List-item field values can be any primitive, a link object, an `_i18n`\n // object (resolved by the SSR pipeline), or null.\n default: z\n .array(\n z.record(\n z.string(),\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.object({ href: z.string(), target: z.string().optional() }),\n I18nValueObjectSchema,\n z.null(),\n ]),\n ),\n )\n .optional(),\n })\n .passthrough();\n\n/**\n * Prop definition schema \u2014 discriminates on `type` instead of a plain\n * `z.union([List, Base])`.\n *\n * Why not a bare union: a `type: \"list\"` prop with a bad shape (the single most\n * common authoring mistake \u2014 a bare-string `default` and/or a missing\n * `itemSchema`, e.g. `{ type: \"list\", default: [\"a\", \"b\"] }`) matches NEITHER\n * union branch (List wants `itemSchema` + an object-array `default`; Base's\n * `type` enum has no `\"list\"`). The union then reports a noisy pile of\n * cross-branch issues (`type` not in the base enum, `default[0]` expected object,\n * \u2026) \u2014 and, worse, when this prop sits inside a component file the outer\n * `PageDataSchema` union surfaces the *page* branch's refine instead (see\n * `JSONPageSchema` / `PageDataSchema` below), so the real error reads\n * \"JSONPage must have \u2026root\". The codec round-trips it and `astro build`\n * renders it, so the only place it ever surfaces is here.\n *\n * Discriminating on `type` lets a list prop be validated by ONLY\n * `ListPropDefinitionSchema` and collapses its failure into one actionable\n * message that names the requirement, at the prop's own path.\n */\nexport const PropDefinitionSchema = z\n .object({ type: z.string() })\n .passthrough()\n .superRefine((val, ctx) => {\n const branch = val.type === 'list' ? ListPropDefinitionSchema : BasePropDefinitionSchema;\n const result = branch.safeParse(val);\n if (result.success) return;\n if (val.type === 'list') {\n // Collapse the list-prop failure into one actionable message rather than\n // replaying zod's per-field noise. `itemSchema` is required and `default`\n // must be an array of OBJECTS (one `{ field: value }` record per item).\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n 'list prop requires `itemSchema` and an object-array `default` ' +\n '(each item is a `{ field: value }` object, not a bare string)',\n });\n return;\n }\n // Non-list props keep their precise per-field errors.\n for (const issue of result.error.issues) ctx.addIssue(issue);\n });\n\n/**\n * Style mapping schema\n */\nexport const StyleMappingSchema: z.ZodType<StyleMapping> = z\n .object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z.record(z.string(), z.union([z.string(), z.number()])),\n })\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\n .object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z.record(z.string(), z.boolean()),\n })\n .passthrough();\n\n/**\n * Verbatim-code marker (`{ _code: true, expr }`) \u2014 arbitrary JS the meno-astro dialect can't\n * model as a binding (a function/method call, optional chaining, `??`, \u2026). It is a legitimate\n * value anywhere a child node, an `if` condition, or an attribute value can appear: it renders\n * natively in the Astro build, and the editor preview renders nothing for it (see\n * ComponentBuilder's `_code` guard). The editor is meno-astro-only, so its model routinely\n * carries these \u2014 they must validate or a component with any verbatim expression won't open.\n */\nexport const VerbatimCodeSchema = z.object({ _code: z.literal(true), expr: z.string() }).passthrough();\n\n/**\n * If condition schema - can be boolean, string template, mapping, or a verbatim-code marker\n */\nexport const IfConditionSchema = z.union([z.boolean(), z.string(), BooleanMappingSchema, VerbatimCodeSchema]);\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\n .object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z\n .record(\n z.string(),\n z.object({\n href: z.string(),\n target: z.string().optional(),\n }),\n )\n .optional(),\n })\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\n .object({\n _mapping: z.literal(true),\n prop: z.string(),\n values: z.record(z.string(), z.string()).optional(),\n })\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([z.string(), z.number(), StyleMappingSchema]),\n);\n\n/**\n * Responsive style object schema\n */\nexport const ResponsiveStyleObjectSchema = z\n .object({\n base: StyleObjectSchema.optional(),\n tablet: StyleObjectSchema.optional(),\n mobile: StyleObjectSchema.optional(),\n })\n .passthrough();\n\n/**\n * Style value schema - can be either flat or responsive\n */\nexport const StyleValueSchema = z.union([StyleObjectSchema, ResponsiveStyleObjectSchema]);\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(() =>\n z\n .object({\n type: z.literal(NODE_TYPE.SLOT),\n default: z\n .union([\n z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),\n z.string(),\n I18nValueObjectSchema,\n ])\n .optional(),\n })\n .passthrough(),\n);\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(() =>\n z\n .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\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema, VerbatimCodeSchema]))\n .optional(),\n props: z.record(z.string(), z.any()).optional(), // Allow props for backward compatibility\n children: z\n .union([\n z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),\n z.string(),\n I18nValueObjectSchema,\n ])\n .optional(),\n })\n .passthrough(),\n);\n\n/**\n * Component instance node schema - recursive definition\n */\nexport const ComponentInstanceNodeSchema: z.ZodType<any> = z.lazy(() =>\n z\n .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\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema, VerbatimCodeSchema]))\n .optional(),\n children: z\n .union([\n z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),\n z.string(),\n I18nValueObjectSchema,\n ])\n .optional(),\n })\n .passthrough(),\n);\n\n/**\n * Embed node schema - for rendering custom HTML/SVG content\n */\nexport const EmbedNodeSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n type: z.literal(NODE_TYPE.EMBED),\n html: z.union([z.string(), HtmlMappingSchema, I18nValueObjectSchema]),\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\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema, VerbatimCodeSchema]))\n .optional(),\n })\n .passthrough(),\n);\n\n/**\n * Link node schema - renders as div in editor, <a> in SSR\n */\nexport const LinkNodeSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n type: z.literal(NODE_TYPE.LINK),\n href: z.union([z.string(), LinkMappingSchema, I18nValueObjectSchema]),\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\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema, VerbatimCodeSchema]))\n .optional(),\n children: z\n .union([\n z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),\n z.string(),\n I18nValueObjectSchema,\n ])\n .optional(),\n })\n .passthrough(),\n);\n\n/**\n * Locale list node schema - renders locale switcher links\n */\nexport const LocaleListNodeSchema: z.ZodType<any> = z.lazy(() =>\n z\n .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\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema, VerbatimCodeSchema]))\n .optional(),\n })\n .passthrough(),\n);\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(() =>\n z\n .object({\n type: z.union([z.literal(NODE_TYPE.LIST), z.literal('cms-list')]), // Support both for migration\n sourceType: z.enum(['prop', 'collection', 'remote', 'sanity', 'expression']).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 // Remote-source options (sourceType: 'remote')\n url: z.string().optional(), // HTTP/JSON endpoint\n path: z.string().optional(), // dot-path into the response to the items array\n // Sanity-source options (sourceType: 'sanity')\n documentType: z.string().optional(), // Sanity document `_type`\n slugField: z.string().optional(), // field used as the URL slug\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(), I18nValueObjectSchema])).optional(),\n })\n .passthrough(),\n);\n\n/**\n * @deprecated Use ListNodeSchemaBasic instead.\n * Kept for backward compatibility during migration.\n */\nexport const CMSListNodeSchemaBasic = ListNodeSchemaBasic;\n\n/**\n * Island node schema - a BYO framework component rendered as an Astro island.\n * `src` is the file relative to `src/islands/` (extension derives the framework);\n * `client` carries the `client:*` hydration directive (omitted = server-only).\n */\nexport const IslandNodeSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n type: z.literal(NODE_TYPE.ISLAND),\n src: z.string(),\n client: z\n .object({\n directive: z.enum(['load', 'idle', 'visible', 'media', 'only']),\n value: z.string().optional(),\n })\n .passthrough()\n .optional(),\n props: z.record(z.string(), z.any()).optional(),\n if: IfConditionSchema.optional(),\n children: z\n .union([\n z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),\n z.string(),\n I18nValueObjectSchema,\n ])\n .optional(),\n })\n .passthrough(),\n);\n\n/**\n * Markdown node schema - renders a verbatim Markdown source string as HTML.\n */\nexport const MarkdownNodeSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n type: z.literal(NODE_TYPE.MARKDOWN),\n source: 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\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), I18nValueObjectSchema, VerbatimCodeSchema]))\n .optional(),\n })\n .passthrough(),\n);\n\n/**\n * Custom node schema - an opaque, hand-authored `.astro` component under `src/custom/`.\n * `src` is the file relative to `src/custom/`; Meno renders it via Astro but doesn't model\n * its internals (server-only, no client directive \u2014 the native-Astro sibling of an island).\n */\nexport const CustomNodeSchema: z.ZodType<any> = z.lazy(() =>\n z\n .object({\n type: z.literal(NODE_TYPE.CUSTOM),\n src: z.string(),\n props: z.record(z.string(), z.any()).optional(),\n if: IfConditionSchema.optional(),\n children: z\n .union([\n z.array(z.union([ComponentNodeSchema, z.string(), I18nValueObjectSchema])),\n z.string(),\n I18nValueObjectSchema,\n ])\n .optional(),\n })\n .passthrough(),\n);\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 IslandNodeSchema,\n MarkdownNodeSchema,\n CustomNodeSchema,\n // A verbatim-code marker is a valid child node (renders natively at build; nothing in the\n // editor preview) \u2014 a meno-astro component with any `{_code}` child must validate to open.\n VerbatimCodeSchema,\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\n .object({\n url: z.string().min(1),\n mode: ScriptLoadModeSchema.optional(),\n position: LibraryPositionSchema.optional(),\n type: ScriptTypeSchema.optional(),\n })\n .passthrough();\n\n/**\n * CSS library schema\n */\nexport const CSSLibraryConfigSchema = z\n .object({\n url: z.string().min(1),\n media: z.string().optional(),\n inline: z.boolean().optional(),\n })\n .passthrough();\n\n/**\n * Libraries config schema\n */\nexport const LibrariesConfigSchema = z\n .object({\n js: z.array(JSLibraryConfigSchema).optional(),\n css: z.array(CSSLibraryConfigSchema).optional(),\n })\n .passthrough();\n\n/**\n * Structured component definition schema\n */\nexport const StructuredComponentDefinitionSchema = z\n .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 })\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\n .object({\n component: StructuredComponentDefinitionSchema,\n })\n .passthrough(),\n // Legacy format: { type, props?, children?, component }\n z\n .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 })\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\n .object({\n _i18n: z.literal(true),\n })\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\n .object({\n js: z.array(JSLibraryConfigSchema).optional(),\n css: z.array(CSSLibraryConfigSchema).optional(),\n mode: LibraryMergeModeSchema.optional(),\n })\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\n .object({\n head: z.string().optional(),\n bodyStart: z.string().optional(),\n bodyEnd: z.string().optional(),\n })\n .passthrough();\n\nconst SitemapPageConfigSchema = z\n .object({\n priority: z.number().optional(),\n changefreq: z.enum(['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never']).optional(),\n exclude: z.boolean().optional(),\n })\n .passthrough();\n\nconst PageMetaDataBaseSchema = z\n .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 viewTransitions: z.boolean().optional(),\n noindex: z.boolean().optional(),\n prerender: z.boolean().optional(),\n sitemap: SitemapPageConfigSchema.optional(),\n })\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\n .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 // Marks a page whose source is outside the meno-astro dialect (read-only in the editor).\n // Explicit (not just .passthrough()) so it survives a future tightening of this schema.\n _unsupported: z.object({ reason: z.string() }).passthrough().optional(),\n // A component payload (`{ component: {...} }`) must NEVER validate as a page.\n // Without this guard the page branch parses structurally (it's `.passthrough()`)\n // and only trips the refine below \u2014 so when both branches of `PageDataSchema`\n // fail, zod treats this branch as the \"closest\" (dirty) one and surfaces\n // \"JSONPage must have \u2026root\", masking the real component error (e.g. a malformed\n // list prop). Rejecting a present `component` key makes this branch hard-fail on\n // component payloads, so `PageDataSchema` reports the component branch instead.\n component: z.undefined().optional(),\n })\n .passthrough()\n .refine(\n (data) => {\n // Require at least one field to be present\n return data.meta !== undefined || data.components !== undefined || data.root !== undefined;\n },\n {\n message: 'JSONPage must have at least one of: meta, components, or root',\n },\n );\n\n/**\n * Page data with component schema\n */\nexport const PageDataWithComponentSchema = z\n .object({\n component: z\n .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 })\n .passthrough(),\n })\n .passthrough();\n\n/**\n * Page data schema - union of JSONPage and PageDataWithComponent.\n * PageDataWithComponent is checked first because it's more specific; the\n * `component: z.undefined()` guard on `JSONPageSchema` keeps a component payload\n * from being mis-reported as a page (see that schema's comment), so a malformed\n * prop surfaces its own error instead of the page-branch refine.\n */\nexport const PageDataSchema = z.union([PageDataWithComponentSchema, JSONPageSchema]);\n\n// ============================================================================\n// CMS Schemas\n// ============================================================================\n\n/**\n * CMS field type schema\n */\nexport const CMSFieldTypeSchema = z.enum([\n 'string',\n 'text',\n 'rich-text',\n 'number',\n 'boolean',\n 'image',\n 'file',\n 'date',\n 'select',\n 'reference',\n]);\n\n/**\n * CMS field definition schema\n */\nexport const CMSFieldDefinitionSchema = z\n .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 })\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\n .object({\n enabled: z.boolean(),\n strategy: CMSClientDataStrategySchema,\n threshold: z.number().positive().optional(),\n fields: z.array(z.string()).optional(),\n })\n .passthrough();\n\n/**\n * CMS schema schema (defines collection structure)\n */\nexport const CMSSchemaSchema = z\n .object({\n id: z.string(),\n name: z.string(),\n // Optional: a data-only collection (no per-item route) omits both.\n slugField: z.string().optional(),\n urlPattern: z.string().optional(),\n fields: z.record(CMSFieldDefinitionSchema),\n clientData: CMSClientDataConfigSchema.optional(),\n rss: z.boolean().optional(),\n })\n .passthrough();\n\n/**\n * CMS item schema (content entry, strict \u2014 used at publish/save time).\n */\nexport const CMSItemSchema = z\n .object({\n _id: z.string(),\n _slug: z.string().optional(),\n _filename: z.string().optional(),\n _createdAt: z.string().optional(),\n })\n .passthrough();\n\n/**\n * CMS draft item schema (loose \u2014 used at draft-write time).\n *\n * Drafts can be partial work-in-progress, so even system-managed identifiers\n * are optional at this stage. Strict validation runs when promoting the draft\n * to published (see `publishDraft` in `FileSystemCMSProvider`).\n */\nexport const CMSDraftItemSchema = z\n .object({\n _id: z.string().optional(),\n _slug: z.string().optional(),\n _filename: z.string().optional(),\n _createdAt: z.string().optional(),\n })\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([CMSFilterConditionSchema, z.array(CMSFilterConditionSchema), z.record(z.unknown())]).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\n .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([CMSFilterConditionSchema, z.array(CMSFilterConditionSchema), z.record(z.unknown())]).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 })\n .passthrough();\n\n/**\n * Page CMS config schema (embedded in page meta)\n */\nexport const PageCmsConfigSchema = z\n .object({\n id: z.string(),\n name: z.string(),\n // Optional: a data-only collection (no per-item route) omits both.\n slugField: z.string().optional(),\n urlPattern: z.string().optional(),\n fields: z.record(CMSFieldDefinitionSchema),\n rss: z.boolean().optional(),\n })\n .passthrough();\n\n/**\n * SSR page data-source schema (one entry of `meta.data.sources`).\n */\nexport const PageDataSourceSchema = z\n .object({\n type: z.literal('fetch'),\n url: z.string(),\n method: z.literal('GET').optional(),\n headers: z.record(z.string(), z.string()).optional(),\n path: z.string().optional(),\n fields: z.record(z.enum(['string', 'number', 'boolean', 'date', 'image', 'object'])).optional(),\n cardinality: z.enum(['object', 'list']).optional(),\n })\n .passthrough();\n\n/**\n * SSR page data config schema (embedded in page meta as `meta.data`, required when\n * `meta.source === 'ssr'`).\n */\nexport const PageDataConfigSchema = z\n .object({\n sources: z.record(z.string(), PageDataSourceSchema),\n })\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\n .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', 'ssr']).optional(),\n cms: PageCmsConfigSchema.optional(),\n data: PageDataConfigSchema.optional(),\n routeParams: z.array(z.string()).optional(),\n routePreview: z.record(z.string(), z.string()).optional(),\n draft: z.boolean().optional(),\n libraries: PageLibrariesConfigSchema.optional(),\n customCode: CustomCodeConfigSchema.optional(),\n viewTransitions: z.boolean().optional(),\n noindex: z.boolean().optional(),\n prerender: z.boolean().optional(),\n sitemap: SitemapPageConfigSchema.optional(),\n })\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';\nimport { logRuntimeError } from '../errorLogger';\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 // One throwing subscriber must not stop the rest from being notified, but\n // a swallowed listener error hides real store-update bugs \u2014 surface it.\n logRuntimeError('ComponentRegistry.notify', err);\n }\n }\n }\n}\n", "/**\n * Client Component Registry\n * Extends base registry with client-specific functionality\n */\n\nimport { BaseComponentRegistry } from './ComponentRegistry';\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 * SSR Component Registry\n * Extends base registry with SSR-specific functionality\n */\n\nimport { BaseComponentRegistry } from './ComponentRegistry';\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 * 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 * 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 { NodeTypeDefinition, NodeTypeDefinitionInput, NodeCapabilities } 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 && typeof node === 'object' && 'type' in node && (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 ({\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 // Bare strings are value-is-label options; the object form carries a distinct\n // display label (e.g. an empty-value `{ value: '', label: 'None' }` entry).\n options: (string | { value: string | boolean; label: 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\n .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([z.array(z.union([ComponentNodeSchemaRef, z.string()])), z.string()]).optional(),\n })\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, unknown> = { 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 = [\n 'img',\n 'br',\n 'hr',\n 'input',\n 'meta',\n 'link',\n 'area',\n 'base',\n 'col',\n 'embed',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ];\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 = [\n 'img',\n 'br',\n 'hr',\n 'input',\n 'meta',\n 'link',\n 'area',\n 'base',\n 'col',\n 'embed',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ];\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\n .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([z.array(z.union([ComponentNodeSchemaRef, z.string()])), z.string()]).optional(),\n })\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\n .object({\n type: z.literal('slot'),\n default: z.union([z.array(z.any()), z.string()]).optional(),\n })\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 // Show the slot's name so multiple named slots in a component are distinguishable\n // (e.g. `slot: header`). Unnamed (default) slots stay just `slot`.\n getLabel: (node) => {\n const name = (node as { name?: unknown }).name;\n return typeof name === 'string' && name ? `slot: ${name}` : 'slot';\n },\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 {\n StyleValueSchema,\n InteractiveStylesSchema,\n IfConditionSchema,\n HtmlMappingSchema,\n} from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\nimport { textareaField } from '../fieldPresets';\n\n// Schema is the SINGLE source of truth\nconst EmbedNodeSchemaInternal = z\n .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 })\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 {\n StyleValueSchema,\n InteractiveStylesSchema,\n LinkMappingSchema,\n IfConditionSchema,\n} 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\n .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([z.array(z.union([ComponentNodeSchemaRef, z.string()])), z.string()]).optional(),\n })\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: 'LINK',\n getLabel: () => 'Link',\n },\n\n editableFields: [urlField({ name: 'href', label: 'Link URL', required: true })],\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\n .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 })\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(\n 'div',\n {\n key: context.key,\n 'data-locale-list': 'true',\n },\n '[Locale List]',\n );\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(\n z.object({\n field: z.string(),\n order: z.enum(['asc', 'desc']).optional(),\n }),\n ),\n]);\n\n// Schema is the SINGLE source of truth\nconst ListNodeSchemaInternal = z\n .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 * - 'remote': Fetch items from a public HTTP/JSON endpoint at build/SSR time\n * - 'sanity': Fetch a Sanity document type via GROQ at build/SSR time (read-only, public dataset)\n * - 'expression': Iterate a verbatim JS expression (`source`) that yields an array \u2014 a\n * `.map()` over arbitrary frontmatter data (e.g. an Astro Action / supabase query) the\n * dialect can't model as a prop/collection. The item template (`children` + `itemAs`) IS\n * editable; the source itself is a read-only black box (edit it in the .astro frontmatter).\n * The editor has no data for it, so it renders empty in the design canvas (real Astro play\n * renders it for real at build/SSR).\n */\n sourceType: z.enum(['prop', 'collection', 'remote', 'sanity', 'expression']).default('prop'),\n /**\n * Source identifier (sourceType 'prop'/'collection'/'expression'; 'remote' uses `url`):\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 * - For sourceType 'expression': the verbatim JS expression iterated by `.map()` (e.g. \"notes?\")\n */\n source: z.string().optional(),\n\n // Remote-only options (sourceType: 'remote')\n /** HTTP(S) endpoint returning JSON, fetched at build/SSR time (e.g. a public REST API). */\n url: z.string().optional(),\n /**\n * Dot-path into the JSON response to reach the items array (e.g. \"data.items\").\n * Empty/absent = the response body is itself the array.\n */\n path: z.string().optional(),\n\n // Sanity-only options (sourceType: 'sanity')\n /** Sanity document `_type` to fetch (`*[_type == \"<documentType>\"]`). projectId/dataset come from project config. */\n documentType: z.string().optional(),\n /** Field used as the URL slug (for synthesizing item links); defaults to 'slug'. */\n slugField: z.string().optional(),\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([CMSFilterConditionSchema, z.array(CMSFilterConditionSchema), z.record(z.unknown())]).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 })\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 =\n sourceType === 'collection'\n ? 'CMS List'\n : sourceType === 'remote'\n ? 'Remote List'\n : sourceType === 'sanity'\n ? 'Sanity List'\n : sourceType === 'expression'\n ? 'Loop'\n : 'List';\n const src =\n sourceType === 'remote' ? listNode.url : sourceType === 'sanity' ? listNode.documentType : listNode.source;\n return src ? `${prefix}: ${src}` : 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(\n 'div',\n {\n key: context.key,\n 'data-list': 'true',\n 'data-source-type': sourceType,\n 'data-source':\n sourceType === 'remote' ? listNode.url : sourceType === 'sanity' ? listNode.documentType : 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 },\n `[${label}: ${listNode.source || 'No source'}]`,\n );\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', 'remote', 'sanity'],\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 * Island Node Type Definition\n *\n * Represents a BYO framework component (React/Preact/Vue/Svelte) rendered as an\n * Astro island. The actual hydration only happens in a real `astro build` / play\n * preview (the meno-astro codec emits `<Counter client:visible \u2026 />`). meno-core\n * itself can't run a framework component, so the editor canvas renders a visible\n * placeholder \u2014 design-time positioning works, interactivity is play/build only.\n *\n * The on-disk `.astro` form and the round-trip codec live in `meno-astro`; this\n * file only models the node so it validates, persists, and renders a placeholder.\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport type { ComponentNode } from '../../types/nodes';\nimport { IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\nimport { textField, selectField } from '../fieldPresets';\n\n/**\n * Client (hydration) directive for an island.\n * `directive` maps to Astro's `client:*` directive; `value` carries the media\n * query (`client:media=\"(max-width: 50em)\"`) or the framework name\n * (`client:only=\"react\"`). When omitted entirely, the island is server-rendered\n * with no JS (a valid, zero-hydration Astro island).\n */\nexport const IslandClientDirectiveSchema = z\n .object({\n directive: z.enum(['load', 'idle', 'visible', 'media', 'only']),\n value: z.string().optional(),\n })\n .passthrough();\n\n// Schema is the SINGLE source of truth\nconst IslandNodeSchemaInternal = z\n .object({\n type: z.literal('island'),\n // Path to the framework component file relative to `src/islands/`\n // (e.g. \"Counter.tsx\", \"widgets/Chart.vue\"). The extension derives the\n // framework, which drives the Astro integration that gets provisioned.\n src: z.string(),\n client: IslandClientDirectiveSchema.optional(),\n props: z.record(z.string(), z.any()).optional(),\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n // Slotted children (rendered server-side into the island's <slot/>).\n children: z.union([z.array(z.any()), z.string()]).optional(),\n })\n .passthrough();\n\n// TypeScript type inferred from schema\nexport type IslandNode = z.infer<typeof IslandNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const IslandNodeSchema = IslandNodeSchemaInternal;\n\n/** Basename of the island source (drops directory + extension) for display. */\nfunction islandName(src: string): string {\n const base = src.split('/').pop() ?? src;\n return base.replace(/\\.(tsx|jsx|vue|svelte)$/i, '') || base;\n}\n\n/** Slotted children, normalized to the shape `buildChildren`/`renderChildren` accept. */\nfunction islandChildren(node: IslandNode): Array<ComponentNode | string> | string | undefined {\n const { children } = node;\n if (Array.isArray(children)) return children.length > 0 ? (children as Array<ComponentNode | string>) : undefined;\n if (typeof children === 'string') return children.length > 0 ? children : undefined;\n return undefined;\n}\n\nexport const IslandNodeType = createNodeType({\n type: 'island',\n displayName: 'Island',\n category: 'special',\n schema: IslandNodeSchemaInternal,\n\n defaultValues: {\n src: '',\n client: { directive: 'load' },\n },\n\n treeDisplay: {\n icon: 'COMPONENT',\n getLabel: (node) => `Island: ${islandName(node.src) || '?'}`,\n },\n\n editableFields: [\n textField({ name: 'src', label: 'Island file', required: true, placeholder: 'Counter.tsx' }),\n selectField({\n name: 'client.directive',\n label: 'Hydration',\n // The empty-value entry clears `client` entirely \u2192 a server-rendered island\n // with zero JS (a valid Astro pattern); the rest map to `client:<directive>`.\n options: [{ value: '', label: 'None (server-only, no JS)' }, 'load', 'idle', 'visible', 'media', 'only'],\n }),\n ],\n\n // meno-core can't run a framework component. Instead of a loud highlight box\n // (which made island-heavy pages unreadable), render the island's slotted\n // children as normal content and fall back to a quiet inline marker when there\n // are none. The wrapper keeps `data-island` for selection/identification only.\n // Real hydration is play/build only.\n clientRenderer: (node, context) => {\n const children = islandChildren(node);\n const inner = children\n ? context.buildChildren(children, context.elementPath)\n : h('span', { style: { color: '#9ca3af', fontSize: '13px' } }, islandName(node.src) || '?');\n return h('div', { key: context.key, 'data-island': node.src, style: { display: 'contents' } }, inner);\n },\n\n ssrRenderer: (node, context) => {\n const children = islandChildren(node);\n const inner = children\n ? context.renderChildren(children, context)\n : `<span style=\"color:#9ca3af;font-size:13px\">${escapeHtml(islandName(node.src) || '?')}</span>`;\n return `<div data-island=\"${escapeHtml(node.src)}\" style=\"display:contents\">${inner}</div>`;\n },\n\n capabilities: {\n canHaveChildren: true,\n canHaveStyle: false,\n canHaveAttributes: false,\n requiresProps: ['src'],\n },\n});\n\nfunction escapeHtml(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n", "/**\n * Markdown \u2192 HTML for the `markdown` node type.\n *\n * A Meno `markdown` node stores its body as a verbatim Markdown string (`node.source`).\n * meno-core renders it to HTML here for both the editor canvas (client renderer) and SSR\n * (design-canvas preview / JSON-format SSR). The meno-astro build runtime has its OWN\n * `renderMarkdown` (packages/astro/lib/runtime/markdown.ts) \u2014 kept separate so a new\n * meno-core export never has to reach the published Astro play runtime (see the\n * runtime-uses-npm-meno-core constraint). Both wrap the same `markdown-it` config, so the\n * canvas preview and the real Astro build render identically.\n *\n * `html: true` lets authors embed raw HTML in Markdown (parity with typical Markdown +\n * the embed node, which also passes author HTML through). Content is author-trusted (the\n * editor is the source of truth), like the `customCode` / `embed` paths.\n */\n\nimport MarkdownIt from 'markdown-it';\n\nconst md = new MarkdownIt({ html: true, linkify: true, breaks: false });\n\n/** Render a Markdown source string to an HTML string. Empty/non-string \u2192 \"\". */\nexport function renderMarkdown(source: unknown): string {\n if (typeof source !== 'string' || source.trim() === '') return '';\n return md.render(source);\n}\n", "/**\n * Markdown Node Type Definition\n * Renders a verbatim Markdown source string as HTML (Astro `.md`-style authoring).\n *\n * The body is stored byte-exact in `node.source` (whitespace-significant Markdown). meno-core\n * renders it via `renderMarkdown` for the canvas + SSR; the meno-astro codec hoists the source\n * to a backtick const and renders it through the runtime `renderMarkdown` at build (see\n * dialect/emit/emitNode.ts:renderMarkdown). Modeled on the Embed node (verbatim payload).\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport { renderMarkdown } from '../../markdown';\nimport { StyleValueSchema, InteractiveStylesSchema, IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\nimport { textareaField } from '../fieldPresets';\n\n// Schema is the SINGLE source of truth\nconst MarkdownNodeSchemaInternal = z\n .object({\n type: z.literal('markdown'),\n source: z.string(), // verbatim Markdown source (whitespace-significant)\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(),\n generateElementClass: z.boolean().optional(),\n attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n })\n .passthrough();\n\n// TypeScript type inferred from schema\nexport type MarkdownNode = z.infer<typeof MarkdownNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const MarkdownNodeSchema = MarkdownNodeSchemaInternal;\n\nexport const MarkdownNodeType = createNodeType({\n type: 'markdown',\n displayName: 'Markdown',\n category: 'content',\n schema: MarkdownNodeSchemaInternal,\n\n defaultValues: {\n source: '',\n style: { base: {} },\n },\n\n treeDisplay: {\n icon: 'HTML_ELEMENT',\n getLabel: () => 'Markdown',\n },\n\n editableFields: [\n textareaField({\n name: 'source',\n label: 'Markdown',\n required: true,\n placeholder: '# Heading\\n\\nWrite **markdown** here\u2026',\n }),\n ],\n\n clientRenderer: (node, context) => {\n return h('div', {\n key: context.key,\n dangerouslySetInnerHTML: { __html: renderMarkdown((node as { source?: unknown }).source) },\n });\n },\n\n ssrRenderer: (node, _context) => {\n return `<div>${renderMarkdown((node as { source?: unknown }).source)}</div>`;\n },\n\n capabilities: {\n canHaveChildren: false,\n requiresProps: ['source'],\n },\n});\n", "/**\n * Custom Node Type Definition\n *\n * Represents a hand-authored, opaque `.astro` component (under `src/custom/`) that Meno\n * treats as a BLACK BOX: it renders server-side in a real `astro build` / play preview\n * (the meno-astro codec emits `<Fancy \u2026 />` + the import), but Meno doesn't model its\n * internals \u2014 you can place it, pass props, and slot children, but not edit what's inside.\n * The native-Astro sibling of an island (no framework renderer, no hydration).\n *\n * meno-core can't execute a foreign `.astro` file, so the editor canvas renders a quiet\n * placeholder (its slotted children, or an inline marker) \u2014 real rendering is play/build\n * only. The on-disk `.astro` form and the round-trip codec live in `meno-astro`; this file\n * only models the node so it validates, persists, and renders a placeholder.\n */\n\nimport { z } from 'zod';\nimport { createElement as h } from 'react';\nimport type { ComponentNode } from '../../types/nodes';\nimport { IfConditionSchema } from '../../validation/schemas';\nimport { createNodeType } from '../createNodeType';\nimport { textField } from '../fieldPresets';\n\n// Schema is the SINGLE source of truth\nconst CustomNodeSchemaInternal = z\n .object({\n type: z.literal('custom'),\n // Path to the hand-authored .astro component relative to `src/custom/`\n // (e.g. \"Fancy.astro\", \"widgets/Banner.astro\").\n src: z.string(),\n props: z.record(z.string(), z.any()).optional(),\n if: IfConditionSchema.optional(), // Conditional rendering - skip node when false\n // Slotted children (rendered server-side into the component's default <slot/>).\n children: z.union([z.array(z.any()), z.string()]).optional(),\n })\n .passthrough();\n\n// TypeScript type inferred from schema\nexport type CustomNode = z.infer<typeof CustomNodeSchemaInternal>;\n\n// Export schema for validation/schemas.ts\nexport const CustomNodeSchema = CustomNodeSchemaInternal;\n\n/** Basename of the custom source (drops directory + `.astro` extension) for display. */\nfunction customName(src: string): string {\n const base = src.split('/').pop() ?? src;\n return base.replace(/\\.astro$/i, '') || base;\n}\n\n/** Slotted children, normalized to the shape `buildChildren`/`renderChildren` accept. */\nfunction customChildren(node: CustomNode): Array<ComponentNode | string> | string | undefined {\n const { children } = node;\n if (Array.isArray(children)) return children.length > 0 ? (children as Array<ComponentNode | string>) : undefined;\n if (typeof children === 'string') return children.length > 0 ? children : undefined;\n return undefined;\n}\n\nexport const CustomNodeType = createNodeType({\n type: 'custom',\n displayName: 'Custom Component',\n category: 'special',\n schema: CustomNodeSchemaInternal,\n\n defaultValues: {\n src: '',\n },\n\n treeDisplay: {\n icon: 'COMPONENT',\n getLabel: (node) => `Custom: ${customName(node.src) || '?'}`,\n },\n\n editableFields: [textField({ name: 'src', label: 'Custom .astro file', required: true, placeholder: 'Fancy.astro' })],\n\n // meno-core can't run a foreign `.astro` file. Render the slotted children as normal\n // content and fall back to a quiet inline marker when there are none. The wrapper keeps\n // `data-custom` for selection/identification only. Real rendering is play/build only.\n clientRenderer: (node, context) => {\n const children = customChildren(node);\n const inner = children\n ? context.buildChildren(children, context.elementPath)\n : h('span', { style: { color: '#9ca3af', fontSize: '13px' } }, customName(node.src) || '?');\n return h('div', { key: context.key, 'data-custom': node.src, style: { display: 'contents' } }, inner);\n },\n\n ssrRenderer: (node, context) => {\n const children = customChildren(node);\n const inner = children\n ? context.renderChildren(children, context)\n : `<span style=\"color:#9ca3af;font-size:13px\">${escapeHtml(customName(node.src) || '?')}</span>`;\n return `<div data-custom=\"${escapeHtml(node.src)}\" style=\"display:contents\">${inner}</div>`;\n },\n\n capabilities: {\n canHaveChildren: true,\n canHaveStyle: false,\n canHaveAttributes: false,\n requiresProps: ['src'],\n },\n});\n\nfunction escapeHtml(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\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 {\n ComponentInstanceNodeType,\n ComponentInstanceNodeSchema,\n type ComponentInstanceNode,\n} 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';\nimport { IslandNodeType, IslandNodeSchema, type IslandNode } from './IslandNodeType';\nimport { MarkdownNodeType, MarkdownNodeSchema, type MarkdownNode } from './MarkdownNodeType';\nimport { CustomNodeType, CustomNodeSchema, type CustomNode } from './CustomNodeType';\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 IslandNodeType as NodeTypeDefinition,\n MarkdownNodeType as NodeTypeDefinition,\n CustomNodeType 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 island: IslandNodeSchema,\n markdown: MarkdownNodeSchema,\n custom: CustomNodeSchema,\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 {\n ComponentInstanceNodeType,\n ComponentInstanceNodeSchema,\n type ComponentInstanceNode,\n} 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';\nexport { IslandNodeType, IslandNodeSchema, type IslandNode } from './IslandNodeType';\nexport { MarkdownNodeType, MarkdownNodeSchema, type MarkdownNode } from './MarkdownNodeType';\nexport { CustomNodeType, CustomNodeSchema, type CustomNode } from './CustomNodeType';\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 | IslandNode\n | MarkdownNode\n | CustomNode;\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 * Shared Breakpoint Configuration\n * Defines breakpoints for responsive design\n * Supports dynamic breakpoints from project.config.json\n */\n\n/**\n * Extended breakpoint entry with separate CSS threshold and editor preview width\n * - breakpoint: The CSS media query threshold (max-width value)\n * - previewPoint: The width used in editor preview mode (defaults to breakpoint if not specified)\n * - label: Optional display label for UI (e.g., \"Tablet Landscape\", \"Phone\")\n */\nexport interface BreakpointEntry {\n breakpoint: number;\n previewPoint: number;\n label?: string;\n}\n\n/**\n * Input format for breakpoint config - supports both legacy (number) and new (object) format\n * Legacy: { tablet: 1024 }\n * New: { tablet: { breakpoint: 1024, previewPoint: 768 } }\n */\nexport type BreakpointConfigInput = Record<string, number | BreakpointEntry>;\n\n/**\n * Normalized breakpoint config - always uses object format\n */\nexport type BreakpointConfig = Record<string, BreakpointEntry>;\n\n/**\n * Legacy format for backward compatibility (simple number values)\n */\nexport type LegacyBreakpointConfig = Record<string, number>;\n\n// BreakpointName is now a string to support dynamic breakpoints\nexport type BreakpointName = string;\n\nexport const DEFAULT_BREAKPOINTS: BreakpointConfig = {\n tablet: { breakpoint: 1024, previewPoint: 768 },\n mobile: { breakpoint: 540, previewPoint: 375 },\n} as const;\n\n/**\n * Normalize a breakpoint config input to the full object format\n * Converts legacy number format to object format\n * If previewPoint is not specified, defaults to breakpoint value\n */\nexport function normalizeBreakpointConfig(input: BreakpointConfigInput | LegacyBreakpointConfig): BreakpointConfig {\n const result: BreakpointConfig = {};\n\n for (const [name, value] of Object.entries(input)) {\n if (typeof value === 'number') {\n // Legacy format: number -> { breakpoint: value, previewPoint: value }\n result[name] = { breakpoint: value, previewPoint: value };\n } else if (typeof value === 'object' && value !== null) {\n // New format: ensure both values exist, preserve label if present\n result[name] = {\n breakpoint: value.breakpoint,\n previewPoint: value.previewPoint ?? value.breakpoint,\n ...(value.label !== undefined && { label: value.label }),\n };\n }\n }\n\n return result;\n}\n\n/**\n * Get just the breakpoint values for CSS generation (media queries)\n * Returns Record<string, number> with breakpoint values\n */\nexport function getBreakpointValues(config: BreakpointConfig): LegacyBreakpointConfig {\n const result: LegacyBreakpointConfig = {};\n for (const [name, entry] of Object.entries(config)) {\n result[name] = entry.breakpoint;\n }\n return result;\n}\n\n/**\n * Get just the preview point values for editor preview\n * Returns Record<string, number> with previewPoint values\n */\nexport function getPreviewPointValues(config: BreakpointConfig): LegacyBreakpointConfig {\n const result: LegacyBreakpointConfig = {};\n for (const [name, entry] of Object.entries(config)) {\n result[name] = entry.previewPoint;\n }\n return result;\n}\n\n/**\n * Get all breakpoint names from the breakpoint configuration\n * Always includes 'base' plus all keys from the config\n * Order: base (desktop) -> breakpoints sorted by value descending (largest to smallest viewport)\n */\nexport function getAllBreakpointNames(breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS): BreakpointName[] {\n // Base is always included first\n const names: BreakpointName[] = ['base'];\n\n // Get all breakpoint names from config and sort by breakpoint value (descending)\n // This ensures proper order: largest viewport first\n const breakpointEntries = Object.entries(breakpoints);\n breakpointEntries.sort((a, b) => b[1].breakpoint - a[1].breakpoint); // Sort descending by breakpoint value\n\n // Add breakpoint names in sorted order\n for (const [name] of breakpointEntries) {\n names.push(name);\n }\n\n return names;\n}\n\n/**\n * Get active breakpoint name based on viewport width\n * Returns the smallest breakpoint that the viewport width is less than or equal to\n * If viewport is larger than all breakpoints, returns 'base'\n * Uses .breakpoint value for comparison (CSS threshold)\n */\nexport function getBreakpointName(\n viewportWidth: number,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n): BreakpointName {\n // Sort breakpoints by breakpoint value (ascending) to find the smallest one that matches\n const breakpointEntries = Object.entries(breakpoints);\n breakpointEntries.sort((a, b) => a[1].breakpoint - b[1].breakpoint); // Sort ascending by breakpoint value\n\n // Find the smallest breakpoint that viewport width is <= to\n for (const [name, entry] of breakpointEntries) {\n if (viewportWidth <= entry.breakpoint) {\n return name;\n }\n }\n\n // If viewport is larger than all breakpoints, return 'base'\n return 'base';\n}\n\n/**\n * Get display label for a breakpoint\n * Priority:\n * 1. Label from config (if set)\n * 2. \"Desktop\" for 'base'\n * 3. Auto-capitalized name (camelCase -> Title Case)\n */\nexport function getBreakpointLabel(name: BreakpointName, breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS): string {\n // Base always returns \"Desktop\"\n if (name === 'base') {\n return 'Desktop';\n }\n\n // Check for custom label in config\n const entry = breakpoints[name];\n if (entry?.label) {\n return entry.label;\n }\n\n // Auto-format: camelCase -> Title Case\n // e.g., \"tabletLandscape\" -> \"Tablet Landscape\"\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n", "/**\n * Responsive Scaling Calculator\n * Automatically calculates responsive values for different breakpoints\n * using configured scale multipliers\n */\n\n/**\n * Scale configuration for a CSS property category\n * Keys are breakpoint names (e.g., 'tablet', 'mobile', 'small')\n * Values are scale multipliers (e.g., 0.88, 0.75)\n */\nexport type BreakpointScales = Record<string, number>;\n\nexport type ResponsiveMode = 'breakpoints' | 'fluid';\n\nexport interface FluidRange {\n /** Lower viewport bound in pixels (e.g. 320) */\n min: number;\n /** Upper viewport bound in pixels (e.g. 1440) */\n max: number;\n}\n\nexport interface SiteMarginConfig {\n /** Lower bound of the side margin at smallest viewport (px). */\n min: number;\n /** Upper bound of the side margin at largest viewport (px). */\n max: number;\n}\n\nexport interface ResponsiveScales {\n enabled: boolean;\n /** Scaling strategy. Missing \u2192 'breakpoints' (back-compat with old configs). */\n mode?: ResponsiveMode;\n baseReference: number;\n /** Viewport bounds used when `mode === 'fluid'`. Defaults to 320 / 1440 px. */\n fluidRange?: FluidRange;\n /**\n * Container side margin range, in fluid mode emitted as a CSS variable\n * `--site-margin: clamp(min, \u2026, max)` on `:root`. Lets users write\n * `width: calc(100% - var(--site-margin) * 2)` for the container pattern.\n */\n siteMargin?: SiteMarginConfig;\n fontSize?: BreakpointScales;\n padding?: BreakpointScales;\n margin?: BreakpointScales;\n gap?: BreakpointScales;\n borderRadius?: BreakpointScales;\n size?: BreakpointScales;\n [key: string]: boolean | number | string | BreakpointScales | FluidRange | SiteMarginConfig | undefined;\n}\n\nexport const DEFAULT_FLUID_RANGE: FluidRange = { min: 320, max: 1440 };\nexport const DEFAULT_SITE_MARGIN: SiteMarginConfig = { min: 16, max: 32 };\n\nexport type CSSPropertyType =\n | 'fontSize'\n | 'padding'\n | 'margin'\n | 'gap'\n | 'paddingTop'\n | 'paddingRight'\n | 'paddingBottom'\n | 'paddingLeft'\n | 'marginTop'\n | 'marginRight'\n | 'marginBottom'\n | 'marginLeft'\n | 'rowGap'\n | 'columnGap'\n | 'borderRadius'\n | 'borderTopLeftRadius'\n | 'borderTopRightRadius'\n | 'borderBottomLeftRadius'\n | 'borderBottomRightRadius'\n | 'width'\n | 'height'\n | 'maxWidth'\n | 'maxHeight'\n | 'minWidth'\n | 'minHeight';\n\n/**\n * Map CSS property to its scale category\n * e.g., paddingTop -> padding, marginRight -> margin\n */\nfunction getScaleCategory(property: CSSPropertyType): keyof ResponsiveScales | null {\n const propertyStr = property as string;\n if (property === 'fontSize') return 'fontSize';\n if (propertyStr.startsWith('padding')) return 'padding';\n if (propertyStr.startsWith('margin')) return 'margin';\n if (property === 'gap' || property === 'rowGap' || property === 'columnGap') return 'gap';\n if (propertyStr === 'borderRadius' || (propertyStr.startsWith('border') && propertyStr.includes('Radius')))\n return 'borderRadius';\n if (\n property === 'width' ||\n property === 'height' ||\n property === 'maxWidth' ||\n property === 'maxHeight' ||\n property === 'minWidth' ||\n property === 'minHeight'\n )\n return 'size';\n return null;\n}\n\n/**\n * Extract numeric value and unit from a CSS value string\n * e.g., \"67px\" -> { value: 67, unit: \"px\" }\n */\nexport function parseValue(valueStr: string): { value: number; unit: string } | null {\n const match = valueStr.trim().match(/^(-?[\\d.]+)(px|rem|em|%|pt)$/);\n if (!match) return null;\n return {\n value: parseFloat(match[1] ?? ''),\n unit: match[2] ?? '',\n };\n}\n\n/**\n * CSS properties that get fluid `clamp()` / breakpoint scaling. Mirrors the\n * `AUTO_RESPONSIVE_TYPE_MAP` keys in `cssGeneration.ts`; centralized here so\n * `utilityClassMapper.ts` can consult it without a cross-module import cycle.\n */\nexport const SCALABLE_CSS_PROPERTIES: ReadonlySet<string> = new Set([\n 'padding',\n 'padding-left',\n 'padding-right',\n 'padding-top',\n 'padding-bottom',\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'margin',\n 'margin-left',\n 'margin-right',\n 'margin-top',\n 'margin-bottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'font-size',\n 'fontSize',\n 'gap',\n 'row-gap',\n 'column-gap',\n 'rowGap',\n 'columnGap',\n 'border-radius',\n 'borderRadius',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-left-radius',\n 'border-bottom-right-radius',\n 'borderTopLeftRadius',\n 'borderTopRightRadius',\n 'borderBottomLeftRadius',\n 'borderBottomRightRadius',\n 'width',\n 'height',\n 'max-width',\n 'max-height',\n 'min-width',\n 'min-height',\n 'maxWidth',\n 'maxHeight',\n 'minWidth',\n 'minHeight',\n]);\n\n/**\n * Calculate responsive value using the formula:\n * responsive_value = base_value + (base_value - base_reference) * (scale - 1)\n */\nexport function calculateResponsiveValue(baseValue: number, baseReference: number, scale: number): number {\n // Values at or below baseReference stay unchanged\n if (Math.abs(baseValue) <= baseReference) {\n return Math.round(baseValue);\n }\n const scaled = baseValue + (baseValue - baseReference) * (scale - 1);\n return Math.round(scaled);\n}\n\n/**\n * Get the scale multiplier for a specific property and breakpoint\n * @param scales - The responsive scales configuration\n * @param property - The CSS property type (e.g., 'fontSize', 'padding')\n * @param breakpoint - The breakpoint name (e.g., 'tablet', 'mobile', 'small')\n */\nexport function getScaleMultiplier(\n scales: ResponsiveScales,\n property: CSSPropertyType,\n breakpoint: string,\n): number | null {\n const category = getScaleCategory(property);\n if (!category || !scales[category]) return null;\n\n const scaleConfig = scales[category] as BreakpointScales | undefined;\n return scaleConfig?.[breakpoint] ?? null;\n}\n\n/**\n * Parse multi-value CSS property (e.g., \"20px 40px\" for padding)\n * Handles both space-separated (\"20px 40px\") and hyphen-separated (\"20px-40px\") formats\n * Returns array of individual values\n */\nexport function parseMultiValue(valueStr: string): string[] {\n // First, convert hyphen separators to spaces (for class names like \"p-0-80px\" \u2192 \"0-80px\")\n // But only convert hyphens between values (digit/px followed by hyphen followed by digit/px)\n const normalized = valueStr.replace(/(?<=\\w)-(?=\\d|auto|inherit|initial|unset)/g, ' ');\n return normalized\n .trim()\n .split(/\\s+/)\n .filter((v) => v.length > 0);\n}\n\n/**\n * Scale a single CSS value using the responsive scale\n * Returns null if the value cannot be parsed (no unit)\n */\nexport function scaleValue(valueStr: string, baseReference: number, scale: number): string | null {\n const parsed = parseValue(valueStr);\n if (!parsed) return null;\n\n // `%` and `em` are already relative to their rendering context\n // (container / local font-size), so they should not be rescaled.\n if (parsed.unit === '%' || parsed.unit === 'em') {\n return valueStr.trim();\n }\n\n const scaledValue = calculateResponsiveValue(parsed.value, baseReference, scale);\n return `${scaledValue}${parsed.unit}`;\n}\n\n/**\n * Scale a potentially multi-value CSS property\n * e.g., \"20px 40px\" -> \"18px 36px\" (both values scaled independently)\n * Unitless values (0, auto, inherit) are kept as-is\n */\nexport function scalePropertyValue(valueStr: string, baseReference: number, scale: number): string | null {\n const parts = parseMultiValue(valueStr);\n if (parts.length === 0) return null;\n\n const scaledParts = parts.map((part) => {\n // Try to scale the value\n const scaled = scaleValue(part, baseReference, scale);\n if (scaled !== null) {\n return scaled;\n }\n // If it can't be scaled, keep it as-is (for unitless values like 0, auto, inherit)\n return part;\n });\n\n return scaledParts.join(' ');\n}\n\n/**\n * Get responsive values for all breakpoints\n * Returns object with calculated values for each breakpoint\n *\n * @param baseValue - The base CSS value (e.g., '67px')\n * @param property - The CSS property type (e.g., 'fontSize')\n * @param scales - The responsive scales configuration\n * @param breakpointNames - Optional array of breakpoint names to calculate values for.\n * If not provided, defaults to ['tablet', 'mobile'] for backward compatibility.\n */\nexport function getResponsiveValues(\n baseValue: string,\n property: CSSPropertyType,\n scales: ResponsiveScales,\n breakpointNames?: string[],\n): Record<string, string | null> {\n if (!scales.enabled) {\n return { base: baseValue };\n }\n\n const result: Record<string, string | null> = {\n base: baseValue,\n };\n\n const baseRef = scales.baseReference || 16;\n\n // Use provided breakpoint names or default to tablet/mobile for backward compatibility\n const breakpoints = breakpointNames ?? ['tablet', 'mobile'];\n\n // Calculate value for each breakpoint\n for (const breakpointName of breakpoints) {\n const scale = getScaleMultiplier(scales, property, breakpointName);\n if (scale !== null) {\n result[breakpointName] = scalePropertyValue(baseValue, baseRef, scale);\n }\n }\n\n return result;\n}\n\n/**\n * Resolve the effective value of a CSS variable at a given breakpoint.\n *\n * Precedence (mirrors generateVariablesCSS in cssGenerator.ts so the editor\n * widget stays in sync with what the browser will render):\n * 1. `breakpoint === 'base'` \u2192 variable.value\n * 2. explicit per-variable override \u2192 variable.scales[breakpoint]\n * 3. globally-scaled value (ResponsiveScales multiplier for variable.type)\n * 4. fallback \u2192 variable.value\n */\nexport function resolveVariableValueAtBreakpoint(\n variable: { value: string; type: string; scales?: Record<string, string> },\n breakpoint: string,\n responsiveScales?: ResponsiveScales | null,\n): string {\n if (breakpoint === 'base') return variable.value;\n\n const override = variable.scales?.[breakpoint];\n if (override !== undefined) return override;\n\n if (responsiveScales?.enabled && variable.type !== 'none') {\n const scale = getScaleMultiplier(responsiveScales, variable.type as CSSPropertyType, breakpoint);\n if (scale !== null) {\n const baseRef = responsiveScales.baseReference || 16;\n const scaled = scalePropertyValue(variable.value, baseRef, scale);\n if (scaled !== null) return scaled;\n }\n }\n\n return variable.value;\n}\n\n/**\n * Pick the smallest (most restrictive) breakpoint name from a config object,\n * by `breakpoint` field. Used in fluid mode to choose which scale multiplier\n * defines the MIN of the clamp.\n *\n * Returns null if there are no entries.\n */\nexport function getSmallestBreakpointName(\n breakpoints: Record<string, { breakpoint: number }> | undefined | null,\n): string | null {\n if (!breakpoints) return null;\n const entries = Object.entries(breakpoints);\n const firstEntry = entries[0];\n if (entries.length === 0 || firstEntry === undefined) return null;\n let smallestName = firstEntry[0];\n let smallestWidth = firstEntry[1].breakpoint;\n for (const [name, cfg] of entries) {\n if (cfg.breakpoint < smallestWidth) {\n smallestWidth = cfg.breakpoint;\n smallestName = name;\n }\n }\n return smallestName;\n}\n\n/**\n * Build a `clamp(MIN, intercept + slope*100vw, MAX)` expression that interpolates\n * linearly between (vpMin, MIN) and (vpMax, MAX).\n *\n * - `baseValue` is the desktop/MAX value in CSS units.\n * - `unit` is the CSS unit (\"px\", \"rem\", etc.) used for both bounds.\n * - `scale` is the multiplier applied at the small end (mobile). Reuses\n * `calculateResponsiveValue` so the same multipliers used in 'breakpoints'\n * mode produce the same MIN endpoint in 'fluid' mode.\n * - `vpMin` / `vpMax` are viewport widths in pixels.\n *\n * If MIN === MAX (e.g. value at or below baseReference, or scale === 1),\n * returns a plain `${baseValue}${unit}` \u2014 no clamp emitted.\n */\nexport function buildFluidClamp(\n baseValue: number,\n unit: string,\n scale: number,\n vpMin: number,\n vpMax: number,\n baseReference = 16,\n): string {\n const max = baseValue;\n const min = calculateResponsiveValue(baseValue, baseReference, scale);\n\n if (min === max || vpMax === vpMin) {\n return `${formatNumber(max)}${unit}`;\n }\n\n // Convert viewport bounds into the same unit as the value, so the\n // intercept term stays in `unit`. For px / rem we keep px throughout vw maths\n // but emit the intercept in the value's unit by converting (1rem = 16px).\n const unitToPx = unit === 'rem' ? 16 : 1;\n const minPx = min * unitToPx;\n const maxPx = max * unitToPx;\n const slopePx = (maxPx - minPx) / (vpMax - vpMin); // px per px-of-viewport\n const interceptPx = minPx - slopePx * vpMin; // px\n const interceptInUnit = interceptPx / unitToPx;\n const slopeVw = slopePx * 100; // because 1vw = viewport_width / 100 px\n\n return `clamp(${formatNumber(min)}${unit}, ${formatNumber(interceptInUnit)}${unit} + ${formatNumber(slopeVw)}vw, ${formatNumber(max)}${unit})`;\n}\n\n/**\n * Build a `clamp(MIN, intercept + slope*100vw, MAX)` expression where MIN is\n * supplied directly (e.g. from an authored mobile override) rather than\n * derived from `responsiveScales` \u00D7 `baseReference`.\n *\n * Used when a node has both `style.base.<prop>` and `style.mobile.<prop>` in\n * fluid mode \u2014 the mobile value is consumed as the clamp's small end so the\n * smooth interpolation lands exactly on the authored mobile value at the\n * narrow viewport, avoiding the jump that a separate @media override would\n * create.\n *\n * Same units / vw math as `buildFluidClamp`. Returns plain `${max}${unit}`\n * when MIN === MAX or the viewport range degenerates.\n */\nexport function buildFluidClampWithExplicitMin(\n minValue: number,\n maxValue: number,\n unit: string,\n vpMin: number,\n vpMax: number,\n): string {\n if (minValue === maxValue || vpMax === vpMin) {\n return `${formatNumber(maxValue)}${unit}`;\n }\n\n const unitToPx = unit === 'rem' ? 16 : 1;\n const minPx = minValue * unitToPx;\n const maxPx = maxValue * unitToPx;\n const slopePx = (maxPx - minPx) / (vpMax - vpMin);\n const interceptPx = minPx - slopePx * vpMin;\n const interceptInUnit = interceptPx / unitToPx;\n const slopeVw = slopePx * 100;\n\n return `clamp(${formatNumber(minValue)}${unit}, ${formatNumber(interceptInUnit)}${unit} + ${formatNumber(slopeVw)}vw, ${formatNumber(maxValue)}${unit})`;\n}\n\n/**\n * Trim noisy floating-point output (e.g. 21.81818181818182 \u2192 21.8182).\n */\nfunction formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n);\n return Number(n.toFixed(4)).toString();\n}\n\n/**\n * Build the CSS value for the `--site-margin` variable in fluid mode.\n * Always emits a clamp() going from `siteMargin.min` to `siteMargin.max` (px),\n * interpolated linearly across `fluidRange.min`..`fluidRange.max`.\n *\n * If `min === max` the function returns the plain value (no clamp).\n */\nexport function buildSiteMarginClamp(siteMargin: SiteMarginConfig, fluidRange: FluidRange): string {\n const { min, max } = siteMargin;\n const { min: vpMin, max: vpMax } = fluidRange;\n\n if (min === max || vpMax === vpMin) {\n return `${formatNumber(max)}px`;\n }\n\n const slopePx = (max - min) / (vpMax - vpMin);\n const interceptPx = min - slopePx * vpMin;\n const slopeVw = slopePx * 100;\n\n return `clamp(${formatNumber(min)}px, ${formatNumber(interceptPx)}px + ${formatNumber(slopeVw)}vw, ${formatNumber(max)}px)`;\n}\n\n/**\n * Build a fluid clamp() value for a CSS string value (e.g. \"32px\", \"2rem\").\n * Multi-value strings (\"20px 40px\") are scaled per-token, like\n * `scalePropertyValue` does for breakpoint mode. Tokens without a unit\n * (`0`, `auto`, `inherit`) are kept verbatim.\n *\n * Returns null if no token is scalable.\n */\nexport function buildFluidPropertyValue(\n valueStr: string,\n scale: number,\n vpMin: number,\n vpMax: number,\n baseReference = 16,\n): string | null {\n const parts = parseMultiValue(valueStr);\n if (parts.length === 0) return null;\n\n let anyScaled = false;\n const out = parts.map((part) => {\n const parsed = parseValue(part);\n if (!parsed) return part;\n if (parsed.unit === '%' || parsed.unit === 'em') return part;\n anyScaled = true;\n return buildFluidClamp(parsed.value, parsed.unit, scale, vpMin, vpMax, baseReference);\n });\n\n return anyScaled ? out.join(' ') : null;\n}\n\n/**\n * Default responsive scales configuration\n */\nexport const DEFAULT_RESPONSIVE_SCALES: ResponsiveScales = {\n enabled: false,\n mode: 'breakpoints',\n baseReference: 16,\n fluidRange: { ...DEFAULT_FLUID_RANGE },\n siteMargin: { ...DEFAULT_SITE_MARGIN },\n fontSize: {\n tablet: 0.88,\n mobile: 0.75,\n },\n padding: {\n tablet: 0.75,\n mobile: 0.5,\n },\n margin: {\n tablet: 0.7,\n mobile: 0.45,\n },\n gap: {\n tablet: 0.65,\n mobile: 0.4,\n },\n borderRadius: {\n tablet: 0.85,\n mobile: 0.7,\n },\n size: {\n tablet: 0.9,\n mobile: 0.75,\n },\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 {\n PropDefinition,\n ComponentDefinition,\n StructuredComponentDefinition,\n PageData,\n PageDataWithComponent,\n} 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 CMSDraftItemSchema,\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> = { valid: true; data: T } | { 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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\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>(data: unknown, schema: ZodType<T>): 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 {\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 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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\n ],\n };\n }\n}\n\n/**\n * Validate a CMS item (strict \u2014 used for published items and at publish time)\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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\n },\n ],\n };\n }\n}\n\n/**\n * Validate a CMS draft item (loose \u2014 used at draft-write time).\n * Drafts may be partial; even system identifiers are optional. Strict\n * validation re-runs on Publish.\n */\nexport function validateCMSDraftItem(data: unknown): ValidationResult<CMSItem> {\n try {\n const result = CMSDraftItemSchema.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 {\n path: 'root',\n message: error instanceof Error ? error.message : 'Unknown validation error',\n code: 'UNKNOWN',\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 /**\n * Backing store for the collection's items. `'cms'` (default/omitted) = file-backed items\n * under `cms/<id>/` (editable in Meno). `'sanity'` = read-only items fetched from a public\n * Sanity dataset at build/SSR (authored in Sanity Studio, never written by Meno); the template\n * page's `getStaticPaths` calls `getSanityData(documentType)` instead of `getCollection`.\n */\n source?: 'cms' | 'sanity';\n /** Sanity document `_type` to fetch (only when `source === 'sanity'`). */\n documentType?: string;\n /**\n * Which field to use for the URL slug. Omitted for a **data-only collection** \u2014 one\n * with no per-item route (structured data bound to lists/cards, e.g. Team, Testimonials,\n * Settings). When present, the collection has a template route.\n */\n slugField?: string;\n /**\n * URL pattern, e.g. `\"/blog/{{slug}}\"`. Omitted for a **data-only collection** (no\n * per-item route is emitted). Its absence is what marks a collection as data-only.\n */\n urlPattern?: string;\n /** Field definitions */\n fields: Record<string, CMSFieldDefinition>;\n /** Client-side data configuration for dynamic filtering */\n clientData?: CMSClientDataConfig;\n /**\n * Generate an RSS 2.0 feed for this collection at `<route-prefix>/rss.xml`\n * (e.g. a `/blog/{{slug}}` collection \u2192 `/blog/rss.xml`). Item title/description/date\n * are auto-detected from the schema fields by convention; the item link uses its\n * synthesized `_url`. Only meaningful for a routed collection (one with a `urlPattern`).\n */\n rss?: boolean;\n}\n\n/**\n * CMS Item - actual content entry (stored as individual JSON file).\n *\n * Identity model:\n * - `_id` is the canonical identifier. For new items written by the editor, it\n * equals the on-disk filename's stem (slug-shaped, human-readable). For\n * legacy items it may be a custom value (e.g. `\"post-001\"`) that differs\n * from the filename \u2014 those continue to work; reference resolution accepts\n * either `_id` or the on-disk filename as a key.\n * - `_filename` is a legacy alias kept for back-compat. The provider's\n * `normalizeItem` always sets it on read to the on-disk filename's stem, so\n * internal file-routing code can rely on it. New items do not need to\n * persist `_filename` to disk \u2014 write only `_id`.\n * - `_slug` is the oldest identifier alias, fully deprecated. Use `_id`.\n */\nexport interface CMSItem {\n /** Canonical identifier. For new items, equals the on-disk filename's stem. */\n _id: string;\n /**\n * @deprecated Use _id. Kept for backward compatibility.\n * Derived from the filename on disk.\n */\n _slug?: string;\n /**\n * @deprecated Legacy alias for _id. Always equals the on-disk filename's\n * stem; populated automatically by the file-system provider on read.\n * Internal file-routing code reads this for legacy items where the on-disk\n * filename differs from `_id`. New items do not need to write this to disk.\n */\n _filename?: string;\n /** ISO timestamp when item was created */\n _createdAt?: string;\n /**\n * Locale codes where this item is hidden from the live site.\n * undefined or [] = visible for all locales (backward compatible).\n * ['fr', 'de'] = French and German are hidden, other locales visible.\n *\n * NOTE: this is locale-level visibility (\"Hidden\" in the UI), NOT the WIP\n * draft-version concept. The draft version of an item is stored in a\n * sibling `{filename}.draft.json` file. The legacy `_draftLocales` name\n * is preserved for backward compatibility.\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 /**\n * Transient flag set when an item was loaded from a `{filename}.draft.json`\n * file (i.e. it is the draft version, not the published one). Never persisted.\n */\n _isDraft?: boolean;\n /**\n * Transient flag set on a published item when a draft sibling exists.\n * Used by the Studio item list to render a \"Has draft\" badge. Never persisted.\n */\n _hasDraft?: boolean;\n /** User-defined fields based on schema */\n [field: string]: unknown;\n}\n\n/**\n * Bundle of both versions of a CMS item, returned by editor APIs.\n * - `published` is omitted for draft-only items (new items not yet published).\n * - `draft` is omitted when there are no pending changes.\n */\nexport interface CMSItemVersions {\n published?: CMSItem;\n draft?: CMSItem;\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 * Coerce a name into a valid JS identifier for use as a `.map` loop variable / forwarded\n * prop name. Collection names allow `-`, `.` and spaces (e.g. \"case-study\"), none of which\n * are legal in an identifier \u2014 emitted raw they produce `list.map((case-study) => \u2026)`, a\n * SyntaxError. Kebab/space/dot separators camelCase together; a leading digit is prefixed.\n * Already-valid names pass through unchanged (no behavior change for typical collections).\n */\nfunction toIdentifier(name: string): string {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name)) return name;\n const parts = name.split(/[^A-Za-z0-9]+/).filter(Boolean);\n if (parts.length === 0) return 'item';\n const camel =\n parts[0] +\n parts\n .slice(1)\n .map((p) => p[0]!.toUpperCase() + p.slice(1))\n .join('');\n return /^[0-9]/.test(camel) ? `_${camel}` : camel;\n}\n\n/** Apply English plural\u2192singular rules (caller-facing identifier sanitization happens in {@link singularize}). */\nfunction singularizeRaw(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 (\n collection.endsWith('ses') ||\n collection.endsWith('xes') ||\n collection.endsWith('zes') ||\n collection.endsWith('ches') ||\n collection.endsWith('shes')\n ) {\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 * Convert a collection name to its singular form for use as item variable name.\n * Used when itemAs is not explicitly specified. The result is always a valid JS\n * identifier (the value is emitted as a `.map` loop variable), and a non-string/empty\n * input degrades to the generic `'item'` rather than throwing.\n *\n * @example\n * singularize('posts') // 'post'\n * singularize('categories') // 'category'\n * singularize('author') // 'author'\n * singularize('case-study') // 'caseStudy' (sanitized to a valid identifier)\n */\nexport function singularize(collection: string): string {\n if (typeof collection !== 'string' || collection === '') return 'item';\n return toIdentifier(singularizeRaw(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 * 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 type { Expression } from 'jsep';\nimport jsep 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 // Nullish coalescing: only fall through on null/undefined (NOT other falsy values).\n // jsep parses `??` as a BinaryExpression (already a supported node type); without this\n // case the operator switch below would throw and `a ?? b` would silently evaluate to\n // undefined. Combined with the MemberExpression null-guard above, `a?.b ?? c` evaluates\n // correctly \u2014 so these are real editable bindings, not pretend ones.\n if (binaryNode.operator === '??') {\n const left = evaluateNode(binaryNode.left, context);\n return left === null || left === undefined ? evaluateNode(binaryNode.right, context) : left;\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 '-':\n return (left as number) - (right as number);\n case '*':\n return (left as number) * (right as number);\n case '/':\n return (left as number) / (right as number);\n case '%':\n return (left as number) % (right as number);\n case '===':\n return left === right;\n case '!==':\n return left !== right;\n case '==':\n // biome-ignore lint/suspicious/noDoubleEquals: loose equality IS the semantics of the `==` operator in template expressions\n return left == right;\n case '!=':\n // biome-ignore lint/suspicious/noDoubleEquals: loose inequality IS the semantics of the `!=` operator in template expressions\n return left != right;\n case '<':\n return (left as number) < (right as number);\n case '>':\n return (left as number) > (right as number);\n case '<=':\n return (left as number) <= (right as number);\n case '>=':\n 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 ? evaluateNode(condNode.consequent, context) : 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 '!':\n return !arg;\n case '-':\n return -(arg as number);\n case '+':\n 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) => (el ? evaluateNode(el, context) : undefined));\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/**\n * jsep node types `evaluateNode` (above) can evaluate \u2014 the rest throw at runtime.\n *\n * SSOT: this set MUST stay in lockstep with the `case` labels in `evaluateNode`'s\n * switch. Drift is silent (lost code or literal `{{\u2026}}` in SSR output), so the\n * invariant is pinned by expressionEvaluator.test.ts \u2014 update both together.\n */\nexport const SUPPORTED_NODE_TYPES = new Set([\n 'Identifier',\n 'Literal',\n 'MemberExpression',\n 'BinaryExpression',\n 'LogicalExpression',\n 'ConditionalExpression',\n 'UnaryExpression',\n 'ArrayExpression',\n]);\n\n/** Child-expression slots jsep produces on the supported node types. */\nconst CHILD_KEYS = ['object', 'property', 'left', 'right', 'test', 'consequent', 'alternate', 'argument'];\n\n/** Recursively verify every node in a jsep AST is a type this evaluator supports. */\nfunction isSupportedNode(node: Expression | null | undefined): boolean {\n if (!node) return true;\n if (!SUPPORTED_NODE_TYPES.has(node.type)) return false; // CallExpression, Compound, \u2026\n const n = node as unknown as Record<string, unknown>;\n for (const key of CHILD_KEYS) {\n const child = n[key];\n if (child && typeof child === 'object' && 'type' in child) {\n if (!isSupportedNode(child as Expression)) return false;\n }\n }\n if (Array.isArray(n.elements)) {\n for (const el of n.elements) {\n if (el && !isSupportedNode(el as Expression)) return false;\n }\n }\n return true;\n}\n\n/**\n * True when `expression` is one the template engine can actually evaluate (see\n * {@link safeEvaluate}): jsep parses it and every node is a whitelisted type \u2014\n * identifier, member access, literal, the supported operators, ternary, or array.\n *\n * Returns false for anything with a function/method call (`x.toFixed(2)`), a compound\n * (`a, b`), or a syntax error. Those are arbitrary JS that the Meno model cannot\n * represent as a `{{template}}` binding \u2014 the meno-astro codec preserves them verbatim\n * instead of coercing them into a fake binding.\n */\nexport function isSupportedTemplateExpression(expression: string): boolean {\n const expr = expression.trim();\n if (!expr) return false;\n try {\n return isSupportedNode(jsep(expr));\n } catch {\n return false;\n }\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 * 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 { 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 (\n typeof value === 'object' &&\n '__richtext__' in value &&\n typeof (value as unknown as { html: string }).html === 'string'\n ) {\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 const 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(text: string, ctx: TemplateContext, resolveValue?: ValueResolver): 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 = match[1] ?? '';\n const fieldPath = match[2] ?? '';\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 // Treat a resolved null like undefined: fall back to string processing (yields\n // \"\") instead of letting a null CMS field become a null prop value, which can\n // then flow into a list `source` and crash with `null.length`.\n if (value === undefined || value === null) 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(template: string, ctx: TemplateContext): 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 = match[1] ?? '';\n const fieldPath = match[2] ?? '';\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(template: string, ctx: TemplateContext): unknown {\n // Match single template expression: {{varName.field}}\n const match = template.match(/^\\{\\{(\\w+)\\.([^}]+)\\}\\}$/);\n if (!match) return undefined;\n\n const varName = match[1] ?? '';\n const fieldPath = match[2] ?? '';\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(item: CMSItem, schema: CMSSchema, locale?: string, i18nConfig?: I18nConfig): CMSItem {\n // A data-only collection (no urlPattern/slugField) has no per-item URL \u2014 leave it off.\n if (!schema.urlPattern || !schema.slugField) return item;\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(items: CMSItem[], schema: CMSSchema, locale?: string, i18nConfig?: I18nConfig): 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 * 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(responsiveStyle: ResponsiveStyleObject | null | undefined): 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 {\n ComponentNode,\n ComponentInstanceNode,\n HtmlNode,\n SlotMarker,\n EmbedNode,\n LinkNode,\n LocaleListNode,\n ComponentDefinition,\n StructuredComponentDefinition,\n} from './types';\nimport type { ListNode } from './registry/nodeTypes/ListNodeType';\nimport type { IslandNode } from './registry/nodeTypes/IslandNodeType';\nimport type { CustomNode } from './registry/nodeTypes/CustomNodeType';\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',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n '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 * Whether a node stores its utility-class styling on `attributes.class` \u2014 the class-styling system's\n * `attributes.class` storage path. HTML elements plus the html-like content nodes (embed/link/markdown)\n * qualify: each carries a `style` AND an `attributes` map, and the codec already round-trips a class on\n * them. Component instances are NOT included here \u2014 they store on the `class` PROP (a separate\n * eligibility path; see isClassEligible / migrateOneNode, the two callers that must agree). Excluded:\n * list/island/slot/custom (`canHaveStyle:false` or no styling model) and locale-list (its root class is\n * not codec-wired yet \u2014 joins in Phase 2). Single source of truth for \"what can hold an `attributes.class`\".\n */\nexport function isClassStylableNode(node: ComponentNode | null | undefined): boolean {\n return (\n node?.type === NODE_TYPE.NODE ||\n node?.type === NODE_TYPE.EMBED ||\n node?.type === NODE_TYPE.LINK ||\n node?.type === NODE_TYPE.MARKDOWN\n );\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 const first = tag[0];\n return first !== undefined && first === first.toUpperCase() && first !== first.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 an island node (BYO framework component)\n */\nexport function isIslandNode(node: ComponentNode | null | undefined): node is IslandNode {\n return node?.type === NODE_TYPE.ISLAND;\n}\n\n/**\n * Type guard to check if a node is a custom node (opaque hand-authored `.astro`\n * component under `src/custom/` \u2014 Meno renders it but doesn't model its internals).\n */\nexport function isCustomNode(node: ComponentNode | null | undefined): node is CustomNode {\n return node?.type === NODE_TYPE.CUSTOM;\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 (\n type === NODE_TYPE.NODE ||\n type === NODE_TYPE.COMPONENT ||\n type === NODE_TYPE.SLOT ||\n type === NODE_TYPE.EMBED ||\n type === NODE_TYPE.LINK ||\n type === NODE_TYPE.LOCALE_LIST ||\n type === NODE_TYPE.LIST ||\n type === NODE_TYPE.ISLAND ||\n type === NODE_TYPE.CUSTOM ||\n type === NODE_TYPE.MARKDOWN ||\n type === 'cms-list'\n ); // 'cms-list' supported for migration\n}\n\n/**\n * Check if a node can have a children property (excludes SlotMarker and verbatim `{_code}` markers).\n * A `_code` marker is rendered byte-for-byte by the emitter, which ignores any `children` \u2014 so\n * letting the tree drop a node \"inside\" one would silently lose the dropped node on save/build.\n */\nexport function canHaveChildren(node: ComponentNode | null | undefined): node is Exclude<ComponentNode, SlotMarker> {\n return node !== null && node !== undefined && !isSlotMarker(node) && (node as { _code?: unknown })._code !== true;\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 (\n node != null &&\n typeof node === 'object' &&\n '_isSlotContent' in node &&\n (node as Record<string, unknown>)._isSlotContent === true\n );\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(node: ComponentNode, props?: Record<string, unknown>): 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 * 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 (!Number.isNaN(num) && Number.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] =\n validation.coercedValue !== undefined ? validation.coercedValue : 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 ? propDef.default : 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 * 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 ? children : childrenPropDef.default;\n } else {\n resolvedProps.children = Array.isArray(children) && children.length > 0 ? children : 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 ? children : propDef.default;\n } else {\n resolvedProps[propName] = passedProps[propName] !== undefined ? passedProps[propName] : propDef.default;\n }\n } else {\n if (propName === 'children') {\n resolvedProps.children = Array.isArray(children) && children.length > 0 ? children : 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 * Centralized configuration for utility class mappings\n * Single source of truth for property-to-class-root and CSS generation.\n *\n * Naming follows Tailwind CSS conventions:\n * - Static utilities reuse Tailwind's names: `flex`, `hidden`, `justify-center`,\n * `items-center`, `uppercase`, `whitespace-nowrap`, \u2026\n * - Arbitrary values use Tailwind's bracket syntax with spaces encoded as\n * underscores: `p-[40px]`, `w-[50%]`, `m-[92px_0]`, `grid-cols-[repeat(3,1fr)]`.\n * - CSS variables use Tailwind v4's parenthesis shorthand: `bg-(--primary)`,\n * `text-(--primary)`; font-size variables carry a type hint:\n * `text-(length:--font-size-lg)`.\n * - Responsive overrides use breakpoint-name variants: `tablet:p-[24px]`,\n * `mobile:text-[24px]`.\n */\n\n/**\n * Canonical property emission/sort order. Shorthands (border, background) come\n * before their longhands (borderColor, backgroundColor stays before backgroundImage)\n * so generated CSS cascades correctly. Includes ALL known properties \u2014 also the\n * ones without a value-carrying class root (statics-only / arbitrary-property).\n */\nexport const propertyOrder: string[] = [\n // Padding\n 'padding',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingInline',\n 'paddingBlock',\n // Margin\n 'margin',\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'marginInline',\n 'marginBlock',\n // Display & Layout\n 'display',\n 'flexDirection',\n 'justifyContent',\n 'alignItems',\n 'alignContent',\n 'flex',\n 'flexWrap',\n 'gap',\n 'rowGap',\n 'columnGap',\n // Sizing\n 'width',\n 'height',\n 'maxWidth',\n 'maxHeight',\n 'minWidth',\n 'minHeight',\n 'aspectRatio',\n // Colors & Background\n 'backgroundColor',\n 'background',\n 'backgroundImage',\n 'color',\n // Borders & Radius\n 'border',\n 'borderRadius',\n 'borderTop',\n 'borderRight',\n 'borderBottom',\n 'borderLeft',\n 'borderTopLeftRadius',\n 'borderTopRightRadius',\n 'borderBottomLeftRadius',\n 'borderBottomRightRadius',\n 'borderColor',\n // Text\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'textAlign',\n 'textDecoration',\n 'textTransform',\n 'lineHeight',\n 'letterSpacing',\n 'wordBreak',\n 'overflowWrap',\n 'textIndent',\n 'verticalAlign',\n 'whiteSpace',\n // Lists\n 'listStyle',\n 'listStyleType',\n 'listStylePosition',\n // Transform & Effects\n 'opacity',\n 'transform',\n 'translate',\n 'rotate',\n 'scale',\n 'transformOrigin',\n 'boxShadow',\n 'textShadow',\n 'filter',\n 'backdropFilter',\n 'backfaceVisibility',\n 'mixBlendMode',\n 'clipPath',\n // Positioning\n 'position',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'inset',\n 'insetInline',\n 'insetBlock',\n 'zIndex',\n // Grid Layout\n 'gridTemplateColumns',\n 'gridTemplateRows',\n 'gridTemplateAreas',\n 'gridGap',\n 'gridAutoFlow',\n 'gridColumn',\n 'gridColumnStart',\n 'gridColumnEnd',\n 'gridRow',\n 'gridRowStart',\n 'gridRowEnd',\n 'gridArea',\n 'gridAutoRows',\n 'gridAutoColumns',\n 'justifyItems',\n 'justifySelf',\n 'placeContent',\n 'placeItems',\n 'placeSelf',\n // Flexbox extras\n 'flexGrow',\n 'flexShrink',\n 'flexBasis',\n 'order',\n 'alignSelf',\n // Outline\n 'outline',\n 'outlineWidth',\n 'outlineStyle',\n 'outlineColor',\n 'outlineOffset',\n // Other\n 'overflow',\n 'overflowX',\n 'overflowY',\n 'cursor',\n 'pointerEvents',\n 'userSelect',\n 'transition',\n 'transitionProperty',\n 'transitionDuration',\n 'transitionTimingFunction',\n 'transitionDelay',\n 'objectFit',\n 'objectPosition',\n 'boxSizing',\n 'visibility',\n 'resize',\n 'scrollBehavior',\n 'accentColor',\n];\n\n/**\n * Mapping of CSS properties to Tailwind class roots \u2014 only for properties that\n * can carry a value (`root-[value]`, `root-(--var)`, `root-keyword`).\n * Properties whose values are always keywords (display, position, textAlign, \u2026)\n * live in `staticUtilities` instead; properties with no Tailwind root fall back\n * to arbitrary-property syntax `[clip-path:circle(50%)]`.\n *\n * Several properties intentionally SHARE a root (Tailwind semantics) and are\n * disambiguated by value type at parse time:\n * - `text` \u2192 color | fontSize\n * - `font` \u2192 fontWeight (numeric) | fontFamily\n * - `bg` \u2192 backgroundColor | backgroundImage (url()/gradients)\n * - `border` \u2192 border shorthand | borderColor\n * - `outline`\u2192 outline shorthand | outlineWidth | outlineColor\n */\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 // Flexbox\n flex: 'flex',\n gap: 'gap',\n rowGap: 'gap-y',\n columnGap: 'gap-x',\n flexGrow: 'grow',\n flexShrink: 'shrink',\n flexBasis: 'basis',\n order: 'order',\n\n // Sizing\n width: 'w',\n height: 'h',\n maxWidth: 'max-w',\n maxHeight: 'max-h',\n minWidth: 'min-w',\n minHeight: 'min-h',\n aspectRatio: 'aspect',\n\n // Colors & Background\n backgroundColor: 'bg',\n backgroundImage: 'bg',\n color: 'text',\n\n // Borders & Radius\n border: 'border',\n borderColor: 'border',\n borderTop: 'border-t',\n borderRight: 'border-r',\n borderBottom: 'border-b',\n borderLeft: 'border-l',\n borderRadius: 'rounded',\n borderTopLeftRadius: 'rounded-tl',\n borderTopRightRadius: 'rounded-tr',\n borderBottomLeftRadius: 'rounded-bl',\n borderBottomRightRadius: 'rounded-br',\n\n // Text\n fontSize: 'text',\n fontWeight: 'font',\n fontFamily: 'font',\n lineHeight: 'leading',\n letterSpacing: 'tracking',\n textIndent: 'indent',\n verticalAlign: 'align',\n\n // Lists\n listStyleType: 'list',\n\n // Transform & Effects\n opacity: 'opacity',\n transform: 'transform',\n transformOrigin: 'origin',\n boxShadow: 'shadow',\n textShadow: 'text-shadow',\n filter: 'filter',\n backdropFilter: 'backdrop-filter',\n\n // Positioning\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n left: 'left',\n inset: 'inset',\n zIndex: 'z',\n\n // Grid Layout\n gridTemplateColumns: 'grid-cols',\n gridTemplateRows: 'grid-rows',\n gridColumn: 'col',\n gridRow: 'row',\n gridAutoRows: 'auto-rows',\n gridAutoColumns: 'auto-cols',\n\n // Outline\n outline: 'outline',\n outlineWidth: 'outline',\n outlineColor: 'outline',\n outlineOffset: 'outline-offset',\n\n // Other\n overflow: 'overflow',\n overflowX: 'overflow-x',\n overflowY: 'overflow-y',\n cursor: 'cursor',\n transition: 'transition',\n objectPosition: 'object',\n accentColor: 'accent',\n};\n\n/**\n * Mapping of class roots to their DEFAULT CSS property (kebab-case).\n * Roots shared by several properties (text, font, bg, border, outline, object)\n * map to their most common property here; value-type disambiguation happens in\n * `resolveRootProperty` (utilityClassNames.ts).\n */\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 gap: 'gap',\n 'gap-y': 'row-gap',\n 'gap-x': 'column-gap',\n\n // Sizing\n w: 'width',\n h: 'height',\n size: 'width', // multi-prop (width + height) \u2014 expanded in generateRuleForClass / classesToStyles\n 'max-w': 'max-width',\n 'max-h': 'max-height',\n 'min-w': 'min-width',\n 'min-h': 'min-height',\n aspect: 'aspect-ratio',\n\n // Colors & Background\n bg: 'background-color',\n text: 'color',\n accent: 'accent-color',\n\n // Borders\n border: 'border',\n 'border-t': 'border-top',\n 'border-r': 'border-right',\n 'border-b': 'border-bottom',\n 'border-l': 'border-left',\n rounded: 'border-radius',\n 'rounded-tl': 'border-top-left-radius',\n 'rounded-tr': 'border-top-right-radius',\n 'rounded-bl': 'border-bottom-left-radius',\n 'rounded-br': 'border-bottom-right-radius',\n\n // Text\n font: 'font-weight',\n leading: 'line-height',\n tracking: 'letter-spacing',\n indent: 'text-indent',\n align: 'vertical-align',\n\n // Lists\n list: 'list-style-type',\n\n // Flexbox\n flex: 'flex',\n grow: 'flex-grow',\n shrink: 'flex-shrink',\n basis: 'flex-basis',\n order: 'order',\n\n // Grid\n 'grid-cols': 'grid-template-columns',\n 'grid-rows': 'grid-template-rows',\n col: 'grid-column',\n 'col-span': 'grid-column',\n 'col-start': 'grid-column-start',\n 'col-end': 'grid-column-end',\n row: 'grid-row',\n 'row-span': 'grid-row',\n 'row-start': 'grid-row-start',\n 'row-end': 'grid-row-end',\n 'auto-rows': 'grid-auto-rows',\n 'auto-cols': 'grid-auto-columns',\n\n // Effects\n opacity: 'opacity',\n transform: 'transform',\n scale: 'scale',\n rotate: 'rotate',\n 'translate-x': 'translate',\n 'translate-y': 'translate',\n origin: 'transform-origin',\n // Transitions (each maps to a distinct longhand \u2192 compose across classes)\n duration: 'transition-duration',\n delay: 'transition-delay',\n ease: 'transition-timing-function',\n shadow: 'box-shadow',\n 'text-shadow': 'text-shadow',\n filter: 'filter',\n 'backdrop-filter': 'backdrop-filter',\n\n // Positioning\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n left: 'left',\n inset: 'inset',\n 'inset-x': 'inset-inline',\n 'inset-y': 'inset-block',\n z: 'z-index',\n\n // Outline\n outline: 'outline',\n 'outline-offset': 'outline-offset',\n\n // Other\n overflow: 'overflow',\n 'overflow-x': 'overflow-x',\n 'overflow-y': 'overflow-y',\n cursor: 'cursor',\n transition: 'transition',\n object: 'object-position',\n};\n\n/**\n * Static utilities: property \u2192 value \u2192 Tailwind class name.\n * These are emitted as-is (no brackets) and have fixed reverse mappings.\n * When two values map to the same class (e.g. 'flex-start' and 'start' \u2192\n * `justify-start`), the FIRST entry is the canonical reverse value.\n */\nexport const staticUtilities: Record<string, Record<string, string>> = {\n display: {\n flex: 'flex',\n grid: 'grid',\n block: 'block',\n inline: 'inline',\n 'inline-block': 'inline-block',\n none: 'hidden',\n 'inline-flex': 'inline-flex',\n 'inline-grid': 'inline-grid',\n table: 'table',\n contents: 'contents',\n 'flow-root': 'flow-root',\n 'list-item': 'list-item',\n },\n flexDirection: {\n column: 'flex-col',\n row: 'flex-row',\n 'column-reverse': 'flex-col-reverse',\n 'row-reverse': 'flex-row-reverse',\n },\n flexWrap: {\n wrap: 'flex-wrap',\n nowrap: 'flex-nowrap',\n 'wrap-reverse': 'flex-wrap-reverse',\n },\n flex: {\n '1': 'flex-1',\n auto: 'flex-auto',\n none: 'flex-none',\n initial: 'flex-initial',\n },\n flexGrow: {\n '1': 'grow',\n '0': 'grow-0',\n },\n flexShrink: {\n '1': 'shrink',\n '0': 'shrink-0',\n },\n justifyContent: {\n center: 'justify-center',\n 'flex-start': 'justify-start',\n start: 'justify-start',\n 'flex-end': 'justify-end',\n end: 'justify-end',\n 'space-between': 'justify-between',\n 'space-around': 'justify-around',\n 'space-evenly': 'justify-evenly',\n stretch: 'justify-stretch',\n normal: 'justify-normal',\n },\n alignItems: {\n center: 'items-center',\n 'flex-start': 'items-start',\n start: 'items-start',\n 'flex-end': 'items-end',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n },\n alignContent: {\n center: 'content-center',\n 'flex-start': 'content-start',\n start: 'content-start',\n 'flex-end': 'content-end',\n end: 'content-end',\n 'space-between': 'content-between',\n 'space-around': 'content-around',\n 'space-evenly': 'content-evenly',\n stretch: 'content-stretch',\n normal: 'content-normal',\n },\n alignSelf: {\n auto: 'self-auto',\n center: 'self-center',\n 'flex-start': 'self-start',\n start: 'self-start',\n 'flex-end': 'self-end',\n end: 'self-end',\n stretch: 'self-stretch',\n baseline: 'self-baseline',\n },\n justifyItems: {\n center: 'justify-items-center',\n start: 'justify-items-start',\n end: 'justify-items-end',\n stretch: 'justify-items-stretch',\n },\n justifySelf: {\n auto: 'justify-self-auto',\n center: 'justify-self-center',\n start: 'justify-self-start',\n end: 'justify-self-end',\n stretch: 'justify-self-stretch',\n },\n placeContent: {\n center: 'place-content-center',\n start: 'place-content-start',\n end: 'place-content-end',\n 'space-between': 'place-content-between',\n 'space-around': 'place-content-around',\n 'space-evenly': 'place-content-evenly',\n stretch: 'place-content-stretch',\n },\n placeItems: {\n center: 'place-items-center',\n start: 'place-items-start',\n end: 'place-items-end',\n stretch: 'place-items-stretch',\n },\n placeSelf: {\n auto: 'place-self-auto',\n center: 'place-self-center',\n start: 'place-self-start',\n end: 'place-self-end',\n stretch: 'place-self-stretch',\n },\n position: {\n static: 'static',\n fixed: 'fixed',\n absolute: 'absolute',\n relative: 'relative',\n sticky: 'sticky',\n },\n overflow: {\n hidden: 'overflow-hidden',\n auto: 'overflow-auto',\n scroll: 'overflow-scroll',\n visible: 'overflow-visible',\n clip: 'overflow-clip',\n },\n overflowX: {\n hidden: 'overflow-x-hidden',\n auto: 'overflow-x-auto',\n scroll: 'overflow-x-scroll',\n visible: 'overflow-x-visible',\n clip: 'overflow-x-clip',\n },\n overflowY: {\n hidden: 'overflow-y-hidden',\n auto: 'overflow-y-auto',\n scroll: 'overflow-y-scroll',\n visible: 'overflow-y-visible',\n clip: 'overflow-y-clip',\n },\n textAlign: {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n justify: 'text-justify',\n start: 'text-start',\n end: 'text-end',\n },\n textDecoration: {\n underline: 'underline',\n overline: 'overline',\n 'line-through': 'line-through',\n none: 'no-underline',\n },\n textTransform: {\n uppercase: 'uppercase',\n lowercase: 'lowercase',\n capitalize: 'capitalize',\n none: 'normal-case',\n },\n whiteSpace: {\n normal: 'whitespace-normal',\n nowrap: 'whitespace-nowrap',\n pre: 'whitespace-pre',\n 'pre-wrap': 'whitespace-pre-wrap',\n 'pre-line': 'whitespace-pre-line',\n 'break-spaces': 'whitespace-break-spaces',\n },\n wordBreak: {\n normal: 'break-normal',\n 'break-all': 'break-all',\n 'keep-all': 'break-keep',\n 'break-word': 'break-word',\n },\n overflowWrap: {\n normal: 'wrap-normal',\n 'break-word': 'wrap-break-word',\n anywhere: 'wrap-anywhere',\n },\n fontWeight: {\n normal: 'font-normal',\n bold: 'font-bold',\n bolder: 'font-bolder',\n lighter: 'font-lighter',\n },\n color: {\n transparent: 'text-transparent',\n currentColor: 'text-current',\n inherit: 'text-inherit',\n },\n backgroundColor: {\n transparent: 'bg-transparent',\n currentColor: 'bg-current',\n inherit: 'bg-inherit',\n },\n backgroundImage: {\n none: 'bg-none',\n },\n borderColor: {\n transparent: 'border-transparent',\n currentColor: 'border-current',\n inherit: 'border-inherit',\n },\n pointerEvents: {\n none: 'pointer-events-none',\n auto: 'pointer-events-auto',\n },\n userSelect: {\n none: 'select-none',\n auto: 'select-auto',\n text: 'select-text',\n all: 'select-all',\n },\n objectFit: {\n contain: 'object-contain',\n cover: 'object-cover',\n fill: 'object-fill',\n none: 'object-none',\n 'scale-down': 'object-scale-down',\n },\n boxSizing: {\n 'border-box': 'box-border',\n 'content-box': 'box-content',\n },\n visibility: {\n visible: 'visible',\n hidden: 'invisible',\n collapse: 'collapse',\n },\n resize: {\n both: 'resize',\n horizontal: 'resize-x',\n vertical: 'resize-y',\n none: 'resize-none',\n },\n scrollBehavior: {\n smooth: 'scroll-smooth',\n auto: 'scroll-auto',\n },\n gridAutoFlow: {\n row: 'grid-flow-row',\n column: 'grid-flow-col',\n dense: 'grid-flow-dense',\n 'row dense': 'grid-flow-row-dense',\n 'column dense': 'grid-flow-col-dense',\n },\n listStyleType: {\n none: 'list-none',\n disc: 'list-disc',\n decimal: 'list-decimal',\n },\n listStylePosition: {\n inside: 'list-inside',\n outside: 'list-outside',\n },\n backfaceVisibility: {\n visible: 'backface-visible',\n hidden: 'backface-hidden',\n },\n transition: {\n none: 'transition-none',\n },\n transform: {\n none: 'transform-none',\n },\n boxShadow: {\n none: 'shadow-none',\n },\n outline: {\n none: 'outline-none',\n },\n};\n\n/**\n * Tailwind's default spacing scale: step name \u2192 CSS length (px). The forward\n * mapper emits the named step on an EXACT match (`padding: 16px` \u2192 `p-4`); any\n * off-scale value falls back to the arbitrary form (`p-[13px]`). The reverse map\n * (length \u2192 step) drives that lookup and the inverse parser.\n *\n * Values are px because Meno stores px, so `p-4` \u21C4 `16px` round-trips exactly;\n * rem output (when enabled) is applied downstream by the CSS generator (pxToRem),\n * never baked into the token.\n */\nexport const SPACING_SCALE: Record<string, string> = {\n '0': '0px',\n px: '1px',\n '0.5': '2px',\n '1': '4px',\n '1.5': '6px',\n '2': '8px',\n '2.5': '10px',\n '3': '12px',\n '3.5': '14px',\n '4': '16px',\n '5': '20px',\n '6': '24px',\n '7': '28px',\n '8': '32px',\n '9': '36px',\n '10': '40px',\n '11': '44px',\n '12': '48px',\n '14': '56px',\n '16': '64px',\n '20': '80px',\n '24': '96px',\n '28': '112px',\n '32': '128px',\n '36': '144px',\n '40': '160px',\n '44': '176px',\n '48': '192px',\n '52': '208px',\n '56': '224px',\n '60': '240px',\n '64': '256px',\n '72': '288px',\n '80': '320px',\n '96': '384px',\n};\n\n/** Reverse of SPACING_SCALE: CSS length (px) \u2192 step name (`16px` \u2192 `4`). */\nexport const SPACING_SCALE_REVERSE: Record<string, string> = (() => {\n const reverse: Record<string, string> = {};\n for (const [step, length] of Object.entries(SPACING_SCALE)) {\n reverse[length] = step;\n }\n return reverse;\n})();\n\n/**\n * Class roots that use the spacing scale. Tailwind shares one numeric scale\n * across padding, margin, gap, inset and sizing \u2014 `p-4`, `gap-6`, `mt-2`,\n * `top-4`, `w-64`, \u2026 Only roots listed here resolve a bare step name; keyword\n * values (`w-full`, `m-auto`) still win first, and negatives stay arbitrary.\n */\nexport const SPACING_SCALE_ROOTS: Set<string> = new Set([\n 'p',\n 'pt',\n 'pr',\n 'pb',\n 'pl',\n 'px',\n 'py',\n 'm',\n 'mt',\n 'mr',\n 'mb',\n 'ml',\n 'mx',\n 'my',\n 'gap',\n 'gap-x',\n 'gap-y',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'inset',\n 'inset-x',\n 'inset-y',\n 'w',\n 'h',\n 'size',\n 'min-w',\n 'min-h',\n 'max-w',\n 'max-h',\n 'basis',\n]);\n\n/**\n * Class roots whose bare-token value is a Meno color token (`bg-primary` \u2192\n * `var(--primary)`). The class-name counterpart of `colorTokenProps` (which is\n * keyed by camelCase CSS property). Used by the inverse parser to recognize\n * `bg-primary` / `text-text` / `border-border` etc.\n */\nexport const COLOR_TOKEN_ROOTS: Set<string> = new Set(['text', 'bg', 'border', 'accent', 'outline']);\n\n/** Reverse mapping for static utilities: class \u2192 { prop, value } (canonical value). */\nexport const staticUtilityReverse: Record<string, { prop: string; value: string }> = (() => {\n const reverse: Record<string, { prop: string; value: string }> = {};\n for (const [prop, values] of Object.entries(staticUtilities)) {\n for (const [value, className] of Object.entries(values)) {\n if (!reverse[className]) {\n reverse[className] = { prop, value };\n }\n }\n }\n return reverse;\n})();\n\n/**\n * Named keyword values per class root: `root-keyword` \u2192 CSS value.\n * Mirrors Tailwind's named sizes (`w-full`, `h-screen`, `m-auto`, `rounded-full`).\n */\nexport const keywordValues: Record<string, Record<string, string>> = {\n w: { auto: 'auto', full: '100%', screen: '100vw', fit: 'fit-content', min: 'min-content', max: 'max-content' },\n h: { auto: 'auto', full: '100%', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },\n 'max-w': { full: '100%', none: 'none', screen: '100vw', fit: 'fit-content', min: 'min-content', max: 'max-content' },\n 'max-h': { full: '100%', none: 'none', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },\n size: { auto: 'auto', full: '100%', fit: 'fit-content', min: 'min-content', max: 'max-content' },\n 'min-w': { auto: 'auto', full: '100%', fit: 'fit-content', min: 'min-content', max: 'max-content' },\n 'min-h': { auto: 'auto', full: '100%', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },\n m: { auto: 'auto' },\n mt: { auto: 'auto' },\n mr: { auto: 'auto' },\n mb: { auto: 'auto' },\n ml: { auto: 'auto' },\n mx: { auto: 'auto' },\n my: { auto: 'auto' },\n top: { auto: 'auto', full: '100%' },\n right: { auto: 'auto', full: '100%' },\n bottom: { auto: 'auto', full: '100%' },\n left: { auto: 'auto', full: '100%' },\n inset: { auto: 'auto', full: '100%' },\n basis: { auto: 'auto', full: '100%' },\n rounded: { none: '0', full: '9999px' },\n 'rounded-tl': { none: '0', full: '9999px' },\n 'rounded-tr': { none: '0', full: '9999px' },\n 'rounded-bl': { none: '0', full: '9999px' },\n 'rounded-br': { none: '0', full: '9999px' },\n z: { auto: 'auto' },\n leading: { normal: 'normal' },\n tracking: { normal: 'normal' },\n 'inset-x': { auto: 'auto', full: '100%' },\n 'inset-y': { auto: 'auto', full: '100%' },\n aspect: { auto: 'auto', square: '1 / 1', video: '16 / 9' },\n order: { first: '-9999', last: '9999', none: '0' },\n};\n\n/**\n * Roots whose plain lowercase keyword values pass through verbatim:\n * `cursor-pointer`, `align-middle`, `origin-center`, `object-center`, \u2026\n */\nexport const genericKeywordRoots: Set<string> = new Set(['cursor', 'align', 'origin', 'object', 'list']);\n\n/**\n * Roots that accept bare numeric values Tailwind-style: `z-10`, `order-2`,\n * `flex-2`, `grow-2`. (`opacity` is handled separately \u2014 Tailwind's 0\u2013100 scale.)\n */\nexport const integerValueRoots: Set<string> = new Set(['z', 'order', 'flex', 'grow', 'shrink']);\n\n/**\n * Properties whose values are color tokens by Meno convention: a bare token\n * (e.g. `primary`) refers to the CSS variable `--primary`. Forward: token \u2192\n * `root-(--token)`. Reverse: `root-(--token)` \u2192 bare token.\n */\nexport const colorTokenProps: Set<string> = new Set([\n 'color',\n 'backgroundColor',\n 'borderColor',\n 'accentColor',\n 'outlineColor',\n]);\n\n/**\n * Roots that accept Tailwind fractional values (`w-1/2` \u2192 `50%`, `top-1/3` \u2192 `33.333333%`).\n * Tailwind resolves `n/d` to `calc(n / d * 100%)` (pre-computed here to a plain percentage so\n * the value round-trips and renders without a calc). Sizing, position/inset, flex-basis and the\n * individual translate axes take fractions.\n */\nexport const FRACTION_ROOTS: Set<string> = new Set([\n 'w',\n 'h',\n 'size',\n 'min-w',\n 'min-h',\n 'max-w',\n 'max-h',\n 'basis',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'inset',\n 'inset-x',\n 'inset-y',\n 'translate-x',\n 'translate-y',\n]);\n\n/**\n * Class roots whose value is negatable with a leading `-` (`-mt-4`, `-top-2`, `-translate-x-1/2`,\n * `-rotate-3`). Mirrors Tailwind: margins, position/inset, translate and rotate. The inverse parser\n * strips the `-`, resolves the positive class, then negates the numeric/length/percentage value.\n */\nexport const NEGATABLE_ROOTS: Set<string> = new Set([\n 'm',\n 'mt',\n 'mr',\n 'mb',\n 'ml',\n 'mx',\n 'my',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'inset',\n 'inset-x',\n 'inset-y',\n 'translate-x',\n 'translate-y',\n 'rotate',\n]);\n\n/** Tailwind `ease-*` \u2192 `transition-timing-function` value. */\nexport const EASE_TIMING: Record<string, string> = {\n linear: 'linear',\n in: 'cubic-bezier(0.4, 0, 1, 1)',\n out: 'cubic-bezier(0, 0, 0.2, 1)',\n 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',\n initial: 'initial',\n};\n\n/**\n * Tailwind transition-enable classes \u2192 the `transition-property` list they animate. Emitted as the\n * `transition` shorthand with Tailwind's default 150ms / ease curve baked in, so a bare `transition`\n * animates standalone; a following `duration-*` / `ease-*` longhand still overrides duration/timing\n * (shorthand sorts before longhand). The empty key is the bare `transition` class.\n */\nexport const TRANSITION_PROPERTY_VALUES: Record<string, string> = {\n '': 'color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter',\n all: 'all',\n colors: 'color, background-color, border-color, text-decoration-color, fill, stroke',\n opacity: 'opacity',\n shadow: 'box-shadow',\n transform: 'transform, translate, scale, rotate',\n};\n\n/** Tailwind's default transition timing baked into the `transition` shorthand. */\nexport const TRANSITION_DEFAULT_TIMING = '150ms cubic-bezier(0.4, 0, 0.2, 1)';\n\n// ============================================================================\n// STYLE PRESETS\n// Predefined values for complex CSS properties (shadows, gradients, borders)\n// Usage: boxShadow: \"2\" \u2192 class \"shadow-2\" \u2192 \"box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1)\"\n// ============================================================================\n\n// Shadow presets: shadow-0, shadow-1, shadow-2, shadow-3, shadow-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: bg-gradient-1, bg-gradient-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: border-preset-0, border-preset-1\nexport const borderPresets: Record<string, string> = {\n '0': '1px solid var(--border)',\n '1': '1px solid var(--border-light)',\n};\n\n/** Reverse mapping for preset classes: class \u2192 { prop, value } (expanded value). */\nexport const presetClassReverse: Record<string, { prop: string; value: string }> = (() => {\n const reverse: Record<string, { prop: string; value: string }> = {};\n for (const [key, value] of Object.entries(shadowPresets)) {\n reverse[`shadow-${key}`] = { prop: 'boxShadow', value };\n }\n for (const [key, value] of Object.entries(gradientPresets)) {\n reverse[`bg-gradient-${key}`] = { prop: 'background', value };\n }\n for (const [key, value] of Object.entries(borderPresets)) {\n reverse[`border-preset-${key}`] = { prop: 'border', value };\n }\n return reverse;\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',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n // CSS color keywords\n 'transparent',\n 'currentcolor',\n // CSS-wide keywords (should never be wrapped in var())\n 'inherit',\n 'initial',\n 'unset',\n 'revert',\n]);\n\nexport function isCssNamedColor(value: string): boolean {\n return CSS_NAMED_COLORS.has(value.toLowerCase());\n}\n", "/**\n * Tailwind named-scale \u2192 CSS-variable theme table.\n *\n * Tailwind's *named* value scales (`text-lg`, `font-semibold`, `rounded-md`, `shadow-lg`,\n * `max-w-md`, `leading-tight`, `tracking-wide`, `font-sans`) have no single numeric mapping \u2014 each\n * name is a theme token. Meno is token-based, so the class resolves to a plain variable reference\n * with **no baked default** \u2014 it renders the project's variable when defined, and is inert when not\n * (Meno deliberately does NOT smuggle Tailwind's opinionated defaults into the render):\n *\n * `text-lg` \u2192 `font-size: var(--text-lg)`\n *\n * Define `--text-lg` (in `variables.json`) \u2192 `text-lg` uses it everywhere; leave it undefined \u2192\n * the declaration has no effect (use an arbitrary value like `text-[18px]` for a one-off). See the\n * styling docs for the authoring guidance.\n *\n * This table is the single source of truth for:\n * - the parser (`parseUtilityClass`): class \u2192 `var(--token)`\n * - the inverse mapper (`propertyValueToClass`): `var(--token)` \u2192 compact class\n * - `defaultTailwindThemeVariables()`: an OPT-IN starter set (Tailwind values) a user can choose\n * to create \u2014 it is never auto-applied and never a render fallback.\n */\n\nimport type { CSSVariable, VariableGroup, VariableType } from './types/variables';\n\n/** One Tailwind theme token: the class it backs, its CSS var, default value and UI grouping. */\nexport interface ThemeScaleEntry {\n /** Full utility class, e.g. `text-lg`, or the bare default (`rounded`, `shadow`). */\n className: string;\n /** The class root (`text`, `font`, `rounded`, `shadow`, `max-w`, `leading`, `tracking`). */\n root: string;\n /** CSS custom property, e.g. `--text-lg`. */\n cssVar: string;\n /** kebab-case CSS property the class targets. */\n property: string;\n /** Tailwind's default value \u2014 the starter value for the OPT-IN seed set, NOT a render fallback. */\n value: string;\n /** Variable picker group + scaling type for the seeded variable. */\n group: VariableGroup;\n /** Human label for the seeded variable, e.g. `Text LG`. */\n label: string;\n}\n\ntype ScaleSpec = {\n root: string;\n property: string;\n group: VariableGroup;\n /** Prefix for the css var; class is `${root}-${name}` (or bare `${root}` when name is ''). */\n varPrefix: string;\n /** Human label prefix for the seeded variable. */\n labelPrefix: string;\n /** [classSuffix, cssValue] pairs. '' suffix = the bare class (`rounded`, `shadow`). */\n values: [string, string][];\n};\n\nconst SANS = 'ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif';\nconst SERIF = 'ui-serif, Georgia, Cambria, serif';\nconst MONO = 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace';\n\nconst SPECS: ScaleSpec[] = [\n {\n root: 'text',\n property: 'font-size',\n group: 'font-size',\n varPrefix: 'text',\n labelPrefix: 'Text',\n values: [\n ['xs', '0.75rem'],\n ['sm', '0.875rem'],\n ['base', '1rem'],\n ['lg', '1.125rem'],\n ['xl', '1.25rem'],\n ['2xl', '1.5rem'],\n ['3xl', '1.875rem'],\n ['4xl', '2.25rem'],\n ['5xl', '3rem'],\n ['6xl', '3.75rem'],\n ['7xl', '4.5rem'],\n ['8xl', '6rem'],\n ['9xl', '8rem'],\n ],\n },\n {\n // Only the weights Meno's static utilities don't already cover (normal/bold stay static).\n root: 'font',\n property: 'font-weight',\n group: 'font-weight',\n varPrefix: 'font-weight',\n labelPrefix: 'Font Weight',\n values: [\n ['thin', '100'],\n ['extralight', '200'],\n ['light', '300'],\n ['medium', '500'],\n ['semibold', '600'],\n ['extrabold', '800'],\n ['black', '900'],\n ],\n },\n {\n root: 'font',\n property: 'font-family',\n group: 'font-family',\n varPrefix: 'font',\n labelPrefix: 'Font',\n values: [\n ['sans', SANS],\n ['serif', SERIF],\n ['mono', MONO],\n ],\n },\n {\n root: 'rounded',\n property: 'border-radius',\n group: 'border-radius',\n varPrefix: 'radius',\n labelPrefix: 'Radius',\n values: [\n ['', '0.25rem'],\n ['sm', '0.125rem'],\n ['md', '0.375rem'],\n ['lg', '0.5rem'],\n ['xl', '0.75rem'],\n ['2xl', '1rem'],\n ['3xl', '1.5rem'],\n ],\n },\n {\n root: 'shadow',\n property: 'box-shadow',\n group: 'shadow',\n varPrefix: 'shadow',\n labelPrefix: 'Shadow',\n values: [\n ['', '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)'],\n ['sm', '0 1px 2px 0 rgb(0 0 0 / 0.05)'],\n ['md', '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)'],\n ['lg', '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)'],\n ['xl', '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)'],\n ['2xl', '0 25px 50px -12px rgb(0 0 0 / 0.25)'],\n ],\n },\n {\n root: 'max-w',\n property: 'max-width',\n group: 'size',\n varPrefix: 'container',\n labelPrefix: 'Container',\n values: [\n ['xs', '20rem'],\n ['sm', '24rem'],\n ['md', '28rem'],\n ['lg', '32rem'],\n ['xl', '36rem'],\n ['2xl', '42rem'],\n ['3xl', '48rem'],\n ['4xl', '56rem'],\n ['5xl', '64rem'],\n ['6xl', '72rem'],\n ['7xl', '80rem'],\n ['prose', '65ch'],\n ],\n },\n {\n root: 'leading',\n property: 'line-height',\n group: 'line-height',\n varPrefix: 'leading',\n labelPrefix: 'Leading',\n values: [\n ['none', '1'],\n ['tight', '1.25'],\n ['snug', '1.375'],\n ['relaxed', '1.625'],\n ['loose', '2'],\n ],\n },\n {\n root: 'tracking',\n property: 'letter-spacing',\n group: 'letter-spacing',\n varPrefix: 'tracking',\n labelPrefix: 'Tracking',\n values: [\n ['tighter', '-0.05em'],\n ['tight', '-0.025em'],\n ['wide', '0.025em'],\n ['wider', '0.05em'],\n ['widest', '0.1em'],\n ],\n },\n];\n\n/** Size codes read better uppercased (`LG`, `2XL`); word names get title case (`Semibold`). */\nfunction labelSuffix(suffix: string): string {\n if (/^(xs|sm|md|lg|xl|\\dxl)$/.test(suffix)) return suffix.toUpperCase();\n return suffix.charAt(0).toUpperCase() + suffix.slice(1);\n}\n\n/** All theme entries, flattened. */\nexport const THEME_SCALE_ENTRIES: ThemeScaleEntry[] = SPECS.flatMap((spec) =>\n spec.values.map(([suffix, value]) => {\n const className = suffix ? `${spec.root}-${suffix}` : spec.root;\n const cssVar = suffix ? `--${spec.varPrefix}-${suffix}` : `--${spec.varPrefix}`;\n const label = suffix ? `${spec.labelPrefix} ${labelSuffix(suffix)}` : spec.labelPrefix;\n return { className, root: spec.root, cssVar, property: spec.property, value, group: spec.group, label };\n }),\n);\n\n/** className \u2192 entry (parser lookup). e.g. `text-lg`, `rounded`, `font-sans`. */\nexport const THEME_SCALE_BY_CLASS: ReadonlyMap<string, ThemeScaleEntry> = new Map(\n THEME_SCALE_ENTRIES.map((e) => [e.className, e]),\n);\n\n/** cssVar \u2192 entry (inverse-mapper lookup). e.g. `--text-lg` \u2192 `text-lg`. */\nexport const THEME_SCALE_BY_CSSVAR: ReadonlyMap<string, ThemeScaleEntry> = new Map(\n THEME_SCALE_ENTRIES.map((e) => [e.cssVar, e]),\n);\n\n/**\n * The CSS value a themed class resolves to: a plain `var(--token)` reference with no fallback.\n * Renders the project variable when defined, inert otherwise (token-based by design \u2014 no baked\n * Tailwind default in the render path).\n */\nexport function themeScaleValue(entry: ThemeScaleEntry): string {\n return `var(${entry.cssVar})`;\n}\n\n/** Map a variable group to its responsive-scaling type (mirrors getDefaultScalingType). */\nfunction scalingTypeFor(group: VariableGroup): VariableType {\n switch (group) {\n case 'font-size':\n return 'fontSize';\n case 'border-radius':\n return 'borderRadius';\n case 'size':\n return 'size';\n default:\n return 'none';\n }\n}\n\n/**\n * The full set of Tailwind theme tokens as Meno `CSSVariable`s, ready to merge into a project's\n * `variables.json`. Seeding makes the tokens visible/editable in the variable picker (filed under\n * their group); rendering does NOT require seeding \u2014 the class carries the Tailwind default as the\n * `var()` fallback. Idempotent merge is the caller's job (skip a `cssVar` that already exists).\n */\nexport function defaultTailwindThemeVariables(): CSSVariable[] {\n return THEME_SCALE_ENTRIES.map((e) => ({\n name: e.label,\n cssVar: e.cssVar,\n value: e.value,\n type: scalingTypeFor(e.group),\n group: e.group,\n }));\n}\n", "/**\n * Tailwind-style utility class name parsing & value encoding.\n *\n * Shared by the forward mapper (utilityClassMapper.ts) and the CSS generator\n * (cssGeneration.ts) so class names encode and decode identically everywhere.\n *\n * Class name grammar (after stripping an optional `breakpoint:` variant):\n * - static utilities: `flex`, `hidden`, `justify-center`, `uppercase`, \u2026\n * - presets: `shadow-2`, `bg-gradient-1`, `border-preset-0`\n * - arbitrary values: `p-[40px]`, `w-[50%]`, `m-[92px_0]` (spaces \u2192 `_`)\n * - CSS variables: `bg-(--primary)`, `text-(length:--font-size-lg)`\n * - named keywords: `w-full`, `h-screen`, `m-auto`, `rounded-full`\n * - bare numbers: `z-10`, `order-2`, `opacity-50` (= 0.5)\n * - arbitrary properties: `[clip-path:circle(50%)]`, `[background:\u2026]`\n * - hash fallback: `pt-h1y9pr6i` (value lives in the style-value registry)\n */\n\nimport {\n prefixToCSSProperty,\n staticUtilityReverse,\n presetClassReverse,\n keywordValues,\n genericKeywordRoots,\n integerValueRoots,\n propertyOrder,\n SPACING_SCALE,\n SPACING_SCALE_ROOTS,\n COLOR_TOKEN_ROOTS,\n FRACTION_ROOTS,\n NEGATABLE_ROOTS,\n EASE_TIMING,\n TRANSITION_PROPERTY_VALUES,\n TRANSITION_DEFAULT_TIMING,\n} from './utilityClassConfig';\nimport { isCssNamedColor } from './cssNamedColors';\nimport { THEME_SCALE_BY_CLASS, themeScaleValue } from './tailwindThemeScale';\n\n/** Class roots sorted longest-first so `border-t-\u2026` wins over `border-\u2026`. */\nexport const SORTED_ROOTS: readonly string[] = Object.keys(prefixToCSSProperty).sort((a, b) => b.length - a.length);\n\n/** Convert a camelCase style property to its kebab-case CSS name. */\nexport function camelToKebab(prop: string): string {\n return prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n// kebab-case CSS property \u2192 camelCase style property, for all known properties.\nconst kebabToCamelMap: Record<string, string> = (() => {\n const map: Record<string, string> = {};\n for (const prop of propertyOrder) {\n map[camelToKebab(prop)] = prop;\n }\n return map;\n})();\n\n/** Convert a kebab-case CSS property back to its camelCase style property. */\nexport function cssPropertyToCamel(property: string): string {\n return kebabToCamelMap[property] ?? property.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Roots that decode to a different camelCase property than their kebab CSS\n * property suggests (px \u2192 paddingInline, not padding).\n */\nexport const ROOT_CAMEL_OVERRIDES: Record<string, string> = {\n px: 'paddingInline',\n py: 'paddingBlock',\n mx: 'marginInline',\n my: 'marginBlock',\n};\n\n// ---------------------------------------------------------------------------\n// Arbitrary value encoding (Tailwind bracket convention: spaces \u2192 underscores)\n// ---------------------------------------------------------------------------\n\n/**\n * Apply `transform` to every part of `input` that is NOT inside a `url(...)`\n * segment. Tailwind preserves underscores inside url() \u2014 so do we, in both\n * encode and decode directions.\n */\nfunction transformOutsideUrl(input: string, transform: (segment: string) => string): string {\n let result = '';\n let i = 0;\n const lower = input.toLowerCase();\n while (i < input.length) {\n const idx = lower.indexOf('url(', i);\n if (idx === -1) {\n result += transform(input.slice(i));\n break;\n }\n result += transform(input.slice(i, idx));\n // Copy the url(...) segment verbatim up to its matching close paren\n let depth = 0;\n let j = idx + 3; // position of '('\n for (; j < input.length; j++) {\n if (input[j] === '(') depth++;\n else if (input[j] === ')') {\n depth--;\n if (depth === 0) {\n j++;\n break;\n }\n }\n }\n result += input.slice(idx, j);\n i = j;\n }\n return result;\n}\n\n/**\n * Encode a CSS value for a Tailwind arbitrary-value class: spaces become\n * underscores (`92px 0` \u2192 `92px_0`), and literal underscores are escaped as\n * `\\_` (`slide_in 2s` \u2192 `slide\\_in_2s`) so they survive the decode \u2014 the `\\_`\n * escape is CSS-selector-safe (`escapeCSSClassName` turns the `\\` into `\\\\`).\n *\n * Returns null when the value still can't be encoded reversibly \u2014 quotes,\n * brackets, stray backslashes, or whitespace/quotes inside url(). Those callers\n * fall back to a hash class + style-value registry entry (ephemeral; for the\n * class-string-as-source migration they must move to a structured remainder \u2014\n * see docs/meno-class-styling-migration.md \u00A75).\n */\nexport function encodeArbitraryValue(value: string): string | null {\n let ok = true;\n const encoded = transformOutsideUrl(value, (segment) => {\n // Quotes/brackets/backslash can't live safely in a class attribute or the\n // `[..]` value \u2014 reject (\u2192 side-channel). Underscores ARE representable via\n // the `\\_` escape, so they're allowed.\n if (/[\"'\\\\[\\]]/.test(segment)) ok = false;\n // Escape literal underscores BEFORE collapsing whitespace, so the\n // underscores we introduce for spaces aren't themselves escaped.\n return segment.replace(/_/g, '\\\\_').replace(/\\s+/g, '_');\n });\n if (!ok) return null;\n // Strip our own `\\_` escapes, then reject anything still problematic \u2014 those\n // chars can only have survived verbatim from inside a url(...) segment.\n const guardTarget = encoded.replace(/^\\[|\\]$/g, '').replace(/\\\\_/g, '');\n if (/[\\s\"'\\\\[\\]]/.test(guardTarget)) return null;\n return encoded;\n}\n\n/**\n * Decode a Tailwind arbitrary value: `\\_` \u2192 literal underscore and bare `_` \u2192\n * space, in a single pass (so an escaped underscore isn't first read as a\n * space). Content inside url(...) is left verbatim.\n */\nexport function decodeArbitraryValue(encoded: string): string {\n return transformOutsideUrl(encoded, (segment) => segment.replace(/\\\\_|_/g, (m) => (m === '\\\\_' ? '_' : ' ')));\n}\n\n// ---------------------------------------------------------------------------\n// Value-type classification (for roots shared by several properties)\n// ---------------------------------------------------------------------------\n\nconst FONT_SIZE_KEYWORDS = new Set([\n 'xx-small',\n 'x-small',\n 'small',\n 'medium',\n 'large',\n 'x-large',\n 'xx-large',\n 'xxx-large',\n 'larger',\n 'smaller',\n]);\n\n/** True when a value reads as a color (hex, color function, named color, var()). */\nexport function isColorValue(value: string): boolean {\n if (value.startsWith('#') || value.startsWith('var(')) return true;\n if (/^(rgb|rgba|hsl|hsla|oklch|oklab|lab|lch|hwb|color|color-mix)\\(/i.test(value)) return true;\n if (value === 'transparent' || value === 'currentColor' || value === 'currentcolor') return true;\n return isCssNamedColor(value);\n}\n\n/**\n * True for a bare Meno color token (e.g. `primary`, `background-light`) that\n * resolves to `var(--token)`. Rejects: named CSS colors / hex / color functions\n * / `transparent` / `currentColor` (those are real colors, not tokens), and the\n * Tailwind palette shape `word-<number>` (`gray-500`, `blue-600`) so foreign\n * Tailwind classes carried verbatim in `class=\"\"` aren't misread as Meno tokens.\n *\n * Shared by the forward mapper (token \u2192 `bg-primary`) and inverse parser\n * (`bg-primary` \u2192 `var(--primary)`) so the two stay symmetric.\n */\nexport function isBareColorTokenName(value: string): boolean {\n if (!/^[a-zA-Z][\\w-]*$/.test(value)) return false;\n if (isColorValue(value)) return false;\n if (/^[a-z]+-\\d/i.test(value)) return false;\n return true;\n}\n\n/** True when a `text-\u2026` value reads as a font-size (length/number/keyword). */\nfunction isFontSizeValue(value: string): boolean {\n if (/^[\\d.+-]/.test(value)) return true;\n if (/^(calc|clamp|min|max)\\(/i.test(value)) return true;\n return FONT_SIZE_KEYWORDS.has(value);\n}\n\n/** True when a `font-\u2026` value reads as a font-weight (numeric). */\nfunction isFontWeightValue(value: string): boolean {\n return /^\\d+(\\.\\d+)?$/.test(value);\n}\n\n/** True when a `bg-\u2026` value reads as a background-image (url()/gradients). */\nfunction isImageValue(value: string): boolean {\n return /^(url|linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient|repeating-conic-gradient|image-set|cross-fade|element)\\(/i.test(\n value,\n );\n}\n\n/** True for a single length token like `2px`, `0.5rem`, `-4px`. */\nfunction isLengthValue(value: string): boolean {\n return /^-?[\\d.]+[a-z%]*$/i.test(value);\n}\n\n/**\n * True when the value contains whitespace OUTSIDE any parentheses, i.e. it's a\n * multi-token shorthand (`1px solid red`) rather than a single token. A color\n * function like `rgba(0, 0, 0, 0)` or `color-mix(in srgb, \u2026)` carries internal\n * spaces but is still ONE token \u2014 those must not read as a shorthand, otherwise\n * a transparent `border-color` collapses into the `border` shorthand and stops\n * overriding the width/style declaration independently.\n */\nfunction hasTopLevelWhitespace(value: string): boolean {\n let depth = 0;\n for (let i = 0; i < value.length; i++) {\n const ch = value[i] ?? '';\n if (ch === '(') depth++;\n else if (ch === ')') depth = Math.max(0, depth - 1);\n else if (depth === 0 && /\\s/.test(ch)) return true;\n }\n return false;\n}\n\n/**\n * Resolve the CSS property for a class root, disambiguating Tailwind's shared\n * roots by value type (`text-[14px]` \u2192 font-size, `text-[#fff]` \u2192 color, \u2026).\n */\nexport function resolveRootProperty(root: string, value: string): string {\n switch (root) {\n case 'text':\n return isFontSizeValue(value) ? 'font-size' : 'color';\n case 'font':\n return isFontWeightValue(value) ? 'font-weight' : 'font-family';\n case 'bg':\n return isImageValue(value) ? 'background-image' : 'background-color';\n case 'border':\n return isColorValue(value) && !hasTopLevelWhitespace(value) ? 'border-color' : 'border';\n case 'outline': {\n if (hasTopLevelWhitespace(value) || value === 'none') return 'outline';\n if (isColorValue(value)) return 'outline-color';\n if (isLengthValue(value)) return 'outline-width';\n return 'outline';\n }\n default:\n return prefixToCSSProperty[root] ?? root;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Breakpoint variant prefix (`tablet:p-[24px]`)\n// ---------------------------------------------------------------------------\n\n/**\n * Split an optional `breakpoint:` variant prefix off a class name.\n * Arbitrary-property classes (`[grid-area:hero]`) never match \u2014 their colon\n * sits inside brackets, and the prefix segment must be a bare identifier.\n */\nexport function splitVariantPrefix(className: string): { breakpoint: string | null; base: string } {\n const match = className.match(/^([a-z][a-z0-9_-]*):(.+)$/);\n if (match) {\n return { breakpoint: match[1] ?? null, base: match[2] ?? className };\n }\n return { breakpoint: null, base: className };\n}\n\n/**\n * Tailwind's desktop-first (max-width) variant marker. Meno breakpoints cascade desktop\u2192mobile\n * (`base` = widest, narrower breakpoints override via `max-width`), which is exactly Tailwind's\n * `max-*` variant direction \u2014 so the class form is `max-<name>:` (`max-lg:p-4`), reading\n * unambiguously as \"this width and narrower\". A bare prefix would read as Tailwind's mobile-first\n * MIN-width (the opposite cascade), so the explicit `max-` keeps the class legible.\n */\nexport const DESKTOP_FIRST_VARIANT_PREFIX = 'max-';\n\n/**\n * Class-name aliases for Meno's two default breakpoints. The breakpoint IDENTITY stays `tablet`/\n * `mobile` everywhere (style model, UI labels, responsive-scales config) \u2014 only the emitted/parsed\n * CLASS STRING uses Tailwind's canonical scale names: `tablet` (max-width 1024px) \u21C4 `lg` (Tailwind's\n * lg = 1024px, an exact match), `mobile` (max-width 540px) \u21C4 `sm`. NB Meno keeps its 540px mobile\n * threshold even though Tailwind's `sm` is 640px. Custom breakpoints have no alias (use their own\n * name). Codec-only \u2014 nothing else in the system is renamed.\n */\nconst BREAKPOINT_NAME_TO_CLASS: Record<string, string> = { tablet: 'lg', mobile: 'sm' };\nconst CLASS_NAME_TO_BREAKPOINT: Record<string, string> = { lg: 'tablet', sm: 'mobile' };\n\n/** Build the class variant prefix for a breakpoint name: `tablet` \u2192 `max-lg:`, `mobile` \u2192 `max-sm:`. */\nexport function breakpointClassPrefix(breakpointName: string): string {\n const lower = breakpointName.toLowerCase();\n const aliased = BREAKPOINT_NAME_TO_CLASS[lower] ?? lower;\n return `${DESKTOP_FIRST_VARIANT_PREFIX}${aliased}:`;\n}\n\n/**\n * All class prefixes that resolve to a breakpoint, for READ-side recognition (write paths emit only\n * the canonical `breakpointClassPrefix`). For `tablet` this is the canonical `max-lg:`, the\n * un-aliased `max-tablet:` (emitted briefly before the alias landed), and the legacy bare `tablet:`\n * (pre-`max-` projects). Deliberately NOT the bare `lg:`/`sm:` \u2014 Meno never emitted those, and a bare\n * `lg:` is a foreign real-Tailwind (min-width) token we must not absorb.\n */\nexport function breakpointClassPrefixes(breakpointName: string): string[] {\n const lower = breakpointName.toLowerCase();\n const aliased = BREAKPOINT_NAME_TO_CLASS[lower];\n const prefixes = [`${DESKTOP_FIRST_VARIANT_PREFIX}${lower}:`, `${lower}:`]; // max-tablet:, tablet:\n if (aliased) prefixes.unshift(`${DESKTOP_FIRST_VARIANT_PREFIX}${aliased}:`); // max-lg: (canonical, first)\n return prefixes;\n}\n\n/**\n * Normalize a parsed variant segment (from {@link splitVariantPrefix}) to the INTERNAL breakpoint\n * name. The alias only applies behind the `max-` marker (a definite Meno desktop-first class):\n * `max-lg`/`max-sm` \u2192 `tablet`/`mobile`, `max-tablet` \u2192 `tablet`, `max-<custom>` \u2192 `<custom>`. Bare\n * segments pass through untouched \u2014 legacy Meno `tablet`/`mobile` map to themselves, and a foreign\n * bare `lg`/`hover` is left alone (so it stays a non-modeled / foreign token, never mis-absorbed).\n */\nexport function normalizeBreakpointVariant(variant: string | null): string | null {\n if (variant?.startsWith(DESKTOP_FIRST_VARIANT_PREFIX)) {\n const bare = variant.slice(DESKTOP_FIRST_VARIANT_PREFIX.length);\n return CLASS_NAME_TO_BREAKPOINT[bare] ?? bare;\n }\n return variant;\n}\n\n// ---------------------------------------------------------------------------\n// Class name parsing\n// ---------------------------------------------------------------------------\n\nexport interface ParsedUtilityClass {\n /** kebab-case CSS property the class targets */\n property: string;\n /** Decoded CSS value; null for hash classes (resolve via style-value registry) */\n value: string | null;\n /** The class root (`p`, `text`, `bg`, \u2026); null for statics/presets/arbitrary properties */\n root: string | null;\n kind: 'static' | 'preset' | 'arbitrary' | 'var' | 'keyword' | 'numeric' | 'hash' | 'arbitrary-property';\n}\n\nconst HASH_VALUE_RE = /^h[0-9a-z]+$/;\n\n/** Tailwind fraction \u2192 percentage (`1/2` \u2192 `50%`, `1/3` \u2192 `33.333333%`). Null when not `n/d`. */\nfunction resolveFraction(rest: string): string | null {\n const m = rest.match(/^(\\d+)\\/(\\d+)$/);\n if (!m) return null;\n const d = Number(m[2]);\n if (d === 0) return null;\n const pct = (Number(m[1]) / d) * 100;\n return `${pct.toFixed(6).replace(/\\.?0+$/, '')}%`;\n}\n\n/** Resolve a translate axis value: fraction, `full`, or a spacing-scale step. Null otherwise. */\nfunction resolveSpacingOrFraction(rest: string): string | null {\n const frac = resolveFraction(rest);\n if (frac != null) return frac;\n if (rest === 'full') return '100%';\n return SPACING_SCALE[rest] ?? null;\n}\n\n/**\n * Negate a resolved value for the leading-`-` Tailwind form. Plain numeric/length/percentage\n * tokens flip sign; `translate-y`'s `0 <y>` composite negates only the y token. Non-numeric values\n * (keywords, var(), calc) aren't negatable \u2192 null (the class stays unrecognized).\n */\nfunction negateCssValue(root: string, value: string): string | null {\n if (root === 'translate-y') {\n const m = value.match(/^0 (.+)$/);\n return m ? `0 -${m[1]}` : null;\n }\n return /^\\d/.test(value) ? `-${value}` : null;\n}\n\n/**\n * Parse a single (unprefixed) utility class name into its CSS property and\n * decoded value. Returns null for class names that aren't Meno utilities.\n *\n * `knownTokens` is the project's defined design-token names (color + variable\n * names). It gates the bare color-token form (`bg-primary` \u2192 `var(--primary)`):\n * `bg-<name>` is only read as a token when `<name>` is in this set. Without it,\n * `bg-<word>` stays UNRECOGNIZED \u2014 so foreign / authored classes (`text-wrapper`,\n * imported `bg-dark`) are never misclassified. The `var(--\u2026)` shorthand form\n * (`bg-(--primary)`) is self-describing and needs no token set.\n */\nexport function parseUtilityClass(className: string, knownTokens?: ReadonlySet<string>): ParsedUtilityClass | null {\n const stat = staticUtilityReverse[className];\n if (stat) {\n return { property: camelToKebab(stat.prop), value: stat.value, root: null, kind: 'static' };\n }\n\n // Bare `transition` enables Tailwind's default property set + 150ms ease curve.\n if (className === 'transition') {\n return {\n property: 'transition',\n value: `${TRANSITION_PROPERTY_VALUES['']} ${TRANSITION_DEFAULT_TIMING}`,\n root: 'transition',\n kind: 'keyword',\n };\n }\n\n // Leading-`-` negative form (`-mt-4`, `-top-2`, `-translate-y-1/2`, `-rotate-3`): parse the\n // positive class, then negate its value when the root is negatable. Not a negatable root or a\n // non-numeric value \u2192 unrecognized (don't misread foreign `-foo` classes as utilities).\n if (className.startsWith('-') && className.length > 1) {\n const positive = parseUtilityClass(className.slice(1), knownTokens);\n if (positive?.root && positive.value != null && NEGATABLE_ROOTS.has(positive.root)) {\n const negated = negateCssValue(positive.root, positive.value);\n if (negated != null) return { ...positive, value: negated };\n }\n return null;\n }\n\n const preset = presetClassReverse[className];\n if (preset) {\n return { property: camelToKebab(preset.prop), value: preset.value, root: null, kind: 'preset' };\n }\n\n // Tailwind named value scales (`text-lg`, `font-semibold`, `rounded-md`, `shadow-lg`, `max-w-md`,\n // `leading-tight`, `tracking-wide`, `font-sans`, + bare `rounded`/`shadow`). These resolve to a\n // plain `var(--token)` reference (no baked default \u2014 Meno is token-based): renders the project\n // variable when defined, inert when not. Checked after static/preset so `text-center`,\n // `font-bold`, `rounded-full`, `shadow-none`, `shadow-2` keep their existing meaning.\n const themed = THEME_SCALE_BY_CLASS.get(className);\n if (themed) {\n return { property: themed.property, value: themeScaleValue(themed), root: themed.root, kind: 'var' };\n }\n\n // Arbitrary property: [clip-path:circle(50%)], [background:linear-gradient(\u2026)]\n const arbProp = className.match(/^\\[([a-z-]+):(.+)\\]$/);\n if (arbProp) {\n return {\n property: arbProp[1] ?? '',\n value: decodeArbitraryValue(arbProp[2] ?? ''),\n root: null,\n kind: 'arbitrary-property',\n };\n }\n\n for (const root of SORTED_ROOTS) {\n if (!className.startsWith(`${root}-`)) continue;\n const rest = className.slice(root.length + 1);\n if (!rest) continue;\n const parsed = parseRootValue(root, rest, knownTokens);\n if (parsed) return parsed;\n }\n\n return null;\n}\n\nfunction parseRootValue(root: string, rest: string, knownTokens?: ReadonlySet<string>): ParsedUtilityClass | null {\n // Arbitrary value: root-[value]\n if (rest.startsWith('[') && rest.endsWith(']') && rest.length > 2) {\n const value = decodeArbitraryValue(rest.slice(1, -1));\n return { property: resolveRootProperty(root, value), value, root, kind: 'arbitrary' };\n }\n\n // CSS variable: root-(--name) / root-(length:--name)\n const varMatch = rest.match(/^\\((?:([a-z-]+):)?(--[\\w-]+)\\)$/);\n if (varMatch) {\n const hint = varMatch[1];\n const value = `var(${varMatch[2]})`;\n let property: string;\n if (root === 'text') {\n property = hint === 'length' ? 'font-size' : 'color';\n } else if (root === 'font') {\n // `font-*` is shared by font-weight and font-family; a var value is ambiguous, so the\n // emitter tags weight vars with a `number:` hint (see utilityClassMapper). Default to\n // font-family (the original behavior for an un-hinted var like `font-(--l-ff)`).\n property = hint === 'number' ? 'font-weight' : 'font-family';\n } else {\n property = resolveRootProperty(root, value);\n }\n return { property, value, root, kind: 'var' };\n }\n\n // Named keyword: w-full, m-auto, rounded-full\n const keyword = keywordValues[root]?.[rest];\n if (keyword !== undefined) {\n return { property: resolveRootProperty(root, keyword), value: keyword, root, kind: 'keyword' };\n }\n\n // Generic keyword roots: cursor-pointer, align-middle, origin-center, \u2026\n if (genericKeywordRoots.has(root) && /^[a-z][a-z-]*$/.test(rest)) {\n return { property: resolveRootProperty(root, rest), value: rest, root, kind: 'keyword' };\n }\n\n // Tailwind grid track scale: `grid-cols-3` \u2192 `repeat(3, minmax(0, 1fr))`,\n // `grid-rows-2` likewise, plus the `none` / `subgrid` keywords. Meno's own\n // form is the arbitrary `grid-cols-[1fr_1fr_1fr]` (handled above); this\n // additionally absorbs the bare Tailwind numeric scale that hand- and\n // AI-authored class strings reach for. Tailwind only defines the positive\n // integer scale, so `grid-cols-0` stays unrecognized.\n if (root === 'grid-cols' || root === 'grid-rows') {\n if (/^[1-9]\\d*$/.test(rest)) {\n const value = `repeat(${rest}, minmax(0, 1fr))`;\n return { property: prefixToCSSProperty[root] ?? root, value, root, kind: 'numeric' };\n }\n if (rest === 'none' || rest === 'subgrid') {\n return { property: prefixToCSSProperty[root] ?? root, value: rest, root, kind: 'keyword' };\n }\n }\n\n // Grid placement: `col-span-2` \u2192 grid-column: span 2 / span 2; `col-span-full` \u2192 1 / -1.\n if (root === 'col-span' || root === 'row-span') {\n const property = root === 'col-span' ? 'grid-column' : 'grid-row';\n if (rest === 'full') return { property, value: '1 / -1', root, kind: 'keyword' };\n if (/^[1-9]\\d*$/.test(rest)) return { property, value: `span ${rest} / span ${rest}`, root, kind: 'numeric' };\n }\n // Grid line start/end: `col-start-2`, `col-end-3`, `row-start-1`, `row-end-4` (+ `auto`).\n if (root === 'col-start' || root === 'col-end' || root === 'row-start' || root === 'row-end') {\n const property = prefixToCSSProperty[root] ?? root;\n if (rest === 'auto') return { property, value: 'auto', root, kind: 'keyword' };\n if (/^-?[1-9]\\d*$/.test(rest)) return { property, value: rest, root, kind: 'numeric' };\n }\n\n // Individual translate axis: `translate-x-4` \u2192 translate: 16px; `translate-y-1/2` \u2192 translate: 0 50%.\n if (root === 'translate-x' || root === 'translate-y') {\n const len = resolveSpacingOrFraction(rest);\n if (len != null) {\n const value = root === 'translate-x' ? len : `0 ${len}`;\n return { property: 'translate', value, root, kind: 'numeric' };\n }\n }\n // `scale-105` \u2192 scale: 1.05 (Tailwind's percentage-of-100 scale).\n if (root === 'scale' && /^\\d+$/.test(rest)) {\n return { property: 'scale', value: String(Number(rest) / 100), root, kind: 'numeric' };\n }\n // `rotate-45` \u2192 rotate: 45deg (negatives via the leading-`-` form).\n if (root === 'rotate' && /^\\d+(\\.\\d+)?$/.test(rest)) {\n return { property: 'rotate', value: `${rest}deg`, root, kind: 'numeric' };\n }\n // `duration-300` \u2192 transition-duration: 300ms; `delay-150` \u2192 transition-delay: 150ms.\n if ((root === 'duration' || root === 'delay') && /^\\d+$/.test(rest)) {\n return { property: prefixToCSSProperty[root] ?? root, value: `${rest}ms`, root, kind: 'numeric' };\n }\n // `ease-in-out` \u2192 transition-timing-function: cubic-bezier(\u2026).\n if (root === 'ease') {\n const timing = EASE_TIMING[rest];\n if (timing) return { property: 'transition-timing-function', value: timing, root, kind: 'keyword' };\n }\n // `transition-all` / `transition-colors` / \u2026 \u2192 the `transition` shorthand (bare `transition`\n // is handled in parseUtilityClass). A following `duration-*` / `ease-*` longhand still overrides.\n if (root === 'transition') {\n const props = TRANSITION_PROPERTY_VALUES[rest];\n if (props !== undefined) {\n return { property: 'transition', value: `${props} ${TRANSITION_DEFAULT_TIMING}`, root, kind: 'keyword' };\n }\n }\n\n // Numeric line-height on the spacing scale: `leading-6` \u2192 1.5rem (24px). Named leadings\n // (`leading-tight`) resolve to a var() earlier; `leading-normal` stays the `normal` keyword.\n if (root === 'leading') {\n const scale = SPACING_SCALE[rest];\n if (scale !== undefined) return { property: 'line-height', value: scale, root, kind: 'keyword' };\n }\n\n // Tailwind fractional values: `w-1/2` \u2192 50%, `top-1/3` \u2192 33.333333%, `basis-1/2` \u2192 50%.\n // (translate fractions are handled by the axis branch above.)\n if (FRACTION_ROOTS.has(root)) {\n const value = resolveFraction(rest);\n if (value != null) return { property: resolveRootProperty(root, value), value, root, kind: 'numeric' };\n }\n\n // Named spacing scale: p-4 \u2192 16px, gap-6 \u2192 24px (Tailwind's step table).\n if (SPACING_SCALE_ROOTS.has(root)) {\n const scaleVal = SPACING_SCALE[rest];\n if (scaleVal !== undefined) {\n return { property: resolveRootProperty(root, scaleVal), value: scaleVal, root, kind: 'keyword' };\n }\n }\n\n // Bare numbers: z-10, order-2, flex-2; opacity uses Tailwind's 0\u2013100 scale\n if (integerValueRoots.has(root) && /^-?\\d+$/.test(rest)) {\n return { property: prefixToCSSProperty[root] ?? root, value: rest, root, kind: 'numeric' };\n }\n if (root === 'opacity' && /^\\d{1,3}$/.test(rest)) {\n return { property: 'opacity', value: String(Number(rest) / 100), root, kind: 'numeric' };\n }\n\n // Bare design-token color (Meno convention): bg-primary \u2192 var(--primary),\n // text-text \u2192 var(--text), border-border \u2192 var(--border). Gated on the\n // project's `knownTokens` so `bg-<word>` is read as a token ONLY for a DEFINED\n // token name \u2014 foreign / authored classes (`text-wrapper`, imported `bg-dark`)\n // are left unrecognized. The token gate also resolves the `h\u2026`-token vs\n // hash-class ambiguity (a real hash class's `rest` is never a defined token).\n if (COLOR_TOKEN_ROOTS.has(root) && knownTokens?.has(rest)) {\n const value = `var(--${rest})`;\n return { property: resolveRootProperty(root, value), value, root, kind: 'var' };\n }\n\n // Hash fallback: value lives in the style-value registry\n if (HASH_VALUE_RE.test(rest)) {\n return { property: prefixToCSSProperty[root] ?? root, value: null, root, kind: 'hash' };\n }\n\n return null;\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 * Maps CSS property values to Tailwind-style 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, StyleValue } from './types';\nimport { isResponsiveStyle } from './styleUtils';\nimport {\n propertyMap,\n propertyOrder,\n staticUtilities,\n staticUtilityReverse,\n presetClassReverse,\n keywordValues,\n genericKeywordRoots,\n integerValueRoots,\n colorTokenProps,\n shadowPresets,\n gradientPresets,\n borderPresets,\n SPACING_SCALE_ROOTS,\n SPACING_SCALE_REVERSE,\n} from './utilityClassConfig';\nimport {\n camelToKebab,\n cssPropertyToCamel,\n encodeArbitraryValue,\n parseUtilityClass,\n splitVariantPrefix,\n breakpointClassPrefix,\n normalizeBreakpointVariant,\n resolveRootProperty,\n ROOT_CAMEL_OVERRIDES,\n isBareColorTokenName,\n} from './utilityClassNames';\nimport { registerStyleValue, registerDynamicStyle, getStyleValue, getDynamicStyle } from './styleValueRegistry';\nimport { THEME_SCALE_BY_CSSVAR } from './tailwindThemeScale';\nimport {\n SCALABLE_CSS_PROPERTIES,\n buildFluidClampWithExplicitMin,\n parseValue,\n DEFAULT_FLUID_RANGE,\n type ResponsiveScales,\n} from './responsiveScaling';\n\n/**\n * Check if a value is a StyleMapping object\n */\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' && value !== null && '_mapping' in value && (value as StyleMapping)._mapping === true\n );\n}\n\n/**\n * 32-bit FNV-1a hash, encoded as base36 (6-7 chars). Deterministic \u2014 same\n * input always produces the same hash, so duplicate complex values across\n * elements share a single class definition.\n */\nfunction shortHash(input: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(36);\n}\n\n/**\n * Whether the natural `root-(--x)` / `root-[value]` form would round-trip to a DIFFERENT property\n * than `prop`. Roots shared by a shorthand and a color/width longhand (`border` \u2192 border/borderColor,\n * `outline` \u2192 outline/outlineWidth/outlineColor) are disambiguated on parse by value type via\n * `resolveRootProperty` \u2014 so a color-looking value (notably any opaque `var(--x)`) bound to the\n * SHORTHAND reads back as the color longhand. Callers fall back to the explicit arbitrary-property\n * form (`[border:var(--x)]`) when this returns true.\n *\n * Mirrors the inverse parser's property derivation EXACTLY (`classToStyle`): `ROOT_CAMEL_OVERRIDES`\n * wins first (px \u2192 paddingInline, \u2026), else `resolveRootProperty`. Comparing kebab CSS names instead\n * would false-positive on those overridden roots (`px` resolves to `padding`, not `padding-inline`).\n */\nfunction rootFormMisresolves(root: string, prop: string, value: string): boolean {\n const parsedProp = ROOT_CAMEL_OVERRIDES[root] ?? cssPropertyToCamel(resolveRootProperty(root, value));\n return parsedProp !== prop;\n}\n\n/**\n * Converts a CSS property value to a Tailwind-style utility class name.\n * Examples:\n * { prop: \"padding\", value: \"16px\" } \u2192 \"p-4\" (exact scale step)\n * { prop: \"padding\", value: \"13px\" } \u2192 \"p-[13px]\" (off-scale \u2192 arbitrary)\n * { prop: \"display\", value: \"flex\" } \u2192 \"flex\"\n * { prop: \"color\", value: \"primary\" } \u2192 \"text-primary\"\n * { prop: \"width\", value: \"100%\" } \u2192 \"w-full\"\n * { prop: \"textOverflow\", value: \"ellipsis\" } \u2192 \"[text-overflow:ellipsis]\"\n *\n * Values that can't be encoded reversibly fall back to a hash class\n * (`pt-h1y9pr6i`) resolved through the style-value registry.\n */\nfunction propertyValueToClass(prop: string, value: string | number): string | null {\n let stringValue = String(value);\n\n // Tailwind theme token: a `var(--token)` value (or a legacy `var(--token, \u2026)` with fallback)\n // whose token is a known Tailwind scale var (and whose property matches) emits the compact class \u2014\n // `var(--text-lg)` \u2192 `text-lg`. Runs before the fontFamily comma-split below (which would shred a\n // multi-family `var()` fallback). The parser reconstructs the value from the class, so no registry\n // entry is needed.\n const varRef = stringValue.match(/^var\\((--[\\w-]+)(?:\\s*,[\\s\\S]*)?\\)$/);\n if (varRef) {\n const entry = THEME_SCALE_BY_CSSVAR.get(varRef[1] ?? '');\n if (entry && entry.property === camelToKebab(prop)) {\n return entry.className;\n }\n }\n\n // Strip outer quotes from fontFamily values (e.g. \"Space Grotesk\" \u2192 Space Grotesk)\n if (prop === 'fontFamily') {\n stringValue = stringValue\n .split(',')\n .map((font) => {\n const trimmed = font.trim();\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) || (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n })\n .join(', ');\n }\n\n // Static utilities (Tailwind names): display: flex \u2192 \"flex\", textAlign: center \u2192 \"text-center\"\n const staticClass = staticUtilities[prop]?.[stringValue];\n if (staticClass) {\n registerStyleValue(staticClass, stringValue);\n return staticClass;\n }\n\n // Preset values (e.g., boxShadow: \"2\" \u2192 shadow-2)\n const shadowPreset = shadowPresets[stringValue];\n if (prop === 'boxShadow' && shadowPreset) {\n const className = `shadow-${stringValue}`;\n registerStyleValue(className, shadowPreset);\n return className;\n }\n const gradientPreset = gradientPresets[stringValue];\n if ((prop === 'background' || prop === 'backgroundImage') && gradientPreset) {\n const className = `bg-gradient-${stringValue}`;\n registerStyleValue(className, gradientPreset);\n return className;\n }\n const borderPreset = borderPresets[stringValue];\n if (prop === 'border' && borderPreset) {\n const className = `border-preset-${stringValue}`;\n registerStyleValue(className, borderPreset);\n return className;\n }\n\n const root = propertyMap[prop];\n\n // Properties without a Tailwind root use arbitrary-property syntax:\n // textOverflow: ellipsis \u2192 \"[text-overflow:ellipsis]\"\n if (!root) {\n const cssProperty = camelToKebab(prop);\n const encoded = encodeArbitraryValue(stringValue);\n const className = encoded != null ? `[${cssProperty}:${encoded}]` : `${cssProperty}-h${shortHash(stringValue)}`;\n registerDynamicStyle(className, cssProperty, value);\n return className;\n }\n\n let className: string | null = null;\n\n // Named keyword values: width: 100% \u2192 w-full, margin: auto \u2192 m-auto\n const kwTable = keywordValues[root];\n if (kwTable) {\n for (const [keyword, cssValue] of Object.entries(kwTable)) {\n if (cssValue === stringValue) {\n className = `${root}-${keyword}`;\n break;\n }\n }\n }\n\n // Generic keyword roots: cursor: pointer \u2192 cursor-pointer, transformOrigin: center \u2192 origin-center\n if (!className && genericKeywordRoots.has(root) && /^[a-z][a-z-]*$/.test(stringValue)) {\n className = `${root}-${stringValue}`;\n }\n\n // Bare numeric values Tailwind-style: zIndex: 10 \u2192 z-10, opacity: 0.5 \u2192 opacity-50\n if (!className && integerValueRoots.has(root) && /^-?\\d+$/.test(stringValue)) {\n className = `${root}-${stringValue}`;\n }\n if (!className && prop === 'opacity') {\n const num = Number(stringValue);\n if (Number.isFinite(num) && num >= 0 && num <= 1) {\n const scaled = Math.round(num * 100);\n if (Math.abs(num * 100 - scaled) < 1e-9) {\n className = `opacity-${scaled}`;\n }\n }\n }\n\n // Named spacing scale (Tailwind steps): padding 16px \u2192 p-4, gap 24px \u2192 gap-6.\n // Only EXACT steps; off-scale values fall through to the arbitrary form below.\n // Keyword values (w-full, m-auto) are matched above, so they still win.\n if (!className && SPACING_SCALE_ROOTS.has(root)) {\n const step = SPACING_SCALE_REVERSE[stringValue];\n if (step !== undefined) {\n className = `${root}-${step}`;\n }\n }\n\n // Tailwind grid track scale: gridTemplateColumns \"repeat(3, minmax(0, 1fr))\" \u2192 grid-cols-3\n // (and gridTemplateRows \u2192 grid-rows-N, plus the none/subgrid keywords). Keeps grid-cols-N that\n // came in from hand/AI-authored class strings round-tripping to the compact form rather than\n // expanding to grid-cols-[repeat(3,_minmax(0,_1fr))]. Other track values (\"1fr 1fr 1fr\",\n // \"repeat(3, 1fr)\") have no compact Tailwind spelling and stay arbitrary.\n if (!className && (root === 'grid-cols' || root === 'grid-rows')) {\n const repeatMatch = stringValue.match(/^repeat\\(\\s*([1-9]\\d*)\\s*,\\s*minmax\\(\\s*0\\s*,\\s*1fr\\s*\\)\\s*\\)$/);\n if (repeatMatch) {\n className = `${root}-${repeatMatch[1]}`;\n } else if (stringValue === 'none' || stringValue === 'subgrid') {\n className = `${root}-${stringValue}`;\n }\n }\n\n // CSS variables: var(--x) \u2192 root-(--x). The `font-*` root is shared by font-weight and\n // font-family and is disambiguated by value type \u2014 but a `var(--x)` value is ambiguous, so\n // weight/size vars carry a Tailwind data-type hint (`number:` / `length:`) the parser reads\n // back. Without it a `fontWeight: var(--h-fw)` binding would resolve to `font-family` (an\n // invalid `font-family: 450`), dropping the weight entirely.\n if (!className) {\n const varMatch = stringValue.match(/^var\\((--[\\w-]+)\\)$/);\n if (varMatch) {\n const varName = (varMatch[1] ?? '').slice(2); // strip the leading `--`\n if (prop === 'fontSize') className = `text-(length:${varMatch[1]})`;\n else if (prop === 'fontWeight') className = `font-(number:${varMatch[1]})`;\n // The `border`/`outline` roots are shared by a shorthand and a color longhand\n // (`border` vs `borderColor`). The inverse parser disambiguates by value type, but a\n // `var(--x)` value is opaque and reads as a color \u2014 so `border-(--x)` would round-trip\n // to `borderColor`. When the prop is the shorthand/width longhand, fall back to the\n // unambiguous arbitrary-property form (`[border:var(--x)]`), which names it explicitly.\n else if (rootFormMisresolves(root, prop, stringValue)) {\n className = `[${camelToKebab(prop)}:${stringValue}]`;\n }\n // A `var(--token)` on a color-token prop IS a Meno token reference \u2192 emit the bare token\n // form (`bg-muted`), matching the bare-value path so `var(--muted)` and `muted` agree.\n // (Token-aware inverse recovers it; palette-shaped names fall through to the arbitrary form.)\n else if (colorTokenProps.has(prop) && isBareColorTokenName(varName)) {\n className = `${root}-${varName}`;\n }\n // A color var whose token name can't be a bare token \u2014 a CSS color name (`--salmon`) or a\n // palette-shaped name (`--text-100`). The `root-(--x)` shorthand would reverse to the BARE\n // value (classToStyle strips `var()` for color props), losing the variable \u2014 and a CSS-color\n // name would then render as the literal color. The arbitrary form keeps `var(--x)` exact and\n // round-trips losslessly (`bg-[var(--x)]` \u2192 `var(--x)`), so the value can live in a class.\n else if (colorTokenProps.has(prop)) {\n className = `${root}-[var(${varMatch[1]})]`;\n } else className = `${root}-(${varMatch[1]})`;\n }\n }\n\n // Bare color tokens (Meno convention): color: \"primary\" \u2192 text-primary\n if (!className && colorTokenProps.has(prop) && isBareColorTokenName(stringValue)) {\n className = `${root}-${stringValue}`;\n }\n\n // Arbitrary value (Tailwind bracket syntax): padding: \"92px 0\" \u2192 p-[92px_0]\n if (!className) {\n const encoded = encodeArbitraryValue(stringValue);\n if (encoded != null) {\n // Same shorthand/longhand guard as the var branch: a bare color value bound to the\n // `border`/`outline` shorthand would parse back as the color longhand, so name the\n // property explicitly via the arbitrary-property form instead of `root-[\u2026]`.\n className = rootFormMisresolves(root, prop, stringValue)\n ? `[${camelToKebab(prop)}:${encoded}]`\n : `${root}-[${encoded}]`;\n }\n }\n\n // Hash-fallback for values that can't be encoded reversibly (quotes,\n // brackets, literal underscores). The original value is preserved in the\n // style-value registry for the CSS generator.\n if (!className) {\n className = `${root}-h${shortHash(stringValue)}`;\n }\n\n // Register original value for CSS generation (single registration point)\n registerStyleValue(className, value);\n return className;\n}\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 propertyOrder 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(styles: StyleObject | Record<string, string | number> | null | undefined): string[] {\n if (!styles) return [];\n\n // Sort properties by their canonical order\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 if (value === undefined) continue;\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]\", \"tablet:p-[24px]\"]\n *\n * Also handles flat merged style objects:\n * Example: { padding: \"10px\", display: \"flex\" } \u2192 [\"p-[10px]\", \"flex\"]\n */\n/** Values that don't make sense in a fluid container pattern. Mirrors cssGeneration.ts. */\nconst CONTAINER_RESERVED_VALUES = new Set(['auto', 'inherit', 'initial', 'unset', '']);\n\n/**\n * Detect \"container intent\" (width === maxWidth) on a flat StyleObject and\n * rewrite into the fluid container pattern. Used by `responsiveStylesToClasses`\n * when its caller signals fluid mode is active.\n *\n * Mirrors `applyContainerPattern` in cssGeneration.ts \u2014 kept as a private\n * helper here to avoid a cross-module import in this hot path.\n */\nfunction transformContainerIntent(style: StyleObject): StyleObject {\n const w = style.width;\n const mw = style.maxWidth;\n if (w == null || mw == null) return style;\n if (typeof w !== 'string' || typeof mw !== 'string') return style;\n if (w !== mw) return style;\n if (CONTAINER_RESERVED_VALUES.has(w.trim())) return style;\n return {\n ...style,\n width: 'calc(100% - var(--site-margin) * 2)',\n marginLeft: 'auto',\n marginRight: 'auto',\n };\n}\n\n/**\n * In fluid mode, consume per-node mobile overrides for scalable properties\n * into the base's `clamp()` value. The mobile value becomes the clamp's MIN\n * (small-viewport endpoint), the base stays as MAX. The mobile property is\n * then stripped from the mobile slice so no `mobile:*` @media rule is emitted\n * for it \u2014 avoiding the jump at the mobile breakpoint that a hard override\n * would create.\n *\n * Non-scalable mobile properties (display, flex-direction, etc.) are left\n * alone. Tablet is also untouched \u2014 explicit per-tablet overrides keep their\n * @media behavior for now.\n *\n * Bails out when units mismatch, parsing fails, or the registered values\n * aren't plain numeric+unit strings \u2014 those cases fall back to today's\n * behavior (mobile emits its own `mobile:*` rule).\n */\nfunction consumeMobileIntoBaseClamp(\n base: StyleObject,\n mobile: StyleObject,\n responsiveScales: ResponsiveScales,\n): { patchedBase: StyleObject; patchedMobile: StyleObject } {\n const fluidRange = responsiveScales.fluidRange ?? DEFAULT_FLUID_RANGE;\n const patchedBase: StyleObject = { ...base };\n const patchedMobile: StyleObject = { ...mobile };\n\n for (const prop of Object.keys(base)) {\n if (!SCALABLE_CSS_PROPERTIES.has(prop)) continue;\n const mobileRaw = mobile[prop];\n if (mobileRaw == null || mobileRaw === '') continue;\n\n const baseRaw = base[prop];\n if (baseRaw == null || baseRaw === '') continue;\n if (typeof baseRaw !== 'string' && typeof baseRaw !== 'number') continue;\n if (typeof mobileRaw !== 'string' && typeof mobileRaw !== 'number') continue;\n\n const baseParsed = parseValue(String(baseRaw));\n const mobileParsed = parseValue(String(mobileRaw));\n if (!baseParsed || !mobileParsed) continue;\n if (baseParsed.unit !== mobileParsed.unit) continue;\n if (baseParsed.unit === '%' || baseParsed.unit === 'em') continue;\n\n const clampValue = buildFluidClampWithExplicitMin(\n mobileParsed.value,\n baseParsed.value,\n baseParsed.unit,\n fluidRange.min,\n fluidRange.max,\n );\n\n patchedBase[prop] = clampValue;\n delete patchedMobile[prop];\n }\n\n return { patchedBase, patchedMobile };\n}\n\nexport function responsiveStylesToClasses(\n styles: StyleObject | ResponsiveStyleObject | null | undefined,\n options?: { fluidActive?: boolean; responsiveScales?: ResponsiveScales },\n): string[] {\n if (!styles) return [];\n const fluidActive = options?.fluidActive === true;\n const responsiveScales = options?.responsiveScales;\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 // In fluid mode, fold per-node scalable mobile overrides into the base's\n // clamp() so they become the small-viewport endpoint instead of a hard\n // @media jump. Falls back to original base/mobile when prerequisites\n // aren't met.\n let baseSource = responsiveStyles.base;\n let mobileSource = responsiveStyles.mobile;\n if (fluidActive && responsiveScales?.enabled === true && baseSource && mobileSource) {\n const { patchedBase, patchedMobile } = consumeMobileIntoBaseClamp(baseSource, mobileSource, responsiveScales);\n baseSource = patchedBase;\n mobileSource = patchedMobile;\n }\n\n // Base styles (no prefix)\n if (baseSource) {\n const base = fluidActive ? transformContainerIntent(baseSource) : baseSource;\n classes.push(...stylesToClasses(base));\n }\n\n // Tablet styles (tablet: variant prefix)\n if (responsiveStyles.tablet) {\n const tablet = fluidActive ? transformContainerIntent(responsiveStyles.tablet) : responsiveStyles.tablet;\n const tabletClasses = stylesToClasses(tablet);\n const prefix = breakpointClassPrefix('tablet');\n classes.push(...tabletClasses.map((cls) => `${prefix}${cls}`));\n }\n\n // Mobile styles (mobile: variant prefix)\n if (mobileSource && Object.keys(mobileSource).length > 0) {\n const mobile = fluidActive ? transformContainerIntent(mobileSource) : mobileSource;\n const mobileClasses = stylesToClasses(mobile);\n const prefix = breakpointClassPrefix('mobile');\n classes.push(...mobileClasses.map((cls) => `${prefix}${cls}`));\n }\n } else {\n // Flat style object - treat all as base classes\n const flat = fluidActive ? transformContainerIntent(styles as StyleObject) : (styles as StyleObject);\n classes.push(...stylesToClasses(flat));\n }\n\n return classes;\n}\n\n/**\n * Parse a utility class back to CSS property and value\n * Example: \"p-[10px]\" \u2192 { prop: \"padding\", value: \"10px\" }\n */\nexport function classToStyle(\n className: string,\n knownTokens?: ReadonlySet<string>,\n): { prop: string; value: string } | null {\n // Remove responsive variant prefix for parsing (tablet:p-[10px] \u2192 p-[10px])\n const { base: cleanClass } = splitVariantPrefix(className);\n\n // Static utilities and presets have fixed reverse mappings\n if (staticUtilityReverse[cleanClass]) {\n return staticUtilityReverse[cleanClass];\n }\n if (presetClassReverse[cleanClass]) {\n return presetClassReverse[cleanClass];\n }\n\n const parsed = parseUtilityClass(cleanClass, knownTokens);\n\n if (!parsed) {\n // Dynamic (arbitrary-property hash) classes registered for unknown roots\n const dynamic = getDynamicStyle(cleanClass);\n if (dynamic) {\n return { prop: cssPropertyToCamel(dynamic.property), value: String(dynamic.value) };\n }\n return null;\n }\n\n if (parsed.kind === 'arbitrary-property') {\n return { prop: cssPropertyToCamel(parsed.property), value: parsed.value! };\n }\n\n // Hash-fallback class \u2014 value is `h<base36>`, the real CSS value lives in\n // the style-value registry (set when the class was minted from a complex\n // value that wouldn't fit in a class name). Pull the real value back out\n // so editor reads see the original expression.\n if (parsed.kind === 'hash') {\n const registered = getStyleValue(cleanClass);\n if (registered == null) return null;\n const value = String(registered);\n const root = parsed.root!;\n const prop = ROOT_CAMEL_OVERRIDES[root] ?? cssPropertyToCamel(resolveRootProperty(root, value));\n return { prop, value };\n }\n\n const root = parsed.root;\n const prop = root && ROOT_CAMEL_OVERRIDES[root] ? ROOT_CAMEL_OVERRIDES[root] : cssPropertyToCamel(parsed.property);\n let value = parsed.value!;\n\n // Color token props store bare tokens (var(--primary) \u2192 \"primary\")\n if (parsed.kind === 'var' && colorTokenProps.has(prop)) {\n value = value.replace(/^var\\(--([\\w-]+)\\)$/, '$1');\n }\n\n return { prop, value };\n}\n\n/**\n * Convert utility classes back to a style object\n * Example: [\"p-[10px]\", \"tablet:p-[24px]\"] \u2192 { base: { padding: \"10px\" }, tablet: { padding: \"24px\" } }\n */\nexport function classesToStyles(classes: string[], knownTokens?: ReadonlySet<string>): ResponsiveStyleObject | null {\n const styles: ResponsiveStyleObject = { base: {}, tablet: {}, mobile: {} };\n\n for (const className of classes) {\n const { breakpoint: variant, base: cleanClass } = splitVariantPrefix(className);\n // Accept both the current desktop-first form (`max-tablet:`) and the legacy bare form (`tablet:`).\n const bp = normalizeBreakpointVariant(variant);\n const breakpoint: 'base' | 'tablet' | 'mobile' = bp === 'tablet' ? 'tablet' : bp === 'mobile' ? 'mobile' : 'base';\n\n const styleEntry = classToStyle(cleanClass, knownTokens);\n if (styleEntry) {\n if (!styles[breakpoint]) {\n styles[breakpoint] = {};\n }\n styles[breakpoint]![styleEntry.prop] = styleEntry.value;\n // `size-*` is width AND height (no CSS shorthand) \u2014 restore both so the editor doesn't\n // drop height on the next save. classToStyle returns the width half; mirror it to height.\n if (cleanClass.startsWith('size-') && styleEntry.prop === 'width') {\n styles[breakpoint]!.height = styleEntry.value;\n }\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 the object when ANY breakpoint carries a declaration \u2014 not only base. A class string\n // can legitimately style just a narrower breakpoint (e.g. \"tablet:p-[16px]\"), and dropping it to\n // null there would lose class-string styling for that node (class-styling adapter, \u00A711).\n const hasAny =\n Object.keys(styles.base || {}).length > 0 ||\n Object.keys(styles.tablet || {}).length > 0 ||\n Object.keys(styles.mobile || {}).length > 0;\n return hasAny ? styles : null;\n}\n\n/**\n * Whether a single style value can be stored as a STATIC utility class. Static strings (no\n * `{{template}}`) and numbers can; template-bearing strings and `_mapping` objects cannot \u2014 a\n * template would mint a broken `p-[{{x}}px]`, and a mapping is prop-driven. The latter must stay in\n * the `style` object (rendered via the runtime var-bridge / `class:list`). This is the boundary that\n * lets styling default to class storage while keeping dynamic values correct.\n */\nexport function isClassableStyleValue(value: unknown): boolean {\n if (typeof value === 'number') return true;\n if (typeof value === 'string') return !value.includes('{{');\n return false;\n}\n\nfunction splitStyleBucket(bucket: StyleObject): {\n classable: StyleObject;\n residual: StyleObject;\n} {\n const classable: StyleObject = {};\n const residual: StyleObject = {};\n for (const [k, v] of Object.entries(bucket)) {\n if (isClassableStyleValue(v)) classable[k] = v as string | number;\n else residual[k] = v as StyleMapping;\n }\n return { classable, residual };\n}\n\n/**\n * Split a style value into the part storable as a utility-class string (static values) and the\n * residual that must stay in the `style` object (templates + `_mapping`s). Preserves the responsive\n * shape; a flat object is treated as `base`. Either side is null when it has no declarations. The\n * canonical home (shared by the studio persistence boundary and the project-wide migration) for the\n * \"what can be a class\" decision.\n */\nexport function splitStyleByClassability(style: StyleValue | null | undefined): {\n classable: ResponsiveStyleObject | null;\n residual: ResponsiveStyleObject | null;\n} {\n if (!style || typeof style !== 'object') return { classable: null, residual: null };\n\n if (isResponsiveStyle(style)) {\n const classable: ResponsiveStyleObject = {};\n const residual: ResponsiveStyleObject = {};\n for (const [bp, bucket] of Object.entries(style)) {\n if (!bucket || typeof bucket !== 'object') continue;\n const split = splitStyleBucket(bucket);\n if (Object.keys(split.classable).length > 0) classable[bp] = split.classable;\n if (Object.keys(split.residual).length > 0) residual[bp] = split.residual;\n }\n return {\n classable: Object.keys(classable).length > 0 ? classable : null,\n residual: Object.keys(residual).length > 0 ? residual : null,\n };\n }\n\n const split = splitStyleBucket(style as StyleObject);\n return {\n classable: Object.keys(split.classable).length > 0 ? { base: split.classable } : null,\n residual: Object.keys(split.residual).length > 0 ? { base: split.residual } : null,\n };\n}\n\n/**\n * Whether a style value contains at least one prop `_mapping` (in any breakpoint) \u2014 flat or\n * responsive. Prop-driven styling can't be a static utility class, so callers that gate class\n * conversion (the studio panel, the project migration) check this. Single source of truth.\n */\nexport function styleHasMapping(style: StyleValue | null | undefined): boolean {\n if (!style || typeof style !== 'object') return false;\n const buckets = isResponsiveStyle(style) ? Object.values(style) : [style as Record<string, unknown>];\n for (const bucket of buckets) {\n if (!bucket || typeof bucket !== 'object') continue;\n for (const v of Object.values(bucket)) if (isStyleMapping(v)) return true;\n }\n return false;\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 * 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(\n message: string,\n public readonly path: unknown,\n public readonly index?: number,\n ) {\n super(message);\n this.name = 'InvalidPathError';\n }\n}\n\nexport class PathConversionError extends Error {\n constructor(\n message: string,\n public readonly input: unknown,\n ) {\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' || Number.isNaN(value) || !Number.isFinite(value)) {\n throw new InvalidPathError(`Invalid path value at index ${i}: expected number, got ${typeof value}`, path, i);\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 * 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 (Number.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) ? domPath.substring(ROOT_PREFIX.length) : 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 (!Number.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 * 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 if (index === undefined) break;\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 =\n isAncestorPath(componentInstancePath, pagePath) || 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] ?? 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 = [pageFirstIndex - 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] ?? 0) + offset, ...suffix.slice(1)];\n }\n\n // Append adjusted suffix to component instance path\n return [...componentInstancePath, ...adjustedSuffix];\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 { InteractiveStyles, StyleMapping, StyleObject, ResponsiveStyleObject } 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' && value !== null && '_mapping' in value && (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 =\n 'base' in style || Object.keys(style).some((key) => key === 'base' || key === 'tablet' || key === 'mobile');\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(interactiveStyles: InteractiveStyles): 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 =\n 'base' in style || Object.keys(style).some((key) => key === 'base' || key === 'tablet' || key === 'mobile');\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 * Viewport unit rewriter for design canvas mode.\n *\n * Background: in the studio's design canvas, the iframe element's CSS height\n * is sized to its reported content height so that pan/zoom can show the whole\n * page. Because `vh` resolves against the iframe's viewport (= the iframe\n * element's CSS height), any content using `min-height: 100vh` couples\n * iframe.height to content.height. The moment a vertical offset (margin-top,\n * padding-top, etc.) is layered on top of vh-bound content, every measurement\n * cycle grows the frame by that offset \u2014 runaway feedback.\n *\n * Fix: rewrite every viewport-relative length so it resolves through a CSS\n * custom property that the design-mode runtime can pin to a stable pixel\n * value. The variable falls back to the original unit, so when it's not set\n * (page mode, production build, anything outside the studio) behavior is\n * byte-identical to before the rewrite.\n *\n * Examples:\n * 100vh \u2192 calc(var(--design-vh, 1vh) * 100)\n * -50.5dvh \u2192 calc(var(--design-dvh, 1dvh) * -50.5)\n * calc(100vh - 20px) \u2192 calc(calc(var(--design-vh, 1vh) * 100) - 20px)\n *\n * Covered units: vh/vw and the small/large/dynamic variants (svh, lvh, dvh,\n * svw, lvw, dvw). vw is included for symmetry even though horizontal feedback\n * isn't currently possible (frame width is user-controlled, not content-driven).\n */\n\n// A number (possibly negative, with optional decimal), an optional size keyword\n// (s/l/d), and `vh` or `vw` as a complete token. The negative lookbehind rejects\n// matches that sit inside a utility-class identifier, so a class SELECTOR keeps\n// its literal name while only the declaration VALUE is rewritten:\n// - `\\w-` covers dash identifiers, e.g. `.mh-100vh`.\n// - `\\[` covers arbitrary-value classes, e.g. `.min-h-[100svh]`, where the\n// `100svh` sits right after the `[`. Without this the selector would be\n// rewritten to `.min-h-[calc(...)]` and no longer match the element's\n// `class=\"min-h-[100svh]\"` \u2014 the rule (and the design-mode viewport pin it\n// carries) would silently break, so `min-height:100svh` couples to the\n// iframe viewport and a hero blows up to the full design-frame height.\n// (`100vh` dodged this only because it maps to the bracket-free `min-h-screen`.)\nconst VIEWPORT_UNIT_RE = /(?<![\\w\\-[])(-?\\d*\\.?\\d+)(s|l|d)?(vh|vw)\\b/g;\n\n/**\n * Rewrite viewport-relative lengths inside any CSS-shaped string (full\n * stylesheet, a single declaration value, an inline `style` attribute body).\n * Safe to apply unconditionally \u2014 the var() fallback preserves original\n * behavior when no `--design-*` variables are set.\n */\nexport function rewriteViewportUnits(input: string): string {\n if (!input) return input;\n return input.replace(VIEWPORT_UNIT_RE, (_match, num: string, sizeKw: string | undefined, axis: string) => {\n const unit = `${sizeKw ?? ''}${axis}`;\n return `calc(var(--design-${unit}, 1${unit}) * ${num})`;\n });\n}\n\n/**\n * Names of the CSS custom properties the runtime sets/clears to switch\n * between design-mode (stable px) and page-mode (no override, vh = actual\n * viewport). Exported so the iframe runtime and parent stay in sync.\n */\nexport const DESIGN_VIEWPORT_VARS = [\n '--design-vh',\n '--design-svh',\n '--design-lvh',\n '--design-dvh',\n '--design-vw',\n '--design-svw',\n '--design-lvw',\n '--design-dvw',\n] as const;\n", "/**\n * Friendly error mapping.\n *\n * Turns a raw JavaScript error (the kind that leaks scary text like\n * \"Cannot read properties of null (reading 'length')\") into plain-language\n * copy suitable for non-technical users, while always preserving the original\n * message in `raw` so developers can still copy the exact text for debugging.\n *\n * Pure and dependency-free so it can be imported from core/server (SSR error\n * overlay), core/client (ErrorBoundary), and @meno/studio (the editor toast).\n */\n\nexport interface FriendlyError {\n /** Short headline, e.g. \"A section couldn't load its content\". */\n title: string;\n /** Plain-language explanation of what went wrong. */\n friendlyMessage: string;\n /** Optional actionable suggestion. */\n hint?: string;\n /** Original error message \u2014 ALWAYS preserved for debugging / copy. */\n raw: string;\n}\n\n/** Extract the raw message string from any thrown value. */\nfunction rawMessageOf(input: unknown): string {\n if (input instanceof Error) return input.message;\n if (typeof input === 'string') return input;\n if (input && typeof input === 'object' && 'message' in input) {\n const m = (input as { message: unknown }).message;\n if (typeof m === 'string') return m;\n }\n return String(input);\n}\n\ninterface Rule {\n test: RegExp;\n build: (m: RegExpMatchArray, raw: string) => Omit<FriendlyError, 'raw'>;\n}\n\n// Matched in order; first hit wins. Keep the most specific patterns first.\nconst RULES: Rule[] = [\n {\n // Modern V8: \"Cannot read properties of null (reading 'length')\".\n // Legacy V8: \"Cannot read property 'length' of undefined\".\n test: /Cannot read propert(?:y|ies) (?:of (?:null|undefined)(?: \\(reading '([^']+)'\\))?|'([^']+)' of (?:null|undefined))/i,\n build: (m) => {\n const prop = m[1] || m[2];\n const target = prop ? `(\\`${prop}\\`)` : '';\n return {\n title: \"A section couldn't load its content\",\n friendlyMessage:\n `Something this section expected ${target} wasn't available \u2014 ` +\n `often a list or field that's empty or not connected yet.`,\n hint: 'Check the data source or list binding for this section.',\n };\n },\n },\n {\n test: /(\\S+) is not a function/i,\n build: (m) => ({\n title: \"A piece of code didn't run as expected\",\n friendlyMessage: `The site tried to use \\`${m[1]}\\` as a function, but it isn't one.`,\n hint: \"Check the component's custom JavaScript.\",\n }),\n },\n {\n test: /(\\S+) is not defined/i,\n build: (m) => ({\n title: 'A piece of code referenced something missing',\n friendlyMessage: `\\`${m[1]}\\` was used but never defined.`,\n hint: 'Check for a typo or a missing import in custom code.',\n }),\n },\n {\n test: /Failed to fetch|NetworkError|network request failed/i,\n build: () => ({\n title: \"Couldn't reach the network\",\n friendlyMessage: 'A request to load data failed.',\n hint: 'Check your connection or the endpoint URL.',\n }),\n },\n {\n test: /Cannot find module|Failed to resolve module|Failed to load module|Error loading dynamically imported module/i,\n build: () => ({\n title: \"A required file couldn't be loaded\",\n friendlyMessage: \"An import or module reference couldn't be found.\",\n hint: 'Check the import path.',\n }),\n },\n {\n test: /Unexpected token|Unexpected end of (?:JSON|input)|in JSON at position|is not valid JSON/i,\n build: () => ({\n title: 'Some data was malformed',\n friendlyMessage: \"Content that should be valid JSON couldn't be parsed.\",\n hint: 'Check the JSON for a syntax error.',\n }),\n },\n];\n\n/**\n * Convert any error-like value into a friendly, user-presentable shape.\n * Unknown errors fall back to a reassuring generic message; `raw` always\n * carries the original text.\n */\nexport function toFriendlyError(input: unknown): FriendlyError {\n const raw = rawMessageOf(input);\n\n for (const rule of RULES) {\n const match = raw.match(rule.test);\n if (match) {\n return { ...rule.build(match, raw), raw };\n }\n }\n\n return {\n title: 'This section ran into a problem',\n friendlyMessage: 'Something went wrong while rendering this part of the page. The rest of the page is fine.',\n raw,\n };\n}\n", "export interface RemConversionConfig {\n enabled: boolean;\n baseFontSize: number;\n}\n\nexport const DEFAULT_REM_CONFIG: RemConversionConfig = {\n enabled: false,\n baseFontSize: 16,\n};\n\nconst PX_REGEX = /(-?\\d*\\.?\\d+)px/g;\n\n/**\n * Convert all px values in a CSS value string to rem.\n * Handles multi-value shorthands like \"16px 32px\" -> \"1rem 2rem\".\n * 0px becomes \"0\" (unitless).\n */\nexport function convertPxToRem(cssValue: string, baseFontSize: number): string {\n return cssValue.replace(PX_REGEX, (_, num) => {\n const px = parseFloat(num);\n if (px === 0) return '0';\n const rem = px / baseFontSize;\n // Round to 4 decimal places, strip trailing zeros\n const rounded = parseFloat(rem.toFixed(4));\n return `${rounded}rem`;\n });\n}\n\n/**\n * CSS properties that should keep px values (thin borders, shadows).\n */\nconst PX_KEEP_PROPERTIES = new Set([\n 'border-width',\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n 'outline-width',\n 'outline-offset',\n 'border',\n 'box-shadow',\n 'text-shadow',\n]);\n\nexport function shouldConvertProperty(cssProperty: string): boolean {\n return !PX_KEEP_PROPERTIES.has(cssProperty);\n}\n\n/**\n * Apply rem conversion to a CSS declarations string (e.g. \"padding: 16px; font-size: 18px\").\n * Checks each property against the exclusion list before converting.\n */\nexport function applyRemConversion(declarations: string, remConfig?: RemConversionConfig): string {\n if (!remConfig?.enabled) return declarations;\n\n return declarations\n .split(';')\n .map((decl) => {\n const trimmed = decl.trim();\n if (!trimmed) return '';\n const colonIndex = trimmed.indexOf(':');\n if (colonIndex === -1) return trimmed;\n\n const property = trimmed.substring(0, colonIndex).trim();\n const value = trimmed.substring(colonIndex + 1).trim();\n\n if (shouldConvertProperty(property)) {\n return `${property}: ${convertPxToRem(value, remConfig.baseFontSize)}`;\n }\n return trimmed;\n })\n .filter(Boolean)\n .join('; ');\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 { propertyOrder, staticUtilityReverse, presetClassReverse } from './utilityClassConfig';\nimport {\n parseUtilityClass,\n splitVariantPrefix,\n breakpointClassPrefixes,\n resolveRootProperty,\n camelToKebab,\n isBareColorTokenName,\n} from './utilityClassNames';\nimport { getStyleValue, getDynamicStyle, isDynamicClass } from './styleValueRegistry';\nimport type { BreakpointConfig } from './breakpoints';\nimport { DEFAULT_BREAKPOINTS, getBreakpointValues } from './breakpoints';\nimport type { ResponsiveScales, CSSPropertyType, ResponsiveMode } from './responsiveScaling';\nimport {\n scalePropertyValue,\n getScaleMultiplier,\n buildFluidPropertyValue,\n getSmallestBreakpointName,\n DEFAULT_FLUID_RANGE,\n} from './responsiveScaling';\nimport type { InteractiveStyles, StyleObject, ResponsiveStyleObject, StyleValue } from './types/styles';\nimport type { RemConversionConfig } from './pxToRem';\nimport { applyRemConversion, convertPxToRem, shouldConvertProperty } from './pxToRem';\n\n/**\n * Map from CSS property (kebab-case) to its index in propertyOrder.\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 for (let i = 0; i < propertyOrder.length; i++) {\n const prop = propertyOrder[i];\n if (prop === undefined) continue;\n // Convert camelCase key to kebab-case CSS property\n const kebab = camelToKebab(prop);\n if (!map.has(kebab)) 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 propertyOrder,\n * or Infinity for unknown classes (placed last).\n */\nfunction getClassPropertyOrder(className: string): number {\n const parsed = parseUtilityClass(className);\n if (parsed) {\n const idx = cssPropertyOrderMap.get(parsed.property);\n if (idx !== undefined) return idx;\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/**\n * Pick the active responsive mode. Defaults to 'breakpoints' when missing,\n * preserving behavior for projects saved before the 'fluid' option existed.\n */\nfunction getResponsiveMode(scales: ResponsiveScales | undefined | null): ResponsiveMode {\n return (scales?.mode as ResponsiveMode | undefined) ?? 'breakpoints';\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 * Tailwind-style class names carry `[ ] ( ) : % # . , / *` and more \u2014 escape\n * everything outside the safe identifier charset.\n */\nfunction escapeCSSClassName(className: string): string {\n return className.replace(/[^a-zA-Z0-9_-]/g, '\\\\$&');\n}\n\n/**\n * Predefined rules for static utilities and presets (Tailwind names):\n * `flex` \u2192 `display: flex;`, `hidden` \u2192 `display: none;`,\n * `justify-center` \u2192 `justify-content: center;`, `shadow-2` \u2192 preset value, \u2026\n * Derived from the single source of truth in utilityClassConfig.ts.\n */\nconst utilityClassRules: Record<string, string> = (() => {\n const rules: Record<string, string> = {};\n for (const [className, entry] of Object.entries(staticUtilityReverse)) {\n rules[className] = `${camelToKebab(entry.prop)}: ${entry.value};`;\n }\n for (const [className, entry] of Object.entries(presetClassReverse)) {\n rules[className] = `${camelToKebab(entry.prop)}: ${entry.value};`;\n }\n return rules;\n})();\n\n/**\n * Resolve `{ property, value }` for a utility class, consulting the style-value\n * registry for hash-fallback classes (e.g. `text-h1glej9a` for `222.3px`).\n *\n * Used by the auto-responsive scaling path so hashed classes don't silently\n * bypass `clamp()` / `@media` rewriting.\n *\n * Returns the registered value as-is (no parsing). Downstream helpers\n * (`buildFluidPropertyValue`, `scalePropertyValue`) already null out\n * unparseable / `%` / `em` / `var()` / clamp-blob inputs, so a Webflow-style\n * already-clamped value will pass through untouched via the existing\n * `if (!fluidValue) return rule;` guards.\n */\nfunction resolveScalablePropertyValue(className: string): { property: string; value: string } | null {\n const parsed = parseUtilityClass(className);\n if (!parsed) return null;\n if (parsed.value != null) return { property: parsed.property, value: parsed.value };\n\n // Hash-fallback class: real value lives in the registry\n const registered = getStyleValue(className);\n if (registered == null || registered === '') return null;\n const value = String(registered);\n const property = parsed.root ? resolveRootProperty(parsed.root, value) : parsed.property;\n return { property, value };\n}\n\n/** Border-side class roots \u2192 CSS side shorthand base. */\nconst borderSideMap: Record<string, string> = {\n 'border-t': 'border-top',\n 'border-r': 'border-right',\n 'border-b': 'border-bottom',\n 'border-l': 'border-left',\n};\n\n/**\n * Generate CSS rule for a utility class\n * Handles arbitrary values (p-[10px]), variables (bg-(--primary)),\n * keywords (w-full), bare numbers (z-10) and hash-fallback classes.\n */\nexport function generateRuleForClass(className: string, knownTokens?: ReadonlySet<string>): string | null {\n // Check if it's a predefined static/preset rule\n if (utilityClassRules[className]) {\n return utilityClassRules[className];\n }\n\n const parsed = parseUtilityClass(className, knownTokens);\n\n if (!parsed) {\n // Check dynamic registry for classes with unknown roots\n const dynamicStyle = getDynamicStyle(className);\n if (dynamicStyle) {\n return `${dynamicStyle.property}: ${dynamicStyle.value};`;\n }\n return null;\n }\n\n // Arbitrary property syntax: [clip-path:circle(50%)] \u2014 prefer the registered\n // original value (exact), fall back to the decoded one.\n if (parsed.kind === 'arbitrary-property') {\n const dynamicStyle = getDynamicStyle(className);\n const value = dynamicStyle ? dynamicStyle.value : parsed.value;\n return `${parsed.property}: ${value};`;\n }\n\n const root = parsed.root;\n\n // Resolve the CSS value. The style-value registry holds the exact original\n // for arbitrary/hash classes; variable, keyword and numeric forms decode\n // deterministically from the class name itself.\n let value: string;\n let property = parsed.property;\n if (parsed.kind === 'hash') {\n const registered = getStyleValue(className);\n if (registered == null) return null;\n value = String(registered);\n if (root) property = resolveRootProperty(root, value);\n } else if (parsed.kind === 'arbitrary') {\n const registered = getStyleValue(className);\n value = registered !== undefined ? String(registered) : parsed.value!;\n } else {\n value = parsed.value!;\n }\n\n // Multi-property roots (Tailwind axis shorthands)\n if (root === 'size') {\n return `width: ${value}; height: ${value};`;\n }\n if (root === 'px') {\n return `padding-left: ${value}; padding-right: ${value};`;\n }\n if (root === 'py') {\n return `padding-top: ${value}; padding-bottom: ${value};`;\n }\n if (root === 'mx') {\n return `margin-left: ${value}; margin-right: ${value};`;\n }\n if (root === 'my') {\n return `margin-top: ${value}; margin-bottom: ${value};`;\n }\n\n // Border-side classes (border-t-, border-r-, \u2026): emit width/style (and color\n // when present) as LONGHANDS, so a separate border-color class can still\n // control the color independently (longhands sort after the side class).\n if (root && borderSideMap[root] && property !== 'border-color') {\n const side = borderSideMap[root];\n const tokens = value.split(/\\s+/).filter(Boolean);\n if (tokens.length >= 2) {\n const declarations = [`${side}-width: ${tokens[0]};`, `${side}-style: ${tokens[1]};`];\n if (tokens[2]) {\n declarations.push(`${side}-color: ${tokens.slice(2).join(' ')};`);\n }\n return declarations.join(' ');\n }\n return `${side}: ${value};`;\n }\n\n // Standard case: property + decoded value (e.g. `padding: 10px;`,\n // `color: var(--primary);`, `width: 100%;`)\n return `${property}: ${value};`;\n}\n\n/**\n * In fluid mode, return a CSS declaration string with the value replaced by\n * `clamp(...)` when the property is auto-responsive AND has a small-end scale.\n * Otherwise returns the original `rule` unchanged.\n *\n * The MIN of the clamp comes from the smallest configured breakpoint's\n * multiplier, matching the user-confirmed mapping (mobile multiplier \u21D2 MIN,\n * base value \u21D2 MAX, tablet ignored in fluid mode).\n */\nfunction applyFluidToUtilityRule(\n rule: string,\n className: string,\n responsiveScales: ResponsiveScales,\n breakpoints: BreakpointConfig,\n): string {\n const propValue = resolveScalablePropertyValue(className);\n if (!propValue) return rule;\n\n const category = AUTO_RESPONSIVE_TYPE_MAP[propValue.property];\n if (!category) return rule;\n\n const scaleConfig = responsiveScales[category as keyof ResponsiveScales] as Record<string, number> | undefined;\n if (!scaleConfig) return rule;\n\n const smallest = getSmallestBreakpointName(breakpoints);\n if (!smallest) return rule;\n\n const scale = scaleConfig[smallest];\n if (scale == null || scale === 1) return rule;\n\n const range = responsiveScales.fluidRange ?? DEFAULT_FLUID_RANGE;\n const baseRef = responsiveScales.baseReference ?? 16;\n const fluidValue = buildFluidPropertyValue(propValue.value, scale, range.min, range.max, baseRef);\n if (!fluidValue) return rule;\n\n return `${propValue.property}: ${fluidValue};`;\n}\n\n/**\n * In fluid mode, transform a flat StyleObject by replacing each scalable\n * property's value with a `clamp(...)` expression. Properties without a\n * matching scale category pass through unchanged.\n */\nfunction applyFluidToStyle(\n style: StyleObject,\n responsiveScales: ResponsiveScales,\n breakpoints: BreakpointConfig,\n): StyleObject {\n const range = responsiveScales.fluidRange ?? DEFAULT_FLUID_RANGE;\n const baseRef = responsiveScales.baseReference ?? 16;\n const smallest = getSmallestBreakpointName(breakpoints);\n if (!smallest) return style;\n\n const out: StyleObject = {};\n for (const [prop, value] of Object.entries(style)) {\n if (typeof value === 'object' && value !== null && '_mapping' in value) {\n out[prop] = value;\n continue;\n }\n if (value == null || value === '') {\n out[prop] = value;\n continue;\n }\n\n const scale = getScaleMultiplier(responsiveScales, prop as CSSPropertyType, smallest);\n if (scale == null || scale === 1) {\n out[prop] = value;\n continue;\n }\n\n const fluidValue = buildFluidPropertyValue(String(value), scale, range.min, range.max, baseRef);\n out[prop] = fluidValue ?? value;\n }\n return out;\n}\n\n/** Values that don't make sense in a fluid container pattern. */\nconst CONTAINER_RESERVED_VALUES = new Set(['auto', 'inherit', 'initial', 'unset', '']);\n\n/**\n * Detect \"container intent\" on a flat StyleObject and rewrite it into the\n * fluid container pattern. Trigger: `width === maxWidth` (both set, equal).\n *\n * Transformation:\n * { width: '1200px', maxWidth: '1200px' }\n * \u2192 { width: 'calc(100% - var(--site-margin) * 2)', maxWidth: '1200px',\n * marginLeft: 'auto', marginRight: 'auto' }\n *\n * No-op when fluid mode is inactive (`fluidActive === false`) \u2014 the\n * `--site-margin` CSS variable is only emitted in fluid mode, so emitting the\n * calc() in breakpoints mode would reference an undefined variable.\n *\n * Margins are ALWAYS overwritten with `auto` (per user spec), even if the\n * caller had set explicit values.\n */\nexport function applyContainerPattern(style: StyleObject, fluidActive: boolean): StyleObject {\n if (!fluidActive) return style;\n const w = style.width;\n const mw = style.maxWidth;\n if (w == null || mw == null) return style;\n if (typeof w !== 'string' || typeof mw !== 'string') return style;\n if (w !== mw) return style;\n if (CONTAINER_RESERVED_VALUES.has(w.trim())) return style;\n\n return {\n ...style,\n width: 'calc(100% - var(--site-margin) * 2)',\n marginLeft: 'auto',\n marginRight: 'auto',\n };\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 knownTokens?: ReadonlySet<string>,\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 variant prefix (e.g. 'tablet:', 'mobile:') to the class names 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. Register BOTH the current desktop-first\n // prefix (`max-tablet:`) and the legacy bare form (`tablet:`) so pre-`max-` projects still bucket\n // into their @media block; each prefix renders its own classes verbatim (selectors stay valid).\n for (const [breakpointName, breakpointValue] of Object.entries(breakpointValues)) {\n for (const prefix of breakpointClassPrefixes(breakpointName)) {\n responsiveClasses[prefix] = {\n classes: new Set<string>(),\n breakpointName,\n value: breakpointValue,\n };\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 variant prefix\n for (const prefix of Object.keys(responsiveClasses)) {\n if (className.startsWith(prefix) && className.length > prefix.length) {\n const potentialClass = className.substring(prefix.length);\n const rule = generateRuleForClass(potentialClass, knownTokens);\n const bucket = responsiveClasses[prefix];\n if (rule && bucket) {\n bucket.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 = resolveScalablePropertyValue(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 const mode = getResponsiveMode(responsiveScales);\n const fluidActive = responsiveScales?.enabled === true && mode === 'fluid';\n\n // Generate base rules \u2014 sorted so shorthands (border) appear before longhands (border-color)\n for (const className of sortClassesByPropertyOrder(baseClasses)) {\n let rule = generateRuleForClass(className, knownTokens);\n if (rule) {\n // In fluid mode, replace auto-responsive raw values with clamp() expressions.\n if (fluidActive && autoResponsiveClasses.has(className)) {\n rule = applyFluidToUtilityRule(rule, className, responsiveScales!, breakpoints);\n }\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 // In fluid mode the base rule already encodes scaling via clamp(), so skip @media.\n // Sort shorthand-before-longhand exactly like the base rules above: within a breakpoint\n // block, a `margin` shorthand emitted AFTER a `margin-bottom` longhand would clobber it\n // (equal specificity \u21D2 source order wins), silently dropping the longhand on that\n // breakpoint. The base section is sorted, so the cascade would flip ONLY inside @media \u2014\n // and the unsorted Set's order depends on collection order (SSR render vs .astro walk),\n // so the same project could render correctly in one path and lose the longhand in the\n // other. Sorting makes the @media cascade deterministic and consistent with base.\n if (responsiveScales?.enabled && !fluidActive) {\n for (const className of sortClassesByPropertyOrder(autoResponsiveClasses)) {\n const propValue = resolveScalablePropertyValue(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 =\n 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 tablet:/mobile: classes always override auto-responsive rules\n\n // Sort auto-responsive media queries by breakpoint value (descending)\n const sortedAutoResponsive = Object.entries(autoResponsiveMediaQueries).sort(([, a], [, b]) => b.value - a.value);\n\n // Generate auto-responsive media queries first\n for (const [, 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 sortClassesByPropertyOrder(breakpointInfo.classes)) {\n const rule = generateRuleForClass(className, knownTokens);\n if (rule) {\n const escapedClassName = escapeCSSClassName(`${prefix}${className}`);\n const finalRule = applyRemConversion(rule, remConfig);\n rules.push(` .${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 knownTokens?: ReadonlySet<string>,\n): string {\n const breakpointValues = getBreakpointValues(breakpoints);\n const css: string[] = [];\n\n // Build responsive variant prefix map: prefix \u2192 { breakpointName, value }. Both the current\n // desktop-first (`max-tablet:`) and legacy bare (`tablet:`) forms map to the same breakpoint.\n const responsivePrefixes: Record<string, { breakpointName: string; value: number }> = {};\n for (const [breakpointName, breakpointValue] of Object.entries(breakpointValues)) {\n for (const prefix of breakpointClassPrefixes(breakpointName)) {\n responsivePrefixes[prefix] = { breakpointName, value: breakpointValue };\n }\n }\n\n // Check if class has a responsive variant prefix (e.g. \"tablet:text-[16px]\", \"mobile:p-[10px]\")\n let matched = false;\n for (const prefix of Object.keys(responsivePrefixes)) {\n if (className.startsWith(prefix) && className.length > prefix.length) {\n const potentialClass = className.substring(prefix.length);\n const rule = generateRuleForClass(potentialClass, knownTokens);\n const responsivePrefix = responsivePrefixes[prefix];\n if (rule && responsivePrefix) {\n const escapedClassName = escapeCSSClassName(className);\n const bpValue = responsivePrefix.value;\n const finalRule = applyRemConversion(rule, remConfig);\n css.push(`@media (max-width: ${bpValue}px) {\\n .${escapedClassName} { ${finalRule} }\\n}`);\n matched = true;\n break;\n }\n }\n }\n\n if (!matched) {\n // Base (non-responsive) class\n let rule = generateRuleForClass(className, knownTokens);\n if (!rule) return '';\n\n const mode = getResponsiveMode(responsiveScales);\n const fluidActive = responsiveScales?.enabled === true && mode === 'fluid';\n\n // In fluid mode, replace auto-responsive raw values with clamp().\n if (fluidActive) {\n const propValue = resolveScalablePropertyValue(className);\n if (propValue && AUTO_RESPONSIVE_TYPE_MAP[propValue.property]) {\n rule = applyFluidToUtilityRule(rule, className, responsiveScales!, breakpoints);\n }\n }\n\n const escapedClassName = escapeCSSClassName(className);\n const finalRule = applyRemConversion(rule, remConfig);\n css.push(`.${escapedClassName} { ${finalRule} }`);\n\n // Auto-responsive scaling via @media \u2014 only in 'breakpoints' mode.\n if (responsiveScales?.enabled && !fluidActive) {\n const propValue = resolveScalablePropertyValue(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\n | Record<string, number>\n | 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).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 =\n remConfig?.enabled && shouldConvertProperty(propValue.property)\n ? convertPxToRem(scaledValue, remConfig.baseFontSize)\n : scaledValue;\n css.push(\n `@media (max-width: ${breakpointValue}px) {\\n .${escapedClassName} { ${propValue.property}: ${finalScaledValue}; }\\n}`,\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 * A class counts as a utility when (after stripping an optional `breakpoint:`\n * variant prefix) it parses as a Meno utility class \u2014 static (`flex`,\n * `justify-center`), arbitrary (`p-[10px]`), variable (`bg-(--primary)`),\n * keyword (`w-full`), numeric (`z-10`), preset (`shadow-2`),\n * arbitrary-property (`[clip-path:\u2026]`) or hash-fallback \u2014 or when it was\n * registered in the dynamic style registry.\n */\nexport function extractUtilityClassesFromHTML(html: string, knownTokens?: ReadonlySet<string>): Set<string> {\n const classes = new Set<string>();\n const classRegex = /class=\"([^\"]*)\"/g;\n let match: RegExpExecArray | null = classRegex.exec(html);\n\n while (match !== null) {\n const classList = (match[1] ?? '').split(/\\s+/);\n match = classRegex.exec(html);\n\n for (const className of classList) {\n if (!className) continue;\n\n const { base } = splitVariantPrefix(className);\n if (parseUtilityClass(base, knownTokens)) {\n classes.add(className);\n continue;\n }\n\n // Dynamic classes (registered for properties without a known root)\n if (isDynamicClass(className) || isDynamicClass(base)) {\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 typeof style === 'object' && style !== null && ('base' in style || 'tablet' in style || 'mobile' in style);\n}\n\n/**\n * Convert a flat style object to CSS property declarations\n * Returns string like \"padding: 10px; background-color: var(--primary);\"\n *\n * Exported for the studio's astro-play optimistic style preview: it converts a\n * single changed declaration to the same kebab-case + `var(--name)` color form\n * the server's utility/theme CSS uses, so the inline preview matches the value\n * the recompiled stylesheet will land with. `_mapping` (binding) values are\n * skipped, so a bound property yields an empty string (no optimistic preview).\n */\nexport function 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. Only a bare Meno\n // color *token* (e.g. `primary`) is wrapped in `var(--token)`. Named CSS\n // colors (`red`), hex, color functions and Tailwind palette names are real\n // values and pass through untouched \u2014 mirrors the utility-class engine so\n // the interactive path and the static path resolve colors identically.\n let cssValue = String(value);\n if ((prop === 'backgroundColor' || prop === 'color' || prop === 'borderColor') && isBareColorTokenName(cssValue)) {\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 const mode = getResponsiveMode(responsiveScales);\n const fluidActive = scalingEnabled && mode === 'fluid';\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(([, a], [, b]) => b - a);\n\n if (isResponsiveStyle(style)) {\n // Generate responsive rules\n const responsive = style as ResponsiveStyleObject;\n\n // Base styles \u2014 in fluid mode rewrite scalable values to clamp()\n // and rewrite width===maxWidth into the container pattern.\n if (responsive.base && Object.keys(responsive.base).length > 0) {\n let baseStyle = responsive.base;\n if (fluidActive) {\n baseStyle = applyContainerPattern(baseStyle, true);\n baseStyle = applyFluidToStyle(baseStyle, responsiveScales!, breakpoints);\n }\n const properties = applyRemConversion(styleObjectToCSS(baseStyle), 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 // In fluid mode skip the auto-scaled portion \u2014 base already has clamp().\n let merged: StyleObject | null = null;\n if (explicit && Object.keys(explicit).length > 0) {\n merged = fluidActive ? applyContainerPattern({ ...explicit }, true) : { ...explicit };\n }\n\n if (scalingEnabled && !fluidActive && 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(`@media (max-width: ${breakpointValue}px) { ${fullSelector} { ${properties}; } }`);\n }\n }\n }\n } else {\n // Flat style object\n const flatStyle = style as StyleObject;\n if (Object.keys(flatStyle).length > 0) {\n let baseFlat = flatStyle;\n if (fluidActive) {\n baseFlat = applyContainerPattern(baseFlat, true);\n baseFlat = applyFluidToStyle(baseFlat, responsiveScales!, breakpoints);\n }\n const properties = applyRemConversion(styleObjectToCSS(baseFlat), remConfig);\n if (properties) {\n css.push(`${fullSelector} { ${properties}; }`);\n }\n\n // Auto-scale the flat style into each enabled breakpoint \u2014 breakpoints mode only.\n if (scalingEnabled && !fluidActive) {\n for (const [breakpointName, breakpointValue] of sortedBreakpoints) {\n const scaled = scaleStyleForBreakpoint(flatStyle, responsiveScales!, breakpointName, new Set());\n if (Object.keys(scaled).length === 0) continue;\n const scaledProps = applyRemConversion(styleObjectToCSS(scaled), remConfig);\n if (!scaledProps) continue;\n css.push(`@media (max-width: ${breakpointValue}px) { ${fullSelector} { ${scaledProps}; } }`);\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(responsiveScales, property as CSSPropertyType, breakpointName);\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", "z", "h", "z", "h", "z", "h", "escapeHtml", "left", "globalNodeTypeManager", "className", "value", "root", "prop", "split", "shortHash", "isStyleMapping", "value", "CONTAINER_RESERVED_VALUES", "isResponsiveStyle"]
7
+ }