@otl-core/cms-utils 1.0.0 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1062 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +519 -0
- package/dist/index.d.ts +519 -0
- package/dist/index.js +1007 -0
- package/dist/index.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/abn-resolver.utils.ts","../src/category.utils.ts","../src/classnames.utils.ts","../src/responsive.utils.ts","../src/css.utils.ts","../src/localization.utils.ts","../src/schedule-resolver.utils.ts","../src/style.utils.ts","../src/password-resolver.utils.ts","../src/json-ld.utils.ts","../src/seo.utils.ts"],"names":["twMerge","clsx","normalizeResponsiveValue"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A/B/n Variant Resolver\n *\n * Framework-agnostic logic for resolving multivariate content to a single\n * variant per visitor. Uses a deterministic bucket value (float [0, 1))\n * to ensure sticky variant assignment.\n *\n * This module handles resolving only -- analytics and testing evaluation\n * happen separately downstream.\n */\n\nexport interface VariantConfig {\n id: string;\n weight: number;\n}\n\nexport interface MultivariatePageContent {\n page: unknown;\n seo: unknown;\n multivariate: true;\n variants: Array<{\n id: string;\n weight: number;\n sections: unknown[];\n }>;\n}\n\nexport interface MultivariateFormBlockData {\n definition: unknown;\n multivariate: true;\n variants: Array<{\n id: string;\n weight: number;\n document: unknown;\n }>;\n}\n\n/**\n * Given a bucket value [0, 1) and variant weights,\n * deterministically select a variant.\n *\n * The weights don't need to sum to 100 -- they are normalized.\n * A user with a given bucket will always get the same variant\n * for a given weight configuration.\n */\nexport function selectVariant(\n bucket: number,\n variants: VariantConfig[]\n): string {\n if (variants.length === 0) {\n throw new Error(\"selectVariant: variants array must not be empty\");\n }\n\n const totalWeight = variants.reduce((sum, v) => sum + v.weight, 0);\n let cumulative = 0;\n\n for (const variant of variants) {\n cumulative += variant.weight / totalWeight;\n if (bucket < cumulative) {\n return variant.id;\n }\n }\n\n // Fallback to last variant (handles floating point edge cases)\n return variants[variants.length - 1].id;\n}\n\n/**\n * Check if page content is multivariate.\n */\nexport function isMultivariateContent(\n content: Record<string, unknown>\n): boolean {\n return content.multivariate === true && Array.isArray(content.variants);\n}\n\n/**\n * Resolve multivariate page content to a single variant's sections.\n * Returns the selected sections array and the variant ID.\n */\nexport function resolvePageVariant(\n content: MultivariatePageContent,\n bucket: number\n): { sections: unknown[]; variantId: string } {\n const variantId = selectVariant(bucket, content.variants);\n const selectedVariant = content.variants.find(v => v.id === variantId);\n\n if (!selectedVariant) {\n // Fallback to first variant\n return {\n sections: content.variants[0].sections,\n variantId: content.variants[0].id,\n };\n }\n\n return { sections: selectedVariant.sections, variantId };\n}\n\n/**\n * Resolve multivariate blog post content to a single variant's blocks.\n * Blog post layouts are blog-level (no variants). The post's content blocks\n * are the variant data, returned alongside the shared layout.\n *\n * Mutates the content record in place: replaces \"variants\" with the selected \"blocks\".\n */\nexport function resolveBlogPostVariant(\n content: Record<string, unknown>,\n bucket: number\n): void {\n if (!content.multivariate || !Array.isArray(content.variants)) return;\n\n const variants = content.variants as Array<Record<string, unknown>>;\n const variantConfigs: VariantConfig[] = variants.map(v => ({\n id: String(v.id),\n weight: Number(v.weight),\n }));\n\n const selectedId = selectVariant(bucket, variantConfigs);\n const selectedVariant = variants.find(v => v.id === selectedId);\n\n if (selectedVariant) {\n content.blocks = selectedVariant.blocks;\n } else if (variants.length > 0) {\n content.blocks = variants[0].blocks;\n }\n\n // Clean up multivariate fields -- downstream only sees a single set of blocks\n delete content.multivariate;\n delete content.variants;\n}\n\n/**\n * Walk through sections/blocks and resolve any multivariate form block data.\n * This should be called on the server before passing data to client components,\n * so client-side FormBlock never has to deal with variant resolution.\n */\nexport function resolveFormVariantsInSections(\n sections: unknown[],\n bucket: number\n): unknown[] {\n if (!Array.isArray(sections)) return sections;\n\n return sections.map(section => {\n if (!isRecord(section)) return section;\n\n const config = section.config;\n if (!isRecord(config)) return section;\n\n // Process children blocks\n const children = config.children;\n if (!Array.isArray(children)) return section;\n\n const resolvedChildren = children.map(block =>\n resolveBlockVariant(block, bucket)\n );\n\n return {\n ...section,\n config: {\n ...config,\n children: resolvedChildren,\n },\n };\n });\n}\n\n/**\n * Recursively resolve a block's variant data.\n * - Form blocks with multivariate data get resolved to a single variant.\n * - Layout blocks (container-layout, grid-layout, flexbox-layout) recurse\n * into their children so nested form blocks are also resolved.\n */\nfunction resolveBlockVariant(block: unknown, bucket: number): unknown {\n if (!isRecord(block)) return block;\n\n const blockType = block.type;\n\n // Form blocks: resolve multivariate data to a single variant\n if (blockType === \"form\") {\n const data = block.data;\n if (!isRecord(data) || data.multivariate !== true) return block;\n\n const variants = data.variants;\n if (!Array.isArray(variants) || variants.length === 0) return block;\n\n const variantConfigs: VariantConfig[] = variants\n .filter(isRecord)\n .map(v => ({\n id: String(v.id),\n weight: Number(v.weight),\n }));\n\n const selectedId = selectVariant(bucket, variantConfigs);\n const selectedVariant = variants.find(\n v => isRecord(v) && v.id === selectedId\n );\n\n if (!selectedVariant || !isRecord(selectedVariant)) return block;\n\n return {\n ...block,\n data: {\n definition: data.definition,\n document: selectedVariant.document,\n },\n };\n }\n\n // Layout blocks: recurse into nested children\n const config = block.config;\n if (!isRecord(config)) return block;\n\n // Layout blocks use \"children\" or \"child\" for nested blocks\n const childKey = Array.isArray(config.children)\n ? \"children\"\n : Array.isArray(config.child)\n ? \"child\"\n : null;\n\n if (!childKey) return block;\n\n const children = config[childKey] as unknown[];\n const resolvedChildren = children.map(child =>\n resolveBlockVariant(child, bucket)\n );\n\n return {\n ...block,\n config: {\n ...config,\n [childKey]: resolvedChildren,\n },\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","/**\n * Category utility functions\n */\n\nimport type { BlogCategory } from \"@otl-core/cms-types\";\n\n/**\n * Tree node with children\n */\nexport interface CategoryTreeNode extends BlogCategory {\n children: CategoryTreeNode[];\n}\n\n/**\n * Builds a hierarchical tree from flat category array\n * @param categories Flat array of categories\n * @returns Array of root-level categories with nested children\n */\nexport function buildCategoryTree(\n categories: BlogCategory[]\n): CategoryTreeNode[] {\n // Create a map for quick lookup\n const categoryMap = new Map<string, CategoryTreeNode>();\n const roots: CategoryTreeNode[] = [];\n\n // First pass: create tree nodes\n categories.forEach(category => {\n categoryMap.set(category.id, { ...category, children: [] });\n });\n\n // Second pass: build hierarchy\n categories.forEach(category => {\n const node = categoryMap.get(category.id);\n if (!node) return;\n\n if (category.parent_id) {\n const parent = categoryMap.get(category.parent_id);\n if (parent) {\n parent.children.push(node);\n } else {\n // Parent not found, treat as root\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n });\n\n // Sort roots and children by sort_order\n const sortByOrder = (a: CategoryTreeNode, b: CategoryTreeNode) =>\n a.sort_order - b.sort_order;\n\n roots.sort(sortByOrder);\n categoryMap.forEach(node => {\n node.children.sort(sortByOrder);\n });\n\n return roots;\n}\n\n/**\n * Flattens a category tree back to a flat array\n * @param tree Hierarchical category tree\n * @returns Flat array of categories\n */\nexport function flattenCategoryTree(tree: CategoryTreeNode[]): BlogCategory[] {\n const result: BlogCategory[] = [];\n\n const flatten = (nodes: CategoryTreeNode[]) => {\n nodes.forEach(node => {\n const { children, ...category } = node;\n result.push(category as BlogCategory);\n if (children.length > 0) {\n flatten(children);\n }\n });\n };\n\n flatten(tree);\n return result;\n}\n\n/**\n * Gets the full path of a category (all ancestors)\n * @param categoryId Category ID to get path for\n * @param categories Flat array of all categories\n * @param locale Locale to use for names (optional)\n * @returns Array of categories from root to target\n */\nexport function getCategoryPath(\n categoryId: string,\n categories: BlogCategory[],\n locale?: string\n): BlogCategory[] {\n const categoryMap = new Map<string, BlogCategory>();\n categories.forEach(cat => categoryMap.set(cat.id, cat));\n\n const path: BlogCategory[] = [];\n let currentId: string | null | undefined = categoryId;\n\n while (currentId) {\n const category = categoryMap.get(currentId);\n if (!category) break;\n\n path.unshift(category);\n currentId = category.parent_id;\n }\n\n return path;\n}\n\n/**\n * Gets the display name for a category in a specific locale\n * @param category Category object\n * @param locale Locale code (e.g., 'en', 'de-DE')\n * @param fallbackLocale Fallback locale if primary not found\n * @returns Display name string\n */\nexport function getCategoryName(\n category: BlogCategory,\n locale: string,\n fallbackLocale = \"en\"\n): string {\n if (typeof category.name === \"string\") {\n return category.name;\n }\n\n return (\n category.name[locale] ||\n category.name[fallbackLocale] ||\n Object.values(category.name)[0] ||\n \"Untitled\"\n );\n}\n\n/**\n * Gets the slug for a category in a specific locale\n * @param category Category object\n * @param locale Locale code\n * @param fallbackLocale Fallback locale if primary not found\n * @returns Slug string\n */\nexport function getCategorySlug(\n category: BlogCategory,\n locale: string,\n fallbackLocale = \"en\"\n): string {\n if (typeof category.slug === \"string\") {\n return category.slug;\n }\n\n return (\n category.slug[locale] ||\n category.slug[fallbackLocale] ||\n Object.values(category.slug)[0] ||\n \"\"\n );\n}\n\n/**\n * Checks if a category is an ancestor of another category\n * @param ancestorId Potential ancestor category ID\n * @param descendantId Descendant category ID\n * @param categories Flat array of all categories\n * @returns True if ancestorId is an ancestor of descendantId\n */\nexport function isAncestor(\n ancestorId: string,\n descendantId: string,\n categories: BlogCategory[]\n): boolean {\n const categoryMap = new Map<string, BlogCategory>();\n categories.forEach(cat => categoryMap.set(cat.id, cat));\n\n let currentId: string | null | undefined = descendantId;\n\n while (currentId) {\n const category = categoryMap.get(currentId);\n if (!category) break;\n\n if (category.parent_id === ancestorId) {\n return true;\n }\n\n currentId = category.parent_id;\n }\n\n return false;\n}\n\n/**\n * Gets all descendants of a category (recursive)\n * @param categoryId Parent category ID\n * @param categories Flat array of all categories\n * @returns Array of all descendant categories\n */\nexport function getDescendants(\n categoryId: string,\n categories: BlogCategory[]\n): BlogCategory[] {\n const descendants: BlogCategory[] = [];\n\n const findChildren = (parentId: string) => {\n const children = categories.filter(cat => cat.parent_id === parentId);\n children.forEach(child => {\n descendants.push(child);\n findChildren(child.id);\n });\n };\n\n findChildren(categoryId);\n return descendants;\n}\n\n/**\n * Finds a category by slug in a specific locale\n * @param slug Slug to search for\n * @param locale Locale code\n * @param categories Flat array of all categories\n * @returns Category if found, undefined otherwise\n */\nexport function findCategoryBySlug(\n slug: string,\n locale: string,\n categories: BlogCategory[]\n): BlogCategory | undefined {\n return categories.find(cat => {\n const categorySlug =\n typeof cat.slug === \"string\" ? cat.slug : cat.slug[locale];\n return categorySlug === slug;\n });\n}\n","/**\n * Utility for merging Tailwind CSS class names\n * Combines clsx for conditional classes with tailwind-merge to handle conflicts\n */\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge class names intelligently\n * - Uses clsx for conditional classes\n * - Uses tailwind-merge to deduplicate and resolve conflicts\n *\n * @example\n * cn(\"px-2 py-1\", condition && \"bg-blue-500\")\n * cn({ \"font-bold\": isActive }, \"text-lg\")\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Utility functions for working with responsive values\n */\n\nimport type {\n BreakpointWithBase,\n ResponsiveConfig,\n ResponsiveValue,\n} from \"@otl-core/cms-types\";\n\n/** A responsive value where every breakpoint -- including base -- is optional. */\nexport type NormalizedResponsiveValue<T> = {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n};\n\n/**\n * Normalize an optional `ResponsiveValue<T>` into a flat object where every\n * breakpoint key is optional. Useful for CSS generation loops.\n *\n * - `undefined` -> `{}`\n * - `\"8px\"` -> `{ base: \"8px\" }`\n * - `{ base: \"8px\", md: \"16px\" }` -> same\n */\nexport function normalizeResponsiveValue<T>(\n value: ResponsiveValue<T> | undefined\n): NormalizedResponsiveValue<T> {\n if (!value) return {};\n if (typeof value === \"object\" && value !== null && \"base\" in value) {\n return value;\n }\n return { base: value as T };\n}\n\n/**\n * Type guard to check if a value is a ResponsiveConfig\n * Requires the object to have a \"base\" property\n */\nexport function isResponsiveConfig<T>(\n value: ResponsiveValue<T>\n): value is ResponsiveConfig<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"base\" in value &&\n !Array.isArray(value)\n );\n}\n\n/**\n * Get value for a specific breakpoint with fallback to base\n */\nexport function getBreakpointValue<T>(\n value: ResponsiveValue<T>,\n breakpoint: BreakpointWithBase\n): T {\n if (!isResponsiveConfig(value)) {\n return value;\n }\n\n // Return breakpoint-specific value or fall back to base\n return value[breakpoint] ?? value.base;\n}\n\n/**\n * Get all defined breakpoints in a responsive value\n */\nexport function getDefinedBreakpoints<T>(\n value: ResponsiveValue<T>\n): BreakpointWithBase[] {\n if (!isResponsiveConfig(value)) {\n return [\"base\"];\n }\n\n const breakpoints: BreakpointWithBase[] = [\"base\"];\n if (value.sm !== undefined) breakpoints.push(\"sm\");\n if (value.md !== undefined) breakpoints.push(\"md\");\n if (value.lg !== undefined) breakpoints.push(\"lg\");\n if (value.xl !== undefined) breakpoints.push(\"xl\");\n if (value[\"2xl\"] !== undefined) breakpoints.push(\"2xl\");\n\n return breakpoints;\n}\n\n/**\n * Convert a single value or responsive value to a ResponsiveConfig\n */\nexport function toResponsiveConfig<T>(fields: {\n base: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n}): ResponsiveConfig<T> {\n const config: ResponsiveConfig<T> = { base: fields.base };\n if (fields.sm !== undefined) config.sm = fields.sm;\n if (fields.md !== undefined) config.md = fields.md;\n if (fields.lg !== undefined) config.lg = fields.lg;\n if (fields.xl !== undefined) config.xl = fields.xl;\n if (fields[\"2xl\"] !== undefined) config[\"2xl\"] = fields[\"2xl\"];\n return config;\n}\n\n/**\n * Convert a ResponsiveConfig to flat breakpoint fields\n */\nexport function fromResponsiveConfig<T>(value: ResponsiveValue<T>): {\n base: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n} {\n if (!isResponsiveConfig(value)) {\n return { base: value };\n }\n\n return {\n base: value.base,\n sm: value.sm,\n md: value.md,\n lg: value.lg,\n xl: value.xl,\n \"2xl\": value[\"2xl\"],\n };\n}\n","/**\n * CSS Resolution Utilities\n * Converts CMS type system values (ColorReference, BorderConfig, ResponsiveValue)\n * into CSS strings for rendering.\n */\n\nimport type {\n BorderConfig,\n ColorReference,\n ResponsiveValue,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\nimport { isResponsiveConfig } from \"./responsive.utils\";\n\n/**\n * Minify CSS by removing comments, extra whitespace, and unnecessary characters\n */\nexport function minifyCSS(css: string): string {\n return css\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([{}:;,>+~()[\\]])\\s*/g, \"$1\")\n .replace(/:\\s+/g, \":\")\n .replace(/;}/g, \"}\")\n .replace(/:0px/g, \":0\")\n .replace(/:0em/g, \":0\")\n .replace(/:0rem/g, \":0\")\n .trim();\n}\n\n/**\n * Resolve a ColorReference to a CSS color string\n */\nexport function resolveColorToCSS(\n colorRef: ColorReference | undefined,\n target?: \"background\" | \"foreground\"\n): string | undefined {\n if (!colorRef) return undefined;\n if (typeof colorRef !== \"object\") return undefined;\n\n // Determine which target to use: parameter, or colorRef.target (if exists), or default to background\n const resolvedTarget =\n target ??\n (colorRef.type !== \"custom\" ? colorRef.target : undefined) ??\n \"background\";\n\n if (colorRef.type === \"custom\") {\n if (typeof colorRef.value === \"string\") {\n return resolvedTarget === \"foreground\" ? undefined : colorRef.value;\n }\n return resolvedTarget === \"foreground\"\n ? colorRef.value.foreground\n : colorRef.value.background;\n } else if (colorRef.type === \"theme\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n } else if (colorRef.type === \"variable\") {\n return resolvedTarget === \"foreground\"\n ? `var(--${colorRef.value}-foreground)`\n : `var(--${colorRef.value})`;\n }\n\n return undefined;\n}\n\n/**\n * Resolve multiple ColorReferences to CSS color strings\n */\nexport function resolveColorsToCSS<\n T extends Record<string, ColorReference | undefined>,\n>(colorRefs: T): Partial<Record<keyof T, string>> {\n const resolved: Partial<Record<keyof T, string>> = {};\n\n for (const key in colorRefs) {\n const colorRef = colorRefs[key];\n if (colorRef) {\n const color = resolveColorToCSS(colorRef);\n if (color) {\n resolved[key] = color;\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolve a BorderConfig to CSS border properties\n */\nexport function resolveBorderToCSS(\n borderConfig: BorderConfig | undefined\n): Record<string, string> | undefined {\n if (!borderConfig) return undefined;\n\n const result: Record<string, string> = {};\n\n const resolveSide = (\n side:\n | { width?: string; style?: string; color?: ColorReference }\n | undefined,\n defaultWidth?: string,\n defaultStyle?: string,\n defaultColor?: ColorReference\n ): string | undefined => {\n const width = side?.width || defaultWidth;\n const style = side?.style || defaultStyle;\n const color = side?.color || defaultColor;\n\n if (!width || !style || !color) return undefined;\n\n const resolvedColor = resolveColorToCSS(color);\n if (!resolvedColor) return undefined;\n\n return `${width} ${style} ${resolvedColor}`;\n };\n\n const hasIndividualSides =\n borderConfig.top ||\n borderConfig.right ||\n borderConfig.bottom ||\n borderConfig.left;\n\n if (hasIndividualSides) {\n const topBorder = resolveSide(\n borderConfig.top,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color\n );\n if (topBorder) result.borderTop = topBorder;\n\n const rightBorder = resolveSide(\n borderConfig.right,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color\n );\n if (rightBorder) result.borderRight = rightBorder;\n\n const bottomBorder = resolveSide(\n borderConfig.bottom,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color\n );\n if (bottomBorder) result.borderBottom = bottomBorder;\n\n const leftBorder = resolveSide(\n borderConfig.left,\n borderConfig.width,\n borderConfig.style,\n borderConfig.color\n );\n if (leftBorder) result.borderLeft = leftBorder;\n } else if (borderConfig.width && borderConfig.style && borderConfig.color) {\n const color = resolveColorToCSS(borderConfig.color);\n if (color) {\n result.border = `${borderConfig.width} ${borderConfig.style} ${color}`;\n }\n }\n\n if (borderConfig.radius) {\n result.borderRadius = borderConfig.radius;\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction normalizeResponsiveValue<T>(value: ResponsiveValue<T> | undefined): {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n} {\n if (!value) return {};\n\n if (isResponsiveConfig(value)) {\n return {\n base: value.base,\n sm: value.sm,\n md: value.md,\n lg: value.lg,\n xl: value.xl,\n };\n }\n\n return { base: value };\n}\n\nexport interface ResponsiveSpacingConfig {\n border?: ResponsiveValue<BorderConfig>;\n margin?: ResponsiveValue<string>;\n padding?: ResponsiveValue<string>;\n gap?: ResponsiveValue<string>;\n shadow?: ResponsiveValue<ShadowConfig>;\n}\n\nconst BREAKPOINTS = [\n { key: \"Sm\", minWidth: \"640px\" },\n { key: \"Md\", minWidth: \"768px\" },\n { key: \"Lg\", minWidth: \"1024px\" },\n { key: \"Xl\", minWidth: \"1280px\" },\n];\n\n/**\n * Generate responsive CSS for spacing (margin, padding, gap, border) with media queries\n */\nexport function generateResponsiveSpacingCSS(\n className: string,\n config: ResponsiveSpacingConfig\n): string | null {\n const css: string[] = [];\n const targetClass = `.${className}`;\n\n const normalizedBorder = normalizeResponsiveValue(config.border);\n const normalizedMargin = normalizeResponsiveValue(config.margin);\n const normalizedPadding = normalizeResponsiveValue(config.padding);\n const normalizedGap = normalizeResponsiveValue(config.gap);\n const normalizedShadow = normalizeResponsiveValue(config.shadow);\n\n const border = {\n base: normalizedBorder.base,\n sm: normalizedBorder.sm,\n md: normalizedBorder.md,\n lg: normalizedBorder.lg,\n xl: normalizedBorder.xl,\n };\n\n const margin = {\n base: normalizedMargin.base,\n sm: normalizedMargin.sm,\n md: normalizedMargin.md,\n lg: normalizedMargin.lg,\n xl: normalizedMargin.xl,\n };\n\n const padding = {\n base: normalizedPadding.base,\n sm: normalizedPadding.sm,\n md: normalizedPadding.md,\n lg: normalizedPadding.lg,\n xl: normalizedPadding.xl,\n };\n\n const gap = {\n base: normalizedGap.base,\n sm: normalizedGap.sm,\n md: normalizedGap.md,\n lg: normalizedGap.lg,\n xl: normalizedGap.xl,\n };\n\n const shadow = {\n base: normalizedShadow.base,\n sm: normalizedShadow.sm,\n md: normalizedShadow.md,\n lg: normalizedShadow.lg,\n xl: normalizedShadow.xl,\n };\n\n const shadowToCSS = (s: ShadowConfig): string => {\n const parts = [s.offsetX, s.offsetY, s.blurRadius, s.spreadRadius, s.color];\n return s.inset ? `inset ${parts.join(\" \")}` : parts.join(\" \");\n };\n\n const baseStyles: string[] = [];\n\n if (border.base) {\n const resolvedBorder = resolveBorderToCSS(border.base);\n if (resolvedBorder) {\n Object.entries(resolvedBorder).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n baseStyles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (margin.base) {\n baseStyles.push(`margin:${margin.base}`);\n }\n\n if (padding.base) {\n baseStyles.push(`padding:${padding.base}`);\n }\n\n if (gap.base) {\n baseStyles.push(`gap:${gap.base}`);\n }\n\n if (shadow.base) {\n baseStyles.push(`box-shadow:${shadowToCSS(shadow.base)}`);\n }\n\n if (baseStyles.length > 0) {\n css.push(`${targetClass}{${baseStyles.join(\";\")}}`);\n }\n\n BREAKPOINTS.forEach(({ key, minWidth }) => {\n const bpKey = key.toLowerCase() as \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n const borderBp = border[bpKey];\n const marginBp = margin[bpKey];\n const paddingBp = padding[bpKey];\n const gapBp = gap[bpKey];\n const shadowBp = shadow[bpKey];\n\n if (borderBp || marginBp || paddingBp || gapBp || shadowBp) {\n const styles: string[] = [];\n\n if (borderBp) {\n const resolvedBorderBp = resolveBorderToCSS(borderBp);\n if (resolvedBorderBp) {\n Object.entries(resolvedBorderBp).forEach(([prop, value]) => {\n if (value) {\n const cssProp = prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n styles.push(`${cssProp}:${value}`);\n }\n });\n }\n }\n\n if (marginBp) {\n styles.push(`margin:${marginBp}`);\n }\n\n if (paddingBp) {\n styles.push(`padding:${paddingBp}`);\n }\n\n if (gapBp) {\n styles.push(`gap:${gapBp}`);\n }\n\n if (shadowBp) {\n styles.push(`box-shadow:${shadowToCSS(shadowBp)}`);\n }\n\n if (styles.length > 0) {\n css.push(\n `@media(min-width:${minWidth}){${targetClass}{${styles.join(\";\")}}}`\n );\n }\n }\n });\n\n return css.length > 0 ? minifyCSS(css.join(\"\")) : null;\n}\n\n/**\n * Check if a ResponsiveSpacingConfig has any margin values set\n */\nexport function hasAnyMargin(config: ResponsiveSpacingConfig): boolean {\n if (config.margin) {\n if (isResponsiveConfig(config.margin)) {\n return !!(\n config.margin.base ||\n config.margin.sm ||\n config.margin.md ||\n config.margin.lg ||\n config.margin.xl\n );\n }\n return true;\n }\n return false;\n}\n\n/**\n * Map animation timing name to CSS timing function\n */\nexport function getAnimationTimingFunction(\n timing: string = \"ease-in-out\"\n): string {\n switch (timing) {\n case \"ease\":\n return \"ease\";\n case \"ease-in\":\n return \"ease-in\";\n case \"ease-out\":\n return \"ease-out\";\n case \"ease-in-out\":\n return \"ease-in-out\";\n case \"linear\":\n return \"linear\";\n case \"spring\":\n return \"cubic-bezier(0.68,-0.55,0.265,1.55)\";\n default:\n return \"ease-in-out\";\n }\n}\n","import type { LocalizedString } from \"@otl-core/cms-types\";\n\n/**\n * Get localized string with proper fallback logic\n * 1. Try user's preferred locale (from cookie or browser)\n * 2. Try default locale (from deployment config)\n * 3. Try 'en' as ultimate fallback\n * 4. Return first available value as last resort\n */\nexport function getLocalizedString(\n value: string | LocalizedString | null | undefined,\n options?: {\n preferredLocale?: string | null;\n defaultLocale?: string;\n supportedLocales?: string[];\n }\n): string {\n // Handle null/undefined\n if (value === null || value === undefined) return \"\";\n\n // If it's already a string, return it\n if (typeof value === \"string\") return value;\n\n // Get the preferred locale\n const preferredLocale =\n options?.preferredLocale || options?.defaultLocale || \"en\";\n\n // Try preferred locale\n if (preferredLocale in value && value[preferredLocale]) {\n return value[preferredLocale];\n }\n\n // Try default locale\n if (\n options?.defaultLocale &&\n options.defaultLocale in value &&\n value[options.defaultLocale]\n ) {\n return value[options.defaultLocale];\n }\n\n // Try 'en' as fallback\n if (\"en\" in value && value.en) {\n return value.en;\n }\n\n // Try any supported locale\n if (options?.supportedLocales) {\n for (const locale of options.supportedLocales) {\n if (locale in value && value[locale]) {\n return value[locale];\n }\n }\n }\n\n // Return first available value as last resort\n const keys = Object.keys(value);\n if (keys.length > 0 && value[keys[0]]) {\n return value[keys[0]];\n }\n\n return \"\";\n}\n\n/**\n * Get all available locales from a localized string\n */\nexport function getAvailableLocales(value: string | LocalizedString): string[] {\n if (typeof value === \"string\") return [];\n return Object.keys(value).filter(key => value[key]);\n}\n\n/**\n * Check if a value is a localized string object\n */\nexport function isLocalizedString(value: unknown): value is LocalizedString {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length > 0\n );\n}\n\n/**\n * Detect locale from various sources (URL, browser, config)\n * Priority: URL param > path segment > browser language > default\n * Note: This function requires browser environment\n */\nexport function detectLocale(\n defaultLocale: string = \"en\",\n supportedLocales: string[] = [\"en\"]\n): string {\n // Check if we're in a browser environment\n const glob = globalThis as typeof globalThis & {\n window?: Window;\n navigator?: Navigator;\n };\n\n if (typeof glob.window === \"undefined\") {\n return defaultLocale;\n }\n\n // Check URL parameter (?lang=de)\n const urlParams = new URLSearchParams(glob.window.location.search);\n const urlLang = urlParams.get(\"lang\");\n if (urlLang && supportedLocales.includes(urlLang)) {\n return urlLang;\n }\n\n // Check path-based locale (/de/page)\n const pathSegments = glob.window.location.pathname.split(\"/\").filter(Boolean);\n if (pathSegments[0] && supportedLocales.includes(pathSegments[0])) {\n return pathSegments[0];\n }\n\n // Check browser language\n if (typeof glob.navigator !== \"undefined\") {\n const browserLang = glob.navigator.language.split(\"-\")[0];\n if (supportedLocales.includes(browserLang)) {\n return browserLang;\n }\n }\n\n return defaultLocale;\n}\n\n/**\n * Format locale for HTML lang attribute (e.g., 'en-US')\n */\nexport function formatLocaleForHtml(locale: string): string {\n const localeMap: Record<string, string> = {\n en: \"en-US\",\n de: \"de-DE\",\n fr: \"fr-FR\",\n es: \"es-ES\",\n it: \"it-IT\",\n pt: \"pt-PT\",\n nl: \"nl-NL\",\n pl: \"pl-PL\",\n };\n return localeMap[locale] || locale;\n}\n","/**\n * Schedule Resolver\n * Framework-agnostic content scheduling utilities\n */\n\n/**\n * Check if content is currently visible based on schedule metadata.\n * Returns true if the content should be shown to visitors.\n *\n * @param publishAt - ISO 8601 timestamp when content should become visible\n * @param expiresAt - ISO 8601 timestamp when content should stop being visible\n * @param now - Optional current time (defaults to new Date())\n * @returns true if content is visible, false otherwise\n */\nexport function isContentVisible(\n publishAt: string | null | undefined,\n expiresAt: string | null | undefined,\n now?: Date\n): boolean {\n const currentTime = now || new Date();\n\n if (publishAt) {\n const publishDate = new Date(publishAt);\n if (currentTime < publishDate) return false; // Not yet published\n }\n\n if (expiresAt) {\n const expiryDate = new Date(expiresAt);\n if (currentTime >= expiryDate) return false; // Expired\n }\n\n return true;\n}\n\n/**\n * Filter a list of items based on schedule metadata.\n * Each item must have optional publish_at and expires_at fields.\n *\n * @param items - Array of items with schedule metadata\n * @param now - Optional current time (defaults to new Date())\n * @returns Filtered array containing only currently visible items\n */\nexport function filterScheduledContent<\n T extends { publish_at?: string; expires_at?: string },\n>(items: T[], now?: Date): T[] {\n return items.filter(item =>\n isContentVisible(item.publish_at, item.expires_at, now)\n );\n}\n","/**\n * Style Utilities\n * Helpers to convert CMS config values to CSS strings and Tailwind classes.\n * For CSS resolution utilities (resolveColorToCSS, resolveBorderToCSS, etc.)\n * see css.utils.ts.\n */\n\nimport type {\n BorderConfig,\n ResponsiveValue,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\n\nimport { isResponsiveConfig } from \"./responsive.utils\";\n\n/**\n * Get the base value from a ResponsiveValue, handling undefined input\n */\nfunction getResponsiveBase<T>(\n value: ResponsiveValue<T> | undefined\n): T | undefined {\n if (!value) return undefined;\n if (isResponsiveConfig(value)) {\n return value.base;\n }\n return value;\n}\n\n/**\n * Convert border config to CSS string\n */\nexport function borderToStyle(\n border: ResponsiveValue<BorderConfig> | undefined\n): string {\n if (!border) return \"\";\n const borderValue = getResponsiveBase(border);\n if (!borderValue) return \"\";\n\n const width = borderValue.width || \"1px\";\n const style = borderValue.style || \"solid\";\n const color = borderValue.color || \"currentColor\";\n\n return `${width} ${style} ${color}`;\n}\n\n/**\n * Format shadow config to CSS box-shadow value\n */\nexport function formatShadow(shadow: ShadowConfig | undefined): string {\n if (!shadow) return \"\";\n\n const { offsetX, offsetY, blurRadius, spreadRadius, color } = shadow;\n\n return `${offsetX} ${offsetY} ${blurRadius} ${spreadRadius} ${color}`;\n}\n\n/**\n * Convert padding config to Tailwind class\n */\nexport function paddingToClass(padding?: string): string {\n if (!padding) return \"\";\n\n const paddingMap: Record<string, string> = {\n none: \"p-0\",\n sm: \"p-4\",\n normal: \"p-8\",\n lg: \"p-12\",\n xl: \"p-16\",\n };\n\n return paddingMap[padding] || paddingMap[\"normal\"];\n}\n\n/**\n * Convert padding top config to Tailwind class\n */\nexport function paddingTopToClass(paddingTop?: string): string {\n if (!paddingTop) return \"\";\n\n const paddingMap: Record<string, string> = {\n none: \"pt-0\",\n sm: \"pt-4\",\n normal: \"pt-8\",\n lg: \"pt-12\",\n xl: \"pt-16\",\n };\n\n return paddingMap[paddingTop] || paddingMap[\"normal\"];\n}\n\n/**\n * Convert padding bottom config to Tailwind class\n */\nexport function paddingBottomToClass(paddingBottom?: string): string {\n if (!paddingBottom) return \"\";\n\n const paddingMap: Record<string, string> = {\n none: \"pb-0\",\n sm: \"pb-4\",\n normal: \"pb-8\",\n lg: \"pb-12\",\n xl: \"pb-16\",\n };\n\n return paddingMap[paddingBottom] || paddingMap[\"normal\"];\n}\n\n/**\n * Convert spacing config to Tailwind class\n */\nexport function spacingToClass(spacing?: string): string {\n if (!spacing) return \"\";\n\n const spacingMap: Record<string, string> = {\n tight: \"space-y-2\",\n normal: \"space-y-4\",\n relaxed: \"space-y-6\",\n loose: \"space-y-8\",\n };\n\n return spacingMap[spacing] || spacingMap[\"normal\"];\n}\n\n/**\n * Convert max-width config to Tailwind class\n */\nexport function widthToClass(width?: string): string {\n if (!width) return \"\";\n\n const widthMap: Record<string, string> = {\n full: \"w-full\",\n container: \"max-w-7xl mx-auto\",\n wide: \"max-w-6xl mx-auto\",\n prose: \"max-w-4xl mx-auto\",\n narrow: \"max-w-2xl mx-auto\",\n };\n\n return widthMap[width] || widthMap[\"container\"];\n}\n\n/**\n * Convert color config to inline style object\n */\nexport function colorToStyle(color?: string): { backgroundColor?: string } {\n if (!color) return {};\n\n return {\n backgroundColor: color,\n };\n}\n\n/**\n * Convert gap config to Tailwind class\n */\nexport function gapToClass(gap?: number): string {\n if (gap === undefined || gap === null) return \"\";\n\n // Convert pixel value to Tailwind spacing scale\n if (gap === 0) return \"gap-0\";\n if (gap <= 4) return \"gap-1\";\n if (gap <= 8) return \"gap-2\";\n if (gap <= 12) return \"gap-3\";\n if (gap <= 16) return \"gap-4\";\n if (gap <= 24) return \"gap-6\";\n if (gap <= 32) return \"gap-8\";\n if (gap <= 48) return \"gap-12\";\n\n return \"gap-16\";\n}\n","/**\n * Password Protection Resolution Utilities\n *\n * Framework-agnostic utilities for handling password-protected content.\n * These utilities determine if content is password-protected and filter\n * out protected content from lists (e.g., blog post listings).\n *\n * According to the architecture:\n * - Backend returns ALL content with metadata\n * - Engine/frontend decides visibility at render time\n * - Password protection is checked on the client side\n */\n\n/**\n * Check if content is password-protected\n * @param password_protected - Whether the content requires a password\n * @returns True if content is password-protected, false otherwise\n */\nexport function isPasswordProtected(password_protected?: boolean): boolean {\n return password_protected === true;\n}\n\n/**\n * Filter password-protected content from a list\n * Useful for listings like blog posts where we don't want to show protected items\n * @param items - Array of items with password_protected metadata\n * @returns Filtered array with only non-protected items\n */\nexport function filterPasswordProtectedContent<\n T extends { password_protected?: boolean },\n>(items: T[]): T[] {\n return items.filter(item => !isPasswordProtected(item.password_protected));\n}\n","/**\n * JSON-LD structured data generation utilities.\n *\n * Produces a Schema.org @graph for pages, blog posts, and the overall site,\n * using data already available in the CMS (website config, page/post metadata,\n * organization config).\n */\n\nimport type { OrganizationInfo } from \"@otl-core/cms-types\";\n\nexport interface JsonLdInput {\n /** Canonical site origin, e.g. \"https://example.com\" */\n siteUrl: string;\n /** Current page path, e.g. \"/about\" */\n path: string;\n /** Current locale code */\n locale: string;\n /** Human-readable site name */\n siteName: string;\n /** Optional site description */\n siteDescription?: string;\n /** Organization config from WebsiteConfig */\n organization?: OrganizationInfo;\n /** Page-specific data (mutually exclusive with blogPost) */\n page?: {\n title: string;\n description?: string;\n schemaType?: string; // default \"WebPage\"\n datePublished?: string;\n dateModified?: string;\n ogImage?: string;\n };\n /** Blog post data (mutually exclusive with page) */\n blogPost?: {\n title: string;\n excerpt?: string;\n datePublished: string;\n dateModified?: string;\n authorName?: string;\n authorUrl?: string;\n categories?: string[];\n featuredImage?: string;\n };\n /** Explicit breadcrumb items; auto-built from path if omitted */\n breadcrumbs?: { name: string; path: string }[];\n}\n\n/**\n * Derive breadcrumb items from a URL path.\n *\n * \"/\" -> [{ name: \"Home\", path: \"/\" }]\n * \"/about\" -> [{ name: \"Home\", path: \"/\" }, { name: \"About\", path: \"/about\" }]\n * \"/blog/my-post\" -> [Home, Blog, My Post]\n */\nexport function buildBreadcrumbs(\n path: string,\n pageTitle: string\n): { name: string; path: string }[] {\n const crumbs: { name: string; path: string }[] = [\n { name: \"Home\", path: \"/\" },\n ];\n\n if (path === \"/\" || path === \"\") {\n return crumbs;\n }\n\n const segments = path.replace(/^\\//, \"\").split(\"/\").filter(Boolean);\n\n for (let i = 0; i < segments.length; i++) {\n const segPath = \"/\" + segments.slice(0, i + 1).join(\"/\");\n const isLast = i === segments.length - 1;\n const name = isLast ? pageTitle : slugToTitle(segments[i]);\n crumbs.push({ name, path: segPath });\n }\n\n return crumbs;\n}\n\n/**\n * Generate a JSON-LD `@graph` object for the given page/post.\n *\n * When an override is provided externally (structured_data_override), callers\n * should use the override directly instead of calling this function.\n */\nexport function generateJsonLd(input: JsonLdInput): Record<string, unknown> {\n const {\n siteUrl,\n path,\n locale,\n siteName,\n siteDescription,\n organization,\n page,\n blogPost,\n } = input;\n\n const canonicalUrl = siteUrl + path;\n const graph: Record<string, unknown>[] = [];\n\n // ----- WebSite -----\n const websiteNode: Record<string, unknown> = {\n \"@type\": \"WebSite\",\n \"@id\": `${siteUrl}/#website`,\n url: siteUrl,\n name: siteName,\n inLanguage: locale,\n };\n if (siteDescription) {\n websiteNode.description = siteDescription;\n }\n if (organization) {\n websiteNode.publisher = { \"@id\": `${siteUrl}/#organization` };\n }\n graph.push(websiteNode);\n\n // ----- Organization -----\n if (organization && hasOrganizationData(organization)) {\n const orgNode: Record<string, unknown> = {\n \"@type\": \"Organization\",\n \"@id\": `${siteUrl}/#organization`,\n };\n if (organization.name) orgNode.name = organization.name;\n if (organization.legal_name) orgNode.legalName = organization.legal_name;\n if (organization.logo) {\n orgNode.logo = {\n \"@type\": \"ImageObject\",\n \"@id\": `${siteUrl}/#logo`,\n url: organization.logo,\n contentUrl: organization.logo,\n };\n orgNode.image = { \"@id\": `${siteUrl}/#logo` };\n }\n if (organization.url) orgNode.url = organization.url;\n if (organization.email) orgNode.email = organization.email;\n if (organization.phone) orgNode.telephone = organization.phone;\n if (organization.description)\n orgNode.description = organization.description;\n\n if (organization.address) {\n const addr = organization.address;\n const addressNode: Record<string, unknown> = {\n \"@type\": \"PostalAddress\",\n };\n if (addr.street) addressNode.streetAddress = addr.street;\n if (addr.city) addressNode.addressLocality = addr.city;\n if (addr.region) addressNode.addressRegion = addr.region;\n if (addr.postal_code) addressNode.postalCode = addr.postal_code;\n if (addr.country) addressNode.addressCountry = addr.country;\n orgNode.address = addressNode;\n }\n\n if (\n organization.social_profiles &&\n organization.social_profiles.length > 0\n ) {\n orgNode.sameAs = organization.social_profiles.map(sp => sp.url);\n }\n\n graph.push(orgNode);\n }\n\n // ----- BreadcrumbList -----\n const breadcrumbs =\n input.breadcrumbs ??\n buildBreadcrumbs(path, page?.title ?? blogPost?.title ?? siteName);\n const breadcrumbNode: Record<string, unknown> = {\n \"@type\": \"BreadcrumbList\",\n \"@id\": `${canonicalUrl}#breadcrumb`,\n itemListElement: breadcrumbs.map((crumb, index) => ({\n \"@type\": \"ListItem\",\n position: index + 1,\n name: crumb.name,\n item: siteUrl + crumb.path,\n })),\n };\n graph.push(breadcrumbNode);\n\n // ----- WebPage / FAQPage / etc. -----\n if (page) {\n const schemaType = page.schemaType || \"WebPage\";\n const pageNode: Record<string, unknown> = {\n \"@type\": schemaType,\n \"@id\": `${canonicalUrl}#webpage`,\n url: canonicalUrl,\n name: page.title,\n isPartOf: { \"@id\": `${siteUrl}/#website` },\n breadcrumb: { \"@id\": `${canonicalUrl}#breadcrumb` },\n inLanguage: locale,\n };\n if (page.description) pageNode.description = page.description;\n if (page.datePublished) pageNode.datePublished = page.datePublished;\n if (page.dateModified) pageNode.dateModified = page.dateModified;\n if (page.ogImage) {\n pageNode.primaryImageOfPage = {\n \"@type\": \"ImageObject\",\n url: page.ogImage,\n };\n }\n graph.push(pageNode);\n }\n\n // ----- Article / BlogPosting -----\n if (blogPost) {\n const articleNode: Record<string, unknown> = {\n \"@type\": \"BlogPosting\",\n \"@id\": `${canonicalUrl}#article`,\n headline: blogPost.title,\n url: canonicalUrl,\n isPartOf: { \"@id\": `${siteUrl}/#website` },\n mainEntityOfPage: { \"@id\": `${canonicalUrl}#webpage` },\n inLanguage: locale,\n datePublished: blogPost.datePublished,\n };\n if (blogPost.dateModified) articleNode.dateModified = blogPost.dateModified;\n if (blogPost.excerpt) articleNode.description = blogPost.excerpt;\n if (blogPost.featuredImage) {\n articleNode.image = {\n \"@type\": \"ImageObject\",\n url: blogPost.featuredImage,\n };\n }\n if (blogPost.categories && blogPost.categories.length > 0) {\n articleNode.articleSection = blogPost.categories;\n }\n if (organization) {\n articleNode.publisher = { \"@id\": `${siteUrl}/#organization` };\n }\n\n // Author\n if (blogPost.authorName) {\n const personNode: Record<string, unknown> = {\n \"@type\": \"Person\",\n \"@id\": `${siteUrl}/#author`,\n name: blogPost.authorName,\n };\n if (blogPost.authorUrl) personNode.url = blogPost.authorUrl;\n graph.push(personNode);\n articleNode.author = { \"@id\": `${siteUrl}/#author` };\n }\n\n // If no explicit page node was pushed, add a lightweight WebPage as the\n // mainEntityOfPage container\n if (!page) {\n graph.push({\n \"@type\": \"WebPage\",\n \"@id\": `${canonicalUrl}#webpage`,\n url: canonicalUrl,\n name: blogPost.title,\n isPartOf: { \"@id\": `${siteUrl}/#website` },\n breadcrumb: { \"@id\": `${canonicalUrl}#breadcrumb` },\n inLanguage: locale,\n });\n }\n\n graph.push(articleNode);\n }\n\n return {\n \"@context\": \"https://schema.org\",\n \"@graph\": graph,\n };\n}\n\nfunction slugToTitle(slug: string): string {\n return slug\n .split(\"-\")\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction hasOrganizationData(org: OrganizationInfo): boolean {\n return !!(\n org.name ||\n org.legal_name ||\n org.logo ||\n org.url ||\n org.email ||\n org.phone ||\n org.description\n );\n}\n","/**\n * SEO utility functions for OTL CMS.\n *\n * These helpers extract common metadata from deployment configs and are used\n * by both the engine's `generateMetadata` and component-level code.\n *\n * They are environment-agnostic: callers pass an explicit `siteUrlOverride`\n * (e.g. from `process.env.NEXT_PUBLIC_SITE_URL`) instead of reading env vars\n * directly, keeping the package framework-independent.\n */\n\n/**\n * Derive the public site origin (no trailing slash).\n *\n * Priority:\n * 1. `siteUrlOverride` (e.g. env var)\n * 2. First custom domain from deployment config\n * 3. Subdomain-based OTL Studio URL\n */\nexport function deriveSiteUrl(\n configs: Record<string, unknown>,\n siteUrlOverride?: string\n): string {\n let url = \"\";\n if (siteUrlOverride) {\n url = siteUrlOverride;\n } else {\n const deployment = configs.deployment as\n | Record<string, unknown>\n | undefined;\n const customDomains = deployment?.custom_domains as string[] | undefined;\n if (customDomains?.[0]) {\n url = `https://${customDomains[0]}`;\n } else {\n const subdomain = deployment?.subdomain as string | undefined;\n if (subdomain) url = `https://${subdomain}.otl.studio`;\n }\n }\n return url.replace(/\\/+$/, \"\");\n}\n\n/** Extract the localized site name from configs. */\nexport function deriveSiteName(\n configs: Record<string, unknown>,\n locale: string\n): string {\n const website = configs.website as Record<string, unknown> | undefined;\n if (!website?.site_name) return \"Website\";\n if (typeof website.site_name === \"string\") return website.site_name;\n const names = website.site_name as Record<string, string>;\n return names[locale] || names.en || \"Website\";\n}\n\n/** Extract the localized site description from configs. */\nexport function deriveSiteDescription(\n configs: Record<string, unknown>,\n locale: string\n): string | undefined {\n const website = configs.website as Record<string, unknown> | undefined;\n if (!website?.description) return undefined;\n if (typeof website.description === \"string\") return website.description;\n const descs = website.description as Record<string, string>;\n return descs[locale] || undefined;\n}\n\n/**\n * Detect a locale prefix from the first URL segment.\n *\n * Returns `[locale, pathWithoutPrefix]`. If the first segment is not a\n * recognised locale, the deployment's default locale and the original path\n * are returned unchanged.\n */\nexport function detectLocaleFromSegments(\n segments: string[],\n fullPath: string,\n supportedLocales: string[],\n defaultLocale: string\n): [string, string] {\n const normalizedLocales = supportedLocales.map(l => l.toLowerCase());\n const firstSegment = segments[0];\n const localeIndex = normalizedLocales.indexOf(firstSegment?.toLowerCase());\n if (localeIndex !== -1) {\n return [\n supportedLocales[localeIndex],\n \"/\" + segments.slice(1).join(\"/\") || \"/\",\n ];\n }\n return [defaultLocale, fullPath];\n}\n\n/**\n * Convert a short locale code to the `og:locale` format.\n *\n * \"en\" -> \"en_US\", \"de\" -> \"de_DE\", etc.\n * If the code is already in `xx_XX` form it is returned as-is.\n */\nexport function localeToOgFormat(locale: string): string {\n if (locale.includes(\"_\")) return locale;\n const map: Record<string, string> = {\n en: \"en_US\",\n de: \"de_DE\",\n fr: \"fr_FR\",\n es: \"es_ES\",\n it: \"it_IT\",\n pt: \"pt_BR\",\n nl: \"nl_NL\",\n ja: \"ja_JP\",\n zh: \"zh_CN\",\n ko: \"ko_KR\",\n ru: \"ru_RU\",\n ar: \"ar_SA\",\n pl: \"pl_PL\",\n sv: \"sv_SE\",\n da: \"da_DK\",\n fi: \"fi_FI\",\n nb: \"nb_NO\",\n tr: \"tr_TR\",\n };\n return map[locale.toLowerCase()] || `${locale}_${locale.toUpperCase()}`;\n}\n\n/**\n * Build hreflang alternate URLs for multi-locale support.\n *\n * Uses the locale-prefix pattern: the default locale maps to the bare path\n * while other locales are prefixed (`/de/path`). An `x-default` entry\n * points to the un-prefixed URL.\n *\n * Returns `undefined` when there is only a single locale (hreflang would be\n * pointless).\n */\nexport function buildHreflangAlternates(\n siteUrl: string,\n path: string,\n supportedLocales: string[],\n defaultLocale: string\n): Record<string, string> | undefined {\n if (!siteUrl || supportedLocales.length <= 1) return undefined;\n\n const languages: Record<string, string> = {};\n for (const loc of supportedLocales) {\n if (loc === defaultLocale) {\n languages[loc] = `${siteUrl}${path}`;\n } else {\n languages[loc] = `${siteUrl}/${loc}${path}`;\n }\n }\n languages[\"x-default\"] = `${siteUrl}${path}`;\n return languages;\n}\n\nexport interface PaginationInfo {\n page: number;\n totalPages: number;\n hasNext: boolean;\n hasPrev: boolean;\n}\n\n/**\n * Walk through enriched layout sections/blocks and return the first\n * pagination object found (from a `blog-post-list` or `blog-pagination`\n * block's `data.pagination`).\n */\nexport function extractPaginationFromLayout(\n layout: unknown[] | undefined\n): PaginationInfo | null {\n if (!layout) return null;\n for (const section of layout) {\n const sConfig = (section as Record<string, unknown>)?.config as\n | Record<string, unknown>\n | undefined;\n if (!sConfig) continue;\n const result = findPaginationInBlocks(\n (sConfig.children as unknown[]) || []\n );\n if (result) return result;\n }\n return null;\n}\n\nfunction findPaginationInBlocks(blocks: unknown[]): PaginationInfo | null {\n for (const block of blocks) {\n const b = block as Record<string, unknown>;\n const config = b?.config as Record<string, unknown> | undefined;\n if (!config) continue;\n const data = config.data as Record<string, unknown> | undefined;\n if (data?.pagination) {\n const p = data.pagination as Record<string, unknown>;\n return {\n page: (p.page as number) || 1,\n totalPages: (p.totalPages as number) || 1,\n hasNext: (p.hasNext as boolean) || false,\n hasPrev: (p.hasPrev as boolean) || false,\n };\n }\n if (config.children) {\n const nested = findPaginationInBlocks(config.children as unknown[]);\n if (nested) return nested;\n }\n if (config.child) {\n const nested = findPaginationInBlocks(config.child as unknown[]);\n if (nested) return nested;\n }\n }\n return null;\n}\n"]}
|