@json-to-office/core-docx 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/themes/defaults.ts","../src/templates/themes/minimal.docx.theme.json","../src/templates/themes/corporate.docx.theme.json","../src/templates/themes/modern.docx.theme.json","../src/templates/themes/index.ts","../src/styles/utils/colorUtils.ts","../src/styles/utils/styleHelpers.ts","../src/styles/utils/layoutUtils.ts","../src/themes/json/parser.ts","../src/themes/json/validator.ts","../src/themes/json/loader.ts","../src/themes/json/index.ts","../src/styles/index.ts","../src/utils/widthUtils.ts","../src/utils/imageUtils.ts","../src/utils/docxImagePositioning.ts","../src/utils/numberingConfig.ts","../src/utils/fixFloatingImageIds.ts","../src/core/generator.ts","../src/types/index.ts","../src/utils/formatters.ts","../src/core/structure.ts","../src/core/layout.ts","../src/core/render.ts","../src/styles/themeToDocxAdapter.ts","../src/utils/textParser.ts","../src/utils/placeholderProcessor.ts","../src/utils/unicode.ts","../src/cache/index.ts","../src/cache/key-generator.ts","../src/core/cached-render.ts","../src/styles/utils/componentDefaults.ts","../src/core/content.ts","../src/utils/bookmarkRegistry.ts","../src/components/heading.ts","../src/components/paragraph.ts","../src/components/list.ts","../src/components/image.ts","../src/components/text-box.ts","../src/styles/utils/borderUtils.ts","../src/styles/utils/cellUtils.ts","../src/components/table.ts","../src/components/section.ts","../src/components/columns.ts","../src/components/statistic.ts","../src/components/header.ts","../src/utils/alignmentUtils.ts","../src/components/footer.ts","../src/components/toc/index.ts","../src/utils/environment.ts","../src/components/highcharts.ts","../src/components/text-space-after.ts","../src/plugin/createComponent.ts","../src/json/parser.ts","../src/json/normalizer.ts","../src/json/filesystem.ts","../src/utils/warningsDocument.ts","../src/index.ts","../src/templates/documents/index.ts","../src/utils/exampleRunner.ts","../src/plugin/createDocumentGenerator.ts","../src/plugin/version-resolver.ts","../src/plugin/validation.ts","../src/plugin/schema.ts","../src/styles/theme-resolver.ts","../src/styles/theme-validator.ts"],"sourcesContent":["/**\n * Default theme values and utilities for handling optional theme properties\n */\n\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\n\n/**\n * Default colors for themes\n */\nexport const DEFAULT_COLORS = {\n primary: '#000000',\n secondary: '#666666',\n accent: '#0066CC',\n text: '#000000',\n background: '#FFFFFF',\n border: '#CCCCCC',\n // Semantic colors\n textPrimary: '#000000',\n textSecondary: '#666666',\n textMuted: '#999999',\n borderPrimary: '#CCCCCC',\n borderSecondary: '#E5E5E5',\n backgroundPrimary: '#FFFFFF',\n backgroundSecondary: '#F5F5F5',\n};\n\n/**\n * Default fonts for themes\n */\nexport const DEFAULT_FONTS = {\n heading: { family: 'Arial', size: 20 },\n body: { family: 'Arial', size: 11 },\n mono: { family: 'Courier New', size: 10 },\n light: { family: 'Arial', size: 24 },\n};\n\n/**\n * Default styles for themes\n */\nexport const DEFAULT_STYLES = {\n normal: {\n font: 'body' as const,\n size: 11,\n color: '#000000',\n alignment: 'left' as const,\n lineSpacing: {\n type: 'single' as const,\n value: 1,\n },\n spacing: {\n after: 6,\n },\n },\n heading1: {\n font: 'heading' as const,\n size: 24,\n color: '#000000',\n bold: true,\n spacing: {\n before: 12,\n after: 12,\n },\n },\n heading2: {\n font: 'heading' as const,\n size: 20,\n color: '#000000',\n bold: true,\n spacing: {\n before: 10,\n after: 10,\n },\n },\n heading3: {\n font: 'heading' as const,\n size: 16,\n color: '#000000',\n bold: true,\n spacing: {\n before: 8,\n after: 8,\n },\n },\n heading4: {\n font: 'heading' as const,\n size: 14,\n color: '#000000',\n bold: true,\n spacing: {\n before: 6,\n after: 6,\n },\n },\n heading5: {\n font: 'heading' as const,\n size: 12,\n color: '#000000',\n bold: true,\n spacing: {\n before: 6,\n after: 6,\n },\n },\n heading6: {\n font: 'heading' as const,\n size: 11,\n color: '#000000',\n bold: true,\n spacing: {\n before: 6,\n after: 6,\n },\n },\n};\n\n/**\n * Default page settings\n */\nexport const DEFAULT_PAGE = {\n size: 'LETTER' as const,\n margins: {\n top: 720,\n bottom: 720,\n left: 720,\n right: 720,\n header: 360,\n footer: 360,\n gutter: 0,\n },\n};\n\n/**\n * Ensures theme has all required properties with defaults\n */\nexport function ensureThemeDefaults(\n theme: Partial<ThemeConfigJson>\n): ThemeConfigJson {\n return {\n $schema: theme.$schema,\n name: theme.name || 'default',\n displayName: theme.displayName || 'Default Theme',\n description: theme.description || 'Default theme configuration',\n version: theme.version || '1.0.0',\n colors: {\n ...DEFAULT_COLORS,\n ...(theme.colors || {}),\n },\n fonts: {\n heading: { ...DEFAULT_FONTS.heading, ...(theme.fonts?.heading || {}) },\n body: { ...DEFAULT_FONTS.body, ...(theme.fonts?.body || {}) },\n mono: { ...DEFAULT_FONTS.mono, ...(theme.fonts?.mono || {}) },\n light: { ...DEFAULT_FONTS.light, ...(theme.fonts?.light || {}) },\n },\n page: {\n ...DEFAULT_PAGE,\n ...(theme.page || {}),\n margins: {\n ...DEFAULT_PAGE.margins,\n ...(theme.page?.margins || {}),\n },\n },\n styles: theme.styles,\n componentDefaults: theme.componentDefaults,\n };\n}\n\n/**\n * Type guard to check if a theme has all required properties\n */\nexport function isCompleteTheme(theme: unknown): theme is ThemeConfigJson {\n const t = theme as Record<string, unknown>;\n return (\n t &&\n typeof t === 'object' &&\n !!t.colors &&\n !!t.fonts &&\n !!t.page &&\n typeof t.name === 'string' &&\n typeof t.displayName === 'string' &&\n typeof t.description === 'string' &&\n typeof t.version === 'string'\n );\n}\n\n/**\n * Safe getter for theme colors with defaults\n */\nexport function getThemeColors(theme: Partial<ThemeConfigJson>) {\n return {\n ...DEFAULT_COLORS,\n ...(theme.colors || {}),\n };\n}\n\n/**\n * Safe getter for theme fonts with defaults\n */\nexport function getThemeFonts(theme: Partial<ThemeConfigJson>) {\n return {\n ...DEFAULT_FONTS,\n ...(theme.fonts || {}),\n };\n}\n\n/**\n * Safe getter for theme styles with defaults\n */\nexport function getThemeStyles(theme: Partial<ThemeConfigJson>) {\n return {\n ...DEFAULT_STYLES,\n ...(theme.styles || {}),\n };\n}\n\n/**\n * Safe getter for normal style with defaults\n */\nexport function getNormalStyle(theme: Partial<ThemeConfigJson>) {\n const styles = getThemeStyles(theme);\n return {\n ...DEFAULT_STYLES.normal,\n ...(styles.normal || {}),\n };\n}\n","{\n \"$schema\": \"../../../../shared/json-schemas/theme.schema.json\",\n \"name\": \"minimal\",\n \"displayName\": \"Minimal Clean\",\n \"description\": \"A clean, minimalist theme focused on readability and elegant simplicity\",\n \"version\": \"2.0.0\",\n \"colors\": {\n \"primary\": \"#000000\",\n \"secondary\": \"#666666\",\n \"accent\": \"#2c3e50\",\n \"background\": \"#ffffff\",\n \"text\": \"#2c2c2c\",\n \"border\": \"#f0f0f0\",\n \"textPrimary\": \"#000000\",\n \"textSecondary\": \"#4a4a4a\",\n \"textMuted\": \"#999999\",\n \"borderPrimary\": \"#e0e0e0\",\n \"borderSecondary\": \"#f5f5f5\",\n \"backgroundPrimary\": \"#ffffff\",\n \"backgroundSecondary\": \"#fafafa\"\n },\n \"fonts\": {\n \"heading\": {\n \"family\": \"Arial\",\n \"size\": 24\n },\n \"body\": {\n \"family\": \"Arial\",\n \"size\": 11\n },\n \"mono\": {\n \"family\": \"SF Mono\",\n \"size\": 10\n },\n \"light\": {\n \"family\": \"Arial\",\n \"size\": 24\n }\n },\n \"page\": {\n \"size\": \"A4\",\n \"margins\": {\n \"top\": 1440,\n \"bottom\": 1440,\n \"left\": 1080,\n \"right\": 1080,\n \"header\": 720,\n \"footer\": 720,\n \"gutter\": 0\n }\n },\n \"styles\": {\n \"normal\": {\n \"font\": \"body\",\n \"color\": \"#000000\",\n \"lineSpacing\": {\n \"type\": \"multiple\",\n \"value\": 1.5\n },\n \"alignment\": \"justify\",\n \"spacing\": {\n \"after\": 9\n }\n },\n \"heading1\": {\n \"font\": \"light\",\n \"size\": 24,\n \"bold\": false,\n \"color\": \"#000000\",\n \"spacing\": {\n \"before\": 18,\n \"after\": 12\n },\n \"keepNext\": true,\n \"alignment\": \"left\",\n \"characterSpacing\": {\n \"type\": \"expanded\",\n \"value\": 1.2\n }\n },\n \"heading2\": {\n \"font\": \"light\",\n \"size\": 20,\n \"bold\": false,\n \"color\": \"#000000\",\n \"spacing\": {\n \"before\": 12,\n \"after\": 9\n },\n \"keepNext\": true,\n \"alignment\": \"left\",\n \"characterSpacing\": {\n \"type\": \"expanded\",\n \"value\": 0.8\n }\n },\n \"heading3\": {\n \"font\": \"heading\",\n \"size\": 16,\n \"bold\": false,\n \"color\": \"#2c2c2c\",\n \"spacing\": {\n \"before\": 9,\n \"after\": 6\n },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading4\": {\n \"font\": \"heading\",\n \"size\": 14,\n \"bold\": true,\n \"color\": \"#4a4a4a\",\n \"spacing\": {\n \"before\": 6,\n \"after\": 4\n },\n \"keepNext\": true\n },\n \"heading5\": {\n \"font\": \"heading\",\n \"size\": 12,\n \"bold\": false,\n \"italic\": true,\n \"color\": \"#666666\",\n \"spacing\": {\n \"before\": 4,\n \"after\": 3\n }\n },\n \"heading6\": {\n \"font\": \"light\",\n \"size\": 11,\n \"bold\": false,\n \"color\": \"#999999\",\n \"spacing\": {\n \"before\": 3,\n \"after\": 2\n }\n },\n \"title\": {\n \"font\": \"light\",\n \"bold\": false,\n \"color\": \"#000000\",\n \"alignment\": \"left\",\n \"spacing\": {\n \"before\": 0,\n \"after\": 24\n },\n \"characterSpacing\": {\n \"type\": \"condensed\",\n \"value\": 20\n }\n },\n \"subtitle\": {\n \"font\": \"light\",\n \"size\": 16,\n \"italic\": false,\n \"color\": \"#666666\",\n \"alignment\": \"left\",\n \"spacing\": {\n \"before\": 0,\n \"after\": 18\n }\n }\n },\n \"componentDefaults\": {\n \"table\": {\n \"borders\": false,\n \"striped\": false,\n \"headerBackground\": \"#fafafa\",\n \"headerColor\": \"#000000\",\n \"borderColor\": \"#f0f0f0\",\n \"borderWidth\": 0.5\n },\n \"list\": {\n \"format\": \"bullet\",\n \"bullet\": \"•\",\n \"indent\": 3\n },\n \"image\": {\n \"alignment\": \"left\"\n },\n \"statistic\": {\n \"alignment\": \"left\"\n },\n \"section\": {\n \"pageBreak\": false\n },\n \"heading\": {\n \"numbering\": false\n }\n }\n}\n","{\n \"name\": \"corporate\",\n \"displayName\": \"Corporate Professional\",\n \"description\": \"A polished corporate theme with blue accents and structured typography\",\n \"version\": \"2.0.0\",\n \"colors\": {\n \"primary\": \"#1a365d\",\n \"secondary\": \"#2D3748\",\n \"accent\": \"#3182CE\",\n \"text\": \"#1A202C\",\n \"background\": \"#FFFFFF\",\n \"border\": \"#E2E8F0\",\n \"textPrimary\": \"#1A202C\",\n \"textSecondary\": \"#4A5568\",\n \"textMuted\": \"#A0AEC0\",\n \"borderPrimary\": \"#CBD5E0\",\n \"borderSecondary\": \"#E2E8F0\",\n \"backgroundPrimary\": \"#FFFFFF\",\n \"backgroundSecondary\": \"#F7FAFC\"\n },\n \"fonts\": {\n \"heading\": { \"family\": \"Georgia\", \"size\": 26 },\n \"body\": { \"family\": \"Calibri\", \"size\": 11 },\n \"mono\": { \"family\": \"Consolas\", \"size\": 10 },\n \"light\": { \"family\": \"Georgia\", \"size\": 26 }\n },\n \"page\": {\n \"size\": \"A4\",\n \"margins\": {\n \"top\": 1440,\n \"bottom\": 1440,\n \"left\": 1200,\n \"right\": 1200,\n \"header\": 720,\n \"footer\": 720,\n \"gutter\": 0\n }\n },\n \"styles\": {\n \"normal\": {\n \"font\": \"body\",\n \"color\": \"#1A202C\",\n \"lineSpacing\": { \"type\": \"multiple\", \"value\": 1.4 },\n \"alignment\": \"justify\",\n \"spacing\": { \"after\": 8 }\n },\n \"heading1\": {\n \"font\": \"heading\",\n \"size\": 26,\n \"bold\": false,\n \"color\": \"primary\",\n \"spacing\": { \"before\": 24, \"after\": 12 },\n \"keepNext\": true,\n \"alignment\": \"left\",\n \"borders\": {\n \"bottom\": { \"style\": \"single\", \"size\": 2, \"color\": \"primary\", \"space\": 6 }\n }\n },\n \"heading2\": {\n \"font\": \"heading\",\n \"size\": 18,\n \"bold\": false,\n \"color\": \"secondary\",\n \"spacing\": { \"before\": 18, \"after\": 8 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading3\": {\n \"font\": \"body\",\n \"size\": 13,\n \"bold\": true,\n \"color\": \"accent\",\n \"spacing\": { \"before\": 12, \"after\": 6 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"title\": {\n \"font\": \"light\",\n \"size\": 32,\n \"bold\": false,\n \"color\": \"primary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 18 }\n },\n \"subtitle\": {\n \"font\": \"body\",\n \"size\": 16,\n \"italic\": false,\n \"color\": \"textSecondary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 24 }\n }\n },\n \"componentDefaults\": {\n \"table\": {\n \"borders\": true,\n \"striped\": true,\n \"headerBackground\": \"#1a365d\",\n \"headerColor\": \"#FFFFFF\",\n \"borderColor\": \"#E2E8F0\",\n \"borderWidth\": 0.5\n },\n \"list\": {\n \"format\": \"bullet\",\n \"bullet\": \"\\u2022\",\n \"indent\": 3\n },\n \"statistic\": {\n \"alignment\": \"center\"\n },\n \"section\": {\n \"pageBreak\": false\n },\n \"heading\": {\n \"numbering\": false\n }\n }\n}\n","{\n \"name\": \"modern\",\n \"displayName\": \"Modern Clean\",\n \"description\": \"A contemporary theme with vibrant accents and generous whitespace\",\n \"version\": \"2.0.0\",\n \"colors\": {\n \"primary\": \"#6D28D9\",\n \"secondary\": \"#1E293B\",\n \"accent\": \"#0891B2\",\n \"text\": \"#0F172A\",\n \"background\": \"#FFFFFF\",\n \"border\": \"#E2E8F0\",\n \"textPrimary\": \"#0F172A\",\n \"textSecondary\": \"#475569\",\n \"textMuted\": \"#94A3B8\",\n \"borderPrimary\": \"#CBD5E1\",\n \"borderSecondary\": \"#E2E8F0\",\n \"backgroundPrimary\": \"#FFFFFF\",\n \"backgroundSecondary\": \"#F8FAFC\"\n },\n \"fonts\": {\n \"heading\": { \"family\": \"Helvetica\", \"size\": 28 },\n \"body\": { \"family\": \"Helvetica\", \"size\": 11 },\n \"mono\": { \"family\": \"SF Mono\", \"size\": 10 },\n \"light\": { \"family\": \"Helvetica\", \"size\": 28 }\n },\n \"page\": {\n \"size\": \"A4\",\n \"margins\": {\n \"top\": 1440,\n \"bottom\": 1440,\n \"left\": 1080,\n \"right\": 1080,\n \"header\": 720,\n \"footer\": 720,\n \"gutter\": 0\n }\n },\n \"styles\": {\n \"normal\": {\n \"font\": \"body\",\n \"color\": \"#0F172A\",\n \"lineSpacing\": { \"type\": \"multiple\", \"value\": 1.5 },\n \"alignment\": \"left\",\n \"spacing\": { \"after\": 10 }\n },\n \"heading1\": {\n \"font\": \"heading\",\n \"size\": 28,\n \"bold\": true,\n \"color\": \"primary\",\n \"spacing\": { \"before\": 24, \"after\": 14 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading2\": {\n \"font\": \"heading\",\n \"size\": 20,\n \"bold\": true,\n \"color\": \"secondary\",\n \"spacing\": { \"before\": 18, \"after\": 10 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading3\": {\n \"font\": \"body\",\n \"size\": 14,\n \"bold\": true,\n \"color\": \"accent\",\n \"spacing\": { \"before\": 12, \"after\": 6 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"title\": {\n \"font\": \"heading\",\n \"size\": 36,\n \"bold\": true,\n \"color\": \"primary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 12 }\n },\n \"subtitle\": {\n \"font\": \"light\",\n \"size\": 18,\n \"italic\": false,\n \"color\": \"textSecondary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 24 }\n }\n },\n \"componentDefaults\": {\n \"table\": {\n \"borders\": true,\n \"striped\": false,\n \"headerBackground\": \"#6D28D9\",\n \"headerColor\": \"#FFFFFF\",\n \"borderColor\": \"#E2E8F0\",\n \"borderWidth\": 0.5\n },\n \"list\": {\n \"format\": \"bullet\",\n \"bullet\": \"\\u2013\",\n \"indent\": 3\n },\n \"image\": {\n \"alignment\": \"center\"\n },\n \"statistic\": {\n \"alignment\": \"center\"\n },\n \"section\": {\n \"pageBreak\": false\n }\n }\n}\n","/**\n * JSON-based themes registry\n * This file provides a unified interface to JSON themes\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { ensureThemeDefaults } from '../../themes/defaults';\n\n// Import theme JSON files directly\nimport minimalThemeJson from './minimal.docx.theme.json';\nimport corporateThemeJson from './corporate.docx.theme.json';\nimport modernThemeJson from './modern.docx.theme.json';\n\n/**\n * Registry of available themes loaded from JSON files\n */\nlet _themesCache: Record<string, ThemeConfigJson> | null = null;\n\nfunction loadThemesFromJson(): Record<string, ThemeConfigJson> {\n if (_themesCache) {\n return _themesCache;\n }\n\n // Build themes from imported JSON files\n const themes: Record<string, ThemeConfigJson> = {\n minimal: ensureThemeDefaults(minimalThemeJson as ThemeConfigJson),\n corporate: ensureThemeDefaults(corporateThemeJson as ThemeConfigJson),\n modern: ensureThemeDefaults(modernThemeJson as ThemeConfigJson),\n };\n\n // Also try to load from file system for runtime additions (if available)\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const themesDir = path.join(__dirname, '../../../dist/templates/themes');\n\n if (fs.existsSync(themesDir)) {\n const themeFiles = fs\n .readdirSync(themesDir)\n .filter((file) => file.endsWith('.docx.theme.json'))\n .map((file) => path.basename(file, '.docx.theme.json'));\n\n for (const themeName of themeFiles) {\n if (!themes[themeName]) {\n try {\n const filePath = path.join(themesDir, `${themeName}.docx.theme.json`);\n const content = fs.readFileSync(filePath, 'utf8');\n const parsedTheme = JSON.parse(content);\n themes[themeName] = ensureThemeDefaults(parsedTheme);\n } catch (error) {\n console.warn(\n `Failed to load additional theme ${themeName}:`,\n error\n );\n }\n }\n }\n }\n } catch (error) {\n // Silently ignore if file system access fails (e.g., in bundled environment)\n }\n\n _themesCache = themes;\n return themes;\n}\n\nexport const themes = loadThemesFromJson();\n\n/**\n * Type representing valid theme names\n */\nexport type ThemeName = keyof typeof themes;\n\n/**\n * Get theme configuration by name\n * @param themeName - Name of the theme to retrieve\n * @returns Theme configuration or undefined if not found\n */\nexport const getTheme = (themeName: string): ThemeConfigJson | undefined => {\n return themes[themeName];\n};\n\n/**\n * Get theme configuration with safe fallback\n * @param themeName - Name of the theme to retrieve\n * @param fallbackTheme - Fallback theme name (default: 'minimal')\n * @returns Theme configuration (guaranteed to be defined)\n * @throws Error if neither theme nor fallback can be found\n */\nexport const getThemeWithFallback = (\n themeName: string,\n fallbackTheme: string = 'minimal'\n): ThemeConfigJson => {\n const theme = getTheme(themeName) || getTheme(fallbackTheme);\n\n if (!theme) {\n throw new Error(\n `Failed to load theme: ${themeName}. Fallback theme '${fallbackTheme}' also not found.`\n );\n }\n\n return theme;\n};\n\n/**\n * Check if a theme exists\n * @param themeName - Name of the theme to check\n * @returns True if theme exists, false otherwise\n */\nexport const hasTheme = (themeName: string): boolean => {\n return themeName in themes;\n};\n\n/**\n * Type guard to ensure theme name is valid\n * @param themeName - Theme name to validate\n * @returns True if theme name exists in registry\n */\nexport const isValidThemeName = (\n themeName: string\n): themeName is keyof typeof themes => {\n return hasTheme(themeName);\n};\n\n/**\n * Get all available theme names\n * @returns Array of theme names\n */\nexport const getThemeNames = (): string[] => {\n return Object.keys(themes);\n};\n\n// Export individual theme configs for direct access\nexport const minimalTheme = themes['minimal'];\nexport const corporateTheme = themes['corporate'];\nexport const modernTheme = themes['modern'];\n","import { ThemeConfig } from '../index';\nimport { getThemeColors } from '../../themes/defaults';\n\nexport type ColorName = keyof ReturnType<typeof getThemeColors>;\n\n// Union type for all valid color names\nexport type ValidColorName =\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'text'\n | 'background'\n | 'textPrimary'\n | 'textSecondary'\n | 'textMuted'\n | 'borderPrimary'\n | 'borderSecondary'\n | 'backgroundPrimary'\n | 'backgroundSecondary';\n\n// Type for color value that can be either a hex string or a color name\nexport type ColorValue = string; // Can be hex color or color name\n\n/**\n * Resolves a color value, which can be either a hex color string or a color name reference\n * @param colorValue - Either a hex color (e.g., '#000000') or a color name (e.g., 'primary')\n * @param theme - The theme configuration containing color definitions\n * @returns The resolved hex color value (6-character hex without #)\n * @throws Error if the color value is invalid\n */\nexport function resolveColor(\n colorValue: ColorValue,\n theme: ThemeConfig\n): string {\n // Check if it's a hex color with # prefix\n if (colorValue.startsWith('#')) {\n const hexValue = colorValue.slice(1);\n if (/^[0-9A-Fa-f]{6}$/.test(hexValue)) {\n return hexValue.toUpperCase(); // Normalize to uppercase\n }\n // Invalid hex format\n throw new Error(\n `Invalid hex color: \"${colorValue}\". Hex colors must be in format #RRGGBB (e.g., \"#000000\").`\n );\n }\n\n // If it's a color name, resolve it from the theme\n const colors = getThemeColors(theme);\n if (colorValue in colors) {\n const resolvedColor = colors[colorValue as ColorName];\n // Recursively resolve in case the theme color is also a reference\n return resolveColor(resolvedColor, theme);\n }\n\n // Strict validation - throw error for invalid colors\n throw new Error(\n `Invalid color value: \"${colorValue}\". Must be a hex color with # prefix (e.g., \"#000000\") or a valid theme color name.`\n );\n}\n\n/**\n * Validates if a color name exists in the theme\n * @param colorName - The color name to validate\n * @param theme - The theme configuration\n * @returns True if the color name exists in the theme\n */\nexport function isValidColorName(\n colorName: string,\n theme: ThemeConfig\n): boolean {\n const colors = getThemeColors(theme);\n return colorName in colors;\n}\n\n/**\n * Gets all available color names from a theme\n * @param theme - The theme configuration\n * @returns Array of valid color names\n */\nexport function getAvailableColorNames(theme: ThemeConfig): string[] {\n const colors = getThemeColors(theme);\n return Object.keys(colors);\n}\n","import { getTheme } from '../../templates/themes';\nimport { ThemeConfig } from '../index';\nimport { resolveColor } from './colorUtils';\nimport { LineSpacing } from '@json-to-office/shared-docx';\nimport { ISpacingProperties } from 'docx';\nimport { getNormalStyle } from '../../themes/defaults';\n\n// Constants for line spacing calculations\nconst TWIPS_PER_POINT = 20;\nconst SINGLE_LINE_SPACING_POINTS = 12;\nconst SINGLE_LINE_SPACING_TWIPS = SINGLE_LINE_SPACING_POINTS * TWIPS_PER_POINT;\nconst DOUBLE_LINE_SPACING_TWIPS = SINGLE_LINE_SPACING_TWIPS * 2;\n\n/**\n * Convert points to twips for docx spacing\n * @param points - Value in points\n * @returns Value in twips (1/20 of a point)\n */\nexport function pointsToTwips(points: number): number {\n return Math.round(points * TWIPS_PER_POINT);\n}\n\n/**\n * Resolve theme configuration from either a theme object or theme name\n * @param theme - Theme configuration object (for custom themes)\n * @param themeName - Theme name (for built-in themes)\n * @returns Resolved theme configuration\n */\nexport function resolveTheme(\n theme?: ThemeConfig,\n themeName?: string\n): ThemeConfig | undefined {\n // First check if we have a theme object passed directly (for custom themes)\n if (theme) {\n return theme;\n }\n\n // If no theme object, check for built-in theme by name\n if (themeName) {\n return getTheme(themeName);\n }\n\n // Default to minimal theme if nothing else works\n return getTheme('minimal');\n}\n\n/**\n * Resolve font family from font reference (e.g., 'body', 'heading') to actual font family name\n * @param theme - Theme configuration object\n * @param fontRef - Font reference ('body', 'heading', 'mono', 'light') or undefined\n * @returns Actual font family name (e.g., 'Arial', 'Helvetica')\n */\nexport function resolveFontFamily(\n theme: ThemeConfig,\n fontRef?: 'heading' | 'body' | 'mono' | 'light'\n): string {\n // Handle empty/invalid themes gracefully\n if (!theme?.fonts?.body?.family) {\n return 'Arial'; // fallback to Arial\n }\n if (!fontRef) {\n return theme.fonts.body.family;\n }\n return theme.fonts[fontRef]?.family || theme.fonts.body.family;\n}\n\n/**\n * Resolve font size from font reference (e.g., 'body', 'heading') to actual font size in points\n * @param theme - Theme configuration object\n * @param fontRef - Font reference ('body', 'heading', 'mono', 'light') or undefined\n * @returns Font size in points (callers multiply by 2 for docx) or undefined if no size found\n */\nexport function resolveFontSize(\n theme: ThemeConfig,\n fontRef?: 'heading' | 'body' | 'mono' | 'light'\n): number | undefined {\n // Handle empty/invalid themes gracefully\n if (!theme?.fonts?.body?.size) {\n return undefined; // let caller handle fallback\n }\n if (!fontRef) {\n return theme.fonts.body.size;\n }\n return theme.fonts[fontRef]?.size || theme.fonts.body.size;\n}\n\n/**\n * Font properties that can be defined in font definitions\n */\nexport interface FontProperties {\n family?: string;\n size?: number;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n lineSpacing?: {\n type: 'single' | 'atLeast' | 'exactly' | 'double' | 'multiple';\n value?: number;\n };\n spacing?: {\n before?: number;\n after?: number;\n };\n characterSpacing?: { type: 'condensed' | 'expanded'; value: number };\n}\n\n/**\n * Resolve all font properties from font reference.\n * Returns all formatting properties defined in the font definition.\n * @param theme - Theme configuration object\n * @param fontRef - Font reference ('body', 'heading', 'mono', 'light') or undefined\n * @returns Object containing all font properties\n */\nexport function resolveFontProperties(\n theme: ThemeConfig,\n fontRef?: 'heading' | 'body' | 'mono' | 'light'\n): FontProperties {\n // Default to body font if no reference provided\n const targetFontKey = fontRef || 'body';\n\n // Handle empty/invalid themes gracefully\n if (!theme?.fonts?.[targetFontKey]) {\n return {\n family: 'Arial',\n size: 11,\n };\n }\n\n const fontDef = theme.fonts[targetFontKey] as FontProperties;\n\n return {\n family: fontDef.family,\n size: fontDef.size,\n color: fontDef.color,\n bold: fontDef.bold,\n italic: fontDef.italic,\n underline: fontDef.underline,\n alignment: fontDef.alignment,\n lineSpacing: fontDef.lineSpacing,\n spacing: fontDef.spacing,\n characterSpacing: fontDef.characterSpacing,\n };\n}\n\n/**\n * Merge font properties with style overrides.\n * Style properties take precedence over font properties.\n * Only defined (non-undefined) style properties override font properties.\n * @param fontProps - Properties from font definition\n * @param styleOverrides - Properties from style definition\n * @returns Merged properties object\n */\nexport function mergeFontAndStyleProperties<T extends Partial<FontProperties>>(\n fontProps: FontProperties,\n styleOverrides: T\n): FontProperties & T {\n // Filter out undefined values from styleOverrides to prevent overwriting font properties\n // Use type-safe Object.entries approach\n const definedOverrides = Object.entries(styleOverrides).reduce<\n Record<string, unknown>\n >((acc, [key, value]) => {\n if (value !== undefined) {\n acc[key] = value;\n }\n return acc;\n }, {});\n\n return {\n ...fontProps,\n ...definedOverrides,\n } as FontProperties & T;\n}\n\n/**\n * Get body text style configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Style configuration object\n */\nexport const getBodyTextStyle = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n\n if (themeConfig) {\n const normalStyle = getNormalStyle(themeConfig);\n return {\n size: (normalStyle.size || 11) * 2,\n font: resolveFontFamily(themeConfig, normalStyle.font),\n color: normalStyle.color\n ? resolveColor(normalStyle.color, themeConfig)\n : '000000',\n };\n }\n\n // Fallback\n return {\n size: 20,\n font: 'Arial',\n color: '000000',\n };\n};\n\n/**\n * Converts line spacing from theme definition to DOCX spacing options.\n * DOCX uses twips (1/20th of a point) for line spacing.\n * @param lineSpacing The line spacing object from the theme definition.\n * @returns IParagraphSpacingOptions for docx.\n */\nexport function convertLineSpacing(\n lineSpacing?: LineSpacing | number\n): ISpacingProperties | undefined {\n if (lineSpacing === undefined) {\n return undefined;\n }\n\n // Handle number (simple multiplier) case\n if (typeof lineSpacing === 'number') {\n return {\n line: Math.round(lineSpacing * SINGLE_LINE_SPACING_TWIPS),\n lineRule: 'auto',\n };\n }\n\n const { type, value } = lineSpacing;\n let line: number | undefined;\n let lineRule: 'auto' | 'exact' | 'atLeast' | undefined;\n\n switch (type) {\n case 'single':\n line = SINGLE_LINE_SPACING_TWIPS;\n lineRule = 'auto';\n break;\n case 'double':\n line = DOUBLE_LINE_SPACING_TWIPS;\n lineRule = 'auto';\n break;\n case 'atLeast':\n line = value !== undefined ? value * TWIPS_PER_POINT : undefined;\n lineRule = 'atLeast';\n break;\n case 'exactly':\n line = value !== undefined ? value * TWIPS_PER_POINT : undefined;\n lineRule = 'exact';\n break;\n case 'multiple':\n line =\n value !== undefined ? value * SINGLE_LINE_SPACING_TWIPS : undefined;\n lineRule = 'auto';\n break;\n default:\n return undefined;\n }\n\n return { line, lineRule };\n}\n","import { BorderStyle } from 'docx';\nimport { ThemeConfig } from '../index';\nimport { resolveColor } from './colorUtils';\nimport { resolveTheme, resolveFontFamily } from './styleHelpers';\n\n/**\n * Standard page sizes in twips (1/20 of a point, 1/1440 of an inch)\n */\nconst PAGE_SIZES = {\n A4: { width: 11906, height: 16838 },\n A3: { width: 16838, height: 23811 },\n LETTER: { width: 12240, height: 15840 },\n LEGAL: { width: 12240, height: 20160 },\n} as const;\n\n/**\n * Get page dimensions from size (string or object)\n */\nfunction getPageDimensions(\n size: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number }\n): { width: number; height: number } {\n if (typeof size === 'string') {\n return PAGE_SIZES[size];\n }\n return size;\n}\n\n/**\n * Get table style configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Table style configuration object\n */\nexport const getTableStyle = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n\n if (themeConfig && themeConfig.styles?.normal) {\n // Use normal style for both header and cell since tableHeader/tableCell styles are removed\n const normalStyle = themeConfig.styles.normal;\n return {\n tableHeader: {\n fill: resolveColor(\n themeConfig.colors?.primary || '#000000',\n themeConfig\n ),\n color: resolveColor(\n themeConfig.colors?.backgroundPrimary || '#FFFFFF',\n themeConfig\n ), // Use background color for header text\n bold: true, // Headers should be bold\n size: (normalStyle.size || 11) * 2, // Convert to half-points\n font: resolveFontFamily(themeConfig, normalStyle.font),\n },\n tableCell: {\n color: resolveColor(normalStyle.color || '#000000', themeConfig),\n size: (normalStyle.size || 11) * 2, // Convert to half-points\n font: resolveFontFamily(themeConfig, normalStyle.font),\n },\n alternatingRow: {\n fill: resolveColor(\n themeConfig.colors?.accent || '#F0F0F0',\n themeConfig\n ),\n },\n borders: {\n top: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n bottom: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n left: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n right: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n },\n };\n }\n\n // This shouldn't happen with minimal themes\n return {\n tableHeader: {\n fill: '000000',\n color: 'FFFFFF',\n bold: true,\n size: 22,\n font: 'Arial',\n },\n tableCell: {\n color: '000000',\n size: 20,\n font: 'Arial',\n },\n alternatingRow: {\n fill: 'F5F5F5',\n },\n borders: {\n top: { style: BorderStyle.SINGLE, size: 1, color: '000000' },\n bottom: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: '000000',\n },\n left: { style: BorderStyle.SINGLE, size: 1, color: '000000' },\n right: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: '000000',\n },\n },\n };\n};\n\n/**\n * Get document margins configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Document margins object\n */\nexport const getDocumentMargins = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n\n if (themeConfig?.page?.margins) {\n return themeConfig.page.margins;\n }\n\n // Default margins for all themes (standard Word document margins)\n return {\n top: 1440, // 1 inch in twips\n right: 1440, // 1 inch in twips\n bottom: 1440, // 1 inch in twips\n left: 1440, // 1 inch in twips\n header: 720, // 0.5 inch in twips\n footer: 720, // 0.5 inch in twips\n };\n};\n\n/**\n * Get page setup configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Page setup object\n */\nexport const getPageSetup = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n const defaultMargins = getDocumentMargins(theme, themeName);\n\n if (themeConfig?.page) {\n const margins = themeConfig.page.margins || {};\n const dimensions = getPageDimensions(themeConfig.page.size);\n return {\n size: {\n width: dimensions.width,\n height: dimensions.height,\n },\n margin: {\n top: margins.top ?? defaultMargins.top ?? 1440,\n right: margins.right ?? defaultMargins.right ?? 1440,\n bottom: margins.bottom ?? defaultMargins.bottom ?? 1440,\n left: margins.left ?? defaultMargins.left ?? 1440,\n },\n };\n }\n\n // Default page setup for all themes\n return {\n size: {\n width: 11906, // 8.5 inches in twips (Letter size)\n height: 16838, // 11.7 inches in twips (Letter size)\n },\n margin: {\n top: defaultMargins.top ?? 1440,\n right: defaultMargins.right ?? 1440,\n bottom: defaultMargins.bottom ?? 1440,\n left: defaultMargins.left ?? 1440,\n },\n };\n};\n","/**\n * Theme Parser using unified validation (TypeBox under the hood)\n */\n\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { validateThemeJson } from '@json-to-office/shared-docx/validation/unified';\nimport type { ValidationError } from '@json-to-office/shared-docx/validation/unified';\nimport { ensureThemeDefaults } from '../../themes/defaults';\n\n// Custom error classes with enhanced error details\nexport class ThemeValidationError extends Error {\n constructor(public errors: ValidationError[]) {\n const errorCount = errors.length;\n const errorSummary = errors\n .slice(0, 3)\n .map((error) => {\n const path = error.path\n ? error.path.replace(/^\\//, '').replace(/\\//g, '.')\n : '';\n const pathStr = path ? `${path}: ` : '';\n return `${pathStr}${error.message}`;\n })\n .join('; ');\n\n super(\n `Theme validation failed with ${errorCount} error${errorCount > 1 ? 's' : ''}: ${errorSummary}${errorCount > 3 ? '...' : ''}`\n );\n this.name = 'ThemeValidationError';\n }\n\n getDetailedErrors(): string[] {\n return this.errors.map((error) => {\n const path = error.path\n ? error.path.replace(/^\\//, '').replace(/\\//g, '.')\n : '';\n const pathStr = path ? `${path}: ` : '';\n return `${pathStr}${error.message}`;\n });\n }\n}\n\nexport class ThemeParseError extends Error {\n constructor(\n message: string,\n public cause?: Error\n ) {\n super(`Failed to parse theme: ${message}`);\n this.name = 'ThemeParseError';\n }\n}\n\n// Theme parser class with comprehensive validation and error handling\nexport class ThemeParser {\n private readonly MAX_JSON_SIZE = 1024 * 1024; // 1MB limit (pre-parse guard)\n\n parse(jsonString: string): ThemeConfigJson {\n try {\n // Input validation and sanitization\n this.validateInput(jsonString);\n\n // Use unified validator (handles parsing + position calculation)\n const result = validateThemeJson(jsonString);\n if (!result.valid) {\n throw new ThemeValidationError(result.errors || []);\n }\n\n const validated = result.data as ThemeConfigJson;\n\n // Apply defaults and return ThemeConfig\n return this.applyDefaults(validated);\n } catch (error) {\n if (\n error instanceof ThemeValidationError ||\n error instanceof ThemeParseError\n ) {\n throw error;\n }\n throw new ThemeParseError(\n `Unexpected error during theme parsing: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private validateInput(jsonString: string): void {\n // Check for null/undefined\n if (!jsonString) {\n throw new ThemeParseError('JSON string cannot be null or empty');\n }\n\n // Check string type\n if (typeof jsonString !== 'string') {\n throw new ThemeParseError('Input must be a string');\n }\n\n // Check size limits (additional robustness guard)\n if (jsonString.length > this.MAX_JSON_SIZE) {\n throw new ThemeParseError(\n `JSON string too large (${jsonString.length} bytes, max ${this.MAX_JSON_SIZE} bytes)`\n );\n }\n }\n\n private applyDefaults(parsedTheme: ThemeConfigJson): ThemeConfigJson {\n // Apply defaults to ensure all required properties are present\n // This handles partial theme configurations by merging with defaults\n return ensureThemeDefaults(parsedTheme);\n }\n\n // Utility method for validating without parsing\n validate(jsonString: string): { valid: boolean; errors?: string[] } {\n try {\n this.validateInput(jsonString);\n const result = validateThemeJson(jsonString);\n\n if (result.valid) {\n return { valid: true };\n } else {\n const errors = (result.errors || []).map((e) => {\n const path = e.path\n ? e.path.replace(/^\\//, '').replace(/\\//g, '.')\n : '';\n const pathStr = path ? `${path}: ` : '';\n return `${pathStr}${e.message}`;\n });\n return { valid: false, errors };\n }\n } catch (error) {\n return {\n valid: false,\n errors: [\n error instanceof Error ? error.message : 'Unknown validation error',\n ],\n };\n }\n }\n}\n","/**\n * Theme Validator - thin wrapper over shared unified validator\n * Maintains backward-compatible API while removing duplicate logic\n */\n\nimport { validateThemeJson as validateThemeJsonUnified } from '@json-to-office/shared-docx/validation/unified';\n\n// Backward-compatible ValidationResult type used by core\nexport type ValidationResult = {\n success: boolean;\n error?: {\n issues: Array<{\n code: string;\n message: string;\n path: Array<string | number>;\n expected?: string;\n received?: string;\n type?: string;\n minimum?: number;\n maximum?: number;\n validation?: string;\n options?: string[];\n line?: number;\n column?: number;\n }>;\n };\n};\n\n// Validator function using unified shared validation\nexport function validateThemeJson(jsonString: string): ValidationResult {\n const result = validateThemeJsonUnified(jsonString);\n\n if (result.valid) {\n return { success: true };\n }\n\n const issues = (result.errors || []).map((e) => {\n const pathArray = (e.path || '')\n .split('/')\n .filter((p) => p)\n .map((p) => {\n const num = parseInt(p, 10);\n return isNaN(num) ? p : num;\n });\n\n return {\n code: e.code || 'validation_error',\n message: e.message,\n path: pathArray,\n line: e.line,\n column: e.column,\n };\n });\n\n return { success: false, error: { issues } };\n}\n\nexport function formatValidationErrors(error: {\n issues: Array<any>;\n}): string[] {\n return error.issues.map((issue) => {\n const path =\n issue.path && issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';\n let message = issue.message;\n // Keep messages simple; unified validator already includes good messages\n return `${path}${message}`;\n });\n}\n\nexport function isValidThemeJson(jsonString: string): boolean {\n const result = validateThemeJson(jsonString);\n return result.success;\n}\n\nexport function getValidationSummary(jsonString: string): {\n valid: boolean;\n errorCount: number;\n errors: string[];\n summary: string;\n} {\n const result = validateThemeJson(jsonString);\n\n if (result.success) {\n return {\n valid: true,\n errorCount: 0,\n errors: [],\n summary: 'Theme JSON is valid',\n };\n }\n\n const errors = formatValidationErrors(result.error!);\n const errorCount = errors.length;\n\n return {\n valid: false,\n errorCount,\n errors,\n summary: `Theme validation failed with ${errorCount} error${errorCount > 1 ? 's' : ''}`,\n };\n}\n","import { promises as fs } from 'fs';\nimport { normalize } from 'path';\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { ThemeParser } from './parser';\n\n// File system error class with enhanced error details\nexport class ThemeFileError extends Error {\n constructor(\n message: string,\n public path?: string,\n public _cause?: Error\n ) {\n const pathInfo = path ? ` (path: ${path})` : '';\n super(`Failed to load theme file: ${message}${pathInfo}`);\n this.name = 'ThemeFileError';\n }\n}\n\n// Theme loader class with comprehensive security and error handling\nexport class ThemeLoader {\n private parser = new ThemeParser();\n private readonly MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB limit\n private readonly ALLOWED_EXTENSIONS = ['.json'];\n\n async loadFromFile(filePath: string): Promise<ThemeConfigJson> {\n try {\n // Validate file path for security\n this.validateFilePath(filePath);\n\n // Read file with size limits\n const content = await this.readFileWithLimits(filePath);\n\n // Parse the theme content\n return this.parser.parse(content);\n } catch (error) {\n if (error instanceof ThemeFileError) {\n throw error;\n }\n\n // Handle file system errors\n if (error && typeof error === 'object' && 'code' in error) {\n const fsError = error as { code?: string; message: string };\n let message: string;\n\n switch (fsError.code) {\n case 'ENOENT':\n message = 'File not found';\n break;\n case 'EACCES':\n message = 'Permission denied';\n break;\n case 'EISDIR':\n message = 'Path is a directory, not a file';\n break;\n case 'EMFILE':\n case 'ENFILE':\n message = 'Too many open files';\n break;\n case 'ENOTDIR':\n message = 'Directory in path does not exist';\n break;\n default:\n message = `File system error: ${fsError.message}`;\n }\n\n throw new ThemeFileError(\n message,\n filePath,\n error instanceof Error ? error : undefined\n );\n }\n\n // Handle other errors\n throw new ThemeFileError(\n `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,\n filePath,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n async loadFromUrl(_url: string): Promise<ThemeConfigJson> {\n // Future enhancement for loading themes from URLs\n // Would need additional dependencies (fetch) and security considerations\n throw new ThemeFileError(\n 'URL loading not yet implemented - use loadFromFile() instead'\n );\n }\n\n private validateFilePath(filePath: string): void {\n // Basic input validation\n if (!filePath || typeof filePath !== 'string') {\n throw new ThemeFileError('File path must be a non-empty string');\n }\n\n // Normalize the path to handle different separators and relative paths\n const normalizedPath = normalize(filePath);\n\n // Check for directory traversal attempts\n if (normalizedPath.includes('..')) {\n throw new ThemeFileError('Directory traversal is not allowed', filePath);\n }\n\n // Check for null bytes (path injection)\n if (normalizedPath.includes('\\0')) {\n throw new ThemeFileError(\n 'Null bytes in file path are not allowed',\n filePath\n );\n }\n\n // Validate file extension\n const hasValidExtension = this.ALLOWED_EXTENSIONS.some((ext) =>\n normalizedPath.toLowerCase().endsWith(ext)\n );\n\n if (!hasValidExtension) {\n throw new ThemeFileError(\n `Invalid file extension. Allowed: ${this.ALLOWED_EXTENSIONS.join(', ')}`,\n filePath\n );\n }\n\n // Additional security: ensure path is reasonable length\n if (normalizedPath.length > 1000) {\n throw new ThemeFileError('File path is too long', filePath);\n }\n }\n\n private async readFileWithLimits(filePath: string): Promise<string> {\n try {\n // Get file stats to check size before reading\n const stats = await fs.stat(filePath);\n\n // Check if it's actually a file\n if (!stats.isFile()) {\n throw new ThemeFileError('Path is not a regular file', filePath);\n }\n\n // Check file size limits\n if (stats.size > this.MAX_FILE_SIZE) {\n throw new ThemeFileError(\n `File too large (${stats.size} bytes, max ${this.MAX_FILE_SIZE} bytes)`,\n filePath\n );\n }\n\n // Check for empty file\n if (stats.size === 0) {\n throw new ThemeFileError('File is empty', filePath);\n }\n\n // Read file with proper encoding\n const content = await fs.readFile(filePath, 'utf8');\n\n // Verify content was read properly\n if (typeof content !== 'string') {\n throw new ThemeFileError('Failed to read file as text', filePath);\n }\n\n return content;\n } catch (error) {\n if (error instanceof ThemeFileError) {\n throw error;\n }\n\n // Re-throw as ThemeFileError for consistent error handling\n throw new ThemeFileError(\n `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,\n filePath,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n // Utility method to validate a file path without reading\n validateFile(filePath: string): { valid: boolean; error?: string } {\n try {\n this.validateFilePath(filePath);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n error:\n error instanceof Error ? error.message : 'Unknown validation error',\n };\n }\n }\n\n // Utility method to get file info\n async getFileInfo(filePath: string): Promise<{\n exists: boolean;\n size?: number;\n isFile?: boolean;\n error?: string;\n }> {\n try {\n const stats = await fs.stat(filePath);\n return {\n exists: true,\n size: stats.size,\n isFile: stats.isFile(),\n };\n } catch (error) {\n return {\n exists: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n","// Public API exports for JSON theme system\nexport {\n ThemeConfigSchema,\n type ThemeConfigJson,\n isValidThemeConfig,\n} from '@json-to-office/shared-docx';\nexport { ThemeParser, ThemeValidationError, ThemeParseError } from './parser';\nexport {\n validateThemeJson,\n formatValidationErrors,\n type ValidationResult,\n} from './validator';\nexport { ThemeLoader, ThemeFileError } from './loader';\n\n// Main API functions - Core public interface for JSON theme system\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { ThemeParser } from './parser';\nimport { ThemeLoader } from './loader';\n\n// Global instances for consistent behavior\nconst themeParser = new ThemeParser();\nconst themeLoader = new ThemeLoader();\n\n/**\n * Load and parse a theme from a JSON string\n * @param jsonString - JSON string containing theme definition\n * @returns Promise<ThemeConfig> - Parsed and validated theme configuration\n * @throws ThemeParseError - If JSON is malformed or invalid\n * @throws ThemeValidationError - If theme fails schema validation\n */\nexport async function loadThemeFromJson(\n jsonString: string\n): Promise<ThemeConfigJson> {\n return themeParser.parse(jsonString);\n}\n\n/**\n * Load and parse a theme from a JSON file\n * @param filePath - Path to JSON file containing theme definition\n * @returns Promise<ThemeConfig> - Parsed and validated theme configuration\n * @throws ThemeFileError - If file cannot be read or path is invalid\n * @throws ThemeParseError - If JSON is malformed or invalid\n * @throws ThemeValidationError - If theme fails schema validation\n */\nexport async function loadThemeFromFile(\n filePath: string\n): Promise<ThemeConfigJson> {\n return themeLoader.loadFromFile(filePath);\n}\n\n/**\n * Export a theme configuration to JSON string\n * @param theme - Theme configuration to export\n * @param pretty - Whether to format JSON with indentation (default: true)\n * @returns string - Formatted JSON string\n */\nexport function exportThemeToJson(\n theme: ThemeConfigJson,\n pretty: boolean = true\n): string {\n try {\n // Since ThemeConfig is inferred from TypeBox schema, it can be directly serialized\n // The schema ensures all properties are JSON-serializable\n\n if (pretty) {\n return JSON.stringify(theme, null, 2);\n } else {\n return JSON.stringify(theme);\n }\n } catch (error) {\n throw new Error(\n `Failed to export theme to JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Validate a JSON string against the theme schema without parsing\n * @param jsonString - JSON string to validate\n * @returns Validation result with success status and detailed errors\n */\nexport function validateThemeJsonString(jsonString: string) {\n return themeParser.validate(jsonString);\n}\n\n/**\n * Create a minimal theme template for users to start with\n * @returns ThemeConfig - Basic theme with required properties\n */\nexport function createMinimalTheme(): ThemeConfigJson {\n return {\n name: 'minimal-theme',\n displayName: 'Minimal Theme',\n description: 'A minimal theme with basic styling',\n version: '1.0.0',\n colors: {\n primary: '2563EB',\n secondary: '64748B',\n accent: 'F8FAFC',\n text: '334155',\n background: 'FFFFFF',\n border: '334155',\n textPrimary: '334155',\n textSecondary: '64748B',\n textMuted: '94A3B8',\n borderPrimary: '334155',\n borderSecondary: '64748B',\n backgroundPrimary: 'FFFFFF',\n backgroundSecondary: 'F8FAFC',\n },\n fonts: {\n heading: { family: 'Arial', size: 14 },\n body: { family: 'Arial', size: 11 },\n mono: { family: 'Courier New', size: 10 },\n light: { family: 'Arial', size: 10 },\n },\n page: {\n size: 'A4',\n margins: {\n top: 1440,\n bottom: 1440,\n left: 1440,\n right: 1440,\n header: 720,\n footer: 720,\n gutter: 0,\n },\n },\n styles: {\n normal: {\n font: 'body',\n size: 11,\n color: '334155',\n alignment: 'left',\n lineSpacing: { type: 'multiple', value: 1.15 },\n spacing: { after: 8 },\n },\n },\n };\n}\n","/**\n * Main styles module export\n * This file provides a unified interface to the styles system\n */\n\n// Base configurations - imported from TypeBox schemas\nexport type {\n ThemeConfigJson as ThemeConfig,\n StyleDefinitions,\n DocumentMargins,\n PageDimensions,\n Page,\n FontDefinition,\n Fonts,\n ComponentDefaults,\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n} from '@json-to-office/shared-docx';\nexport {\n themes,\n getTheme,\n getThemeNames,\n getThemeWithFallback,\n hasTheme,\n isValidThemeName,\n} from '../templates/themes';\n\n// Export ThemeName type separately\nexport type { ThemeName } from '../templates/themes';\n\n// Style utilities\nexport { getBodyTextStyle } from './utils/styleHelpers';\nexport {\n getTableStyle,\n getDocumentMargins,\n getPageSetup,\n} from './utils/layoutUtils';\n\n// Theme configurations\nexport {\n minimalTheme,\n corporateTheme,\n modernTheme,\n} from '../templates/themes';\n\n// JSON Theme System (Phase 1 - Foundation complete)\nexport {\n ThemeConfigSchema,\n isValidThemeConfig,\n loadThemeFromJson,\n loadThemeFromFile,\n exportThemeToJson,\n validateThemeJsonString,\n ThemeValidationError,\n ThemeParseError,\n ThemeFileError,\n} from '../themes/json';\n\n// Export type separately\nexport type { ThemeConfigJson } from '../themes/json';\n\n// All themes now use the same structure\n// No need for backward compatibility exports\n","import { ThemeConfig } from '../styles';\nimport { getPageSetup } from '../styles';\nimport { pointsToTwips } from '../styles/utils/styleHelpers';\n\n/**\n * Compute available page width in twips (page width minus left/right margins)\n */\nexport function getAvailableWidthTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n const width = page?.size?.width || 0;\n const left = page?.margin?.left || 0;\n const right = page?.margin?.right || 0;\n return Math.max(0, width - left - right);\n}\n\n/**\n * Compute full page width in twips (ignores margins)\n */\nexport function getPageWidthTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n return page?.size?.width || 0;\n}\n\n/**\n * Compute available page height in twips (page height minus top/bottom margins)\n */\nexport function getAvailableHeightTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n const height = page?.size?.height || 0;\n const top = page?.margin?.top || 0;\n const bottom = page?.margin?.bottom || 0;\n return Math.max(0, height - top - bottom);\n}\n\n/**\n * Compute full page height in twips (ignores margins)\n */\nexport function getPageHeightTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n return page?.size?.height || 0;\n}\n\n/**\n * Parse a percentage string like \"75%\" into a fraction 0..1\n */\nexport function parsePercentageStringToFraction(\n value: string\n): number | undefined {\n const match = /^([0-9]+(?:\\.[0-9]+)?)%$/.exec(value);\n if (!match) return undefined;\n const pct = parseFloat(match[1]);\n if (pct < 0 || pct > 100) return undefined;\n return pct / 100;\n}\n\n/**\n * Convert a numeric (points) or percentage string to twips using available width\n */\nexport function relativeLengthToTwips(\n value: number | string,\n availableWidthTwips: number\n): number {\n if (typeof value === 'number') {\n return pointsToTwips(value);\n }\n const fraction = parsePercentageStringToFraction(value);\n if (fraction === undefined) return 0;\n return Math.round(availableWidthTwips * fraction);\n}\n\nexport const __widthUtils = true;\n","import { readFileSync } from 'fs';\nimport probe from 'probe-image-size';\nimport { parsePercentageStringToFraction } from './widthUtils';\n\nexport interface ImageDimensions {\n width: number;\n height: number;\n}\n\nexport interface CalculatedDimensions {\n width: number;\n height: number;\n}\n\n/**\n * Parse width value - accepts either number (pixels) or percentage string\n * @param width - Width value as number or percentage string (e.g., \"90%\")\n * @param availableWidthPx - Available document width in pixels\n * @returns Width in pixels\n */\nexport function parseWidthValue(\n width: number | string,\n availableWidthPx: number\n): number {\n if (typeof width === 'number') {\n return width;\n }\n\n // Parse percentage string using shared util while preserving error semantics\n const percentageMatch = (width as string).match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percentageMatch) {\n const pct = parseFloat(percentageMatch[1]);\n if (pct < 0 || pct > 100) {\n throw new Error(\n `Invalid percentage value: ${width}. Must be between 0% and 100%`\n );\n }\n const fraction = parsePercentageStringToFraction(width as string);\n if (fraction !== undefined) {\n return Math.round(availableWidthPx * fraction);\n }\n }\n\n throw new Error(\n `Invalid width value: ${width}. Expected number (pixels) or percentage string (e.g., \"90%\")`\n );\n}\n\n/**\n * Parse a generic dimension value (number in px or percentage string)\n * @param value - numeric pixels or percentage string (e.g., \"100%\")\n * @param availablePx - available pixels for percentage reference\n */\nexport function parseDimensionValue(\n value: number | string,\n availablePx: number\n): number {\n if (typeof value === 'number') return value;\n const percentageMatch = (value as string).match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percentageMatch) {\n const pct = parseFloat(percentageMatch[1]);\n if (pct < 0 || pct > 100) {\n throw new Error(\n `Invalid percentage value: ${value}. Must be between 0% and 100%`\n );\n }\n const fraction = parsePercentageStringToFraction(value as string);\n if (fraction !== undefined) return Math.round(availablePx * fraction);\n }\n throw new Error(\n `Invalid dimension value: ${value}. Expected number (pixels) or percentage string (e.g., \"90%\")`\n );\n}\n\n/**\n * Check if a string is a valid URL\n */\nexport function isValidUrl(string: string): boolean {\n try {\n const url = new URL(string);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a string is a base64 data URI\n * Supports format: data:image/[type];base64,[data]\n */\nexport function isBase64Image(string: string): boolean {\n return /^data:image\\/[a-zA-Z+]+;base64,/.test(string);\n}\n\n/**\n * Decode base64 data URI to Buffer\n * @param dataUri - Base64 data URI (e.g., \"data:image/png;base64,iVBORw0KGgo...\")\n * @returns Decoded image buffer\n */\nexport function decodeBase64Image(dataUri: string): Buffer {\n try {\n // Extract the base64 data after the comma\n const base64Data = dataUri.split(',')[1];\n if (!base64Data) {\n throw new Error('Invalid base64 data URI format');\n }\n return Buffer.from(base64Data, 'base64');\n } catch (error) {\n throw new Error(\n `Failed to decode base64 image: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Extract MIME type from base64 data URI\n * @param dataUri - Base64 data URI (e.g., \"data:image/svg+xml;base64,...\")\n * @returns MIME type (e.g., \"image/svg+xml\") or undefined if not found\n */\nexport function extractMimeTypeFromDataUri(\n dataUri: string\n): string | undefined {\n const match = dataUri.match(/^data:(image\\/[a-zA-Z0-9+.-]+);base64,/);\n return match ? match[1] : undefined;\n}\n\n/**\n * Detect image type from file extension\n * @param path - File path or URL\n * @returns Image type (jpg, png, gif, bmp, svg) or undefined\n */\nexport function detectImageTypeFromExtension(\n path: string\n): 'jpg' | 'png' | 'gif' | 'bmp' | 'svg' | undefined {\n const extension = path.toLowerCase().split('.').pop()?.split('?')[0]; // Handle query params in URLs\n switch (extension) {\n case 'jpg':\n case 'jpeg':\n return 'jpg';\n case 'png':\n return 'png';\n case 'gif':\n return 'gif';\n case 'bmp':\n return 'bmp';\n case 'svg':\n return 'svg';\n default:\n return undefined;\n }\n}\n\n/**\n * Detect image type from MIME type\n * @param mimeType - MIME type string (e.g., \"image/svg+xml\", \"image/png\")\n * @returns Image type (jpg, png, gif, bmp, svg) or undefined\n */\nexport function detectImageTypeFromMimeType(\n mimeType: string\n): 'jpg' | 'png' | 'gif' | 'bmp' | 'svg' | undefined {\n const normalized = mimeType.toLowerCase();\n if (normalized.includes('svg')) return 'svg';\n if (normalized.includes('jpeg') || normalized.includes('jpg')) return 'jpg';\n if (normalized.includes('png')) return 'png';\n if (normalized.includes('gif')) return 'gif';\n if (normalized.includes('bmp')) return 'bmp';\n return undefined;\n}\n\n/**\n * Detect image type from path or base64 data URI\n * Prioritizes: MIME type from base64 > file extension > default to 'png'\n * @param imagePath - File path, URL, or base64 data URI\n * @returns Image type (jpg, png, gif, bmp, svg)\n */\nexport function detectImageType(\n imagePath: string\n): 'jpg' | 'png' | 'gif' | 'bmp' | 'svg' {\n // Check if it's a base64 data URI and extract MIME type\n if (isBase64Image(imagePath)) {\n const mimeType = extractMimeTypeFromDataUri(imagePath);\n if (mimeType) {\n const typeFromMime = detectImageTypeFromMimeType(mimeType);\n if (typeFromMime) return typeFromMime;\n }\n }\n\n // Try to detect from file extension\n const typeFromExtension = detectImageTypeFromExtension(imagePath);\n if (typeFromExtension) return typeFromExtension;\n\n // Default to PNG for backward compatibility\n return 'png';\n}\n\n/**\n * Download image from URL and return buffer\n * Uses native fetch with automatic redirect following and proper headers\n */\nexport async function downloadImageFromUrl(url: string): Promise<Buffer> {\n try {\n // Create an AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n const response = await fetch(url, {\n signal: controller.signal,\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; json-to-docx/1.0)',\n },\n redirect: 'follow', // Automatically follow redirects (default behavior)\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download image: HTTP ${response.status} ${response.statusText}`\n );\n }\n\n // Get the response as an ArrayBuffer\n const arrayBuffer = await response.arrayBuffer();\n\n // Convert ArrayBuffer to Buffer\n return Buffer.from(arrayBuffer);\n } catch (error) {\n if (error instanceof Error) {\n // Handle timeout errors\n if (error.name === 'AbortError') {\n throw new Error(\n 'Failed to download image: Request timeout after 10 seconds'\n );\n }\n throw new Error(`Failed to download image from ${url}: ${error.message}`);\n }\n throw new Error(`Failed to download image from ${url}: Unknown error`);\n }\n}\n\n/**\n * Get image buffer from base64 data URI, URL, or local file\n */\nexport async function getImageBuffer(imagePath: string): Promise<Buffer> {\n // Check for base64 data URI first\n if (isBase64Image(imagePath)) {\n return decodeBase64Image(imagePath);\n }\n // Check for URL\n if (isValidUrl(imagePath)) {\n return await downloadImageFromUrl(imagePath);\n }\n // Otherwise treat as local file path\n return readFileSync(imagePath);\n}\n\n/**\n * Get the dimensions of an image file or URL\n */\nexport async function getImageDimensions(\n imagePath: string\n): Promise<ImageDimensions> {\n try {\n const imageBuffer = await getImageBuffer(imagePath);\n const result = probe.sync(imageBuffer);\n\n if (!result) {\n throw new Error(`Unable to determine dimensions for image: ${imagePath}`);\n }\n\n return {\n width: result.width,\n height: result.height,\n };\n } catch (error) {\n throw new Error(\n `Error reading image dimensions from ${imagePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Calculate missing dimension while preserving aspect ratio\n */\nexport function calculateMissingDimension(\n originalWidth: number,\n originalHeight: number,\n targetWidth?: number,\n targetHeight?: number\n): CalculatedDimensions {\n if (targetWidth && targetHeight) {\n // Both dimensions provided, use as-is\n return { width: targetWidth, height: targetHeight };\n }\n\n const aspectRatio = originalWidth / originalHeight;\n\n if (targetWidth && !targetHeight) {\n // Width provided, calculate height\n return {\n width: targetWidth,\n height: Math.round(targetWidth / aspectRatio),\n };\n }\n\n if (!targetWidth && targetHeight) {\n // Height provided, calculate width\n return {\n width: Math.round(targetHeight * aspectRatio),\n height: targetHeight,\n };\n }\n\n // Neither provided, return original dimensions\n return { width: originalWidth, height: originalHeight };\n}\n\n/**\n * Calculate image dimensions with aspect ratio preservation and fallback constraints\n */\nexport async function calculateImageDimensions(\n imagePath: string,\n targetWidth?: number,\n targetHeight?: number,\n fallbackWidth: number = 300,\n fallbackHeight: number = 180\n): Promise<CalculatedDimensions> {\n try {\n const originalDimensions = await getImageDimensions(imagePath);\n return calculateMissingDimension(\n originalDimensions.width,\n originalDimensions.height,\n targetWidth,\n targetHeight\n );\n } catch (error) {\n // If we can't read the image, use fallback logic\n if (targetWidth && targetHeight) {\n return { width: targetWidth, height: targetHeight };\n }\n\n if (targetWidth && !targetHeight) {\n // Use a default aspect ratio (16:9) for fallback\n return { width: targetWidth, height: Math.round((targetWidth * 9) / 16) };\n }\n\n if (!targetWidth && targetHeight) {\n // Use a default aspect ratio (16:9) for fallback\n return {\n width: Math.round((targetHeight * 16) / 9),\n height: targetHeight,\n };\n }\n\n // No dimensions provided and can't read image, use fallback\n return { width: fallbackWidth, height: fallbackHeight };\n }\n}\n","import {\n TextWrappingType,\n TextWrappingSide,\n HorizontalPositionRelativeFrom,\n VerticalPositionRelativeFrom,\n HorizontalPositionAlign,\n VerticalPositionAlign,\n} from 'docx';\n\nimport type { ImageProps } from '../types';\n\nexport type FloatingConfig = NonNullable<ImageProps['floating']>;\n\n/**\n * Conversion factor from twips to EMUs (English Metric Units).\n * - 1 inch = 914,400 EMUs\n * - 1 inch = 1,440 twips\n * - Therefore: 1 twip = 914,400 / 1,440 = 635 EMUs\n *\n * docx.js expects offset and margin values in EMUs, but our schema\n * documents these values in twips for consistency with other Word measurements.\n */\nconst TWIPS_TO_EMU = 635;\n\nexport function mapHorizontalRelative(\n rel?: FloatingConfig['horizontalPosition'] extends infer T\n ? T extends { relative?: infer R }\n ? R\n : never\n : never\n) {\n switch (rel) {\n case 'character':\n return HorizontalPositionRelativeFrom.CHARACTER;\n case 'column':\n return HorizontalPositionRelativeFrom.COLUMN;\n case 'margin':\n return HorizontalPositionRelativeFrom.MARGIN;\n case 'page':\n return HorizontalPositionRelativeFrom.PAGE;\n default:\n return undefined;\n }\n}\n\nexport function mapVerticalRelative(\n rel?: FloatingConfig['verticalPosition'] extends infer T\n ? T extends { relative?: infer R }\n ? R\n : never\n : never\n) {\n switch (rel) {\n case 'margin':\n return VerticalPositionRelativeFrom.MARGIN;\n case 'page':\n return VerticalPositionRelativeFrom.PAGE;\n case 'paragraph':\n return VerticalPositionRelativeFrom.PARAGRAPH;\n case 'line':\n return VerticalPositionRelativeFrom.LINE;\n default:\n return undefined;\n }\n}\n\nexport function mapHorizontalAlign(\n align?: 'left' | 'center' | 'right' | 'inside' | 'outside'\n) {\n switch (align) {\n case 'left':\n return HorizontalPositionAlign.LEFT;\n case 'center':\n return HorizontalPositionAlign.CENTER;\n case 'right':\n return HorizontalPositionAlign.RIGHT;\n case 'inside':\n return HorizontalPositionAlign.INSIDE;\n case 'outside':\n return HorizontalPositionAlign.OUTSIDE;\n default:\n return undefined;\n }\n}\n\nexport function mapVerticalAlign(\n align?: 'top' | 'center' | 'bottom' | 'inside' | 'outside'\n) {\n switch (align) {\n case 'top':\n return VerticalPositionAlign.TOP;\n case 'center':\n return VerticalPositionAlign.CENTER;\n case 'bottom':\n return VerticalPositionAlign.BOTTOM;\n case 'inside':\n return VerticalPositionAlign.INSIDE;\n case 'outside':\n return VerticalPositionAlign.OUTSIDE;\n default:\n return undefined;\n }\n}\n\nexport function mapWrapType(\n type?: 'none' | 'square' | 'topAndBottom' | 'around' | 'through'\n) {\n switch (type) {\n case 'none':\n return TextWrappingType.NONE;\n case 'square':\n return TextWrappingType.SQUARE;\n case 'topAndBottom':\n return TextWrappingType.TOP_AND_BOTTOM;\n case 'around':\n case 'through':\n // Map VML-style 'around' and 'through' to TIGHT (closest OOXML equivalent)\n return TextWrappingType.TIGHT;\n default:\n return undefined;\n }\n}\n\nexport function mapWrapSide(side?: 'bothSides' | 'left' | 'right' | 'largest') {\n switch (side) {\n case 'bothSides':\n return TextWrappingSide.BOTH_SIDES;\n case 'left':\n return TextWrappingSide.LEFT;\n case 'right':\n return TextWrappingSide.RIGHT;\n case 'largest':\n return TextWrappingSide.LARGEST;\n default:\n return undefined;\n }\n}\n\n/**\n * Map shared floating config to docx ImageRun floating options.\n * Also lifts wrap.margins (if present) to floating.margins as expected by docx.\n */\nexport function mapFloatingOptions(floating?: FloatingConfig): any | undefined {\n if (!floating) return undefined;\n\n // Disallow 'tight' wrapping: docx emits invalid OOXML for wrapTight without polygon geometry\n // Note: TypeScript correctly prevents this at compile-time, but keep for runtime safety\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Intentional defensive check for runtime input validation\n if (floating.wrap?.type === 'tight') {\n throw new Error(\n 'Image floating wrap.type \\'tight\\' is not supported due to invalid OOXML emitted by docx. Use \\'square\\', \\'topAndBottom\\', or \\'none\\'.'\n );\n }\n\n // docx.js requires BOTH horizontal and vertical positions for floating images.\n // If only one is specified, provide sensible defaults for the other.\n const hasHorizontal = Boolean(floating.horizontalPosition);\n const hasVertical = Boolean(floating.verticalPosition);\n\n const horizontalPosition = floating.horizontalPosition\n ? {\n ...(floating.horizontalPosition.relative && {\n relative: mapHorizontalRelative(floating.horizontalPosition.relative),\n }),\n ...(floating.horizontalPosition.align !== undefined && {\n align: mapHorizontalAlign(floating.horizontalPosition.align),\n }),\n ...(floating.horizontalPosition.offset !== undefined && {\n offset: floating.horizontalPosition.offset * TWIPS_TO_EMU,\n }),\n }\n : hasVertical\n ? {\n // Default horizontal: align left relative to margin\n relative: HorizontalPositionRelativeFrom.MARGIN,\n align: HorizontalPositionAlign.LEFT,\n }\n : undefined;\n\n const verticalPosition = floating.verticalPosition\n ? {\n ...(floating.verticalPosition.relative && {\n relative: mapVerticalRelative(floating.verticalPosition.relative),\n }),\n ...(floating.verticalPosition.align !== undefined && {\n align: mapVerticalAlign(floating.verticalPosition.align),\n }),\n ...(floating.verticalPosition.offset !== undefined && {\n offset: floating.verticalPosition.offset * TWIPS_TO_EMU,\n }),\n }\n : hasHorizontal\n ? {\n // Default vertical: align top relative to paragraph\n relative: VerticalPositionRelativeFrom.PARAGRAPH,\n align: VerticalPositionAlign.TOP,\n }\n : undefined;\n\n const wrap = floating.wrap\n ? {\n ...(floating.wrap.type && { type: mapWrapType(floating.wrap.type) }),\n ...(floating.wrap.side && { side: mapWrapSide(floating.wrap.side) }),\n }\n : undefined;\n\n // Convert margins from twips to EMUs\n const rawMargins = floating.wrap?.margins || (floating as any).margins;\n const margins = rawMargins\n ? {\n ...(rawMargins.top !== undefined && {\n top: rawMargins.top * TWIPS_TO_EMU,\n }),\n ...(rawMargins.bottom !== undefined && {\n bottom: rawMargins.bottom * TWIPS_TO_EMU,\n }),\n ...(rawMargins.left !== undefined && {\n left: rawMargins.left * TWIPS_TO_EMU,\n }),\n ...(rawMargins.right !== undefined && {\n right: rawMargins.right * TWIPS_TO_EMU,\n }),\n }\n : undefined;\n\n // Determine and validate zIndex:\n // - OOXML requires positive integer for relativeHeight\n // - Negative values cause Word to reject the document\n // - CRITICAL: docx.js uses image HEIGHT as relativeHeight when zIndex is undefined,\n // causing inconsistent values that can corrupt documents\n // - Solution: ALWAYS provide a zIndex value, defaulting to 0\n let zIndex = floating.zIndex !== undefined ? floating.zIndex : 0; // Default to 0 for ALL floating images (behindDocument or normal)\n\n // Validate: zIndex must be >= 0 (OOXML requirement)\n if (zIndex < 0) {\n console.warn(\n `Invalid zIndex value ${zIndex} for floating image. Using 0 instead. zIndex must be >= 0.`\n );\n zIndex = 0;\n }\n\n const mapped: any = {\n ...(horizontalPosition && { horizontalPosition }),\n ...(verticalPosition && { verticalPosition }),\n ...(wrap && { wrap }),\n ...(margins && { margins }),\n ...(floating.allowOverlap !== undefined && {\n allowOverlap: floating.allowOverlap,\n }),\n ...(floating.behindDocument !== undefined && {\n behindDocument: floating.behindDocument,\n }),\n ...(floating.lockAnchor !== undefined && {\n lockAnchor: floating.lockAnchor,\n }),\n ...(floating.layoutInCell !== undefined && {\n layoutInCell: floating.layoutInCell,\n }),\n zIndex, // Always include zIndex (now always defined, defaults to 0)\n };\n\n return Object.keys(mapped).length ? mapped : undefined;\n}\n","/**\n * Numbering Configuration Utilities\n * Utilities for creating and managing docx numbering configurations\n */\n\nimport { AlignmentType, convertInchesToTwip, LevelFormat } from 'docx';\nimport type { ILevelsOptions } from 'docx';\n\n// Type mapping from schema strings to docx LevelFormat values\nconst LEVEL_FORMAT_MAP: Record<\n string,\n (typeof LevelFormat)[keyof typeof LevelFormat]\n> = {\n decimal: LevelFormat.DECIMAL,\n upperRoman: LevelFormat.UPPER_ROMAN,\n lowerRoman: LevelFormat.LOWER_ROMAN,\n upperLetter: LevelFormat.UPPER_LETTER,\n lowerLetter: LevelFormat.LOWER_LETTER,\n bullet: LevelFormat.BULLET,\n ordinal: LevelFormat.ORDINAL,\n cardinalText: LevelFormat.CARDINAL_TEXT,\n ordinalText: LevelFormat.ORDINAL_TEXT,\n hex: LevelFormat.HEX,\n chicago: LevelFormat.CHICAGO,\n ideographDigital: LevelFormat.IDEOGRAPH__DIGITAL,\n japaneseCounting: LevelFormat.JAPANESE_COUNTING,\n aiueo: LevelFormat.AIUEO,\n iroha: LevelFormat.IROHA,\n decimalFullWidth: LevelFormat.DECIMAL_FULL_WIDTH,\n decimalHalfWidth: LevelFormat.DECIMAL_HALF_WIDTH,\n japaneseLegal: LevelFormat.JAPANESE_LEGAL,\n japaneseDigitalTenThousand: LevelFormat.JAPANESE_DIGITAL_TEN_THOUSAND,\n decimalEnclosedCircle: LevelFormat.DECIMAL_ENCLOSED_CIRCLE,\n decimalFullWidth2: LevelFormat.DECIMAL_FULL_WIDTH2,\n aiueoFullWidth: LevelFormat.AIUEO_FULL_WIDTH,\n irohaFullWidth: LevelFormat.IROHA_FULL_WIDTH,\n decimalZero: LevelFormat.DECIMAL_ZERO,\n ganada: LevelFormat.GANADA,\n chosung: LevelFormat.CHOSUNG,\n decimalEnclosedFullstop: LevelFormat.DECIMAL_ENCLOSED_FULLSTOP,\n decimalEnclosedParen: LevelFormat.DECIMAL_ENCLOSED_PARENTHESES,\n decimalEnclosedCircleChinese: LevelFormat.DECIMAL_ENCLOSED_CIRCLE_CHINESE,\n ideographEnclosedCircle: LevelFormat.IDEOGRAPH_ENCLOSED_CIRCLE,\n ideographTraditional: LevelFormat.IDEOGRAPH_TRADITIONAL,\n ideographZodiac: LevelFormat.IDEOGRAPH_ZODIAC,\n ideographZodiacTraditional: LevelFormat.IDEOGRAPH_ZODIAC_TRADITIONAL,\n taiwaneseCounting: LevelFormat.TAIWANESE_COUNTING,\n ideographLegalTraditional: LevelFormat.IDEOGRAPH_LEGAL_TRADITIONAL,\n taiwaneseCountingThousand: LevelFormat.TAIWANESE_COUNTING_THOUSAND,\n taiwaneseDigital: LevelFormat.TAIWANESE_DIGITAL,\n chineseCounting: LevelFormat.CHINESE_COUNTING,\n chineseLegalSimplified: LevelFormat.CHINESE_LEGAL_SIMPLIFIED,\n chineseCountingThousand: LevelFormat.CHINESE_COUNTING_THOUSAND,\n koreanDigital: LevelFormat.KOREAN_DIGITAL,\n koreanCounting: LevelFormat.KOREAN_COUNTING,\n koreanLegal: LevelFormat.KOREAN_LEGAL,\n koreanDigital2: LevelFormat.KOREAN_DIGITAL2,\n vietnameseCounting: LevelFormat.VIETNAMESE_COUNTING,\n russianLower: LevelFormat.RUSSIAN_LOWER,\n russianUpper: LevelFormat.RUSSIAN_UPPER,\n none: LevelFormat.NONE,\n numberInDash: LevelFormat.NUMBER_IN_DASH,\n hebrew1: LevelFormat.HEBREW1,\n hebrew2: LevelFormat.HEBREW2,\n arabicAlpha: LevelFormat.ARABIC_ALPHA,\n arabicAbjad: LevelFormat.ARABIC_ABJAD,\n hindiVowels: LevelFormat.HINDI_VOWELS,\n hindiConsonants: LevelFormat.HINDI_CONSONANTS,\n hindiNumbers: LevelFormat.HINDI_NUMBERS,\n hindiCounting: LevelFormat.HINDI_COUNTING,\n thaiLetters: LevelFormat.THAI_LETTERS,\n thaiNumbers: LevelFormat.THAI_NUMBERS,\n thaiCounting: LevelFormat.THAI_COUNTING,\n};\n\nconst ALIGNMENT_MAP: Record<\n string,\n (typeof AlignmentType)[keyof typeof AlignmentType]\n> = {\n start: AlignmentType.START,\n end: AlignmentType.END,\n left: AlignmentType.LEFT,\n right: AlignmentType.RIGHT,\n center: AlignmentType.CENTER,\n};\n\nexport interface ListLevelConfig {\n level: number;\n format?: string;\n text?: string;\n alignment?: string;\n indent?: {\n left?: number;\n hanging?: number;\n };\n start?: number;\n}\n\nexport interface NumberingConfig {\n reference: string;\n levels: ListLevelConfig[];\n}\n\n/**\n * Convert schema format string to docx LevelFormat\n */\nfunction getLevelFormat(\n format?: string\n): (typeof LevelFormat)[keyof typeof LevelFormat] {\n if (!format) return LevelFormat.BULLET;\n return LEVEL_FORMAT_MAP[format] || LevelFormat.BULLET;\n}\n\n/**\n * Convert schema alignment string to docx AlignmentType\n */\nfunction getAlignment(\n alignment?: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n if (!alignment) return AlignmentType.LEFT;\n return ALIGNMENT_MAP[alignment] || AlignmentType.LEFT;\n}\n\n/**\n * Create a default level configuration for a given level number\n */\nfunction createDefaultLevel(\n level: number,\n format: (typeof LevelFormat)[keyof typeof LevelFormat] = LevelFormat.BULLET,\n text?: string\n): ILevelsOptions {\n const baseIndent = 0.5 * (level + 1); // Increase indent for each level\n const hangingIndent = 0.25;\n\n return {\n level,\n format,\n text: text || (format === LevelFormat.BULLET ? '•' : '%1.'),\n alignment: AlignmentType.LEFT,\n style: {\n paragraph: {\n indent: {\n left: convertInchesToTwip(baseIndent),\n hanging: convertInchesToTwip(hangingIndent),\n },\n },\n },\n };\n}\n\n/**\n * Create numbering configuration from list config\n * Returns a single config item that can be added to INumberingOptions.config array\n */\nexport function createNumberingConfig(config: NumberingConfig): {\n levels: ILevelsOptions[];\n reference: string;\n} {\n const levels: ILevelsOptions[] = [];\n\n // Process each level\n for (const levelConfig of config.levels) {\n const format = getLevelFormat(levelConfig.format);\n const alignment = getAlignment(levelConfig.alignment);\n const text =\n levelConfig.text ||\n (format === LevelFormat.BULLET ? '•' : `%${levelConfig.level + 1}.`);\n\n // Calculate indentation\n const baseIndent =\n levelConfig.indent?.left !== undefined\n ? levelConfig.indent.left / 72 // Convert points to inches\n : 0.5 * (levelConfig.level + 1);\n\n const hangingIndent =\n levelConfig.indent?.hanging !== undefined\n ? levelConfig.indent.hanging / 72 // Convert points to inches\n : 0.25;\n\n const level: ILevelsOptions = {\n level: levelConfig.level,\n format,\n text,\n alignment,\n style: {\n paragraph: {\n indent: {\n left: convertInchesToTwip(baseIndent),\n hanging: convertInchesToTwip(hangingIndent),\n },\n },\n },\n // Add start number if specified\n ...(levelConfig.start !== undefined && { start: levelConfig.start }),\n };\n\n levels.push(level);\n }\n\n return {\n reference: config.reference,\n levels,\n };\n}\n\n/**\n * Create a simple bullet list configuration\n */\nexport function createBulletListConfig(\n reference: string,\n bullet: string = '•'\n): { levels: ILevelsOptions[]; reference: string } {\n return {\n reference,\n levels: [\n createDefaultLevel(0, LevelFormat.BULLET, bullet),\n createDefaultLevel(1, LevelFormat.BULLET, '◦'),\n createDefaultLevel(2, LevelFormat.BULLET, '▪'),\n ],\n };\n}\n\n/**\n * Create a simple numbered list configuration\n */\nexport function createNumberedListConfig(\n reference: string,\n start: number = 1\n): { levels: ILevelsOptions[]; reference: string } {\n return {\n reference,\n levels: [\n { ...createDefaultLevel(0, LevelFormat.DECIMAL, '%1.'), start },\n createDefaultLevel(1, LevelFormat.LOWER_LETTER, '%2.'),\n createDefaultLevel(2, LevelFormat.LOWER_ROMAN, '%3.'),\n ],\n };\n}\n\n/**\n * Registry for managing numbering configurations\n */\nexport class NumberingRegistry {\n private configs: Map<\n string,\n { levels: ILevelsOptions[]; reference: string }\n > = new Map();\n private counter = 0;\n\n /**\n * Register a numbering configuration\n */\n register(config: { levels: ILevelsOptions[]; reference: string }): string {\n const reference = config.reference;\n this.configs.set(reference, config);\n return reference;\n }\n\n /**\n * Generate a unique reference ID\n */\n generateReference(prefix: string = 'list'): string {\n return `${prefix}-${++this.counter}`;\n }\n\n /**\n * Get all registered configurations as an array suitable for INumberingOptions\n */\n getAll(): { levels: ILevelsOptions[]; reference: string }[] {\n return Array.from(this.configs.values());\n }\n\n /**\n * Clear all configurations\n */\n clear(): void {\n this.configs.clear();\n this.counter = 0;\n }\n\n /**\n * Check if a reference exists\n */\n has(reference: string): boolean {\n return this.configs.has(reference);\n }\n\n /**\n * Get a configuration by reference\n */\n get(\n reference: string\n ): { levels: ILevelsOptions[]; reference: string } | undefined {\n return this.configs.get(reference);\n }\n}\n\n// Global registry instance\nexport const globalNumberingRegistry = new NumberingRegistry();\n","/**\n * Post-processing utility to fix docx.js floating image bugs\n *\n * The docx library (as of v9.5.1) has a known issue with floating images:\n * 1. Duplicate wp:docPr IDs (GitHub issue #2719)\n *\n * Historical note: We previously also post-processed relativeHeight and\n * wrapTight elements. Those steps were removed because we always provide a\n * valid zIndex upstream and we do not support 'tight' wrapping.\n *\n * This utility extracts the DOCX, fixes duplicate IDs, and re-packages it.\n */\n\nimport AdmZip from 'adm-zip';\n\n/**\n * Fix floating image issues in a generated DOCX file\n * @param docxPath - Path to the DOCX file to fix\n */\nexport async function fixFloatingImageIds(docxPath: string): Promise<void> {\n try {\n // Read the DOCX file as a ZIP\n const zip = new AdmZip(docxPath);\n\n // Get the document.xml entry\n const documentEntry = zip.getEntry('word/document.xml');\n if (!documentEntry) {\n throw new Error('document.xml not found in DOCX');\n }\n\n // Extract and parse the XML\n let documentXml = documentEntry.getData().toString('utf8');\n\n // Fix 1: Duplicate wp:docPr IDs\n // Pattern: <wp:docPr id=\"N\" ...> where N is the ID\n let idCounter = 1;\n documentXml = documentXml.replace(\n /<wp:docPr\\s+id=\"(\\d+)\"/g,\n (_match: string) => {\n const newId = idCounter++;\n return `<wp:docPr id=\"${newId}\"`;\n }\n );\n\n // Note: No other post-processing is applied.\n\n // Update the document.xml in the ZIP\n zip.updateFile('word/document.xml', Buffer.from(documentXml, 'utf8'));\n\n // Write the fixed DOCX back\n zip.writeZip(docxPath);\n\n console.log(\n `Fixed ${idCounter - 1} duplicate floating image docPr IDs in ${docxPath}`\n );\n } catch (error) {\n console.error('Failed to fix floating image issues:', error);\n throw error;\n }\n}\n","/**\n * Document Generator\n * Main orchestration functions that compose the document generation pipeline\n */\n\nimport { Document, Packer } from 'docx';\nimport { writeFileSync } from 'fs';\nimport {\n ComponentDefinition,\n ReportProps,\n ReportComponentDefinition,\n isReportComponent,\n} from '../types';\nimport { getThemeWithFallback, ThemeConfig } from '../styles';\nimport { processDocument } from './structure';\nimport { applyLayout } from './layout';\nimport { renderDocument } from './render';\n\n// JSON support imports\nimport { DocumentValidationResult } from '@json-to-office/shared-docx';\nimport { parseJsonComponent, validateJsonComponent } from '../json/parser';\nimport { normalizeDocument } from '../json/normalizer';\nimport { loadJsonDefinition } from '../json/filesystem';\n\n// Local generation options type\nexport interface JsonGenerationOptions {\n outputPath?: string;\n validation?: {\n strict?: boolean;\n allowUnknownFields?: boolean;\n };\n customThemes?: { [key: string]: ThemeConfig };\n}\n\n/**\n * Type guard to check if input is a report component definition\n */\nexport function isReportComponentDefinition(\n definition: unknown\n): definition is ReportComponentDefinition {\n if (typeof definition !== 'object' || definition === null) {\n return false;\n }\n\n const def = definition as Record<string, unknown>;\n\n // Must be a report component (optionally with $schema for JSON validation)\n return def.name === 'docx' && 'props' in def;\n}\n\n/**\n * Generate a Word document from a report component definition\n * This is the main entry point for document generation\n */\nexport async function generateDocument(\n document: ReportComponentDefinition\n): Promise<Document> {\n // Validate that the document is a report component\n if (!document || document.name !== 'docx') {\n throw new Error('Top-level component must be a docx component');\n }\n\n // Handle JSON definitions (report components with $schema)\n if ('$schema' in document) {\n return await generateDocumentFromJson(document);\n }\n\n // Get theme configuration (theme is always a string name)\n const themeName = document.props.theme || 'minimal';\n const theme = getThemeWithFallback(themeName);\n\n // Pipeline: Structure -> Layout -> Render (with caching)\n const structure = await processDocument(document, theme, themeName);\n const layout = applyLayout(structure.sections, theme, themeName);\n const renderedDocument = await renderDocument(structure, layout, {\n bypassCache: false, // Enable component caching\n });\n\n return renderedDocument;\n}\n\n/**\n * Generate document from report props and components\n * Convenience function that constructs the report component\n */\nexport async function generateFromConfig(\n props: ReportProps,\n components: ComponentDefinition[]\n): Promise<Document> {\n const reportComponent: ReportComponentDefinition = {\n name: 'docx',\n props,\n children: components,\n };\n\n return await generateDocument(reportComponent);\n}\n\n/**\n * Generate a Word document with custom themes support\n * Extends the standard pipeline to support custom theme resolution\n */\nasync function generateDocumentWithCustomThemes(\n document: ReportComponentDefinition,\n customThemes?: { [key: string]: ThemeConfig }\n): Promise<Document> {\n // Get theme configuration with custom theme support (theme is always a string name)\n const themeName = document.props.theme || 'minimal';\n let theme: ThemeConfig;\n\n // Check custom themes first with case-insensitive matching, then fall back to built-in\n if (customThemes) {\n // Try exact match first\n if (customThemes[themeName]) {\n theme = customThemes[themeName];\n } else {\n // Try case-insensitive match\n const themeNameLower = themeName.toLowerCase();\n const matchingThemeKey = Object.keys(customThemes).find(\n (key) => key.toLowerCase() === themeNameLower\n );\n if (matchingThemeKey) {\n theme = customThemes[matchingThemeKey];\n } else {\n theme = getThemeWithFallback(themeName);\n }\n }\n } else {\n theme = getThemeWithFallback(themeName);\n }\n\n // Pipeline: Structure -> Layout -> Render (with caching)\n const structure = await processDocument(document, theme, themeName);\n const layout = applyLayout(structure.sections, theme, themeName);\n const renderedDocument = await renderDocument(structure, layout, {\n bypassCache: false, // Enable component caching\n });\n\n return renderedDocument;\n}\n\n/**\n * Generate a Word document from JSON report definition\n * Handles parsing, validation, and conversion to internal components\n */\nexport async function generateDocumentFromJson(\n jsonConfig: string | ComponentDefinition | ReportComponentDefinition,\n options?: JsonGenerationOptions\n): Promise<Document> {\n // Handle string input\n let componentToConvert: ComponentDefinition | ReportComponentDefinition;\n if (typeof jsonConfig === 'string') {\n // Parse and validate - parseJsonComponent returns ComponentDefinition\n const parsed = parseJsonComponent(jsonConfig) as ComponentDefinition;\n if (!isReportComponent(parsed)) {\n throw new Error('Parsed JSON must be a docx component');\n }\n componentToConvert = parsed as ReportComponentDefinition;\n } else {\n // Could be either ComponentDefinition (from JSON) or ReportComponentDefinition (internal)\n componentToConvert = jsonConfig;\n }\n\n // Normalize JSON components (handle shorthand notations and nested structures)\n // The normalizer preserves all validated properties from TypeBox\n const [reportComponent] = normalizeDocument(componentToConvert);\n // Generate document using custom theme-aware pipeline\n return await generateDocumentWithCustomThemes(\n reportComponent,\n options?.customThemes\n );\n}\n\n/**\n * Validate JSON schema without generating document\n */\nexport function validateJsonSchema(\n jsonConfig: string | object\n): DocumentValidationResult {\n return validateJsonComponent(jsonConfig);\n}\n\n/**\n * Generate document buffer from JSON (commonly used for API responses)\n */\nexport async function generateBufferFromJson(\n jsonConfig: string | ReportComponentDefinition,\n options?: JsonGenerationOptions\n): Promise<Buffer> {\n const document = await generateDocumentFromJson(jsonConfig, options);\n return await Packer.toBuffer(document);\n}\n\n/**\n * Generate and save document from JSON in one operation\n */\nexport async function generateAndSaveFromJson(\n jsonConfig: string | ReportComponentDefinition,\n filename: string,\n options?: JsonGenerationOptions\n): Promise<void> {\n const document = await generateDocumentFromJson(jsonConfig, options);\n await saveDocument(document, filename);\n}\n\n/**\n * Generate document from JSON file\n */\nexport async function generateDocumentFromFile(\n filePath: string,\n options?: JsonGenerationOptions\n): Promise<Document> {\n const jsonDefinition = await loadJsonDefinition(filePath);\n // loadJsonDefinition returns ComponentDefinition from shared (JSON schema type)\n // generateDocumentFromJson now accepts the JSON schema type directly\n return await generateDocumentFromJson(jsonDefinition, options);\n}\n\n/**\n * Generate document buffer from JSON file\n */\nexport async function generateBufferFromFile(\n filePath: string,\n options?: JsonGenerationOptions\n): Promise<Buffer> {\n const document = await generateDocumentFromFile(filePath, options);\n return await Packer.toBuffer(document);\n}\n\n/**\n * Generate and save document from JSON file in one operation\n */\nexport async function generateAndSaveFromFile(\n inputFilePath: string,\n outputFilePath: string,\n options?: JsonGenerationOptions\n): Promise<void> {\n const document = await generateDocumentFromFile(inputFilePath, options);\n await saveDocument(document, outputFilePath);\n}\n\n/**\n * Save a document to file\n */\nexport async function saveDocument(\n document: Document,\n filename: string\n): Promise<void> {\n const buffer = await Packer.toBuffer(document);\n writeFileSync(filename, buffer);\n\n // Post-process: Fix duplicate wp:docPr IDs in floating images\n try {\n const { fixFloatingImageIds } = await import(\n '../utils/fixFloatingImageIds'\n );\n await fixFloatingImageIds(filename);\n } catch (error) {\n console.warn('Failed to fix floating image IDs (non-critical):', error);\n }\n}\n\n/**\n * Generate and save document in one operation\n */\nexport async function generateAndSave(\n document: ReportComponentDefinition,\n filename: string\n): Promise<void> {\n const generatedDocument = await generateDocument(document);\n await saveDocument(generatedDocument, filename);\n}\n\n/**\n * Compose multiple transform functions\n * Utility for creating custom pipelines\n */\nexport function pipe<T>(...fns: Array<(_arg: T) => T>): (_arg: T) => T {\n return (_arg: T) => fns.reduce((acc, fn) => fn(acc), _arg);\n}\n\n/**\n * Export the main API\n */\nexport const DocumentGenerator = {\n generate: generateDocument,\n generateFromConfig,\n generateFromJson: generateDocumentFromJson,\n generateFromFile: generateDocumentFromFile,\n generateBufferFromJson,\n generateBufferFromFile,\n generateAndSaveFromJson,\n generateAndSaveFromFile,\n validateJsonSchema,\n save: saveDocument,\n generateAndSave,\n isReportComponentDefinition,\n};\n","import { ISectionOptions } from 'docx';\nimport type { ThemeName } from '../styles';\n\n// Import types from shared-docx that core needs for its internal use\nimport type {\n ComponentDefinition as SharedComponentDefinition,\n ReportComponent,\n SectionComponent,\n ColumnsComponent,\n HeadingComponent,\n ParagraphComponent,\n ImageComponent,\n HighchartsComponent,\n StatisticComponent,\n TableComponent,\n HeaderComponent,\n FooterComponent,\n ListComponent,\n TocComponent,\n TextBoxComponent,\n\n // Import props types needed internally\n ReportProps as SharedReportProps,\n SectionProps as SharedSectionProps,\n HeadingProps as SharedHeadingProps,\n ParagraphProps as SharedParagraphProps,\n ColumnsProps as SharedColumnsProps,\n ImageProps as SharedImageProps,\n StatisticProps as SharedStatisticProps,\n TableProps as SharedTableProps,\n HeaderProps as SharedHeaderProps,\n FooterProps as SharedFooterProps,\n ListProps as SharedListProps,\n TocProps as SharedTocProps,\n TextBoxProps as SharedTextBoxProps,\n} from '@json-to-office/shared-docx';\n\n// Import type guards from shared-docx (these are runtime functions core needs)\nexport {\n isReportComponent,\n isSectionComponent,\n isHeadingComponent,\n isParagraphComponent,\n isColumnsComponent,\n isImageComponent,\n isTextBoxComponent,\n isStatisticComponent,\n isTableComponent,\n isListComponent,\n isTocComponent,\n isHeaderComponent,\n isFooterComponent,\n isHighchartsComponent,\n} from '@json-to-office/shared-docx';\n\n// Re-export component definitions for internal use (type aliases for clarity)\nexport type ComponentDefinition = SharedComponentDefinition;\nexport type ReportComponentDefinition = ReportComponent & {\n /** Optional schema field for JSON validation */\n $schema?: string;\n};\nexport type SectionComponentDefinition = SectionComponent;\nexport type HeadingComponentDefinition = HeadingComponent;\nexport type ParagraphComponentDefinition = ParagraphComponent;\nexport type ColumnsComponentDefinition = ColumnsComponent;\nexport type ImageComponentDefinition = ImageComponent;\nexport type TextBoxComponentDefinition = TextBoxComponent;\nexport type StatisticComponentDefinition = StatisticComponent;\nexport type TableComponentDefinition = TableComponent;\nexport type HeaderComponentDefinition = HeaderComponent;\nexport type FooterComponentDefinition = FooterComponent;\nexport type ListComponentDefinition = ListComponent;\nexport type TocComponentDefinition = TocComponent;\n\n// Export StandardComponentDefinition as union of all standard component types\nexport type StandardComponentDefinition =\n | ReportComponent\n | SectionComponent\n | ColumnsComponent\n | HeadingComponent\n | ParagraphComponent\n | TextBoxComponent\n | ImageComponent\n | HighchartsComponent\n | StatisticComponent\n | TableComponent\n | HeaderComponent\n | FooterComponent\n | ListComponent\n | TocComponent;\n\n// Re-export props types for internal use\nexport type ReportProps = SharedReportProps;\nexport type SectionProps = SharedSectionProps;\nexport type HeadingProps = SharedHeadingProps;\nexport type ParagraphProps = SharedParagraphProps;\nexport type ColumnsProps = SharedColumnsProps;\nexport type ImageProps = SharedImageProps;\nexport type TextBoxProps = SharedTextBoxProps;\nexport type StatisticProps = SharedStatisticProps;\nexport type TableProps = SharedTableProps;\nexport type HeaderProps = SharedHeaderProps;\nexport type FooterProps = SharedFooterProps;\nexport type ListProps = SharedListProps;\nexport type TocProps = SharedTocProps;\n\n// Re-export ThemeName for easier access\nexport type { ThemeName };\n\n// ============================================================================\n// CORE-SPECIFIC INTERFACES\n// ============================================================================\n\nexport interface ColumnSettings {\n count: number;\n equalWidth?: boolean;\n space?: number;\n /** Optional explicit column children with widths/spaces in twips */\n children?: { width?: number; space?: number }[];\n}\n\nexport interface PageSizeOptions {\n width: number;\n height: number;\n}\n\nexport interface PageMarginOptions {\n top: number;\n right: number;\n bottom: number;\n left: number;\n header?: number;\n footer?: number;\n}\n\nexport interface PageNumberOptions {\n start?: number;\n formatType?:\n | 'decimal'\n | 'upperRoman'\n | 'lowerRoman'\n | 'upperLetter'\n | 'lowerLetter';\n}\n\nexport interface PageBorderOptions {\n top?: { style: string; size: number; color: string };\n right?: { style: string; size: number; color: string };\n bottom?: { style: string; size: number; color: string };\n left?: { style: string; size: number; color: string };\n}\n\nexport interface SectionProperties {\n page?: {\n size?: PageSizeOptions;\n margin?: PageMarginOptions;\n pageNumbers?: PageNumberOptions;\n borders?: PageBorderOptions;\n textDirection?: 'ltr' | 'rtl';\n };\n column?: ColumnSettings;\n type?: 'continuous' | 'nextColumn' | 'nextPage' | 'evenPage' | 'oddPage';\n headers?: ISectionOptions['headers'];\n footers?: ISectionOptions['footers'];\n}\n\n// Internal interfaces used by DocumentGenerator helper methods\nexport interface ImageContent {\n path: string;\n caption?: string;\n width?: number;\n height?: number;\n alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface StatisticContent {\n number: string;\n description: string;\n alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface TableData {\n headers: string[];\n rows: (string | SharedComponentDefinition)[][];\n style?: 'minimal' | 'classic' | 'minimal';\n}\n\n/**\n * Rendering context for components\n */\nexport interface RenderContext {\n theme: {\n name: string;\n colors: Record<string, string>;\n fonts: Record<string, string>;\n spacing: Record<string, number>;\n };\n /** Full theme configuration for custom components */\n fullTheme: import('../styles').ThemeConfig;\n document: {\n title?: string;\n subtitle?: string;\n author?: string;\n company?: string;\n date: Date;\n };\n section: {\n currentLayout: 'single' | 'multi-column';\n columnCount: number;\n pageNumber: number;\n level?: number;\n /** Bookmark ID for section-scoped TOCs (when TOC is inside a section) */\n sectionBookmarkId?: string;\n /** Heading level of the parent section title (used to exclude it from section-scoped TOCs) */\n sectionTitleLevel?: number;\n };\n utils: {\n formatDate: (_date: Date) => string;\n parseText: (_text: string) => { text: string }[];\n getStyle: (_name: string) => { name: string };\n [key: string]: unknown;\n };\n parent?: SharedComponentDefinition;\n depth: number;\n custom?: Record<string, unknown>;\n}\n","import { format } from 'date-fns';\n\nexport const formatDate = (\n date: Date,\n formatString: string = 'MMMM d, yyyy'\n): string => {\n return format(date, formatString);\n};\n","/**\n * Document Structure Functions\n * Handle document hierarchy and organization without layout concerns\n */\n\nimport {\n ComponentDefinition,\n ReportProps,\n ReportComponentDefinition,\n RenderContext,\n isSectionComponent,\n isColumnsComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { formatDate } from '../utils/formatters';\n\nexport interface ProcessedDocument {\n metadata: DocumentMetadata;\n sections: ProcessedSection[];\n theme: ThemeConfig;\n themeName: string;\n}\n\nexport interface DocumentMetadata {\n title?: string;\n subtitle?: string;\n author?: string;\n company?: string;\n date: Date;\n}\n\nexport interface ProcessedSection {\n title?: string;\n level?: number;\n components: ComponentDefinition[];\n header?: ComponentDefinition[] | 'linkToPrevious';\n footer?: ComponentDefinition[] | 'linkToPrevious';\n /** True if this section originates from an explicit Section component */\n isExplicitSection?: boolean;\n /** Whether this section should start on a new page */\n pageBreak?: boolean;\n /** Page configuration override for this section */\n page?: {\n size?: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number };\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n header?: number;\n footer?: number;\n gutter?: number;\n };\n };\n}\n\n/**\n * Process document definition into structured format\n */\nexport async function processDocument(\n document: ReportComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Promise<ProcessedDocument> {\n const metadata = createDocumentMetadata(document.props);\n\n // Create initial context\n const context = createRenderContext(\n {\n metadata,\n sections: [],\n theme,\n themeName,\n },\n theme,\n themeName\n );\n\n // Extract sections from components\n const sections = await extractSections(document.children || [], context);\n\n return {\n metadata,\n sections,\n theme,\n themeName,\n };\n}\n\n/**\n * Extract document metadata from report props\n */\nexport function createDocumentMetadata(props: ReportProps): DocumentMetadata {\n return {\n title: props.metadata?.title,\n subtitle: props.metadata?.subtitle,\n author: props.metadata?.author,\n company: props.metadata?.company,\n date: props.metadata?.date ? new Date(props.metadata.date) : new Date(),\n };\n}\n\n/**\n * Extract and flatten sections from component hierarchy\n */\nexport async function extractSections(\n components: ComponentDefinition[],\n context: RenderContext\n): Promise<ProcessedSection[]> {\n const sections: ProcessedSection[] = [];\n\n // Filter out components with enabled: false (defaults to true when not specified)\n const activeComponents = components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n\n for (const component of activeComponents) {\n if (isSectionComponent(component)) {\n const sectionComponents = await flattenComponents(\n component.children || [],\n context\n );\n\n // Determine if page break should be applied (default to true)\n const shouldPageBreak = component.props?.pageBreak !== false;\n\n // Add section title as heading component if present\n if (component.props?.title) {\n // Ensure level is within valid range (1-6) for heading component\n const headingLevel = Math.min(\n Math.max(component.props.level || 1, 1),\n 6\n ) as 1 | 2 | 3 | 4 | 5 | 6;\n\n sectionComponents.unshift({\n name: 'heading',\n props: {\n text: component.props.title,\n level: headingLevel,\n pageBreak: shouldPageBreak,\n // Apply zero-spacing to prevent unwanted initial line\n spacing: {\n before: 0,\n after: 0,\n },\n },\n });\n }\n\n sections.push({\n title: component.props?.title,\n level: component.props?.level,\n components: sectionComponents,\n header: component.props?.header,\n footer: component.props?.footer,\n isExplicitSection: true,\n // Store pageBreak for titleless sections to be handled at layout level\n pageBreak: !component.props?.title ? shouldPageBreak : undefined,\n // Preserve page configuration override if present\n page: component.props?.page,\n });\n } else {\n // Non-section components at root level become their own section\n sections.push({\n components: [component],\n isExplicitSection: false,\n });\n }\n }\n\n return sections;\n}\n\n/**\n * Flatten nested container components while preserving content components\n */\nexport async function flattenComponents(\n components: ComponentDefinition[],\n context: RenderContext\n): Promise<ComponentDefinition[]> {\n const flattened: ComponentDefinition[] = [];\n\n // Filter out components with enabled: false (defaults to true when not specified)\n const activeComponents = components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n\n for (const component of activeComponents) {\n if (isColumnsComponent(component) && component.children) {\n // Preserve columns structure but flatten its contents\n flattened.push({\n ...component,\n children: await flattenComponents(component.children, context),\n });\n } else if (isSectionComponent(component) && component.children) {\n // Flatten nested sections\n if (component.props?.title) {\n // Ensure level is within valid range (1-6) for heading component\n const headingLevel = Math.min(\n Math.max(component.props.level || 1, 1),\n 6\n ) as 1 | 2 | 3 | 4 | 5 | 6;\n\n // Convert section title to heading\n flattened.push({\n name: 'heading',\n props: {\n text: component.props.title,\n level: headingLevel,\n // Apply zero-spacing to prevent unwanted initial line\n spacing: {\n before: 0,\n after: 0,\n },\n },\n });\n }\n flattened.push(...(await flattenComponents(component.children, context)));\n } else {\n // Keep content components as-is\n flattened.push(component);\n }\n }\n\n return flattened;\n}\n\n/**\n * Create render context from processed document\n */\nexport function createRenderContext(\n document: ProcessedDocument,\n theme: ThemeConfig,\n themeName: string\n): RenderContext {\n return {\n theme: {\n name: themeName,\n colors: theme.colors || {},\n fonts: theme.fonts\n ? Object.fromEntries(\n Object.entries(theme.fonts).map(([key, font]) => [key, font.family])\n )\n : {},\n spacing: { small: 120, medium: 240, large: 360, section: 480 },\n },\n fullTheme: theme,\n document: document.metadata,\n section: {\n currentLayout: 'single',\n columnCount: 1,\n pageNumber: 1,\n },\n utils: {\n formatDate: (date: Date) => formatDate(date),\n parseText: (text: string) => [{ text }],\n getStyle: (name: string) => ({ name }),\n },\n depth: 0,\n };\n}\n","/**\n * Layout Functions\n * Handle all layout concerns including columns, breaks, and section properties\n */\n\nimport { SectionType, Column as DocxColumn } from 'docx';\nimport {\n ComponentDefinition,\n ColumnSettings,\n isColumnsComponent,\n isSectionComponent,\n isHeadingComponent,\n isParagraphComponent,\n isTocComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { getPageSetup } from '../styles';\n// import { pointsToTwips } from '../styles/utils/styleHelpers';\nimport { ProcessedSection } from './structure';\nimport {\n getAvailableWidthTwips,\n relativeLengthToTwips,\n} from '../utils/widthUtils';\n\nexport interface LayoutPlan {\n sections: SectionLayout[];\n}\n\nexport interface WordSectionProperties {\n page: {\n size: {\n width: number;\n height: number;\n };\n margin: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n };\n column: ColumnSettings & { children?: DocxColumn[] };\n type?: (typeof SectionType)[keyof typeof SectionType];\n}\n\nexport interface SectionLayout {\n properties: WordSectionProperties;\n components: ComponentDefinition[];\n layoutType: 'single' | 'multi-column';\n breakBefore: boolean;\n header?: ComponentDefinition[] | 'linkToPrevious';\n footer?: ComponentDefinition[] | 'linkToPrevious';\n /** True if this layout section comes from a user-defined Section component */\n isUserSection: boolean;\n /** True if this layout chunk belongs to a user-defined Section (all chunks of that section) */\n belongsToUserSection: boolean;\n /** The heading level of the section title (e.g., 1 for Heading1) - used by TOCs to exclude section title from section-scoped TOCs */\n sectionTitleLevel?: number;\n /** Page configuration override for this section */\n pageOverride?: {\n size?: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number };\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n header?: number;\n footer?: number;\n gutter?: number;\n };\n };\n}\n\nexport interface LayoutGroup {\n layout: 'single' | 'multi-column';\n components: ComponentDefinition[];\n breakBefore: boolean;\n}\n\n/**\n * Apply layout to processed sections\n */\nexport function applyLayout(\n sections: ProcessedSection[],\n theme: ThemeConfig,\n themeName: string\n): LayoutPlan {\n const layoutSections: SectionLayout[] = [];\n\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n const layoutGroups = analyzeLayoutGroups(section.components);\n\n // Determine if this comes from an explicit Section component\n const isSourceUserSection = Boolean(section.isExplicitSection);\n\n // Handle sections with no components but with headers/footers\n // This ensures headers/footers are rendered even for empty sections\n if (layoutGroups.length === 0 && (section.header || section.footer)) {\n const isFirstSection = i === 0;\n const breakBefore = isFirstSection || Boolean(section.pageBreak);\n const sectionType = breakBefore ? 'nextPage' : 'continuous';\n\n layoutSections.push({\n properties: createSectionProperties(\n getColumnSettings('single'),\n theme,\n themeName,\n sectionType,\n section.page\n ),\n components: [],\n layoutType: 'single',\n breakBefore,\n header: section.header,\n footer: section.footer,\n isUserSection: isSourceUserSection,\n belongsToUserSection: isSourceUserSection,\n sectionTitleLevel: section.level,\n pageOverride: section.page,\n });\n continue;\n }\n\n for (let j = 0; j < layoutGroups.length; j++) {\n const group = layoutGroups[j];\n\n // Special handling: a single Columns component becomes its own section with explicit column children\n const isSingleColumnsGroup =\n group.components.length === 1 && isColumnsComponent(group.components[0]);\n\n const columnSettings = isSingleColumnsGroup\n ? createColumnSettingsFromConfig(group.components[0], theme, themeName)\n : getColumnSettings(group.layout);\n\n // Only break page if explicitly requested or this is the first section\n const isFirstSection = i === 0 && j === 0;\n // For titleless sections with pageBreak, apply break to first layout group\n const titlelessSectionBreak = Boolean(section.pageBreak && j === 0);\n const breakBefore =\n group.breakBefore || isFirstSection || titlelessSectionBreak;\n const sectionType = breakBefore ? 'nextPage' : 'continuous';\n\n // Build content components depending on whether this is an explicit columns group\n const contentComponents = isSingleColumnsGroup\n ? processLayoutComponents(\n (group.components[0] as unknown as { children?: ComponentDefinition[] })\n .children || []\n )\n : processLayoutComponents(group.components);\n\n layoutSections.push({\n properties: createSectionProperties(\n columnSettings,\n theme,\n themeName,\n sectionType,\n section.page\n ),\n components: contentComponents,\n layoutType: group.layout,\n breakBefore,\n header: section.header,\n footer: section.footer,\n // Only mark the FIRST layout section as user-defined to avoid\n // creating bookmark paragraphs in subsequent sections (e.g., when\n // transitioning to columns layout). This prevents unwanted newlines\n // at the start of column content.\n isUserSection: isSourceUserSection && j === 0,\n belongsToUserSection: isSourceUserSection,\n // Pass section title level for TOC scoping\n sectionTitleLevel: section.level,\n // Pass page override for this section\n pageOverride: section.page,\n });\n }\n }\n\n return { sections: layoutSections };\n}\n\n/**\n * Analyze components to determine layout groups\n */\nexport function analyzeLayoutGroups(\n components: ComponentDefinition[]\n): LayoutGroup[] {\n const groups: LayoutGroup[] = [];\n let currentLayout: 'single' | 'multi-column' = 'single';\n let currentComponents: ComponentDefinition[] = [];\n let breakNext = false;\n\n for (const component of components) {\n // Always isolate explicit Columns components into their own group\n if (isColumnsComponent(component)) {\n if (currentComponents.length > 0) {\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n currentComponents = [];\n breakNext = false;\n }\n // Determine the actual layout based on the columns component configuration\n const columnsLayout = determineComponentLayout(component);\n groups.push({\n layout: columnsLayout,\n components: [component],\n breakBefore: breakNext,\n });\n breakNext = false;\n continue;\n }\n\n const componentLayout = determineComponentLayout(component);\n\n // Check for explicit break indicators\n if (hasPageBreak(component)) {\n if (currentComponents.length > 0) {\n // Finish previous group without break\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n currentComponents = [];\n breakNext = false;\n }\n // Start new group with break for this component\n currentComponents = [component];\n breakNext = true;\n continue;\n }\n\n // Layout change requires new group\n if (componentLayout !== currentLayout && currentComponents.length > 0) {\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n currentLayout = componentLayout;\n currentComponents = [component];\n breakNext = false;\n } else {\n currentComponents.push(component);\n }\n }\n\n // Add remaining components\n if (currentComponents.length > 0) {\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n }\n\n return groups;\n}\n\n/**\n * Determine layout type for a component\n */\nexport function determineComponentLayout(\n component: ComponentDefinition\n): 'single' | 'multi-column' {\n if (isColumnsComponent(component)) {\n const columns = (component as any).props?.columns;\n\n // If columns is an array with specific configurations\n if (Array.isArray(columns)) {\n // Any columns array with 2+ items is multi-column\n return columns.length >= 2 ? 'multi-column' : 'single';\n }\n\n // No valid array provided; treat as single-column\n return 'single';\n }\n\n // Check if component contains children\n if ('children' in component && (component as any).children) {\n const hasColumns = (component as any).children.some((child: ComponentDefinition) =>\n isColumnsComponent(child)\n );\n return hasColumns ? 'multi-column' : 'single';\n }\n\n return 'single';\n}\n\n/**\n * Process components for layout (insert breaks where needed)\n */\nexport function processLayoutComponents(\n components: ComponentDefinition[]\n): ComponentDefinition[] {\n const processed: ComponentDefinition[] = [];\n\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n\n // Check if this component should have a column break\n if (shouldInsertColumnBreak()) {\n // Create a new component with columnBreak flag\n if (isHeadingComponent(component)) {\n processed.push({\n ...component,\n props: {\n ...((component as any).props || {}),\n columnBreak: true,\n },\n } as ComponentDefinition);\n } else {\n processed.push(component);\n }\n } else {\n processed.push(component);\n }\n }\n\n return processed;\n}\n\n/**\n * Determine if a column break should be inserted\n */\nfunction shouldInsertColumnBreak(): boolean {\n // Logic to determine column breaks based on content distribution\n // This is simplified - could be enhanced with more sophisticated logic\n return false;\n}\n\n/**\n * Check if component indicates a page break\n */\nfunction hasPageBreak(component: ComponentDefinition): boolean {\n if (isSectionComponent(component)) {\n // Default to true for section components when pageBreak is undefined\n return component.props?.pageBreak !== false;\n }\n if (isHeadingComponent(component)) {\n return component.props.pageBreak === true;\n }\n if (isParagraphComponent(component)) {\n return component.props.pageBreak === true;\n }\n // Allow TOC components to request a page break as well\n if (isTocComponent(component)) {\n return component.props?.pageBreak === true;\n }\n return false;\n}\n\n/**\n * Get column settings for layout type\n */\nexport function getColumnSettings(\n layout: 'single' | 'multi-column'\n): ColumnSettings {\n switch (layout) {\n case 'multi-column':\n // Default multi-column layout: 2 equal-width columns\n // Note: Specific column components will override this with their own settings via createColumnSettingsFromConfig\n return {\n count: 2,\n equalWidth: true,\n space: 720, // 0.5 inch in twips\n };\n case 'single':\n default:\n return { count: 1 };\n }\n}\n\n/**\n * Create Word section properties\n */\nexport function createSectionProperties(\n columnSettings: ColumnSettings,\n theme: ThemeConfig,\n themeName: string,\n sectionType?: 'continuous' | 'nextPage',\n pageOverride?: {\n size?: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number };\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n header?: number;\n footer?: number;\n gutter?: number;\n };\n }\n): WordSectionProperties {\n // Get base page setup from theme\n const basePageSetup = getPageSetup(theme, themeName);\n\n // Apply section-level page overrides if present\n const pageSetup = pageOverride\n ? {\n size: {\n ...basePageSetup.size,\n ...(pageOverride.size && typeof pageOverride.size === 'object'\n ? pageOverride.size\n : pageOverride.size\n ? (() => {\n // Convert string size to dimensions\n const sizes = {\n A4: { width: 11906, height: 16838 },\n A3: { width: 16838, height: 23811 },\n LETTER: { width: 12240, height: 15840 },\n LEGAL: { width: 12240, height: 20160 },\n };\n return sizes[pageOverride.size as keyof typeof sizes];\n })()\n : {}),\n },\n margin: {\n ...basePageSetup.margin,\n ...(pageOverride.margins || {}),\n },\n }\n : basePageSetup;\n\n const properties: WordSectionProperties = {\n page: pageSetup,\n column: {\n count: columnSettings.count,\n equalWidth: columnSettings.equalWidth,\n space: columnSettings.space,\n },\n };\n\n // If explicit children were provided, convert to docx Column instances\n if (\n (columnSettings as any).children &&\n Array.isArray((columnSettings as any).children)\n ) {\n const children = (columnSettings as any).children as {\n width?: number;\n space?: number;\n }[];\n // When we have explicit column children, ensure equalWidth is explicitly false\n // so Word doesn't override widths with equal distribution.\n properties.column.equalWidth = false;\n // Also remove top-level space to avoid conflicting with per-column spaces\n delete properties.column.space;\n\n properties.column.children = children.map(\n (c) =>\n new DocxColumn({\n width: c.width as number,\n ...(c.space !== undefined ? { space: c.space } : {}),\n })\n );\n }\n\n if (sectionType) {\n properties.type =\n sectionType === 'continuous'\n ? SectionType.CONTINUOUS\n : SectionType.NEXT_PAGE;\n }\n\n return properties;\n}\n\n/**\n * Create explicit column settings from a Columns component props\n * - width/gap accept number (points) or percentage string relative to available width\n */\nfunction createColumnSettingsFromConfig(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): ColumnSettings {\n const cfg = ((component as any).props || {}) as {\n columns?: Array<{ width?: number | string; gap?: number | string }>;\n };\n\n // Fallback to single column if no valid array is provided\n const columns = (cfg.columns || []) as Array<{\n width?: number | string;\n gap?: number | string;\n }>;\n\n if (!Array.isArray(columns) || columns.length === 0) {\n return { count: 1 };\n }\n\n const availableWidthTwips = getAvailableWidthTwips(theme, themeName);\n\n // First pass: compute defined widths/spaces; collect indexes without width\n const childSettings: { width?: number; space?: number }[] = [];\n let totalDefinedWidth = 0;\n let totalSpace = 0;\n const unspecifiedWidthIndexes: number[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i];\n const child: { width?: number; space?: number } = {};\n\n if (c.width !== undefined) {\n const widthTwips = relativeLengthToTwips(c.width, availableWidthTwips);\n if (widthTwips > 0) {\n child.width = widthTwips;\n totalDefinedWidth += widthTwips;\n }\n } else {\n unspecifiedWidthIndexes.push(i);\n }\n\n if (c.gap !== undefined) {\n const spaceTwips = relativeLengthToTwips(c.gap, availableWidthTwips);\n if (spaceTwips > 0) {\n child.space = spaceTwips;\n totalSpace += spaceTwips;\n }\n }\n\n childSettings.push(child);\n }\n\n // Validate that defined widths + gaps do not exceed available width (with tolerance)\n const totalUsedTwips = totalDefinedWidth + totalSpace;\n const tolerance = 0.005; // 0.5%\n const allowed = availableWidthTwips * (1 + tolerance);\n if (totalUsedTwips > allowed) {\n const usedPercent = (totalUsedTwips / availableWidthTwips) * 100;\n // Build diagnostics per column\n const details = childSettings\n .map((c, idx) => {\n const wPct = c.width\n ? ((c.width / availableWidthTwips) * 100).toFixed(1) + '%'\n : 'auto/unspecified';\n const gPct = c.space\n ? ((c.space / availableWidthTwips) * 100).toFixed(1) + '%'\n : '0%';\n return ` - Column ${idx + 1}: width=${wPct}, gap=${gPct}`;\n })\n .join('\\n');\n const suggestion =\n 'Reduce one or more widths/gaps so total <= 100%, remove the last gap, or set some widths to \"auto\" to consume remaining space.';\n throw new Error(\n `Columns configuration exceeds available width: widths + gaps = ${usedPercent.toFixed(1)}% (> 100% + ${(\n tolerance * 100\n ).toFixed(\n 1\n )}% tolerance)\\nDetails:\\n${details}\\nSuggestion: ${suggestion}`\n );\n }\n\n // Distribute remaining width equally among unspecified widths\n const remaining = Math.max(\n 0,\n availableWidthTwips - totalSpace - totalDefinedWidth\n );\n if (unspecifiedWidthIndexes.length > 0) {\n const each = Math.floor(remaining / unspecifiedWidthIndexes.length);\n for (const idx of unspecifiedWidthIndexes) {\n childSettings[idx].width = each;\n }\n }\n\n return {\n count: columns.length,\n equalWidth: false,\n children: childSettings,\n };\n}\n\n/**\n * Calculate optimal column distribution for content\n */\nexport function calculateColumnDistribution(\n components: ComponentDefinition[],\n columnCount: number\n): ComponentDefinition[][] {\n if (columnCount === 1) {\n return [components];\n }\n\n // Simple distribution - could be enhanced with content-aware logic\n const columns: ComponentDefinition[][] = Array(columnCount)\n .fill(null)\n .map(() => []);\n let currentColumn = 0;\n\n for (const component of components) {\n columns[currentColumn].push(component);\n currentColumn = (currentColumn + 1) % columnCount;\n }\n\n return columns;\n}\n","/**\n * Render Functions\n * Transform components and layout into Word document elements\n */\n\nimport {\n Document,\n Paragraph,\n Table,\n TableOfContents,\n ISectionOptions,\n TextRun,\n ImageRun,\n AlignmentType,\n BookmarkStart,\n BookmarkEnd,\n Textbox,\n} from 'docx';\nimport {\n calculateImageDimensions,\n getImageBuffer,\n parseWidthValue,\n} from '../utils/imageUtils';\nimport {\n getThemeColors,\n getThemeFonts,\n getNormalStyle,\n} from '../themes/defaults';\nimport {\n ComponentDefinition,\n RenderContext,\n isHeadingComponent,\n isParagraphComponent,\n isColumnsComponent,\n isImageComponent,\n isTextBoxComponent,\n isStatisticComponent,\n isTableComponent,\n isSectionComponent,\n isHeaderComponent,\n isFooterComponent,\n isListComponent,\n isTocComponent,\n isHighchartsComponent,\n ParagraphComponentDefinition,\n ImageComponentDefinition,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { createWordStyles } from '../styles/themeToDocxAdapter';\nimport { parseTextWithDecorators } from '../utils/textParser';\nimport { resolveColor } from '../styles/utils/colorUtils';\nimport { resolveFontFamily } from '../styles/utils/styleHelpers';\nimport { getPageSetup } from '../styles/utils/layoutUtils';\nimport { ProcessedDocument, createRenderContext } from './structure';\nimport { LayoutPlan, SectionLayout } from './layout';\nimport {\n renderComponentWithCache,\n initializeComponentCache,\n} from './cached-render';\nimport { MemoryCache } from '../cache';\nimport {\n renderHeadingComponent,\n renderParagraphComponent,\n renderListComponent,\n renderImageComponent,\n renderTableComponent,\n renderSectionComponent,\n renderColumnsComponent,\n renderStatisticComponent,\n renderHeaderComponent,\n renderFooterComponent,\n renderTocComponent,\n renderHighchartsComponent,\n renderTextBoxComponent,\n} from '../components';\nimport { createHeaderElement, createFooterElement } from './content';\nimport { mapFloatingOptions } from '../utils/docxImagePositioning';\n\n/**\n * Convert alignment string to docx AlignmentType\n */\nfunction getAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n\n/**\n * Render a complete document from structure and layout\n */\nexport async function renderDocument(\n structure: ProcessedDocument,\n layout: LayoutPlan,\n options?: { cache?: MemoryCache; bypassCache?: boolean }\n): Promise<Document> {\n // Initialize component cache if provided\n if (options?.cache) {\n initializeComponentCache(options.cache);\n } else if (!options?.bypassCache) {\n // Initialize with default cache unless bypassed\n initializeComponentCache();\n }\n\n // Clear the numbering registry for a fresh start\n const { globalNumberingRegistry } = await import('../utils/numberingConfig');\n globalNumberingRegistry.clear();\n\n const sections: ISectionOptions[] = [];\n\n // Render all layout sections\n const context = createRenderContext(\n structure,\n structure.theme,\n structure.themeName\n );\n\n // Initialize bookmark counter for this document (scoped to renderDocument call)\n let sectionBookmarkCounter = 0;\n\n // Track previous section's headers/footers for 'linkToPrevious' functionality\n let previousHeader: ComponentDefinition[] | undefined = undefined;\n let previousFooter: ComponentDefinition[] | undefined = undefined;\n\n // Render all layout sections\n for (let idx = 0; idx < layout.sections.length; idx++) {\n const layoutSection = layout.sections[idx];\n\n /**\n * Compute stable section ordinal for user-defined sections.\n *\n * When a user-defined Section component spans multiple layout chunks (e.g., due to\n * column transitions), all chunks must share the same bookmark ID for TOC scoping\n * to work correctly. This ensures:\n * 1. Bookmark start appears only in the first chunk\n * 2. All chunks use the same stable bookmark ID (no timestamp)\n * 3. Bookmark end appears only in the last chunk\n *\n * Previously used Date.now() in bookmark IDs, which caused different IDs per chunk.\n * Now we use a stable ordinal that's consistent across all chunks of the same section.\n */\n let sectionOrdinal: number | undefined = undefined;\n if (layoutSection.belongsToUserSection) {\n if (layoutSection.isUserSection) {\n // First chunk of this user-defined section: assign ordinal as next index\n sectionOrdinal = sectionBookmarkCounter + 1;\n } else {\n // Subsequent chunk: reuse last assigned ordinal\n sectionOrdinal = sectionBookmarkCounter; // previous value already incremented after first chunk\n }\n }\n // Handle 'linkToPrevious' value for headers\n let headerToUse: ComponentDefinition[] | undefined;\n if (layoutSection.header === 'linkToPrevious') {\n // Use the previous section's header\n headerToUse = previousHeader;\n } else if (layoutSection.header) {\n // Section has its own header\n headerToUse = layoutSection.header as ComponentDefinition[];\n previousHeader = headerToUse; // Update previous for next section\n } else {\n // No header explicitly set for this section.\n // Important: Word links headers/footers to previous by default.\n // To prevent unintended inheritance, emit an explicit empty header\n // when a previous header exists and caller didn't request linking.\n headerToUse = previousHeader ? [] : undefined;\n // Keep previousHeader cached for potential future explicit linkToPrevious\n }\n\n // Handle 'linkToPrevious' value for footers\n let footerToUse: ComponentDefinition[] | undefined;\n if (layoutSection.footer === 'linkToPrevious') {\n // Use the previous section's footer\n footerToUse = previousFooter;\n } else if (layoutSection.footer) {\n // Section has its own footer\n footerToUse = layoutSection.footer as ComponentDefinition[];\n previousFooter = footerToUse; // Update previous for next section\n } else {\n // No footer explicitly set for this section.\n // Prevent unintended inheritance by emitting an explicit empty footer\n // when a previous footer exists and caller didn't request linking.\n footerToUse = previousFooter ? [] : undefined;\n // Keep previousFooter cached for potential future explicit linkToPrevious\n }\n\n const sectionToRender = {\n ...layoutSection,\n header: headerToUse,\n footer: footerToUse,\n };\n\n // Determine if we should close the bookmark in this chunk.\n // Close when this is the last chunk belonging to the same user-defined section.\n let closeBookmark = false;\n if (layoutSection.belongsToUserSection && sectionOrdinal !== undefined) {\n const next = layout.sections[idx + 1];\n if (!next || !next.belongsToUserSection || next.isUserSection) {\n closeBookmark = true;\n }\n }\n\n const rendered = await renderSection(\n sectionToRender,\n structure.theme,\n structure.themeName,\n context,\n sectionOrdinal,\n closeBookmark\n );\n\n // Increment counter if this section created a bookmark\n if (layoutSection.isUserSection) {\n sectionBookmarkCounter++;\n }\n\n if (rendered.children.length > 0) {\n sections.push(rendered);\n }\n }\n\n // Get all numbering configurations from the registry (already imported above)\n const numberingConfigs = globalNumberingRegistry.getAll();\n\n return new Document({\n styles: createWordStyles(structure.theme),\n sections,\n features: {\n updateFields: true, // Required for TOC fields to update correctly\n },\n // Add numbering configurations if any lists were rendered\n ...(numberingConfigs.length > 0 && {\n numbering: {\n config: numberingConfigs as readonly {\n readonly levels: readonly import('docx').ILevelsOptions[];\n readonly reference: string;\n }[],\n },\n }),\n });\n}\n\n/**\n * Render header/footer components into paragraphs\n */\nasync function renderHeaderFooterComponents(\n components: ComponentDefinition[] | undefined,\n theme: ThemeConfig,\n _themeName: string,\n _context: RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!components || components.length === 0) {\n return [];\n }\n\n // Filter out components with enabled: false (defaults to true when not specified)\n const activeComponents = components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n\n const elements: (Paragraph | Table)[] = [];\n\n for (const component of activeComponents) {\n if (isParagraphComponent(component)) {\n const textComp = component as ParagraphComponentDefinition;\n\n // Use theme's normal style for header/footer text since header/footer styles are removed\n const normalStyle = getNormalStyle(theme);\n\n // Create text style using theme's normal styling\n const textStyle = {\n font:\n textComp.props.font?.family ||\n resolveFontFamily(theme, normalStyle.font) ||\n getThemeFonts(theme).body.family,\n size:\n ((textComp.props.font?.size ?? normalStyle.size ?? 11) as number) * 2, // Convert to half-points\n bold: textComp.props.font?.bold ?? false,\n italics: textComp.props.font?.italic ?? false,\n color:\n (textComp.props.font?.color &&\n resolveColor(textComp.props.font.color, theme)) ||\n (normalStyle.color && resolveColor(normalStyle.color, theme)) ||\n getThemeColors(theme).textPrimary,\n } as const;\n\n // Use parseTextWithDecorators to support rich text formatting\n const textRuns = parseTextWithDecorators(textComp.props.text, textStyle);\n\n elements.push(\n new Paragraph({\n children: textRuns,\n alignment: textComp.props.alignment\n ? getAlignment(textComp.props.alignment)\n : undefined,\n style: 'Normal',\n })\n );\n } else if (isImageComponent(component)) {\n const imageComp = component as ImageComponentDefinition;\n // Get image source (base64 or path)\n let imageSource = imageComp.props.base64 || imageComp.props.path;\n if (!imageSource) {\n elements.push(\n new Paragraph({\n children: [\n new TextRun({\n text: '[IMAGE: Missing path or base64 property]',\n font: getThemeFonts(theme).body.family,\n size: 20,\n bold: true,\n color: '#FF0000',\n }),\n ],\n alignment: imageComp.props.alignment\n ? getAlignment(imageComp.props.alignment)\n : undefined,\n style: 'Normal',\n })\n );\n continue;\n }\n\n let imageBuffer: Buffer;\n\n try {\n // Try to use the provided source first\n imageBuffer = await getImageBuffer(imageSource);\n } catch (error) {\n throw new Error(\n `Failed to load image from ${imageSource.substring(0, 50)}`\n );\n }\n\n try {\n // Get page setup from theme for proper width calculations\n const pageSetup = getPageSetup(theme);\n\n // Convert twips to pixels: 1 twip = 1/1440 inch, 1 inch = 96 pixels at 96 DPI\n const TWIPS_TO_PIXELS = 96 / 1440;\n\n // Calculate page width and content width (page - left margin - right margin) in pixels\n const pageWidthPx = Math.round(pageSetup.size.width * TWIPS_TO_PIXELS);\n const contentWidthPx = Math.round(\n (pageSetup.size.width -\n pageSetup.margin.left -\n pageSetup.margin.right) *\n TWIPS_TO_PIXELS\n );\n\n // Determine reference dimensions based on widthRelativeTo/heightRelativeTo properties\n const widthRelativeTo = imageComp.props.widthRelativeTo || 'content';\n const heightRelativeTo = imageComp.props.heightRelativeTo || 'content';\n const referenceWidthPx =\n widthRelativeTo === 'page' ? pageWidthPx : contentWidthPx;\n\n // Calculate page height and content height in pixels\n const pageHeightPx = Math.round(\n pageSetup.size.height * TWIPS_TO_PIXELS\n );\n const contentHeightPx = Math.round(\n (pageSetup.size.height -\n pageSetup.margin.top -\n pageSetup.margin.bottom) *\n TWIPS_TO_PIXELS\n );\n const referenceHeightPx =\n heightRelativeTo === 'page' ? pageHeightPx : contentHeightPx;\n\n const fallbackHeight = Math.round(referenceWidthPx * 0.6);\n\n // Parse width value if it's a string percentage (like \"90%\")\n const parsedWidth =\n typeof imageComp.props.width === 'string'\n ? parseWidthValue(imageComp.props.width, referenceWidthPx) // Use appropriate reference width\n : imageComp.props.width;\n\n // Parse height value if it's a string percentage (like \"90%\")\n const parsedHeight =\n typeof imageComp.props.height === 'string'\n ? parseWidthValue(imageComp.props.height, referenceHeightPx) // Use reference height based on heightRelativeTo\n : imageComp.props.height;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imageSource,\n parsedWidth,\n parsedHeight,\n referenceWidthPx,\n fallbackHeight\n );\n\n // Map floating options if present\n const floatingOptions = mapFloatingOptions(imageComp.props.floating);\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n ...(floatingOptions && { floating: floatingOptions }),\n });\n\n elements.push(\n new Paragraph({\n children: [imageRun],\n alignment: imageComp.props.alignment\n ? getAlignment(imageComp.props.alignment)\n : undefined,\n style: 'Normal',\n })\n );\n } catch (error) {\n // Fallback for missing images - log error for debugging\n console.error(\n `[Header/Footer Image Error] Failed to render image: ${imageComp.props.path?.substring(0, 50)}...`,\n error instanceof Error ? error.message : error\n );\n elements.push(\n new Paragraph({\n children: [\n new TextRun({\n text: `[IMAGE: ${imageComp.props.path}]`,\n font: getThemeFonts(theme).body.family,\n size: 20,\n color: getThemeColors(theme).secondary,\n bold: true,\n }),\n ],\n style: 'Normal',\n })\n );\n }\n } else if (isTableComponent(component)) {\n // Use renderTableComponent for consistent table rendering in headers/footers\n // This ensures cellDefaults, padding, borders, and all table features work correctly\n const tables = await renderTableComponent(component, theme, _themeName);\n elements.push(...tables);\n }\n // Other component types can be added here as needed\n }\n\n return elements;\n}\n\n/**\n * Render a section with layout\n */\nexport async function renderSection(\n section: SectionLayout,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext,\n sectionOrdinal?: number,\n closeBookmark?: boolean\n): Promise<ISectionOptions> {\n const elements: (Paragraph | Table | TableOfContents)[] = [];\n\n // Update context for this section\n // Generate a unique bookmark for this section so TOCs can scope to it\n const isFirstLayoutOfUserSection = section.isUserSection;\n // Use a stable bookmark ID across all layout sections of the same user-defined section\n const sharedLinkId =\n section.belongsToUserSection && sectionOrdinal ? sectionOrdinal : undefined;\n const sectionBookmarkId =\n sharedLinkId !== undefined ? `_Section_${sharedLinkId}` : undefined;\n\n const sectionContext: RenderContext = {\n ...context,\n section: {\n ...context.section,\n currentLayout: section.layoutType,\n columnCount: section.properties.column?.count || 1,\n // Always pass the same bookmark ID for all layout chunks of the same section\n sectionBookmarkId: sectionBookmarkId,\n // Pass section title level for TOC scoping (excludes section title from its own TOC)\n sectionTitleLevel: section.sectionTitleLevel,\n },\n };\n\n // Add bookmark start before all section content so TOCs can scope to it\n if (\n sectionBookmarkId &&\n isFirstLayoutOfUserSection &&\n sharedLinkId !== undefined\n ) {\n elements.push(\n new Paragraph({\n children: [new BookmarkStart(sectionBookmarkId, sharedLinkId)],\n spacing: {\n before: 0,\n after: 0,\n line: 0,\n },\n })\n );\n }\n\n // Filter out components with enabled: false and render remaining components (with caching)\n const activeComponents = section.components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n for (const component of activeComponents) {\n const rendered = await renderComponentWithCache(\n component,\n theme,\n themeName,\n sectionContext,\n false // Don't bypass cache\n );\n elements.push(...rendered);\n }\n\n // Close bookmark after section content\n if (closeBookmark && sharedLinkId !== undefined) {\n elements.push(\n new Paragraph({\n children: [new BookmarkEnd(sharedLinkId)],\n })\n );\n }\n\n // Build section options with headers/footers if defined\n let headers: ISectionOptions['headers'] | undefined;\n let footers: ISectionOptions['footers'] | undefined;\n\n if (section.header || section.footer) {\n if (section.header && section.header !== 'linkToPrevious') {\n const headerComponents = section.header as ComponentDefinition[];\n const headerParagraphs = await renderHeaderFooterComponents(\n headerComponents,\n theme,\n themeName,\n sectionContext\n );\n // If components were provided but produced no paragraphs, still create\n // an empty Header to break Word's default link-to-previous behavior.\n if (headerComponents.length === 0 || headerParagraphs.length > 0) {\n headers = {\n default: createHeaderElement(headerParagraphs),\n };\n }\n }\n\n if (section.footer && section.footer !== 'linkToPrevious') {\n const footerComponents = section.footer as ComponentDefinition[];\n const footerParagraphs = await renderHeaderFooterComponents(\n footerComponents,\n theme,\n themeName,\n sectionContext\n );\n if (footerComponents.length === 0 || footerParagraphs.length > 0) {\n footers = {\n default: createFooterElement(footerParagraphs),\n };\n }\n }\n }\n\n const sectionOptions: ISectionOptions = {\n properties: section.properties,\n children: elements,\n headers,\n footers,\n };\n\n return sectionOptions;\n}\n\n/**\n * Render a single component to Word elements\n */\nexport async function renderComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<(Paragraph | Table | TableOfContents | Textbox)[]> {\n if (isHeadingComponent(component)) {\n return renderHeadingComponent(component, theme, themeName);\n } else if (isParagraphComponent(component)) {\n return renderParagraphComponent(component, theme, themeName);\n } else if (isColumnsComponent(component)) {\n return await renderColumnsComponent(component, theme, themeName, context);\n } else if (isImageComponent(component)) {\n return await renderImageComponent(component, theme);\n } else if (isTextBoxComponent(component)) {\n return await renderTextBoxComponent(component, theme, themeName, context);\n } else if (isStatisticComponent(component)) {\n return renderStatisticComponent(component, theme);\n } else if (isTableComponent(component)) {\n return await renderTableComponent(component, theme, themeName);\n } else if (isHeaderComponent(component)) {\n return renderHeaderComponent(component, theme, themeName);\n } else if (isFooterComponent(component)) {\n return renderFooterComponent(component, theme, themeName);\n } else if (isListComponent(component)) {\n return renderListComponent(component, theme, themeName);\n } else if (isTocComponent(component)) {\n return renderTocComponent(component, theme, context);\n } else if (isHighchartsComponent(component)) {\n return await renderHighchartsComponent(component, theme, themeName);\n } else if (isSectionComponent(component)) {\n return await renderSectionComponent(component, theme, themeName, context);\n }\n\n throw new Error(\n `Unknown component type: ${(component as ComponentDefinition).name}`\n );\n}\n","import {\n IStylesOptions,\n IRunStylePropertiesOptions,\n IParagraphStylePropertiesOptions,\n AlignmentType,\n TabStopPosition,\n} from 'docx';\nimport { getTheme } from '../templates/themes';\nimport type { ThemeConfig } from './index';\nimport { resolveColor } from './utils/colorUtils';\nimport {\n convertLineSpacing,\n pointsToTwips,\n resolveFontProperties,\n mergeFontAndStyleProperties,\n} from './utils/styleHelpers';\n\n// Border types for paragraph borders in theme styles\ninterface ThemeBorderDefinition {\n style: string; // e.g., 'single', 'double', 'dotted', etc.\n size: number; // width in eighths of a point (docx sz)\n color: string; // hex or theme color key\n space?: number; // space in points\n}\n\ninterface ThemeBorders {\n top?: ThemeBorderDefinition;\n bottom?: ThemeBorderDefinition;\n left?: ThemeBorderDefinition;\n right?: ThemeBorderDefinition;\n}\n\n// Style properties for various text elements\ninterface StyleProperties {\n font?: 'heading' | 'body' | 'mono' | 'light';\n size?: number;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n lineSpacing?: {\n type: 'single' | 'atLeast' | 'exactly' | 'double' | 'multiple';\n value?: number;\n };\n spacing?: {\n before?: number;\n after?: number;\n };\n characterSpacing?: { type: 'condensed' | 'expanded'; value: number };\n priority?: number;\n baseStyle?: string;\n followingStyle?: string;\n widowControl?: boolean;\n keepNext?: boolean;\n keepLinesTogether?: boolean;\n outlineLevel?: number;\n borders?: ThemeBorders;\n indent?: {\n left?: number;\n hanging?: number;\n };\n}\n\n/**\n * Type-safe style name union\n */\ntype StyleName =\n | 'normal'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n | 'title'\n | 'subtitle';\n\n/**\n * Type guard to check if a style name is valid\n */\nfunction isValidStyleName(name: string): name is StyleName {\n return [\n 'normal',\n 'heading1',\n 'heading2',\n 'heading3',\n 'heading4',\n 'heading5',\n 'heading6',\n 'title',\n 'subtitle',\n ].includes(name);\n}\n\n/**\n * Type-safe style getter with proper error handling\n */\nfunction getStyleSafe(\n theme: ThemeConfig,\n styleName: string\n): StyleProperties | undefined {\n if (!isValidStyleName(styleName)) {\n console.warn(`Invalid style name: ${styleName}`);\n return undefined;\n }\n return theme.styles?.[styleName] as StyleProperties | undefined;\n}\n\n/**\n * Resolves a style with baseStyle inheritance.\n * If a style has a baseStyle property, recursively resolves the base style first\n * and merges its properties with the current style (current overrides base).\n *\n * @param theme - Theme configuration\n * @param styleName - Name of the style to resolve\n * @param visited - Set of visited style names to prevent circular references\n * @returns Resolved style with all inherited properties, or undefined if not found\n */\nfunction resolveStyleWithBaseStyle(\n theme: ThemeConfig,\n styleName: string,\n visited: Set<string> = new Set()\n): StyleProperties | undefined {\n // Prevent circular references\n if (visited.has(styleName)) {\n console.warn(\n `Circular baseStyle reference detected: ${Array.from(visited).join(\n ' → '\n )} → ${styleName}`\n );\n return undefined;\n }\n\n visited.add(styleName);\n\n // Use type-safe getter instead of type assertion\n const style = getStyleSafe(theme, styleName);\n if (!style) {\n return undefined;\n }\n\n // If no baseStyle, return style as-is\n if (!style.baseStyle) {\n return style;\n }\n\n // Recursively resolve base style\n const baseStyle = resolveStyleWithBaseStyle(\n theme,\n style.baseStyle,\n new Set(visited) // Pass copy to allow different branches\n );\n\n if (!baseStyle) {\n // If baseStyle doesn't exist, just return current style\n return style;\n }\n\n // Merge: base properties first, then override with current style properties\n // Filter out undefined values from current style to preserve base style values\n const mergedStyle = mergeFontAndStyleProperties(\n baseStyle,\n style\n ) as StyleProperties;\n\n // Manually merge properties not covered by mergeFontAndStyleProperties\n // Borders: inherit from baseStyle unless explicitly provided in current style\n if (style.borders === undefined && baseStyle.borders !== undefined) {\n mergedStyle.borders = baseStyle.borders;\n } else if (style.borders !== undefined) {\n mergedStyle.borders = style.borders;\n }\n\n return mergedStyle;\n}\n\nfunction convertAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n\n/**\n * Resolve spacing from new nested format\n */\nfunction resolveSpacing(spacing?: { before?: number; after?: number }): {\n before?: number;\n after?: number;\n} {\n return {\n before: spacing?.before ? pointsToTwips(spacing.before) : undefined,\n after: spacing?.after ? pointsToTwips(spacing.after) : undefined,\n };\n}\n\n/**\n * Convert merged style properties to docx run properties\n */\nfunction convertRunProperties(\n merged: any,\n theme: ThemeConfig,\n defaultColor?: string,\n defaultSize?: number\n): IRunStylePropertiesOptions {\n return {\n font: merged.family || 'Arial',\n size: (merged.size || defaultSize || 11) * 2,\n color: resolveColor(\n merged.color || defaultColor || theme.colors.text,\n theme\n ),\n ...(merged.bold !== undefined && { bold: merged.bold }),\n ...(merged.italic !== undefined && { italic: merged.italic }),\n ...(merged.underline !== undefined &&\n merged.underline && { underline: { type: 'single' } }),\n ...(merged.characterSpacing && {\n characterSpacing:\n merged.characterSpacing.type === 'condensed'\n ? -merged.characterSpacing.value\n : merged.characterSpacing.value,\n }),\n };\n}\n\n/**\n * Convert merged style properties to docx paragraph properties\n */\nfunction convertParagraphProperties(\n merged: any,\n styleProps?: StyleProperties,\n theme?: ThemeConfig\n): IParagraphStylePropertiesOptions {\n return {\n spacing: {\n ...resolveSpacing(merged.spacing),\n ...convertLineSpacing(merged.lineSpacing),\n },\n alignment: convertAlignment(merged.alignment || 'left'),\n ...(styleProps?.keepNext !== undefined && {\n keepNext: styleProps.keepNext,\n }),\n ...(styleProps?.keepLinesTogether !== undefined && {\n keepLines: styleProps.keepLinesTogether,\n }),\n ...(styleProps?.widowControl !== undefined && {\n widowControl: styleProps.widowControl,\n }),\n ...(styleProps?.outlineLevel !== undefined && {\n outlineLevel: styleProps.outlineLevel,\n }),\n ...(styleProps?.borders &&\n theme && {\n border: convertBorders(styleProps.borders, theme),\n }),\n ...(styleProps?.indent && {\n indent: {\n ...(styleProps.indent.left !== undefined && {\n left: styleProps.indent.left,\n }),\n ...(styleProps.indent.hanging !== undefined && {\n hanging: styleProps.indent.hanging,\n }),\n },\n }),\n } as IParagraphStylePropertiesOptions;\n}\n\n/**\n * Convert theme border definitions to docx paragraph border options\n */\nfunction convertBorders(\n borders: ThemeBorders | undefined,\n theme: ThemeConfig\n):\n | {\n top?: { style: string; size: number; color: string; space?: number };\n bottom?: { style: string; size: number; color: string; space?: number };\n left?: { style: string; size: number; color: string; space?: number };\n right?: { style: string; size: number; color: string; space?: number };\n }\n | undefined {\n if (!borders) return undefined;\n\n const mapSide = (side?: ThemeBorderDefinition) =>\n side\n ? {\n style: side.style,\n size: side.size,\n color: resolveColor(side.color, theme),\n ...(side.space !== undefined ? { space: side.space } : {}),\n }\n : undefined;\n\n const top = mapSide(borders.top);\n const bottom = mapSide(borders.bottom);\n const left = mapSide(borders.left);\n const right = mapSide(borders.right);\n\n const anyDefined = top || bottom || left || right;\n return anyDefined\n ? {\n ...(top && { top }),\n ...(bottom && { bottom }),\n ...(left && { left }),\n ...(right && { right }),\n }\n : undefined;\n}\n\nexport interface WordStyleDefinition {\n id: string;\n name: string;\n basedOn?: string;\n next?: string;\n quickFormat?: boolean;\n run?: IRunStylePropertiesOptions;\n paragraph?: IParagraphStylePropertiesOptions;\n}\n\n/**\n * Creates Word document styles from theme configuration\n * @param themeNameOrObject The theme to use for styling (name string or theme object)\n * @returns IStylesOptions for docx Document\n */\nexport function createWordStyles(\n themeNameOrObject: string | ThemeConfig = 'minimal'\n): IStylesOptions {\n const theme: ThemeConfig =\n typeof themeNameOrObject === 'string'\n ? getTheme(themeNameOrObject) || getTheme('minimal')!\n : themeNameOrObject;\n\n const paragraphStyles: WordStyleDefinition[] = [\n // Normal body text style\n {\n id: 'Normal',\n name: 'Normal',\n quickFormat: true,\n run: (() => {\n const normalStyle =\n resolveStyleWithBaseStyle(theme, 'normal') || theme.styles?.normal;\n const fontProps = resolveFontProperties(theme, normalStyle?.font);\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: normalStyle?.size,\n color: normalStyle?.color,\n bold: normalStyle?.bold,\n italic: normalStyle?.italic,\n underline: normalStyle?.underline,\n characterSpacing: normalStyle?.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.text);\n })(),\n paragraph: (() => {\n const normalStyle =\n resolveStyleWithBaseStyle(theme, 'normal') || theme.styles?.normal;\n const fontProps = resolveFontProperties(theme, normalStyle?.font);\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: normalStyle?.alignment,\n lineSpacing: normalStyle?.lineSpacing,\n spacing: normalStyle?.spacing,\n });\n\n return convertParagraphProperties(merged, normalStyle, theme);\n })(),\n },\n ];\n\n // Generate heading styles from theme configuration\n for (let i = 1; i <= 6; i++) {\n const headingKey = `heading${i}` as keyof typeof theme.styles;\n const rawHeadingStyle = theme.styles?.[headingKey] as\n | StyleProperties\n | undefined;\n\n if (rawHeadingStyle) {\n const headingStyle =\n resolveStyleWithBaseStyle(theme, headingKey) || rawHeadingStyle;\n paragraphStyles.push({\n id: `Heading${i}`,\n name: `Heading ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: headingStyle.size,\n color: headingStyle.color,\n bold: headingStyle.bold,\n italic: headingStyle.italic,\n underline: headingStyle.underline,\n characterSpacing: headingStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.primary, 20);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: headingStyle.alignment,\n lineSpacing: headingStyle.lineSpacing,\n spacing: headingStyle.spacing,\n });\n\n return convertParagraphProperties(merged, headingStyle, theme);\n })(),\n });\n } else {\n // Fallback heading style if not defined in theme\n const fontProps = resolveFontProperties(theme, 'heading');\n paragraphStyles.push({\n id: `Heading${i}`,\n name: `Heading ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 20) * 2,\n color: resolveColor(fontProps.color || theme.colors.primary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n before: 240 - (i - 1) * 40,\n after: 120 - (i - 1) * 20,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n }\n\n // Generate display-only heading styles for text components (non-TOC, non-outline)\n for (let i = 1; i <= 6; i++) {\n const headingKey = `heading${i}` as keyof typeof theme.styles;\n const rawHeadingStyle = theme.styles?.[headingKey] as\n | StyleProperties\n | undefined;\n\n if (rawHeadingStyle) {\n const headingStyle =\n resolveStyleWithBaseStyle(theme, `heading${i}`) || rawHeadingStyle;\n\n paragraphStyles.push({\n id: `JTD_HeadingText${i}`,\n name: `Heading Text ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: false,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: headingStyle.size,\n color: headingStyle.color,\n bold: headingStyle.bold,\n italic: headingStyle.italic,\n underline: headingStyle.underline,\n characterSpacing: headingStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.primary, 20);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: headingStyle.alignment,\n lineSpacing: headingStyle.lineSpacing,\n spacing: headingStyle.spacing,\n });\n\n // Explicitly drop outlineLevel to avoid TOC participation\n return convertParagraphProperties(\n merged,\n { ...(headingStyle as any), outlineLevel: undefined },\n theme\n );\n })(),\n });\n } else {\n // Fallback display heading style mirrors fallback heading visuals\n const fontProps = resolveFontProperties(theme, 'heading');\n paragraphStyles.push({\n id: `JTD_HeadingText${i}`,\n name: `Heading Text ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: false,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 20) * 2,\n color: resolveColor(fontProps.color || theme.colors.primary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n before: 240 - (i - 1) * 40,\n after: 120 - (i - 1) * 20,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n }\n\n // Add Title style from theme configuration\n if (theme.styles?.title) {\n const titleStyle =\n resolveStyleWithBaseStyle(theme, 'title') || theme.styles.title;\n paragraphStyles.push({\n id: 'Title',\n name: 'Title',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n titleStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: titleStyle.size,\n color: titleStyle.color,\n bold: titleStyle.bold,\n italic: titleStyle.italic,\n underline: titleStyle.underline,\n characterSpacing: titleStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.primary, 20);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n titleStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: titleStyle.alignment,\n lineSpacing: titleStyle.lineSpacing,\n spacing: titleStyle.spacing,\n });\n\n return convertParagraphProperties(merged, titleStyle, theme);\n })(),\n });\n } else {\n // Fallback title style if no theme configuration\n const fontProps = resolveFontProperties(theme, 'heading');\n paragraphStyles.push({\n id: 'Title',\n name: 'Title',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 20) * 2,\n color: resolveColor(fontProps.color || theme.colors.primary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n after: 400,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n\n // Add Subtitle style from theme configuration\n if (theme.styles?.subtitle) {\n const subtitleStyle =\n resolveStyleWithBaseStyle(theme, 'subtitle') || theme.styles.subtitle;\n paragraphStyles.push({\n id: 'Subtitle',\n name: 'Subtitle',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n subtitleStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: subtitleStyle.size,\n color: subtitleStyle.color,\n bold: subtitleStyle.bold,\n italic: subtitleStyle.italic,\n underline: subtitleStyle.underline,\n characterSpacing: subtitleStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.secondary);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n subtitleStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: subtitleStyle.alignment,\n lineSpacing: subtitleStyle.lineSpacing,\n spacing: subtitleStyle.spacing,\n });\n\n return convertParagraphProperties(merged, subtitleStyle, theme);\n })(),\n });\n } else {\n // Fallback subtitle style if no theme configuration\n const fontProps = resolveFontProperties(theme, 'body');\n paragraphStyles.push({\n id: 'Subtitle',\n name: 'Subtitle',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 11) * 2,\n color: resolveColor(fontProps.color || theme.colors.secondary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n after: 600,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n\n paragraphStyles.push(\n // Header style\n (() => {\n const fontProps = resolveFontProperties(theme, 'body');\n return {\n id: 'Header',\n name: 'Header',\n basedOn: 'Normal',\n next: 'Header',\n quickFormat: false,\n run: {\n font: fontProps.family || 'Arial',\n size: 20, // 10pt (override default)\n color: resolveColor(fontProps.color || theme.colors.secondary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n },\n paragraph: {\n alignment: 'right',\n },\n };\n })(),\n\n // Footer style\n (() => {\n const fontProps = resolveFontProperties(theme, 'body');\n return {\n id: 'Footer',\n name: 'Footer',\n basedOn: 'Normal',\n next: 'Footer',\n quickFormat: false,\n run: {\n font: fontProps.family || 'Arial',\n size: 18, // 9pt (override default)\n color: resolveColor(fontProps.color || theme.colors.secondary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n },\n paragraph: {\n spacing: {\n before: 120,\n },\n alignment: 'center',\n // Note: Borders are applied at the paragraph instance level, not in style definitions\n },\n };\n })()\n );\n\n // Process custom styles (any additional keys in theme.styles beyond predefined ones)\n const predefinedStyleKeys = new Set([\n 'normal',\n 'heading1',\n 'heading2',\n 'heading3',\n 'heading4',\n 'heading5',\n 'heading6',\n 'title',\n 'subtitle',\n ]);\n\n if (theme.styles) {\n for (const [styleKey, styleValue] of Object.entries(theme.styles)) {\n // Skip predefined styles (already processed above)\n if (predefinedStyleKeys.has(styleKey)) {\n continue;\n }\n\n // Skip if styleValue is not defined\n if (!styleValue) {\n continue;\n }\n\n // Generate Word-compatible style ID and name\n // Special-case TOC styles to the canonical Word display name (e.g., 'TOC 1')\n const tocMatch = /^TOC([1-9])$/.exec(styleKey);\n\n // For TOC styles, DO NOT resolve baseStyle inheritance to prevent coupling with Heading styles\n // TOC styles should only use their explicitly defined properties\n const customStyle = tocMatch\n ? styleValue\n : resolveStyleWithBaseStyle(theme, styleKey) || styleValue;\n // Use a namespaced ID for TOC styles to avoid any accidental ID collisions\n const styleId = tocMatch ? `JTD_TOC${tocMatch[1]}` : styleKey;\n const styleName = tocMatch\n ? `TOC ${tocMatch[1]}`\n : styleKey.replace(/([A-Z])/g, ' $1').trim(); // Convert camelCase/PascalCase to Title Case\n\n // Helper: map baseStyle (theme key) to Word style ID\n const mapBaseStyleId = (base?: string) => {\n if (!base) return 'Normal';\n const lower = base.toLowerCase();\n if (lower === 'normal') return 'Normal';\n if (lower === 'title') return 'Title';\n if (lower === 'subtitle') return 'Subtitle';\n const m = lower.match(/^heading([1-6])$/);\n if (m) return `Heading${m[1]}`;\n // Assume custom style ID (already registered with same id)\n return base;\n };\n\n paragraphStyles.push({\n id: styleId,\n name: styleName,\n basedOn: tocMatch\n ? 'Normal'\n : mapBaseStyleId((customStyle as StyleProperties).baseStyle),\n next: customStyle.followingStyle || 'Normal',\n quickFormat: tocMatch\n ? false\n : customStyle.priority !== undefined\n ? true\n : false,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n customStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: customStyle.size,\n color: customStyle.color,\n bold: customStyle.bold,\n italic: customStyle.italic,\n underline: customStyle.underline,\n characterSpacing: customStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.text);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n customStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: customStyle.alignment,\n lineSpacing: customStyle.lineSpacing,\n spacing: customStyle.spacing,\n });\n\n // Build base properties using converter\n const baseProps = convertParagraphProperties(\n merged,\n // Don't pass outlineLevel for TOC styles\n tocMatch\n ? { ...customStyle, outlineLevel: undefined }\n : customStyle,\n theme\n );\n\n // Add TOC-specific tab stops if needed\n const tabStops = (customStyle as any).tabStops;\n const defaultTocTabStops = tocMatch\n ? [{ type: 'right', position: 'max', leader: 'none' }]\n : undefined;\n const effectiveTabStops =\n tabStops && tabStops.length > 0 ? tabStops : defaultTocTabStops;\n\n return {\n ...baseProps,\n ...(effectiveTabStops && {\n tabStops: effectiveTabStops.map((ts: any) => ({\n type: ts.type,\n position:\n ts.position === 'max' ? TabStopPosition.MAX * 2 : ts.position,\n ...(ts.leader && { leader: ts.leader }),\n })),\n }),\n } as IParagraphStylePropertiesOptions;\n })(),\n });\n }\n }\n\n // Generate TOC level styles (TOC 1..6) using fixed, sober defaults.\n // These defaults do not depend on theme heading styles.\n for (let i = 1; i <= 6; i++) {\n // Skip if user already provided a custom TOC style via theme.styles (id must be 'TOC1'..'TOC6')\n if (\n theme.styles &&\n Object.prototype.hasOwnProperty.call(theme.styles, `TOC${i}`)\n ) {\n continue;\n }\n\n paragraphStyles.push({\n // Use a namespaced ID but canonical display name\n id: `JTD_TOC${i}`,\n name: `TOC ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: false,\n run: {\n font: 'Arial',\n size: 22, // 11pt\n color: resolveColor(theme.colors.text, theme),\n },\n paragraph: {\n spacing: {\n ...resolveSpacing({ before: 0, after: 6 }), // 0pt before, 6pt after\n },\n alignment: convertAlignment('left'),\n // Increase left indent per level for visual hierarchy\n indent: { left: (i - 1) * 360 }, // 0.25\" per level (360 twips)\n },\n });\n }\n\n return {\n paragraphStyles: paragraphStyles as WordStyleDefinition[], // Cast needed due to docx typing\n };\n}\n\n/**\n * Maps section levels to Word style IDs\n */\nexport function getStyleIdForLevel(level: number): string {\n const styleMap: { [key: number]: string } = {\n 1: 'Heading1',\n 2: 'Heading2',\n 3: 'Heading3',\n 4: 'Heading4',\n 5: 'Heading5',\n 6: 'Heading6',\n };\n return styleMap[level] || 'Heading1';\n}\n","import { TextRun, ExternalHyperlink, InternalHyperlink } from 'docx';\nimport {\n processTextWithPlaceholders,\n PlaceholderContext,\n} from './placeholderProcessor';\nimport { normalizeUnicodeText } from './unicode';\n\nexport interface TextStyle {\n font?: string;\n size?: number;\n color?: string;\n bold?: boolean;\n italics?: boolean;\n underline?: {\n type?:\n | 'single'\n | 'double'\n | 'thick'\n | 'dotted'\n | 'dash'\n | 'dotDash'\n | 'dotDotDash'\n | 'wave'\n | 'none'\n | 'words'\n | 'dottedHeavy'\n | 'dashedHeavy'\n | 'dashLong'\n | 'dashLongHeavy'\n | 'dashDotHeavy'\n | 'dashDotDotHeavy'\n | 'wavyHeavy'\n | 'wavyDouble';\n color?: string;\n }; // docx library expects an object or undefined, not boolean\n}\n\nexport interface TextDecoratorOptions {\n boldColor?: string;\n placeholderContext?: PlaceholderContext;\n enableHyperlinks?: boolean;\n}\n\n/**\n * Parses text with inline markdown-style decorators, placeholders, and newlines, returning an array of TextRun objects\n * Supports:\n * - **bold** or __bold__\n * - *italic* or _italic_\n * - ***bold italic*** or ___bold italic___\n * - \\n for line breaks\n * - {PLACEHOLDER} for dynamic content\n * - [link text](url) for hyperlinks (when enableHyperlinks is true)\n *\n * @param text The text to parse\n * @param baseStyle The base style to apply to all text runs\n * @param options Additional options for text decoration\n * @returns Array of TextRun and hyperlink objects with appropriate styling\n */\nexport function parseTextWithDecorators(\n text: string,\n baseStyle: TextStyle = {},\n options: TextDecoratorOptions = {}\n): (TextRun | ExternalHyperlink | InternalHyperlink)[] {\n // Guard against undefined or null text\n if (!text) {\n return [new TextRun({ text: '', ...baseStyle })];\n }\n const normalizedText = normalizeUnicodeText(text);\n\n // Check if text contains placeholders\n const hasPlaceholders = /\\{[^}]+\\}/.test(normalizedText);\n\n if (hasPlaceholders) {\n // Use new placeholder processor that handles both decorators and placeholders\n return processTextWithPlaceholders(\n normalizedText,\n baseStyle,\n options.placeholderContext || {}\n );\n }\n\n // Process hyperlinks first if enabled\n if (options.enableHyperlinks) {\n return parseTextWithHyperlinks(normalizedText, baseStyle, options);\n }\n\n // Original decorator-only processing\n const runs: (TextRun | ExternalHyperlink | InternalHyperlink)[] = [];\n\n // Process decorators on the entire text first (including newlines)\n const decoratorRegex =\n /(\\*\\*\\*|___)([\\s\\S]*?)\\1|(\\*\\*|__)([\\s\\S]*?)\\3|(\\*|_)([\\s\\S]*?)\\5/g;\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = decoratorRegex.exec(normalizedText)) !== null) {\n // Add any text before the match as plain text (handle newlines)\n if (match.index > lastIndex) {\n const plainText = normalizedText.substring(lastIndex, match.index);\n if (plainText) {\n runs.push(...createTextRunsWithNewlines(plainText, baseStyle, options));\n }\n }\n\n // Determine the style based on the decorator\n let decoratedText: string;\n let bold = baseStyle.bold || false;\n let italics = baseStyle.italics || false;\n\n if (match[1] === '***' || match[1] === '___') {\n // Bold + Italic\n decoratedText = match[2];\n bold = true;\n italics = true;\n } else if (match[3] === '**' || match[3] === '__') {\n // Bold\n decoratedText = match[4];\n bold = true;\n } else if (match[5] === '*' || match[5] === '_') {\n // Italic\n decoratedText = match[6];\n italics = true;\n } else {\n // This shouldn't happen with our regex, but just in case\n decoratedText = match[0];\n }\n\n // Create decorated text runs with newlines\n const decoratedRuns = createTextRunsWithNewlines(\n decoratedText,\n baseStyle,\n options,\n {\n bold,\n italics,\n }\n );\n runs.push(...decoratedRuns);\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last match\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n if (remainingText) {\n runs.push(\n ...createTextRunsWithNewlines(remainingText, baseStyle, options)\n );\n }\n }\n\n // If no decorators were found, return text runs with newlines\n if (runs.length === 0 && normalizedText) {\n runs.push(\n ...createTextRunsWithNewlines(normalizedText, baseStyle, options)\n );\n }\n\n return runs;\n}\n\n/**\n * Helper function to create TextRuns with newlines from text\n */\nfunction createTextRunsWithNewlines(\n text: string,\n baseStyle: TextStyle,\n options: TextDecoratorOptions,\n overrideStyle?: { bold?: boolean; italics?: boolean }\n): TextRun[] {\n const runs: TextRun[] = [];\n const lines = text.split('\\n');\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n const needsLineBreak = lineIndex > 0;\n\n if (line || needsLineBreak) {\n // Create run even for empty lines if they need a break\n const runStyle = {\n bold: overrideStyle?.bold ?? baseStyle.bold,\n italics: overrideStyle?.italics ?? baseStyle.italics,\n };\n\n runs.push(\n new TextRun({\n text: line,\n ...(baseStyle.font && { font: baseStyle.font }),\n ...(baseStyle.size && { size: baseStyle.size }),\n ...(baseStyle.color && {\n color:\n runStyle.bold && options.boldColor\n ? options.boldColor\n : baseStyle.color,\n }),\n ...(runStyle.bold !== undefined && { bold: runStyle.bold }),\n ...(runStyle.italics !== undefined && { italics: runStyle.italics }),\n ...(baseStyle.underline && { underline: baseStyle.underline }),\n ...(needsLineBreak && { break: 1 }),\n })\n );\n }\n }\n\n return runs;\n}\n\n/**\n * Parse text with hyperlinks and decorators\n * Supports markdown-style links: [link text](url)\n */\nfunction parseTextWithHyperlinks(\n text: string,\n baseStyle: TextStyle = {},\n options: TextDecoratorOptions = {}\n): (TextRun | ExternalHyperlink | InternalHyperlink)[] {\n const normalizedText = normalizeUnicodeText(text);\n const runs: (TextRun | ExternalHyperlink | InternalHyperlink)[] = [];\n\n // Regex to match markdown-style links: [text](url)\n // This regex handles nested brackets in the link text\n const hyperlinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = hyperlinkRegex.exec(normalizedText)) !== null) {\n // Add any text before the hyperlink\n if (match.index > lastIndex) {\n const plainText = normalizedText.substring(lastIndex, match.index);\n if (plainText) {\n // Recursively parse the plain text for decorators\n const plainRuns = parseTextWithDecorators(plainText, baseStyle, {\n ...options,\n enableHyperlinks: false, // Disable hyperlinks in recursive call\n });\n runs.push(...plainRuns);\n }\n }\n\n const linkText = match[1];\n const linkUrl = match[2];\n\n // Determine if this is an internal or external link\n const isInternal = linkUrl.startsWith('#');\n\n // Parse the link text for decorators (bold, italic, etc.)\n const linkTextRuns = parseTextWithDecorators(linkText, baseStyle, {\n ...options,\n enableHyperlinks: false, // Disable hyperlinks in recursive call\n });\n\n // Create the appropriate hyperlink type\n if (isInternal) {\n // Internal link (bookmark)\n const bookmarkId = linkUrl.substring(1); // Remove the # prefix\n runs.push(\n new InternalHyperlink({\n children: linkTextRuns as TextRun[], // Cast needed for docx types\n anchor: bookmarkId,\n })\n );\n } else {\n // External link\n runs.push(\n new ExternalHyperlink({\n children: linkTextRuns as TextRun[], // Cast needed for docx types\n link: linkUrl,\n })\n );\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last hyperlink\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n if (remainingText) {\n const remainingRuns = parseTextWithDecorators(remainingText, baseStyle, {\n ...options,\n enableHyperlinks: false, // Disable hyperlinks in recursive call\n });\n runs.push(...remainingRuns);\n }\n }\n\n // If no hyperlinks were found, fall back to regular decorator parsing\n if (runs.length === 0 && normalizedText) {\n return parseTextWithDecorators(normalizedText, baseStyle, {\n ...options,\n enableHyperlinks: false,\n });\n }\n\n return runs;\n}\n","/**\n * Placeholder Processing System\n * Handles dynamic content replacement in text with support for rich text formatting\n */\n\nimport {\n TextRun,\n PageNumber,\n ExternalHyperlink,\n InternalHyperlink,\n} from 'docx';\nimport { parseTextWithDecorators, TextStyle } from './textParser';\nimport { normalizeUnicodeText } from './unicode';\n\n// Type alias for elements that can appear in a paragraph\ntype ParagraphChild = TextRun | ExternalHyperlink | InternalHyperlink;\n\n/**\n * Placeholder handler function type\n */\nexport type PlaceholderHandler = (\n _context?: PlaceholderContext\n) => TextRun | TextRun[] | string;\n\n/**\n * Context passed to placeholder handlers\n */\nexport interface PlaceholderContext {\n style?: TextStyle;\n [key: string]: unknown;\n}\n\n/**\n * Placeholder registry for managing dynamic content\n */\nexport class PlaceholderRegistry {\n private static handlers = new Map<string, PlaceholderHandler>();\n\n /**\n * Register a placeholder handler\n */\n static register(name: string, handler: PlaceholderHandler): void {\n this.handlers.set(name.toUpperCase(), handler);\n }\n\n /**\n * Get a placeholder handler\n */\n static get(name: string): PlaceholderHandler | undefined {\n return this.handlers.get(name.toUpperCase());\n }\n\n /**\n * Check if a placeholder is registered\n */\n static has(name: string): boolean {\n return this.handlers.has(name.toUpperCase());\n }\n\n /**\n * Get all registered placeholder names\n */\n static getRegisteredNames(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Clear all registered placeholders\n */\n static clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Process text containing placeholders and return array of paragraph children\n */\nexport function processPlaceholders(\n text: string,\n baseStyle: TextStyle = {},\n context: PlaceholderContext = {}\n): ParagraphChild[] {\n const normalizedText = normalizeUnicodeText(text);\n const placeholderRegex = /\\{([^}]+)\\}/g;\n const result: ParagraphChild[] = [];\n let lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = placeholderRegex.exec(normalizedText)) !== null) {\n const beforeText = normalizedText.substring(lastIndex, match.index);\n const placeholderName = match[1];\n\n // Add text before placeholder\n if (beforeText) {\n result.push(...parseTextWithDecorators(beforeText, baseStyle));\n }\n\n // Process placeholder\n const handler = PlaceholderRegistry.get(placeholderName);\n if (handler) {\n const placeholderResult = handler({ ...context, style: baseStyle });\n\n if (Array.isArray(placeholderResult)) {\n result.push(...placeholderResult);\n } else if (placeholderResult instanceof TextRun) {\n result.push(placeholderResult);\n } else if (typeof placeholderResult === 'string') {\n result.push(...parseTextWithDecorators(placeholderResult, baseStyle));\n }\n } else {\n // Unknown placeholder - keep as text\n result.push(...parseTextWithDecorators(match[0], baseStyle));\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n result.push(...parseTextWithDecorators(remainingText, baseStyle));\n }\n\n // If no placeholders found, process as normal text\n if (result.length === 0) {\n result.push(...parseTextWithDecorators(normalizedText, baseStyle));\n }\n\n return result;\n}\n\n/**\n * Process text with both decorators and placeholders\n */\nexport function processTextWithPlaceholders(\n text: string,\n baseStyle: TextStyle = {},\n context: PlaceholderContext = {}\n): ParagraphChild[] {\n const normalizedText = normalizeUnicodeText(text);\n // Use a more sophisticated approach to handle both decorators and placeholders\n // This regex captures both markdown decorators and placeholders\n const combinedRegex =\n /(\\*\\*\\*|___)([\\s\\S]*?)\\1|(\\*\\*|__)([\\s\\S]*?)\\3|(\\*|_)([\\s\\S]*?)\\5|\\{([^}]+)\\}/g;\n const result: ParagraphChild[] = [];\n let lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = combinedRegex.exec(normalizedText)) !== null) {\n // Add any text before the match as plain text\n if (match.index > lastIndex) {\n const beforeText = normalizedText.substring(lastIndex, match.index);\n if (beforeText) {\n result.push(...createTextRunsWithNewlines(beforeText, baseStyle));\n }\n }\n\n // Check if this is a placeholder (group 7)\n if (match[7]) {\n const placeholderName = match[7];\n const handler = PlaceholderRegistry.get(placeholderName);\n if (handler) {\n const placeholderResult = handler({ ...context, style: baseStyle });\n\n if (Array.isArray(placeholderResult)) {\n result.push(...placeholderResult);\n } else if (placeholderResult instanceof TextRun) {\n result.push(placeholderResult);\n } else if (typeof placeholderResult === 'string') {\n result.push(\n ...createTextRunsWithNewlines(placeholderResult, baseStyle)\n );\n }\n } else {\n // Unknown placeholder - keep as text\n result.push(...createTextRunsWithNewlines(match[0], baseStyle));\n }\n } else {\n // This is a decorator match - determine the style\n let decoratedText: string;\n let bold = baseStyle.bold || false;\n let italics = baseStyle.italics || false;\n\n if (match[1] === '***' || match[1] === '___') {\n // Bold + Italic\n decoratedText = match[2];\n bold = true;\n italics = true;\n } else if (match[3] === '**' || match[3] === '__') {\n // Bold\n decoratedText = match[4];\n bold = true;\n } else if (match[5] === '*' || match[5] === '_') {\n // Italic\n decoratedText = match[6];\n italics = true;\n } else {\n // This shouldn't happen with our regex, but just in case\n decoratedText = match[0];\n }\n\n // Recursively process the decorated text (it might contain placeholders)\n const decoratedTextRuns = processTextWithPlaceholders(\n decoratedText,\n {\n ...baseStyle,\n bold,\n italics,\n },\n context\n );\n result.push(...decoratedTextRuns);\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last match\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n if (remainingText) {\n result.push(...createTextRunsWithNewlines(remainingText, baseStyle));\n }\n }\n\n // If no matches were found, return text runs with newlines\n if (result.length === 0 && normalizedText) {\n result.push(...createTextRunsWithNewlines(normalizedText, baseStyle));\n }\n\n return result;\n}\n\n/**\n * Helper function to create TextRuns with newlines from text\n */\nfunction createTextRunsWithNewlines(\n text: string,\n baseStyle: TextStyle\n): TextRun[] {\n const runs: TextRun[] = [];\n const lines = text.split('\\n');\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n const needsLineBreak = lineIndex > 0;\n\n if (line || needsLineBreak) {\n runs.push(\n new TextRun({\n text: line,\n font: baseStyle.font,\n size: baseStyle.size,\n color: baseStyle.color,\n bold: baseStyle.bold,\n italics: baseStyle.italics,\n underline: baseStyle.underline,\n break: needsLineBreak ? 1 : undefined,\n })\n );\n }\n }\n\n return runs;\n}\n\n/**\n * Initialize built-in placeholders\n */\nexport function initializeBuiltinPlaceholders(): void {\n // PAGE placeholder\n PlaceholderRegistry.register('PAGE', (context) => {\n return new TextRun({\n children: [PageNumber.CURRENT],\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // TOTAL_PAGES placeholder\n PlaceholderRegistry.register('TOTAL_PAGES', (context) => {\n return new TextRun({\n children: [PageNumber.TOTAL_PAGES],\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // DATE placeholder\n PlaceholderRegistry.register('DATE', (context) => {\n const today = new Date();\n const dateString = today.toLocaleDateString();\n return new TextRun({\n text: dateString,\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // DATETIME placeholder\n PlaceholderRegistry.register('DATETIME', (context) => {\n const now = new Date();\n const dateTimeString = now.toLocaleString();\n return new TextRun({\n text: dateTimeString,\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // YEAR placeholder\n PlaceholderRegistry.register('YEAR', (context) => {\n const year = new Date().getFullYear().toString();\n return new TextRun({\n text: year,\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n}\n\n// Initialize built-in placeholders\ninitializeBuiltinPlaceholders();\n","/**\n * Normalize text to NFC so composed accented characters are preserved\n * consistently across DOCX renderers (including LibreOffice).\n */\nexport function normalizeUnicodeText(text: string | null | undefined): string {\n return (text ?? '').normalize('NFC');\n}\n","/**\n * Cache Module Exports\n * Re-exports format-agnostic cache from shared + local key-generator\n */\n\nexport * from '@json-to-office/shared/cache';\nexport { CacheKeyGenerator } from './key-generator';\n","/**\n * Cache Key Generator\n * Generates deterministic cache keys for components\n */\n\nimport { createHash } from 'crypto';\nimport { ComponentDefinition, RenderContext } from '../types';\nimport { CacheKeyOptions } from '@json-to-office/shared/cache';\n\n/**\n * Cache key generator with deterministic hashing\n */\nexport class CacheKeyGenerator {\n private readonly version: string;\n\n constructor(version: string = '1.0') {\n this.version = version;\n }\n\n /**\n * Generate cache key for a component\n */\n generateKey(\n component: ComponentDefinition,\n context: RenderContext,\n options: CacheKeyOptions = {}\n ): string {\n const parts: string[] = [\n this.version,\n component.name,\n this.hashProps(component.props),\n ];\n\n if (options.includeTheme !== false) {\n parts.push(context.theme.name);\n }\n\n if (options.includeContext) {\n parts.push(this.hashContext(context));\n }\n\n if (options.additionalKeys) {\n parts.push(...options.additionalKeys);\n }\n\n if (options.version) {\n parts.push(options.version);\n }\n\n return parts.join(':');\n }\n\n /**\n * Hash component props\n */\n hashProps(props: any): string {\n if (!props) return 'null';\n\n // Sort keys for consistent hashing\n const normalized = this.normalizeObject(props);\n const json = JSON.stringify(normalized);\n\n return this.hash(json);\n }\n\n /**\n * Hash render context\n */\n private hashContext(context: RenderContext): string {\n // Only hash relevant context properties\n const relevant = {\n theme: context.theme.name,\n document: context.document,\n // Exclude runtime properties like sectionIndex, componentIndex\n };\n\n return this.hash(JSON.stringify(relevant));\n }\n\n /**\n * Normalize object for consistent hashing\n */\n private normalizeObject(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.normalizeObject(item));\n }\n\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n if (typeof obj === 'object') {\n const sorted: any = {};\n const keys = Object.keys(obj).sort();\n\n for (const key of keys) {\n sorted[key] = this.normalizeObject(obj[key]);\n }\n\n return sorted;\n }\n\n return obj;\n }\n\n /**\n * Create hash\n */\n private hash(input: string): string {\n return createHash('sha256').update(input).digest('hex').substring(0, 16); // Use first 16 chars for shorter keys\n }\n}\n","/**\n * Cached component rendering system\n * Provides caching layer for component rendering operations\n */\n\nimport { Paragraph, Table, TableOfContents, Textbox } from 'docx';\nimport { ComponentDefinition, RenderContext } from '../types';\nimport { ThemeConfig } from '../styles';\nimport {\n MemoryCache,\n CacheKeyGenerator,\n CacheConfiguration,\n CachedComponent,\n} from '../cache';\nimport { renderComponent } from './render';\nimport { createHash } from 'crypto';\n\n// Global component cache instance\nlet componentCache: MemoryCache | null = null;\nlet cacheKeyGen: CacheKeyGenerator | null = null;\n\n/**\n * Create a hash of the theme configuration for cache key generation\n * This ensures cache invalidation when theme changes\n */\nfunction createThemeHash(theme: ThemeConfig): string {\n // Serialize the theme object to JSON and create a hash\n const themeString = JSON.stringify(theme);\n return createHash('sha256').update(themeString).digest('hex').substring(0, 8);\n}\n\n/**\n * Initialize the component cache\n */\nexport function initializeComponentCache(cache?: MemoryCache): void {\n if (cache) {\n componentCache = cache;\n } else if (!componentCache) {\n // Create a default cache if none provided\n const config: CacheConfiguration = {\n enabled: true,\n evictionPolicy: 'lru',\n memory: {\n enabled: true,\n maxSize: 100, // 100MB for components\n maxEntries: 1000,\n defaultTTL: 3600, // 1 hour\n cleanupInterval: 300, // 5 minutes\n },\n performance: {\n trackMetrics: true,\n metricsSampleRate: 1.0,\n enableWarming: false,\n parallelProcessing: true,\n },\n };\n componentCache = new MemoryCache(config);\n }\n\n if (!cacheKeyGen) {\n cacheKeyGen = new CacheKeyGenerator();\n }\n}\n\n/**\n * Get the component cache instance\n */\nexport function getComponentCache(): MemoryCache | null {\n return componentCache;\n}\n\n/**\n * Clear the component cache\n */\nexport async function clearComponentCache(): Promise<void> {\n if (componentCache) {\n await componentCache.clear();\n }\n}\n\n/**\n * Render a component with caching\n */\nexport async function renderComponentWithCache(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext,\n bypassCache = false\n): Promise<(Paragraph | Table | TableOfContents | Textbox)[]> {\n // Certain components depend on dynamic runtime context and must not be cached.\n // - 'toc' depends on section bookmark IDs generated at render time; caching\n // can produce stale references to non-existent bookmarks on re-render.\n // - 'section' generates unique bookmarks internally; caching would duplicate\n // bookmark IDs across sections/documents.\n const forceBypassForType = component.name === 'toc' || component.name === 'section';\n\n // Initialize cache if needed\n if (!componentCache) {\n initializeComponentCache();\n }\n\n // If cache is disabled or bypassed, render directly\n if (\n !componentCache ||\n bypassCache ||\n forceBypassForType ||\n !componentCache.getConfig().enabled\n ) {\n return renderComponent(component, theme, themeName, context);\n }\n\n // Generate cache key for this component\n // Use theme hash instead of name to ensure cache invalidation on theme changes\n const componentProps = JSON.stringify(component.props || {});\n const themeHash = createThemeHash(theme);\n // Include minimal context for other components that might vary with context\n // For now we add section layout type and column count without exposing\n // bookmark IDs (TOC/section are bypassed above).\n const contextKey = context?.section\n ? `${context.section.currentLayout}:${context.section.columnCount}`\n : 'no-section';\n\n // For container components (columns, section, etc.), include children in cache key\n // This ensures cache invalidation when child component content changes\n const childrenKey =\n 'children' in component && component.children\n ? `:children:${JSON.stringify(component.children)}`\n : '';\n\n const cacheKey = `component:${component.name}:${themeHash}:${contextKey}:${componentProps}${childrenKey}`;\n\n // Try to get from cache\n const cached = await componentCache.get(cacheKey);\n\n if (cached) {\n // Cache hit - the cache internally tracks this as a hit\n // Return the rendered result from cache\n return cached.result as (Paragraph | Table | TableOfContents | Textbox)[];\n }\n\n // Cache miss - render the component\n const renderStartTime = Date.now();\n const rendered = await renderComponent(component, theme, themeName, context);\n // Track render time for analytics\n Date.now() - renderStartTime;\n\n // Calculate approximate size (rough estimate)\n const componentSize = JSON.stringify(rendered).length;\n\n // Create a proper CachedComponent structure\n const cachedEntry: CachedComponent = {\n result: rendered as unknown, // Store the rendered Paragraph/Table array as result\n componentName: component.name,\n propsHash: cacheKey,\n timestamp: Date.now(),\n hits: 0,\n size: componentSize,\n dependencies: [],\n signature: cacheKey,\n lastAccessed: Date.now(),\n };\n\n // Store in cache - the cache internally tracks this as a miss\n await componentCache.set(cacheKey, cachedEntry);\n\n return rendered;\n}\n\n// Note: Component statistics are automatically tracked by the cache itself\n// The cache's updateHitStats and updateMissStats methods handle this internally\n\n/**\n * Warm the cache with frequently used components\n */\nexport async function warmComponentCache(\n components: Array<{\n component: ComponentDefinition;\n theme: ThemeConfig;\n themeName: string;\n context: RenderContext;\n }>\n): Promise<void> {\n if (!componentCache || !componentCache.getConfig().performance.enableWarming) {\n return;\n }\n\n const warmingPromises = components.map(\n async ({ component, theme, themeName, context }) => {\n await renderComponentWithCache(component, theme, themeName, context, false);\n }\n );\n\n await Promise.all(warmingPromises);\n}\n\n/**\n * Get component cache statistics\n */\nexport function getComponentCacheStats() {\n if (!componentCache) {\n return null;\n }\n\n return componentCache.getStats();\n}\n\n/**\n * Export component cache for persistence\n */\nexport async function exportComponentCache(): Promise<Map<\n string,\n unknown\n> | null> {\n if (!componentCache) {\n return null;\n }\n\n const keys = await componentCache.getKeys();\n const exported = new Map<string, unknown>();\n\n for (const key of keys) {\n const value = await componentCache.get(key);\n if (value) {\n exported.set(key, value);\n }\n }\n\n return exported;\n}\n\n/**\n * Import component cache from persistence\n */\nexport async function importComponentCache(\n data: Map<string, unknown>\n): Promise<void> {\n if (!componentCache) {\n initializeComponentCache();\n }\n\n for (const [key, value] of data.entries()) {\n await componentCache!.set(key, value as CachedComponent);\n }\n}\n","/**\n * Component Default Resolution System\n * Provides theme-based default configurations for components\n */\n\nimport {\n ThemeConfig,\n ComponentDefaults,\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n} from '../index';\nimport {\n HeadingProps,\n ParagraphProps,\n ImageProps,\n StatisticProps,\n TableProps,\n SectionProps,\n ColumnsProps,\n ListProps,\n} from '../../types';\n\n/**\n * Get component defaults from theme configuration\n */\nexport function getComponentDefaults(theme: ThemeConfig): ComponentDefaults {\n return theme.componentDefaults || {};\n}\n\n/**\n * Get default configuration for heading components\n */\nexport function getHeadingDefaults(\n theme: ThemeConfig\n): HeadingComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.heading || {};\n}\n\n/**\n * Get level-specific heading defaults from theme styles\n */\nexport function getHeadingDefaultsForLevel(\n theme: ThemeConfig,\n level: number\n): Partial<HeadingComponentDefaults> {\n const defaults: Partial<HeadingComponentDefaults> = {};\n\n // Check styles for level-specific alignment\n if (theme.styles) {\n const styleKey = `heading${level}` as\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6';\n const headingStyle = theme.styles[styleKey];\n\n if (headingStyle?.alignment) {\n defaults.alignment = headingStyle.alignment;\n }\n }\n\n return defaults;\n}\n\n/**\n * Get default configuration for text components\n */\nexport function getTextDefaults(\n theme: ThemeConfig\n): ParagraphComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.paragraph || {};\n}\n\n/**\n * Get default configuration for image components\n */\nexport function getImageDefaults(theme: ThemeConfig): ImageComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.image || {};\n}\n\n/**\n * Get default configuration for statistic components\n */\nexport function getStatisticDefaults(\n theme: ThemeConfig\n): StatisticComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.statistic || {};\n}\n\n/**\n * Get default configuration for table components\n */\nexport function getTableDefaults(theme: ThemeConfig): TableComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.table || {};\n}\n\n/**\n * Get default configuration for section components\n */\nexport function getSectionDefaults(\n theme: ThemeConfig\n): SectionComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.section || {};\n}\n\n/**\n * Get default configuration for columns components\n */\nexport function getColumnsDefaults(\n theme: ThemeConfig\n): ColumnsComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.columns || {};\n}\n\n/**\n * Get default configuration for list components\n */\nexport function getListDefaults(theme: ThemeConfig): ListComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.list || {};\n}\n\n/**\n * Deep merge helper for nested objects\n */\nfunction deepMerge<T>(target: any, source: any): T {\n const output = { ...target };\n\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n output[key] = source[key];\n } else {\n output[key] = deepMerge(target[key], source[key]);\n }\n } else {\n output[key] = source[key];\n }\n });\n }\n\n return output as T;\n}\n\n/**\n * Check if value is a plain object\n */\nfunction isObject(item: any): boolean {\n return item !== null && typeof item === 'object' && !Array.isArray(item);\n}\n\n/**\n * Merge theme defaults with user-provided configuration\n * User config takes precedence over theme defaults\n * Uses deep merge to preserve nested objects like floating configuration\n */\nexport function mergeWithDefaults<T>(\n userConfig: T,\n themeDefaults: Partial<T>\n): T {\n return deepMerge<T>(themeDefaults, userConfig);\n}\n\n/**\n * Resolve heading component props with theme defaults\n */\nexport function resolveHeadingProps(\n props: HeadingProps,\n theme: ThemeConfig\n): HeadingProps {\n const defaults = getHeadingDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve paragraph component props with theme defaults\n */\nexport function resolveParagraphProps(\n props: ParagraphProps,\n theme: ThemeConfig\n): ParagraphProps {\n const defaults = getTextDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve image component props with theme defaults\n */\nexport function resolveImageProps(\n props: ImageProps,\n theme: ThemeConfig\n): ImageProps {\n const defaults = getImageDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve statistic component props with theme defaults\n */\nexport function resolveStatisticProps(\n props: StatisticProps,\n theme: ThemeConfig\n): StatisticProps {\n const defaults = getStatisticDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve table component props with theme defaults\n */\nexport function resolveTableProps(\n props: TableProps,\n theme: ThemeConfig\n): TableProps {\n const defaults = getTableDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve section component props with theme defaults\n */\nexport function resolveSectionProps(\n props: SectionProps,\n theme: ThemeConfig\n): SectionProps {\n const defaults = getSectionDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve columns component props with theme defaults\n */\nexport function resolveColumnsProps(\n props: ColumnsProps,\n theme: ThemeConfig\n): ColumnsProps {\n const defaults = getColumnsDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve list component props with theme defaults\n */\nexport function resolveListProps(\n props: ListProps,\n theme: ThemeConfig\n): ListProps {\n const defaults = getListDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve highcharts component props with theme defaults\n */\nexport function resolveHighchartsProps(\n props: import('@json-to-office/shared-docx').HighchartsProps,\n _theme: ThemeConfig\n): import('@json-to-office/shared-docx').HighchartsProps {\n // Highcharts component doesn't have theme defaults, just return the props as-is\n return props;\n}\n\n/**\n * Get default configuration for custom components\n */\nexport function getCustomComponentDefaults(\n theme: ThemeConfig,\n componentName: string\n): Record<string, unknown> {\n const defaults = getComponentDefaults(theme);\n // Use type assertion since we're dealing with dynamic property access\n return (\n ((defaults as any)?.[componentName] as Record<string, unknown>) || {}\n );\n}\n\n/**\n * Resolve custom component props with theme defaults\n */\nexport function resolveCustomComponentProps<T extends Record<string, unknown>>(\n props: T,\n theme: ThemeConfig,\n componentName: string\n): T {\n const defaults = getCustomComponentDefaults(theme, componentName);\n return mergeWithDefaults(props, defaults as Partial<T>);\n}\n","/**\n * Content Creation Functions\n * Pure functions for creating Word document elements without layout concerns\n */\n\nimport {\n Paragraph,\n TextRun,\n Table,\n TableRow,\n TableCell,\n AlignmentType,\n ImageRun,\n PageBreak,\n WidthType,\n BorderStyle,\n Header,\n Footer,\n PageNumber,\n ColumnBreak,\n TableLayoutType,\n VerticalAlign,\n Bookmark,\n ExternalHyperlink,\n InternalHyperlink,\n} from 'docx';\nimport {\n calculateImageDimensions,\n getImageBuffer,\n parseWidthValue,\n parseDimensionValue,\n} from '../utils/imageUtils';\nimport { ThemeConfig } from '../styles';\nimport { getTableStyle } from '../styles';\nimport { getThemeColors, getThemeFonts } from '../themes/defaults';\nimport { parseTextWithDecorators } from '../utils/textParser';\nimport { processTextWithPlaceholders } from '../utils/placeholderProcessor';\nimport { normalizeUnicodeText } from '../utils/unicode';\nimport { getStyleIdForLevel } from '../styles/themeToDocxAdapter';\nimport { globalBookmarkRegistry } from '../utils/bookmarkRegistry';\nimport { resolveFontFamily } from '../styles/utils/styleHelpers';\nimport {\n ComponentDefinition,\n isParagraphComponent,\n ParagraphComponentDefinition,\n isImageComponent,\n ImageComponentDefinition,\n} from '../types';\nimport { resolveColor } from '../styles/utils/colorUtils';\nimport {\n pointsToTwips,\n convertLineSpacing as convertLineSpacingToDocx,\n} from '../styles/utils/styleHelpers';\n// width/height utils are imported dynamically where needed\n\nexport interface TextOptions {\n style?: string;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n };\n lineSpacing?:\n | number\n | {\n type: 'single' | 'atLeast' | 'exactly' | 'double' | 'multiple';\n value?: number;\n };\n boldColor?: string;\n columnBreak?: boolean;\n // Font properties\n fontFamily?: string;\n fontSize?: number;\n fontColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n // Additional children to prepend (e.g., bookmarks)\n prependChildren?: any[];\n // Outline level for TOC\n outlineLevel?: number;\n // Bookmark ID for internal linking\n bookmarkId?: string;\n // Floating frame properties\n floating?: {\n horizontalPosition?: {\n relative?: 'margin' | 'page' | 'text';\n align?: 'left' | 'center' | 'right' | 'inside' | 'outside';\n offset?: number;\n };\n verticalPosition?: {\n relative?: 'margin' | 'page' | 'text';\n align?: 'top' | 'center' | 'bottom' | 'inside' | 'outside' | 'inline';\n offset?: number;\n };\n wrap?: {\n type: 'around' | 'none' | 'notBeside' | 'through' | 'tight' | 'auto';\n };\n lockAnchor?: boolean;\n width?: number;\n height?: number;\n };\n // Keep paragraph with next paragraph\n keepNext?: boolean;\n // Keep all lines of paragraph together\n keepLines?: boolean;\n}\n\nexport interface ImageOptions {\n caption?: string;\n width?: number | string;\n height?: number | string;\n widthRelativeTo?: 'content' | 'page';\n heightRelativeTo?: 'content' | 'page';\n alignment?: 'left' | 'center' | 'right';\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n };\n floating?: {\n horizontalPosition?: {\n relative?: 'character' | 'column' | 'margin' | 'page' | 'text';\n align?: 'left' | 'center' | 'right' | 'inside' | 'outside';\n offset?: number;\n };\n verticalPosition?: {\n relative?: 'margin' | 'page' | 'paragraph' | 'line' | 'text';\n align?: 'top' | 'center' | 'bottom' | 'inside' | 'outside';\n offset?: number;\n };\n wrap?: {\n // 'tight', 'around', 'through' are VML-style; only 'none', 'square', 'topAndBottom' are supported for images\n type: 'none' | 'square' | 'topAndBottom' | 'around' | 'tight' | 'through';\n side?: 'bothSides' | 'left' | 'right' | 'largest';\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n };\n };\n allowOverlap?: boolean;\n behindDocument?: boolean;\n lockAnchor?: boolean;\n layoutInCell?: boolean;\n zIndex?: number;\n rotation?: number;\n visibility?: 'hidden' | 'inherit';\n };\n // Keep paragraph with next paragraph\n keepNext?: boolean;\n // Keep all lines of paragraph together\n keepLines?: boolean;\n}\n\nexport interface TableOptions {\n style?: 'minimal' | 'classic' | 'minimal';\n}\n\nexport interface StatisticData {\n number: string;\n description: string;\n alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface StatisticOptions {\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n };\n}\n\nexport interface ListOptions {\n // Reference to the numbering configuration in the Document\n numberingReference?: string;\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n item?: number; // in points\n };\n alignment?: 'left' | 'center' | 'right' | 'justify';\n}\n\n/**\n * Create a text paragraph\n */\nexport function createText(\n content: string,\n theme: ThemeConfig,\n _themeName: string,\n options: TextOptions = {}\n): Paragraph {\n const normalizedContent = normalizeUnicodeText(content);\n // Always use Normal style for consistent formatting\n const style = options.style || 'Normal';\n\n // Convert points to twips for spacing\n const spacing: any = {};\n if (options.spacing?.before !== undefined) {\n spacing.before = pointsToTwips(options.spacing.before);\n }\n if (options.spacing?.after !== undefined) {\n spacing.after = pointsToTwips(options.spacing.after);\n }\n // Add line spacing if provided\n const lineSpacingConfig = convertLineSpacingToDocx(options.lineSpacing);\n if (lineSpacingConfig) {\n spacing.line = lineSpacingConfig.line;\n spacing.lineRule = lineSpacingConfig.lineRule;\n }\n\n // Build children array\n const children: (\n | TextRun\n | ColumnBreak\n | ExternalHyperlink\n | InternalHyperlink\n | Bookmark\n )[] = [];\n\n // Add column break if requested\n if (options.columnBreak) {\n children.push(new ColumnBreak());\n }\n\n // Build base text style from options\n const baseTextStyle = {\n ...(options.fontFamily && { font: options.fontFamily }),\n ...(options.fontSize && { size: options.fontSize * 2 }), // Convert points to half-points\n ...(options.fontColor && {\n color: resolveColor(options.fontColor, theme),\n }),\n ...(options.bold !== undefined && { bold: options.bold }),\n ...(options.italic !== undefined && { italics: options.italic }),\n ...(options.underline !== undefined && {\n underline: options.underline ? { type: 'single' as const } : undefined,\n }),\n };\n\n // Add text content - parseTextWithDecorators handles both decorators and newlines\n const textRuns = parseTextWithDecorators(normalizedContent, baseTextStyle, {\n boldColor: options.boldColor,\n enableHyperlinks: true,\n });\n\n // If bookmarkId is provided, wrap text runs in a bookmark\n if (options.bookmarkId) {\n // Register bookmark\n globalBookmarkRegistry.register(\n options.bookmarkId,\n normalizedContent,\n 'paragraph'\n );\n\n // Wrap text runs in bookmark\n children.push(\n new Bookmark({\n id: options.bookmarkId,\n children: textRuns as TextRun[],\n })\n );\n } else {\n // No bookmark, add text runs directly\n children.push(...textRuns);\n }\n\n // Build frame options for floating text\n const isFloating = !!options.floating;\n const frameOptions =\n isFloating && options.floating\n ? mapFrameOptions(options.floating)\n : undefined;\n\n return new Paragraph({\n children,\n style,\n alignment: options.alignment ? getAlignment(options.alignment) : undefined,\n spacing,\n ...(options.outlineLevel !== undefined && {\n outlineLevel: options.outlineLevel,\n }),\n ...(frameOptions && { frame: frameOptions }),\n ...(options.keepNext !== undefined && { keepNext: options.keepNext }),\n ...(options.keepLines !== undefined && { keepLines: options.keepLines }),\n });\n}\n\n/**\n * Map floating frame configuration to docx.js IFrameOptions\n * IFrameOptions can be either IXYFrameOptions (absolute positioning) or IAlignmentFrameOptions (aligned positioning)\n *\n * Supports mixed positioning: alignment on one axis, offset on the other.\n * When mixing, calculates the position for the aligned axis.\n */\nfunction mapFrameOptions(floating: NonNullable<TextOptions['floating']>): any {\n const hasHorizontalOffset = floating.horizontalPosition?.offset !== undefined;\n const hasVerticalOffset = floating.verticalPosition?.offset !== undefined;\n const hasHorizontalAlign = floating.horizontalPosition?.align !== undefined;\n const hasVerticalAlign = floating.verticalPosition?.align !== undefined;\n\n // Choose exactly one mode: absolute if any offset is present; otherwise alignment\n const useAbsolute = hasHorizontalOffset || hasVerticalOffset;\n\n // Base frame options\n const frameWidth = floating.width || 2880; // 2in default\n const frameHeight = floating.height || 1440; // 1in default\n\n const baseOptions: any = {\n width: frameWidth,\n height: frameHeight,\n anchor: {\n horizontal: floating.horizontalPosition?.relative || 'page',\n vertical: floating.verticalPosition?.relative || 'page',\n },\n };\n\n if (floating.wrap?.type) {\n baseOptions.wrap = floating.wrap.type;\n }\n\n // Config lockAnchor maps to docx anchorLock\n if (floating.lockAnchor !== undefined) {\n baseOptions.anchorLock = floating.lockAnchor;\n } else if ((floating as any).anchorLock !== undefined) {\n baseOptions.anchorLock = (floating as any).anchorLock;\n }\n\n if (useAbsolute) {\n // Absolute positioning: use provided offsets; default missing axis to 0\n const x = floating.horizontalPosition?.offset ?? 0;\n const y = floating.verticalPosition?.offset ?? 0;\n return {\n type: 'absolute',\n position: { x, y },\n ...baseOptions,\n };\n }\n\n // Alignment positioning: use provided aligns; default missing axis\n const xAlign = hasHorizontalAlign\n ? floating.horizontalPosition!.align!\n : 'left';\n const yAlign = hasVerticalAlign ? floating.verticalPosition!.align! : 'top';\n return {\n type: 'alignment',\n alignment: { x: xAlign, y: yAlign },\n ...baseOptions,\n };\n}\n\n/**\n * Create a header paragraph\n */\nexport function createHeading(\n text: string,\n level: number,\n theme: ThemeConfig,\n _themeName: string,\n options: TextOptions = {}\n): Paragraph {\n const normalizedText = normalizeUnicodeText(text);\n const styleId = getStyleIdForLevel(level);\n\n // Only apply spacing if explicitly provided in options\n // This allows theme style spacing to be used by default\n const spacing: any = {};\n let hasExplicitSpacing = false;\n\n if (options.spacing?.before !== undefined) {\n spacing.before = pointsToTwips(options.spacing.before);\n hasExplicitSpacing = true;\n }\n if (options.spacing?.after !== undefined) {\n spacing.after = pointsToTwips(options.spacing.after);\n hasExplicitSpacing = true;\n }\n // Add line spacing if provided\n const lineSpacingConfig = convertLineSpacingToDocx(options.lineSpacing);\n if (lineSpacingConfig) {\n spacing.line = lineSpacingConfig.line;\n spacing.lineRule = lineSpacingConfig.lineRule;\n hasExplicitSpacing = true;\n }\n\n // Build children array\n const children: any[] = [];\n\n // Add prepended children first (e.g., bookmarks)\n if (options.prependChildren) {\n children.push(...options.prependChildren);\n }\n\n // Add column break if requested\n if (options.columnBreak) {\n children.push(new ColumnBreak());\n }\n\n // Check if text has decorators (bold/italic markers)\n const hasDecorators = /(\\*\\*\\*|___|(\\*\\*|__)|(\\*|_))/.test(normalizedText);\n\n // Build base text style from options (overrides theme style at run level)\n const baseTextStyle = {\n ...(options.fontFamily && { font: options.fontFamily }),\n ...(options.fontSize && { size: options.fontSize * 2 }), // points to half-points\n ...(options.fontColor && { color: resolveColor(options.fontColor, theme) }),\n ...(options.bold !== undefined && { bold: options.bold }),\n ...(options.italic !== undefined && { italics: options.italic }),\n ...(options.underline !== undefined && {\n underline: options.underline ? { type: 'single' as const } : undefined,\n }),\n };\n\n // Create bookmark if bookmarkId is provided\n if (options.bookmarkId) {\n // Register bookmark\n globalBookmarkRegistry.register(\n options.bookmarkId,\n normalizedText,\n 'heading'\n );\n\n // Wrap heading text in bookmark\n const headingTextChildren: (TextRun | any)[] = [];\n\n if (hasDecorators) {\n // For headings with decorators, parse text runs first\n const textRuns = parseTextWithDecorators(normalizedText, baseTextStyle, {\n boldColor: options.boldColor,\n enableHyperlinks: true,\n });\n headingTextChildren.push(...textRuns);\n } else {\n // For simple headings, add single text run\n headingTextChildren.push(\n new TextRun({ text: normalizedText, ...baseTextStyle })\n );\n }\n\n // Wrap in bookmark\n children.push(\n new Bookmark({\n id: options.bookmarkId,\n children: headingTextChildren,\n })\n );\n } else {\n // No bookmark, add text directly\n if (hasDecorators) {\n // For headings with decorators, parse and add text runs\n const textRuns = parseTextWithDecorators(normalizedText, baseTextStyle, {\n boldColor: options.boldColor,\n enableHyperlinks: true,\n });\n children.push(...textRuns);\n } else {\n // For simple headings, add single text run\n children.push(new TextRun({ text: normalizedText, ...baseTextStyle }));\n }\n }\n\n return new Paragraph({\n children,\n style: styleId,\n alignment: getAlignment(options.alignment || 'left'),\n // Only override spacing if explicitly provided\n spacing: hasExplicitSpacing ? spacing : undefined,\n ...(options.keepNext !== undefined && { keepNext: options.keepNext }),\n ...(options.keepLines !== undefined && { keepLines: options.keepLines }),\n });\n}\n\n/**\n * Create title page content\n */\nexport function createTitleContent(\n title?: string,\n subtitle?: string\n): Paragraph[] {\n // If no title, return empty array (skip title section entirely)\n if (!title) {\n return [];\n }\n\n const normalizedTitle = normalizeUnicodeText(title);\n const elements: Paragraph[] = [];\n\n elements.push(\n new Paragraph({\n text: normalizedTitle,\n style: 'Title',\n })\n );\n\n if (subtitle) {\n const normalizedSubtitle = normalizeUnicodeText(subtitle);\n elements.push(\n new Paragraph({\n text: normalizedSubtitle,\n style: 'Subtitle',\n })\n );\n }\n\n elements.push(new Paragraph({ children: [new PageBreak()] }));\n\n return elements;\n}\n\n/**\n * Create an image with optional caption\n */\nexport async function createImage(\n path: string,\n theme: ThemeConfig,\n options: ImageOptions = {}\n): Promise<Paragraph[]> {\n const elements: Paragraph[] = [];\n const isFloating = !!options.floating;\n const alignment = isFloating\n ? undefined\n : getAlignment(options.alignment || 'center');\n\n let imagePath = path;\n let imageBuffer: Buffer;\n\n try {\n // Try to use the provided path first\n imageBuffer = await getImageBuffer(imagePath);\n\n // Calculate available document width/height for percentage calculations\n const {\n getAvailableWidthTwips,\n getPageWidthTwips,\n getAvailableHeightTwips,\n getPageHeightTwips,\n } = await import('../utils/widthUtils');\n const widthRef = options.widthRelativeTo || 'content';\n const heightRef = options.heightRelativeTo || 'content';\n const availableWidthTwips =\n widthRef === 'page'\n ? getPageWidthTwips(theme)\n : getAvailableWidthTwips(theme);\n const availableHeightTwips =\n heightRef === 'page'\n ? getPageHeightTwips(theme)\n : getAvailableHeightTwips(theme);\n // Convert twips to pixels: 1 twip = 1/1440 inch, 1 inch = 96 pixels (screen DPI)\n const availableWidthPx = Math.round((availableWidthTwips / 1440) * 96);\n const availableHeightPx = Math.round((availableHeightTwips / 1440) * 96);\n\n // Default size calculations (fallback)\n const columnWidthCm = 7.36;\n const pixelsPerCm = 37.795275591;\n const columnWidthPx = Math.round(columnWidthCm * pixelsPerCm);\n const fallbackHeight = Math.round(columnWidthPx * 0.6);\n\n // Parse width value (handles both number and percentage string)\n // Default to 100% if no width is specified\n const parsedWidth = parseWidthValue(\n options.width ?? '100%',\n availableWidthPx\n );\n\n // Parse height value if provided\n const parsedHeight =\n options.height !== undefined\n ? parseDimensionValue(options.height, availableHeightPx)\n : undefined;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imagePath,\n parsedWidth,\n parsedHeight,\n columnWidthPx,\n fallbackHeight\n );\n\n // Build ImageRun configuration with optional floating\n const { mapFloatingOptions } = await import(\n '../utils/docxImagePositioning'\n );\n const floating = isFloating\n ? mapFloatingOptions(options.floating)\n : undefined;\n\n // Detect image type from path/base64 data URI\n const { detectImageType } = await import('../utils/imageUtils');\n const imageType = detectImageType(imagePath);\n\n // Create ImageRun based on image type\n const imageRun =\n imageType === 'svg'\n ? new ImageRun({\n type: 'svg',\n data: imageBuffer,\n fallback: {\n type: 'png',\n data: imageBuffer, // Use the same buffer as fallback for now\n },\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n ...(floating && { floating }),\n })\n : new ImageRun({\n type: imageType,\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n ...(floating && { floating }),\n });\n\n // Convert spacing from points to twips\n const spacing: any = {};\n if (options.spacing?.before !== undefined) {\n spacing.before = pointsToTwips(options.spacing.before);\n }\n if (options.spacing?.after !== undefined) {\n spacing.after = pointsToTwips(options.spacing.after);\n }\n\n elements.push(\n new Paragraph({\n children: [imageRun],\n alignment,\n ...(Object.keys(spacing).length > 0 && { spacing }),\n ...(options.keepNext !== undefined && { keepNext: options.keepNext }),\n ...(options.keepLines !== undefined && {\n keepLines: options.keepLines,\n }),\n })\n );\n } catch (error) {\n // If the image cannot be loaded, try the placeholder\n throw new Error(`Failed to load image from ${imagePath}`);\n }\n\n if (options.caption) {\n // Check if caption has decorators (bold/italic markers)\n const hasDecorators = /(\\*\\*\\*|___|(\\*\\*|__)|(\\*|_))/.test(options.caption);\n\n if (!hasDecorators) {\n // No decorators - use Normal style for font inheritance\n elements.push(\n new Paragraph({\n text: normalizeUnicodeText(options.caption),\n style: 'Normal',\n alignment: AlignmentType.LEFT, // Captions default to left alignment\n })\n );\n } else {\n // Has decorators - use parseTextWithDecorators (same as text component)\n const textRuns = parseTextWithDecorators(\n options.caption,\n {},\n {\n enableHyperlinks: true,\n }\n );\n\n elements.push(\n new Paragraph({\n children: textRuns,\n style: 'Normal', // Use Normal style for consistent font inheritance\n alignment: AlignmentType.LEFT, // Captions default to left alignment\n })\n );\n }\n }\n\n return elements;\n}\n\n/**\n * Create a statistic display\n */\nexport function createStatistic(\n data: StatisticData,\n options: StatisticOptions = {}\n): Paragraph[] {\n const alignment = getAlignment(data.alignment || 'center');\n const normalizedNumber = normalizeUnicodeText(data.number);\n const normalizedDescription = normalizeUnicodeText(data.description);\n\n return [\n new Paragraph({\n text: normalizedNumber,\n style: 'StatisticNumber',\n alignment,\n spacing: options.spacing,\n }),\n new Paragraph({\n text: normalizedDescription,\n style: 'StatisticDescription',\n alignment,\n }),\n ];\n}\n\n/**\n * Create a list of items using proper docx numbering\n */\nexport function createList(\n items: (string | { text: string; level?: number })[],\n _theme: ThemeConfig,\n _themeName: string,\n options: ListOptions = {}\n): Paragraph[] {\n if (!items || items.length === 0) {\n return [];\n }\n\n const paragraphs: Paragraph[] = [];\n\n items.forEach((item, index) => {\n // Handle both string and object items\n const itemText = typeof item === 'string' ? item : item.text;\n const itemLevel = typeof item === 'object' ? item.level || 0 : 0;\n\n if (!itemText.trim()) {\n return; // Skip empty items\n }\n\n // Parse rich text decorators for each item\n // Don't pass font/size/color - let list items inherit from Normal paragraph style\n const textRuns = parseTextWithDecorators(\n itemText,\n {},\n {\n enableHyperlinks: true,\n }\n );\n\n // Calculate spacing for this item (convert points to twips)\n const spacing: { before?: number; after?: number } = {};\n if (index === 0 && options.spacing?.before) {\n spacing.before = pointsToTwips(options.spacing.before);\n }\n if (index === items.length - 1 && options.spacing?.after) {\n spacing.after = pointsToTwips(options.spacing.after);\n } else if (options.spacing?.item) {\n spacing.after = pointsToTwips(options.spacing.item);\n }\n\n // Create the paragraph with proper numbering reference\n const paragraph = new Paragraph({\n style: 'Normal', // Apply Normal style for font inheritance\n children: textRuns,\n alignment: options.alignment\n ? getAlignment(options.alignment)\n : AlignmentType.LEFT,\n spacing,\n // Use proper docx numbering instead of prepending text\n ...(options.numberingReference && {\n numbering: {\n reference: options.numberingReference,\n level: itemLevel,\n },\n }),\n });\n\n paragraphs.push(paragraph);\n });\n\n return paragraphs;\n}\n\n/**\n * Create a table\n */\ntype TableFontConfig = {\n family?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n};\n\ntype BorderColor =\n | string\n | {\n bottom?: string;\n top?: string;\n right?: string;\n left?: string;\n };\n\ntype BorderSize =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype Padding =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype CellDefaults = {\n color?: string;\n backgroundColor?: string;\n horizontalAlignment?: 'left' | 'center' | 'right' | 'justify';\n verticalAlignment?: 'top' | 'middle' | 'bottom';\n font?: TableFontConfig;\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n padding?: Padding;\n height?: number;\n};\n\n// After merging, borders and padding are always normalized to per-side format\ntype NormalizedCellDefaults = {\n color?: string;\n backgroundColor?: string;\n horizontalAlignment?: 'left' | 'center' | 'right' | 'justify';\n verticalAlignment?: 'top' | 'middle' | 'bottom';\n font?: TableFontConfig;\n borderColor: { top: string; right: string; bottom: string; left: string };\n borderSize: { top: number; right: number; bottom: number; left: number };\n padding?: { top: number; right: number; bottom: number; left: number };\n height?: number;\n};\n\n// Hide borders configuration - can be boolean or per-side object\ntype HideBorders =\n | boolean\n | {\n top?: boolean;\n right?: boolean;\n bottom?: boolean;\n left?: boolean;\n insideHorizontal?: boolean;\n insideVertical?: boolean;\n };\n\ntype TableConfig = {\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n hideBorders?: HideBorders;\n cellDefaults?: CellDefaults;\n headerCellDefaults?: CellDefaults;\n width?: number;\n columns: {\n width?: number;\n cellDefaults?: CellDefaults;\n header?: CellDefaults & {\n content?: string | ComponentDefinition;\n };\n cells?: (CellDefaults & {\n content?: string | ComponentDefinition;\n })[];\n }[];\n keepInOnePage?: boolean;\n keepNext?: boolean;\n repeatHeaderOnPageBreak?: boolean;\n};\n\nexport async function createTable(\n columns: TableConfig['columns'],\n tableConfig: TableConfig,\n theme: ThemeConfig,\n themeName: string,\n _options: TableOptions = {}\n): Promise<Table> {\n // Note: _options parameter is available for future table customization\n const tableStyle = getTableStyle(theme, themeName);\n\n // Determine number of rows from the first column\n const numRows = columns[0]?.cells?.length || 0;\n\n // Default values for missing cell defaults\n const getDefaultCellDefaults = (): CellDefaults => ({\n color: '000000',\n backgroundColor: 'FFFFFF',\n horizontalAlignment: 'left',\n verticalAlignment: 'top',\n font: {\n family: 'Arial',\n size: 11,\n bold: false,\n italic: false,\n underline: false,\n },\n borderColor: '000000',\n borderSize: 1,\n });\n\n // Helper function to normalize border color to per-side format\n const normalizeBorderColor = (\n border: BorderColor | undefined\n ):\n | { top: string; right: string; bottom: string; left: string }\n | undefined => {\n if (border === undefined) return undefined;\n if (typeof border === 'string') {\n return { top: border, right: border, bottom: border, left: border };\n }\n return {\n top: border.top ?? '',\n right: border.right ?? '',\n bottom: border.bottom ?? '',\n left: border.left ?? '',\n };\n };\n\n // Helper function to normalize border size to per-side format\n const normalizeBorderSize = (\n border: BorderSize | undefined\n ):\n | { top: number; right: number; bottom: number; left: number }\n | undefined => {\n if (border === undefined) return undefined;\n if (typeof border === 'number') {\n return { top: border, right: border, bottom: border, left: border };\n }\n return {\n top: border.top ?? -1,\n right: border.right ?? -1,\n bottom: border.bottom ?? -1,\n left: border.left ?? -1,\n };\n };\n\n // Helper function to normalize padding to per-side format\n const normalizePadding = (\n padding: Padding | undefined\n ):\n | { top: number; right: number; bottom: number; left: number }\n | undefined => {\n if (padding === undefined) return undefined;\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding };\n }\n return {\n top: padding.top ?? -1,\n right: padding.right ?? -1,\n bottom: padding.bottom ?? -1,\n left: padding.left ?? -1,\n };\n };\n\n // Helper function to merge border colors at the side level\n const mergeBorderColorPerSide = (\n ...borders: (BorderColor | undefined)[]\n ): { top: string; right: string; bottom: string; left: string } => {\n const normalized = borders.map(normalizeBorderColor);\n const defaults = getDefaultCellDefaults();\n const defaultColor =\n typeof defaults.borderColor === 'string'\n ? defaults.borderColor\n : '000000';\n\n return {\n top: normalized.find((b) => b && b.top !== '')?.top ?? defaultColor,\n right: normalized.find((b) => b && b.right !== '')?.right ?? defaultColor,\n bottom:\n normalized.find((b) => b && b.bottom !== '')?.bottom ?? defaultColor,\n left: normalized.find((b) => b && b.left !== '')?.left ?? defaultColor,\n };\n };\n\n // Helper function to merge border sizes at the side level\n const mergeBorderSizePerSide = (\n ...borders: (BorderSize | undefined)[]\n ): { top: number; right: number; bottom: number; left: number } => {\n const normalized = borders.map(normalizeBorderSize);\n const defaults = getDefaultCellDefaults();\n const defaultSize =\n typeof defaults.borderSize === 'number' ? defaults.borderSize : 1;\n\n return {\n top: normalized.find((b) => b && b.top !== -1)?.top ?? defaultSize,\n right: normalized.find((b) => b && b.right !== -1)?.right ?? defaultSize,\n bottom:\n normalized.find((b) => b && b.bottom !== -1)?.bottom ?? defaultSize,\n left: normalized.find((b) => b && b.left !== -1)?.left ?? defaultSize,\n };\n };\n\n // Helper to create border override for table outer borders based on position\n const getTableOuterBorder = (\n position: {\n isHeader?: boolean;\n isFirstCol?: boolean;\n isLastCol?: boolean;\n isLastRow?: boolean;\n },\n tableBorderColor?: BorderColor,\n tableBorderSize?: BorderSize\n ): {\n borderColor?: Partial<{\n top: string;\n right: string;\n bottom: string;\n left: string;\n }>;\n borderSize?: Partial<{\n top: number;\n right: number;\n bottom: number;\n left: number;\n }>;\n } => {\n const result: {\n borderColor?: Partial<{\n top: string;\n right: string;\n bottom: string;\n left: string;\n }>;\n borderSize?: Partial<{\n top: number;\n right: number;\n bottom: number;\n left: number;\n }>;\n } = {};\n\n if (tableBorderColor) {\n const normalizedColor = normalizeBorderColor(tableBorderColor);\n if (normalizedColor) {\n result.borderColor = {};\n if (position.isHeader && normalizedColor.top !== '')\n result.borderColor.top = normalizedColor.top;\n if (position.isFirstCol && normalizedColor.left !== '')\n result.borderColor.left = normalizedColor.left;\n if (position.isLastCol && normalizedColor.right !== '')\n result.borderColor.right = normalizedColor.right;\n if (position.isLastRow && normalizedColor.bottom !== '')\n result.borderColor.bottom = normalizedColor.bottom;\n }\n }\n\n if (tableBorderSize) {\n const normalizedSize = normalizeBorderSize(tableBorderSize);\n if (normalizedSize) {\n result.borderSize = {};\n if (position.isHeader && normalizedSize.top !== -1)\n result.borderSize.top = normalizedSize.top;\n if (position.isFirstCol && normalizedSize.left !== -1)\n result.borderSize.left = normalizedSize.left;\n if (position.isLastCol && normalizedSize.right !== -1)\n result.borderSize.right = normalizedSize.right;\n if (position.isLastRow && normalizedSize.bottom !== -1)\n result.borderSize.bottom = normalizedSize.bottom;\n }\n }\n\n return result;\n };\n\n // Helper function to merge padding at the side level\n const mergePaddingPerSide = (\n ...paddings: (Padding | undefined)[]\n ):\n | { top: number; right: number; bottom: number; left: number }\n | undefined => {\n const normalized = paddings.map(normalizePadding);\n const hasAny = normalized.some((p) => p !== undefined);\n if (!hasAny) return undefined;\n\n return {\n top: normalized.find((p) => p && p.top !== -1)?.top ?? 0,\n right: normalized.find((p) => p && p.right !== -1)?.right ?? 0,\n bottom: normalized.find((p) => p && p.bottom !== -1)?.bottom ?? 0,\n left: normalized.find((p) => p && p.left !== -1)?.left ?? 0,\n };\n };\n\n // Helper function to merge cell defaults with priority: cell > column > table outer border (for specific sides) > table cellDefaults > default\n const mergeCellDefaults = (\n tableDef?: CellDefaults,\n columnDef?: CellDefaults,\n cellDef?: Partial<CellDefaults>,\n position?: {\n isFirstCol?: boolean;\n isLastCol?: boolean;\n isLastRow?: boolean;\n },\n tableOuterBorder?: { borderColor?: BorderColor; borderSize?: BorderSize }\n ): NormalizedCellDefaults => {\n const defaults = getDefaultCellDefaults();\n\n // Merge font configs\n const mergedFont: TableFontConfig = {\n ...defaults.font,\n ...tableDef?.font,\n ...columnDef?.font,\n ...cellDef?.font,\n };\n\n // Get table outer border overrides based on position\n const outerBorder =\n position && tableOuterBorder\n ? getTableOuterBorder(\n position,\n tableOuterBorder.borderColor,\n tableOuterBorder.borderSize\n )\n : {};\n\n // Merge border colors per side (priority: cell > column > table outer border > table cellDefaults > table borderColor > default)\n // tableOuterBorder.borderColor is used twice: via outerBorder for edge-specific application,\n // and directly as fallback for ALL borders when not overridden by cellDefaults\n const mergedBorderColor = mergeBorderColorPerSide(\n cellDef?.borderColor,\n columnDef?.borderColor,\n outerBorder.borderColor as BorderColor,\n tableDef?.borderColor,\n tableOuterBorder?.borderColor // Apply table-level borderColor to all cells as fallback\n );\n\n // Merge border sizes per side (priority: cell > column > table outer border > table cellDefaults > table borderSize > default)\n const mergedBorderSize = mergeBorderSizePerSide(\n cellDef?.borderSize,\n columnDef?.borderSize,\n outerBorder.borderSize as BorderSize,\n tableDef?.borderSize,\n tableOuterBorder?.borderSize // Apply table-level borderSize to all cells as fallback\n );\n\n // Merge padding per side (priority: cell > column > table)\n const mergedPadding = mergePaddingPerSide(\n cellDef?.padding,\n columnDef?.padding,\n tableDef?.padding\n );\n\n return {\n color:\n cellDef?.color ?? columnDef?.color ?? tableDef?.color ?? defaults.color,\n backgroundColor:\n cellDef?.backgroundColor ??\n columnDef?.backgroundColor ??\n tableDef?.backgroundColor ??\n defaults.backgroundColor,\n horizontalAlignment:\n cellDef?.horizontalAlignment ??\n columnDef?.horizontalAlignment ??\n tableDef?.horizontalAlignment ??\n defaults.horizontalAlignment,\n verticalAlignment:\n cellDef?.verticalAlignment ??\n columnDef?.verticalAlignment ??\n tableDef?.verticalAlignment ??\n defaults.verticalAlignment,\n font: mergedFont,\n borderColor: mergedBorderColor,\n borderSize: mergedBorderSize,\n padding: mergedPadding,\n height: cellDef?.height ?? columnDef?.height ?? tableDef?.height,\n };\n };\n\n // Helper function to merge header cell defaults with priority: header > columnCellDefaults > table outer border (for specific sides) > headerCellDefaults > cellDefaults > default\n const mergeHeaderCellDefaults = (\n tableDef?: CellDefaults,\n headerTableDef?: CellDefaults,\n columnDef?: CellDefaults,\n headerDef?: Partial<CellDefaults>,\n position?: { isFirstCol?: boolean; isLastCol?: boolean },\n tableOuterBorder?: { borderColor?: BorderColor; borderSize?: BorderSize }\n ): NormalizedCellDefaults => {\n const defaults = getDefaultCellDefaults();\n\n // Merge font configs with new priority\n const mergedFont: TableFontConfig = {\n ...defaults.font,\n ...tableDef?.font,\n ...headerTableDef?.font,\n ...columnDef?.font,\n ...headerDef?.font,\n };\n\n // Get table outer border overrides based on position (headers always affect top border)\n const outerBorder =\n position && tableOuterBorder\n ? getTableOuterBorder(\n {\n isHeader: true,\n isFirstCol: position.isFirstCol,\n isLastCol: position.isLastCol,\n },\n tableOuterBorder.borderColor,\n tableOuterBorder.borderSize\n )\n : {};\n\n // Merge border colors per side (priority: header > columnCellDefaults > table outer border > headerCellDefaults > cellDefaults > table borderColor > default)\n // tableOuterBorder.borderColor is used twice: via outerBorder for edge-specific application,\n // and directly as fallback for ALL borders when not overridden by cellDefaults\n const mergedBorderColor = mergeBorderColorPerSide(\n headerDef?.borderColor,\n columnDef?.borderColor,\n outerBorder.borderColor as BorderColor,\n headerTableDef?.borderColor,\n tableDef?.borderColor,\n tableOuterBorder?.borderColor // Apply table-level borderColor to all cells as fallback\n );\n\n // Merge border sizes per side (priority: header > columnCellDefaults > table outer border > headerCellDefaults > cellDefaults > table borderSize > default)\n const mergedBorderSize = mergeBorderSizePerSide(\n headerDef?.borderSize,\n columnDef?.borderSize,\n outerBorder.borderSize as BorderSize,\n headerTableDef?.borderSize,\n tableDef?.borderSize,\n tableOuterBorder?.borderSize // Apply table-level borderSize to all cells as fallback\n );\n\n // Merge padding per side (priority: header > headerCellDefaults > columnCellDefaults > cellDefaults)\n const mergedPadding = mergePaddingPerSide(\n headerDef?.padding,\n headerTableDef?.padding,\n columnDef?.padding,\n tableDef?.padding\n );\n\n return {\n color:\n headerDef?.color ??\n headerTableDef?.color ??\n columnDef?.color ??\n tableDef?.color ??\n defaults.color,\n backgroundColor:\n headerDef?.backgroundColor ??\n headerTableDef?.backgroundColor ??\n columnDef?.backgroundColor ??\n tableDef?.backgroundColor ??\n defaults.backgroundColor,\n horizontalAlignment:\n headerDef?.horizontalAlignment ??\n headerTableDef?.horizontalAlignment ??\n columnDef?.horizontalAlignment ??\n tableDef?.horizontalAlignment ??\n defaults.horizontalAlignment,\n verticalAlignment:\n headerDef?.verticalAlignment ??\n headerTableDef?.verticalAlignment ??\n columnDef?.verticalAlignment ??\n tableDef?.verticalAlignment ??\n defaults.verticalAlignment,\n font: mergedFont,\n borderColor: mergedBorderColor,\n borderSize: mergedBorderSize,\n padding: mergedPadding,\n height:\n headerDef?.height ??\n headerTableDef?.height ??\n columnDef?.height ??\n tableDef?.height,\n };\n };\n\n // Helper function to get border value for a specific side\n // After normalization, borders are always objects with side properties\n const getBorderValue = (\n border: {\n top: string | number;\n right: string | number;\n bottom: string | number;\n left: string | number;\n },\n side: 'top' | 'bottom' | 'left' | 'right'\n ) => {\n return border[side];\n };\n\n // Helper function to get padding value for a specific side\n // After normalization, padding is always an object with side properties or undefined\n const getPaddingValue = (\n padding:\n | { top: number; right: number; bottom: number; left: number }\n | undefined,\n side: 'top' | 'bottom' | 'left' | 'right'\n ): number | undefined => {\n if (padding === undefined) return undefined;\n return padding[side] * 20; // Convert points to twips\n };\n\n // Helper function to create margins object from padding\n // After normalization, padding is always an object with side properties or undefined\n // Returns ITableCellMarginOptions with marginUnitType set to DXA (twips)\n const createMarginsFromPadding = (\n padding:\n | { top: number; right: number; bottom: number; left: number }\n | undefined\n ) => {\n if (padding === undefined) return undefined;\n\n return {\n marginUnitType: WidthType.DXA, // Specify that values are in twips\n top: getPaddingValue(padding, 'top') ?? 0,\n bottom: getPaddingValue(padding, 'bottom') ?? 0,\n left: getPaddingValue(padding, 'left') ?? 0,\n right: getPaddingValue(padding, 'right') ?? 0,\n };\n };\n\n // Normalize hideBorders config to per-side format\n const normalizeHideBorders = (\n hideBorders: HideBorders | undefined\n ): {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n insideHorizontal: boolean;\n insideVertical: boolean;\n } => {\n if (hideBorders === undefined) {\n return {\n top: false,\n right: false,\n bottom: false,\n left: false,\n insideHorizontal: false,\n insideVertical: false,\n };\n }\n if (typeof hideBorders === 'boolean') {\n return {\n top: hideBorders,\n right: hideBorders,\n bottom: hideBorders,\n left: hideBorders,\n insideHorizontal: hideBorders,\n insideVertical: hideBorders,\n };\n }\n return {\n top: hideBorders.top ?? false,\n right: hideBorders.right ?? false,\n bottom: hideBorders.bottom ?? false,\n left: hideBorders.left ?? false,\n insideHorizontal: hideBorders.insideHorizontal ?? false,\n insideVertical: hideBorders.insideVertical ?? false,\n };\n };\n\n // Normalized hidden borders config\n const hiddenBorders = normalizeHideBorders(tableConfig.hideBorders);\n\n // Helper function to create border config\n const createBorder = (size: number, color: string, isHidden?: boolean) => {\n if (size === 0 || isHidden) {\n return { style: BorderStyle.NONE, size: 0, color: '000000' };\n }\n return {\n style: BorderStyle.SINGLE,\n size: size * 8, // Convert points to eighths of a point\n color: color || '000000',\n };\n };\n\n // Helper to determine if a specific border should be hidden based on cell position\n const shouldHideBorder = (\n side: 'top' | 'right' | 'bottom' | 'left',\n position: {\n isFirstRow?: boolean;\n isLastRow?: boolean;\n isFirstCol?: boolean;\n isLastCol?: boolean;\n }\n ): boolean => {\n // Map cell position to which hideBorders config applies\n // Outer borders use top/right/bottom/left, inner borders use insideHorizontal/insideVertical\n switch (side) {\n case 'top':\n return position.isFirstRow\n ? hiddenBorders.top\n : hiddenBorders.insideHorizontal;\n case 'bottom':\n return position.isLastRow\n ? hiddenBorders.bottom\n : hiddenBorders.insideHorizontal;\n case 'left':\n return position.isFirstCol\n ? hiddenBorders.left\n : hiddenBorders.insideVertical;\n case 'right':\n return position.isLastCol\n ? hiddenBorders.right\n : hiddenBorders.insideVertical;\n default:\n return false;\n }\n };\n\n // Helper function to process cell content\n const processCellContent = async (\n cell: string | ComponentDefinition | undefined,\n cellDefaults: NormalizedCellDefaults,\n baseCellStyle: typeof tableStyle.tableCell\n ): Promise<\n (TextRun | ImageRun | ExternalHyperlink | InternalHyperlink)[]\n > => {\n let cellChildren: (\n | TextRun\n | ImageRun\n | ExternalHyperlink\n | InternalHyperlink\n )[] = [];\n\n // Handle undefined or empty content\n if (!cell) {\n return cellChildren;\n }\n\n // Create merged style with config overrides\n const mergedStyle = {\n font: cellDefaults.font?.family || baseCellStyle.font,\n size: cellDefaults.font?.size\n ? cellDefaults.font.size * 2\n : baseCellStyle.size, // Convert to half-points\n bold: cellDefaults.font?.bold ?? false,\n italics: cellDefaults.font?.italic ?? false,\n underline: cellDefaults.font?.underline\n ? { type: 'single' as const }\n : undefined,\n color: cellDefaults.color || baseCellStyle.color,\n };\n\n if (typeof cell === 'object' && 'name' in cell && 'props' in cell) {\n // Handle ComponentDefinition\n if (isParagraphComponent(cell)) {\n const textComp = cell as ParagraphComponentDefinition;\n cellChildren = parseTextWithDecorators(\n textComp.props.text,\n mergedStyle,\n { enableHyperlinks: true }\n );\n } else if (isImageComponent(cell)) {\n const imageComp = cell as ImageComponentDefinition;\n try {\n // Get image source (base64 or path)\n const imageSource = imageComp.props.base64 || imageComp.props.path;\n if (!imageSource) {\n throw new Error(\n 'Image component requires either \"path\" or \"base64\" property'\n );\n }\n\n // Read from local file, URL, or base64\n const imageBuffer = await getImageBuffer(imageSource);\n\n // Parse width value if it's a string percentage (like \"90%\")\n const parsedWidth =\n typeof imageComp.props.width === 'string'\n ? parseWidthValue(imageComp.props.width, 300) // Use a reasonable default for table context\n : imageComp.props.width;\n\n // Parse height value if it's a string percentage (like \"90%\")\n const parsedHeight =\n typeof imageComp.props.height === 'string'\n ? parseWidthValue(imageComp.props.height, 200) // Use a reasonable default for table context\n : imageComp.props.height;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imageSource,\n parsedWidth,\n parsedHeight,\n 60, // fallback width\n 20 // fallback height\n );\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n });\n cellChildren = [imageRun];\n } catch (error) {\n // Fallback for missing images\n const imageSource =\n imageComp.props.base64 || imageComp.props.path || 'unknown';\n cellChildren = [\n new TextRun({\n text: `[IMAGE: ${imageSource.substring(0, 50)}${imageSource.length > 50 ? '...' : ''}]`,\n font: mergedStyle.font,\n size: mergedStyle.size,\n color: '#999999',\n }),\n ];\n }\n } else {\n // Unsupported component type in table cell\n cellChildren = [\n new TextRun({\n text: `[Unsupported component type: ${cell.name}]`,\n font: mergedStyle.font,\n size: mergedStyle.size,\n color: '#999999',\n }),\n ];\n }\n } else {\n // Handle plain string\n cellChildren = parseTextWithDecorators(cell as string, mergedStyle, {\n enableHyperlinks: true,\n });\n }\n\n return cellChildren;\n };\n\n // Create header row by iterating through columns\n // Calculate row height from any header cell that defines it\n const numColumns = columns.length;\n const headerHeight = columns.reduce<number | undefined>(\n (maxHeight, column, colIndex) => {\n const headerCell = column.header;\n const position = {\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n };\n const mergedDefaults = mergeHeaderCellDefaults(\n tableConfig.cellDefaults,\n tableConfig.headerCellDefaults,\n column.cellDefaults,\n headerCell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n if (mergedDefaults.height !== undefined) {\n return maxHeight !== undefined\n ? Math.max(maxHeight, mergedDefaults.height)\n : mergedDefaults.height;\n }\n return maxHeight;\n },\n undefined\n );\n\n const headerRow = new TableRow({\n tableHeader: tableConfig.repeatHeaderOnPageBreak,\n height:\n headerHeight !== undefined\n ? { value: headerHeight * 20, rule: 'atLeast' as const }\n : undefined,\n children: await Promise.all(\n columns.map(async (column, colIndex) => {\n const headerCell = column.header;\n\n // Determine position for outer border application and hideBorders\n const position = {\n isFirstRow: true, // Header is always the first row\n isLastRow: numRows === 0, // Header is last row only if no data rows\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n };\n\n // Merge cell defaults with priority: header > columnCellDefaults > table outer border > headerCellDefaults > cellDefaults\n const mergedDefaults = mergeHeaderCellDefaults(\n tableConfig.cellDefaults,\n tableConfig.headerCellDefaults,\n column.cellDefaults,\n headerCell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n\n const cellChildren = await processCellContent(\n headerCell?.content,\n mergedDefaults,\n tableStyle.tableHeader\n );\n\n const horizontalAlignment = mergedDefaults.horizontalAlignment!;\n const verticalAlignment = getVerticalAlignment(\n mergedDefaults.verticalAlignment\n );\n\n return new TableCell({\n children: [\n new Paragraph({\n ...(tableConfig.keepInOnePage && { keepNext: true }),\n alignment: getAlignment(horizontalAlignment),\n children: cellChildren,\n }),\n ],\n\n verticalAlign: verticalAlignment,\n shading: {\n fill:\n mergedDefaults.backgroundColor ||\n getThemeColors(theme).background,\n },\n margins: createMarginsFromPadding(mergedDefaults.padding),\n borders: {\n top: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'top') as number,\n getBorderValue(mergedDefaults.borderColor, 'top') as string,\n shouldHideBorder('top', position)\n ),\n bottom: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'bottom') as number,\n getBorderValue(mergedDefaults.borderColor, 'bottom') as string,\n shouldHideBorder('bottom', position)\n ),\n left: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'left') as number,\n getBorderValue(mergedDefaults.borderColor, 'left') as string,\n shouldHideBorder('left', position)\n ),\n right: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'right') as number,\n getBorderValue(mergedDefaults.borderColor, 'right') as string,\n shouldHideBorder('right', position)\n ),\n },\n });\n })\n ),\n });\n\n // Create data rows\n const dataRows = await Promise.all(\n Array.from({ length: numRows }, async (_, rowIndex) => {\n const isLastRow = rowIndex === numRows - 1;\n\n // Calculate row height from any cell in this row that defines it\n const rowHeight = columns.reduce<number | undefined>(\n (maxHeight, column, colIndex) => {\n const cell = column.cells?.[rowIndex];\n if (cell) {\n const position = {\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n isLastRow,\n };\n const mergedDefaults = mergeCellDefaults(\n tableConfig.cellDefaults,\n column.cellDefaults,\n cell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n if (mergedDefaults.height !== undefined) {\n return maxHeight !== undefined\n ? Math.max(maxHeight, mergedDefaults.height)\n : mergedDefaults.height;\n }\n }\n return maxHeight;\n },\n undefined\n );\n\n return new TableRow({\n height:\n rowHeight !== undefined\n ? { value: rowHeight * 20, rule: 'atLeast' as const }\n : undefined,\n children: await Promise.all(\n columns.map(async (column, colIndex) => {\n const cell = column.cells?.[rowIndex];\n\n // Determine position for outer border application and hideBorders\n const position = {\n isFirstRow: false, // Data rows are never the first row (header is)\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n isLastRow,\n };\n\n if (!cell) {\n // Handle missing cell data - merge defaults properly\n const mergedDefaultsForMissing = mergeCellDefaults(\n tableConfig.cellDefaults,\n column.cellDefaults,\n undefined,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n return new TableCell({\n children: [\n new Paragraph({\n ...((tableConfig.keepInOnePage && !isLastRow) ||\n (isLastRow && tableConfig.keepNext)\n ? { keepNext: true }\n : {}),\n alignment: AlignmentType.LEFT,\n children: [],\n }),\n ],\n borders: {\n top: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'top'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'top'\n ) as string,\n shouldHideBorder('top', position)\n ),\n bottom: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'bottom'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'bottom'\n ) as string,\n shouldHideBorder('bottom', position)\n ),\n left: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'left'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'left'\n ) as string,\n shouldHideBorder('left', position)\n ),\n right: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'right'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'right'\n ) as string,\n shouldHideBorder('right', position)\n ),\n },\n });\n }\n\n // Merge cell defaults with priority: cell > column > table outer border > table cellDefaults\n const mergedDefaults = mergeCellDefaults(\n tableConfig.cellDefaults,\n column.cellDefaults,\n cell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n\n const cellChildren = await processCellContent(\n cell.content,\n mergedDefaults,\n tableStyle.tableCell\n );\n\n const horizontalAlignment = mergedDefaults.horizontalAlignment!;\n const verticalAlignment = getVerticalAlignment(\n mergedDefaults.verticalAlignment\n );\n\n return new TableCell({\n children: [\n new Paragraph({\n ...((tableConfig.keepInOnePage && !isLastRow) ||\n (isLastRow && tableConfig.keepNext)\n ? { keepNext: true }\n : {}),\n alignment: getAlignment(horizontalAlignment),\n children: cellChildren,\n }),\n ],\n verticalAlign: verticalAlignment,\n shading: {\n fill:\n mergedDefaults.backgroundColor ||\n getThemeColors(theme).background,\n },\n margins: createMarginsFromPadding(mergedDefaults.padding),\n borders: {\n top: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'top') as number,\n getBorderValue(mergedDefaults.borderColor, 'top') as string,\n shouldHideBorder('top', position)\n ),\n bottom: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'bottom') as number,\n getBorderValue(\n mergedDefaults.borderColor,\n 'bottom'\n ) as string,\n shouldHideBorder('bottom', position)\n ),\n left: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'left') as number,\n getBorderValue(mergedDefaults.borderColor, 'left') as string,\n shouldHideBorder('left', position)\n ),\n right: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'right') as number,\n getBorderValue(mergedDefaults.borderColor, 'right') as string,\n shouldHideBorder('right', position)\n ),\n },\n });\n })\n ),\n });\n })\n );\n\n // Calculate column widths - if any column has explicit width, use DXA for all\n const hasExplicitWidths = columns.some((col) => col.width !== undefined);\n\n let columnWidths: number[];\n let tableWidth: {\n size: number;\n type: (typeof WidthType)[keyof typeof WidthType];\n };\n\n if (hasExplicitWidths) {\n // Use explicit widths in DXA (twips) - convert from points\n const { getAvailableWidthTwips } = await import('../utils/widthUtils');\n\n // Get available table width in twips (page width minus margins)\n const availableTableWidth = getAvailableWidthTwips(theme, themeName);\n\n // Convert explicit column widths from points to twips (1 point = 20 twips)\n const columnsWithExplicitWidthTwips = columns.map((col) =>\n col.width !== undefined ? pointsToTwips(col.width) : undefined\n );\n\n // Calculate total width used by columns with explicit widths\n const totalExplicitWidth = columnsWithExplicitWidthTwips.reduce(\n (sum: number, w) => sum + (w || 0),\n 0\n );\n\n // Count columns without explicit width\n const columnsWithoutWidth = columns.filter(\n (col) => col.width === undefined\n ).length;\n\n // Calculate remaining space and distribute among columns without explicit width\n const remainingWidth = Math.max(\n 0,\n availableTableWidth - totalExplicitWidth\n );\n const defaultColumnWidth =\n columnsWithoutWidth > 0\n ? remainingWidth / columnsWithoutWidth\n : pointsToTwips(72); // Fallback to 1 inch if all columns have explicit widths\n\n // Assign widths: use explicit width (in twips) or calculated default\n columnWidths = columnsWithExplicitWidthTwips.map(\n (w) => w || defaultColumnWidth\n );\n const totalWidth = columnWidths.reduce((sum, w) => sum + w, 0);\n tableWidth = { size: totalWidth, type: WidthType.DXA };\n } else {\n // Use percentage-based equal distribution\n const percentPerColumn = 100 / columns.length;\n columnWidths = columns.map(() => percentPerColumn);\n tableWidth = { size: tableConfig.width ?? 100, type: WidthType.PERCENTAGE };\n }\n\n return new Table({\n width: tableWidth,\n layout: TableLayoutType.FIXED,\n columnWidths: columnWidths,\n rows: [headerRow, ...dataRows],\n });\n}\n\n/**\n * Convert alignment string to docx AlignmentType\n */\nfunction getAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n\n/**\n * Convert vertical alignment string to docx VerticalAlign\n */\nfunction getVerticalAlignment(\n alignment: string | undefined\n):\n | typeof VerticalAlign.TOP\n | typeof VerticalAlign.CENTER\n | typeof VerticalAlign.BOTTOM\n | undefined {\n if (!alignment) return undefined;\n\n switch (alignment) {\n case 'top':\n return VerticalAlign.TOP;\n case 'middle':\n return VerticalAlign.CENTER;\n case 'bottom':\n return VerticalAlign.BOTTOM;\n default:\n return undefined;\n }\n}\n\n/**\n * Create header element from content\n */\nexport function createHeaderElement(\n children: (Paragraph | Table)[],\n _options?: {\n position?: 'left' | 'center' | 'right';\n }\n): Header {\n return new Header({\n children: children,\n });\n}\n\n/**\n * Create footer element from content\n */\nexport function createFooterElement(\n children: (Paragraph | Table)[],\n _options?: {\n position?: 'left' | 'center' | 'right';\n }\n): Footer {\n return new Footer({\n children: children,\n });\n}\n\n/**\n * Create page number element\n */\nexport function createPageNumberElement(\n format?: string,\n alignment?: 'left' | 'center' | 'right'\n): Paragraph {\n const children: (TextRun | ExternalHyperlink | InternalHyperlink)[] = [];\n\n if (format) {\n // Use placeholder processor to handle {PAGE} and other placeholders\n children.push(...processTextWithPlaceholders(format, {}));\n } else {\n // Default: just page number\n children.push(\n new TextRun({\n children: [PageNumber.CURRENT],\n })\n );\n }\n\n return new Paragraph({\n alignment: getAlignment(alignment || 'center'),\n children,\n });\n}\n\n/**\n * Create mixed content paragraph with text and image elements\n */\nexport async function createMixedContentParagraph(\n textContent: string,\n textOptions: {\n fontSize?: number;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n },\n imagePath?: string,\n imageOptions?: {\n width?: number;\n height?: number;\n },\n alignment?: 'left' | 'center' | 'right',\n theme?: import('../styles').ThemeConfig\n): Promise<Paragraph> {\n const children: (TextRun | ImageRun)[] = [];\n const normalizedTextContent = normalizeUnicodeText(textContent);\n\n // Add text content\n if (normalizedTextContent) {\n children.push(\n new TextRun({\n text: normalizedTextContent,\n font: theme ? getThemeFonts(theme).body.family : undefined,\n size: textOptions.fontSize ? textOptions.fontSize * 2 : 20, // Convert to half-points\n color:\n textOptions.color ||\n (theme ? getThemeColors(theme).textPrimary : undefined),\n bold: textOptions.bold || false,\n italics: textOptions.italic || false,\n })\n );\n }\n\n // Add image if provided\n if (imagePath) {\n try {\n const imageBuffer = await getImageBuffer(imagePath);\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imagePath,\n imageOptions?.width,\n imageOptions?.height,\n 60, // fallback width\n 20 // fallback height\n );\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n });\n\n // Add some spacing before the image\n children.push(new TextRun({ text: ' ' }));\n children.push(imageRun);\n } catch (error) {\n // Fallback for missing images\n children.push(\n new TextRun({\n text: ` [IMAGE: ${imagePath}]`,\n font: theme ? getThemeFonts(theme).body.family : undefined,\n size: (textOptions.fontSize || 10) * 2,\n color: theme ? getThemeColors(theme).secondary : undefined,\n bold: true,\n })\n );\n }\n }\n\n return new Paragraph({\n alignment: getAlignment(alignment || 'left'),\n children,\n });\n}\n\n/**\n * Create a table specifically for headers/footers with custom styling\n */\n\nexport async function createHeaderFooterTable(\n rows: (string | ComponentDefinition)[][],\n options: {\n cellAlignments?: ('left' | 'center' | 'right')[];\n fontSize?: number;\n bold?: boolean;\n color?: string;\n noBorders?: boolean;\n cellStyling?: {\n [rowIndex: number]: {\n [cellIndex: number]: {\n bold?: boolean;\n color?: string;\n fontSize?: number;\n };\n };\n };\n theme?: ThemeConfig;\n themeName?: string;\n } = {}\n): Promise<Table> {\n const {\n cellAlignments = ['left', 'right'],\n fontSize = 10,\n bold = false,\n color = '#000000',\n noBorders = true,\n cellStyling = {},\n theme,\n } = options;\n\n // Use theme's normal style for header/footer text since header/footer styles are removed\n const normalStyle = theme?.styles?.normal;\n\n const defaultFont = theme\n ? resolveFontFamily(theme, normalStyle?.font)\n : 'Arial';\n const defaultSize = normalStyle?.size || fontSize;\n const defaultColor =\n normalStyle?.color && theme\n ? resolveColor(normalStyle.color, theme)\n : color;\n\n const tableRows = await Promise.all(\n rows.map(\n async (row, rowIndex) =>\n new TableRow({\n children: await Promise.all(\n row.map(async (cell, cellIndex) => {\n const alignment = cellAlignments[cellIndex] || 'left';\n const cellStyle = cellStyling[rowIndex]?.[cellIndex] || {};\n\n let paragraphChildren: (\n | TextRun\n | ImageRun\n | ExternalHyperlink\n | InternalHyperlink\n )[] = [];\n\n // Handle ComponentDefinition first\n if (\n typeof cell === 'object' &&\n 'name' in cell &&\n 'props' in cell\n ) {\n // This is a ComponentDefinition\n if (isParagraphComponent(cell)) {\n const textComp = cell as ParagraphComponentDefinition;\n // Use parseTextWithDecorators to support rich text formatting\n const textStyle = {\n font:\n textComp.props.font?.family || (defaultFont as string),\n size:\n ((textComp.props.font?.size || defaultSize) as number) *\n 2, // Convert to half-points\n bold: textComp.props.font?.bold ?? false,\n color:\n (textComp.props.font?.color && theme\n ? resolveColor(textComp.props.font.color, theme)\n : undefined) || defaultColor,\n } as const;\n paragraphChildren = parseTextWithDecorators(\n textComp.props.text,\n textStyle,\n { enableHyperlinks: true }\n );\n } else if (isImageComponent(cell)) {\n const imageComp = cell as ImageComponentDefinition;\n try {\n // Get image source (base64 or path)\n const imageSource =\n imageComp.props.base64 || imageComp.props.path;\n if (!imageSource) {\n throw new Error(\n 'Image component requires either \"path\" or \"base64\" property'\n );\n }\n\n // Read from local file, URL, or base64\n const imageBuffer = await getImageBuffer(imageSource);\n\n // Parse width value if it's a string percentage (like \"90%\")\n const parsedWidth =\n typeof imageComp.props.width === 'string'\n ? parseWidthValue(imageComp.props.width, 300) // Use a reasonable default for table context\n : imageComp.props.width;\n\n // Parse height value if it's a string percentage (like \"90%\")\n const parsedHeight =\n typeof imageComp.props.height === 'string'\n ? parseWidthValue(imageComp.props.height, 200) // Use a reasonable default for table context\n : imageComp.props.height;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imageSource,\n parsedWidth,\n parsedHeight,\n 60, // fallback width\n 20 // fallback height\n );\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n });\n paragraphChildren = [imageRun];\n } catch (error) {\n // Fallback for missing images\n const imageSource =\n imageComp.props.base64 ||\n imageComp.props.path ||\n 'unknown';\n paragraphChildren = [\n new TextRun({\n text: `[IMAGE: ${imageSource.substring(0, 50)}${imageSource.length > 50 ? '...' : ''}]`,\n size: fontSize * 2,\n bold: true,\n color: '#999999',\n }),\n ];\n }\n } else {\n // Unsupported component type in table cell\n paragraphChildren = [\n new TextRun({\n text: `[Unsupported component type: ${cell.name}]`,\n size: fontSize * 2,\n color: '#999999',\n }),\n ];\n }\n } else if (typeof cell === 'string') {\n // Handle plain string text (including placeholders)\n const textStyle = {\n font: defaultFont,\n size: (cellStyle.fontSize || defaultSize) * 2,\n bold: cellStyle.bold !== undefined ? cellStyle.bold : bold,\n color: cellStyle.color || defaultColor,\n };\n\n // Use parseTextWithDecorators which now handles both decorators and placeholders\n paragraphChildren = parseTextWithDecorators(cell, textStyle, {\n enableHyperlinks: true,\n });\n }\n\n return new TableCell({\n children: [\n new Paragraph({\n alignment: getAlignment(alignment),\n children: paragraphChildren,\n }),\n ],\n margins: {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n borders: noBorders\n ? {\n top: { style: BorderStyle.NONE, size: 0 },\n bottom: { style: BorderStyle.NONE, size: 0 },\n left: { style: BorderStyle.NONE, size: 0 },\n right: { style: BorderStyle.NONE, size: 0 },\n }\n : undefined,\n });\n })\n ),\n })\n )\n );\n\n return new Table({\n width: { size: 100, type: WidthType.PERCENTAGE },\n layout: TableLayoutType.FIXED, // Lock column widths to prevent horizontal resizing\n rows: tableRows,\n borders: noBorders\n ? {\n top: { style: BorderStyle.NONE, size: 0 },\n bottom: { style: BorderStyle.NONE, size: 0 },\n left: { style: BorderStyle.NONE, size: 0 },\n right: { style: BorderStyle.NONE, size: 0 },\n insideHorizontal: { style: BorderStyle.NONE, size: 0 },\n insideVertical: { style: BorderStyle.NONE, size: 0 },\n }\n : undefined,\n });\n}\n","/**\n * Bookmark Registry\n * Utilities for managing document bookmarks for internal hyperlinks\n */\n\nexport interface BookmarkInfo {\n id: string;\n title: string;\n type: string; // e.g., 'heading', 'paragraph', 'table', etc.\n}\n\n/**\n * Registry for managing document bookmarks\n * Used to track bookmark IDs and validate internal hyperlink targets\n */\nexport class BookmarkRegistry {\n private bookmarks: Map<string, BookmarkInfo> = new Map();\n private counter = 0;\n\n /**\n * Register a bookmark\n */\n register(id: string, title: string, type: string): void {\n if (this.bookmarks.has(id)) {\n console.warn(\n `Duplicate bookmark ID: ${id}. Using the latest registration.`\n );\n }\n this.bookmarks.set(id, { id, title, type });\n }\n\n /**\n * Generate a unique bookmark ID from text\n * Converts text to a URL-friendly format\n */\n generateId(text: string, _type: string = 'bookmark'): string {\n // Convert to lowercase, replace spaces with hyphens, remove special characters\n const baseId = text\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .substring(0, 40); // Limit length\n\n // Ensure uniqueness by appending counter if needed\n let id = baseId;\n let attempt = 0;\n while (this.bookmarks.has(id) && attempt < 100) {\n id = `${baseId}-${++attempt}`;\n }\n\n return id;\n }\n\n /**\n * Check if a bookmark exists\n */\n exists(id: string): boolean {\n return this.bookmarks.has(id);\n }\n\n /**\n * Get bookmark info by ID\n */\n get(id: string): BookmarkInfo | undefined {\n return this.bookmarks.get(id);\n }\n\n /**\n * Get all registered bookmarks\n */\n getAll(): BookmarkInfo[] {\n return Array.from(this.bookmarks.values());\n }\n\n /**\n * Clear all bookmarks\n */\n clear(): void {\n this.bookmarks.clear();\n this.counter = 0;\n }\n\n /**\n * Validate that all internal hyperlink references exist\n * Returns array of missing bookmark IDs\n */\n validateReferences(referencedIds: string[]): string[] {\n const missing: string[] = [];\n for (const id of referencedIds) {\n if (!this.exists(id)) {\n missing.push(id);\n }\n }\n return missing;\n }\n}\n\n// Global registry instance\nexport const globalBookmarkRegistry = new BookmarkRegistry();\n","/**\n * Heading Component\n * Standard component for rendering heading elements in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isHeadingComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport {\n resolveHeadingProps,\n getHeadingDefaultsForLevel,\n} from '../styles/utils/componentDefaults';\nimport { createHeading } from '../core/content';\nimport { globalBookmarkRegistry } from '../utils/bookmarkRegistry';\n\n/**\n * Render heading component\n */\nexport function renderHeadingComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isHeadingComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveHeadingProps(component.props, theme);\n\n // Get level-specific theme defaults and merge them\n // Only apply level defaults if no explicit alignment was provided in the original props\n const level = resolvedConfig.level || 1;\n const levelDefaults = getHeadingDefaultsForLevel(theme, level);\n const finalConfig = {\n ...resolvedConfig,\n // Only apply level defaults if no explicit alignment was provided in the original props\n ...(component.props.alignment ? {} : levelDefaults),\n };\n\n // Generate or use bookmark ID for internal linking\n // If component has id, use it; otherwise generate from heading text\n const bookmarkId =\n (component as any).id ||\n globalBookmarkRegistry.generateId(finalConfig.text, 'heading');\n\n // Create heading with optional column break and bookmark\n const header = createHeading(\n finalConfig.text,\n finalConfig.level || 1,\n theme,\n themeName,\n {\n alignment: finalConfig.alignment,\n spacing: finalConfig.spacing,\n lineSpacing: finalConfig.lineSpacing,\n columnBreak: finalConfig.columnBreak,\n // Local font overrides\n fontFamily: finalConfig.font?.family,\n fontSize: finalConfig.font?.size,\n fontColor: finalConfig.font?.color,\n bold: finalConfig.font?.bold,\n italic: finalConfig.font?.italic,\n underline: finalConfig.font?.underline,\n // Pagination control\n keepNext: finalConfig.keepNext,\n keepLines: finalConfig.keepLines,\n // Bookmark ID for internal linking\n bookmarkId: bookmarkId,\n }\n );\n\n return [header];\n}\n","/**\n * Paragraph Component\n * Standard component for rendering paragraph content in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isParagraphComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveParagraphProps } from '../styles/utils/componentDefaults';\nimport { createText, createList } from '../core/content';\nimport {\n globalNumberingRegistry,\n createNumberingConfig,\n type NumberingConfig,\n type ListLevelConfig,\n} from '../utils/numberingConfig';\n\n/**\n * Parse markdown list syntax from paragraph text\n * Returns null if no list detected, or { type, items } if list found\n */\nfunction parseMarkdownList(text: string): {\n type: 'unordered' | 'ordered';\n items: { text: string; level: number }[];\n} | null {\n const lines = text.split('\\n');\n const items: { text: string; level: number }[] = [];\n let isUnordered: boolean | null = null;\n let isOrdered: boolean | null = null;\n\n for (const line of lines) {\n // Skip empty lines\n if (!line.trim()) continue;\n\n // Match unordered list: optional spaces + (- or *) + space + text\n const unorderedMatch = line.match(/^(\\s*)([-*])\\s+(.+)$/);\n if (unorderedMatch) {\n const indentLevel = Math.floor(unorderedMatch[1].length / 2); // 2 spaces = 1 level\n const text = unorderedMatch[3];\n items.push({ text, level: indentLevel });\n if (isUnordered === null) isUnordered = true;\n continue;\n }\n\n // Match ordered list: optional spaces + number + . + space + text\n const orderedMatch = line.match(/^(\\s*)(\\d+)\\.\\s+(.+)$/);\n if (orderedMatch) {\n const indentLevel = Math.floor(orderedMatch[1].length / 2); // 2 spaces = 1 level\n const text = orderedMatch[3];\n items.push({ text, level: indentLevel });\n if (isOrdered === null) isOrdered = true;\n continue;\n }\n\n // If we find a line that doesn't match list syntax, this isn't a list\n return null;\n }\n\n // If no items found, or mixed list types, not a valid list\n if (items.length === 0 || (isUnordered && isOrdered)) {\n return null;\n }\n\n return {\n type: isUnordered ? 'unordered' : 'ordered',\n items,\n };\n}\n\n/**\n * Render paragraph component\n */\nexport function renderParagraphComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isParagraphComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveParagraphProps(component.props, theme);\n\n // Check if text contains markdown list syntax\n const listData = parseMarkdownList(resolvedConfig.text);\n\n if (listData) {\n // Text is a markdown list - render as proper docx list\n const reference =\n globalNumberingRegistry.generateReference('markdown-list');\n\n // Create appropriate numbering configuration\n const levels: ListLevelConfig[] = [];\n\n if (listData.type === 'unordered') {\n // Bullet list with different bullets for each level\n levels.push(\n { level: 0, format: 'bullet', text: '•', alignment: 'left' },\n { level: 1, format: 'bullet', text: '◦', alignment: 'left' },\n { level: 2, format: 'bullet', text: '▪', alignment: 'left' }\n );\n } else {\n // Ordered list with decimal, lowercase letter, lowercase roman\n levels.push(\n { level: 0, format: 'decimal', text: '%1.', alignment: 'left' },\n { level: 1, format: 'lowerLetter', text: '%2.', alignment: 'left' },\n { level: 2, format: 'lowerRoman', text: '%3.', alignment: 'left' }\n );\n }\n\n const numberingConfig: NumberingConfig = {\n reference,\n levels,\n };\n\n globalNumberingRegistry.register(createNumberingConfig(numberingConfig));\n\n // Create list paragraphs\n return createList(listData.items, theme, themeName, {\n numberingReference: reference,\n spacing: resolvedConfig.spacing as\n | { before?: number; after?: number; item?: number }\n | undefined,\n alignment: resolvedConfig.alignment,\n });\n }\n\n // Not a list - render as regular text paragraph\n // Map themeStyle (theme logical name) to DOCX style id\n // Supports both predefined styles and custom styles from theme.styles\n const styleFromTheme = (() => {\n const key = resolvedConfig.themeStyle;\n if (!key) return undefined;\n\n const lowerKey = key.toLowerCase();\n\n // Map predefined style names to Word style IDs\n if (lowerKey === 'normal') return 'Normal';\n if (lowerKey === 'title') return 'Title';\n if (lowerKey === 'subtitle') return 'Subtitle';\n const headingMatch = lowerKey.match(/^heading([1-6])$/);\n if (headingMatch) {\n // For paragraph components, use display-only heading styles that are visually\n // identical but do NOT participate in TOC/outline levels\n return `JTD_HeadingText${headingMatch[1]}`;\n }\n\n // For custom styles, use the exact key as the style ID\n // Custom styles are registered in themeToDocxAdapter with their exact key as ID\n return key;\n })();\n\n // Extract outline level from style if present (for TOC support)\n const outlineLevel = (() => {\n const key = resolvedConfig.themeStyle;\n if (!key) return undefined;\n\n // Never contribute paragraph component paragraphs to TOC when using heading styles\n // Even if the theme sets outlineLevel for heading styles, ignore it here\n const lowerKey = key.toLowerCase();\n const headingMatch = lowerKey.match(/^heading([1-6])$/);\n if (headingMatch) return undefined;\n\n // Check if this is a custom style with outline level\n const customStyle = theme.styles?.[key as keyof typeof theme.styles];\n if (\n customStyle &&\n typeof customStyle === 'object' &&\n 'outlineLevel' in customStyle\n ) {\n return (customStyle as any).outlineLevel;\n }\n\n return undefined;\n })();\n\n // Create text paragraph with optional column break and floating positioning\n const text = createText(resolvedConfig.text, theme, themeName, {\n style: styleFromTheme,\n spacing: resolvedConfig.spacing as\n | { before?: number; after?: number }\n | undefined,\n lineSpacing: resolvedConfig.font?.lineSpacing,\n alignment: resolvedConfig.alignment,\n boldColor: resolvedConfig.boldColor,\n columnBreak: resolvedConfig.columnBreak,\n // Pass font properties\n fontFamily: resolvedConfig.font?.family,\n fontSize: resolvedConfig.font?.size,\n fontColor: resolvedConfig.font?.color,\n bold: resolvedConfig.font?.bold,\n italic: resolvedConfig.font?.italic,\n underline: resolvedConfig.font?.underline,\n // Pass outline level for TOC support\n outlineLevel: outlineLevel,\n // Pass floating positioning properties\n floating: resolvedConfig.floating,\n // Pass keepNext property\n keepNext: resolvedConfig.keepNext,\n // Pass keepLines property\n keepLines: resolvedConfig.keepLines,\n // Pass bookmark ID for internal linking\n bookmarkId: resolvedConfig.id,\n });\n\n return [text];\n}\n","/**\n * List Component\n * Standard component for rendering list elements in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isListComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveListProps } from '../styles/utils/componentDefaults';\nimport { createList } from '../core/content';\nimport {\n globalNumberingRegistry,\n createNumberingConfig,\n type NumberingConfig,\n type ListLevelConfig,\n} from '../utils/numberingConfig';\n\n/**\n * Convert simplified format to proper level configurations\n */\nfunction createLevelsFromSimplifiedProps(\n props: ReturnType<typeof resolveListProps>\n): ListLevelConfig[] {\n const levels: ListLevelConfig[] = [];\n\n // Determine format from simplified options\n let format: string;\n let text: string | undefined;\n\n if (props.format) {\n if (props.format === 'numbered') {\n format = 'decimal';\n text = '%1.';\n } else if (props.format === 'none') {\n format = 'none';\n text = '';\n } else {\n format = props.format;\n }\n } else {\n // Default to bullet\n format = 'bullet';\n text = props.bullet || '•';\n }\n\n // Create level 0 configuration\n const level0: ListLevelConfig = {\n level: 0,\n format,\n text,\n alignment: 'left',\n start: props.start,\n };\n\n // Add indent if specified\n if (props.indent) {\n if (typeof props.indent === 'number') {\n level0.indent = { left: props.indent };\n } else {\n level0.indent = props.indent;\n }\n }\n\n levels.push(level0);\n\n // Add default sublevels for nested lists\n if (format === 'bullet') {\n levels.push(\n { level: 1, format: 'bullet', text: '◦', alignment: 'left' },\n { level: 2, format: 'bullet', text: '▪', alignment: 'left' }\n );\n } else if (format === 'decimal') {\n levels.push(\n { level: 1, format: 'lowerLetter', text: '%2.', alignment: 'left' },\n { level: 2, format: 'lowerRoman', text: '%3.', alignment: 'left' }\n );\n }\n\n return levels;\n}\n\n/**\n * Get the maximum level used in list items\n */\nfunction getMaxLevelFromItems(\n items: (string | { text: string; level?: number })[] | undefined\n): number {\n if (!items || !Array.isArray(items)) {\n return 0;\n }\n\n let maxLevel = 0;\n for (const item of items) {\n if (typeof item === 'object' && item.level !== undefined) {\n maxLevel = Math.max(maxLevel, item.level);\n }\n }\n return maxLevel;\n}\n\n/**\n * Fill in missing levels with default configurations\n */\nfunction fillMissingLevels(\n levels: ListLevelConfig[],\n maxLevel: number\n): ListLevelConfig[] {\n // Create a map of existing levels\n const levelMap = new Map<number, ListLevelConfig>();\n for (const level of levels) {\n levelMap.set(level.level, level);\n }\n\n // Get level 0 to determine the base format\n const level0 = levelMap.get(0);\n const baseFormat = level0?.format || 'bullet';\n\n // Create default levels for any missing ones\n const result: ListLevelConfig[] = [];\n for (let i = 0; i <= maxLevel; i++) {\n if (levelMap.has(i)) {\n result.push(levelMap.get(i)!);\n } else {\n // Create default sublevel based on parent format\n if (baseFormat === 'bullet') {\n const bullets = ['•', '◦', '▪', '▫', '‣'];\n result.push({\n level: i,\n format: 'bullet',\n text: bullets[i % bullets.length],\n alignment: 'left',\n });\n } else if (baseFormat === 'decimal' || baseFormat === 'numbered') {\n const formats = ['decimal', 'lowerLetter', 'lowerRoman'];\n const format = formats[i % formats.length];\n result.push({\n level: i,\n format,\n text: `%${i + 1}.`,\n alignment: 'left',\n });\n } else {\n // For other formats, continue with the same format\n result.push({\n level: i,\n format: baseFormat,\n text: `%${i + 1}.`,\n alignment: 'left',\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Render list component\n */\nexport function renderListComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isListComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveListProps(component.props, theme);\n\n // Determine the maximum level needed from items\n const maxLevel = getMaxLevelFromItems(resolvedConfig.items);\n\n // Generate or use provided reference ID\n const reference =\n resolvedConfig.reference ||\n globalNumberingRegistry.generateReference('list');\n\n // Build numbering configuration if not already registered\n if (!globalNumberingRegistry.has(reference)) {\n let levels: ListLevelConfig[];\n\n if (resolvedConfig.levels && resolvedConfig.levels.length > 0) {\n // Use explicit level configurations, filling in missing levels\n levels = fillMissingLevels(\n resolvedConfig.levels as ListLevelConfig[],\n maxLevel\n );\n } else {\n // Build from simplified options\n const baseLevels = createLevelsFromSimplifiedProps(resolvedConfig);\n levels = fillMissingLevels(baseLevels, maxLevel);\n }\n\n const config: NumberingConfig = {\n reference,\n levels,\n };\n const numberingConfig = createNumberingConfig(config);\n globalNumberingRegistry.register(numberingConfig);\n }\n\n // Create the list paragraphs with numbering reference\n return createList(resolvedConfig.items, theme, themeName, {\n numberingReference: reference,\n spacing: resolvedConfig.spacing,\n alignment: resolvedConfig.alignment,\n });\n}\n","/**\n * Image Component\n * Standard component for rendering images in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isImageComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveImageProps } from '../styles/utils/componentDefaults';\nimport { createImage } from '../core/content';\n\n/**\n * Render image component\n */\nexport async function renderImageComponent(\n component: ComponentDefinition,\n theme: ThemeConfig\n): Promise<Paragraph[]> {\n if (!isImageComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveImageProps(component.props, theme);\n\n // Use base64 if provided, otherwise use path\n const imageSource = resolvedConfig.base64 || resolvedConfig.path;\n\n if (!imageSource) {\n throw new Error(\n 'Image component requires either \"path\" or \"base64\" property'\n );\n }\n\n return await createImage(imageSource, theme, {\n caption: resolvedConfig.caption,\n width: resolvedConfig.width,\n height: resolvedConfig.height,\n widthRelativeTo: (resolvedConfig as any).widthRelativeTo,\n heightRelativeTo: (resolvedConfig as any).heightRelativeTo,\n alignment: resolvedConfig.alignment,\n spacing: resolvedConfig.spacing,\n floating: resolvedConfig.floating,\n keepNext: resolvedConfig.keepNext,\n keepLines: resolvedConfig.keepLines,\n });\n}\n","/**\n * Text Box Component\n * Floating container that groups child paragraphs (from text/image components)\n */\n\nimport {\n Paragraph,\n Table,\n TableRow,\n TableCell,\n WidthType,\n TableAnchorType,\n RelativeHorizontalPosition,\n RelativeVerticalPosition,\n OverlapType,\n TableLayoutType,\n} from 'docx';\nimport {\n ComponentDefinition,\n TextBoxComponentDefinition,\n isTextBoxComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\n// No direct image or text parsing here; children components render themselves\nimport { renderComponent } from '../core/render';\nimport { NONE_BORDERS } from '../styles/utils/borderUtils';\nimport { buildCellOptions, CellStyleConfig } from '../styles/utils/cellUtils';\n\n// VML style helpers removed in favor of floating table approach\n\n// Map floating config to docx paragraph frame options to enforce wrapping at paragraph level\n\n// Map floating config to table float options for a one-cell table container\nfunction mapTableFloatOptions(\n floating?: NonNullable<TextBoxComponentDefinition['props']['floating']>\n): any | undefined {\n if (!floating) return undefined;\n\n const opt: any = {};\n\n const hp = floating.horizontalPosition;\n if (hp?.relative) {\n opt.horizontalAnchor =\n hp.relative === 'margin'\n ? TableAnchorType.MARGIN\n : hp.relative === 'page'\n ? TableAnchorType.PAGE\n : TableAnchorType.TEXT;\n }\n if (hp?.offset !== undefined) {\n opt.absoluteHorizontalPosition = hp.offset;\n } else if (hp?.align) {\n const map: Record<\n string,\n (typeof RelativeHorizontalPosition)[keyof typeof RelativeHorizontalPosition]\n > = {\n left: RelativeHorizontalPosition.LEFT,\n center: RelativeHorizontalPosition.CENTER,\n right: RelativeHorizontalPosition.RIGHT,\n inside: RelativeHorizontalPosition.INSIDE,\n outside: RelativeHorizontalPosition.OUTSIDE,\n };\n opt.relativeHorizontalPosition = map[hp.align];\n }\n\n const vp = floating.verticalPosition;\n if (vp?.relative) {\n opt.verticalAnchor =\n vp.relative === 'margin'\n ? TableAnchorType.MARGIN\n : vp.relative === 'page'\n ? TableAnchorType.PAGE\n : TableAnchorType.TEXT;\n }\n if (vp?.offset !== undefined) {\n opt.absoluteVerticalPosition = vp.offset;\n } else if (vp?.align) {\n const mapV: Record<\n string,\n (typeof RelativeVerticalPosition)[keyof typeof RelativeVerticalPosition]\n > = {\n top: RelativeVerticalPosition.TOP,\n center: RelativeVerticalPosition.CENTER,\n bottom: RelativeVerticalPosition.BOTTOM,\n inside: RelativeVerticalPosition.INSIDE,\n outside: RelativeVerticalPosition.OUTSIDE,\n } as any;\n opt.relativeVerticalPosition = mapV[vp.align];\n }\n\n // Map wrap margins to clearance distances\n const m = floating.wrap?.margins;\n if (m) {\n if (m.top !== undefined) opt.topFromText = m.top;\n if (m.right !== undefined) opt.rightFromText = m.right;\n if (m.bottom !== undefined) opt.bottomFromText = m.bottom;\n if (m.left !== undefined) opt.leftFromText = m.left;\n }\n\n opt.overlap = OverlapType.OVERLAP;\n\n return opt;\n}\n\nexport async function renderTextBoxComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n _context: import('../types').RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!isTextBoxComponent(component)) return [];\n const tb = component as TextBoxComponentDefinition;\n\n const isInline = !tb.props.floating;\n const childComponents = tb.children || [];\n\n if (isInline) {\n // Inline: use a one-cell table container for multi-paragraph support\n const cellChildren: (Paragraph | Table)[] = [];\n // Create context with current text-box as parent\n const childContext: import('../types').RenderContext = {\n ..._context,\n parent: tb,\n };\n for (const child of childComponents) {\n const rendered = await renderComponent(\n child,\n theme,\n themeName,\n childContext\n );\n cellChildren.push(...rendered);\n }\n\n const styleCfg = (tb.props as any).style as CellStyleConfig | undefined;\n const cellOpts = buildCellOptions(cellChildren, styleCfg, theme);\n\n const row = new TableRow({ children: [new TableCell(cellOpts)] });\n const table = new Table({\n layout: TableLayoutType.FIXED, // Lock column widths\n rows: [row],\n width: { size: 100, type: WidthType.PERCENTAGE },\n borders: NONE_BORDERS,\n });\n return [table];\n }\n\n // Always use a floating one-cell table container for multi-paragraph support\n\n // If there is at least one table or image child, use a floating one-cell table container\n const cellChildren: (Paragraph | Table)[] = [];\n // Create context with current text-box as parent\n const childContext: import('../types').RenderContext = {\n ..._context,\n parent: tb,\n };\n for (const child of childComponents) {\n const rendered = await renderComponent(\n child,\n theme,\n themeName,\n childContext\n );\n cellChildren.push(...rendered);\n }\n\n const styleCfg = (tb.props as any).style as CellStyleConfig | undefined;\n const cellOpts = buildCellOptions(cellChildren, styleCfg, theme);\n\n const row = new TableRow({\n children: [new TableCell(cellOpts)],\n });\n\n const float = mapTableFloatOptions(tb.props.floating);\n\n // Conversion factor: 1 pixel = 15 twips (at 96 DPI: 1440 twips/inch / 96 pixels/inch)\n const PIXELS_TO_TWIPS = 15;\n const DEFAULT_WIDTH_TWIPS = 5000; // ~333 pixels\n\n // Support width as number (pixels) or percentage string\n // Read from props.width (new location) with fallback to props.floating.width (legacy, in twips)\n const rawWidth = tb.props.width ?? (tb.props.floating as any)?.width;\n let widthSize: number;\n let widthType: (typeof WidthType)[keyof typeof WidthType];\n\n if (rawWidth === undefined) {\n // No width specified, use default\n widthSize = DEFAULT_WIDTH_TWIPS;\n widthType = WidthType.DXA;\n } else if (typeof rawWidth === 'string' && rawWidth.endsWith('%')) {\n // Percentage width\n widthSize = parseFloat(rawWidth);\n widthType = WidthType.PERCENTAGE;\n } else {\n // Number in pixels - convert to twips (DXA)\n widthSize =\n typeof rawWidth === 'number'\n ? rawWidth * PIXELS_TO_TWIPS\n : DEFAULT_WIDTH_TWIPS;\n widthType = WidthType.DXA;\n }\n\n const table = new Table({\n layout: TableLayoutType.FIXED, // Lock column widths\n rows: [row],\n width: { size: widthSize, type: widthType },\n float,\n borders: NONE_BORDERS,\n });\n return [table];\n}\n","/**\n * Border utilities for consistent border styling across modules\n */\n\nimport { BorderStyle } from 'docx';\nimport { resolveColor } from './colorUtils';\nimport { ThemeConfig } from '../index';\n\n/**\n * Standard \"no borders\" configuration for tables\n * Used when borders should be invisible/disabled\n */\nexport const NONE_BORDERS = {\n top: { style: BorderStyle.NONE, size: 0, color: '000000' },\n right: { style: BorderStyle.NONE, size: 0, color: '000000' },\n bottom: { style: BorderStyle.NONE, size: 0, color: '000000' },\n left: { style: BorderStyle.NONE, size: 0, color: '000000' },\n insideHorizontal: { style: BorderStyle.NONE, size: 0, color: '000000' },\n insideVertical: { style: BorderStyle.NONE, size: 0, color: '000000' },\n} as const;\n\n/**\n * Maps border style string to docx BorderStyle enum\n * @param s - Border style string ('dashed', 'dotted', 'double', 'none', 'single')\n * @returns Corresponding BorderStyle enum value\n */\nexport function mapBorderStyle(\n s?: string\n): (typeof BorderStyle)[keyof typeof BorderStyle] {\n switch (s) {\n case 'dashed':\n return BorderStyle.DASHED;\n case 'dotted':\n return BorderStyle.DOTTED;\n case 'double':\n return BorderStyle.DOUBLE;\n case 'none':\n return BorderStyle.NONE;\n default:\n return BorderStyle.SINGLE;\n }\n}\n\n/**\n * Border configuration object\n */\nexport interface BorderConfig {\n style?: string;\n width?: number;\n color?: string;\n}\n\n/**\n * Converts border configuration to docx border format\n * @param b - Border configuration object\n * @param theme - Theme configuration for color resolution\n * @returns Docx border object or undefined if no border\n */\nexport function convertBorder(\n b: BorderConfig | undefined,\n theme: ThemeConfig\n):\n | {\n style: (typeof BorderStyle)[keyof typeof BorderStyle];\n size: number;\n color: string;\n }\n | undefined {\n if (!b) return undefined;\n\n return {\n style: mapBorderStyle(b.style),\n size: b.width !== undefined ? Math.max(1, Math.round(b.width * 8)) : 1,\n color: b.color ? resolveColor(b.color, theme) : '000000',\n };\n}\n\n/**\n * Borders configuration for all four sides\n */\nexport interface BordersConfig {\n top?: BorderConfig;\n right?: BorderConfig;\n bottom?: BorderConfig;\n left?: BorderConfig;\n}\n\n/**\n * Converts borders configuration object to docx borders format\n * Returns undefined if no borders are defined\n * @param bordersConfig - Configuration for all four borders\n * @param theme - Theme configuration for color resolution\n * @returns Docx borders object or undefined\n */\nexport function convertBorders(\n bordersConfig: BordersConfig | undefined,\n theme: ThemeConfig\n):\n | Record<\n string,\n {\n style: (typeof BorderStyle)[keyof typeof BorderStyle];\n size: number;\n color: string;\n }\n >\n | undefined {\n if (!bordersConfig) return undefined;\n\n const borders: Record<\n string,\n {\n style: (typeof BorderStyle)[keyof typeof BorderStyle];\n size: number;\n color: string;\n }\n > = {};\n\n const top = convertBorder(bordersConfig.top, theme);\n const right = convertBorder(bordersConfig.right, theme);\n const bottom = convertBorder(bordersConfig.bottom, theme);\n const left = convertBorder(bordersConfig.left, theme);\n\n if (top) borders.top = top;\n if (right) borders.right = right;\n if (bottom) borders.bottom = bottom;\n if (left) borders.left = left;\n\n return Object.keys(borders).length > 0 ? borders : undefined;\n}\n","/**\n * Cell utilities for building table cell configurations\n */\n\nimport { Paragraph, Table } from 'docx';\nimport { pointsToTwips } from './styleHelpers';\nimport { resolveColor } from './colorUtils';\nimport { ThemeConfig } from '../index';\nimport { convertBorders, BordersConfig } from './borderUtils';\n\n/**\n * Padding configuration for all four sides\n */\nexport interface PaddingConfig {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\n/**\n * Shading configuration\n */\nexport interface ShadingConfig {\n fill?: string;\n}\n\n/**\n * Complete cell style configuration\n */\nexport interface CellStyleConfig {\n padding?: PaddingConfig;\n border?: BordersConfig;\n shading?: ShadingConfig;\n}\n\n/**\n * Builds cell options object for TableCell constructor\n * Handles margins (padding), shading, and borders consistently\n * @param children - Child elements to include in the cell\n * @param styleCfg - Style configuration for the cell\n * @param theme - Theme configuration for color resolution\n * @returns Cell options object ready for TableCell constructor\n */\nexport function buildCellOptions(\n children: (Paragraph | Table)[],\n styleCfg: CellStyleConfig | undefined,\n theme: ThemeConfig\n): {\n children: (Paragraph | Table)[];\n margins: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n shading?: { fill: string };\n borders?: Record<string, { style: any; size: number; color: string }>;\n} {\n const cellOpts: any = {\n children: children.length ? children : [new Paragraph({})],\n margins: {\n top: styleCfg?.padding?.top ? pointsToTwips(styleCfg.padding.top) : 0,\n right: styleCfg?.padding?.right\n ? pointsToTwips(styleCfg.padding.right)\n : 0,\n bottom: styleCfg?.padding?.bottom\n ? pointsToTwips(styleCfg.padding.bottom)\n : 0,\n left: styleCfg?.padding?.left ? pointsToTwips(styleCfg.padding.left) : 0,\n },\n };\n\n // Apply shading if configured\n if (styleCfg?.shading?.fill) {\n cellOpts.shading = { fill: resolveColor(styleCfg.shading.fill, theme) };\n }\n\n // Apply borders if configured\n if (styleCfg?.border) {\n const borders = convertBorders(styleCfg.border, theme);\n if (borders && Object.keys(borders).length > 0) {\n cellOpts.borders = borders;\n }\n }\n\n return cellOpts;\n}\n","/**\n * Table Component\n * Standard component for rendering tables in documents\n */\n\nimport { Table } from 'docx';\nimport { ComponentDefinition, isTableComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { createTable } from '../core/content';\n\ntype CellContent = string | ComponentDefinition;\n\ntype HorizontalAlignment = 'left' | 'center' | 'right' | 'justify';\n\ntype VerticalAlignment = 'top' | 'middle' | 'bottom';\n\ntype FontConfig = {\n family?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n};\n\ntype BorderColor =\n | string\n | {\n bottom?: string;\n top?: string;\n right?: string;\n left?: string;\n };\n\ntype BorderSize =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype Padding =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype CellDefaults = {\n color?: string;\n backgroundColor?: string;\n horizontalAlignment?: HorizontalAlignment;\n verticalAlignment?: VerticalAlignment;\n font?: FontConfig;\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n padding?: Padding;\n height?: number;\n};\n\ntype TableConfig = {\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n cellDefaults?: CellDefaults;\n headerCellDefaults?: CellDefaults;\n width?: number;\n columns: {\n width?: number;\n cellDefaults?: CellDefaults;\n header?: CellDefaults & {\n content?: CellContent;\n };\n cells?: (CellDefaults & {\n content?: CellContent;\n })[];\n }[];\n keepInOnePage?: boolean;\n keepNext?: boolean;\n repeatHeaderOnPageBreak?: boolean;\n};\n\n/**\n * Render table component\n * Supports new column-based format with cell defaults and legacy headers/rows format\n */\nexport async function renderTableComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Promise<Table[]> {\n if (!isTableComponent(component)) return [];\n\n const rawConfig = component.props as any;\n const result: Table[] = [];\n\n // Check if this is the old format (has headers and rows properties)\n if (rawConfig.headers && rawConfig.rows) {\n // Convert old format to new format\n const headers = rawConfig.headers as string[];\n const rows = rawConfig.rows as string[][];\n\n const defaultCellDefaults: CellDefaults = {\n color: '000000',\n backgroundColor: 'FFFFFF',\n horizontalAlignment: 'left',\n verticalAlignment: 'top',\n font: {\n family: 'Arial',\n size: 11,\n bold: false,\n italic: false,\n underline: false,\n },\n borderColor: '000000',\n borderSize: 1,\n };\n\n const config: TableConfig = {\n borderColor: '000000',\n borderSize: 1,\n cellDefaults: defaultCellDefaults,\n width: 100,\n columns: headers.map((header, colIndex) => ({\n cellDefaults: { ...defaultCellDefaults },\n header: {\n ...defaultCellDefaults,\n content: header,\n },\n cells: rows.map((row) => ({\n ...defaultCellDefaults,\n content: row[colIndex] || '',\n })),\n })),\n };\n\n result.push(await createTable(config.columns, config, theme, themeName));\n\n return result;\n }\n\n // New column-based format\n const config = rawConfig as TableConfig;\n\n result.push(await createTable(config.columns, config, theme, themeName));\n\n return result;\n}\n","/**\n * Section Component\n * Standard component for rendering document sections with child components\n */\n\nimport { Paragraph, Table, BookmarkStart, BookmarkEnd } from 'docx';\nimport {\n ComponentDefinition,\n RenderContext,\n isSectionComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { renderComponent } from '../core/render';\n\n/**\n * Generate unique bookmark ID for section scoping\n * Uses timestamp and random component for uniqueness without global state\n */\nfunction generateSectionBookmarkId(): { id: string; linkId: number } {\n const linkId = Math.floor(Math.random() * 1000000);\n return {\n id: `_Section_${linkId}_${Date.now()}`,\n linkId,\n };\n}\n\n/**\n * Render section component with bookmark support for scoped TOCs\n */\nexport async function renderSectionComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!isSectionComponent(component)) return [];\n\n const elements: (Paragraph | Table)[] = [];\n\n // Generate unique bookmark ID for this section\n const { id: sectionBookmarkId, linkId: bookmarkLinkId } =\n generateSectionBookmarkId();\n\n // Add bookmark in a zero-spacing paragraph at section start\n // This prevents visual gaps while maintaining bookmark functionality\n elements.push(\n new Paragraph({\n children: [new BookmarkStart(sectionBookmarkId, bookmarkLinkId)],\n spacing: {\n before: 0,\n after: 0,\n line: 0,\n },\n })\n );\n\n // Update context with section bookmark ID for child components (especially TOCs)\n const sectionContext: RenderContext = {\n ...context,\n section: {\n ...context.section,\n sectionBookmarkId,\n },\n };\n\n // Render child components with updated context\n if (component.children) {\n for (const child of component.children) {\n const childElements = await renderComponent(\n child,\n theme,\n themeName,\n sectionContext\n );\n elements.push(...childElements);\n }\n }\n\n // Add bookmark end after section content\n // Use zero spacing to prevent visual gap\n elements.push(\n new Paragraph({\n children: [new BookmarkEnd(bookmarkLinkId)],\n spacing: {\n before: 0,\n after: 0,\n line: 0,\n },\n })\n );\n\n return elements;\n}\n","/**\n * Columns Component\n * Standard component for rendering content in columns layout\n */\n\nimport {\n Paragraph,\n Table,\n TableRow,\n TableCell,\n WidthType,\n BorderStyle,\n VerticalAlign,\n TableLayoutType,\n} from 'docx';\nimport {\n ComponentDefinition,\n RenderContext,\n isColumnsComponent,\n isTextBoxComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveColumnsProps } from '../styles/utils/componentDefaults';\nimport { renderComponent } from '../core/render';\nimport {\n getAvailableWidthTwips,\n relativeLengthToTwips,\n} from '../utils/widthUtils';\nimport { NONE_BORDERS } from '../styles/utils/borderUtils';\n\n/**\n * Render columns component\n */\nexport async function renderColumnsComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!isColumnsComponent(component)) return [];\n\n // Check if parent is a text-box component\n if (context.parent && isTextBoxComponent(context.parent)) {\n // Render as table-based columns when inside a text-box\n return await renderColumnsAsTable(component, theme, themeName, context);\n }\n\n // Standard section-based rendering (existing behavior)\n // Resolve configuration with theme defaults\n // Note: resolvedConfig is available for future use if needed\n resolveColumnsProps(component.props, theme);\n\n const elements: (Paragraph | Table)[] = [];\n\n if (component.children) {\n for (const child of component.children) {\n const childElements = await renderComponent(\n child,\n theme,\n themeName,\n context\n );\n elements.push(...childElements);\n }\n }\n\n return elements;\n}\n\n/**\n * Render columns as a multi-column table (for use inside text-boxes)\n */\nasync function renderColumnsAsTable(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<Table[]> {\n const cfg = (component as any).props || {};\n const columns = cfg.columns || [];\n\n // Normalize columns configuration\n let columnConfigs: Array<{ width?: number | string; gap?: number | string }> =\n [];\n if (typeof columns === 'number') {\n // Equal-width columns\n columnConfigs = Array(columns).fill({ width: 'auto' });\n } else if (Array.isArray(columns)) {\n columnConfigs = columns;\n } else {\n // Invalid config, return empty\n return [];\n }\n\n const columnCount = columnConfigs.length;\n if (columnCount === 0) return [];\n\n // Calculate column widths\n const availableWidthTwips = getAvailableWidthTwips(theme, themeName);\n const columnWidths: number[] = [];\n const columnGaps: number[] = [];\n let totalDefinedWidth = 0;\n let totalGaps = 0;\n const autoWidthIndexes: number[] = [];\n\n for (let i = 0; i < columnCount; i++) {\n const col = columnConfigs[i];\n\n // Calculate width\n if (col.width === undefined || col.width === 'auto') {\n autoWidthIndexes.push(i);\n columnWidths.push(0); // Placeholder\n } else {\n const widthTwips = relativeLengthToTwips(col.width, availableWidthTwips);\n columnWidths.push(widthTwips);\n totalDefinedWidth += widthTwips;\n }\n\n // Calculate gap (space after this column)\n if (i < columnCount - 1) {\n const gapTwips =\n col.gap !== undefined\n ? relativeLengthToTwips(col.gap, availableWidthTwips)\n : cfg.gap !== undefined\n ? relativeLengthToTwips(cfg.gap, availableWidthTwips)\n : 720; // Default: 0.5 inch\n columnGaps.push(gapTwips);\n totalGaps += gapTwips;\n } else {\n columnGaps.push(0); // No gap after last column\n }\n }\n\n // Distribute remaining width among auto-width columns\n const remainingWidth = Math.max(\n 0,\n availableWidthTwips - totalDefinedWidth - totalGaps\n );\n if (autoWidthIndexes.length > 0) {\n const autoColumnWidth = Math.floor(\n remainingWidth / autoWidthIndexes.length\n );\n for (const idx of autoWidthIndexes) {\n columnWidths[idx] = autoColumnWidth;\n }\n }\n\n // Distribute child components across columns\n const childComponents = (component as any).children || [];\n const columnContents: ComponentDefinition[][] = Array(columnCount)\n .fill(null)\n .map(() => []);\n\n // Simple distribution: round-robin\n for (let i = 0; i < childComponents.length; i++) {\n const colIndex = i % columnCount;\n columnContents[colIndex].push(childComponents[i]);\n }\n\n // Render each column's content\n const cells: TableCell[] = [];\n for (let i = 0; i < columnCount; i++) {\n const columnElements: (Paragraph | Table)[] = [];\n\n for (const child of columnContents[i]) {\n const rendered = await renderComponent(child, theme, themeName, context);\n columnElements.push(...rendered);\n }\n\n // If column is empty, add empty paragraph\n if (columnElements.length === 0) {\n columnElements.push(new Paragraph({}));\n }\n\n cells.push(\n new TableCell({\n children: columnElements,\n width: { size: columnWidths[i], type: WidthType.DXA },\n margins: {\n top: 0,\n right: columnGaps[i] / 2,\n bottom: 0,\n left: i > 0 ? columnGaps[i - 1] / 2 : 0,\n },\n verticalAlign: VerticalAlign.TOP,\n borders: {\n top: { style: BorderStyle.NONE, size: 0, color: '000000' },\n right: { style: BorderStyle.NONE, size: 0, color: '000000' },\n bottom: { style: BorderStyle.NONE, size: 0, color: '000000' },\n left: { style: BorderStyle.NONE, size: 0, color: '000000' },\n },\n })\n );\n }\n\n const row = new TableRow({ children: cells });\n const table = new Table({\n rows: [row],\n width: { size: 100, type: WidthType.PERCENTAGE },\n layout: TableLayoutType.FIXED, // Lock column widths\n borders: NONE_BORDERS,\n });\n\n return [table];\n}\n","/**\n * Statistic Component\n * Standard component for rendering statistic displays in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isStatisticComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveStatisticProps } from '../styles/utils/componentDefaults';\nimport { createStatistic } from '../core/content';\n\n/**\n * Render statistic component\n */\nexport function renderStatisticComponent(\n component: ComponentDefinition,\n theme: ThemeConfig\n): Paragraph[] {\n if (!isStatisticComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveStatisticProps(component.props, theme);\n\n return createStatistic(\n {\n number: resolvedConfig.number,\n description: resolvedConfig.description,\n alignment: resolvedConfig.alignment,\n },\n {\n spacing: resolvedConfig.spacing as\n | { before?: number; after?: number }\n | undefined,\n }\n );\n}\n","/**\n * Header Component\n * Standard component for rendering header elements in documents\n */\n\nimport { Paragraph, TextRun } from 'docx';\nimport {\n ComponentDefinition,\n HeaderComponentDefinition,\n isHeaderComponent,\n} from '../types';\nimport { ThemeConfig, getBodyTextStyle } from '../styles';\nimport { getThemeColors } from '../themes/defaults';\nimport { getAlignment } from '../utils/alignmentUtils';\n\n/**\n * Render header component\n */\nexport function renderHeaderComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isHeaderComponent(component)) return [];\n\n const headerComp = component as HeaderComponentDefinition;\n const bodyStyle = getBodyTextStyle(theme, themeName);\n\n // Simple header implementation - just a text paragraph\n return [\n new Paragraph({\n children: [\n new TextRun({\n text: `[Header: ${headerComp.props.alignment || 'center'}]`,\n font: bodyStyle.font,\n size: bodyStyle.size,\n color: getThemeColors(theme).secondary,\n }),\n ],\n alignment: getAlignment(headerComp.props.alignment || 'center'),\n style: 'Normal',\n }),\n ];\n}\n","/**\n * Alignment Utilities\n * Shared utilities for converting alignment strings to docx AlignmentType\n */\n\nimport { AlignmentType } from 'docx';\n\n/**\n * Convert alignment string to docx AlignmentType\n */\nexport function getAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n","/**\n * Footer Component\n * Standard component for rendering footer elements in documents\n */\n\nimport { Paragraph, TextRun } from 'docx';\nimport {\n ComponentDefinition,\n FooterComponentDefinition,\n isFooterComponent,\n} from '../types';\nimport { ThemeConfig, getBodyTextStyle } from '../styles';\nimport { getThemeColors } from '../themes/defaults';\nimport { getAlignment } from '../utils/alignmentUtils';\n\n/**\n * Render footer component\n */\nexport function renderFooterComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isFooterComponent(component)) return [];\n\n const footerComp = component as FooterComponentDefinition;\n const bodyStyle = getBodyTextStyle(theme, themeName);\n\n // Simple footer implementation - just a text paragraph\n return [\n new Paragraph({\n children: [\n new TextRun({\n text: `[Footer: ${footerComp.props.alignment || 'center'}]`,\n font: bodyStyle.font,\n size: bodyStyle.size,\n color: getThemeColors(theme).secondary,\n }),\n ],\n alignment: getAlignment(footerComp.props.alignment || 'center'),\n style: 'Normal',\n }),\n ];\n}\n","/**\n * Table of Contents Component\n * Renders TOC using Word's native TableOfContents field with bookmark scoping support\n */\n\nimport {\n Paragraph,\n TableOfContents,\n AlignmentType,\n TextRun,\n StyleLevel,\n} from 'docx';\nimport type { ITableOfContentsOptions } from 'docx';\nimport type { TocProps } from '@json-to-office/shared-docx';\nimport type { ThemeConfig } from '../../styles';\nimport type { RenderContext } from '../../types';\n\nexport interface TocComponentDefinition {\n name: 'toc';\n id?: string;\n props: TocProps;\n}\n\n/**\n * Parse and validate a depth range configuration\n * @param rawDepth - Raw depth configuration from user input\n * @param fieldName - Name of the field (for error messages)\n * @param defaultFrom - Default 'from' value if not specified\n * @param defaultTo - Default 'to' value if not specified\n * @returns Validated depth range with from and to values\n */\nfunction parseDepthRange(\n rawDepth: any,\n fieldName: string,\n defaultFrom = 1,\n defaultTo = 3\n): { from: number; to: number } {\n if (typeof rawDepth !== 'object' || rawDepth === null) {\n throw new Error(\n `${fieldName} must be a range object with optional \"from\" and/or \"to\" fields, received: ${JSON.stringify(rawDepth)}`\n );\n }\n\n // Apply defaults for missing values\n const from = rawDepth.from ?? defaultFrom;\n const to = rawDepth.to ?? defaultTo;\n\n // Validate range\n if (from < 1 || from > 6 || to < 1 || to > 6) {\n throw new Error(\n `${fieldName} range values must be between 1 and 6, received: from=${from}, to=${to}`\n );\n }\n if (from > to) {\n throw new Error(\n `${fieldName} \"from\" must be less than or equal to \"to\", received: from=${from}, to=${to}`\n );\n }\n\n return { from, to };\n}\n\n/**\n * Render TOC component using Word's native TableOfContents field with bookmark scoping\n *\n * This creates a dynamic TOC that:\n * - Auto-populates with headings from configured scope\n * - Updates automatically when document structure changes\n * - Includes clickable hyperlinks to content\n * - Shows page numbers (if enabled)\n * - Respects configured depth limits\n *\n * Scope behavior:\n * - scope: 'document' → Scans entire document (default when TOC is at report level)\n * - scope: 'section' → Scans only parent section content (uses bookmark)\n * - scope: 'auto' → Automatically detects: section if inside section, otherwise document\n */\nexport function renderTocComponent(\n component: TocComponentDefinition,\n theme: ThemeConfig,\n context?: RenderContext\n): (Paragraph | TableOfContents)[] {\n const componentProps = component.props;\n\n // Parse depth parameter - supports range with optional from/to\n const rawDepth = componentProps.depth ?? { to: 3 };\n const depthRange = parseDepthRange(rawDepth, 'TOC depth', 1, 3);\n const depthStart = depthRange.from;\n const depthEnd = depthRange.to;\n\n // Parse pageNumbersDepth parameter - controls which levels show page numbers\n let pageNumbersStart: number | undefined;\n let pageNumbersEnd: number | undefined;\n\n if (componentProps.pageNumbersDepth !== undefined) {\n const pageNumbersRange = parseDepthRange(\n componentProps.pageNumbersDepth,\n 'TOC pageNumbersDepth',\n 1,\n 3\n );\n pageNumbersStart = pageNumbersRange.from;\n pageNumbersEnd = pageNumbersRange.to;\n }\n\n // Note: numberingStyle is not currently used by docx.js TableOfContents API\n // Future enhancement: implement custom numbering via post-processing or XmlComponent\n // const numberingStyle = componentProps.numberingStyle ?? 'numeric';\n const includePageNumbers = componentProps.includePageNumbers !== false; // default true\n const scope = componentProps.scope ?? 'auto';\n\n // Determine effective scope based on configuration and context\n const effectiveScope =\n scope === 'auto'\n ? context?.section?.sectionBookmarkId\n ? 'section'\n : 'document'\n : scope;\n\n // Get section bookmark ID if scoped to section\n const sectionBookmarkId =\n effectiveScope === 'section'\n ? context?.section?.sectionBookmarkId\n : undefined;\n\n // Validate bookmark if section-scoped\n if (effectiveScope === 'section' && !sectionBookmarkId) {\n // Log warning but gracefully fall back to document scope\n console.warn(\n 'TOC configured for section scope but no section bookmark found. Falling back to document scope.'\n );\n }\n\n const paragraphs: (Paragraph | TableOfContents)[] = [];\n\n // Add TOC title only if explicitly provided\n if (componentProps.title) {\n paragraphs.push(\n new Paragraph({\n children: [\n new TextRun({\n text: componentProps.title,\n bold: true,\n size: 28, // 14pt (size is in half-points)\n }),\n ],\n spacing: {\n before: theme.componentDefaults?.heading?.spacing?.before ?? 240,\n // Increase spacing between the title and the TOC list\n // 180 ~= 9pt, provides clearer separation by default\n after: 180,\n },\n alignment: AlignmentType.LEFT,\n })\n );\n }\n\n // Build style mappings for TOC levels based on depth\n // StyleLevel requires styleName (string) and level (number)\n const stylesWithLevels: StyleLevel[] = [];\n\n // For section-scoped TOCs, exclude heading levels equal to or above the section title level\n // This prevents the section title from appearing in its own TOC\n const sectionTitleLevel = context?.section?.sectionTitleLevel;\n const startLevel =\n effectiveScope === 'section' && sectionTitleLevel\n ? sectionTitleLevel // Start from the level after the section title\n : 0; // Document scope starts from level 1 (index 0)\n\n // Do NOT map built-in heading styles via \\t switch.\n // Use headingStyleRange (\\o) exclusively for Heading 1..6 to avoid any interference\n // between TOC styles and document heading styles.\n\n // Add custom style mappings if provided\n // These allow arbitrary theme styles to appear in the TOC at specified levels\n if (componentProps.styles && componentProps.styles.length > 0) {\n for (const styleMapping of componentProps.styles) {\n // The TOC \\t (stylesWithLevels) switch expects Word style DISPLAY NAMES, not IDs.\n // Our theme registers custom styles with:\n // - id: original key (e.g., \"MySpectacularStyle\")\n // - name: Title Case with spaces (e.g., \"My Spectacular Style\")\n // Convert known custom style IDs to their display names to ensure Word matches them.\n const styleId = styleMapping.styleId;\n const isCustomStyle =\n !!theme.styles &&\n Object.prototype.hasOwnProperty.call(theme.styles, styleId);\n const styleDisplayName = isCustomStyle\n ? styleId\n .replace(/([A-Z])/g, ' $1')\n .replace(/[-_]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n : styleId; // If it's not a custom style key, assume it's already a display name\n\n stylesWithLevels.push(\n new StyleLevel(styleDisplayName, styleMapping.level)\n );\n }\n }\n\n // Create Word TOC field with optional bookmark scoping\n // The TableOfContents class generates a field code that Word will populate\n // Format (document scope): { TOC \\o \"1-N\" \\h \\z \\u }\n // Format (section scope): { TOC \\b BookmarkName \\o \"1-N\" \\h \\z \\u }\n // - \\b BookmarkName: Limit TOC to entries within specified bookmark\n // - \\o \"1-N\": Include outline levels 1 through N\n // - \\h: Make TOC entries hyperlinks\n // - \\z: Hide page numbers in web layout\n // - \\u: Use outline levels instead of TC fields\n\n // Calculate heading range for \\o switch\n // For section-scoped TOCs: start AFTER section title level (e.g., level 2 if section is level 1)\n // For document-scoped TOCs: use depthStart and depthEnd from parsed depth config\n const effectiveDepthStart =\n effectiveScope === 'section' && sectionTitleLevel\n ? Math.max(depthStart, startLevel + 1) // Skip section title level, but respect user's depthStart\n : depthStart;\n const effectiveDepthEnd = depthEnd;\n\n // Build TOC options\n const tocOptions: ITableOfContentsOptions = {\n hyperlink: true, // Enable clickable hyperlinks (\\h switch)\n headingStyleRange: `${effectiveDepthStart}-${effectiveDepthEnd}`, // Outline level range (\\o switch)\n stylesWithLevels, // Style-to-TOC-level mappings (\\t switch)\n // Add bookmark scope if within a section (\\b switch)\n entriesFromBookmark: sectionBookmarkId,\n // Handle page number visibility\n // If pageNumbersDepth is specified, use it to control which levels show page numbers\n // Otherwise, respect includePageNumbers boolean (default true)\n ...(() => {\n if (pageNumbersStart !== undefined && pageNumbersEnd !== undefined) {\n // pageNumbersDepth specified: hide page numbers outside the specified range\n // Word's \\n switch omits page numbers for specified levels\n // We need to invert the logic: specify levels to OMIT, not levels to SHOW\n const levelsToOmit: string[] = [];\n\n // Omit levels before pageNumbersStart\n if (pageNumbersStart > effectiveDepthStart) {\n levelsToOmit.push(`${effectiveDepthStart}-${pageNumbersStart - 1}`);\n }\n\n // Omit levels after pageNumbersEnd\n if (pageNumbersEnd < effectiveDepthEnd) {\n levelsToOmit.push(`${pageNumbersEnd + 1}-${effectiveDepthEnd}`);\n }\n\n // Only add the option if there are levels to omit\n return levelsToOmit.length > 0\n ? { pageNumbersEntryLevelsRange: levelsToOmit.join(',') }\n : {};\n } else if (!includePageNumbers) {\n // includePageNumbers is false: omit page numbers for all levels\n return {\n pageNumbersEntryLevelsRange: `${effectiveDepthStart}-${effectiveDepthEnd}`,\n };\n } else {\n // includePageNumbers is true and no pageNumbersDepth: show page numbers for all levels\n return {};\n }\n })(),\n // Add separator between entry text and page number\n // Boolean: true = \"\\t\" (tab, default), false = \" \" (space)\n ...(componentProps.numberSeparator !== undefined\n ? {\n entryAndPageNumberSeparator: componentProps.numberSeparator\n ? '\\t'\n : ' ',\n }\n : { entryAndPageNumberSeparator: '\\t' }), // default to tab\n };\n\n // Insert TOC as a top-level block (not wrapped in a Paragraph).\n // Wrapping TableOfContents inside a Paragraph produces an empty SDT above\n // the actual entries in Word. Adding directly avoids that artifact.\n paragraphs.push(\n new TableOfContents(componentProps.title ?? 'Table of Contents', tocOptions)\n );\n\n // Do not append an extra empty paragraph after TOC to avoid\n // unwanted blank lines/newlines at the end of the TOC block.\n\n // Note: Word will automatically handle:\n // - Page number display (based on document view mode)\n // - Numbering style (inherited from heading styles)\n // - Indentation (based on heading levels)\n // - Updates (right-click TOC → Update Field in Word)\n\n return paragraphs;\n}\n","/**\n * Environment detection utilities\n */\n\n/**\n * Check if the current environment is Node.js\n * This is used to conditionally load Node.js-only modules\n */\nexport function isNodeEnvironment(): boolean {\n // Check for Node.js-specific globals\n return (\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null &&\n typeof process.versions.node === 'string'\n );\n}\n\n/**\n * Check if Node.js built-in modules are available\n * More specific check for modules that require Node.js built-ins\n */\nexport function hasNodeBuiltins(): boolean {\n try {\n // Check if we can access Node.js built-in modules\n // This will fail in browser environments\n return (\n typeof require !== 'undefined' ||\n (typeof process !== 'undefined' &&\n typeof process.versions === 'object' &&\n typeof process.versions.node === 'string')\n );\n } catch {\n return false;\n }\n}\n","/**\n * Highcharts Component\n * Standard component for generating charts using Highcharts Export Server\n */\n\nimport { Paragraph, Table } from 'docx';\nimport { ComponentDefinition, isHighchartsComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { createImage } from '../core/content';\nimport { isNodeEnvironment } from '../utils/environment';\n\n// Import only the types we actually use from shared package\nimport type { HighchartsProps } from '@json-to-office/shared-docx';\n\n// Re-export HighchartsProps for backward compatibility\nexport type { HighchartsProps } from '@json-to-office/shared-docx';\n\n/**\n * Chart generation result\n */\nexport interface ChartGenerationResult {\n base64DataUri: string;\n width: number;\n height: number;\n}\n\nconst DEFAULT_EXPORT_SERVER_URL = 'http://localhost:7801';\n\nfunction getExportServerUrl(propsUrl?: string): string {\n return propsUrl || process.env.HIGHCHARTS_SERVER_URL || DEFAULT_EXPORT_SERVER_URL;\n}\n\n/**\n * Generate chart using Highcharts Export Server\n */\nasync function generateChart(\n config: HighchartsProps\n): Promise<ChartGenerationResult> {\n // Only run in Node.js environments\n if (!isNodeEnvironment()) {\n throw new Error(\n 'Highcharts export server requires a Node.js environment. ' +\n 'Chart generation is not available in browser environments.'\n );\n }\n\n const serverUrl = getExportServerUrl(config.serverUrl);\n\n const requestBody: Record<string, unknown> = {\n infile: config.options,\n type: 'png',\n b64: true,\n scale: config.scale,\n };\n\n const response = await fetch(`${serverUrl}/export`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n }).catch((error) => {\n throw new Error(\n `Highcharts Export Server is not running at ${serverUrl}. ` +\n 'Start it with: npx highcharts-export-server --enableServer true\\n' +\n `Cause: ${error instanceof Error ? error.message : String(error)}`\n );\n });\n\n if (!response.ok) {\n throw new Error(\n `Highcharts export server returned ${response.status}: ${response.statusText}`\n );\n }\n\n const base64Data = await response.text();\n const base64DataUri = `data:image/png;base64,${base64Data}`;\n const width = config.options.chart.width;\n const height = config.options.chart.height;\n\n return {\n base64DataUri,\n width,\n height,\n };\n}\n\n/**\n * Render highcharts component\n */\nexport async function renderHighchartsComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n _themeName: string\n): Promise<(Paragraph | Table)[]> {\n if (!isHighchartsComponent(component)) return [];\n\n const config = component.props as HighchartsProps;\n\n // Generate the chart\n const chartResult = await generateChart(config);\n\n // If either config.width or config.height is provided, use config dimensions only\n // Otherwise fall back to chart dimensions\n const hasConfigDimensions =\n config.width !== undefined || config.height !== undefined;\n const renderWidth = hasConfigDimensions ? config.width : chartResult.width;\n const renderHeight = hasConfigDimensions\n ? config.height\n : chartResult.height;\n\n // Add chart image using the image component with base64 data URI\n const imageParagraphs = await createImage(\n chartResult.base64DataUri,\n theme,\n {\n width: renderWidth,\n height: renderHeight,\n alignment: 'center',\n }\n );\n\n return imageParagraphs;\n}\n","/**\n * Text Space After Custom Component\n * A text component with hardcoded spacing after the paragraph\n *\n * This component is provided as an example of the legacy custom component system.\n * For new custom components, use the plugin system instead:\n * @see packages/core/src/plugin/example/ for modern examples\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { createComponent, createVersion } from '../plugin/createComponent';\nimport type { ComponentDefinition } from '@json-to-office/shared-docx';\n\n/**\n * Props schema for text-space-after component\n */\nconst TextSpaceAfterPropsSchema = Type.Object({\n text: Type.String({\n description: 'Text content to display',\n }),\n // Retained for backwards compatibility of props shape, but not applied\n spacing: Type.Optional(\n Type.Object({\n before: Type.Optional(Type.Number()),\n after: Type.Optional(Type.Number()),\n })\n ),\n});\n\nexport type TextSpaceAfterProps = Static<typeof TextSpaceAfterPropsSchema>;\n\n/**\n * Text space after component - adds hardcoded spacing after paragraphs\n */\nexport const textSpaceAfterComponent = createComponent({\n name: 'text-space-after',\n versions: {\n '1.0.0': createVersion({\n propsSchema: TextSpaceAfterPropsSchema,\n description: 'Text component with hardcoded spacing after the paragraph',\n render: async ({ props }) => {\n // Create paragraph component with hardcoded spacing after\n const result: ComponentDefinition = {\n name: 'paragraph',\n props: {\n text: props.text,\n spacing: {\n ...props.spacing,\n after: props.spacing?.after || 12,\n },\n },\n };\n\n return [result];\n },\n }),\n },\n});\n","import { type TSchema, type Static } from '@sinclair/typebox';\nimport { isValidSemver } from '@json-to-office/shared';\nimport type { ComponentDefinition } from '@json-to-office/shared-docx';\nimport type { AddWarningFunction } from '@json-to-office/shared-docx';\nimport type { ThemeConfig } from '../styles';\n\n/**\n * Render function context - parameters passed to render\n */\nexport interface RenderContext<T> {\n /** The validated props for this component */\n props: T;\n /** The resolved theme configuration */\n theme: ThemeConfig;\n /** Function to add warnings during processing */\n addWarning: AddWarningFunction;\n /** For container components: processed nested children */\n children?: unknown[];\n}\n\n/**\n * Render function that transforms custom component props into standard components.\n */\nexport type RenderFunction<\n TProps,\n TComponentDefinition = ComponentDefinition,\n> = (context: RenderContext<TProps>) => Promise<TComponentDefinition[]>;\n\n/**\n * A single version entry within a versioned component.\n * Each version is self-contained with its own schema, render, and metadata.\n */\nexport interface ComponentVersion<\n TComponentDefinition = ComponentDefinition,\n TPropsSchema extends TSchema = TSchema,\n> {\n /** TypeBox schema for props validation */\n propsSchema: TPropsSchema;\n /** Async render function to transform props into standard components */\n render: RenderFunction<Static<TPropsSchema>, TComponentDefinition>;\n /** Whether this version supports nested children */\n hasChildren?: boolean;\n /** Optional description for this version */\n description?: string;\n}\n\n/**\n * Map of semver version strings to their version definitions.\n */\nexport type ComponentVersionMap<TComponentDefinition = ComponentDefinition> =\n Record<string, ComponentVersion<TComponentDefinition, any>>;\n\n/**\n * Custom component definition with multiple semver-keyed versions.\n * Each version is self-contained with its own schema + render.\n *\n * @typeParam TComponentDefinition - The component definition type for render return\n * @typeParam TVersions - The versions map type\n * @typeParam TName - The literal string type for the component name\n */\nexport interface CustomComponent<\n TComponentDefinition = ComponentDefinition,\n TVersions extends\n ComponentVersionMap<TComponentDefinition> = ComponentVersionMap<TComponentDefinition>,\n TName extends string = string,\n> {\n /** Unique name for the component type */\n name: TName;\n /** Map of semver version strings to version definitions */\n versions: TVersions;\n}\n\n/**\n * Create a single version entry with full type inference for props.\n *\n * Wrapping each version with `createVersion` lets TypeScript infer the\n * props type from `propsSchema` and propagate it to the `render` function,\n * so `props` is fully typed instead of `any`.\n *\n * @example\n * ```typescript\n * createVersion({\n * propsSchema: Type.Object({ city: Type.String() }),\n * render: async ({ props }) => {\n * // props.city is inferred as string\n * return [{ name: 'paragraph', props: { text: props.city } }];\n * },\n * })\n * ```\n */\nexport function createVersion<\n TPropsSchema extends TSchema,\n TComponentDefinition = ComponentDefinition,\n>(\n version: ComponentVersion<TComponentDefinition, TPropsSchema>\n): ComponentVersion<TComponentDefinition, TPropsSchema> {\n return version;\n}\n\n/**\n * Create a custom component with multiple semver-keyed versions.\n *\n * Use {@link createVersion} for each version entry to get full type inference\n * for `props` in render functions.\n *\n * @example Basic single-version usage\n * ```typescript\n * const weatherComponent = createComponent({\n * name: 'weather' as const,\n * versions: {\n * '1.0.0': createVersion({\n * propsSchema: Type.Object({ city: Type.String() }),\n * render: async ({ props }) => [{\n * name: 'paragraph',\n * props: { text: `Weather in ${props.city}` }\n * }]\n * })\n * }\n * });\n * ```\n *\n * @example Multi-version with breaking changes\n * ```typescript\n * const weatherComponent = createComponent({\n * name: 'weather' as const,\n * versions: {\n * '1.0.0': createVersion({\n * propsSchema: WeatherV1PropsSchema,\n * render: async ({ props }) => [...],\n * }),\n * '2.0.0': createVersion({\n * propsSchema: WeatherV2PropsSchema,\n * render: async ({ props }) => [...],\n * }),\n * },\n * });\n * ```\n */\nexport function createComponent<\n TComponentDefinition = ComponentDefinition,\n TVersions extends\n ComponentVersionMap<TComponentDefinition> = ComponentVersionMap<TComponentDefinition>,\n TName extends string = string,\n>(\n component: CustomComponent<TComponentDefinition, TVersions, TName>\n): CustomComponent<TComponentDefinition, TVersions, TName> {\n if (!component.name) {\n throw new Error('Component name is required');\n }\n\n if (!component.versions || typeof component.versions !== 'object') {\n throw new Error(`Component \"${component.name}\" requires a versions map`);\n }\n\n const versionKeys = Object.keys(component.versions);\n if (versionKeys.length === 0) {\n throw new Error(\n `Component \"${component.name}\" must have at least one version`\n );\n }\n\n for (const key of versionKeys) {\n if (!isValidSemver(key)) {\n throw new Error(\n `Component \"${component.name}\": invalid semver key \"${key}\". Expected format: major.minor.patch`\n );\n }\n const entry = component.versions[key];\n if (!entry.propsSchema) {\n throw new Error(\n `Component \"${component.name}\" version \"${key}\" requires a propsSchema`\n );\n }\n if (!entry.render || typeof entry.render !== 'function') {\n throw new Error(\n `Component \"${component.name}\" version \"${key}\" requires a render function`\n );\n }\n }\n\n return component;\n}\n","/**\n * JSON Document Parser - Re-exports from shared package\n *\n * This module re-exports the JSON parsing functionality from the shared package\n * and provide a clean interface for the core package.\n */\n\n// Re-export everything from shared package's JSON parser\nexport {\n JsonDocumentParser,\n JsonParsingError,\n JsonValidationError,\n parseJsonComponent,\n validateJsonComponent,\n parseJsonWithLineNumbers,\n} from '@json-to-office/shared-docx';\n\n// Re-export types needed by other modules\nexport type {\n DocumentValidationResult,\n DocumentValidationError,\n} from '@json-to-office/shared-docx';\n","/**\n * Component Normalizer - Transforms JSON components where business logic requires it\n *\n * This module ONLY handles transformations that are actually necessary:\n * 1. Columns shorthand notation (columns: 3 → array format)\n * 2. Recursive processing of nested components\n * 3. Gap application for columns\n *\n * All other properties are preserved as-is from TypeBox validation.\n * This prevents information loss and maintains single source of truth.\n */\n\nimport {\n ComponentDefinition,\n ReportComponentDefinition,\n SectionComponentDefinition,\n ColumnsComponentDefinition,\n ColumnsProps,\n} from '../types';\n\n/**\n * Normalize a component definition and its nested children\n * Preserves all validated properties - only transforms where business logic requires\n */\nexport function normalizeComponent(\n component: ComponentDefinition\n): ComponentDefinition {\n // Handle columns component with shorthand notation\n if (component.name === 'columns') {\n return normalizeColumnsComponent(component as ColumnsComponentDefinition);\n }\n\n // Handle components with children - recursively normalize\n if ('children' in component && component.children) {\n return {\n ...component, // Preserve ALL properties from validated component\n children: component.children.map(normalizeComponent),\n } as ComponentDefinition;\n }\n\n // Handle section component with header/footer arrays\n if (component.name === 'section') {\n return normalizeSectionComponent(component as SectionComponentDefinition);\n }\n\n // All other components: return as-is (already validated by TypeBox)\n return component;\n}\n\n/**\n * Normalize columns component\n * Converts shorthand notation and applies gap logic\n */\nfunction normalizeColumnsComponent(\n component: ColumnsComponentDefinition\n): ColumnsComponentDefinition {\n const cfg = component.props || ({} as any);\n\n // Helper: apply top-level gap to all columns except last where not overridden\n const applyTopLevelGap = (\n cols: Array<{ width?: unknown; gap?: unknown }>,\n topGap: unknown\n ) =>\n cols.map((c, i) => {\n const isLast = i === cols.length - 1;\n if (!isLast && c.gap === undefined && topGap !== undefined) {\n return { ...c, gap: topGap };\n }\n return c;\n });\n\n // Helper: normalize 'auto' to unspecified width (internal layout splits remainder)\n const normalizeAutoWidth = (\n cols: Array<{ width?: unknown; gap?: unknown }>\n ) =>\n cols.map((c) => ({\n ...c,\n width: c.width === 'auto' ? undefined : c.width,\n }));\n\n let columnsArray: Array<{ width?: unknown; gap?: unknown }>;\n\n if (typeof cfg.columns === 'number' && cfg.columns > 0) {\n // Shorthand: N equal-width columns; apply gap after each except last\n const n = cfg.columns as number;\n const base = Array.from(\n { length: n },\n () => ({}) as { width?: unknown; gap?: unknown }\n );\n const topLevelGap = cfg.gap !== undefined ? cfg.gap : '5%';\n columnsArray = applyTopLevelGap(base, topLevelGap);\n } else if (Array.isArray(cfg.columns)) {\n // Array form; honor per-column config\n columnsArray = cfg.columns as Array<{ width?: unknown; gap?: unknown }>;\n // Apply top-level gap unless column overrides; skip last column\n const topLevelGap = cfg.gap !== undefined ? cfg.gap : '5%';\n columnsArray = applyTopLevelGap(columnsArray, topLevelGap);\n // Normalize 'auto' widths to unspecified so layout can allocate remainder\n columnsArray = normalizeAutoWidth(columnsArray);\n } else {\n // Minimal valid shape\n columnsArray = [{}];\n }\n\n const normalizedProps: ColumnsProps = {\n columns: columnsArray,\n } as ColumnsProps;\n\n return {\n ...component, // Preserve any additional properties\n name: 'columns',\n props: normalizedProps,\n children: component.children\n ? component.children.map(normalizeComponent)\n : undefined,\n };\n}\n\n/**\n * Normalize section component\n * Handles recursive processing of header/footer component arrays\n */\nfunction normalizeSectionComponent(\n component: SectionComponentDefinition\n): SectionComponentDefinition {\n const props = component.props || ({} as any);\n\n return {\n ...component, // Preserve ALL properties\n props: {\n ...props, // Preserve ALL props properties\n header: props.header\n ? props.header === 'linkToPrevious'\n ? 'linkToPrevious'\n : props.header.map((m: ComponentDefinition) => normalizeComponent(m))\n : undefined,\n footer: props.footer\n ? props.footer === 'linkToPrevious'\n ? 'linkToPrevious'\n : props.footer.map((m: ComponentDefinition) => normalizeComponent(m))\n : undefined,\n },\n children: component.children\n ? component.children.map(normalizeComponent)\n : undefined,\n };\n}\n\n/**\n * Normalize entire document (top-level report component)\n * Returns as single-element tuple for backward compatibility\n */\nexport function normalizeDocument(\n document: ComponentDefinition | ReportComponentDefinition\n): [ReportComponentDefinition] {\n // Validate it's a report component\n if (document.name !== 'docx') {\n throw new Error(\n 'Top-level document must be a docx component with name=\"docx\"'\n );\n }\n\n const normalized = normalizeComponent(document) as ReportComponentDefinition;\n return [normalized];\n}\n\n/**\n * Validate component structure (container vs content components)\n */\nexport function validateComponentStructure(component: any): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n // Components that can have children\n const containerComponents = ['docx', 'section', 'columns', 'text-box'];\n\n // Check if content components have children (they shouldn't)\n if (\n !containerComponents.includes(component.name) &&\n component.children &&\n component.children.length > 0\n ) {\n errors.push(\n `Component name \"${component.name}\" cannot have child components`\n );\n }\n\n // Recursively validate child components\n if (component.children) {\n component.children.forEach(\n (childComponent: ComponentDefinition, index: number) => {\n const childResult = validateComponentStructure(childComponent);\n if (!childResult.valid) {\n errors.push(\n ...childResult.errors.map(\n (error) => `Component[${index}]: ${error}`\n )\n );\n }\n }\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import { promises as fs } from 'fs';\nimport { join, resolve, isAbsolute } from 'path';\nimport { watch, FSWatcher } from 'fs';\nimport { ComponentDefinition } from '@json-to-office/shared-docx';\nimport { parseJsonWithLineNumbers } from './parser';\n\n/**\n * File System utilities for JSON report definitions\n */\n\n/**\n * Load JSON report definition from file\n * Supports both relative and absolute file paths\n */\nexport async function loadJsonDefinition(\n filePath: string\n): Promise<ComponentDefinition> {\n try {\n // Resolve path (handles both relative and absolute paths)\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n\n // Check if file exists\n await fs.access(absolutePath);\n\n // Read file content\n const fileContent = await fs.readFile(absolutePath, 'utf-8');\n\n // Parse JSON with line number tracking for better errors\n return parseJsonWithLineNumbers(fileContent) as ComponentDefinition;\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'ENOENT':\n throw new JsonFileError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND'\n );\n case 'EACCES':\n throw new JsonFileError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED'\n );\n case 'EISDIR':\n throw new JsonFileError(\n `Path is a directory: ${filePath}`,\n 'IS_DIRECTORY'\n );\n default:\n throw new JsonFileError(\n `File system error: ${fsError.message}`,\n 'FS_ERROR'\n );\n }\n }\n\n // Re-throw parsing errors with file context\n if (error instanceof Error) {\n throw new JsonFileError(\n `Error loading ${filePath}: ${error.message}`,\n 'PARSE_ERROR',\n error\n );\n }\n\n throw new JsonFileError(\n `Unknown error loading ${filePath}`,\n 'UNKNOWN_ERROR'\n );\n }\n}\n\n/**\n * Load JSON definition with validation but without throwing on validation errors\n */\nexport async function loadJsonDefinitionSafe(filePath: string): Promise<{\n success: boolean;\n definition?: ComponentDefinition;\n error?: JsonFileError;\n}> {\n try {\n const definition = await loadJsonDefinition(filePath);\n return { success: true, definition };\n } catch (error) {\n return {\n success: false,\n error:\n error instanceof JsonFileError\n ? error\n : new JsonFileError(\n error instanceof Error ? error.message : String(error),\n 'UNKNOWN_ERROR'\n ),\n };\n }\n}\n\n/**\n * Watch JSON file for changes and call callback on modifications\n * Useful for development workflows\n */\nexport function watchJsonFile(\n filePath: string,\n callback: (\n _definition: ComponentDefinition | null,\n _error?: JsonFileError\n ) => void\n): JsonFileWatcher {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n\n // Initial load\n loadJsonDefinitionSafe(absolutePath).then((result) => {\n if (result.success) {\n callback(result.definition!);\n } else {\n callback(null, result.error);\n }\n });\n\n // Set up file watcher\n const watcher = watch(absolutePath, { persistent: true }, (eventType) => {\n if (eventType === 'change') {\n // Debounce rapid file changes\n setTimeout(async () => {\n const result = await loadJsonDefinitionSafe(absolutePath);\n if (result.success) {\n callback(result.definition!);\n } else {\n callback(null, result.error);\n }\n }, 100);\n }\n });\n\n return new JsonFileWatcher(watcher, absolutePath);\n}\n\n/**\n * Watch multiple JSON files and call callback when any changes\n */\nexport function watchJsonFiles(\n filePaths: string[],\n callback: (\n _filePath: string,\n _definition: ComponentDefinition | null,\n _error?: JsonFileError\n ) => void\n): JsonFileWatcher[] {\n return filePaths.map((filePath) => {\n return watchJsonFile(filePath, (definition, error) => {\n callback(filePath, definition, error);\n });\n });\n}\n\n/**\n * Check if file exists and is accessible\n */\nexport async function checkJsonFile(filePath: string): Promise<{\n exists: boolean;\n readable: boolean;\n isDirectory: boolean;\n error?: string;\n}> {\n try {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n const stats = await fs.stat(absolutePath);\n\n return {\n exists: true,\n readable: true,\n isDirectory: stats.isDirectory(),\n };\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'ENOENT':\n return {\n exists: false,\n readable: false,\n isDirectory: false,\n error: 'File not found',\n };\n case 'EACCES':\n return {\n exists: true,\n readable: false,\n isDirectory: false,\n error: 'Permission denied',\n };\n default:\n return {\n exists: false,\n readable: false,\n isDirectory: false,\n error: fsError.message,\n };\n }\n }\n\n return {\n exists: false,\n readable: false,\n isDirectory: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Find JSON files in a directory (non-recursive)\n */\nexport async function findJsonFiles(directoryPath: string): Promise<string[]> {\n try {\n const absolutePath = isAbsolute(directoryPath)\n ? directoryPath\n : resolve(directoryPath);\n const entries = await fs.readdir(absolutePath, { withFileTypes: true });\n\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))\n .map((entry) => join(absolutePath, entry.name));\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'ENOENT':\n throw new JsonFileError(\n `Directory not found: ${directoryPath}`,\n 'DIRECTORY_NOT_FOUND'\n );\n case 'ENOTDIR':\n throw new JsonFileError(\n `Path is not a directory: ${directoryPath}`,\n 'NOT_DIRECTORY'\n );\n case 'EACCES':\n throw new JsonFileError(\n `Permission denied: ${directoryPath}`,\n 'PERMISSION_DENIED'\n );\n default:\n throw new JsonFileError(\n `Directory error: ${fsError.message}`,\n 'DIRECTORY_ERROR'\n );\n }\n }\n\n throw new JsonFileError(\n `Unknown error reading directory ${directoryPath}`,\n 'UNKNOWN_ERROR'\n );\n }\n}\n\n/**\n * Save JSON report definition to file\n */\nexport async function saveJsonDefinition(\n definition: ComponentDefinition,\n filePath: string,\n options: { pretty?: boolean; backup?: boolean } = {}\n): Promise<void> {\n const { pretty = true, backup = false } = options;\n\n try {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n\n // Create backup if requested\n if (backup) {\n try {\n const backupPath = `${absolutePath}.backup`;\n await fs.copyFile(absolutePath, backupPath);\n } catch (error) {\n // Ignore backup errors if original file doesn't exist\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as Error & { code?: string }).code !== 'ENOENT'\n ) {\n console.warn(`Failed to create backup: ${error.message}`);\n }\n }\n }\n\n // Serialize JSON\n const jsonContent = pretty\n ? JSON.stringify(definition, null, 2)\n : JSON.stringify(definition);\n\n // Write file\n await fs.writeFile(absolutePath, jsonContent, 'utf-8');\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'EACCES':\n throw new JsonFileError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED'\n );\n case 'ENOSPC':\n throw new JsonFileError(\n `No space left on device: ${filePath}`,\n 'NO_SPACE'\n );\n default:\n throw new JsonFileError(\n `Write error: ${fsError.message}`,\n 'WRITE_ERROR'\n );\n }\n }\n\n throw new JsonFileError(\n `Unknown error saving ${filePath}`,\n 'UNKNOWN_ERROR'\n );\n }\n}\n\n/**\n * File watcher wrapper class\n */\nexport class JsonFileWatcher {\n private watcher: FSWatcher;\n private filePath: string;\n\n constructor(watcher: FSWatcher, filePath: string) {\n this.watcher = watcher;\n this.filePath = filePath;\n }\n\n /**\n * Stop watching the file\n */\n public close(): void {\n this.watcher.close();\n }\n\n /**\n * Get the watched file path\n */\n public getFilePath(): string {\n return this.filePath;\n }\n}\n\n/**\n * Custom error class for file system operations\n */\nexport class JsonFileError extends Error {\n public readonly code: string;\n public readonly originalError?: Error;\n\n constructor(message: string, code: string, originalError?: Error) {\n super(message);\n this.name = 'JsonFileError';\n this.code = code;\n this.originalError = originalError;\n }\n}\n\n/**\n * Utility function to validate JSON file extension\n */\nexport function hasJsonExtension(filePath: string): boolean {\n return filePath.toLowerCase().endsWith('.json');\n}\n\n/**\n * Utility to ensure a path has .json extension\n */\nexport function ensureJsonExtension(filePath: string): string {\n return hasJsonExtension(filePath) ? filePath : `${filePath}.json`;\n}\n","/**\n * Warnings Document Generator\n * Utility to generate a document from generation warnings\n */\n\nimport type { GenerationWarning } from '@json-to-office/shared-docx';\nimport type { ComponentDefinition, ReportComponentDefinition } from '../types';\n\n/**\n * Generate a report document from warnings\n * Returns null if there are no warnings\n */\nexport function generateWarningsDocument(\n warnings: GenerationWarning[] | null\n): ReportComponentDefinition | null {\n if (!warnings || warnings.length === 0) {\n return null;\n }\n\n const children: ComponentDefinition[] = [\n {\n name: 'heading',\n props: {\n level: 1,\n text: 'Document Generation Warnings',\n },\n },\n {\n name: 'paragraph',\n props: {\n text: `${warnings.length} warning(s) were generated during document processing.`,\n spacing: {\n after: 24,\n },\n },\n },\n ];\n\n // Group warnings by component\n const warningsByComponent = new Map<string, GenerationWarning[]>();\n for (const warning of warnings) {\n const existing = warningsByComponent.get(warning.component) || [];\n existing.push(warning);\n warningsByComponent.set(warning.component, existing);\n }\n\n // Create sections for each component with warnings\n for (const [componentName, componentWarnings] of warningsByComponent.entries()) {\n children.push({\n name: 'heading',\n props: {\n level: 3,\n text: `Component: ${componentName}`,\n },\n });\n\n // Add each warning as a list item with details\n const warningItems: string[] = [];\n for (const warning of componentWarnings) {\n let warningText = warning.message;\n\n // Add context if present\n if (warning.context && Object.keys(warning.context).length > 0) {\n const contextStr = Object.entries(warning.context)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ');\n warningText += ` (${contextStr})`;\n }\n\n warningItems.push(warningText);\n }\n\n children.push({\n name: 'list',\n props: {\n items: warningItems,\n spacing: {\n after: 12,\n },\n },\n });\n }\n\n return {\n name: 'docx',\n props: {\n metadata: {\n title: 'Generation Warnings',\n },\n theme: 'minimal',\n },\n children,\n };\n}\n\n/**\n * Format warnings as plain text\n * Useful for logging or text output\n */\nexport function formatWarningsText(\n warnings: GenerationWarning[] | null\n): string {\n if (!warnings || warnings.length === 0) {\n return 'No warnings generated.';\n }\n\n const lines: string[] = [\n `Document Generation Warnings (${warnings.length} total)`,\n '='.repeat(50),\n '',\n ];\n\n // Group by component\n const warningsByComponent = new Map<string, GenerationWarning[]>();\n for (const warning of warnings) {\n const existing = warningsByComponent.get(warning.component) || [];\n existing.push(warning);\n warningsByComponent.set(warning.component, existing);\n }\n\n for (const [componentName, componentWarnings] of warningsByComponent.entries()) {\n lines.push(`Component: ${componentName}`);\n lines.push('-'.repeat(30));\n\n for (let i = 0; i < componentWarnings.length; i++) {\n const warning = componentWarnings[i];\n lines.push(` ${i + 1}. ${warning.message}`);\n\n if (warning.context && Object.keys(warning.context).length > 0) {\n lines.push(` Context: ${JSON.stringify(warning.context, null, 2)}`);\n }\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","// Version information\nexport function getCoreVersion(): string {\n return 'Core v1.0.0';\n}\n\n// Core functional API\nexport {\n generateDocument,\n generateFromConfig,\n generateDocumentFromJson,\n generateDocumentFromFile,\n generateBufferFromJson,\n generateBufferFromFile,\n generateAndSaveFromJson,\n generateAndSaveFromFile,\n validateJsonSchema,\n isReportComponentDefinition,\n saveDocument,\n generateAndSave,\n DocumentGenerator as CoreDocumentGenerator,\n} from './core/generator';\n\n// Cache API (general purpose caching, not specific to custom components)\nexport {\n MemoryCache,\n CacheKeyGenerator,\n DEFAULT_CACHE_CONFIG,\n getCacheConfigFromEnv,\n mergeConfigs,\n ComponentCacheAnalytics,\n // Types\n type CacheConfiguration,\n type CachedComponent,\n type CacheStatistics,\n type CacheKeyOptions,\n type CacheEvents,\n type CacheAnalyticsReport,\n type ComponentPerformanceMetrics,\n type ComponentCacheTrends,\n type CacheOptimizationRecommendation,\n type TimeSeriesPoint,\n} from './cache/index';\n\n// Component cache functions from core\nexport {\n initializeComponentCache,\n getComponentCache,\n clearComponentCache,\n getComponentCacheStats,\n warmComponentCache,\n} from './core/cached-render';\n\n// Legacy class-based API is now removed - use functional API above\n\n// Runtime exports (only type guards and functions)\nexport {\n // Type guards\n isReportComponent,\n isSectionComponent,\n isHeadingComponent,\n isParagraphComponent,\n isColumnsComponent,\n isImageComponent,\n isStatisticComponent,\n isTableComponent,\n isListComponent,\n isHeaderComponent,\n isFooterComponent,\n isHighchartsComponent,\n} from './types/index';\n\n// Export core-specific types only\nexport type {\n // Core-specific types\n ImageContent,\n StatisticContent,\n TableData,\n SectionProperties,\n ColumnSettings,\n PageSizeOptions,\n PageMarginOptions,\n PageNumberOptions,\n PageBorderOptions,\n RenderContext,\n} from './types/index';\n\n// Utilities\nexport * from './utils/formatters';\nexport { parseTextWithDecorators } from './utils/textParser';\nexport { isNodeEnvironment, hasNodeBuiltins } from './utils/environment';\nexport {\n generateWarningsDocument,\n formatWarningsText,\n} from './utils/warningsDocument';\n\n// Styles and themes\nexport {\n themes,\n minimalTheme,\n corporateTheme,\n modernTheme,\n} from './styles/index';\nexport type { ThemeName } from './styles/index';\n\n// JSON Theme System\nexport {\n loadThemeFromJson,\n loadThemeFromFile,\n exportThemeToJson,\n validateThemeJsonString,\n ThemeValidationError,\n ThemeParseError,\n ThemeFileError,\n createMinimalTheme,\n} from './themes/json/index';\n\n// Examples and utilities\nexport {\n examples,\n getExample,\n getExampleNames,\n loadJsonExample,\n} from './templates/documents/index';\nexport { runExample } from './utils/exampleRunner';\n\n// Export component implementations\nimport './components/index';\n\n// Re-export types from components (excluding those that come from shared)\nexport type {\n // ChartGenerationResult is specific to the component implementation\n ChartGenerationResult,\n} from './components/highcharts';\n\n// Note: TextSpaceAfterProps and HighchartsProps types are now in shared package\n// and should be imported from there to maintain single source of truth\n\n// Plugin System API\nexport {\n // Core plugin functions\n createComponent,\n createVersion,\n createDocumentGenerator,\n\n // Validation utilities\n validateComponentProps,\n validateDocument,\n cleanComponentProps,\n ComponentValidationError,\n\n // Schema utilities\n generatePluginDocumentSchema,\n exportPluginSchema,\n generateComponentSchemas,\n mergeSchemas,\n\n // Types\n type CustomComponent,\n type ComponentVersion,\n type ComponentVersionMap,\n type RenderFunction,\n type RenderContext as ComponentRenderContext,\n type DocumentGenerator,\n type DocumentGeneratorOptions,\n type GenerationResult,\n type BufferGenerationResult,\n type FileGenerationResult,\n type ValidationResult,\n type ValidationError,\n\n // Type utilities for custom components\n type ExtractCustomComponentType,\n type CustomComponentUnion,\n type ExtendedComponentDefinition,\n type ExtendedReportComponent,\n type InferCustomComponents,\n} from './plugin/index';\n\n// Plugin types\nexport type {\n PluginComponent,\n PluginRenderFunction,\n PluginValidationError,\n PluginValidationResult,\n} from './types/plugin';\n","/**\n * Examples registry - JSON-based examples\n * This file provides a unified interface to the JSON examples system\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { ComponentDefinition } from '@json-to-office/shared-docx';\n\nlet _dirname: string | null = null;\n\nfunction getDirname(): string {\n if (_dirname === null) {\n try {\n _dirname = path.dirname(fileURLToPath(import.meta.url));\n } catch {\n throw new Error(\n 'Cannot resolve file paths in a bundled environment. Example loading from disk is not available.'\n );\n }\n }\n return _dirname;\n}\n\n/**\n * Load a JSON example by name\n */\nexport function loadJsonExample(name: string): ComponentDefinition {\n // Since this file is bundled into dist/index.js, getDirname() will be the dist directory\n // The JSON files are copied to dist/templates/documents/ by the tsup config\n const filePath = path.join(\n getDirname(),\n 'templates',\n 'documents',\n `${name}.docx.json`\n );\n\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(content) as ComponentDefinition;\n } catch (error) {\n throw new Error(\n `Failed to load JSON example \"${name}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Get list of available JSON examples\n */\nexport function getAvailableJsonExamples(): string[] {\n // Since this file is bundled into dist/index.js, getDirname() will be the dist directory\n // The JSON files are copied to dist/templates/documents/ by the tsup config\n const examplesDir = path.join(getDirname(), 'templates', 'documents');\n\n try {\n const files = fs.readdirSync(examplesDir);\n return files\n .filter((file) => file.endsWith('.docx.json'))\n .map((file) => path.basename(file, '.docx.json'))\n .sort();\n } catch (error) {\n console.warn('Could not read JSON examples directory:', error);\n return [];\n }\n}\n\n/**\n * Example descriptions for documentation\n */\nexport const EXAMPLE_DESCRIPTIONS: Record<string, string> = {\n 'quarterly-report':\n 'Full quarterly report with TOC, sections, tables, statistics, columns, and lists',\n 'technical-guide':\n 'API integration guide with headers/footers, code-style text, tables, images, and multi-column layouts',\n proposal:\n 'Cloud migration proposal with headers/footers, statistics, side-by-side cost comparison tables, and ordered lists',\n};\n\n/**\n * Registry of available JSON examples (lazy-loaded)\n * For backward compatibility, this returns ComponentDefinition objects\n */\nconst _exampleCache: Record<string, ComponentDefinition> = {};\n\nexport const examples = new Proxy({} as Record<string, ComponentDefinition>, {\n get(_target, prop: string) {\n if (!_exampleCache[prop]) {\n try {\n _exampleCache[prop] = loadJsonExample(prop);\n } catch {\n return undefined;\n }\n }\n return _exampleCache[prop];\n },\n\n ownKeys(_target) {\n return getAvailableJsonExamples();\n },\n\n has(_target, prop: string) {\n return getAvailableJsonExamples().includes(prop);\n },\n});\n\n/**\n * Get example definition by name\n */\nexport const getExample = (\n exampleName: string\n): ComponentDefinition | undefined => {\n return examples[exampleName];\n};\n\n/**\n * Get all available example names\n */\nexport const getExampleNames = (): string[] => {\n return getAvailableJsonExamples();\n};\n\n// Use loadJsonExample() directly or access via the examples proxy\nexport const quarterlyReportExample = () => loadJsonExample('quarterly-report');\nexport const technicalGuideExample = () => loadJsonExample('technical-guide');\nexport const proposalExample = () => loadJsonExample('proposal');\n\n/**\n * Print usage information\n */\nexport function printExampleUsage(): void {\n const available = getAvailableJsonExamples();\n\n console.log('📋 Available JSON Examples:');\n console.log('===========================');\n\n available.forEach((name) => {\n const description =\n EXAMPLE_DESCRIPTIONS[name] || 'No description available';\n console.log(`\\n📄 ${name}:`);\n console.log(` ${description}`);\n console.log(` Usage: loadJsonExample('${name}')`);\n });\n\n console.log('\\n🔧 Example code:');\n console.log('```typescript');\n console.log(\n 'import { loadJsonExample, generateDocumentFromJson } from \"cool-report-generator\";'\n );\n console.log('');\n console.log('const jsonConfig = loadJsonExample(\"comprehensive\");');\n console.log('const document = await generateDocumentFromJson(jsonConfig);');\n console.log('```');\n}\n","/**\n * Universal example runner utility\n * Provides common functionality for running examples\n */\n\nimport { generateDocument, saveDocument } from '../core/generator';\nimport { ReportComponentDefinition } from '../types';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport interface ExampleRunnerOptions {\n outputFilename?: string;\n outputDir?: string;\n verbose?: boolean;\n}\n\n/**\n * Run an example and generate a document\n * @param example - The example definition to run\n * @param options - Options for running the example\n */\nexport async function runExample(\n example: ReportComponentDefinition,\n options: ExampleRunnerOptions = {}\n): Promise<void> {\n const { outputFilename, outputDir, verbose = true } = options;\n\n if (!example.props) {\n throw new Error('Example must have props');\n }\n\n const reportTitle = String(example.props.metadata?.title) || 'Document';\n const baseFilename =\n outputFilename || `${reportTitle.toLowerCase().replace(/\\s+/g, '-')}.docx`;\n\n // Use output directory if provided, otherwise use default output/examples path\n const defaultOutputDir = path.join(process.cwd(), 'output', 'examples');\n const finalOutputDir = outputDir || defaultOutputDir;\n const filename = path.join(finalOutputDir, baseFilename);\n\n if (verbose) {\n console.log(`=== ${reportTitle} Generation ===\\n`);\n console.log(`Generating ${reportTitle} with modular system...`);\n }\n\n try {\n // Ensure output directory exists\n await fs.promises.mkdir(finalOutputDir, { recursive: true });\n\n const document = await generateDocument(example);\n await saveDocument(document, filename);\n\n if (verbose) {\n console.log(`✓ ${reportTitle} saved: ${filename}`);\n console.log(`\\n✅ ${reportTitle} generated successfully!`);\n }\n } catch (error) {\n if (verbose) {\n console.error(`${reportTitle} generation failed:`, error);\n }\n throw error;\n }\n}\n","import { Packer } from 'docx';\nimport type { TSchema } from '@sinclair/typebox';\nimport type { CustomComponent } from './createComponent';\nimport type { ComponentDefinition, ReportComponentDefinition } from '../types';\nimport type { ThemeConfig } from '../styles';\nimport type { GenerationWarning } from '@json-to-office/shared-docx';\nimport type {\n ExtendedReportComponent,\n DocumentGeneratorBuilder,\n GenerationResult,\n BufferGenerationResult,\n FileGenerationResult,\n ValidationResult,\n} from './types';\nimport {\n validateDocument,\n cleanComponentProps,\n ComponentValidationError,\n DuplicateComponentError,\n} from './validation';\nimport { resolveComponentVersion } from './version-resolver';\nimport { generatePluginDocumentSchema, exportPluginSchema } from './schema';\nimport { processDocument } from '../core/structure';\nimport { applyLayout } from '../core/layout';\nimport { renderDocument } from '../core/render';\nimport { normalizeDocument } from '../json/normalizer';\nimport { resolveTheme } from '../styles/theme-resolver';\nimport { validateTheme } from '../styles/theme-validator';\n\n/**\n * Options for creating a document generator\n */\nexport interface DocumentGeneratorOptions {\n /** Theme configuration */\n theme: ThemeConfig;\n /** Enable caching for better performance */\n enableCache?: boolean;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Internal state held by each builder instance\n */\ninterface BuilderState {\n components: readonly CustomComponent<any, any, any>[];\n componentNames: Set<string>;\n theme: ThemeConfig;\n debug: boolean;\n enableCache: boolean;\n}\n\n/**\n * Create the builder implementation with the given state\n */\nfunction createBuilderImpl<\n TComponents extends readonly CustomComponent<any, any, any>[],\n>(state: BuilderState): DocumentGeneratorBuilder<TComponents> {\n // Validate and resolve theme\n const validatedTheme = validateTheme(state.theme);\n const fullTheme = resolveTheme(validatedTheme);\n\n // Create component map for quick lookup\n const componentMap = new Map(state.components.map((c) => [c.name, c]));\n\n /**\n * Process custom components in the document\n */\n async function processDocumentComponents(\n components: ComponentDefinition[],\n warningsCollector: GenerationWarning[]\n ): Promise<ComponentDefinition[]> {\n const processedComponents: ComponentDefinition[] = [];\n\n for (const componentData of components) {\n // Safe type narrowing for custom component detection\n const componentName = (componentData as { name?: string })?.name;\n\n if (!componentName) {\n processedComponents.push(componentData);\n continue;\n }\n\n const customComponent = componentMap.get(componentName);\n\n if (customComponent) {\n // This is a custom component - validate and process it\n try {\n const componentWithName = componentData as {\n name: string;\n version?: string;\n props?: unknown;\n children?: unknown;\n };\n\n if (!componentWithName.props) {\n throw new Error(\n `Custom component '${componentName}' must have a 'props' property. Use format: { name: '${componentName}', props: {...} }`\n );\n }\n\n // Resolve the correct version entry\n const versionEntry = resolveComponentVersion(\n customComponent.name,\n customComponent.versions,\n componentWithName.version\n );\n\n // Validate and clean the props against the resolved version's schema\n const cleanedProps = cleanComponentProps(\n versionEntry,\n componentWithName.props\n );\n\n // Process nested children if this is a container\n let nestedChildren: unknown[] | undefined;\n if (\n componentWithName.children &&\n Array.isArray(componentWithName.children)\n ) {\n nestedChildren = await processDocumentComponents(\n componentWithName.children as ComponentDefinition[],\n warningsCollector\n );\n }\n\n // Create addWarning callback for this component\n const versionLabel = componentWithName.version\n ? `${customComponent.name}@${componentWithName.version}`\n : customComponent.name;\n\n const addWarning = (\n message: string,\n context?: Record<string, unknown>\n ) => {\n warningsCollector.push({\n component: versionLabel,\n message,\n severity: 'warning',\n context,\n });\n };\n\n // Call the render function with context object\n const result = await versionEntry.render({\n props: cleanedProps,\n theme: fullTheme,\n addWarning,\n children: nestedChildren,\n });\n\n // Ensure result is an array\n const resultComponents = Array.isArray(result) ? result : [result];\n\n // Recursively process the result in case it contains more custom components\n const processedResult = await processDocumentComponents(\n resultComponents,\n warningsCollector\n );\n processedComponents.push(...processedResult);\n\n if (state.debug) {\n console.log(\n `Processed custom component '${versionLabel}':`,\n processedResult\n );\n }\n } catch (error) {\n if (error instanceof ComponentValidationError) {\n throw error;\n }\n throw new Error(\n `Error processing custom component '${customComponent.name}': ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n } else {\n // This is a standard component or nested container - process recursively\n if (\n 'children' in componentData &&\n Array.isArray(componentData.children)\n ) {\n const processedNested = await processDocumentComponents(\n componentData.children,\n warningsCollector\n );\n processedComponents.push({\n ...componentData,\n children: processedNested,\n });\n } else {\n processedComponents.push(componentData);\n }\n }\n }\n\n return processedComponents;\n }\n\n /**\n * Add a custom component to the generator\n */\n function addComponent<TNewComponent extends CustomComponent<any, any, any>>(\n component: TNewComponent\n ): DocumentGeneratorBuilder<readonly [...TComponents, TNewComponent]> {\n // Runtime duplicate check\n if (state.componentNames.has(component.name)) {\n throw new DuplicateComponentError(component.name);\n }\n\n // createComponent already validates — just check name for safety\n if (!component.name) {\n throw new Error('Component name is required');\n }\n\n // Create NEW immutable state\n const newComponentNames = new Set(state.componentNames);\n newComponentNames.add(component.name);\n\n const newState: BuilderState = {\n components: [...state.components, component],\n componentNames: newComponentNames,\n theme: state.theme,\n debug: state.debug,\n enableCache: state.enableCache,\n };\n\n // Return NEW builder with expanded type\n return createBuilderImpl<readonly [...TComponents, TNewComponent]>(\n newState\n );\n }\n\n /**\n * Generate a document\n */\n async function generate(\n document: ExtendedReportComponent<TComponents>\n ): Promise<GenerationResult> {\n try {\n // Cast to ReportComponentDefinition for internal processing\n const internalDocument = document as unknown as ReportComponentDefinition;\n\n // Validate the document first\n validateDocument(\n internalDocument,\n state.components as unknown as CustomComponent<TSchema>[]\n );\n\n // Initialize warnings collector\n const warnings: GenerationWarning[] = [];\n\n // Process custom components to convert them to standard components\n const processedComponents = await processDocumentComponents(\n internalDocument.children || [],\n warnings\n );\n\n // Create a new document definition with processed components\n const processedDocument: ReportComponentDefinition = {\n ...internalDocument,\n children: processedComponents,\n };\n\n // Normalize components (handle shorthand notations and nested structures)\n // We bypass JSON validation since we've already validated with custom schemas\n const [finalReportComponent] = normalizeDocument(processedDocument);\n\n // Use the document generation pipeline directly\n const structure = await processDocument(\n finalReportComponent,\n fullTheme,\n 'custom'\n );\n const layout = applyLayout(structure.sections, fullTheme, 'custom');\n const generatedDocument = await renderDocument(structure, layout);\n\n return {\n document: generatedDocument,\n warnings: warnings.length > 0 ? warnings : null,\n };\n } catch (error) {\n if (state.debug) {\n console.error('Document generation error:', error);\n }\n throw error;\n }\n }\n\n /**\n * Generate a document and return as buffer\n */\n async function generateBuffer(\n document: ExtendedReportComponent<TComponents>\n ): Promise<BufferGenerationResult> {\n const { document: doc, warnings } = await generate(document);\n const buffer = await Packer.toBuffer(doc);\n return { buffer, warnings };\n }\n\n /**\n * Generate a document and save to file\n */\n async function generateFile(\n document: ExtendedReportComponent<TComponents>,\n outputPath: string\n ): Promise<FileGenerationResult> {\n const { buffer, warnings } = await generateBuffer(document);\n const fs = await import('fs/promises');\n await fs.writeFile(outputPath, new Uint8Array(buffer));\n return { warnings };\n }\n\n /**\n * Get registered component names\n */\n function getComponentNames(): string[] {\n return Array.from(state.componentNames);\n }\n\n /**\n * Validate a document without generating it\n */\n function validate(\n document: ExtendedReportComponent<TComponents>\n ): ValidationResult {\n try {\n // Cast to ReportComponentDefinition for internal validation\n const internalDocument = document as unknown as ReportComponentDefinition;\n validateDocument(\n internalDocument,\n state.components as unknown as CustomComponent<TSchema>[]\n );\n return { valid: true };\n } catch (error) {\n if (error instanceof ComponentValidationError) {\n return {\n valid: false,\n errors: error.errors.map((e) => ({\n path: e.path,\n message: e.message,\n })),\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: 'document',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n }\n\n /**\n * Generate the extended JSON schema for document validation\n */\n function generateSchema(includeStandardComponents = true): TSchema {\n return generatePluginDocumentSchema(\n state.components as unknown as CustomComponent<TSchema>[],\n includeStandardComponents\n );\n }\n\n /**\n * Export the extended JSON schema to a file\n */\n async function exportSchemaToFile(\n outputPath: string,\n options?: {\n includeStandardComponents?: boolean;\n prettyPrint?: boolean;\n }\n ): Promise<void> {\n await exportPluginSchema(\n state.components as unknown as CustomComponent<TSchema>[],\n outputPath,\n options\n );\n }\n\n /**\n * Get the compiled standard components definition\n */\n async function getStandardComponentsDefinition(\n document: ExtendedReportComponent<TComponents>\n ): Promise<ReportComponentDefinition> {\n try {\n // Cast to ReportComponentDefinition for internal processing\n const internalDocument = document as unknown as ReportComponentDefinition;\n\n // Validate the document first\n validateDocument(\n internalDocument,\n state.components as unknown as CustomComponent<TSchema>[]\n );\n\n // Initialize warnings collector (not returned by this function)\n const warnings: GenerationWarning[] = [];\n\n // Process custom components to convert them to standard components\n const processedComponents = await processDocumentComponents(\n internalDocument.children || [],\n warnings\n );\n\n // Create a new document definition with processed components\n const processedDocument: ReportComponentDefinition = {\n ...internalDocument,\n children: processedComponents,\n };\n\n // Normalize components (handle shorthand notations and nested structures)\n // We bypass JSON validation since we've already validated with custom schemas\n const [finalReportComponent] = normalizeDocument(processedDocument);\n\n // Return the normalized document with all custom components resolved to standard components\n return finalReportComponent;\n } catch (error) {\n if (state.debug) {\n console.error('Error getting standard components definition:', error);\n }\n throw error;\n }\n }\n\n // Return frozen builder object\n return Object.freeze({\n addComponent,\n generate,\n generateBuffer,\n generateFile,\n getComponentNames,\n validate,\n generateSchema,\n exportSchema: exportSchemaToFile,\n getStandardComponentsDefinition,\n });\n}\n\n/**\n * Create a document generator with chainable component registration.\n */\nexport function createDocumentGenerator(\n options: DocumentGeneratorOptions\n): DocumentGeneratorBuilder<readonly []> {\n const initialState: BuilderState = {\n components: [],\n componentNames: new Set(),\n theme: options.theme,\n debug: options.debug ?? false,\n enableCache: options.enableCache ?? false,\n };\n\n return createBuilderImpl<readonly []>(initialState);\n}\n","import { latestVersion } from '@json-to-office/shared-docx';\nimport type { ComponentVersion, ComponentVersionMap } from './createComponent';\n\n/**\n * Resolve the correct version entry for a component.\n *\n * - If `requestedVersion` is provided and found, return it.\n * - If `requestedVersion` is provided but missing, throw with available versions.\n * - If `requestedVersion` is absent, return the latest semver version.\n */\nexport function resolveComponentVersion(\n componentName: string,\n versions: ComponentVersionMap,\n requestedVersion?: string\n): ComponentVersion {\n const versionKeys = Object.keys(versions);\n\n if (requestedVersion) {\n const entry = versions[requestedVersion];\n if (!entry) {\n throw new Error(\n `Component \"${componentName}\" does not have version \"${requestedVersion}\". ` +\n `Available versions: ${versionKeys.join(', ')}`\n );\n }\n return entry;\n }\n\n const latest = latestVersion(versionKeys);\n return versions[latest];\n}\n","import type { TSchema } from '@sinclair/typebox';\nimport type { CustomComponent } from './createComponent';\nimport type { ReportComponentDefinition } from '../types';\nimport { resolveComponentVersion } from './version-resolver';\nimport {\n validateCustomComponentProps,\n validateDocument as validateDocumentUnified,\n type ValidationError,\n type ComponentValidationResult,\n} from '@json-to-office/shared-docx/validation/unified';\nimport type { ValidationResult } from '@json-to-office/shared';\n\n/**\n * Error thrown when attempting to register a component with a duplicate name\n */\nexport class DuplicateComponentError extends Error {\n public readonly componentName: string;\n public readonly code = 'DUPLICATE_COMPONENT';\n\n constructor(componentName: string) {\n super(\n `Cannot register component \"${componentName}\": a component with this name is already registered. ` +\n 'Component names must be unique within a document generator.'\n );\n this.name = 'DuplicateComponentError';\n this.componentName = componentName;\n\n // Maintain proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, DuplicateComponentError);\n }\n }\n}\n\n/**\n * Custom validation error class\n */\nexport class ComponentValidationError extends Error {\n public errors: ValidationError[];\n public props: unknown;\n\n constructor(errors: ValidationError[], props?: unknown) {\n const propsStr =\n props !== undefined ? `\\nProps: ${JSON.stringify(props, null, 2)}` : '';\n const message = `Document validation failed:\\n${errors\n .map((e) => ` ${e.path}: ${e.message}`)\n .join('\\n')}${propsStr}`;\n super(message);\n this.name = 'ComponentValidationError';\n this.errors = errors;\n this.props = props;\n }\n}\n\n/**\n * Validate a component props against a schema.\n * Accepts a narrower interface — only needs { propsSchema }.\n */\nexport function validateComponentProps<TPropsSchema extends TSchema>(\n schema: { propsSchema: TPropsSchema },\n props: unknown\n): ComponentValidationResult<TPropsSchema> {\n return validateCustomComponentProps<TPropsSchema>(schema.propsSchema, props, {\n clean: true,\n applyDefaults: true,\n });\n}\n\n/**\n * Validate document and all custom components (version-aware)\n */\nexport function validateDocument(\n document: ReportComponentDefinition,\n customComponents: CustomComponent<any, any, any>[]\n): ValidationResult & { success: boolean } {\n // First validate the document structure\n const documentResult = validateDocumentUnified(document, {\n clean: true,\n applyDefaults: true,\n });\n\n if (!documentResult.valid) {\n return { ...documentResult, success: false };\n }\n\n // Then validate each custom component if present\n const errors: ValidationError[] = [];\n\n function validateComponents(components: any[], pathPrefix = 'children') {\n components.forEach((componentData, index) => {\n // Skip standard components (they have their own validation)\n const customComponent = customComponents.find(\n (cc) => cc.name === componentData.name\n );\n if (!customComponent) {\n return; // This is a standard component, skip validation here\n }\n\n // Resolve the correct version\n const versionEntry = resolveComponentVersion(\n customComponent.name,\n customComponent.versions,\n componentData.version\n );\n\n // Validate custom component against the resolved version's schema\n const validation = validateComponentProps(\n versionEntry,\n componentData.props\n );\n\n if (!validation.valid && validation.errors) {\n // Add component index to error paths\n const indexedErrors = validation.errors.map(\n (error: ValidationError) => ({\n ...error,\n path: `${pathPrefix}[${index}].${error.path}`,\n })\n );\n errors.push(...indexedErrors);\n }\n\n // Recursively validate nested children\n if (componentData.children && Array.isArray(componentData.children)) {\n validateComponents(\n componentData.children,\n `${pathPrefix}[${index}].children`\n );\n }\n });\n }\n\n if (document.children) {\n validateComponents(document.children);\n }\n\n return errors.length > 0\n ? { success: false, errors, valid: false }\n : { success: true, errors: [], valid: true };\n}\n\n/**\n * Validates component props and returns the typed props or throws.\n * Accepts a narrower interface — only needs { propsSchema }.\n */\nexport function getValidatedProps<TPropsSchema extends TSchema>(\n schema: { propsSchema: TPropsSchema },\n props: unknown\n): TPropsSchema {\n const validation = validateComponentProps(schema, props);\n\n if (!validation.valid) {\n throw new ComponentValidationError(validation.errors || [], props);\n }\n\n return validation.data!;\n}\n\n// Re-export types\nexport type { ValidationError } from '@json-to-office/shared-docx/validation/unified';\nexport type { ComponentValidationResult } from '@json-to-office/shared-docx/validation/unified';\n\n// Export cleanComponentProps as an alias for getValidatedProps for backward compatibility\nexport const cleanComponentProps = getValidatedProps;\n","import { Type, TSchema, TObject } from '@sinclair/typebox';\nimport { latestVersion } from '@json-to-office/shared-docx';\nimport type { CustomComponent } from './createComponent';\nimport {\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ListPropsSchema,\n ImagePropsSchema,\n TablePropsSchema,\n} from '@json-to-office/shared-docx';\nimport { generateUnifiedDocumentSchema } from '@json-to-office/shared-docx/schemas/generator';\n\n// Schema cache to avoid regenerating identical schemas\nconst schemaCache = new Map<string, TSchema>();\n\n/**\n * Generate a JSON schema for plugin-enhanced documents at RUNTIME.\n *\n * Iterates each component's versions map to produce per-version\n * CustomComponentInfo entries for the unified schema generator.\n */\nexport function generatePluginDocumentSchema(\n customComponents: CustomComponent<any, any, any>[],\n includeStandardComponents = true\n): TSchema {\n // Produce per-version CustomComponentInfo entries for version-discriminated validation\n const customComponentInfos = customComponents.map((component) => {\n const versionKeys = Object.keys(component.versions);\n\n // Build per-version props entries\n const versionedProps = versionKeys.map((v) => ({\n version: v,\n propsSchema: component.versions[v].propsSchema,\n hasChildren: component.versions[v].hasChildren === true,\n description: component.versions[v].description,\n }));\n\n // propsSchema is used as fallback label — use latest version's props\n const latestKey = versionKeys.reduce((a, b) => (a > b ? a : b));\n\n return {\n name: component.name,\n propsSchema: component.versions[latestKey].propsSchema,\n hasChildren: versionKeys.some(\n (v) => component.versions[v].hasChildren === true\n ),\n versionedProps,\n };\n });\n\n return generateUnifiedDocumentSchema({\n includeStandardComponents: includeStandardComponents,\n includeTheme: true,\n customComponents: customComponentInfos,\n title: 'Plugin Document Definition',\n description: 'Document definition with custom plugin components',\n });\n}\n\n/**\n * Create a union type from an array of schemas\n */\nexport function createUnionSchema(schemas: TSchema[]): TSchema {\n if (schemas.length === 0) {\n return Type.Any();\n }\n if (schemas.length === 1) {\n return schemas[0];\n }\n return Type.Union(schemas as [TSchema, TSchema, ...TSchema[]]);\n}\n\n/**\n * Export a plugin-enhanced JSON schema to a file at RUNTIME\n */\nexport async function exportPluginSchema(\n customComponents: CustomComponent<any, any, any>[],\n outputPath: string,\n options: {\n includeStandardComponents?: boolean;\n prettyPrint?: boolean;\n } = {}\n): Promise<void> {\n const { includeStandardComponents = true, prettyPrint = true } = options;\n\n const { convertToJsonSchema, exportSchemaToFile } = await import(\n '@json-to-office/shared-docx/schemas/export'\n );\n\n const schema = generatePluginDocumentSchema(\n customComponents,\n includeStandardComponents\n );\n\n const jsonSchema = convertToJsonSchema(schema, {\n $schema: 'http://json-schema.org/draft-07/schema#',\n });\n\n await exportSchemaToFile(jsonSchema, outputPath, { prettyPrint });\n}\n\n/**\n * Generate schemas for individual custom components (version-aware).\n * Produces per-version schemas keyed as `name` or `name@version`.\n */\nexport function generateComponentSchemas(\n customComponents: CustomComponent<any, any, any>[]\n): Record<string, TSchema> {\n const schemas: Record<string, TSchema> = {};\n\n for (const component of customComponents) {\n const versionKeys = Object.keys(component.versions);\n const latest = latestVersion(versionKeys);\n\n for (const v of versionKeys) {\n const entry = component.versions[v];\n const cacheKey = `component_${component.name}@${v}`;\n\n if (schemaCache.has(cacheKey)) {\n schemas[`${component.name}@${v}`] = schemaCache.get(cacheKey)!;\n } else {\n const schemaObj = entry.propsSchema as TObject;\n const properties = schemaObj.properties || {};\n\n const componentSchemaProps: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n version: Type.Optional(Type.Literal(v)),\n id: Type.Optional(Type.String()),\n ...properties,\n };\n\n if (entry.hasChildren) {\n componentSchemaProps.children = Type.Optional(Type.Array(Type.Any()));\n }\n\n const componentSchema = Type.Object(componentSchemaProps);\n schemaCache.set(cacheKey, componentSchema);\n schemas[`${component.name}@${v}`] = componentSchema;\n }\n }\n\n // Also add a \"default\" entry keyed by name (uses latest)\n const latestEntry = component.versions[latest];\n const defaultCacheKey = `component_${component.name}_default`;\n\n if (schemaCache.has(defaultCacheKey)) {\n schemas[component.name] = schemaCache.get(defaultCacheKey)!;\n } else {\n const schemaObj = latestEntry.propsSchema as TObject;\n const properties = schemaObj.properties || {};\n\n const componentSchemaProps: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n id: Type.Optional(Type.String()),\n ...properties,\n };\n\n if (latestEntry.hasChildren) {\n componentSchemaProps.children = Type.Optional(Type.Array(Type.Any()));\n }\n\n const componentSchema = Type.Object(componentSchemaProps);\n schemaCache.set(defaultCacheKey, componentSchema);\n schemas[component.name] = componentSchema;\n }\n }\n\n return schemas;\n}\n\n/**\n * Merge custom component schemas with standard schemas\n */\nexport function mergeSchemas(\n customComponents: CustomComponent<any, any, any>[],\n standardSchemas?: Record<string, TSchema>\n): Record<string, TSchema> {\n const customSchemas = generateComponentSchemas(customComponents);\n\n if (standardSchemas) {\n return {\n ...standardSchemas,\n ...customSchemas,\n };\n }\n\n const defaultStandardSchemas: Record<string, TSchema> = {\n docx: Type.Object({\n name: Type.Literal('docx'),\n id: Type.Optional(Type.String()),\n props: ReportPropsSchema,\n children: Type.Optional(Type.Array(Type.Any())),\n }),\n section: Type.Object({\n name: Type.Literal('section'),\n id: Type.Optional(Type.String()),\n props: SectionPropsSchema,\n children: Type.Optional(Type.Array(Type.Any())),\n }),\n heading: Type.Object({\n name: Type.Literal('heading'),\n id: Type.Optional(Type.String()),\n props: HeadingPropsSchema,\n }),\n text: Type.Object({\n name: Type.Literal('text'),\n id: Type.Optional(Type.String()),\n props: ParagraphPropsSchema,\n }),\n list: Type.Object({\n name: Type.Literal('list'),\n id: Type.Optional(Type.String()),\n props: ListPropsSchema,\n }),\n image: Type.Object({\n name: Type.Literal('image'),\n id: Type.Optional(Type.String()),\n props: ImagePropsSchema,\n }),\n table: Type.Object({\n name: Type.Literal('table'),\n id: Type.Optional(Type.String()),\n props: TablePropsSchema,\n }),\n };\n\n return {\n ...defaultStandardSchemas,\n ...customSchemas,\n };\n}\n","import type { ThemeConfig } from './index';\nimport { getTheme } from '../templates/themes';\n\n/**\n * Resolve a theme by merging with defaults\n */\nexport function resolveTheme(theme?: ThemeConfig | string): ThemeConfig {\n if (typeof theme === 'string') {\n const resolvedTheme = getTheme(theme);\n if (resolvedTheme) {\n return resolvedTheme as ThemeConfig;\n }\n // Fallback to minimal theme if default doesn't exist\n return getTheme('minimal') as ThemeConfig;\n }\n\n if (theme) {\n // Return theme as-is, assuming it's complete\n return theme;\n }\n\n // Return minimal theme as default\n return getTheme('minimal') as ThemeConfig;\n}\n","import type { ThemeConfig } from './index';\nimport { validateTheme as validateThemeUnified } from '@json-to-office/shared-docx/validation/unified';\n\n/**\n * Validate a theme configuration\n * Now uses unified validation from shared package\n */\nexport function validateTheme(\n theme?: ThemeConfig | string\n): ThemeConfig | undefined {\n if (!theme) {\n return undefined;\n }\n\n if (typeof theme === 'string') {\n // Theme name - will be resolved later\n return theme as unknown as ThemeConfig;\n }\n\n // Use unified validation\n const result = validateThemeUnified(theme);\n\n if (!result.valid) {\n const errorSummary =\n result.errors?.map((e: any) => e.message).join(', ') || 'Invalid theme';\n throw new Error(`Invalid theme: ${errorSummary}`);\n }\n\n return result.data as ThemeConfig;\n}\n"],"mappings":"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","names":["themes","path","fs","path","path","AlignmentType","format","getAlignment","Paragraph","TextRun","ImageRun","AlignmentType","BookmarkStart","BookmarkEnd","TextRun","ExternalHyperlink","InternalHyperlink","TextRun","createTextRunsWithNewlines","InternalHyperlink","ExternalHyperlink","createHash","TextRun","AlignmentType","BorderStyle","PageNumber","TextRun","path","getAvailableWidthTwips","getPageWidthTwips","getAvailableHeightTwips","getPageHeightTwips","mapFloatingOptions","detectImageType","AlignmentType","BorderStyle","TextRun","text","format","Table","TableRow","TableCell","WidthType","TableLayoutType","BorderStyle","convertBorders","Paragraph","Paragraph","convertBorders","cellChildren","childContext","styleCfg","cellOpts","row","TableRow","TableCell","table","Table","TableLayoutType","WidthType","config","Paragraph","Paragraph","Paragraph","Table","TableRow","TableCell","WidthType","BorderStyle","VerticalAlign","TableLayoutType","Paragraph","TableCell","WidthType","VerticalAlign","BorderStyle","TableRow","Table","TableLayoutType","Paragraph","TextRun","AlignmentType","getAlignment","Paragraph","TextRun","getAlignment","Paragraph","TextRun","Paragraph","TextRun","getAlignment","Paragraph","AlignmentType","TextRun","getAlignment","AlignmentType","globalNumberingRegistry","Paragraph","TextRun","ImageRun","BookmarkStart","BookmarkEnd","fs","fs","fixFloatingImageIds","fs","path","fileURLToPath","path","fs","Packer","Type","latestVersion","latestVersion","Type","resolveTheme","resolveTheme","Packer","fs"]}
1
+ {"version":3,"sources":["../src/themes/defaults.ts","../src/templates/themes/minimal.docx.theme.json","../src/templates/themes/corporate.docx.theme.json","../src/templates/themes/modern.docx.theme.json","../src/templates/themes/index.ts","../src/styles/utils/colorUtils.ts","../src/styles/utils/styleHelpers.ts","../src/styles/utils/layoutUtils.ts","../src/themes/json/parser.ts","../src/themes/json/validator.ts","../src/themes/json/loader.ts","../src/themes/json/index.ts","../src/styles/index.ts","../src/utils/widthUtils.ts","../src/utils/imageUtils.ts","../src/utils/docxImagePositioning.ts","../src/utils/numberingConfig.ts","../src/utils/fixFloatingImageIds.ts","../src/core/generator.ts","../src/types/index.ts","../src/utils/formatters.ts","../src/core/structure.ts","../src/core/layout.ts","../src/core/render.ts","../src/styles/themeToDocxAdapter.ts","../src/utils/textParser.ts","../src/utils/placeholderProcessor.ts","../src/utils/unicode.ts","../src/cache/index.ts","../src/cache/key-generator.ts","../src/core/cached-render.ts","../src/styles/utils/componentDefaults.ts","../src/core/content.ts","../src/utils/bookmarkRegistry.ts","../src/components/heading.ts","../src/components/paragraph.ts","../src/components/list.ts","../src/components/image.ts","../src/components/text-box.ts","../src/styles/utils/borderUtils.ts","../src/styles/utils/cellUtils.ts","../src/components/table.ts","../src/components/section.ts","../src/components/columns.ts","../src/components/statistic.ts","../src/components/header.ts","../src/utils/alignmentUtils.ts","../src/components/footer.ts","../src/components/toc/index.ts","../src/utils/environment.ts","../src/components/highcharts.ts","../src/components/text-space-after.ts","../src/plugin/createComponent.ts","../src/json/parser.ts","../src/json/normalizer.ts","../src/json/filesystem.ts","../src/utils/warningsDocument.ts","../src/index.ts","../src/templates/documents/index.ts","../src/utils/exampleRunner.ts","../src/plugin/createDocumentGenerator.ts","../src/plugin/version-resolver.ts","../src/plugin/validation.ts","../src/plugin/schema.ts"],"sourcesContent":["/**\n * Default theme values and utilities for handling optional theme properties\n */\n\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\n\n/**\n * Default colors for themes\n */\nexport const DEFAULT_COLORS = {\n primary: '#000000',\n secondary: '#666666',\n accent: '#0066CC',\n text: '#000000',\n background: '#FFFFFF',\n border: '#CCCCCC',\n // Semantic colors\n textPrimary: '#000000',\n textSecondary: '#666666',\n textMuted: '#999999',\n borderPrimary: '#CCCCCC',\n borderSecondary: '#E5E5E5',\n backgroundPrimary: '#FFFFFF',\n backgroundSecondary: '#F5F5F5',\n};\n\n/**\n * Default fonts for themes\n */\nexport const DEFAULT_FONTS = {\n heading: { family: 'Arial', size: 20 },\n body: { family: 'Arial', size: 11 },\n mono: { family: 'Courier New', size: 10 },\n light: { family: 'Arial', size: 24 },\n};\n\n/**\n * Default styles for themes\n */\nexport const DEFAULT_STYLES = {\n normal: {\n font: 'body' as const,\n size: 11,\n color: '#000000',\n alignment: 'left' as const,\n lineSpacing: {\n type: 'single' as const,\n value: 1,\n },\n spacing: {\n after: 6,\n },\n },\n heading1: {\n font: 'heading' as const,\n size: 24,\n color: '#000000',\n bold: true,\n spacing: {\n before: 12,\n after: 12,\n },\n },\n heading2: {\n font: 'heading' as const,\n size: 20,\n color: '#000000',\n bold: true,\n spacing: {\n before: 10,\n after: 10,\n },\n },\n heading3: {\n font: 'heading' as const,\n size: 16,\n color: '#000000',\n bold: true,\n spacing: {\n before: 8,\n after: 8,\n },\n },\n heading4: {\n font: 'heading' as const,\n size: 14,\n color: '#000000',\n bold: true,\n spacing: {\n before: 6,\n after: 6,\n },\n },\n heading5: {\n font: 'heading' as const,\n size: 12,\n color: '#000000',\n bold: true,\n spacing: {\n before: 6,\n after: 6,\n },\n },\n heading6: {\n font: 'heading' as const,\n size: 11,\n color: '#000000',\n bold: true,\n spacing: {\n before: 6,\n after: 6,\n },\n },\n};\n\n/**\n * Default page settings\n */\nexport const DEFAULT_PAGE = {\n size: 'LETTER' as const,\n margins: {\n top: 720,\n bottom: 720,\n left: 720,\n right: 720,\n header: 360,\n footer: 360,\n gutter: 0,\n },\n};\n\n/**\n * Ensures theme has all required properties with defaults\n */\nexport function ensureThemeDefaults(\n theme: Partial<ThemeConfigJson>\n): ThemeConfigJson {\n return {\n $schema: theme.$schema,\n name: theme.name || 'default',\n displayName: theme.displayName || 'Default Theme',\n description: theme.description || 'Default theme configuration',\n version: theme.version || '1.0.0',\n colors: {\n ...DEFAULT_COLORS,\n ...(theme.colors || {}),\n },\n fonts: {\n heading: { ...DEFAULT_FONTS.heading, ...(theme.fonts?.heading || {}) },\n body: { ...DEFAULT_FONTS.body, ...(theme.fonts?.body || {}) },\n mono: { ...DEFAULT_FONTS.mono, ...(theme.fonts?.mono || {}) },\n light: { ...DEFAULT_FONTS.light, ...(theme.fonts?.light || {}) },\n },\n page: {\n ...DEFAULT_PAGE,\n ...(theme.page || {}),\n margins: {\n ...DEFAULT_PAGE.margins,\n ...(theme.page?.margins || {}),\n },\n },\n styles: theme.styles,\n componentDefaults: theme.componentDefaults,\n };\n}\n\n/**\n * Type guard to check if a theme has all required properties\n */\nexport function isCompleteTheme(theme: unknown): theme is ThemeConfigJson {\n const t = theme as Record<string, unknown>;\n return (\n t &&\n typeof t === 'object' &&\n !!t.colors &&\n !!t.fonts &&\n !!t.page &&\n typeof t.name === 'string' &&\n typeof t.displayName === 'string' &&\n typeof t.description === 'string' &&\n typeof t.version === 'string'\n );\n}\n\n/**\n * Safe getter for theme colors with defaults\n */\nexport function getThemeColors(theme: Partial<ThemeConfigJson>) {\n return {\n ...DEFAULT_COLORS,\n ...(theme.colors || {}),\n };\n}\n\n/**\n * Safe getter for theme fonts with defaults\n */\nexport function getThemeFonts(theme: Partial<ThemeConfigJson>) {\n return {\n ...DEFAULT_FONTS,\n ...(theme.fonts || {}),\n };\n}\n\n/**\n * Safe getter for theme styles with defaults\n */\nexport function getThemeStyles(theme: Partial<ThemeConfigJson>) {\n return {\n ...DEFAULT_STYLES,\n ...(theme.styles || {}),\n };\n}\n\n/**\n * Safe getter for normal style with defaults\n */\nexport function getNormalStyle(theme: Partial<ThemeConfigJson>) {\n const styles = getThemeStyles(theme);\n return {\n ...DEFAULT_STYLES.normal,\n ...(styles.normal || {}),\n };\n}\n","{\n \"$schema\": \"../../../../shared/json-schemas/theme.schema.json\",\n \"name\": \"minimal\",\n \"displayName\": \"Minimal Clean\",\n \"description\": \"A clean, minimalist theme focused on readability and elegant simplicity\",\n \"version\": \"2.0.0\",\n \"colors\": {\n \"primary\": \"#000000\",\n \"secondary\": \"#666666\",\n \"accent\": \"#2c3e50\",\n \"background\": \"#ffffff\",\n \"text\": \"#2c2c2c\",\n \"border\": \"#f0f0f0\",\n \"textPrimary\": \"#000000\",\n \"textSecondary\": \"#4a4a4a\",\n \"textMuted\": \"#999999\",\n \"borderPrimary\": \"#e0e0e0\",\n \"borderSecondary\": \"#f5f5f5\",\n \"backgroundPrimary\": \"#ffffff\",\n \"backgroundSecondary\": \"#fafafa\"\n },\n \"fonts\": {\n \"heading\": {\n \"family\": \"Arial\",\n \"size\": 24\n },\n \"body\": {\n \"family\": \"Arial\",\n \"size\": 11\n },\n \"mono\": {\n \"family\": \"SF Mono\",\n \"size\": 10\n },\n \"light\": {\n \"family\": \"Arial\",\n \"size\": 24\n }\n },\n \"page\": {\n \"size\": \"A4\",\n \"margins\": {\n \"top\": 1440,\n \"bottom\": 1440,\n \"left\": 1080,\n \"right\": 1080,\n \"header\": 720,\n \"footer\": 720,\n \"gutter\": 0\n }\n },\n \"styles\": {\n \"normal\": {\n \"font\": \"body\",\n \"color\": \"#000000\",\n \"lineSpacing\": {\n \"type\": \"multiple\",\n \"value\": 1.5\n },\n \"alignment\": \"justify\",\n \"spacing\": {\n \"after\": 9\n }\n },\n \"heading1\": {\n \"font\": \"light\",\n \"size\": 24,\n \"bold\": false,\n \"color\": \"#000000\",\n \"spacing\": {\n \"before\": 18,\n \"after\": 12\n },\n \"keepNext\": true,\n \"alignment\": \"left\",\n \"characterSpacing\": {\n \"type\": \"expanded\",\n \"value\": 1.2\n }\n },\n \"heading2\": {\n \"font\": \"light\",\n \"size\": 20,\n \"bold\": false,\n \"color\": \"#000000\",\n \"spacing\": {\n \"before\": 12,\n \"after\": 9\n },\n \"keepNext\": true,\n \"alignment\": \"left\",\n \"characterSpacing\": {\n \"type\": \"expanded\",\n \"value\": 0.8\n }\n },\n \"heading3\": {\n \"font\": \"heading\",\n \"size\": 16,\n \"bold\": false,\n \"color\": \"#2c2c2c\",\n \"spacing\": {\n \"before\": 9,\n \"after\": 6\n },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading4\": {\n \"font\": \"heading\",\n \"size\": 14,\n \"bold\": true,\n \"color\": \"#4a4a4a\",\n \"spacing\": {\n \"before\": 6,\n \"after\": 4\n },\n \"keepNext\": true\n },\n \"heading5\": {\n \"font\": \"heading\",\n \"size\": 12,\n \"bold\": false,\n \"italic\": true,\n \"color\": \"#666666\",\n \"spacing\": {\n \"before\": 4,\n \"after\": 3\n }\n },\n \"heading6\": {\n \"font\": \"light\",\n \"size\": 11,\n \"bold\": false,\n \"color\": \"#999999\",\n \"spacing\": {\n \"before\": 3,\n \"after\": 2\n }\n },\n \"title\": {\n \"font\": \"light\",\n \"bold\": false,\n \"color\": \"#000000\",\n \"alignment\": \"left\",\n \"spacing\": {\n \"before\": 0,\n \"after\": 24\n },\n \"characterSpacing\": {\n \"type\": \"condensed\",\n \"value\": 20\n }\n },\n \"subtitle\": {\n \"font\": \"light\",\n \"size\": 16,\n \"italic\": false,\n \"color\": \"#666666\",\n \"alignment\": \"left\",\n \"spacing\": {\n \"before\": 0,\n \"after\": 18\n }\n }\n },\n \"componentDefaults\": {\n \"table\": {\n \"borders\": false,\n \"striped\": false,\n \"headerBackground\": \"#fafafa\",\n \"headerColor\": \"#000000\",\n \"borderColor\": \"#f0f0f0\",\n \"borderWidth\": 0.5\n },\n \"list\": {\n \"format\": \"bullet\",\n \"bullet\": \"•\",\n \"indent\": 3\n },\n \"image\": {\n \"alignment\": \"left\"\n },\n \"statistic\": {\n \"alignment\": \"left\"\n },\n \"section\": {\n \"pageBreak\": false\n },\n \"heading\": {\n \"numbering\": false\n }\n }\n}\n","{\n \"name\": \"corporate\",\n \"displayName\": \"Corporate Professional\",\n \"description\": \"A polished corporate theme with blue accents and structured typography\",\n \"version\": \"2.0.0\",\n \"colors\": {\n \"primary\": \"#1a365d\",\n \"secondary\": \"#2D3748\",\n \"accent\": \"#3182CE\",\n \"text\": \"#1A202C\",\n \"background\": \"#FFFFFF\",\n \"border\": \"#E2E8F0\",\n \"textPrimary\": \"#1A202C\",\n \"textSecondary\": \"#4A5568\",\n \"textMuted\": \"#A0AEC0\",\n \"borderPrimary\": \"#CBD5E0\",\n \"borderSecondary\": \"#E2E8F0\",\n \"backgroundPrimary\": \"#FFFFFF\",\n \"backgroundSecondary\": \"#F7FAFC\"\n },\n \"fonts\": {\n \"heading\": { \"family\": \"Georgia\", \"size\": 26 },\n \"body\": { \"family\": \"Calibri\", \"size\": 11 },\n \"mono\": { \"family\": \"Consolas\", \"size\": 10 },\n \"light\": { \"family\": \"Georgia\", \"size\": 26 }\n },\n \"page\": {\n \"size\": \"A4\",\n \"margins\": {\n \"top\": 1440,\n \"bottom\": 1440,\n \"left\": 1200,\n \"right\": 1200,\n \"header\": 720,\n \"footer\": 720,\n \"gutter\": 0\n }\n },\n \"styles\": {\n \"normal\": {\n \"font\": \"body\",\n \"color\": \"#1A202C\",\n \"lineSpacing\": { \"type\": \"multiple\", \"value\": 1.4 },\n \"alignment\": \"justify\",\n \"spacing\": { \"after\": 8 }\n },\n \"heading1\": {\n \"font\": \"heading\",\n \"size\": 26,\n \"bold\": false,\n \"color\": \"primary\",\n \"spacing\": { \"before\": 24, \"after\": 12 },\n \"keepNext\": true,\n \"alignment\": \"left\",\n \"borders\": {\n \"bottom\": { \"style\": \"single\", \"size\": 2, \"color\": \"primary\", \"space\": 6 }\n }\n },\n \"heading2\": {\n \"font\": \"heading\",\n \"size\": 18,\n \"bold\": false,\n \"color\": \"secondary\",\n \"spacing\": { \"before\": 18, \"after\": 8 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading3\": {\n \"font\": \"body\",\n \"size\": 13,\n \"bold\": true,\n \"color\": \"accent\",\n \"spacing\": { \"before\": 12, \"after\": 6 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"title\": {\n \"font\": \"light\",\n \"size\": 32,\n \"bold\": false,\n \"color\": \"primary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 18 }\n },\n \"subtitle\": {\n \"font\": \"body\",\n \"size\": 16,\n \"italic\": false,\n \"color\": \"textSecondary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 24 }\n }\n },\n \"componentDefaults\": {\n \"table\": {\n \"borders\": true,\n \"striped\": true,\n \"headerBackground\": \"#1a365d\",\n \"headerColor\": \"#FFFFFF\",\n \"borderColor\": \"#E2E8F0\",\n \"borderWidth\": 0.5\n },\n \"list\": {\n \"format\": \"bullet\",\n \"bullet\": \"\\u2022\",\n \"indent\": 3\n },\n \"statistic\": {\n \"alignment\": \"center\"\n },\n \"section\": {\n \"pageBreak\": false\n },\n \"heading\": {\n \"numbering\": false\n }\n }\n}\n","{\n \"name\": \"modern\",\n \"displayName\": \"Modern Clean\",\n \"description\": \"A contemporary theme with vibrant accents and generous whitespace\",\n \"version\": \"2.0.0\",\n \"colors\": {\n \"primary\": \"#6D28D9\",\n \"secondary\": \"#1E293B\",\n \"accent\": \"#0891B2\",\n \"text\": \"#0F172A\",\n \"background\": \"#FFFFFF\",\n \"border\": \"#E2E8F0\",\n \"textPrimary\": \"#0F172A\",\n \"textSecondary\": \"#475569\",\n \"textMuted\": \"#94A3B8\",\n \"borderPrimary\": \"#CBD5E1\",\n \"borderSecondary\": \"#E2E8F0\",\n \"backgroundPrimary\": \"#FFFFFF\",\n \"backgroundSecondary\": \"#F8FAFC\"\n },\n \"fonts\": {\n \"heading\": { \"family\": \"Helvetica\", \"size\": 28 },\n \"body\": { \"family\": \"Helvetica\", \"size\": 11 },\n \"mono\": { \"family\": \"SF Mono\", \"size\": 10 },\n \"light\": { \"family\": \"Helvetica\", \"size\": 28 }\n },\n \"page\": {\n \"size\": \"A4\",\n \"margins\": {\n \"top\": 1440,\n \"bottom\": 1440,\n \"left\": 1080,\n \"right\": 1080,\n \"header\": 720,\n \"footer\": 720,\n \"gutter\": 0\n }\n },\n \"styles\": {\n \"normal\": {\n \"font\": \"body\",\n \"color\": \"#0F172A\",\n \"lineSpacing\": { \"type\": \"multiple\", \"value\": 1.5 },\n \"alignment\": \"left\",\n \"spacing\": { \"after\": 10 }\n },\n \"heading1\": {\n \"font\": \"heading\",\n \"size\": 28,\n \"bold\": true,\n \"color\": \"primary\",\n \"spacing\": { \"before\": 24, \"after\": 14 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading2\": {\n \"font\": \"heading\",\n \"size\": 20,\n \"bold\": true,\n \"color\": \"secondary\",\n \"spacing\": { \"before\": 18, \"after\": 10 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"heading3\": {\n \"font\": \"body\",\n \"size\": 14,\n \"bold\": true,\n \"color\": \"accent\",\n \"spacing\": { \"before\": 12, \"after\": 6 },\n \"keepNext\": true,\n \"alignment\": \"left\"\n },\n \"title\": {\n \"font\": \"heading\",\n \"size\": 36,\n \"bold\": true,\n \"color\": \"primary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 12 }\n },\n \"subtitle\": {\n \"font\": \"light\",\n \"size\": 18,\n \"italic\": false,\n \"color\": \"textSecondary\",\n \"alignment\": \"left\",\n \"spacing\": { \"before\": 0, \"after\": 24 }\n }\n },\n \"componentDefaults\": {\n \"table\": {\n \"borders\": true,\n \"striped\": false,\n \"headerBackground\": \"#6D28D9\",\n \"headerColor\": \"#FFFFFF\",\n \"borderColor\": \"#E2E8F0\",\n \"borderWidth\": 0.5\n },\n \"list\": {\n \"format\": \"bullet\",\n \"bullet\": \"\\u2013\",\n \"indent\": 3\n },\n \"image\": {\n \"alignment\": \"center\"\n },\n \"statistic\": {\n \"alignment\": \"center\"\n },\n \"section\": {\n \"pageBreak\": false\n }\n }\n}\n","/**\n * JSON-based themes registry\n * This file provides a unified interface to JSON themes\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { ensureThemeDefaults } from '../../themes/defaults';\n\n// Import theme JSON files directly\nimport minimalThemeJson from './minimal.docx.theme.json';\nimport corporateThemeJson from './corporate.docx.theme.json';\nimport modernThemeJson from './modern.docx.theme.json';\n\n/**\n * Registry of available themes loaded from JSON files\n */\nlet _themesCache: Record<string, ThemeConfigJson> | null = null;\n\nfunction loadThemesFromJson(): Record<string, ThemeConfigJson> {\n if (_themesCache) {\n return _themesCache;\n }\n\n // Build themes from imported JSON files\n const themes: Record<string, ThemeConfigJson> = {\n minimal: ensureThemeDefaults(minimalThemeJson as ThemeConfigJson),\n corporate: ensureThemeDefaults(corporateThemeJson as ThemeConfigJson),\n modern: ensureThemeDefaults(modernThemeJson as ThemeConfigJson),\n };\n\n // Also try to load from file system for runtime additions (if available)\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const themesDir = path.join(__dirname, '../../../dist/templates/themes');\n\n if (fs.existsSync(themesDir)) {\n const themeFiles = fs\n .readdirSync(themesDir)\n .filter((file) => file.endsWith('.docx.theme.json'))\n .map((file) => path.basename(file, '.docx.theme.json'));\n\n for (const themeName of themeFiles) {\n if (!themes[themeName]) {\n try {\n const filePath = path.join(themesDir, `${themeName}.docx.theme.json`);\n const content = fs.readFileSync(filePath, 'utf8');\n const parsedTheme = JSON.parse(content);\n themes[themeName] = ensureThemeDefaults(parsedTheme);\n } catch (error) {\n console.warn(\n `Failed to load additional theme ${themeName}:`,\n error\n );\n }\n }\n }\n }\n } catch (error) {\n // Silently ignore if file system access fails (e.g., in bundled environment)\n }\n\n _themesCache = themes;\n return themes;\n}\n\nexport const themes = loadThemesFromJson();\n\n/**\n * Type representing valid theme names\n */\nexport type ThemeName = keyof typeof themes;\n\n/**\n * Get theme configuration by name\n * @param themeName - Name of the theme to retrieve\n * @returns Theme configuration or undefined if not found\n */\nexport const getTheme = (themeName: string): ThemeConfigJson | undefined => {\n return themes[themeName];\n};\n\n/**\n * Get theme configuration with safe fallback\n * @param themeName - Name of the theme to retrieve\n * @param fallbackTheme - Fallback theme name (default: 'minimal')\n * @returns Theme configuration (guaranteed to be defined)\n * @throws Error if neither theme nor fallback can be found\n */\nexport const getThemeWithFallback = (\n themeName: string,\n fallbackTheme: string = 'minimal'\n): ThemeConfigJson => {\n const theme = getTheme(themeName) || getTheme(fallbackTheme);\n\n if (!theme) {\n throw new Error(\n `Failed to load theme: ${themeName}. Fallback theme '${fallbackTheme}' also not found.`\n );\n }\n\n return theme;\n};\n\n/**\n * Check if a theme exists\n * @param themeName - Name of the theme to check\n * @returns True if theme exists, false otherwise\n */\nexport const hasTheme = (themeName: string): boolean => {\n return themeName in themes;\n};\n\n/**\n * Type guard to ensure theme name is valid\n * @param themeName - Theme name to validate\n * @returns True if theme name exists in registry\n */\nexport const isValidThemeName = (\n themeName: string\n): themeName is keyof typeof themes => {\n return hasTheme(themeName);\n};\n\n/**\n * Get all available theme names\n * @returns Array of theme names\n */\nexport const getThemeNames = (): string[] => {\n return Object.keys(themes);\n};\n\n// Export individual theme configs for direct access\nexport const minimalTheme = themes['minimal'];\nexport const corporateTheme = themes['corporate'];\nexport const modernTheme = themes['modern'];\n","import { ThemeConfig } from '../index';\nimport { getThemeColors } from '../../themes/defaults';\n\nexport type ColorName = keyof ReturnType<typeof getThemeColors>;\n\n// Union type for all valid color names\nexport type ValidColorName =\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'text'\n | 'background'\n | 'textPrimary'\n | 'textSecondary'\n | 'textMuted'\n | 'borderPrimary'\n | 'borderSecondary'\n | 'backgroundPrimary'\n | 'backgroundSecondary';\n\n// Type for color value that can be either a hex string or a color name\nexport type ColorValue = string; // Can be hex color or color name\n\n/**\n * Resolves a color value, which can be either a hex color string or a color name reference\n * @param colorValue - Either a hex color (e.g., '#000000') or a color name (e.g., 'primary')\n * @param theme - The theme configuration containing color definitions\n * @returns The resolved hex color value (6-character hex without #)\n * @throws Error if the color value is invalid\n */\nexport function resolveColor(\n colorValue: ColorValue,\n theme: ThemeConfig\n): string {\n // Check if it's a hex color with # prefix\n if (colorValue.startsWith('#')) {\n const hexValue = colorValue.slice(1);\n if (/^[0-9A-Fa-f]{6}$/.test(hexValue)) {\n return hexValue.toUpperCase(); // Normalize to uppercase\n }\n // Invalid hex format\n throw new Error(\n `Invalid hex color: \"${colorValue}\". Hex colors must be in format #RRGGBB (e.g., \"#000000\").`\n );\n }\n\n // If it's a color name, resolve it from the theme\n const colors = getThemeColors(theme);\n if (colorValue in colors) {\n const resolvedColor = colors[colorValue as ColorName];\n // Recursively resolve in case the theme color is also a reference\n return resolveColor(resolvedColor, theme);\n }\n\n // Strict validation - throw error for invalid colors\n throw new Error(\n `Invalid color value: \"${colorValue}\". Must be a hex color with # prefix (e.g., \"#000000\") or a valid theme color name.`\n );\n}\n\n/**\n * Validates if a color name exists in the theme\n * @param colorName - The color name to validate\n * @param theme - The theme configuration\n * @returns True if the color name exists in the theme\n */\nexport function isValidColorName(\n colorName: string,\n theme: ThemeConfig\n): boolean {\n const colors = getThemeColors(theme);\n return colorName in colors;\n}\n\n/**\n * Gets all available color names from a theme\n * @param theme - The theme configuration\n * @returns Array of valid color names\n */\nexport function getAvailableColorNames(theme: ThemeConfig): string[] {\n const colors = getThemeColors(theme);\n return Object.keys(colors);\n}\n","import { getTheme } from '../../templates/themes';\nimport { ThemeConfig } from '../index';\nimport { resolveColor } from './colorUtils';\nimport { LineSpacing } from '@json-to-office/shared-docx';\nimport { ISpacingProperties } from 'docx';\nimport { getNormalStyle } from '../../themes/defaults';\n\n// Constants for line spacing calculations\nconst TWIPS_PER_POINT = 20;\nconst SINGLE_LINE_SPACING_POINTS = 12;\nconst SINGLE_LINE_SPACING_TWIPS = SINGLE_LINE_SPACING_POINTS * TWIPS_PER_POINT;\nconst DOUBLE_LINE_SPACING_TWIPS = SINGLE_LINE_SPACING_TWIPS * 2;\n\n/**\n * Convert points to twips for docx spacing\n * @param points - Value in points\n * @returns Value in twips (1/20 of a point)\n */\nexport function pointsToTwips(points: number): number {\n return Math.round(points * TWIPS_PER_POINT);\n}\n\n/**\n * Resolve theme configuration from either a theme object or theme name\n * @param theme - Theme configuration object (for custom themes)\n * @param themeName - Theme name (for built-in themes)\n * @returns Resolved theme configuration\n */\nexport function resolveTheme(\n theme?: ThemeConfig,\n themeName?: string\n): ThemeConfig | undefined {\n // First check if we have a theme object passed directly (for custom themes)\n if (theme) {\n return theme;\n }\n\n // If no theme object, check for built-in theme by name\n if (themeName) {\n return getTheme(themeName);\n }\n\n // Default to minimal theme if nothing else works\n return getTheme('minimal');\n}\n\n/**\n * Resolve font family from font reference (e.g., 'body', 'heading') to actual font family name\n * @param theme - Theme configuration object\n * @param fontRef - Font reference ('body', 'heading', 'mono', 'light') or undefined\n * @returns Actual font family name (e.g., 'Arial', 'Helvetica')\n */\nexport function resolveFontFamily(\n theme: ThemeConfig,\n fontRef?: 'heading' | 'body' | 'mono' | 'light'\n): string {\n // Handle empty/invalid themes gracefully\n if (!theme?.fonts?.body?.family) {\n return 'Arial'; // fallback to Arial\n }\n if (!fontRef) {\n return theme.fonts.body.family;\n }\n return theme.fonts[fontRef]?.family || theme.fonts.body.family;\n}\n\n/**\n * Resolve font size from font reference (e.g., 'body', 'heading') to actual font size in points\n * @param theme - Theme configuration object\n * @param fontRef - Font reference ('body', 'heading', 'mono', 'light') or undefined\n * @returns Font size in points (callers multiply by 2 for docx) or undefined if no size found\n */\nexport function resolveFontSize(\n theme: ThemeConfig,\n fontRef?: 'heading' | 'body' | 'mono' | 'light'\n): number | undefined {\n // Handle empty/invalid themes gracefully\n if (!theme?.fonts?.body?.size) {\n return undefined; // let caller handle fallback\n }\n if (!fontRef) {\n return theme.fonts.body.size;\n }\n return theme.fonts[fontRef]?.size || theme.fonts.body.size;\n}\n\n/**\n * Font properties that can be defined in font definitions\n */\nexport interface FontProperties {\n family?: string;\n size?: number;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n lineSpacing?: {\n type: 'single' | 'atLeast' | 'exactly' | 'double' | 'multiple';\n value?: number;\n };\n spacing?: {\n before?: number;\n after?: number;\n };\n characterSpacing?: { type: 'condensed' | 'expanded'; value: number };\n}\n\n/**\n * Resolve all font properties from font reference.\n * Returns all formatting properties defined in the font definition.\n * @param theme - Theme configuration object\n * @param fontRef - Font reference ('body', 'heading', 'mono', 'light') or undefined\n * @returns Object containing all font properties\n */\nexport function resolveFontProperties(\n theme: ThemeConfig,\n fontRef?: 'heading' | 'body' | 'mono' | 'light'\n): FontProperties {\n // Default to body font if no reference provided\n const targetFontKey = fontRef || 'body';\n\n // Handle empty/invalid themes gracefully\n if (!theme?.fonts?.[targetFontKey]) {\n return {\n family: 'Arial',\n size: 11,\n };\n }\n\n const fontDef = theme.fonts[targetFontKey] as FontProperties;\n\n return {\n family: fontDef.family,\n size: fontDef.size,\n color: fontDef.color,\n bold: fontDef.bold,\n italic: fontDef.italic,\n underline: fontDef.underline,\n alignment: fontDef.alignment,\n lineSpacing: fontDef.lineSpacing,\n spacing: fontDef.spacing,\n characterSpacing: fontDef.characterSpacing,\n };\n}\n\n/**\n * Merge font properties with style overrides.\n * Style properties take precedence over font properties.\n * Only defined (non-undefined) style properties override font properties.\n * @param fontProps - Properties from font definition\n * @param styleOverrides - Properties from style definition\n * @returns Merged properties object\n */\nexport function mergeFontAndStyleProperties<T extends Partial<FontProperties>>(\n fontProps: FontProperties,\n styleOverrides: T\n): FontProperties & T {\n // Filter out undefined values from styleOverrides to prevent overwriting font properties\n // Use type-safe Object.entries approach\n const definedOverrides = Object.entries(styleOverrides).reduce<\n Record<string, unknown>\n >((acc, [key, value]) => {\n if (value !== undefined) {\n acc[key] = value;\n }\n return acc;\n }, {});\n\n return {\n ...fontProps,\n ...definedOverrides,\n } as FontProperties & T;\n}\n\n/**\n * Get body text style configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Style configuration object\n */\nexport const getBodyTextStyle = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n\n if (themeConfig) {\n const normalStyle = getNormalStyle(themeConfig);\n return {\n size: (normalStyle.size || 11) * 2,\n font: resolveFontFamily(themeConfig, normalStyle.font),\n color: normalStyle.color\n ? resolveColor(normalStyle.color, themeConfig)\n : '000000',\n };\n }\n\n // Fallback\n return {\n size: 20,\n font: 'Arial',\n color: '000000',\n };\n};\n\n/**\n * Converts line spacing from theme definition to DOCX spacing options.\n * DOCX uses twips (1/20th of a point) for line spacing.\n * @param lineSpacing The line spacing object from the theme definition.\n * @returns IParagraphSpacingOptions for docx.\n */\nexport function convertLineSpacing(\n lineSpacing?: LineSpacing | number\n): ISpacingProperties | undefined {\n if (lineSpacing === undefined) {\n return undefined;\n }\n\n // Handle number (simple multiplier) case\n if (typeof lineSpacing === 'number') {\n return {\n line: Math.round(lineSpacing * SINGLE_LINE_SPACING_TWIPS),\n lineRule: 'auto',\n };\n }\n\n const { type, value } = lineSpacing;\n let line: number | undefined;\n let lineRule: 'auto' | 'exact' | 'atLeast' | undefined;\n\n switch (type) {\n case 'single':\n line = SINGLE_LINE_SPACING_TWIPS;\n lineRule = 'auto';\n break;\n case 'double':\n line = DOUBLE_LINE_SPACING_TWIPS;\n lineRule = 'auto';\n break;\n case 'atLeast':\n line = value !== undefined ? value * TWIPS_PER_POINT : undefined;\n lineRule = 'atLeast';\n break;\n case 'exactly':\n line = value !== undefined ? value * TWIPS_PER_POINT : undefined;\n lineRule = 'exact';\n break;\n case 'multiple':\n line =\n value !== undefined ? value * SINGLE_LINE_SPACING_TWIPS : undefined;\n lineRule = 'auto';\n break;\n default:\n return undefined;\n }\n\n return { line, lineRule };\n}\n","import { BorderStyle } from 'docx';\nimport { ThemeConfig } from '../index';\nimport { resolveColor } from './colorUtils';\nimport { resolveTheme, resolveFontFamily } from './styleHelpers';\n\n/**\n * Standard page sizes in twips (1/20 of a point, 1/1440 of an inch)\n */\nconst PAGE_SIZES = {\n A4: { width: 11906, height: 16838 },\n A3: { width: 16838, height: 23811 },\n LETTER: { width: 12240, height: 15840 },\n LEGAL: { width: 12240, height: 20160 },\n} as const;\n\n/**\n * Get page dimensions from size (string or object)\n */\nfunction getPageDimensions(\n size: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number }\n): { width: number; height: number } {\n if (typeof size === 'string') {\n return PAGE_SIZES[size];\n }\n return size;\n}\n\n/**\n * Get table style configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Table style configuration object\n */\nexport const getTableStyle = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n\n if (themeConfig && themeConfig.styles?.normal) {\n // Use normal style for both header and cell since tableHeader/tableCell styles are removed\n const normalStyle = themeConfig.styles.normal;\n return {\n tableHeader: {\n fill: resolveColor(\n themeConfig.colors?.primary || '#000000',\n themeConfig\n ),\n color: resolveColor(\n themeConfig.colors?.backgroundPrimary || '#FFFFFF',\n themeConfig\n ), // Use background color for header text\n bold: true, // Headers should be bold\n size: (normalStyle.size || 11) * 2, // Convert to half-points\n font: resolveFontFamily(themeConfig, normalStyle.font),\n },\n tableCell: {\n color: resolveColor(normalStyle.color || '#000000', themeConfig),\n size: (normalStyle.size || 11) * 2, // Convert to half-points\n font: resolveFontFamily(themeConfig, normalStyle.font),\n },\n alternatingRow: {\n fill: resolveColor(\n themeConfig.colors?.accent || '#F0F0F0',\n themeConfig\n ),\n },\n borders: {\n top: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n bottom: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n left: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n right: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: resolveColor(\n themeConfig.colors?.secondary || '#CCCCCC',\n themeConfig\n ),\n },\n },\n };\n }\n\n // This shouldn't happen with minimal themes\n return {\n tableHeader: {\n fill: '000000',\n color: 'FFFFFF',\n bold: true,\n size: 22,\n font: 'Arial',\n },\n tableCell: {\n color: '000000',\n size: 20,\n font: 'Arial',\n },\n alternatingRow: {\n fill: 'F5F5F5',\n },\n borders: {\n top: { style: BorderStyle.SINGLE, size: 1, color: '000000' },\n bottom: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: '000000',\n },\n left: { style: BorderStyle.SINGLE, size: 1, color: '000000' },\n right: {\n style: BorderStyle.SINGLE,\n size: 1,\n color: '000000',\n },\n },\n };\n};\n\n/**\n * Get document margins configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Document margins object\n */\nexport const getDocumentMargins = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n\n if (themeConfig?.page?.margins) {\n return themeConfig.page.margins;\n }\n\n // Default margins for all themes (standard Word document margins)\n return {\n top: 1440, // 1 inch in twips\n right: 1440, // 1 inch in twips\n bottom: 1440, // 1 inch in twips\n left: 1440, // 1 inch in twips\n header: 720, // 0.5 inch in twips\n footer: 720, // 0.5 inch in twips\n };\n};\n\n/**\n * Get page setup configuration\n * @param theme - Theme configuration object\n * @param themeName - Name of the theme (for fallback to built-in themes)\n * @returns Page setup object\n */\nexport const getPageSetup = (theme?: ThemeConfig, themeName?: string) => {\n const themeConfig = resolveTheme(theme, themeName);\n const defaultMargins = getDocumentMargins(theme, themeName);\n\n if (themeConfig?.page) {\n const margins = themeConfig.page.margins || {};\n const dimensions = getPageDimensions(themeConfig.page.size);\n return {\n size: {\n width: dimensions.width,\n height: dimensions.height,\n },\n margin: {\n top: margins.top ?? defaultMargins.top ?? 1440,\n right: margins.right ?? defaultMargins.right ?? 1440,\n bottom: margins.bottom ?? defaultMargins.bottom ?? 1440,\n left: margins.left ?? defaultMargins.left ?? 1440,\n },\n };\n }\n\n // Default page setup for all themes\n return {\n size: {\n width: 11906, // 8.5 inches in twips (Letter size)\n height: 16838, // 11.7 inches in twips (Letter size)\n },\n margin: {\n top: defaultMargins.top ?? 1440,\n right: defaultMargins.right ?? 1440,\n bottom: defaultMargins.bottom ?? 1440,\n left: defaultMargins.left ?? 1440,\n },\n };\n};\n","/**\n * Theme Parser using unified validation (TypeBox under the hood)\n */\n\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { validateThemeJson } from '@json-to-office/shared-docx/validation/unified';\nimport type { ValidationError } from '@json-to-office/shared-docx/validation/unified';\nimport { ensureThemeDefaults } from '../../themes/defaults';\n\n// Custom error classes with enhanced error details\nexport class ThemeValidationError extends Error {\n constructor(public errors: ValidationError[]) {\n const errorCount = errors.length;\n const errorSummary = errors\n .slice(0, 3)\n .map((error) => {\n const path = error.path\n ? error.path.replace(/^\\//, '').replace(/\\//g, '.')\n : '';\n const pathStr = path ? `${path}: ` : '';\n return `${pathStr}${error.message}`;\n })\n .join('; ');\n\n super(\n `Theme validation failed with ${errorCount} error${errorCount > 1 ? 's' : ''}: ${errorSummary}${errorCount > 3 ? '...' : ''}`\n );\n this.name = 'ThemeValidationError';\n }\n\n getDetailedErrors(): string[] {\n return this.errors.map((error) => {\n const path = error.path\n ? error.path.replace(/^\\//, '').replace(/\\//g, '.')\n : '';\n const pathStr = path ? `${path}: ` : '';\n return `${pathStr}${error.message}`;\n });\n }\n}\n\nexport class ThemeParseError extends Error {\n constructor(\n message: string,\n public cause?: Error\n ) {\n super(`Failed to parse theme: ${message}`);\n this.name = 'ThemeParseError';\n }\n}\n\n// Theme parser class with comprehensive validation and error handling\nexport class ThemeParser {\n private readonly MAX_JSON_SIZE = 1024 * 1024; // 1MB limit (pre-parse guard)\n\n parse(jsonString: string): ThemeConfigJson {\n try {\n // Input validation and sanitization\n this.validateInput(jsonString);\n\n // Use unified validator (handles parsing + position calculation)\n const result = validateThemeJson(jsonString);\n if (!result.valid) {\n throw new ThemeValidationError(result.errors || []);\n }\n\n const validated = result.data as ThemeConfigJson;\n\n // Apply defaults and return ThemeConfig\n return this.applyDefaults(validated);\n } catch (error) {\n if (\n error instanceof ThemeValidationError ||\n error instanceof ThemeParseError\n ) {\n throw error;\n }\n throw new ThemeParseError(\n `Unexpected error during theme parsing: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n private validateInput(jsonString: string): void {\n // Check for null/undefined\n if (!jsonString) {\n throw new ThemeParseError('JSON string cannot be null or empty');\n }\n\n // Check string type\n if (typeof jsonString !== 'string') {\n throw new ThemeParseError('Input must be a string');\n }\n\n // Check size limits (additional robustness guard)\n if (jsonString.length > this.MAX_JSON_SIZE) {\n throw new ThemeParseError(\n `JSON string too large (${jsonString.length} bytes, max ${this.MAX_JSON_SIZE} bytes)`\n );\n }\n }\n\n private applyDefaults(parsedTheme: ThemeConfigJson): ThemeConfigJson {\n // Apply defaults to ensure all required properties are present\n // This handles partial theme configurations by merging with defaults\n return ensureThemeDefaults(parsedTheme);\n }\n\n // Utility method for validating without parsing\n validate(jsonString: string): { valid: boolean; errors?: string[] } {\n try {\n this.validateInput(jsonString);\n const result = validateThemeJson(jsonString);\n\n if (result.valid) {\n return { valid: true };\n } else {\n const errors = (result.errors || []).map((e) => {\n const path = e.path\n ? e.path.replace(/^\\//, '').replace(/\\//g, '.')\n : '';\n const pathStr = path ? `${path}: ` : '';\n return `${pathStr}${e.message}`;\n });\n return { valid: false, errors };\n }\n } catch (error) {\n return {\n valid: false,\n errors: [\n error instanceof Error ? error.message : 'Unknown validation error',\n ],\n };\n }\n }\n}\n","/**\n * Theme Validator - thin wrapper over shared unified validator\n * Maintains backward-compatible API while removing duplicate logic\n */\n\nimport { validateThemeJson as validateThemeJsonUnified } from '@json-to-office/shared-docx/validation/unified';\n\n// Backward-compatible ValidationResult type used by core\nexport type ValidationResult = {\n success: boolean;\n error?: {\n issues: Array<{\n code: string;\n message: string;\n path: Array<string | number>;\n expected?: string;\n received?: string;\n type?: string;\n minimum?: number;\n maximum?: number;\n validation?: string;\n options?: string[];\n line?: number;\n column?: number;\n }>;\n };\n};\n\n// Validator function using unified shared validation\nexport function validateThemeJson(jsonString: string): ValidationResult {\n const result = validateThemeJsonUnified(jsonString);\n\n if (result.valid) {\n return { success: true };\n }\n\n const issues = (result.errors || []).map((e) => {\n const pathArray = (e.path || '')\n .split('/')\n .filter((p) => p)\n .map((p) => {\n const num = parseInt(p, 10);\n return isNaN(num) ? p : num;\n });\n\n return {\n code: e.code || 'validation_error',\n message: e.message,\n path: pathArray,\n line: e.line,\n column: e.column,\n };\n });\n\n return { success: false, error: { issues } };\n}\n\nexport function formatValidationErrors(error: {\n issues: Array<any>;\n}): string[] {\n return error.issues.map((issue) => {\n const path =\n issue.path && issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';\n let message = issue.message;\n // Keep messages simple; unified validator already includes good messages\n return `${path}${message}`;\n });\n}\n\nexport function isValidThemeJson(jsonString: string): boolean {\n const result = validateThemeJson(jsonString);\n return result.success;\n}\n\nexport function getValidationSummary(jsonString: string): {\n valid: boolean;\n errorCount: number;\n errors: string[];\n summary: string;\n} {\n const result = validateThemeJson(jsonString);\n\n if (result.success) {\n return {\n valid: true,\n errorCount: 0,\n errors: [],\n summary: 'Theme JSON is valid',\n };\n }\n\n const errors = formatValidationErrors(result.error!);\n const errorCount = errors.length;\n\n return {\n valid: false,\n errorCount,\n errors,\n summary: `Theme validation failed with ${errorCount} error${errorCount > 1 ? 's' : ''}`,\n };\n}\n","import { promises as fs } from 'fs';\nimport { normalize } from 'path';\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { ThemeParser } from './parser';\n\n// File system error class with enhanced error details\nexport class ThemeFileError extends Error {\n constructor(\n message: string,\n public path?: string,\n public _cause?: Error\n ) {\n const pathInfo = path ? ` (path: ${path})` : '';\n super(`Failed to load theme file: ${message}${pathInfo}`);\n this.name = 'ThemeFileError';\n }\n}\n\n// Theme loader class with comprehensive security and error handling\nexport class ThemeLoader {\n private parser = new ThemeParser();\n private readonly MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB limit\n private readonly ALLOWED_EXTENSIONS = ['.json'];\n\n async loadFromFile(filePath: string): Promise<ThemeConfigJson> {\n try {\n // Validate file path for security\n this.validateFilePath(filePath);\n\n // Read file with size limits\n const content = await this.readFileWithLimits(filePath);\n\n // Parse the theme content\n return this.parser.parse(content);\n } catch (error) {\n if (error instanceof ThemeFileError) {\n throw error;\n }\n\n // Handle file system errors\n if (error && typeof error === 'object' && 'code' in error) {\n const fsError = error as { code?: string; message: string };\n let message: string;\n\n switch (fsError.code) {\n case 'ENOENT':\n message = 'File not found';\n break;\n case 'EACCES':\n message = 'Permission denied';\n break;\n case 'EISDIR':\n message = 'Path is a directory, not a file';\n break;\n case 'EMFILE':\n case 'ENFILE':\n message = 'Too many open files';\n break;\n case 'ENOTDIR':\n message = 'Directory in path does not exist';\n break;\n default:\n message = `File system error: ${fsError.message}`;\n }\n\n throw new ThemeFileError(\n message,\n filePath,\n error instanceof Error ? error : undefined\n );\n }\n\n // Handle other errors\n throw new ThemeFileError(\n `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,\n filePath,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n async loadFromUrl(_url: string): Promise<ThemeConfigJson> {\n // Future enhancement for loading themes from URLs\n // Would need additional dependencies (fetch) and security considerations\n throw new ThemeFileError(\n 'URL loading not yet implemented - use loadFromFile() instead'\n );\n }\n\n private validateFilePath(filePath: string): void {\n // Basic input validation\n if (!filePath || typeof filePath !== 'string') {\n throw new ThemeFileError('File path must be a non-empty string');\n }\n\n // Normalize the path to handle different separators and relative paths\n const normalizedPath = normalize(filePath);\n\n // Check for directory traversal attempts\n if (normalizedPath.includes('..')) {\n throw new ThemeFileError('Directory traversal is not allowed', filePath);\n }\n\n // Check for null bytes (path injection)\n if (normalizedPath.includes('\\0')) {\n throw new ThemeFileError(\n 'Null bytes in file path are not allowed',\n filePath\n );\n }\n\n // Validate file extension\n const hasValidExtension = this.ALLOWED_EXTENSIONS.some((ext) =>\n normalizedPath.toLowerCase().endsWith(ext)\n );\n\n if (!hasValidExtension) {\n throw new ThemeFileError(\n `Invalid file extension. Allowed: ${this.ALLOWED_EXTENSIONS.join(', ')}`,\n filePath\n );\n }\n\n // Additional security: ensure path is reasonable length\n if (normalizedPath.length > 1000) {\n throw new ThemeFileError('File path is too long', filePath);\n }\n }\n\n private async readFileWithLimits(filePath: string): Promise<string> {\n try {\n // Get file stats to check size before reading\n const stats = await fs.stat(filePath);\n\n // Check if it's actually a file\n if (!stats.isFile()) {\n throw new ThemeFileError('Path is not a regular file', filePath);\n }\n\n // Check file size limits\n if (stats.size > this.MAX_FILE_SIZE) {\n throw new ThemeFileError(\n `File too large (${stats.size} bytes, max ${this.MAX_FILE_SIZE} bytes)`,\n filePath\n );\n }\n\n // Check for empty file\n if (stats.size === 0) {\n throw new ThemeFileError('File is empty', filePath);\n }\n\n // Read file with proper encoding\n const content = await fs.readFile(filePath, 'utf8');\n\n // Verify content was read properly\n if (typeof content !== 'string') {\n throw new ThemeFileError('Failed to read file as text', filePath);\n }\n\n return content;\n } catch (error) {\n if (error instanceof ThemeFileError) {\n throw error;\n }\n\n // Re-throw as ThemeFileError for consistent error handling\n throw new ThemeFileError(\n `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,\n filePath,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n // Utility method to validate a file path without reading\n validateFile(filePath: string): { valid: boolean; error?: string } {\n try {\n this.validateFilePath(filePath);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n error:\n error instanceof Error ? error.message : 'Unknown validation error',\n };\n }\n }\n\n // Utility method to get file info\n async getFileInfo(filePath: string): Promise<{\n exists: boolean;\n size?: number;\n isFile?: boolean;\n error?: string;\n }> {\n try {\n const stats = await fs.stat(filePath);\n return {\n exists: true,\n size: stats.size,\n isFile: stats.isFile(),\n };\n } catch (error) {\n return {\n exists: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n","// Public API exports for JSON theme system\nexport {\n ThemeConfigSchema,\n type ThemeConfigJson,\n isValidThemeConfig,\n} from '@json-to-office/shared-docx';\nexport { ThemeParser, ThemeValidationError, ThemeParseError } from './parser';\nexport {\n validateThemeJson,\n formatValidationErrors,\n type ValidationResult,\n} from './validator';\nexport { ThemeLoader, ThemeFileError } from './loader';\n\n// Main API functions - Core public interface for JSON theme system\nimport type { ThemeConfigJson } from '@json-to-office/shared-docx';\nimport { ThemeParser } from './parser';\nimport { ThemeLoader } from './loader';\n\n// Global instances for consistent behavior\nconst themeParser = new ThemeParser();\nconst themeLoader = new ThemeLoader();\n\n/**\n * Load and parse a theme from a JSON string\n * @param jsonString - JSON string containing theme definition\n * @returns Promise<ThemeConfig> - Parsed and validated theme configuration\n * @throws ThemeParseError - If JSON is malformed or invalid\n * @throws ThemeValidationError - If theme fails schema validation\n */\nexport async function loadThemeFromJson(\n jsonString: string\n): Promise<ThemeConfigJson> {\n return themeParser.parse(jsonString);\n}\n\n/**\n * Load and parse a theme from a JSON file\n * @param filePath - Path to JSON file containing theme definition\n * @returns Promise<ThemeConfig> - Parsed and validated theme configuration\n * @throws ThemeFileError - If file cannot be read or path is invalid\n * @throws ThemeParseError - If JSON is malformed or invalid\n * @throws ThemeValidationError - If theme fails schema validation\n */\nexport async function loadThemeFromFile(\n filePath: string\n): Promise<ThemeConfigJson> {\n return themeLoader.loadFromFile(filePath);\n}\n\n/**\n * Export a theme configuration to JSON string\n * @param theme - Theme configuration to export\n * @param pretty - Whether to format JSON with indentation (default: true)\n * @returns string - Formatted JSON string\n */\nexport function exportThemeToJson(\n theme: ThemeConfigJson,\n pretty: boolean = true\n): string {\n try {\n // Since ThemeConfig is inferred from TypeBox schema, it can be directly serialized\n // The schema ensures all properties are JSON-serializable\n\n if (pretty) {\n return JSON.stringify(theme, null, 2);\n } else {\n return JSON.stringify(theme);\n }\n } catch (error) {\n throw new Error(\n `Failed to export theme to JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Validate a JSON string against the theme schema without parsing\n * @param jsonString - JSON string to validate\n * @returns Validation result with success status and detailed errors\n */\nexport function validateThemeJsonString(jsonString: string) {\n return themeParser.validate(jsonString);\n}\n\n/**\n * Create a minimal theme template for users to start with\n * @returns ThemeConfig - Basic theme with required properties\n */\nexport function createMinimalTheme(): ThemeConfigJson {\n return {\n name: 'minimal-theme',\n displayName: 'Minimal Theme',\n description: 'A minimal theme with basic styling',\n version: '1.0.0',\n colors: {\n primary: '2563EB',\n secondary: '64748B',\n accent: 'F8FAFC',\n text: '334155',\n background: 'FFFFFF',\n border: '334155',\n textPrimary: '334155',\n textSecondary: '64748B',\n textMuted: '94A3B8',\n borderPrimary: '334155',\n borderSecondary: '64748B',\n backgroundPrimary: 'FFFFFF',\n backgroundSecondary: 'F8FAFC',\n },\n fonts: {\n heading: { family: 'Arial', size: 14 },\n body: { family: 'Arial', size: 11 },\n mono: { family: 'Courier New', size: 10 },\n light: { family: 'Arial', size: 10 },\n },\n page: {\n size: 'A4',\n margins: {\n top: 1440,\n bottom: 1440,\n left: 1440,\n right: 1440,\n header: 720,\n footer: 720,\n gutter: 0,\n },\n },\n styles: {\n normal: {\n font: 'body',\n size: 11,\n color: '334155',\n alignment: 'left',\n lineSpacing: { type: 'multiple', value: 1.15 },\n spacing: { after: 8 },\n },\n },\n };\n}\n","/**\n * Main styles module export\n * This file provides a unified interface to the styles system\n */\n\n// Base configurations - imported from TypeBox schemas\nexport type {\n ThemeConfigJson as ThemeConfig,\n StyleDefinitions,\n DocumentMargins,\n PageDimensions,\n Page,\n FontDefinition,\n Fonts,\n ComponentDefaults,\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n} from '@json-to-office/shared-docx';\nexport {\n themes,\n getTheme,\n getThemeNames,\n getThemeWithFallback,\n hasTheme,\n isValidThemeName,\n} from '../templates/themes';\n\n// Export ThemeName type separately\nexport type { ThemeName } from '../templates/themes';\n\n// Style utilities\nexport { getBodyTextStyle } from './utils/styleHelpers';\nexport {\n getTableStyle,\n getDocumentMargins,\n getPageSetup,\n} from './utils/layoutUtils';\n\n// Theme configurations\nexport {\n minimalTheme,\n corporateTheme,\n modernTheme,\n} from '../templates/themes';\n\n// JSON Theme System (Phase 1 - Foundation complete)\nexport {\n ThemeConfigSchema,\n isValidThemeConfig,\n loadThemeFromJson,\n loadThemeFromFile,\n exportThemeToJson,\n validateThemeJsonString,\n ThemeValidationError,\n ThemeParseError,\n ThemeFileError,\n} from '../themes/json';\n\n// Export type separately\nexport type { ThemeConfigJson } from '../themes/json';\n\n// All themes now use the same structure\n// No need for backward compatibility exports\n","import { ThemeConfig } from '../styles';\nimport { getPageSetup } from '../styles';\nimport { pointsToTwips } from '../styles/utils/styleHelpers';\n\n/**\n * Compute available page width in twips (page width minus left/right margins)\n */\nexport function getAvailableWidthTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n const width = page?.size?.width || 0;\n const left = page?.margin?.left || 0;\n const right = page?.margin?.right || 0;\n return Math.max(0, width - left - right);\n}\n\n/**\n * Compute full page width in twips (ignores margins)\n */\nexport function getPageWidthTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n return page?.size?.width || 0;\n}\n\n/**\n * Compute available page height in twips (page height minus top/bottom margins)\n */\nexport function getAvailableHeightTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n const height = page?.size?.height || 0;\n const top = page?.margin?.top || 0;\n const bottom = page?.margin?.bottom || 0;\n return Math.max(0, height - top - bottom);\n}\n\n/**\n * Compute full page height in twips (ignores margins)\n */\nexport function getPageHeightTwips(\n theme?: ThemeConfig,\n themeName?: string\n): number {\n const page = getPageSetup(theme, themeName);\n return page?.size?.height || 0;\n}\n\n/**\n * Parse a percentage string like \"75%\" into a fraction 0..1\n */\nexport function parsePercentageStringToFraction(\n value: string\n): number | undefined {\n const match = /^([0-9]+(?:\\.[0-9]+)?)%$/.exec(value);\n if (!match) return undefined;\n const pct = parseFloat(match[1]);\n if (pct < 0 || pct > 100) return undefined;\n return pct / 100;\n}\n\n/**\n * Convert a numeric (points) or percentage string to twips using available width\n */\nexport function relativeLengthToTwips(\n value: number | string,\n availableWidthTwips: number\n): number {\n if (typeof value === 'number') {\n return pointsToTwips(value);\n }\n const fraction = parsePercentageStringToFraction(value);\n if (fraction === undefined) return 0;\n return Math.round(availableWidthTwips * fraction);\n}\n","import { readFileSync } from 'fs';\nimport probe from 'probe-image-size';\nimport { parsePercentageStringToFraction } from './widthUtils';\n\nexport interface ImageDimensions {\n width: number;\n height: number;\n}\n\nexport interface CalculatedDimensions {\n width: number;\n height: number;\n}\n\n/**\n * Parse width value - accepts either number (pixels) or percentage string\n * @param width - Width value as number or percentage string (e.g., \"90%\")\n * @param availableWidthPx - Available document width in pixels\n * @returns Width in pixels\n */\nexport function parseWidthValue(\n width: number | string,\n availableWidthPx: number\n): number {\n if (typeof width === 'number') {\n return width;\n }\n\n // Parse percentage string using shared util while preserving error semantics\n const percentageMatch = (width as string).match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percentageMatch) {\n const pct = parseFloat(percentageMatch[1]);\n if (pct < 0 || pct > 100) {\n throw new Error(\n `Invalid percentage value: ${width}. Must be between 0% and 100%`\n );\n }\n const fraction = parsePercentageStringToFraction(width as string);\n if (fraction !== undefined) {\n return Math.round(availableWidthPx * fraction);\n }\n }\n\n throw new Error(\n `Invalid width value: ${width}. Expected number (pixels) or percentage string (e.g., \"90%\")`\n );\n}\n\n/**\n * Parse a generic dimension value (number in px or percentage string)\n * @param value - numeric pixels or percentage string (e.g., \"100%\")\n * @param availablePx - available pixels for percentage reference\n */\nexport function parseDimensionValue(\n value: number | string,\n availablePx: number\n): number {\n if (typeof value === 'number') return value;\n const percentageMatch = (value as string).match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percentageMatch) {\n const pct = parseFloat(percentageMatch[1]);\n if (pct < 0 || pct > 100) {\n throw new Error(\n `Invalid percentage value: ${value}. Must be between 0% and 100%`\n );\n }\n const fraction = parsePercentageStringToFraction(value as string);\n if (fraction !== undefined) return Math.round(availablePx * fraction);\n }\n throw new Error(\n `Invalid dimension value: ${value}. Expected number (pixels) or percentage string (e.g., \"90%\")`\n );\n}\n\n/**\n * Check if a string is a valid URL\n */\nexport function isValidUrl(string: string): boolean {\n try {\n const url = new URL(string);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a string is a base64 data URI\n * Supports format: data:image/[type];base64,[data]\n */\nexport function isBase64Image(string: string): boolean {\n return /^data:image\\/[a-zA-Z+]+;base64,/.test(string);\n}\n\n/**\n * Decode base64 data URI to Buffer\n * @param dataUri - Base64 data URI (e.g., \"data:image/png;base64,iVBORw0KGgo...\")\n * @returns Decoded image buffer\n */\nexport function decodeBase64Image(dataUri: string): Buffer {\n try {\n // Extract the base64 data after the comma\n const base64Data = dataUri.split(',')[1];\n if (!base64Data) {\n throw new Error('Invalid base64 data URI format');\n }\n return Buffer.from(base64Data, 'base64');\n } catch (error) {\n throw new Error(\n `Failed to decode base64 image: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Extract MIME type from base64 data URI\n * @param dataUri - Base64 data URI (e.g., \"data:image/svg+xml;base64,...\")\n * @returns MIME type (e.g., \"image/svg+xml\") or undefined if not found\n */\nexport function extractMimeTypeFromDataUri(\n dataUri: string\n): string | undefined {\n const match = dataUri.match(/^data:(image\\/[a-zA-Z0-9+.-]+);base64,/);\n return match ? match[1] : undefined;\n}\n\n/**\n * Detect image type from file extension\n * @param path - File path or URL\n * @returns Image type (jpg, png, gif, bmp, svg) or undefined\n */\nexport function detectImageTypeFromExtension(\n path: string\n): 'jpg' | 'png' | 'gif' | 'bmp' | 'svg' | undefined {\n const extension = path.toLowerCase().split('.').pop()?.split('?')[0]; // Handle query params in URLs\n switch (extension) {\n case 'jpg':\n case 'jpeg':\n return 'jpg';\n case 'png':\n return 'png';\n case 'gif':\n return 'gif';\n case 'bmp':\n return 'bmp';\n case 'svg':\n return 'svg';\n default:\n return undefined;\n }\n}\n\n/**\n * Detect image type from MIME type\n * @param mimeType - MIME type string (e.g., \"image/svg+xml\", \"image/png\")\n * @returns Image type (jpg, png, gif, bmp, svg) or undefined\n */\nexport function detectImageTypeFromMimeType(\n mimeType: string\n): 'jpg' | 'png' | 'gif' | 'bmp' | 'svg' | undefined {\n const normalized = mimeType.toLowerCase();\n if (normalized.includes('svg')) return 'svg';\n if (normalized.includes('jpeg') || normalized.includes('jpg')) return 'jpg';\n if (normalized.includes('png')) return 'png';\n if (normalized.includes('gif')) return 'gif';\n if (normalized.includes('bmp')) return 'bmp';\n return undefined;\n}\n\n/**\n * Detect image type from path or base64 data URI\n * Prioritizes: MIME type from base64 > file extension > default to 'png'\n * @param imagePath - File path, URL, or base64 data URI\n * @returns Image type (jpg, png, gif, bmp, svg)\n */\nexport function detectImageType(\n imagePath: string\n): 'jpg' | 'png' | 'gif' | 'bmp' | 'svg' {\n // Check if it's a base64 data URI and extract MIME type\n if (isBase64Image(imagePath)) {\n const mimeType = extractMimeTypeFromDataUri(imagePath);\n if (mimeType) {\n const typeFromMime = detectImageTypeFromMimeType(mimeType);\n if (typeFromMime) return typeFromMime;\n }\n }\n\n // Try to detect from file extension\n const typeFromExtension = detectImageTypeFromExtension(imagePath);\n if (typeFromExtension) return typeFromExtension;\n\n // Default to PNG for backward compatibility\n return 'png';\n}\n\n/**\n * Download image from URL and return buffer\n * Uses native fetch with automatic redirect following and proper headers\n */\nexport async function downloadImageFromUrl(url: string): Promise<Buffer> {\n try {\n // Create an AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n const response = await fetch(url, {\n signal: controller.signal,\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; json-to-docx/1.0)',\n },\n redirect: 'follow', // Automatically follow redirects (default behavior)\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download image: HTTP ${response.status} ${response.statusText}`\n );\n }\n\n // Get the response as an ArrayBuffer\n const arrayBuffer = await response.arrayBuffer();\n\n // Convert ArrayBuffer to Buffer\n return Buffer.from(arrayBuffer);\n } catch (error) {\n if (error instanceof Error) {\n // Handle timeout errors\n if (error.name === 'AbortError') {\n throw new Error(\n 'Failed to download image: Request timeout after 10 seconds'\n );\n }\n throw new Error(`Failed to download image from ${url}: ${error.message}`);\n }\n throw new Error(`Failed to download image from ${url}: Unknown error`);\n }\n}\n\n/**\n * Get image buffer from base64 data URI, URL, or local file\n */\nexport async function getImageBuffer(imagePath: string): Promise<Buffer> {\n // Check for base64 data URI first\n if (isBase64Image(imagePath)) {\n return decodeBase64Image(imagePath);\n }\n // Check for URL\n if (isValidUrl(imagePath)) {\n return await downloadImageFromUrl(imagePath);\n }\n // Otherwise treat as local file path\n return readFileSync(imagePath);\n}\n\n/**\n * Get the dimensions of an image file or URL\n */\nexport async function getImageDimensions(\n imagePath: string\n): Promise<ImageDimensions> {\n try {\n const imageBuffer = await getImageBuffer(imagePath);\n const result = probe.sync(imageBuffer);\n\n if (!result) {\n throw new Error(`Unable to determine dimensions for image: ${imagePath}`);\n }\n\n return {\n width: result.width,\n height: result.height,\n };\n } catch (error) {\n throw new Error(\n `Error reading image dimensions from ${imagePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Calculate missing dimension while preserving aspect ratio\n */\nexport function calculateMissingDimension(\n originalWidth: number,\n originalHeight: number,\n targetWidth?: number,\n targetHeight?: number\n): CalculatedDimensions {\n if (targetWidth && targetHeight) {\n // Both dimensions provided, use as-is\n return { width: targetWidth, height: targetHeight };\n }\n\n const aspectRatio = originalWidth / originalHeight;\n\n if (targetWidth && !targetHeight) {\n // Width provided, calculate height\n return {\n width: targetWidth,\n height: Math.round(targetWidth / aspectRatio),\n };\n }\n\n if (!targetWidth && targetHeight) {\n // Height provided, calculate width\n return {\n width: Math.round(targetHeight * aspectRatio),\n height: targetHeight,\n };\n }\n\n // Neither provided, return original dimensions\n return { width: originalWidth, height: originalHeight };\n}\n\n/**\n * Calculate image dimensions with aspect ratio preservation and fallback constraints\n */\nexport async function calculateImageDimensions(\n imagePath: string,\n targetWidth?: number,\n targetHeight?: number,\n fallbackWidth: number = 300,\n fallbackHeight: number = 180\n): Promise<CalculatedDimensions> {\n try {\n const originalDimensions = await getImageDimensions(imagePath);\n return calculateMissingDimension(\n originalDimensions.width,\n originalDimensions.height,\n targetWidth,\n targetHeight\n );\n } catch (error) {\n // If we can't read the image, use fallback logic\n if (targetWidth && targetHeight) {\n return { width: targetWidth, height: targetHeight };\n }\n\n if (targetWidth && !targetHeight) {\n // Use a default aspect ratio (16:9) for fallback\n return { width: targetWidth, height: Math.round((targetWidth * 9) / 16) };\n }\n\n if (!targetWidth && targetHeight) {\n // Use a default aspect ratio (16:9) for fallback\n return {\n width: Math.round((targetHeight * 16) / 9),\n height: targetHeight,\n };\n }\n\n // No dimensions provided and can't read image, use fallback\n return { width: fallbackWidth, height: fallbackHeight };\n }\n}\n","import {\n TextWrappingType,\n TextWrappingSide,\n HorizontalPositionRelativeFrom,\n VerticalPositionRelativeFrom,\n HorizontalPositionAlign,\n VerticalPositionAlign,\n} from 'docx';\n\nimport type { ImageProps } from '../types';\n\nexport type FloatingConfig = NonNullable<ImageProps['floating']>;\n\n/**\n * Conversion factor from twips to EMUs (English Metric Units).\n * - 1 inch = 914,400 EMUs\n * - 1 inch = 1,440 twips\n * - Therefore: 1 twip = 914,400 / 1,440 = 635 EMUs\n *\n * docx.js expects offset and margin values in EMUs, but our schema\n * documents these values in twips for consistency with other Word measurements.\n */\nconst TWIPS_TO_EMU = 635;\n\nexport function mapHorizontalRelative(\n rel?: FloatingConfig['horizontalPosition'] extends infer T\n ? T extends { relative?: infer R }\n ? R\n : never\n : never\n) {\n switch (rel) {\n case 'character':\n return HorizontalPositionRelativeFrom.CHARACTER;\n case 'column':\n return HorizontalPositionRelativeFrom.COLUMN;\n case 'margin':\n return HorizontalPositionRelativeFrom.MARGIN;\n case 'page':\n return HorizontalPositionRelativeFrom.PAGE;\n default:\n return undefined;\n }\n}\n\nexport function mapVerticalRelative(\n rel?: FloatingConfig['verticalPosition'] extends infer T\n ? T extends { relative?: infer R }\n ? R\n : never\n : never\n) {\n switch (rel) {\n case 'margin':\n return VerticalPositionRelativeFrom.MARGIN;\n case 'page':\n return VerticalPositionRelativeFrom.PAGE;\n case 'paragraph':\n return VerticalPositionRelativeFrom.PARAGRAPH;\n case 'line':\n return VerticalPositionRelativeFrom.LINE;\n default:\n return undefined;\n }\n}\n\nexport function mapHorizontalAlign(\n align?: 'left' | 'center' | 'right' | 'inside' | 'outside'\n) {\n switch (align) {\n case 'left':\n return HorizontalPositionAlign.LEFT;\n case 'center':\n return HorizontalPositionAlign.CENTER;\n case 'right':\n return HorizontalPositionAlign.RIGHT;\n case 'inside':\n return HorizontalPositionAlign.INSIDE;\n case 'outside':\n return HorizontalPositionAlign.OUTSIDE;\n default:\n return undefined;\n }\n}\n\nexport function mapVerticalAlign(\n align?: 'top' | 'center' | 'bottom' | 'inside' | 'outside'\n) {\n switch (align) {\n case 'top':\n return VerticalPositionAlign.TOP;\n case 'center':\n return VerticalPositionAlign.CENTER;\n case 'bottom':\n return VerticalPositionAlign.BOTTOM;\n case 'inside':\n return VerticalPositionAlign.INSIDE;\n case 'outside':\n return VerticalPositionAlign.OUTSIDE;\n default:\n return undefined;\n }\n}\n\nexport function mapWrapType(\n type?: 'none' | 'square' | 'topAndBottom' | 'around' | 'through'\n) {\n switch (type) {\n case 'none':\n return TextWrappingType.NONE;\n case 'square':\n return TextWrappingType.SQUARE;\n case 'topAndBottom':\n return TextWrappingType.TOP_AND_BOTTOM;\n case 'around':\n case 'through':\n // Map VML-style 'around' and 'through' to TIGHT (closest OOXML equivalent)\n return TextWrappingType.TIGHT;\n default:\n return undefined;\n }\n}\n\nexport function mapWrapSide(side?: 'bothSides' | 'left' | 'right' | 'largest') {\n switch (side) {\n case 'bothSides':\n return TextWrappingSide.BOTH_SIDES;\n case 'left':\n return TextWrappingSide.LEFT;\n case 'right':\n return TextWrappingSide.RIGHT;\n case 'largest':\n return TextWrappingSide.LARGEST;\n default:\n return undefined;\n }\n}\n\n/**\n * Map shared floating config to docx ImageRun floating options.\n * Also lifts wrap.margins (if present) to floating.margins as expected by docx.\n */\nexport function mapFloatingOptions(floating?: FloatingConfig): any | undefined {\n if (!floating) return undefined;\n\n // Disallow 'tight' wrapping: docx emits invalid OOXML for wrapTight without polygon geometry\n // Note: TypeScript correctly prevents this at compile-time, but keep for runtime safety\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Intentional defensive check for runtime input validation\n if (floating.wrap?.type === 'tight') {\n throw new Error(\n 'Image floating wrap.type \\'tight\\' is not supported due to invalid OOXML emitted by docx. Use \\'square\\', \\'topAndBottom\\', or \\'none\\'.'\n );\n }\n\n // docx.js requires BOTH horizontal and vertical positions for floating images.\n // If only one is specified, provide sensible defaults for the other.\n const hasHorizontal = Boolean(floating.horizontalPosition);\n const hasVertical = Boolean(floating.verticalPosition);\n\n const horizontalPosition = floating.horizontalPosition\n ? {\n ...(floating.horizontalPosition.relative && {\n relative: mapHorizontalRelative(floating.horizontalPosition.relative),\n }),\n ...(floating.horizontalPosition.align !== undefined && {\n align: mapHorizontalAlign(floating.horizontalPosition.align),\n }),\n ...(floating.horizontalPosition.offset !== undefined && {\n offset: floating.horizontalPosition.offset * TWIPS_TO_EMU,\n }),\n }\n : hasVertical\n ? {\n // Default horizontal: align left relative to margin\n relative: HorizontalPositionRelativeFrom.MARGIN,\n align: HorizontalPositionAlign.LEFT,\n }\n : undefined;\n\n const verticalPosition = floating.verticalPosition\n ? {\n ...(floating.verticalPosition.relative && {\n relative: mapVerticalRelative(floating.verticalPosition.relative),\n }),\n ...(floating.verticalPosition.align !== undefined && {\n align: mapVerticalAlign(floating.verticalPosition.align),\n }),\n ...(floating.verticalPosition.offset !== undefined && {\n offset: floating.verticalPosition.offset * TWIPS_TO_EMU,\n }),\n }\n : hasHorizontal\n ? {\n // Default vertical: align top relative to paragraph\n relative: VerticalPositionRelativeFrom.PARAGRAPH,\n align: VerticalPositionAlign.TOP,\n }\n : undefined;\n\n const wrap = floating.wrap\n ? {\n ...(floating.wrap.type && { type: mapWrapType(floating.wrap.type) }),\n ...(floating.wrap.side && { side: mapWrapSide(floating.wrap.side) }),\n }\n : undefined;\n\n // Convert margins from twips to EMUs\n const rawMargins = floating.wrap?.margins || (floating as any).margins;\n const margins = rawMargins\n ? {\n ...(rawMargins.top !== undefined && {\n top: rawMargins.top * TWIPS_TO_EMU,\n }),\n ...(rawMargins.bottom !== undefined && {\n bottom: rawMargins.bottom * TWIPS_TO_EMU,\n }),\n ...(rawMargins.left !== undefined && {\n left: rawMargins.left * TWIPS_TO_EMU,\n }),\n ...(rawMargins.right !== undefined && {\n right: rawMargins.right * TWIPS_TO_EMU,\n }),\n }\n : undefined;\n\n // Determine and validate zIndex:\n // - OOXML requires positive integer for relativeHeight\n // - Negative values cause Word to reject the document\n // - CRITICAL: docx.js uses image HEIGHT as relativeHeight when zIndex is undefined,\n // causing inconsistent values that can corrupt documents\n // - Solution: ALWAYS provide a zIndex value, defaulting to 0\n let zIndex = floating.zIndex !== undefined ? floating.zIndex : 0; // Default to 0 for ALL floating images (behindDocument or normal)\n\n // Validate: zIndex must be >= 0 (OOXML requirement)\n if (zIndex < 0) {\n console.warn(\n `Invalid zIndex value ${zIndex} for floating image. Using 0 instead. zIndex must be >= 0.`\n );\n zIndex = 0;\n }\n\n const mapped: any = {\n ...(horizontalPosition && { horizontalPosition }),\n ...(verticalPosition && { verticalPosition }),\n ...(wrap && { wrap }),\n ...(margins && { margins }),\n ...(floating.allowOverlap !== undefined && {\n allowOverlap: floating.allowOverlap,\n }),\n ...(floating.behindDocument !== undefined && {\n behindDocument: floating.behindDocument,\n }),\n ...(floating.lockAnchor !== undefined && {\n lockAnchor: floating.lockAnchor,\n }),\n ...(floating.layoutInCell !== undefined && {\n layoutInCell: floating.layoutInCell,\n }),\n zIndex, // Always include zIndex (now always defined, defaults to 0)\n };\n\n return Object.keys(mapped).length ? mapped : undefined;\n}\n","/**\n * Numbering Configuration Utilities\n * Utilities for creating and managing docx numbering configurations\n */\n\nimport { AlignmentType, convertInchesToTwip, LevelFormat } from 'docx';\nimport type { ILevelsOptions } from 'docx';\n\n// Type mapping from schema strings to docx LevelFormat values\nconst LEVEL_FORMAT_MAP: Record<\n string,\n (typeof LevelFormat)[keyof typeof LevelFormat]\n> = {\n decimal: LevelFormat.DECIMAL,\n upperRoman: LevelFormat.UPPER_ROMAN,\n lowerRoman: LevelFormat.LOWER_ROMAN,\n upperLetter: LevelFormat.UPPER_LETTER,\n lowerLetter: LevelFormat.LOWER_LETTER,\n bullet: LevelFormat.BULLET,\n ordinal: LevelFormat.ORDINAL,\n cardinalText: LevelFormat.CARDINAL_TEXT,\n ordinalText: LevelFormat.ORDINAL_TEXT,\n hex: LevelFormat.HEX,\n chicago: LevelFormat.CHICAGO,\n ideographDigital: LevelFormat.IDEOGRAPH__DIGITAL,\n japaneseCounting: LevelFormat.JAPANESE_COUNTING,\n aiueo: LevelFormat.AIUEO,\n iroha: LevelFormat.IROHA,\n decimalFullWidth: LevelFormat.DECIMAL_FULL_WIDTH,\n decimalHalfWidth: LevelFormat.DECIMAL_HALF_WIDTH,\n japaneseLegal: LevelFormat.JAPANESE_LEGAL,\n japaneseDigitalTenThousand: LevelFormat.JAPANESE_DIGITAL_TEN_THOUSAND,\n decimalEnclosedCircle: LevelFormat.DECIMAL_ENCLOSED_CIRCLE,\n decimalFullWidth2: LevelFormat.DECIMAL_FULL_WIDTH2,\n aiueoFullWidth: LevelFormat.AIUEO_FULL_WIDTH,\n irohaFullWidth: LevelFormat.IROHA_FULL_WIDTH,\n decimalZero: LevelFormat.DECIMAL_ZERO,\n ganada: LevelFormat.GANADA,\n chosung: LevelFormat.CHOSUNG,\n decimalEnclosedFullstop: LevelFormat.DECIMAL_ENCLOSED_FULLSTOP,\n decimalEnclosedParen: LevelFormat.DECIMAL_ENCLOSED_PARENTHESES,\n decimalEnclosedCircleChinese: LevelFormat.DECIMAL_ENCLOSED_CIRCLE_CHINESE,\n ideographEnclosedCircle: LevelFormat.IDEOGRAPH_ENCLOSED_CIRCLE,\n ideographTraditional: LevelFormat.IDEOGRAPH_TRADITIONAL,\n ideographZodiac: LevelFormat.IDEOGRAPH_ZODIAC,\n ideographZodiacTraditional: LevelFormat.IDEOGRAPH_ZODIAC_TRADITIONAL,\n taiwaneseCounting: LevelFormat.TAIWANESE_COUNTING,\n ideographLegalTraditional: LevelFormat.IDEOGRAPH_LEGAL_TRADITIONAL,\n taiwaneseCountingThousand: LevelFormat.TAIWANESE_COUNTING_THOUSAND,\n taiwaneseDigital: LevelFormat.TAIWANESE_DIGITAL,\n chineseCounting: LevelFormat.CHINESE_COUNTING,\n chineseLegalSimplified: LevelFormat.CHINESE_LEGAL_SIMPLIFIED,\n chineseCountingThousand: LevelFormat.CHINESE_COUNTING_THOUSAND,\n koreanDigital: LevelFormat.KOREAN_DIGITAL,\n koreanCounting: LevelFormat.KOREAN_COUNTING,\n koreanLegal: LevelFormat.KOREAN_LEGAL,\n koreanDigital2: LevelFormat.KOREAN_DIGITAL2,\n vietnameseCounting: LevelFormat.VIETNAMESE_COUNTING,\n russianLower: LevelFormat.RUSSIAN_LOWER,\n russianUpper: LevelFormat.RUSSIAN_UPPER,\n none: LevelFormat.NONE,\n numberInDash: LevelFormat.NUMBER_IN_DASH,\n hebrew1: LevelFormat.HEBREW1,\n hebrew2: LevelFormat.HEBREW2,\n arabicAlpha: LevelFormat.ARABIC_ALPHA,\n arabicAbjad: LevelFormat.ARABIC_ABJAD,\n hindiVowels: LevelFormat.HINDI_VOWELS,\n hindiConsonants: LevelFormat.HINDI_CONSONANTS,\n hindiNumbers: LevelFormat.HINDI_NUMBERS,\n hindiCounting: LevelFormat.HINDI_COUNTING,\n thaiLetters: LevelFormat.THAI_LETTERS,\n thaiNumbers: LevelFormat.THAI_NUMBERS,\n thaiCounting: LevelFormat.THAI_COUNTING,\n};\n\nconst ALIGNMENT_MAP: Record<\n string,\n (typeof AlignmentType)[keyof typeof AlignmentType]\n> = {\n start: AlignmentType.START,\n end: AlignmentType.END,\n left: AlignmentType.LEFT,\n right: AlignmentType.RIGHT,\n center: AlignmentType.CENTER,\n};\n\nexport interface ListLevelConfig {\n level: number;\n format?: string;\n text?: string;\n alignment?: string;\n indent?: {\n left?: number;\n hanging?: number;\n };\n start?: number;\n}\n\nexport interface NumberingConfig {\n reference: string;\n levels: ListLevelConfig[];\n}\n\n/**\n * Convert schema format string to docx LevelFormat\n */\nfunction getLevelFormat(\n format?: string\n): (typeof LevelFormat)[keyof typeof LevelFormat] {\n if (!format) return LevelFormat.BULLET;\n return LEVEL_FORMAT_MAP[format] || LevelFormat.BULLET;\n}\n\n/**\n * Convert schema alignment string to docx AlignmentType\n */\nfunction getAlignment(\n alignment?: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n if (!alignment) return AlignmentType.LEFT;\n return ALIGNMENT_MAP[alignment] || AlignmentType.LEFT;\n}\n\n/**\n * Create a default level configuration for a given level number\n */\nfunction createDefaultLevel(\n level: number,\n format: (typeof LevelFormat)[keyof typeof LevelFormat] = LevelFormat.BULLET,\n text?: string\n): ILevelsOptions {\n const baseIndent = 0.5 * (level + 1); // Increase indent for each level\n const hangingIndent = 0.25;\n\n return {\n level,\n format,\n text: text || (format === LevelFormat.BULLET ? '•' : '%1.'),\n alignment: AlignmentType.LEFT,\n style: {\n paragraph: {\n indent: {\n left: convertInchesToTwip(baseIndent),\n hanging: convertInchesToTwip(hangingIndent),\n },\n },\n },\n };\n}\n\n/**\n * Create numbering configuration from list config\n * Returns a single config item that can be added to INumberingOptions.config array\n */\nexport function createNumberingConfig(config: NumberingConfig): {\n levels: ILevelsOptions[];\n reference: string;\n} {\n const levels: ILevelsOptions[] = [];\n\n // Process each level\n for (const levelConfig of config.levels) {\n const format = getLevelFormat(levelConfig.format);\n const alignment = getAlignment(levelConfig.alignment);\n const text =\n levelConfig.text ||\n (format === LevelFormat.BULLET ? '•' : `%${levelConfig.level + 1}.`);\n\n // Calculate indentation\n const baseIndent =\n levelConfig.indent?.left !== undefined\n ? levelConfig.indent.left / 72 // Convert points to inches\n : 0.5 * (levelConfig.level + 1);\n\n const hangingIndent =\n levelConfig.indent?.hanging !== undefined\n ? levelConfig.indent.hanging / 72 // Convert points to inches\n : 0.25;\n\n const level: ILevelsOptions = {\n level: levelConfig.level,\n format,\n text,\n alignment,\n style: {\n paragraph: {\n indent: {\n left: convertInchesToTwip(baseIndent),\n hanging: convertInchesToTwip(hangingIndent),\n },\n },\n },\n // Add start number if specified\n ...(levelConfig.start !== undefined && { start: levelConfig.start }),\n };\n\n levels.push(level);\n }\n\n return {\n reference: config.reference,\n levels,\n };\n}\n\n/**\n * Create a simple bullet list configuration\n */\nexport function createBulletListConfig(\n reference: string,\n bullet: string = '•'\n): { levels: ILevelsOptions[]; reference: string } {\n return {\n reference,\n levels: [\n createDefaultLevel(0, LevelFormat.BULLET, bullet),\n createDefaultLevel(1, LevelFormat.BULLET, '◦'),\n createDefaultLevel(2, LevelFormat.BULLET, '▪'),\n ],\n };\n}\n\n/**\n * Create a simple numbered list configuration\n */\nexport function createNumberedListConfig(\n reference: string,\n start: number = 1\n): { levels: ILevelsOptions[]; reference: string } {\n return {\n reference,\n levels: [\n { ...createDefaultLevel(0, LevelFormat.DECIMAL, '%1.'), start },\n createDefaultLevel(1, LevelFormat.LOWER_LETTER, '%2.'),\n createDefaultLevel(2, LevelFormat.LOWER_ROMAN, '%3.'),\n ],\n };\n}\n\n/**\n * Registry for managing numbering configurations\n */\nexport class NumberingRegistry {\n private configs: Map<\n string,\n { levels: ILevelsOptions[]; reference: string }\n > = new Map();\n private counter = 0;\n\n /**\n * Register a numbering configuration\n */\n register(config: { levels: ILevelsOptions[]; reference: string }): string {\n const reference = config.reference;\n this.configs.set(reference, config);\n return reference;\n }\n\n /**\n * Generate a unique reference ID\n */\n generateReference(prefix: string = 'list'): string {\n return `${prefix}-${++this.counter}`;\n }\n\n /**\n * Get all registered configurations as an array suitable for INumberingOptions\n */\n getAll(): { levels: ILevelsOptions[]; reference: string }[] {\n return Array.from(this.configs.values());\n }\n\n /**\n * Clear all configurations\n */\n clear(): void {\n this.configs.clear();\n this.counter = 0;\n }\n\n /**\n * Check if a reference exists\n */\n has(reference: string): boolean {\n return this.configs.has(reference);\n }\n\n /**\n * Get a configuration by reference\n */\n get(\n reference: string\n ): { levels: ILevelsOptions[]; reference: string } | undefined {\n return this.configs.get(reference);\n }\n}\n\n// Global registry instance\nexport const globalNumberingRegistry = new NumberingRegistry();\n","/**\n * Post-processing utility to fix docx.js floating image bugs\n *\n * The docx library (as of v9.5.1) has a known issue with floating images:\n * 1. Duplicate wp:docPr IDs (GitHub issue #2719)\n *\n * Historical note: We previously also post-processed relativeHeight and\n * wrapTight elements. Those steps were removed because we always provide a\n * valid zIndex upstream and we do not support 'tight' wrapping.\n *\n * This utility extracts the DOCX, fixes duplicate IDs, and re-packages it.\n */\n\nimport AdmZip from 'adm-zip';\n\n/**\n * Fix floating image issues in a generated DOCX file\n * @param docxPath - Path to the DOCX file to fix\n */\nexport async function fixFloatingImageIds(docxPath: string): Promise<void> {\n try {\n // Read the DOCX file as a ZIP\n const zip = new AdmZip(docxPath);\n\n // Get the document.xml entry\n const documentEntry = zip.getEntry('word/document.xml');\n if (!documentEntry) {\n throw new Error('document.xml not found in DOCX');\n }\n\n // Extract and parse the XML\n let documentXml = documentEntry.getData().toString('utf8');\n\n // Fix 1: Duplicate wp:docPr IDs\n // Pattern: <wp:docPr id=\"N\" ...> where N is the ID\n let idCounter = 1;\n documentXml = documentXml.replace(\n /<wp:docPr\\s+id=\"(\\d+)\"/g,\n (_match: string) => {\n const newId = idCounter++;\n return `<wp:docPr id=\"${newId}\"`;\n }\n );\n\n // Note: No other post-processing is applied.\n\n // Update the document.xml in the ZIP\n zip.updateFile('word/document.xml', Buffer.from(documentXml, 'utf8'));\n\n // Write the fixed DOCX back\n zip.writeZip(docxPath);\n\n console.log(\n `Fixed ${idCounter - 1} duplicate floating image docPr IDs in ${docxPath}`\n );\n } catch (error) {\n console.error('Failed to fix floating image issues:', error);\n throw error;\n }\n}\n","/**\n * Document Generator\n * Main orchestration functions that compose the document generation pipeline\n */\n\nimport { Document, Packer } from 'docx';\nimport { writeFileSync } from 'fs';\nimport {\n ComponentDefinition,\n ReportProps,\n ReportComponentDefinition,\n isReportComponent,\n} from '../types';\nimport { getThemeWithFallback, ThemeConfig } from '../styles';\nimport { processDocument } from './structure';\nimport { applyLayout } from './layout';\nimport { renderDocument } from './render';\n\n// JSON support imports\nimport { DocumentValidationResult } from '@json-to-office/shared-docx';\nimport { parseJsonComponent, validateJsonComponent } from '../json/parser';\nimport { normalizeDocument } from '../json/normalizer';\nimport { loadJsonDefinition } from '../json/filesystem';\n\n// Local generation options type\nexport interface JsonGenerationOptions {\n outputPath?: string;\n validation?: {\n strict?: boolean;\n allowUnknownFields?: boolean;\n };\n customThemes?: { [key: string]: ThemeConfig };\n}\n\n/**\n * Type guard to check if input is a report component definition\n */\nexport function isReportComponentDefinition(\n definition: unknown\n): definition is ReportComponentDefinition {\n if (typeof definition !== 'object' || definition === null) {\n return false;\n }\n\n const def = definition as Record<string, unknown>;\n\n // Must be a report component (optionally with $schema for JSON validation)\n return def.name === 'docx' && 'props' in def;\n}\n\n/**\n * Generate a Word document from a report component definition\n * This is the main entry point for document generation\n */\nexport async function generateDocument(\n document: ReportComponentDefinition\n): Promise<Document> {\n // Validate that the document is a report component\n if (!document || document.name !== 'docx') {\n throw new Error('Top-level component must be a docx component');\n }\n\n // Handle JSON definitions (report components with $schema)\n if ('$schema' in document) {\n return await generateDocumentFromJson(document);\n }\n\n // Get theme configuration (theme is always a string name)\n const themeName = document.props.theme || 'minimal';\n const theme = getThemeWithFallback(themeName);\n\n // Pipeline: Structure -> Layout -> Render (with caching)\n const structure = await processDocument(document, theme, themeName);\n const layout = applyLayout(structure.sections, theme, themeName);\n const renderedDocument = await renderDocument(structure, layout, {\n bypassCache: false, // Enable component caching\n });\n\n return renderedDocument;\n}\n\n/**\n * Generate document from report props and components\n * Convenience function that constructs the report component\n */\nexport async function generateFromConfig(\n props: ReportProps,\n components: ComponentDefinition[]\n): Promise<Document> {\n const reportComponent: ReportComponentDefinition = {\n name: 'docx',\n props,\n children: components,\n };\n\n return await generateDocument(reportComponent);\n}\n\n/**\n * Generate a Word document with custom themes support\n * Extends the standard pipeline to support custom theme resolution\n */\nasync function generateDocumentWithCustomThemes(\n document: ReportComponentDefinition,\n customThemes?: { [key: string]: ThemeConfig }\n): Promise<Document> {\n // Get theme configuration with custom theme support (theme is always a string name)\n const themeName = document.props.theme || 'minimal';\n let theme: ThemeConfig;\n\n // Check custom themes first with case-insensitive matching, then fall back to built-in\n if (customThemes) {\n // Try exact match first\n if (customThemes[themeName]) {\n theme = customThemes[themeName];\n } else {\n // Try case-insensitive match\n const themeNameLower = themeName.toLowerCase();\n const matchingThemeKey = Object.keys(customThemes).find(\n (key) => key.toLowerCase() === themeNameLower\n );\n if (matchingThemeKey) {\n theme = customThemes[matchingThemeKey];\n } else {\n theme = getThemeWithFallback(themeName);\n }\n }\n } else {\n theme = getThemeWithFallback(themeName);\n }\n\n // Pipeline: Structure -> Layout -> Render (with caching)\n const structure = await processDocument(document, theme, themeName);\n const layout = applyLayout(structure.sections, theme, themeName);\n const renderedDocument = await renderDocument(structure, layout, {\n bypassCache: false, // Enable component caching\n });\n\n return renderedDocument;\n}\n\n/**\n * Generate a Word document from JSON report definition\n * Handles parsing, validation, and conversion to internal components\n */\nexport async function generateDocumentFromJson(\n jsonConfig: string | ComponentDefinition | ReportComponentDefinition,\n options?: JsonGenerationOptions\n): Promise<Document> {\n // Handle string input\n let componentToConvert: ComponentDefinition | ReportComponentDefinition;\n if (typeof jsonConfig === 'string') {\n // Parse and validate - parseJsonComponent returns ComponentDefinition\n const parsed = parseJsonComponent(jsonConfig) as ComponentDefinition;\n if (!isReportComponent(parsed)) {\n throw new Error('Parsed JSON must be a docx component');\n }\n componentToConvert = parsed as ReportComponentDefinition;\n } else {\n // Could be either ComponentDefinition (from JSON) or ReportComponentDefinition (internal)\n componentToConvert = jsonConfig;\n }\n\n // Normalize JSON components (handle shorthand notations and nested structures)\n // The normalizer preserves all validated properties from TypeBox\n const [reportComponent] = normalizeDocument(componentToConvert);\n // Generate document using custom theme-aware pipeline\n return await generateDocumentWithCustomThemes(\n reportComponent,\n options?.customThemes\n );\n}\n\n/**\n * Validate JSON schema without generating document\n */\nexport function validateJsonSchema(\n jsonConfig: string | object\n): DocumentValidationResult {\n return validateJsonComponent(jsonConfig);\n}\n\n/**\n * Generate document buffer from JSON (commonly used for API responses)\n */\nexport async function generateBufferFromJson(\n jsonConfig: string | ReportComponentDefinition,\n options?: JsonGenerationOptions\n): Promise<Buffer> {\n const document = await generateDocumentFromJson(jsonConfig, options);\n return await Packer.toBuffer(document);\n}\n\n/**\n * Generate and save document from JSON in one operation\n */\nexport async function generateAndSaveFromJson(\n jsonConfig: string | ReportComponentDefinition,\n filename: string,\n options?: JsonGenerationOptions\n): Promise<void> {\n const document = await generateDocumentFromJson(jsonConfig, options);\n await saveDocument(document, filename);\n}\n\n/**\n * Generate document from JSON file\n */\nexport async function generateDocumentFromFile(\n filePath: string,\n options?: JsonGenerationOptions\n): Promise<Document> {\n const jsonDefinition = await loadJsonDefinition(filePath);\n // loadJsonDefinition returns ComponentDefinition from shared (JSON schema type)\n // generateDocumentFromJson now accepts the JSON schema type directly\n return await generateDocumentFromJson(jsonDefinition, options);\n}\n\n/**\n * Generate document buffer from JSON file\n */\nexport async function generateBufferFromFile(\n filePath: string,\n options?: JsonGenerationOptions\n): Promise<Buffer> {\n const document = await generateDocumentFromFile(filePath, options);\n return await Packer.toBuffer(document);\n}\n\n/**\n * Generate and save document from JSON file in one operation\n */\nexport async function generateAndSaveFromFile(\n inputFilePath: string,\n outputFilePath: string,\n options?: JsonGenerationOptions\n): Promise<void> {\n const document = await generateDocumentFromFile(inputFilePath, options);\n await saveDocument(document, outputFilePath);\n}\n\n/**\n * Save a document to file\n */\nexport async function saveDocument(\n document: Document,\n filename: string\n): Promise<void> {\n const buffer = await Packer.toBuffer(document);\n writeFileSync(filename, buffer);\n\n // Post-process: Fix duplicate wp:docPr IDs in floating images\n try {\n const { fixFloatingImageIds } = await import(\n '../utils/fixFloatingImageIds'\n );\n await fixFloatingImageIds(filename);\n } catch (error) {\n console.warn('Failed to fix floating image IDs (non-critical):', error);\n }\n}\n\n/**\n * Generate and save document in one operation\n */\nexport async function generateAndSave(\n document: ReportComponentDefinition,\n filename: string\n): Promise<void> {\n const generatedDocument = await generateDocument(document);\n await saveDocument(generatedDocument, filename);\n}\n\n/**\n * Compose multiple transform functions\n * Utility for creating custom pipelines\n */\nexport function pipe<T>(...fns: Array<(_arg: T) => T>): (_arg: T) => T {\n return (_arg: T) => fns.reduce((acc, fn) => fn(acc), _arg);\n}\n\n/**\n * Export the main API\n */\nexport const DocumentGenerator = {\n generate: generateDocument,\n generateFromConfig,\n generateFromJson: generateDocumentFromJson,\n generateFromFile: generateDocumentFromFile,\n generateBufferFromJson,\n generateBufferFromFile,\n generateAndSaveFromJson,\n generateAndSaveFromFile,\n validateJsonSchema,\n save: saveDocument,\n generateAndSave,\n isReportComponentDefinition,\n};\n","import { ISectionOptions } from 'docx';\nimport type { ThemeName } from '../styles';\n\n// Import types from shared-docx that core needs for its internal use\nimport type {\n ComponentDefinition as SharedComponentDefinition,\n ReportComponent,\n SectionComponent,\n ColumnsComponent,\n HeadingComponent,\n ParagraphComponent,\n ImageComponent,\n HighchartsComponent,\n StatisticComponent,\n TableComponent,\n HeaderComponent,\n FooterComponent,\n ListComponent,\n TocComponent,\n TextBoxComponent,\n\n // Import props types needed internally\n ReportProps as SharedReportProps,\n SectionProps as SharedSectionProps,\n HeadingProps as SharedHeadingProps,\n ParagraphProps as SharedParagraphProps,\n ColumnsProps as SharedColumnsProps,\n ImageProps as SharedImageProps,\n StatisticProps as SharedStatisticProps,\n TableProps as SharedTableProps,\n HeaderProps as SharedHeaderProps,\n FooterProps as SharedFooterProps,\n ListProps as SharedListProps,\n TocProps as SharedTocProps,\n TextBoxProps as SharedTextBoxProps,\n} from '@json-to-office/shared-docx';\n\n// Import type guards from shared-docx (these are runtime functions core needs)\nexport {\n isReportComponent,\n isSectionComponent,\n isHeadingComponent,\n isParagraphComponent,\n isColumnsComponent,\n isImageComponent,\n isTextBoxComponent,\n isStatisticComponent,\n isTableComponent,\n isListComponent,\n isTocComponent,\n isHeaderComponent,\n isFooterComponent,\n isHighchartsComponent,\n} from '@json-to-office/shared-docx';\n\n// Re-export component definitions for internal use (type aliases for clarity)\nexport type ComponentDefinition = SharedComponentDefinition;\nexport type ReportComponentDefinition = ReportComponent & {\n /** Optional schema field for JSON validation */\n $schema?: string;\n};\nexport type SectionComponentDefinition = SectionComponent;\nexport type HeadingComponentDefinition = HeadingComponent;\nexport type ParagraphComponentDefinition = ParagraphComponent;\nexport type ColumnsComponentDefinition = ColumnsComponent;\nexport type ImageComponentDefinition = ImageComponent;\nexport type TextBoxComponentDefinition = TextBoxComponent;\nexport type StatisticComponentDefinition = StatisticComponent;\nexport type TableComponentDefinition = TableComponent;\nexport type HeaderComponentDefinition = HeaderComponent;\nexport type FooterComponentDefinition = FooterComponent;\nexport type ListComponentDefinition = ListComponent;\nexport type TocComponentDefinition = TocComponent;\n\n// Export StandardComponentDefinition as union of all standard component types\nexport type StandardComponentDefinition =\n | ReportComponent\n | SectionComponent\n | ColumnsComponent\n | HeadingComponent\n | ParagraphComponent\n | TextBoxComponent\n | ImageComponent\n | HighchartsComponent\n | StatisticComponent\n | TableComponent\n | HeaderComponent\n | FooterComponent\n | ListComponent\n | TocComponent;\n\n// Re-export props types for internal use\nexport type ReportProps = SharedReportProps;\nexport type SectionProps = SharedSectionProps;\nexport type HeadingProps = SharedHeadingProps;\nexport type ParagraphProps = SharedParagraphProps;\nexport type ColumnsProps = SharedColumnsProps;\nexport type ImageProps = SharedImageProps;\nexport type TextBoxProps = SharedTextBoxProps;\nexport type StatisticProps = SharedStatisticProps;\nexport type TableProps = SharedTableProps;\nexport type HeaderProps = SharedHeaderProps;\nexport type FooterProps = SharedFooterProps;\nexport type ListProps = SharedListProps;\nexport type TocProps = SharedTocProps;\n\n// Re-export ThemeName for easier access\nexport type { ThemeName };\n\n// ============================================================================\n// CORE-SPECIFIC INTERFACES\n// ============================================================================\n\nexport interface ColumnSettings {\n count: number;\n equalWidth?: boolean;\n space?: number;\n /** Optional explicit column children with widths/spaces in twips */\n children?: { width?: number; space?: number }[];\n}\n\nexport interface PageSizeOptions {\n width: number;\n height: number;\n}\n\nexport interface PageMarginOptions {\n top: number;\n right: number;\n bottom: number;\n left: number;\n header?: number;\n footer?: number;\n}\n\nexport interface PageNumberOptions {\n start?: number;\n formatType?:\n | 'decimal'\n | 'upperRoman'\n | 'lowerRoman'\n | 'upperLetter'\n | 'lowerLetter';\n}\n\nexport interface PageBorderOptions {\n top?: { style: string; size: number; color: string };\n right?: { style: string; size: number; color: string };\n bottom?: { style: string; size: number; color: string };\n left?: { style: string; size: number; color: string };\n}\n\nexport interface SectionProperties {\n page?: {\n size?: PageSizeOptions;\n margin?: PageMarginOptions;\n pageNumbers?: PageNumberOptions;\n borders?: PageBorderOptions;\n textDirection?: 'ltr' | 'rtl';\n };\n column?: ColumnSettings;\n type?: 'continuous' | 'nextColumn' | 'nextPage' | 'evenPage' | 'oddPage';\n headers?: ISectionOptions['headers'];\n footers?: ISectionOptions['footers'];\n}\n\n// Internal interfaces used by DocumentGenerator helper methods\nexport interface ImageContent {\n path: string;\n caption?: string;\n width?: number;\n height?: number;\n alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface StatisticContent {\n number: string;\n description: string;\n alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface TableData {\n headers: string[];\n rows: (string | SharedComponentDefinition)[][];\n style?: 'minimal' | 'classic' | 'minimal';\n}\n\n/**\n * Rendering context for components\n */\nexport interface RenderContext {\n theme: {\n name: string;\n colors: Record<string, string>;\n fonts: Record<string, string>;\n spacing: Record<string, number>;\n };\n /** Full theme configuration for custom components */\n fullTheme: import('../styles').ThemeConfig;\n document: {\n title?: string;\n subtitle?: string;\n author?: string;\n company?: string;\n date: Date;\n };\n section: {\n currentLayout: 'single' | 'multi-column';\n columnCount: number;\n pageNumber: number;\n level?: number;\n /** Bookmark ID for section-scoped TOCs (when TOC is inside a section) */\n sectionBookmarkId?: string;\n /** Heading level of the parent section title (used to exclude it from section-scoped TOCs) */\n sectionTitleLevel?: number;\n };\n utils: {\n formatDate: (_date: Date) => string;\n parseText: (_text: string) => { text: string }[];\n getStyle: (_name: string) => { name: string };\n [key: string]: unknown;\n };\n parent?: SharedComponentDefinition;\n depth: number;\n custom?: Record<string, unknown>;\n}\n","import { format } from 'date-fns';\n\nexport const formatDate = (\n date: Date,\n formatString: string = 'MMMM d, yyyy'\n): string => {\n return format(date, formatString);\n};\n","/**\n * Document Structure Functions\n * Handle document hierarchy and organization without layout concerns\n */\n\nimport {\n ComponentDefinition,\n ReportProps,\n ReportComponentDefinition,\n RenderContext,\n isSectionComponent,\n isColumnsComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { formatDate } from '../utils/formatters';\n\nexport interface ProcessedDocument {\n metadata: DocumentMetadata;\n sections: ProcessedSection[];\n theme: ThemeConfig;\n themeName: string;\n}\n\nexport interface DocumentMetadata {\n title?: string;\n subtitle?: string;\n author?: string;\n company?: string;\n date: Date;\n}\n\nexport interface ProcessedSection {\n title?: string;\n level?: number;\n components: ComponentDefinition[];\n header?: ComponentDefinition[] | 'linkToPrevious';\n footer?: ComponentDefinition[] | 'linkToPrevious';\n /** True if this section originates from an explicit Section component */\n isExplicitSection?: boolean;\n /** Whether this section should start on a new page */\n pageBreak?: boolean;\n /** Page configuration override for this section */\n page?: {\n size?: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number };\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n header?: number;\n footer?: number;\n gutter?: number;\n };\n };\n}\n\n/**\n * Process document definition into structured format\n */\nexport async function processDocument(\n document: ReportComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Promise<ProcessedDocument> {\n const metadata = createDocumentMetadata(document.props);\n\n // Create initial context\n const context = createRenderContext(\n {\n metadata,\n sections: [],\n theme,\n themeName,\n },\n theme,\n themeName\n );\n\n // Extract sections from components\n const sections = await extractSections(document.children || [], context);\n\n return {\n metadata,\n sections,\n theme,\n themeName,\n };\n}\n\n/**\n * Extract document metadata from report props\n */\nexport function createDocumentMetadata(props: ReportProps): DocumentMetadata {\n return {\n title: props.metadata?.title,\n subtitle: props.metadata?.subtitle,\n author: props.metadata?.author,\n company: props.metadata?.company,\n date: props.metadata?.date ? new Date(props.metadata.date) : new Date(),\n };\n}\n\n/**\n * Extract and flatten sections from component hierarchy\n */\nexport async function extractSections(\n components: ComponentDefinition[],\n context: RenderContext\n): Promise<ProcessedSection[]> {\n const sections: ProcessedSection[] = [];\n\n // Filter out components with enabled: false (defaults to true when not specified)\n const activeComponents = components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n\n for (const component of activeComponents) {\n if (isSectionComponent(component)) {\n const sectionComponents = await flattenComponents(\n component.children || [],\n context\n );\n\n // Determine if page break should be applied (default to true)\n const shouldPageBreak = component.props?.pageBreak !== false;\n\n // Add section title as heading component if present\n if (component.props?.title) {\n // Ensure level is within valid range (1-6) for heading component\n const headingLevel = Math.min(\n Math.max(component.props.level || 1, 1),\n 6\n ) as 1 | 2 | 3 | 4 | 5 | 6;\n\n sectionComponents.unshift({\n name: 'heading',\n props: {\n text: component.props.title,\n level: headingLevel,\n pageBreak: shouldPageBreak,\n // Apply zero-spacing to prevent unwanted initial line\n spacing: {\n before: 0,\n after: 0,\n },\n },\n });\n }\n\n sections.push({\n title: component.props?.title,\n level: component.props?.level,\n components: sectionComponents,\n header: component.props?.header,\n footer: component.props?.footer,\n isExplicitSection: true,\n // Store pageBreak for titleless sections to be handled at layout level\n pageBreak: !component.props?.title ? shouldPageBreak : undefined,\n // Preserve page configuration override if present\n page: component.props?.page,\n });\n } else {\n // Non-section components at root level become their own section\n sections.push({\n components: [component],\n isExplicitSection: false,\n });\n }\n }\n\n return sections;\n}\n\n/**\n * Flatten nested container components while preserving content components\n */\nexport async function flattenComponents(\n components: ComponentDefinition[],\n context: RenderContext\n): Promise<ComponentDefinition[]> {\n const flattened: ComponentDefinition[] = [];\n\n // Filter out components with enabled: false (defaults to true when not specified)\n const activeComponents = components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n\n for (const component of activeComponents) {\n if (isColumnsComponent(component) && component.children) {\n // Preserve columns structure but flatten its contents\n flattened.push({\n ...component,\n children: await flattenComponents(component.children, context),\n });\n } else if (isSectionComponent(component) && component.children) {\n // Flatten nested sections\n if (component.props?.title) {\n // Ensure level is within valid range (1-6) for heading component\n const headingLevel = Math.min(\n Math.max(component.props.level || 1, 1),\n 6\n ) as 1 | 2 | 3 | 4 | 5 | 6;\n\n // Convert section title to heading\n flattened.push({\n name: 'heading',\n props: {\n text: component.props.title,\n level: headingLevel,\n // Apply zero-spacing to prevent unwanted initial line\n spacing: {\n before: 0,\n after: 0,\n },\n },\n });\n }\n flattened.push(...(await flattenComponents(component.children, context)));\n } else {\n // Keep content components as-is\n flattened.push(component);\n }\n }\n\n return flattened;\n}\n\n/**\n * Create render context from processed document\n */\nexport function createRenderContext(\n document: ProcessedDocument,\n theme: ThemeConfig,\n themeName: string\n): RenderContext {\n return {\n theme: {\n name: themeName,\n colors: theme.colors || {},\n fonts: theme.fonts\n ? Object.fromEntries(\n Object.entries(theme.fonts).map(([key, font]) => [key, font.family])\n )\n : {},\n spacing: { small: 120, medium: 240, large: 360, section: 480 },\n },\n fullTheme: theme,\n document: document.metadata,\n section: {\n currentLayout: 'single',\n columnCount: 1,\n pageNumber: 1,\n },\n utils: {\n formatDate: (date: Date) => formatDate(date),\n parseText: (text: string) => [{ text }],\n getStyle: (name: string) => ({ name }),\n },\n depth: 0,\n };\n}\n","/**\n * Layout Functions\n * Handle all layout concerns including columns, breaks, and section properties\n */\n\nimport { SectionType, Column as DocxColumn } from 'docx';\nimport {\n ComponentDefinition,\n ColumnSettings,\n isColumnsComponent,\n isSectionComponent,\n isHeadingComponent,\n isParagraphComponent,\n isTocComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { getPageSetup } from '../styles';\n// import { pointsToTwips } from '../styles/utils/styleHelpers';\nimport { ProcessedSection } from './structure';\nimport {\n getAvailableWidthTwips,\n relativeLengthToTwips,\n} from '../utils/widthUtils';\n\nexport interface LayoutPlan {\n sections: SectionLayout[];\n}\n\nexport interface WordSectionProperties {\n page: {\n size: {\n width: number;\n height: number;\n };\n margin: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n };\n column: ColumnSettings & { children?: DocxColumn[] };\n type?: (typeof SectionType)[keyof typeof SectionType];\n}\n\nexport interface SectionLayout {\n properties: WordSectionProperties;\n components: ComponentDefinition[];\n layoutType: 'single' | 'multi-column';\n breakBefore: boolean;\n header?: ComponentDefinition[] | 'linkToPrevious';\n footer?: ComponentDefinition[] | 'linkToPrevious';\n /** True if this layout section comes from a user-defined Section component */\n isUserSection: boolean;\n /** True if this layout chunk belongs to a user-defined Section (all chunks of that section) */\n belongsToUserSection: boolean;\n /** The heading level of the section title (e.g., 1 for Heading1) - used by TOCs to exclude section title from section-scoped TOCs */\n sectionTitleLevel?: number;\n /** Page configuration override for this section */\n pageOverride?: {\n size?: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number };\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n header?: number;\n footer?: number;\n gutter?: number;\n };\n };\n}\n\nexport interface LayoutGroup {\n layout: 'single' | 'multi-column';\n components: ComponentDefinition[];\n breakBefore: boolean;\n}\n\n/**\n * Apply layout to processed sections\n */\nexport function applyLayout(\n sections: ProcessedSection[],\n theme: ThemeConfig,\n themeName: string\n): LayoutPlan {\n const layoutSections: SectionLayout[] = [];\n\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n const layoutGroups = analyzeLayoutGroups(section.components);\n\n // Determine if this comes from an explicit Section component\n const isSourceUserSection = Boolean(section.isExplicitSection);\n\n // Handle sections with no components but with headers/footers\n // This ensures headers/footers are rendered even for empty sections\n if (layoutGroups.length === 0 && (section.header || section.footer)) {\n const isFirstSection = i === 0;\n const breakBefore = isFirstSection || Boolean(section.pageBreak);\n const sectionType = breakBefore ? 'nextPage' : 'continuous';\n\n layoutSections.push({\n properties: createSectionProperties(\n getColumnSettings('single'),\n theme,\n themeName,\n sectionType,\n section.page\n ),\n components: [],\n layoutType: 'single',\n breakBefore,\n header: section.header,\n footer: section.footer,\n isUserSection: isSourceUserSection,\n belongsToUserSection: isSourceUserSection,\n sectionTitleLevel: section.level,\n pageOverride: section.page,\n });\n continue;\n }\n\n for (let j = 0; j < layoutGroups.length; j++) {\n const group = layoutGroups[j];\n\n // Special handling: a single Columns component becomes its own section with explicit column children\n const isSingleColumnsGroup =\n group.components.length === 1 && isColumnsComponent(group.components[0]);\n\n const columnSettings = isSingleColumnsGroup\n ? createColumnSettingsFromConfig(group.components[0], theme, themeName)\n : getColumnSettings(group.layout);\n\n // Only break page if explicitly requested or this is the first section\n const isFirstSection = i === 0 && j === 0;\n // For titleless sections with pageBreak, apply break to first layout group\n const titlelessSectionBreak = Boolean(section.pageBreak && j === 0);\n const breakBefore =\n group.breakBefore || isFirstSection || titlelessSectionBreak;\n const sectionType = breakBefore ? 'nextPage' : 'continuous';\n\n // Build content components depending on whether this is an explicit columns group\n const contentComponents = isSingleColumnsGroup\n ? processLayoutComponents(\n (group.components[0] as unknown as { children?: ComponentDefinition[] })\n .children || []\n )\n : processLayoutComponents(group.components);\n\n layoutSections.push({\n properties: createSectionProperties(\n columnSettings,\n theme,\n themeName,\n sectionType,\n section.page\n ),\n components: contentComponents,\n layoutType: group.layout,\n breakBefore,\n header: section.header,\n footer: section.footer,\n // Only mark the FIRST layout section as user-defined to avoid\n // creating bookmark paragraphs in subsequent sections (e.g., when\n // transitioning to columns layout). This prevents unwanted newlines\n // at the start of column content.\n isUserSection: isSourceUserSection && j === 0,\n belongsToUserSection: isSourceUserSection,\n // Pass section title level for TOC scoping\n sectionTitleLevel: section.level,\n // Pass page override for this section\n pageOverride: section.page,\n });\n }\n }\n\n return { sections: layoutSections };\n}\n\n/**\n * Analyze components to determine layout groups\n */\nexport function analyzeLayoutGroups(\n components: ComponentDefinition[]\n): LayoutGroup[] {\n const groups: LayoutGroup[] = [];\n let currentLayout: 'single' | 'multi-column' = 'single';\n let currentComponents: ComponentDefinition[] = [];\n let breakNext = false;\n\n for (const component of components) {\n // Always isolate explicit Columns components into their own group\n if (isColumnsComponent(component)) {\n if (currentComponents.length > 0) {\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n currentComponents = [];\n breakNext = false;\n }\n // Determine the actual layout based on the columns component configuration\n const columnsLayout = determineComponentLayout(component);\n groups.push({\n layout: columnsLayout,\n components: [component],\n breakBefore: breakNext,\n });\n breakNext = false;\n continue;\n }\n\n const componentLayout = determineComponentLayout(component);\n\n // Check for explicit break indicators\n if (hasPageBreak(component)) {\n if (currentComponents.length > 0) {\n // Finish previous group without break\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n currentComponents = [];\n breakNext = false;\n }\n // Start new group with break for this component\n currentComponents = [component];\n breakNext = true;\n continue;\n }\n\n // Layout change requires new group\n if (componentLayout !== currentLayout && currentComponents.length > 0) {\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n currentLayout = componentLayout;\n currentComponents = [component];\n breakNext = false;\n } else {\n currentComponents.push(component);\n }\n }\n\n // Add remaining components\n if (currentComponents.length > 0) {\n groups.push({\n layout: currentLayout,\n components: currentComponents,\n breakBefore: breakNext,\n });\n }\n\n return groups;\n}\n\n/**\n * Determine layout type for a component\n */\nexport function determineComponentLayout(\n component: ComponentDefinition\n): 'single' | 'multi-column' {\n if (isColumnsComponent(component)) {\n const columns = (component as any).props?.columns;\n\n // If columns is an array with specific configurations\n if (Array.isArray(columns)) {\n // Any columns array with 2+ items is multi-column\n return columns.length >= 2 ? 'multi-column' : 'single';\n }\n\n // No valid array provided; treat as single-column\n return 'single';\n }\n\n // Check if component contains children\n if ('children' in component && (component as any).children) {\n const hasColumns = (component as any).children.some((child: ComponentDefinition) =>\n isColumnsComponent(child)\n );\n return hasColumns ? 'multi-column' : 'single';\n }\n\n return 'single';\n}\n\n/**\n * Process components for layout (insert breaks where needed)\n */\nexport function processLayoutComponents(\n components: ComponentDefinition[]\n): ComponentDefinition[] {\n const processed: ComponentDefinition[] = [];\n\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n\n // Check if this component should have a column break\n if (shouldInsertColumnBreak()) {\n // Create a new component with columnBreak flag\n if (isHeadingComponent(component)) {\n processed.push({\n ...component,\n props: {\n ...((component as any).props || {}),\n columnBreak: true,\n },\n } as ComponentDefinition);\n } else {\n processed.push(component);\n }\n } else {\n processed.push(component);\n }\n }\n\n return processed;\n}\n\n/**\n * Determine if a column break should be inserted\n */\nfunction shouldInsertColumnBreak(): boolean {\n // Logic to determine column breaks based on content distribution\n // This is simplified - could be enhanced with more sophisticated logic\n return false;\n}\n\n/**\n * Check if component indicates a page break\n */\nfunction hasPageBreak(component: ComponentDefinition): boolean {\n if (isSectionComponent(component)) {\n // Default to true for section components when pageBreak is undefined\n return component.props?.pageBreak !== false;\n }\n if (isHeadingComponent(component)) {\n return component.props.pageBreak === true;\n }\n if (isParagraphComponent(component)) {\n return component.props.pageBreak === true;\n }\n // Allow TOC components to request a page break as well\n if (isTocComponent(component)) {\n return component.props?.pageBreak === true;\n }\n return false;\n}\n\n/**\n * Get column settings for layout type\n */\nexport function getColumnSettings(\n layout: 'single' | 'multi-column'\n): ColumnSettings {\n switch (layout) {\n case 'multi-column':\n // Default multi-column layout: 2 equal-width columns\n // Note: Specific column components will override this with their own settings via createColumnSettingsFromConfig\n return {\n count: 2,\n equalWidth: true,\n space: 720, // 0.5 inch in twips\n };\n case 'single':\n default:\n return { count: 1 };\n }\n}\n\n/**\n * Create Word section properties\n */\nexport function createSectionProperties(\n columnSettings: ColumnSettings,\n theme: ThemeConfig,\n themeName: string,\n sectionType?: 'continuous' | 'nextPage',\n pageOverride?: {\n size?: 'A4' | 'A3' | 'LETTER' | 'LEGAL' | { width: number; height: number };\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n header?: number;\n footer?: number;\n gutter?: number;\n };\n }\n): WordSectionProperties {\n // Get base page setup from theme\n const basePageSetup = getPageSetup(theme, themeName);\n\n // Apply section-level page overrides if present\n const pageSetup = pageOverride\n ? {\n size: {\n ...basePageSetup.size,\n ...(pageOverride.size && typeof pageOverride.size === 'object'\n ? pageOverride.size\n : pageOverride.size\n ? (() => {\n // Convert string size to dimensions\n const sizes = {\n A4: { width: 11906, height: 16838 },\n A3: { width: 16838, height: 23811 },\n LETTER: { width: 12240, height: 15840 },\n LEGAL: { width: 12240, height: 20160 },\n };\n return sizes[pageOverride.size as keyof typeof sizes];\n })()\n : {}),\n },\n margin: {\n ...basePageSetup.margin,\n ...(pageOverride.margins || {}),\n },\n }\n : basePageSetup;\n\n const properties: WordSectionProperties = {\n page: pageSetup,\n column: {\n count: columnSettings.count,\n equalWidth: columnSettings.equalWidth,\n space: columnSettings.space,\n },\n };\n\n // If explicit children were provided, convert to docx Column instances\n if (\n (columnSettings as any).children &&\n Array.isArray((columnSettings as any).children)\n ) {\n const children = (columnSettings as any).children as {\n width?: number;\n space?: number;\n }[];\n // When we have explicit column children, ensure equalWidth is explicitly false\n // so Word doesn't override widths with equal distribution.\n properties.column.equalWidth = false;\n // Also remove top-level space to avoid conflicting with per-column spaces\n delete properties.column.space;\n\n properties.column.children = children.map(\n (c) =>\n new DocxColumn({\n width: c.width as number,\n ...(c.space !== undefined ? { space: c.space } : {}),\n })\n );\n }\n\n if (sectionType) {\n properties.type =\n sectionType === 'continuous'\n ? SectionType.CONTINUOUS\n : SectionType.NEXT_PAGE;\n }\n\n return properties;\n}\n\n/**\n * Create explicit column settings from a Columns component props\n * - width/gap accept number (points) or percentage string relative to available width\n */\nfunction createColumnSettingsFromConfig(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): ColumnSettings {\n const cfg = ((component as any).props || {}) as {\n columns?: Array<{ width?: number | string; gap?: number | string }>;\n };\n\n // Fallback to single column if no valid array is provided\n const columns = (cfg.columns || []) as Array<{\n width?: number | string;\n gap?: number | string;\n }>;\n\n if (!Array.isArray(columns) || columns.length === 0) {\n return { count: 1 };\n }\n\n const availableWidthTwips = getAvailableWidthTwips(theme, themeName);\n\n // First pass: compute defined widths/spaces; collect indexes without width\n const childSettings: { width?: number; space?: number }[] = [];\n let totalDefinedWidth = 0;\n let totalSpace = 0;\n const unspecifiedWidthIndexes: number[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i];\n const child: { width?: number; space?: number } = {};\n\n if (c.width !== undefined) {\n const widthTwips = relativeLengthToTwips(c.width, availableWidthTwips);\n if (widthTwips > 0) {\n child.width = widthTwips;\n totalDefinedWidth += widthTwips;\n }\n } else {\n unspecifiedWidthIndexes.push(i);\n }\n\n if (c.gap !== undefined) {\n const spaceTwips = relativeLengthToTwips(c.gap, availableWidthTwips);\n if (spaceTwips > 0) {\n child.space = spaceTwips;\n totalSpace += spaceTwips;\n }\n }\n\n childSettings.push(child);\n }\n\n // Validate that defined widths + gaps do not exceed available width (with tolerance)\n const totalUsedTwips = totalDefinedWidth + totalSpace;\n const tolerance = 0.005; // 0.5%\n const allowed = availableWidthTwips * (1 + tolerance);\n if (totalUsedTwips > allowed) {\n const usedPercent = (totalUsedTwips / availableWidthTwips) * 100;\n // Build diagnostics per column\n const details = childSettings\n .map((c, idx) => {\n const wPct = c.width\n ? ((c.width / availableWidthTwips) * 100).toFixed(1) + '%'\n : 'auto/unspecified';\n const gPct = c.space\n ? ((c.space / availableWidthTwips) * 100).toFixed(1) + '%'\n : '0%';\n return ` - Column ${idx + 1}: width=${wPct}, gap=${gPct}`;\n })\n .join('\\n');\n const suggestion =\n 'Reduce one or more widths/gaps so total <= 100%, remove the last gap, or set some widths to \"auto\" to consume remaining space.';\n throw new Error(\n `Columns configuration exceeds available width: widths + gaps = ${usedPercent.toFixed(1)}% (> 100% + ${(\n tolerance * 100\n ).toFixed(\n 1\n )}% tolerance)\\nDetails:\\n${details}\\nSuggestion: ${suggestion}`\n );\n }\n\n // Distribute remaining width equally among unspecified widths\n const remaining = Math.max(\n 0,\n availableWidthTwips - totalSpace - totalDefinedWidth\n );\n if (unspecifiedWidthIndexes.length > 0) {\n const each = Math.floor(remaining / unspecifiedWidthIndexes.length);\n for (const idx of unspecifiedWidthIndexes) {\n childSettings[idx].width = each;\n }\n }\n\n return {\n count: columns.length,\n equalWidth: false,\n children: childSettings,\n };\n}\n\n/**\n * Calculate optimal column distribution for content\n */\nexport function calculateColumnDistribution(\n components: ComponentDefinition[],\n columnCount: number\n): ComponentDefinition[][] {\n if (columnCount === 1) {\n return [components];\n }\n\n // Simple distribution - could be enhanced with content-aware logic\n const columns: ComponentDefinition[][] = Array(columnCount)\n .fill(null)\n .map(() => []);\n let currentColumn = 0;\n\n for (const component of components) {\n columns[currentColumn].push(component);\n currentColumn = (currentColumn + 1) % columnCount;\n }\n\n return columns;\n}\n","/**\n * Render Functions\n * Transform components and layout into Word document elements\n */\n\nimport {\n Document,\n Paragraph,\n Table,\n TableOfContents,\n ISectionOptions,\n TextRun,\n ImageRun,\n AlignmentType,\n BookmarkStart,\n BookmarkEnd,\n Textbox,\n} from 'docx';\nimport {\n calculateImageDimensions,\n getImageBuffer,\n parseWidthValue,\n} from '../utils/imageUtils';\nimport {\n getThemeColors,\n getThemeFonts,\n getNormalStyle,\n} from '../themes/defaults';\nimport {\n ComponentDefinition,\n RenderContext,\n isHeadingComponent,\n isParagraphComponent,\n isColumnsComponent,\n isImageComponent,\n isTextBoxComponent,\n isStatisticComponent,\n isTableComponent,\n isSectionComponent,\n isHeaderComponent,\n isFooterComponent,\n isListComponent,\n isTocComponent,\n isHighchartsComponent,\n ParagraphComponentDefinition,\n ImageComponentDefinition,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { createWordStyles } from '../styles/themeToDocxAdapter';\nimport { parseTextWithDecorators } from '../utils/textParser';\nimport { resolveColor } from '../styles/utils/colorUtils';\nimport { resolveFontFamily } from '../styles/utils/styleHelpers';\nimport { getPageSetup } from '../styles/utils/layoutUtils';\nimport { ProcessedDocument, createRenderContext } from './structure';\nimport { LayoutPlan, SectionLayout } from './layout';\nimport {\n renderComponentWithCache,\n initializeComponentCache,\n} from './cached-render';\nimport { MemoryCache } from '../cache';\nimport {\n renderHeadingComponent,\n renderParagraphComponent,\n renderListComponent,\n renderImageComponent,\n renderTableComponent,\n renderSectionComponent,\n renderColumnsComponent,\n renderStatisticComponent,\n renderHeaderComponent,\n renderFooterComponent,\n renderTocComponent,\n renderHighchartsComponent,\n renderTextBoxComponent,\n} from '../components';\nimport { createHeaderElement, createFooterElement } from './content';\nimport { mapFloatingOptions } from '../utils/docxImagePositioning';\n\n/**\n * Convert alignment string to docx AlignmentType\n */\nfunction getAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n\n/**\n * Render a complete document from structure and layout\n */\nexport async function renderDocument(\n structure: ProcessedDocument,\n layout: LayoutPlan,\n options?: { cache?: MemoryCache; bypassCache?: boolean }\n): Promise<Document> {\n // Initialize component cache if provided\n if (options?.cache) {\n initializeComponentCache(options.cache);\n } else if (!options?.bypassCache) {\n // Initialize with default cache unless bypassed\n initializeComponentCache();\n }\n\n // Clear the numbering registry for a fresh start\n const { globalNumberingRegistry } = await import('../utils/numberingConfig');\n globalNumberingRegistry.clear();\n\n const sections: ISectionOptions[] = [];\n\n // Render all layout sections\n const context = createRenderContext(\n structure,\n structure.theme,\n structure.themeName\n );\n\n // Initialize bookmark counter for this document (scoped to renderDocument call)\n let sectionBookmarkCounter = 0;\n\n // Track previous section's headers/footers for 'linkToPrevious' functionality\n let previousHeader: ComponentDefinition[] | undefined = undefined;\n let previousFooter: ComponentDefinition[] | undefined = undefined;\n\n // Render all layout sections\n for (let idx = 0; idx < layout.sections.length; idx++) {\n const layoutSection = layout.sections[idx];\n\n /**\n * Compute stable section ordinal for user-defined sections.\n *\n * When a user-defined Section component spans multiple layout chunks (e.g., due to\n * column transitions), all chunks must share the same bookmark ID for TOC scoping\n * to work correctly. This ensures:\n * 1. Bookmark start appears only in the first chunk\n * 2. All chunks use the same stable bookmark ID (no timestamp)\n * 3. Bookmark end appears only in the last chunk\n *\n * Previously used Date.now() in bookmark IDs, which caused different IDs per chunk.\n * Now we use a stable ordinal that's consistent across all chunks of the same section.\n */\n let sectionOrdinal: number | undefined = undefined;\n if (layoutSection.belongsToUserSection) {\n if (layoutSection.isUserSection) {\n // First chunk of this user-defined section: assign ordinal as next index\n sectionOrdinal = sectionBookmarkCounter + 1;\n } else {\n // Subsequent chunk: reuse last assigned ordinal\n sectionOrdinal = sectionBookmarkCounter; // previous value already incremented after first chunk\n }\n }\n // Handle 'linkToPrevious' value for headers\n let headerToUse: ComponentDefinition[] | undefined;\n if (layoutSection.header === 'linkToPrevious') {\n // Use the previous section's header\n headerToUse = previousHeader;\n } else if (layoutSection.header) {\n // Section has its own header\n headerToUse = layoutSection.header as ComponentDefinition[];\n previousHeader = headerToUse; // Update previous for next section\n } else {\n // No header explicitly set for this section.\n // Important: Word links headers/footers to previous by default.\n // To prevent unintended inheritance, emit an explicit empty header\n // when a previous header exists and caller didn't request linking.\n headerToUse = previousHeader ? [] : undefined;\n // Keep previousHeader cached for potential future explicit linkToPrevious\n }\n\n // Handle 'linkToPrevious' value for footers\n let footerToUse: ComponentDefinition[] | undefined;\n if (layoutSection.footer === 'linkToPrevious') {\n // Use the previous section's footer\n footerToUse = previousFooter;\n } else if (layoutSection.footer) {\n // Section has its own footer\n footerToUse = layoutSection.footer as ComponentDefinition[];\n previousFooter = footerToUse; // Update previous for next section\n } else {\n // No footer explicitly set for this section.\n // Prevent unintended inheritance by emitting an explicit empty footer\n // when a previous footer exists and caller didn't request linking.\n footerToUse = previousFooter ? [] : undefined;\n // Keep previousFooter cached for potential future explicit linkToPrevious\n }\n\n const sectionToRender = {\n ...layoutSection,\n header: headerToUse,\n footer: footerToUse,\n };\n\n // Determine if we should close the bookmark in this chunk.\n // Close when this is the last chunk belonging to the same user-defined section.\n let closeBookmark = false;\n if (layoutSection.belongsToUserSection && sectionOrdinal !== undefined) {\n const next = layout.sections[idx + 1];\n if (!next || !next.belongsToUserSection || next.isUserSection) {\n closeBookmark = true;\n }\n }\n\n const rendered = await renderSection(\n sectionToRender,\n structure.theme,\n structure.themeName,\n context,\n sectionOrdinal,\n closeBookmark\n );\n\n // Increment counter if this section created a bookmark\n if (layoutSection.isUserSection) {\n sectionBookmarkCounter++;\n }\n\n if (rendered.children.length > 0) {\n sections.push(rendered);\n }\n }\n\n // Get all numbering configurations from the registry (already imported above)\n const numberingConfigs = globalNumberingRegistry.getAll();\n\n return new Document({\n styles: createWordStyles(structure.theme),\n sections,\n features: {\n updateFields: true, // Required for TOC fields to update correctly\n },\n // Add numbering configurations if any lists were rendered\n ...(numberingConfigs.length > 0 && {\n numbering: {\n config: numberingConfigs as readonly {\n readonly levels: readonly import('docx').ILevelsOptions[];\n readonly reference: string;\n }[],\n },\n }),\n });\n}\n\n/**\n * Render header/footer components into paragraphs\n */\nasync function renderHeaderFooterComponents(\n components: ComponentDefinition[] | undefined,\n theme: ThemeConfig,\n _themeName: string,\n _context: RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!components || components.length === 0) {\n return [];\n }\n\n // Filter out components with enabled: false (defaults to true when not specified)\n const activeComponents = components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n\n const elements: (Paragraph | Table)[] = [];\n\n for (const component of activeComponents) {\n if (isParagraphComponent(component)) {\n const textComp = component as ParagraphComponentDefinition;\n\n // Use theme's normal style for header/footer text since header/footer styles are removed\n const normalStyle = getNormalStyle(theme);\n\n // Create text style using theme's normal styling\n const textStyle = {\n font:\n textComp.props.font?.family ||\n resolveFontFamily(theme, normalStyle.font) ||\n getThemeFonts(theme).body.family,\n size:\n ((textComp.props.font?.size ?? normalStyle.size ?? 11) as number) * 2, // Convert to half-points\n bold: textComp.props.font?.bold ?? false,\n italics: textComp.props.font?.italic ?? false,\n color:\n (textComp.props.font?.color &&\n resolveColor(textComp.props.font.color, theme)) ||\n (normalStyle.color && resolveColor(normalStyle.color, theme)) ||\n getThemeColors(theme).textPrimary,\n } as const;\n\n // Use parseTextWithDecorators to support rich text formatting\n const textRuns = parseTextWithDecorators(textComp.props.text, textStyle);\n\n elements.push(\n new Paragraph({\n children: textRuns,\n alignment: textComp.props.alignment\n ? getAlignment(textComp.props.alignment)\n : undefined,\n style: 'Normal',\n })\n );\n } else if (isImageComponent(component)) {\n const imageComp = component as ImageComponentDefinition;\n // Get image source (base64 or path)\n let imageSource = imageComp.props.base64 || imageComp.props.path;\n if (!imageSource) {\n elements.push(\n new Paragraph({\n children: [\n new TextRun({\n text: '[IMAGE: Missing path or base64 property]',\n font: getThemeFonts(theme).body.family,\n size: 20,\n bold: true,\n color: '#FF0000',\n }),\n ],\n alignment: imageComp.props.alignment\n ? getAlignment(imageComp.props.alignment)\n : undefined,\n style: 'Normal',\n })\n );\n continue;\n }\n\n let imageBuffer: Buffer;\n\n try {\n // Try to use the provided source first\n imageBuffer = await getImageBuffer(imageSource);\n } catch (error) {\n throw new Error(\n `Failed to load image from ${imageSource.substring(0, 50)}`\n );\n }\n\n try {\n // Get page setup from theme for proper width calculations\n const pageSetup = getPageSetup(theme);\n\n // Convert twips to pixels: 1 twip = 1/1440 inch, 1 inch = 96 pixels at 96 DPI\n const TWIPS_TO_PIXELS = 96 / 1440;\n\n // Calculate page width and content width (page - left margin - right margin) in pixels\n const pageWidthPx = Math.round(pageSetup.size.width * TWIPS_TO_PIXELS);\n const contentWidthPx = Math.round(\n (pageSetup.size.width -\n pageSetup.margin.left -\n pageSetup.margin.right) *\n TWIPS_TO_PIXELS\n );\n\n // Determine reference dimensions based on widthRelativeTo/heightRelativeTo properties\n const widthRelativeTo = imageComp.props.widthRelativeTo || 'content';\n const heightRelativeTo = imageComp.props.heightRelativeTo || 'content';\n const referenceWidthPx =\n widthRelativeTo === 'page' ? pageWidthPx : contentWidthPx;\n\n // Calculate page height and content height in pixels\n const pageHeightPx = Math.round(\n pageSetup.size.height * TWIPS_TO_PIXELS\n );\n const contentHeightPx = Math.round(\n (pageSetup.size.height -\n pageSetup.margin.top -\n pageSetup.margin.bottom) *\n TWIPS_TO_PIXELS\n );\n const referenceHeightPx =\n heightRelativeTo === 'page' ? pageHeightPx : contentHeightPx;\n\n const fallbackHeight = Math.round(referenceWidthPx * 0.6);\n\n // Parse width value if it's a string percentage (like \"90%\")\n const parsedWidth =\n typeof imageComp.props.width === 'string'\n ? parseWidthValue(imageComp.props.width, referenceWidthPx) // Use appropriate reference width\n : imageComp.props.width;\n\n // Parse height value if it's a string percentage (like \"90%\")\n const parsedHeight =\n typeof imageComp.props.height === 'string'\n ? parseWidthValue(imageComp.props.height, referenceHeightPx) // Use reference height based on heightRelativeTo\n : imageComp.props.height;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imageSource,\n parsedWidth,\n parsedHeight,\n referenceWidthPx,\n fallbackHeight\n );\n\n // Map floating options if present\n const floatingOptions = mapFloatingOptions(imageComp.props.floating);\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n ...(floatingOptions && { floating: floatingOptions }),\n });\n\n elements.push(\n new Paragraph({\n children: [imageRun],\n alignment: imageComp.props.alignment\n ? getAlignment(imageComp.props.alignment)\n : undefined,\n style: 'Normal',\n })\n );\n } catch (error) {\n // Fallback for missing images - log error for debugging\n console.error(\n `[Header/Footer Image Error] Failed to render image: ${imageComp.props.path?.substring(0, 50)}...`,\n error instanceof Error ? error.message : error\n );\n elements.push(\n new Paragraph({\n children: [\n new TextRun({\n text: `[IMAGE: ${imageComp.props.path}]`,\n font: getThemeFonts(theme).body.family,\n size: 20,\n color: getThemeColors(theme).secondary,\n bold: true,\n }),\n ],\n style: 'Normal',\n })\n );\n }\n } else if (isTableComponent(component)) {\n // Use renderTableComponent for consistent table rendering in headers/footers\n // This ensures cellDefaults, padding, borders, and all table features work correctly\n const tables = await renderTableComponent(component, theme, _themeName);\n elements.push(...tables);\n }\n // Other component types can be added here as needed\n }\n\n return elements;\n}\n\n/**\n * Render a section with layout\n */\nexport async function renderSection(\n section: SectionLayout,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext,\n sectionOrdinal?: number,\n closeBookmark?: boolean\n): Promise<ISectionOptions> {\n const elements: (Paragraph | Table | TableOfContents)[] = [];\n\n // Update context for this section\n // Generate a unique bookmark for this section so TOCs can scope to it\n const isFirstLayoutOfUserSection = section.isUserSection;\n // Use a stable bookmark ID across all layout sections of the same user-defined section\n const sharedLinkId =\n section.belongsToUserSection && sectionOrdinal ? sectionOrdinal : undefined;\n const sectionBookmarkId =\n sharedLinkId !== undefined ? `_Section_${sharedLinkId}` : undefined;\n\n const sectionContext: RenderContext = {\n ...context,\n section: {\n ...context.section,\n currentLayout: section.layoutType,\n columnCount: section.properties.column?.count || 1,\n // Always pass the same bookmark ID for all layout chunks of the same section\n sectionBookmarkId: sectionBookmarkId,\n // Pass section title level for TOC scoping (excludes section title from its own TOC)\n sectionTitleLevel: section.sectionTitleLevel,\n },\n };\n\n // Add bookmark start before all section content so TOCs can scope to it\n if (\n sectionBookmarkId &&\n isFirstLayoutOfUserSection &&\n sharedLinkId !== undefined\n ) {\n elements.push(\n new Paragraph({\n children: [new BookmarkStart(sectionBookmarkId, sharedLinkId)],\n spacing: {\n before: 0,\n after: 0,\n line: 0,\n },\n })\n );\n }\n\n // Filter out components with enabled: false and render remaining components (with caching)\n const activeComponents = section.components.filter(\n (m) => !('enabled' in m && m.enabled === false)\n );\n for (const component of activeComponents) {\n const rendered = await renderComponentWithCache(\n component,\n theme,\n themeName,\n sectionContext,\n false // Don't bypass cache\n );\n elements.push(...rendered);\n }\n\n // Close bookmark after section content\n if (closeBookmark && sharedLinkId !== undefined) {\n elements.push(\n new Paragraph({\n children: [new BookmarkEnd(sharedLinkId)],\n })\n );\n }\n\n // Build section options with headers/footers if defined\n let headers: ISectionOptions['headers'] | undefined;\n let footers: ISectionOptions['footers'] | undefined;\n\n if (section.header || section.footer) {\n if (section.header && section.header !== 'linkToPrevious') {\n const headerComponents = section.header as ComponentDefinition[];\n const headerParagraphs = await renderHeaderFooterComponents(\n headerComponents,\n theme,\n themeName,\n sectionContext\n );\n // If components were provided but produced no paragraphs, still create\n // an empty Header to break Word's default link-to-previous behavior.\n if (headerComponents.length === 0 || headerParagraphs.length > 0) {\n headers = {\n default: createHeaderElement(headerParagraphs),\n };\n }\n }\n\n if (section.footer && section.footer !== 'linkToPrevious') {\n const footerComponents = section.footer as ComponentDefinition[];\n const footerParagraphs = await renderHeaderFooterComponents(\n footerComponents,\n theme,\n themeName,\n sectionContext\n );\n if (footerComponents.length === 0 || footerParagraphs.length > 0) {\n footers = {\n default: createFooterElement(footerParagraphs),\n };\n }\n }\n }\n\n const sectionOptions: ISectionOptions = {\n properties: section.properties,\n children: elements,\n headers,\n footers,\n };\n\n return sectionOptions;\n}\n\n/**\n * Render a single component to Word elements\n */\nexport async function renderComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<(Paragraph | Table | TableOfContents | Textbox)[]> {\n if (isHeadingComponent(component)) {\n return renderHeadingComponent(component, theme, themeName);\n } else if (isParagraphComponent(component)) {\n return renderParagraphComponent(component, theme, themeName);\n } else if (isColumnsComponent(component)) {\n return await renderColumnsComponent(component, theme, themeName, context);\n } else if (isImageComponent(component)) {\n return await renderImageComponent(component, theme);\n } else if (isTextBoxComponent(component)) {\n return await renderTextBoxComponent(component, theme, themeName, context);\n } else if (isStatisticComponent(component)) {\n return renderStatisticComponent(component, theme);\n } else if (isTableComponent(component)) {\n return await renderTableComponent(component, theme, themeName);\n } else if (isHeaderComponent(component)) {\n return renderHeaderComponent(component, theme, themeName);\n } else if (isFooterComponent(component)) {\n return renderFooterComponent(component, theme, themeName);\n } else if (isListComponent(component)) {\n return renderListComponent(component, theme, themeName);\n } else if (isTocComponent(component)) {\n return renderTocComponent(component, theme, context);\n } else if (isHighchartsComponent(component)) {\n return await renderHighchartsComponent(component, theme, themeName);\n } else if (isSectionComponent(component)) {\n return await renderSectionComponent(component, theme, themeName, context);\n }\n\n throw new Error(\n `Unknown component type: ${(component as ComponentDefinition).name}`\n );\n}\n","import {\n IStylesOptions,\n IRunStylePropertiesOptions,\n IParagraphStylePropertiesOptions,\n AlignmentType,\n TabStopPosition,\n} from 'docx';\nimport { getTheme } from '../templates/themes';\nimport type { ThemeConfig } from './index';\nimport { resolveColor } from './utils/colorUtils';\nimport {\n convertLineSpacing,\n pointsToTwips,\n resolveFontProperties,\n mergeFontAndStyleProperties,\n} from './utils/styleHelpers';\n\n// Border types for paragraph borders in theme styles\ninterface ThemeBorderDefinition {\n style: string; // e.g., 'single', 'double', 'dotted', etc.\n size: number; // width in eighths of a point (docx sz)\n color: string; // hex or theme color key\n space?: number; // space in points\n}\n\ninterface ThemeBorders {\n top?: ThemeBorderDefinition;\n bottom?: ThemeBorderDefinition;\n left?: ThemeBorderDefinition;\n right?: ThemeBorderDefinition;\n}\n\n// Style properties for various text elements\ninterface StyleProperties {\n font?: 'heading' | 'body' | 'mono' | 'light';\n size?: number;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n lineSpacing?: {\n type: 'single' | 'atLeast' | 'exactly' | 'double' | 'multiple';\n value?: number;\n };\n spacing?: {\n before?: number;\n after?: number;\n };\n characterSpacing?: { type: 'condensed' | 'expanded'; value: number };\n priority?: number;\n baseStyle?: string;\n followingStyle?: string;\n widowControl?: boolean;\n keepNext?: boolean;\n keepLinesTogether?: boolean;\n outlineLevel?: number;\n borders?: ThemeBorders;\n indent?: {\n left?: number;\n hanging?: number;\n };\n}\n\n/**\n * Type-safe style name union\n */\ntype StyleName =\n | 'normal'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n | 'title'\n | 'subtitle';\n\n/**\n * Type guard to check if a style name is valid\n */\nfunction isValidStyleName(name: string): name is StyleName {\n return [\n 'normal',\n 'heading1',\n 'heading2',\n 'heading3',\n 'heading4',\n 'heading5',\n 'heading6',\n 'title',\n 'subtitle',\n ].includes(name);\n}\n\n/**\n * Type-safe style getter with proper error handling\n */\nfunction getStyleSafe(\n theme: ThemeConfig,\n styleName: string\n): StyleProperties | undefined {\n if (!isValidStyleName(styleName)) {\n console.warn(`Invalid style name: ${styleName}`);\n return undefined;\n }\n return theme.styles?.[styleName] as StyleProperties | undefined;\n}\n\n/**\n * Resolves a style with baseStyle inheritance.\n * If a style has a baseStyle property, recursively resolves the base style first\n * and merges its properties with the current style (current overrides base).\n *\n * @param theme - Theme configuration\n * @param styleName - Name of the style to resolve\n * @param visited - Set of visited style names to prevent circular references\n * @returns Resolved style with all inherited properties, or undefined if not found\n */\nfunction resolveStyleWithBaseStyle(\n theme: ThemeConfig,\n styleName: string,\n visited: Set<string> = new Set()\n): StyleProperties | undefined {\n // Prevent circular references\n if (visited.has(styleName)) {\n console.warn(\n `Circular baseStyle reference detected: ${Array.from(visited).join(\n ' → '\n )} → ${styleName}`\n );\n return undefined;\n }\n\n visited.add(styleName);\n\n // Use type-safe getter instead of type assertion\n const style = getStyleSafe(theme, styleName);\n if (!style) {\n return undefined;\n }\n\n // If no baseStyle, return style as-is\n if (!style.baseStyle) {\n return style;\n }\n\n // Recursively resolve base style\n const baseStyle = resolveStyleWithBaseStyle(\n theme,\n style.baseStyle,\n new Set(visited) // Pass copy to allow different branches\n );\n\n if (!baseStyle) {\n // If baseStyle doesn't exist, just return current style\n return style;\n }\n\n // Merge: base properties first, then override with current style properties\n // Filter out undefined values from current style to preserve base style values\n const mergedStyle = mergeFontAndStyleProperties(\n baseStyle,\n style\n ) as StyleProperties;\n\n // Manually merge properties not covered by mergeFontAndStyleProperties\n // Borders: inherit from baseStyle unless explicitly provided in current style\n if (style.borders === undefined && baseStyle.borders !== undefined) {\n mergedStyle.borders = baseStyle.borders;\n } else if (style.borders !== undefined) {\n mergedStyle.borders = style.borders;\n }\n\n return mergedStyle;\n}\n\nfunction convertAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n\n/**\n * Resolve spacing from new nested format\n */\nfunction resolveSpacing(spacing?: { before?: number; after?: number }): {\n before?: number;\n after?: number;\n} {\n return {\n before: spacing?.before ? pointsToTwips(spacing.before) : undefined,\n after: spacing?.after ? pointsToTwips(spacing.after) : undefined,\n };\n}\n\n/**\n * Convert merged style properties to docx run properties\n */\nfunction convertRunProperties(\n merged: any,\n theme: ThemeConfig,\n defaultColor?: string,\n defaultSize?: number\n): IRunStylePropertiesOptions {\n return {\n font: merged.family || 'Arial',\n size: (merged.size || defaultSize || 11) * 2,\n color: resolveColor(\n merged.color || defaultColor || theme.colors.text,\n theme\n ),\n ...(merged.bold !== undefined && { bold: merged.bold }),\n ...(merged.italic !== undefined && { italic: merged.italic }),\n ...(merged.underline !== undefined &&\n merged.underline && { underline: { type: 'single' } }),\n ...(merged.characterSpacing && {\n characterSpacing:\n merged.characterSpacing.type === 'condensed'\n ? -merged.characterSpacing.value\n : merged.characterSpacing.value,\n }),\n };\n}\n\n/**\n * Convert merged style properties to docx paragraph properties\n */\nfunction convertParagraphProperties(\n merged: any,\n styleProps?: StyleProperties,\n theme?: ThemeConfig\n): IParagraphStylePropertiesOptions {\n return {\n spacing: {\n ...resolveSpacing(merged.spacing),\n ...convertLineSpacing(merged.lineSpacing),\n },\n alignment: convertAlignment(merged.alignment || 'left'),\n ...(styleProps?.keepNext !== undefined && {\n keepNext: styleProps.keepNext,\n }),\n ...(styleProps?.keepLinesTogether !== undefined && {\n keepLines: styleProps.keepLinesTogether,\n }),\n ...(styleProps?.widowControl !== undefined && {\n widowControl: styleProps.widowControl,\n }),\n ...(styleProps?.outlineLevel !== undefined && {\n outlineLevel: styleProps.outlineLevel,\n }),\n ...(styleProps?.borders &&\n theme && {\n border: convertBorders(styleProps.borders, theme),\n }),\n ...(styleProps?.indent && {\n indent: {\n ...(styleProps.indent.left !== undefined && {\n left: styleProps.indent.left,\n }),\n ...(styleProps.indent.hanging !== undefined && {\n hanging: styleProps.indent.hanging,\n }),\n },\n }),\n } as IParagraphStylePropertiesOptions;\n}\n\n/**\n * Convert theme border definitions to docx paragraph border options\n */\nfunction convertBorders(\n borders: ThemeBorders | undefined,\n theme: ThemeConfig\n):\n | {\n top?: { style: string; size: number; color: string; space?: number };\n bottom?: { style: string; size: number; color: string; space?: number };\n left?: { style: string; size: number; color: string; space?: number };\n right?: { style: string; size: number; color: string; space?: number };\n }\n | undefined {\n if (!borders) return undefined;\n\n const mapSide = (side?: ThemeBorderDefinition) =>\n side\n ? {\n style: side.style,\n size: side.size,\n color: resolveColor(side.color, theme),\n ...(side.space !== undefined ? { space: side.space } : {}),\n }\n : undefined;\n\n const top = mapSide(borders.top);\n const bottom = mapSide(borders.bottom);\n const left = mapSide(borders.left);\n const right = mapSide(borders.right);\n\n const anyDefined = top || bottom || left || right;\n return anyDefined\n ? {\n ...(top && { top }),\n ...(bottom && { bottom }),\n ...(left && { left }),\n ...(right && { right }),\n }\n : undefined;\n}\n\nexport interface WordStyleDefinition {\n id: string;\n name: string;\n basedOn?: string;\n next?: string;\n quickFormat?: boolean;\n run?: IRunStylePropertiesOptions;\n paragraph?: IParagraphStylePropertiesOptions;\n}\n\n/**\n * Creates Word document styles from theme configuration\n * @param themeNameOrObject The theme to use for styling (name string or theme object)\n * @returns IStylesOptions for docx Document\n */\nexport function createWordStyles(\n themeNameOrObject: string | ThemeConfig = 'minimal'\n): IStylesOptions {\n const theme: ThemeConfig =\n typeof themeNameOrObject === 'string'\n ? getTheme(themeNameOrObject) || getTheme('minimal')!\n : themeNameOrObject;\n\n const paragraphStyles: WordStyleDefinition[] = [\n // Normal body text style\n {\n id: 'Normal',\n name: 'Normal',\n quickFormat: true,\n run: (() => {\n const normalStyle =\n resolveStyleWithBaseStyle(theme, 'normal') || theme.styles?.normal;\n const fontProps = resolveFontProperties(theme, normalStyle?.font);\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: normalStyle?.size,\n color: normalStyle?.color,\n bold: normalStyle?.bold,\n italic: normalStyle?.italic,\n underline: normalStyle?.underline,\n characterSpacing: normalStyle?.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.text);\n })(),\n paragraph: (() => {\n const normalStyle =\n resolveStyleWithBaseStyle(theme, 'normal') || theme.styles?.normal;\n const fontProps = resolveFontProperties(theme, normalStyle?.font);\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: normalStyle?.alignment,\n lineSpacing: normalStyle?.lineSpacing,\n spacing: normalStyle?.spacing,\n });\n\n return convertParagraphProperties(merged, normalStyle, theme);\n })(),\n },\n ];\n\n // Generate heading styles from theme configuration\n for (let i = 1; i <= 6; i++) {\n const headingKey = `heading${i}` as keyof typeof theme.styles;\n const rawHeadingStyle = theme.styles?.[headingKey] as\n | StyleProperties\n | undefined;\n\n if (rawHeadingStyle) {\n const headingStyle =\n resolveStyleWithBaseStyle(theme, headingKey) || rawHeadingStyle;\n paragraphStyles.push({\n id: `Heading${i}`,\n name: `Heading ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: headingStyle.size,\n color: headingStyle.color,\n bold: headingStyle.bold,\n italic: headingStyle.italic,\n underline: headingStyle.underline,\n characterSpacing: headingStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.primary, 20);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: headingStyle.alignment,\n lineSpacing: headingStyle.lineSpacing,\n spacing: headingStyle.spacing,\n });\n\n return convertParagraphProperties(merged, headingStyle, theme);\n })(),\n });\n } else {\n // Fallback heading style if not defined in theme\n const fontProps = resolveFontProperties(theme, 'heading');\n paragraphStyles.push({\n id: `Heading${i}`,\n name: `Heading ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 20) * 2,\n color: resolveColor(fontProps.color || theme.colors.primary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n before: 240 - (i - 1) * 40,\n after: 120 - (i - 1) * 20,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n }\n\n // Generate display-only heading styles for text components (non-TOC, non-outline)\n for (let i = 1; i <= 6; i++) {\n const headingKey = `heading${i}` as keyof typeof theme.styles;\n const rawHeadingStyle = theme.styles?.[headingKey] as\n | StyleProperties\n | undefined;\n\n if (rawHeadingStyle) {\n const headingStyle =\n resolveStyleWithBaseStyle(theme, `heading${i}`) || rawHeadingStyle;\n\n paragraphStyles.push({\n id: `JTD_HeadingText${i}`,\n name: `Heading Text ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: false,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: headingStyle.size,\n color: headingStyle.color,\n bold: headingStyle.bold,\n italic: headingStyle.italic,\n underline: headingStyle.underline,\n characterSpacing: headingStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.primary, 20);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n headingStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: headingStyle.alignment,\n lineSpacing: headingStyle.lineSpacing,\n spacing: headingStyle.spacing,\n });\n\n // Explicitly drop outlineLevel to avoid TOC participation\n return convertParagraphProperties(\n merged,\n { ...(headingStyle as any), outlineLevel: undefined },\n theme\n );\n })(),\n });\n } else {\n // Fallback display heading style mirrors fallback heading visuals\n const fontProps = resolveFontProperties(theme, 'heading');\n paragraphStyles.push({\n id: `JTD_HeadingText${i}`,\n name: `Heading Text ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: false,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 20) * 2,\n color: resolveColor(fontProps.color || theme.colors.primary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n before: 240 - (i - 1) * 40,\n after: 120 - (i - 1) * 20,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n }\n\n // Add Title style from theme configuration\n if (theme.styles?.title) {\n const titleStyle =\n resolveStyleWithBaseStyle(theme, 'title') || theme.styles.title;\n paragraphStyles.push({\n id: 'Title',\n name: 'Title',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n titleStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: titleStyle.size,\n color: titleStyle.color,\n bold: titleStyle.bold,\n italic: titleStyle.italic,\n underline: titleStyle.underline,\n characterSpacing: titleStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.primary, 20);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n titleStyle.font || 'heading'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: titleStyle.alignment,\n lineSpacing: titleStyle.lineSpacing,\n spacing: titleStyle.spacing,\n });\n\n return convertParagraphProperties(merged, titleStyle, theme);\n })(),\n });\n } else {\n // Fallback title style if no theme configuration\n const fontProps = resolveFontProperties(theme, 'heading');\n paragraphStyles.push({\n id: 'Title',\n name: 'Title',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 20) * 2,\n color: resolveColor(fontProps.color || theme.colors.primary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n after: 400,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n\n // Add Subtitle style from theme configuration\n if (theme.styles?.subtitle) {\n const subtitleStyle =\n resolveStyleWithBaseStyle(theme, 'subtitle') || theme.styles.subtitle;\n paragraphStyles.push({\n id: 'Subtitle',\n name: 'Subtitle',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n subtitleStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: subtitleStyle.size,\n color: subtitleStyle.color,\n bold: subtitleStyle.bold,\n italic: subtitleStyle.italic,\n underline: subtitleStyle.underline,\n characterSpacing: subtitleStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.secondary);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n subtitleStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: subtitleStyle.alignment,\n lineSpacing: subtitleStyle.lineSpacing,\n spacing: subtitleStyle.spacing,\n });\n\n return convertParagraphProperties(merged, subtitleStyle, theme);\n })(),\n });\n } else {\n // Fallback subtitle style if no theme configuration\n const fontProps = resolveFontProperties(theme, 'body');\n paragraphStyles.push({\n id: 'Subtitle',\n name: 'Subtitle',\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: true,\n run: {\n font: fontProps.family || 'Arial',\n size: (fontProps.size || 11) * 2,\n color: resolveColor(fontProps.color || theme.colors.secondary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n ...(fontProps.underline !== undefined &&\n fontProps.underline && { underline: { type: 'single' } }),\n },\n paragraph: {\n spacing: {\n after: 600,\n ...convertLineSpacing(fontProps.lineSpacing),\n },\n alignment: convertAlignment(fontProps.alignment || 'left'),\n },\n });\n }\n\n paragraphStyles.push(\n // Header style\n (() => {\n const fontProps = resolveFontProperties(theme, 'body');\n return {\n id: 'Header',\n name: 'Header',\n basedOn: 'Normal',\n next: 'Header',\n quickFormat: false,\n run: {\n font: fontProps.family || 'Arial',\n size: 20, // 10pt (override default)\n color: resolveColor(fontProps.color || theme.colors.secondary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n },\n paragraph: {\n alignment: 'right',\n },\n };\n })(),\n\n // Footer style\n (() => {\n const fontProps = resolveFontProperties(theme, 'body');\n return {\n id: 'Footer',\n name: 'Footer',\n basedOn: 'Normal',\n next: 'Footer',\n quickFormat: false,\n run: {\n font: fontProps.family || 'Arial',\n size: 18, // 9pt (override default)\n color: resolveColor(fontProps.color || theme.colors.secondary, theme),\n ...(fontProps.bold !== undefined && { bold: fontProps.bold }),\n ...(fontProps.italic !== undefined && { italic: fontProps.italic }),\n },\n paragraph: {\n spacing: {\n before: 120,\n },\n alignment: 'center',\n // Note: Borders are applied at the paragraph instance level, not in style definitions\n },\n };\n })()\n );\n\n // Process custom styles (any additional keys in theme.styles beyond predefined ones)\n const predefinedStyleKeys = new Set([\n 'normal',\n 'heading1',\n 'heading2',\n 'heading3',\n 'heading4',\n 'heading5',\n 'heading6',\n 'title',\n 'subtitle',\n ]);\n\n if (theme.styles) {\n for (const [styleKey, styleValue] of Object.entries(theme.styles)) {\n // Skip predefined styles (already processed above)\n if (predefinedStyleKeys.has(styleKey)) {\n continue;\n }\n\n // Skip if styleValue is not defined\n if (!styleValue) {\n continue;\n }\n\n // Generate Word-compatible style ID and name\n // Special-case TOC styles to the canonical Word display name (e.g., 'TOC 1')\n const tocMatch = /^TOC([1-9])$/.exec(styleKey);\n\n // For TOC styles, DO NOT resolve baseStyle inheritance to prevent coupling with Heading styles\n // TOC styles should only use their explicitly defined properties\n const customStyle = tocMatch\n ? styleValue\n : resolveStyleWithBaseStyle(theme, styleKey) || styleValue;\n // Use a namespaced ID for TOC styles to avoid any accidental ID collisions\n const styleId = tocMatch ? `JTD_TOC${tocMatch[1]}` : styleKey;\n const styleName = tocMatch\n ? `TOC ${tocMatch[1]}`\n : styleKey.replace(/([A-Z])/g, ' $1').trim(); // Convert camelCase/PascalCase to Title Case\n\n // Helper: map baseStyle (theme key) to Word style ID\n const mapBaseStyleId = (base?: string) => {\n if (!base) return 'Normal';\n const lower = base.toLowerCase();\n if (lower === 'normal') return 'Normal';\n if (lower === 'title') return 'Title';\n if (lower === 'subtitle') return 'Subtitle';\n const m = lower.match(/^heading([1-6])$/);\n if (m) return `Heading${m[1]}`;\n // Assume custom style ID (already registered with same id)\n return base;\n };\n\n paragraphStyles.push({\n id: styleId,\n name: styleName,\n basedOn: tocMatch\n ? 'Normal'\n : mapBaseStyleId((customStyle as StyleProperties).baseStyle),\n next: customStyle.followingStyle || 'Normal',\n quickFormat: tocMatch\n ? false\n : customStyle.priority !== undefined\n ? true\n : false,\n run: (() => {\n const fontProps = resolveFontProperties(\n theme,\n customStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n size: customStyle.size,\n color: customStyle.color,\n bold: customStyle.bold,\n italic: customStyle.italic,\n underline: customStyle.underline,\n characterSpacing: customStyle.characterSpacing,\n });\n\n return convertRunProperties(merged, theme, theme.colors.text);\n })(),\n paragraph: (() => {\n const fontProps = resolveFontProperties(\n theme,\n customStyle.font || 'body'\n );\n const merged = mergeFontAndStyleProperties(fontProps, {\n alignment: customStyle.alignment,\n lineSpacing: customStyle.lineSpacing,\n spacing: customStyle.spacing,\n });\n\n // Build base properties using converter\n const baseProps = convertParagraphProperties(\n merged,\n // Don't pass outlineLevel for TOC styles\n tocMatch\n ? { ...customStyle, outlineLevel: undefined }\n : customStyle,\n theme\n );\n\n // Add TOC-specific tab stops if needed\n const tabStops = (customStyle as any).tabStops;\n const defaultTocTabStops = tocMatch\n ? [{ type: 'right', position: 'max', leader: 'none' }]\n : undefined;\n const effectiveTabStops =\n tabStops && tabStops.length > 0 ? tabStops : defaultTocTabStops;\n\n return {\n ...baseProps,\n ...(effectiveTabStops && {\n tabStops: effectiveTabStops.map((ts: any) => ({\n type: ts.type,\n position:\n ts.position === 'max' ? TabStopPosition.MAX * 2 : ts.position,\n ...(ts.leader && { leader: ts.leader }),\n })),\n }),\n } as IParagraphStylePropertiesOptions;\n })(),\n });\n }\n }\n\n // Generate TOC level styles (TOC 1..6) using fixed, sober defaults.\n // These defaults do not depend on theme heading styles.\n for (let i = 1; i <= 6; i++) {\n // Skip if user already provided a custom TOC style via theme.styles (id must be 'TOC1'..'TOC6')\n if (\n theme.styles &&\n Object.prototype.hasOwnProperty.call(theme.styles, `TOC${i}`)\n ) {\n continue;\n }\n\n paragraphStyles.push({\n // Use a namespaced ID but canonical display name\n id: `JTD_TOC${i}`,\n name: `TOC ${i}`,\n basedOn: 'Normal',\n next: 'Normal',\n quickFormat: false,\n run: {\n font: 'Arial',\n size: 22, // 11pt\n color: resolveColor(theme.colors.text, theme),\n },\n paragraph: {\n spacing: {\n ...resolveSpacing({ before: 0, after: 6 }), // 0pt before, 6pt after\n },\n alignment: convertAlignment('left'),\n // Increase left indent per level for visual hierarchy\n indent: { left: (i - 1) * 360 }, // 0.25\" per level (360 twips)\n },\n });\n }\n\n return {\n paragraphStyles: paragraphStyles as WordStyleDefinition[], // Cast needed due to docx typing\n };\n}\n\n/**\n * Maps section levels to Word style IDs\n */\nexport function getStyleIdForLevel(level: number): string {\n const styleMap: { [key: number]: string } = {\n 1: 'Heading1',\n 2: 'Heading2',\n 3: 'Heading3',\n 4: 'Heading4',\n 5: 'Heading5',\n 6: 'Heading6',\n };\n return styleMap[level] || 'Heading1';\n}\n","import { TextRun, ExternalHyperlink, InternalHyperlink } from 'docx';\nimport {\n processTextWithPlaceholders,\n PlaceholderContext,\n} from './placeholderProcessor';\nimport { normalizeUnicodeText } from './unicode';\n\nexport interface TextStyle {\n font?: string;\n size?: number;\n color?: string;\n bold?: boolean;\n italics?: boolean;\n underline?: {\n type?:\n | 'single'\n | 'double'\n | 'thick'\n | 'dotted'\n | 'dash'\n | 'dotDash'\n | 'dotDotDash'\n | 'wave'\n | 'none'\n | 'words'\n | 'dottedHeavy'\n | 'dashedHeavy'\n | 'dashLong'\n | 'dashLongHeavy'\n | 'dashDotHeavy'\n | 'dashDotDotHeavy'\n | 'wavyHeavy'\n | 'wavyDouble';\n color?: string;\n }; // docx library expects an object or undefined, not boolean\n}\n\nexport interface TextDecoratorOptions {\n boldColor?: string;\n placeholderContext?: PlaceholderContext;\n enableHyperlinks?: boolean;\n}\n\n/**\n * Parses text with inline markdown-style decorators, placeholders, and newlines, returning an array of TextRun objects\n * Supports:\n * - **bold** or __bold__\n * - *italic* or _italic_\n * - ***bold italic*** or ___bold italic___\n * - \\n for line breaks\n * - {PLACEHOLDER} for dynamic content\n * - [link text](url) for hyperlinks (when enableHyperlinks is true)\n *\n * @param text The text to parse\n * @param baseStyle The base style to apply to all text runs\n * @param options Additional options for text decoration\n * @returns Array of TextRun and hyperlink objects with appropriate styling\n */\nexport function parseTextWithDecorators(\n text: string,\n baseStyle: TextStyle = {},\n options: TextDecoratorOptions = {}\n): (TextRun | ExternalHyperlink | InternalHyperlink)[] {\n // Guard against undefined or null text\n if (!text) {\n return [new TextRun({ text: '', ...baseStyle })];\n }\n const normalizedText = normalizeUnicodeText(text);\n\n // Check if text contains placeholders\n const hasPlaceholders = /\\{[^}]+\\}/.test(normalizedText);\n\n if (hasPlaceholders) {\n // Use new placeholder processor that handles both decorators and placeholders\n return processTextWithPlaceholders(\n normalizedText,\n baseStyle,\n options.placeholderContext || {}\n );\n }\n\n // Process hyperlinks first if enabled\n if (options.enableHyperlinks) {\n return parseTextWithHyperlinks(normalizedText, baseStyle, options);\n }\n\n // Original decorator-only processing\n const runs: (TextRun | ExternalHyperlink | InternalHyperlink)[] = [];\n\n // Process decorators on the entire text first (including newlines)\n const decoratorRegex =\n /(\\*\\*\\*|___)([\\s\\S]*?)\\1|(\\*\\*|__)([\\s\\S]*?)\\3|(\\*|_)([\\s\\S]*?)\\5/g;\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = decoratorRegex.exec(normalizedText)) !== null) {\n // Add any text before the match as plain text (handle newlines)\n if (match.index > lastIndex) {\n const plainText = normalizedText.substring(lastIndex, match.index);\n if (plainText) {\n runs.push(...createTextRunsWithNewlines(plainText, baseStyle, options));\n }\n }\n\n // Determine the style based on the decorator\n let decoratedText: string;\n let bold = baseStyle.bold || false;\n let italics = baseStyle.italics || false;\n\n if (match[1] === '***' || match[1] === '___') {\n // Bold + Italic\n decoratedText = match[2];\n bold = true;\n italics = true;\n } else if (match[3] === '**' || match[3] === '__') {\n // Bold\n decoratedText = match[4];\n bold = true;\n } else if (match[5] === '*' || match[5] === '_') {\n // Italic\n decoratedText = match[6];\n italics = true;\n } else {\n // This shouldn't happen with our regex, but just in case\n decoratedText = match[0];\n }\n\n // Create decorated text runs with newlines\n const decoratedRuns = createTextRunsWithNewlines(\n decoratedText,\n baseStyle,\n options,\n {\n bold,\n italics,\n }\n );\n runs.push(...decoratedRuns);\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last match\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n if (remainingText) {\n runs.push(\n ...createTextRunsWithNewlines(remainingText, baseStyle, options)\n );\n }\n }\n\n // If no decorators were found, return text runs with newlines\n if (runs.length === 0 && normalizedText) {\n runs.push(\n ...createTextRunsWithNewlines(normalizedText, baseStyle, options)\n );\n }\n\n return runs;\n}\n\n/**\n * Helper function to create TextRuns with newlines from text\n */\nfunction createTextRunsWithNewlines(\n text: string,\n baseStyle: TextStyle,\n options: TextDecoratorOptions,\n overrideStyle?: { bold?: boolean; italics?: boolean }\n): TextRun[] {\n const runs: TextRun[] = [];\n const lines = text.split('\\n');\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n const needsLineBreak = lineIndex > 0;\n\n if (line || needsLineBreak) {\n // Create run even for empty lines if they need a break\n const runStyle = {\n bold: overrideStyle?.bold ?? baseStyle.bold,\n italics: overrideStyle?.italics ?? baseStyle.italics,\n };\n\n runs.push(\n new TextRun({\n text: line,\n ...(baseStyle.font && { font: baseStyle.font }),\n ...(baseStyle.size && { size: baseStyle.size }),\n ...(baseStyle.color && {\n color:\n runStyle.bold && options.boldColor\n ? options.boldColor\n : baseStyle.color,\n }),\n ...(runStyle.bold !== undefined && { bold: runStyle.bold }),\n ...(runStyle.italics !== undefined && { italics: runStyle.italics }),\n ...(baseStyle.underline && { underline: baseStyle.underline }),\n ...(needsLineBreak && { break: 1 }),\n })\n );\n }\n }\n\n return runs;\n}\n\n/**\n * Parse text with hyperlinks and decorators\n * Supports markdown-style links: [link text](url)\n */\nfunction parseTextWithHyperlinks(\n text: string,\n baseStyle: TextStyle = {},\n options: TextDecoratorOptions = {}\n): (TextRun | ExternalHyperlink | InternalHyperlink)[] {\n const normalizedText = normalizeUnicodeText(text);\n const runs: (TextRun | ExternalHyperlink | InternalHyperlink)[] = [];\n\n // Regex to match markdown-style links: [text](url)\n // This regex handles nested brackets in the link text\n const hyperlinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = hyperlinkRegex.exec(normalizedText)) !== null) {\n // Add any text before the hyperlink\n if (match.index > lastIndex) {\n const plainText = normalizedText.substring(lastIndex, match.index);\n if (plainText) {\n // Recursively parse the plain text for decorators\n const plainRuns = parseTextWithDecorators(plainText, baseStyle, {\n ...options,\n enableHyperlinks: false, // Disable hyperlinks in recursive call\n });\n runs.push(...plainRuns);\n }\n }\n\n const linkText = match[1];\n const linkUrl = match[2];\n\n // Determine if this is an internal or external link\n const isInternal = linkUrl.startsWith('#');\n\n // Parse the link text for decorators (bold, italic, etc.)\n const linkTextRuns = parseTextWithDecorators(linkText, baseStyle, {\n ...options,\n enableHyperlinks: false, // Disable hyperlinks in recursive call\n });\n\n // Create the appropriate hyperlink type\n if (isInternal) {\n // Internal link (bookmark)\n const bookmarkId = linkUrl.substring(1); // Remove the # prefix\n runs.push(\n new InternalHyperlink({\n children: linkTextRuns as TextRun[], // Cast needed for docx types\n anchor: bookmarkId,\n })\n );\n } else {\n // External link\n runs.push(\n new ExternalHyperlink({\n children: linkTextRuns as TextRun[], // Cast needed for docx types\n link: linkUrl,\n })\n );\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last hyperlink\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n if (remainingText) {\n const remainingRuns = parseTextWithDecorators(remainingText, baseStyle, {\n ...options,\n enableHyperlinks: false, // Disable hyperlinks in recursive call\n });\n runs.push(...remainingRuns);\n }\n }\n\n // If no hyperlinks were found, fall back to regular decorator parsing\n if (runs.length === 0 && normalizedText) {\n return parseTextWithDecorators(normalizedText, baseStyle, {\n ...options,\n enableHyperlinks: false,\n });\n }\n\n return runs;\n}\n","/**\n * Placeholder Processing System\n * Handles dynamic content replacement in text with support for rich text formatting\n */\n\nimport {\n TextRun,\n PageNumber,\n ExternalHyperlink,\n InternalHyperlink,\n} from 'docx';\nimport { parseTextWithDecorators, TextStyle } from './textParser';\nimport { normalizeUnicodeText } from './unicode';\n\n// Type alias for elements that can appear in a paragraph\ntype ParagraphChild = TextRun | ExternalHyperlink | InternalHyperlink;\n\n/**\n * Placeholder handler function type\n */\nexport type PlaceholderHandler = (\n _context?: PlaceholderContext\n) => TextRun | TextRun[] | string;\n\n/**\n * Context passed to placeholder handlers\n */\nexport interface PlaceholderContext {\n style?: TextStyle;\n [key: string]: unknown;\n}\n\n/**\n * Placeholder registry for managing dynamic content\n */\nexport class PlaceholderRegistry {\n private static handlers = new Map<string, PlaceholderHandler>();\n\n /**\n * Register a placeholder handler\n */\n static register(name: string, handler: PlaceholderHandler): void {\n this.handlers.set(name.toUpperCase(), handler);\n }\n\n /**\n * Get a placeholder handler\n */\n static get(name: string): PlaceholderHandler | undefined {\n return this.handlers.get(name.toUpperCase());\n }\n\n /**\n * Check if a placeholder is registered\n */\n static has(name: string): boolean {\n return this.handlers.has(name.toUpperCase());\n }\n\n /**\n * Get all registered placeholder names\n */\n static getRegisteredNames(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Clear all registered placeholders\n */\n static clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Process text containing placeholders and return array of paragraph children\n */\nexport function processPlaceholders(\n text: string,\n baseStyle: TextStyle = {},\n context: PlaceholderContext = {}\n): ParagraphChild[] {\n const normalizedText = normalizeUnicodeText(text);\n const placeholderRegex = /\\{([^}]+)\\}/g;\n const result: ParagraphChild[] = [];\n let lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = placeholderRegex.exec(normalizedText)) !== null) {\n const beforeText = normalizedText.substring(lastIndex, match.index);\n const placeholderName = match[1];\n\n // Add text before placeholder\n if (beforeText) {\n result.push(...parseTextWithDecorators(beforeText, baseStyle));\n }\n\n // Process placeholder\n const handler = PlaceholderRegistry.get(placeholderName);\n if (handler) {\n const placeholderResult = handler({ ...context, style: baseStyle });\n\n if (Array.isArray(placeholderResult)) {\n result.push(...placeholderResult);\n } else if (placeholderResult instanceof TextRun) {\n result.push(placeholderResult);\n } else if (typeof placeholderResult === 'string') {\n result.push(...parseTextWithDecorators(placeholderResult, baseStyle));\n }\n } else {\n // Unknown placeholder - keep as text\n result.push(...parseTextWithDecorators(match[0], baseStyle));\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n result.push(...parseTextWithDecorators(remainingText, baseStyle));\n }\n\n // If no placeholders found, process as normal text\n if (result.length === 0) {\n result.push(...parseTextWithDecorators(normalizedText, baseStyle));\n }\n\n return result;\n}\n\n/**\n * Process text with both decorators and placeholders\n */\nexport function processTextWithPlaceholders(\n text: string,\n baseStyle: TextStyle = {},\n context: PlaceholderContext = {}\n): ParagraphChild[] {\n const normalizedText = normalizeUnicodeText(text);\n // Use a more sophisticated approach to handle both decorators and placeholders\n // This regex captures both markdown decorators and placeholders\n const combinedRegex =\n /(\\*\\*\\*|___)([\\s\\S]*?)\\1|(\\*\\*|__)([\\s\\S]*?)\\3|(\\*|_)([\\s\\S]*?)\\5|\\{([^}]+)\\}/g;\n const result: ParagraphChild[] = [];\n let lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = combinedRegex.exec(normalizedText)) !== null) {\n // Add any text before the match as plain text\n if (match.index > lastIndex) {\n const beforeText = normalizedText.substring(lastIndex, match.index);\n if (beforeText) {\n result.push(...createTextRunsWithNewlines(beforeText, baseStyle));\n }\n }\n\n // Check if this is a placeholder (group 7)\n if (match[7]) {\n const placeholderName = match[7];\n const handler = PlaceholderRegistry.get(placeholderName);\n if (handler) {\n const placeholderResult = handler({ ...context, style: baseStyle });\n\n if (Array.isArray(placeholderResult)) {\n result.push(...placeholderResult);\n } else if (placeholderResult instanceof TextRun) {\n result.push(placeholderResult);\n } else if (typeof placeholderResult === 'string') {\n result.push(\n ...createTextRunsWithNewlines(placeholderResult, baseStyle)\n );\n }\n } else {\n // Unknown placeholder - keep as text\n result.push(...createTextRunsWithNewlines(match[0], baseStyle));\n }\n } else {\n // This is a decorator match - determine the style\n let decoratedText: string;\n let bold = baseStyle.bold || false;\n let italics = baseStyle.italics || false;\n\n if (match[1] === '***' || match[1] === '___') {\n // Bold + Italic\n decoratedText = match[2];\n bold = true;\n italics = true;\n } else if (match[3] === '**' || match[3] === '__') {\n // Bold\n decoratedText = match[4];\n bold = true;\n } else if (match[5] === '*' || match[5] === '_') {\n // Italic\n decoratedText = match[6];\n italics = true;\n } else {\n // This shouldn't happen with our regex, but just in case\n decoratedText = match[0];\n }\n\n // Recursively process the decorated text (it might contain placeholders)\n const decoratedTextRuns = processTextWithPlaceholders(\n decoratedText,\n {\n ...baseStyle,\n bold,\n italics,\n },\n context\n );\n result.push(...decoratedTextRuns);\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining text after the last match\n if (lastIndex < normalizedText.length) {\n const remainingText = normalizedText.substring(lastIndex);\n if (remainingText) {\n result.push(...createTextRunsWithNewlines(remainingText, baseStyle));\n }\n }\n\n // If no matches were found, return text runs with newlines\n if (result.length === 0 && normalizedText) {\n result.push(...createTextRunsWithNewlines(normalizedText, baseStyle));\n }\n\n return result;\n}\n\n/**\n * Helper function to create TextRuns with newlines from text\n */\nfunction createTextRunsWithNewlines(\n text: string,\n baseStyle: TextStyle\n): TextRun[] {\n const runs: TextRun[] = [];\n const lines = text.split('\\n');\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n const needsLineBreak = lineIndex > 0;\n\n if (line || needsLineBreak) {\n runs.push(\n new TextRun({\n text: line,\n font: baseStyle.font,\n size: baseStyle.size,\n color: baseStyle.color,\n bold: baseStyle.bold,\n italics: baseStyle.italics,\n underline: baseStyle.underline,\n break: needsLineBreak ? 1 : undefined,\n })\n );\n }\n }\n\n return runs;\n}\n\n/**\n * Initialize built-in placeholders\n */\nexport function initializeBuiltinPlaceholders(): void {\n // PAGE placeholder\n PlaceholderRegistry.register('PAGE', (context) => {\n return new TextRun({\n children: [PageNumber.CURRENT],\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // TOTAL_PAGES placeholder\n PlaceholderRegistry.register('TOTAL_PAGES', (context) => {\n return new TextRun({\n children: [PageNumber.TOTAL_PAGES],\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // DATE placeholder\n PlaceholderRegistry.register('DATE', (context) => {\n const today = new Date();\n const dateString = today.toLocaleDateString();\n return new TextRun({\n text: dateString,\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // DATETIME placeholder\n PlaceholderRegistry.register('DATETIME', (context) => {\n const now = new Date();\n const dateTimeString = now.toLocaleString();\n return new TextRun({\n text: dateTimeString,\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n\n // YEAR placeholder\n PlaceholderRegistry.register('YEAR', (context) => {\n const year = new Date().getFullYear().toString();\n return new TextRun({\n text: year,\n font: context?.style?.font,\n size: context?.style?.size,\n color: context?.style?.color,\n bold: context?.style?.bold,\n italics: context?.style?.italics,\n underline: context?.style?.underline,\n });\n });\n}\n\n// Initialize built-in placeholders\ninitializeBuiltinPlaceholders();\n","/**\n * Normalize text to NFC so composed accented characters are preserved\n * consistently across DOCX renderers (including LibreOffice).\n */\nexport function normalizeUnicodeText(text: string | null | undefined): string {\n return (text ?? '').normalize('NFC');\n}\n","/**\n * Cache Module Exports\n * Re-exports format-agnostic cache from shared + local key-generator\n */\n\nexport * from '@json-to-office/shared/cache';\nexport { CacheKeyGenerator } from './key-generator';\n","/**\n * Cache Key Generator\n * Generates deterministic cache keys for components\n */\n\nimport { createHash } from 'crypto';\nimport { ComponentDefinition, RenderContext } from '../types';\nimport { CacheKeyOptions } from '@json-to-office/shared/cache';\n\n/**\n * Cache key generator with deterministic hashing\n */\nexport class CacheKeyGenerator {\n private readonly version: string;\n\n constructor(version: string = '1.0') {\n this.version = version;\n }\n\n /**\n * Generate cache key for a component\n */\n generateKey(\n component: ComponentDefinition,\n context: RenderContext,\n options: CacheKeyOptions = {}\n ): string {\n const parts: string[] = [\n this.version,\n component.name,\n this.hashProps(component.props),\n ];\n\n if (options.includeTheme !== false) {\n parts.push(context.theme.name);\n }\n\n if (options.includeContext) {\n parts.push(this.hashContext(context));\n }\n\n if (options.additionalKeys) {\n parts.push(...options.additionalKeys);\n }\n\n if (options.version) {\n parts.push(options.version);\n }\n\n return parts.join(':');\n }\n\n /**\n * Hash component props\n */\n hashProps(props: any): string {\n if (!props) return 'null';\n\n // Sort keys for consistent hashing\n const normalized = this.normalizeObject(props);\n const json = JSON.stringify(normalized);\n\n return this.hash(json);\n }\n\n /**\n * Hash render context\n */\n private hashContext(context: RenderContext): string {\n // Only hash relevant context properties\n const relevant = {\n theme: context.theme.name,\n document: context.document,\n // Exclude runtime properties like sectionIndex, componentIndex\n };\n\n return this.hash(JSON.stringify(relevant));\n }\n\n /**\n * Normalize object for consistent hashing\n */\n private normalizeObject(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.normalizeObject(item));\n }\n\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n if (typeof obj === 'object') {\n const sorted: any = {};\n const keys = Object.keys(obj).sort();\n\n for (const key of keys) {\n sorted[key] = this.normalizeObject(obj[key]);\n }\n\n return sorted;\n }\n\n return obj;\n }\n\n /**\n * Create hash\n */\n private hash(input: string): string {\n return createHash('sha256').update(input).digest('hex').substring(0, 16); // Use first 16 chars for shorter keys\n }\n}\n","/**\n * Cached component rendering system\n * Provides caching layer for component rendering operations\n */\n\nimport { Paragraph, Table, TableOfContents, Textbox } from 'docx';\nimport { ComponentDefinition, RenderContext } from '../types';\nimport { ThemeConfig } from '../styles';\nimport {\n MemoryCache,\n CacheKeyGenerator,\n CacheConfiguration,\n CachedComponent,\n} from '../cache';\nimport { renderComponent } from './render';\nimport { createHash } from 'crypto';\n\n// Global component cache instance\nlet componentCache: MemoryCache | null = null;\nlet cacheKeyGen: CacheKeyGenerator | null = null;\n\n/**\n * Create a hash of the theme configuration for cache key generation\n * This ensures cache invalidation when theme changes\n */\nfunction createThemeHash(theme: ThemeConfig): string {\n // Serialize the theme object to JSON and create a hash\n const themeString = JSON.stringify(theme);\n return createHash('sha256').update(themeString).digest('hex').substring(0, 8);\n}\n\n/**\n * Initialize the component cache\n */\nexport function initializeComponentCache(cache?: MemoryCache): void {\n if (cache) {\n componentCache = cache;\n } else if (!componentCache) {\n // Create a default cache if none provided\n const config: CacheConfiguration = {\n enabled: true,\n evictionPolicy: 'lru',\n memory: {\n enabled: true,\n maxSize: 100, // 100MB for components\n maxEntries: 1000,\n defaultTTL: 3600, // 1 hour\n cleanupInterval: 300, // 5 minutes\n },\n performance: {\n trackMetrics: true,\n metricsSampleRate: 1.0,\n enableWarming: false,\n parallelProcessing: true,\n },\n };\n componentCache = new MemoryCache(config);\n }\n\n if (!cacheKeyGen) {\n cacheKeyGen = new CacheKeyGenerator();\n }\n}\n\n/**\n * Get the component cache instance\n */\nexport function getComponentCache(): MemoryCache | null {\n return componentCache;\n}\n\n/**\n * Clear the component cache\n */\nexport async function clearComponentCache(): Promise<void> {\n if (componentCache) {\n await componentCache.clear();\n }\n}\n\n/**\n * Render a component with caching\n */\nexport async function renderComponentWithCache(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext,\n bypassCache = false\n): Promise<(Paragraph | Table | TableOfContents | Textbox)[]> {\n // Certain components depend on dynamic runtime context and must not be cached.\n // - 'toc' depends on section bookmark IDs generated at render time; caching\n // can produce stale references to non-existent bookmarks on re-render.\n // - 'section' generates unique bookmarks internally; caching would duplicate\n // bookmark IDs across sections/documents.\n const forceBypassForType = component.name === 'toc' || component.name === 'section';\n\n // Initialize cache if needed\n if (!componentCache) {\n initializeComponentCache();\n }\n\n // If cache is disabled or bypassed, render directly\n if (\n !componentCache ||\n bypassCache ||\n forceBypassForType ||\n !componentCache.getConfig().enabled\n ) {\n return renderComponent(component, theme, themeName, context);\n }\n\n // Generate cache key for this component\n // Use theme hash instead of name to ensure cache invalidation on theme changes\n const componentProps = JSON.stringify(component.props || {});\n const themeHash = createThemeHash(theme);\n // Include minimal context for other components that might vary with context\n // For now we add section layout type and column count without exposing\n // bookmark IDs (TOC/section are bypassed above).\n const contextKey = context?.section\n ? `${context.section.currentLayout}:${context.section.columnCount}`\n : 'no-section';\n\n // For container components (columns, section, etc.), include children in cache key\n // This ensures cache invalidation when child component content changes\n const childrenKey =\n 'children' in component && component.children\n ? `:children:${JSON.stringify(component.children)}`\n : '';\n\n const cacheKey = `component:${component.name}:${themeHash}:${contextKey}:${componentProps}${childrenKey}`;\n\n // Try to get from cache\n const cached = await componentCache.get(cacheKey);\n\n if (cached) {\n // Cache hit - the cache internally tracks this as a hit\n // Return the rendered result from cache\n return cached.result as (Paragraph | Table | TableOfContents | Textbox)[];\n }\n\n // Cache miss - render the component\n const renderStartTime = Date.now();\n const rendered = await renderComponent(component, theme, themeName, context);\n // Track render time for analytics\n Date.now() - renderStartTime;\n\n // Calculate approximate size (rough estimate)\n const componentSize = JSON.stringify(rendered).length;\n\n // Create a proper CachedComponent structure\n const cachedEntry: CachedComponent = {\n result: rendered as unknown, // Store the rendered Paragraph/Table array as result\n componentName: component.name,\n propsHash: cacheKey,\n timestamp: Date.now(),\n hits: 0,\n size: componentSize,\n dependencies: [],\n signature: cacheKey,\n lastAccessed: Date.now(),\n };\n\n // Store in cache - the cache internally tracks this as a miss\n await componentCache.set(cacheKey, cachedEntry);\n\n return rendered;\n}\n\n// Note: Component statistics are automatically tracked by the cache itself\n// The cache's updateHitStats and updateMissStats methods handle this internally\n\n/**\n * Warm the cache with frequently used components\n */\nexport async function warmComponentCache(\n components: Array<{\n component: ComponentDefinition;\n theme: ThemeConfig;\n themeName: string;\n context: RenderContext;\n }>\n): Promise<void> {\n if (!componentCache || !componentCache.getConfig().performance.enableWarming) {\n return;\n }\n\n const warmingPromises = components.map(\n async ({ component, theme, themeName, context }) => {\n await renderComponentWithCache(component, theme, themeName, context, false);\n }\n );\n\n await Promise.all(warmingPromises);\n}\n\n/**\n * Get component cache statistics\n */\nexport function getComponentCacheStats() {\n if (!componentCache) {\n return null;\n }\n\n return componentCache.getStats();\n}\n\n/**\n * Export component cache for persistence\n */\nexport async function exportComponentCache(): Promise<Map<\n string,\n unknown\n> | null> {\n if (!componentCache) {\n return null;\n }\n\n const keys = await componentCache.getKeys();\n const exported = new Map<string, unknown>();\n\n for (const key of keys) {\n const value = await componentCache.get(key);\n if (value) {\n exported.set(key, value);\n }\n }\n\n return exported;\n}\n\n/**\n * Import component cache from persistence\n */\nexport async function importComponentCache(\n data: Map<string, unknown>\n): Promise<void> {\n if (!componentCache) {\n initializeComponentCache();\n }\n\n for (const [key, value] of data.entries()) {\n await componentCache!.set(key, value as CachedComponent);\n }\n}\n","/**\n * Component Default Resolution System\n * Provides theme-based default configurations for components\n */\n\nimport {\n ThemeConfig,\n ComponentDefaults,\n HeadingComponentDefaults,\n ParagraphComponentDefaults,\n ImageComponentDefaults,\n StatisticComponentDefaults,\n TableComponentDefaults,\n SectionComponentDefaults,\n ColumnsComponentDefaults,\n ListComponentDefaults,\n} from '../index';\nimport {\n HeadingProps,\n ParagraphProps,\n ImageProps,\n StatisticProps,\n TableProps,\n SectionProps,\n ColumnsProps,\n ListProps,\n} from '../../types';\n\n/**\n * Get component defaults from theme configuration\n */\nexport function getComponentDefaults(theme: ThemeConfig): ComponentDefaults {\n return theme.componentDefaults || {};\n}\n\n/**\n * Get default configuration for heading components\n */\nexport function getHeadingDefaults(\n theme: ThemeConfig\n): HeadingComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.heading || {};\n}\n\n/**\n * Get level-specific heading defaults from theme styles\n */\nexport function getHeadingDefaultsForLevel(\n theme: ThemeConfig,\n level: number\n): Partial<HeadingComponentDefaults> {\n const defaults: Partial<HeadingComponentDefaults> = {};\n\n // Check styles for level-specific alignment\n if (theme.styles) {\n const styleKey = `heading${level}` as\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6';\n const headingStyle = theme.styles[styleKey];\n\n if (headingStyle?.alignment) {\n defaults.alignment = headingStyle.alignment;\n }\n }\n\n return defaults;\n}\n\n/**\n * Get default configuration for text components\n */\nexport function getTextDefaults(\n theme: ThemeConfig\n): ParagraphComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.paragraph || {};\n}\n\n/**\n * Get default configuration for image components\n */\nexport function getImageDefaults(theme: ThemeConfig): ImageComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.image || {};\n}\n\n/**\n * Get default configuration for statistic components\n */\nexport function getStatisticDefaults(\n theme: ThemeConfig\n): StatisticComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.statistic || {};\n}\n\n/**\n * Get default configuration for table components\n */\nexport function getTableDefaults(theme: ThemeConfig): TableComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.table || {};\n}\n\n/**\n * Get default configuration for section components\n */\nexport function getSectionDefaults(\n theme: ThemeConfig\n): SectionComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.section || {};\n}\n\n/**\n * Get default configuration for columns components\n */\nexport function getColumnsDefaults(\n theme: ThemeConfig\n): ColumnsComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.columns || {};\n}\n\n/**\n * Get default configuration for list components\n */\nexport function getListDefaults(theme: ThemeConfig): ListComponentDefaults {\n const defaults = getComponentDefaults(theme);\n return defaults?.list || {};\n}\n\n/**\n * Deep merge helper for nested objects\n */\nfunction deepMerge<T>(target: any, source: any): T {\n const output = { ...target };\n\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n output[key] = source[key];\n } else {\n output[key] = deepMerge(target[key], source[key]);\n }\n } else {\n output[key] = source[key];\n }\n });\n }\n\n return output as T;\n}\n\n/**\n * Check if value is a plain object\n */\nfunction isObject(item: any): boolean {\n return item !== null && typeof item === 'object' && !Array.isArray(item);\n}\n\n/**\n * Merge theme defaults with user-provided configuration\n * User config takes precedence over theme defaults\n * Uses deep merge to preserve nested objects like floating configuration\n */\nexport function mergeWithDefaults<T>(\n userConfig: T,\n themeDefaults: Partial<T>\n): T {\n return deepMerge<T>(themeDefaults, userConfig);\n}\n\n/**\n * Resolve heading component props with theme defaults\n */\nexport function resolveHeadingProps(\n props: HeadingProps,\n theme: ThemeConfig\n): HeadingProps {\n const defaults = getHeadingDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve paragraph component props with theme defaults\n */\nexport function resolveParagraphProps(\n props: ParagraphProps,\n theme: ThemeConfig\n): ParagraphProps {\n const defaults = getTextDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve image component props with theme defaults\n */\nexport function resolveImageProps(\n props: ImageProps,\n theme: ThemeConfig\n): ImageProps {\n const defaults = getImageDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve statistic component props with theme defaults\n */\nexport function resolveStatisticProps(\n props: StatisticProps,\n theme: ThemeConfig\n): StatisticProps {\n const defaults = getStatisticDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve table component props with theme defaults\n */\nexport function resolveTableProps(\n props: TableProps,\n theme: ThemeConfig\n): TableProps {\n const defaults = getTableDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve section component props with theme defaults\n */\nexport function resolveSectionProps(\n props: SectionProps,\n theme: ThemeConfig\n): SectionProps {\n const defaults = getSectionDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve columns component props with theme defaults\n */\nexport function resolveColumnsProps(\n props: ColumnsProps,\n theme: ThemeConfig\n): ColumnsProps {\n const defaults = getColumnsDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve list component props with theme defaults\n */\nexport function resolveListProps(\n props: ListProps,\n theme: ThemeConfig\n): ListProps {\n const defaults = getListDefaults(theme);\n return mergeWithDefaults(props, defaults);\n}\n\n/**\n * Resolve highcharts component props with theme defaults\n */\nexport function resolveHighchartsProps(\n props: import('@json-to-office/shared-docx').HighchartsProps,\n _theme: ThemeConfig\n): import('@json-to-office/shared-docx').HighchartsProps {\n // Highcharts component doesn't have theme defaults, just return the props as-is\n return props;\n}\n\n/**\n * Get default configuration for custom components\n */\nexport function getCustomComponentDefaults(\n theme: ThemeConfig,\n componentName: string\n): Record<string, unknown> {\n const defaults = getComponentDefaults(theme);\n // Use type assertion since we're dealing with dynamic property access\n return (\n ((defaults as any)?.[componentName] as Record<string, unknown>) || {}\n );\n}\n\n/**\n * Resolve custom component props with theme defaults\n */\nexport function resolveCustomComponentProps<T extends Record<string, unknown>>(\n props: T,\n theme: ThemeConfig,\n componentName: string\n): T {\n const defaults = getCustomComponentDefaults(theme, componentName);\n return mergeWithDefaults(props, defaults as Partial<T>);\n}\n","/**\n * Content Creation Functions\n * Pure functions for creating Word document elements without layout concerns\n */\n\nimport {\n Paragraph,\n TextRun,\n Table,\n TableRow,\n TableCell,\n AlignmentType,\n ImageRun,\n PageBreak,\n WidthType,\n BorderStyle,\n Header,\n Footer,\n PageNumber,\n ColumnBreak,\n TableLayoutType,\n VerticalAlign,\n Bookmark,\n ExternalHyperlink,\n InternalHyperlink,\n} from 'docx';\nimport {\n calculateImageDimensions,\n getImageBuffer,\n parseWidthValue,\n parseDimensionValue,\n} from '../utils/imageUtils';\nimport { ThemeConfig } from '../styles';\nimport { getTableStyle } from '../styles';\nimport { getThemeColors, getThemeFonts } from '../themes/defaults';\nimport { parseTextWithDecorators } from '../utils/textParser';\nimport { processTextWithPlaceholders } from '../utils/placeholderProcessor';\nimport { normalizeUnicodeText } from '../utils/unicode';\nimport { getStyleIdForLevel } from '../styles/themeToDocxAdapter';\nimport { globalBookmarkRegistry } from '../utils/bookmarkRegistry';\nimport { resolveFontFamily } from '../styles/utils/styleHelpers';\nimport {\n ComponentDefinition,\n isParagraphComponent,\n ParagraphComponentDefinition,\n isImageComponent,\n ImageComponentDefinition,\n} from '../types';\nimport { resolveColor } from '../styles/utils/colorUtils';\nimport {\n pointsToTwips,\n convertLineSpacing as convertLineSpacingToDocx,\n} from '../styles/utils/styleHelpers';\n// width/height utils are imported dynamically where needed\n\nexport interface TextOptions {\n style?: string;\n alignment?: 'left' | 'center' | 'right' | 'justify';\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n };\n lineSpacing?:\n | number\n | {\n type: 'single' | 'atLeast' | 'exactly' | 'double' | 'multiple';\n value?: number;\n };\n boldColor?: string;\n columnBreak?: boolean;\n // Font properties\n fontFamily?: string;\n fontSize?: number;\n fontColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n // Additional children to prepend (e.g., bookmarks)\n prependChildren?: any[];\n // Outline level for TOC\n outlineLevel?: number;\n // Bookmark ID for internal linking\n bookmarkId?: string;\n // Floating frame properties\n floating?: {\n horizontalPosition?: {\n relative?: 'margin' | 'page' | 'text';\n align?: 'left' | 'center' | 'right' | 'inside' | 'outside';\n offset?: number;\n };\n verticalPosition?: {\n relative?: 'margin' | 'page' | 'text';\n align?: 'top' | 'center' | 'bottom' | 'inside' | 'outside' | 'inline';\n offset?: number;\n };\n wrap?: {\n type: 'around' | 'none' | 'notBeside' | 'through' | 'tight' | 'auto';\n };\n lockAnchor?: boolean;\n width?: number;\n height?: number;\n };\n // Keep paragraph with next paragraph\n keepNext?: boolean;\n // Keep all lines of paragraph together\n keepLines?: boolean;\n}\n\nexport interface ImageOptions {\n caption?: string;\n width?: number | string;\n height?: number | string;\n widthRelativeTo?: 'content' | 'page';\n heightRelativeTo?: 'content' | 'page';\n alignment?: 'left' | 'center' | 'right';\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n };\n floating?: {\n horizontalPosition?: {\n relative?: 'character' | 'column' | 'margin' | 'page' | 'text';\n align?: 'left' | 'center' | 'right' | 'inside' | 'outside';\n offset?: number;\n };\n verticalPosition?: {\n relative?: 'margin' | 'page' | 'paragraph' | 'line' | 'text';\n align?: 'top' | 'center' | 'bottom' | 'inside' | 'outside';\n offset?: number;\n };\n wrap?: {\n // 'tight', 'around', 'through' are VML-style; only 'none', 'square', 'topAndBottom' are supported for images\n type: 'none' | 'square' | 'topAndBottom' | 'around' | 'tight' | 'through';\n side?: 'bothSides' | 'left' | 'right' | 'largest';\n margins?: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n };\n };\n allowOverlap?: boolean;\n behindDocument?: boolean;\n lockAnchor?: boolean;\n layoutInCell?: boolean;\n zIndex?: number;\n rotation?: number;\n visibility?: 'hidden' | 'inherit';\n };\n // Keep paragraph with next paragraph\n keepNext?: boolean;\n // Keep all lines of paragraph together\n keepLines?: boolean;\n}\n\nexport interface TableOptions {\n style?: 'minimal' | 'classic' | 'minimal';\n}\n\nexport interface StatisticData {\n number: string;\n description: string;\n alignment?: 'left' | 'center' | 'right';\n}\n\nexport interface StatisticOptions {\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n };\n}\n\nexport interface ListOptions {\n // Reference to the numbering configuration in the Document\n numberingReference?: string;\n spacing?: {\n before?: number; // in points\n after?: number; // in points\n item?: number; // in points\n };\n alignment?: 'left' | 'center' | 'right' | 'justify';\n}\n\n/**\n * Create a text paragraph\n */\nexport function createText(\n content: string,\n theme: ThemeConfig,\n _themeName: string,\n options: TextOptions = {}\n): Paragraph {\n const normalizedContent = normalizeUnicodeText(content);\n // Always use Normal style for consistent formatting\n const style = options.style || 'Normal';\n\n // Convert points to twips for spacing\n const spacing: any = {};\n if (options.spacing?.before !== undefined) {\n spacing.before = pointsToTwips(options.spacing.before);\n }\n if (options.spacing?.after !== undefined) {\n spacing.after = pointsToTwips(options.spacing.after);\n }\n // Add line spacing if provided\n const lineSpacingConfig = convertLineSpacingToDocx(options.lineSpacing);\n if (lineSpacingConfig) {\n spacing.line = lineSpacingConfig.line;\n spacing.lineRule = lineSpacingConfig.lineRule;\n }\n\n // Build children array\n const children: (\n | TextRun\n | ColumnBreak\n | ExternalHyperlink\n | InternalHyperlink\n | Bookmark\n )[] = [];\n\n // Add column break if requested\n if (options.columnBreak) {\n children.push(new ColumnBreak());\n }\n\n // Build base text style from options\n const baseTextStyle = {\n ...(options.fontFamily && { font: options.fontFamily }),\n ...(options.fontSize && { size: options.fontSize * 2 }), // Convert points to half-points\n ...(options.fontColor && {\n color: resolveColor(options.fontColor, theme),\n }),\n ...(options.bold !== undefined && { bold: options.bold }),\n ...(options.italic !== undefined && { italics: options.italic }),\n ...(options.underline !== undefined && {\n underline: options.underline ? { type: 'single' as const } : undefined,\n }),\n };\n\n // Add text content - parseTextWithDecorators handles both decorators and newlines\n const textRuns = parseTextWithDecorators(normalizedContent, baseTextStyle, {\n boldColor: options.boldColor,\n enableHyperlinks: true,\n });\n\n // If bookmarkId is provided, wrap text runs in a bookmark\n if (options.bookmarkId) {\n // Register bookmark\n globalBookmarkRegistry.register(\n options.bookmarkId,\n normalizedContent,\n 'paragraph'\n );\n\n // Wrap text runs in bookmark\n children.push(\n new Bookmark({\n id: options.bookmarkId,\n children: textRuns as TextRun[],\n })\n );\n } else {\n // No bookmark, add text runs directly\n children.push(...textRuns);\n }\n\n // Build frame options for floating text\n const isFloating = !!options.floating;\n const frameOptions =\n isFloating && options.floating\n ? mapFrameOptions(options.floating)\n : undefined;\n\n return new Paragraph({\n children,\n style,\n alignment: options.alignment ? getAlignment(options.alignment) : undefined,\n spacing,\n ...(options.outlineLevel !== undefined && {\n outlineLevel: options.outlineLevel,\n }),\n ...(frameOptions && { frame: frameOptions }),\n ...(options.keepNext !== undefined && { keepNext: options.keepNext }),\n ...(options.keepLines !== undefined && { keepLines: options.keepLines }),\n });\n}\n\n/**\n * Map floating frame configuration to docx.js IFrameOptions\n * IFrameOptions can be either IXYFrameOptions (absolute positioning) or IAlignmentFrameOptions (aligned positioning)\n *\n * Supports mixed positioning: alignment on one axis, offset on the other.\n * When mixing, calculates the position for the aligned axis.\n */\nfunction mapFrameOptions(floating: NonNullable<TextOptions['floating']>): any {\n const hasHorizontalOffset = floating.horizontalPosition?.offset !== undefined;\n const hasVerticalOffset = floating.verticalPosition?.offset !== undefined;\n const hasHorizontalAlign = floating.horizontalPosition?.align !== undefined;\n const hasVerticalAlign = floating.verticalPosition?.align !== undefined;\n\n // Choose exactly one mode: absolute if any offset is present; otherwise alignment\n const useAbsolute = hasHorizontalOffset || hasVerticalOffset;\n\n // Base frame options\n const frameWidth = floating.width || 2880; // 2in default\n const frameHeight = floating.height || 1440; // 1in default\n\n const baseOptions: any = {\n width: frameWidth,\n height: frameHeight,\n anchor: {\n horizontal: floating.horizontalPosition?.relative || 'page',\n vertical: floating.verticalPosition?.relative || 'page',\n },\n };\n\n if (floating.wrap?.type) {\n baseOptions.wrap = floating.wrap.type;\n }\n\n // Config lockAnchor maps to docx anchorLock\n if (floating.lockAnchor !== undefined) {\n baseOptions.anchorLock = floating.lockAnchor;\n } else if ((floating as any).anchorLock !== undefined) {\n baseOptions.anchorLock = (floating as any).anchorLock;\n }\n\n if (useAbsolute) {\n // Absolute positioning: use provided offsets; default missing axis to 0\n const x = floating.horizontalPosition?.offset ?? 0;\n const y = floating.verticalPosition?.offset ?? 0;\n return {\n type: 'absolute',\n position: { x, y },\n ...baseOptions,\n };\n }\n\n // Alignment positioning: use provided aligns; default missing axis\n const xAlign = hasHorizontalAlign\n ? floating.horizontalPosition!.align!\n : 'left';\n const yAlign = hasVerticalAlign ? floating.verticalPosition!.align! : 'top';\n return {\n type: 'alignment',\n alignment: { x: xAlign, y: yAlign },\n ...baseOptions,\n };\n}\n\n/**\n * Create a header paragraph\n */\nexport function createHeading(\n text: string,\n level: number,\n theme: ThemeConfig,\n _themeName: string,\n options: TextOptions = {}\n): Paragraph {\n const normalizedText = normalizeUnicodeText(text);\n const styleId = getStyleIdForLevel(level);\n\n // Only apply spacing if explicitly provided in options\n // This allows theme style spacing to be used by default\n const spacing: any = {};\n let hasExplicitSpacing = false;\n\n if (options.spacing?.before !== undefined) {\n spacing.before = pointsToTwips(options.spacing.before);\n hasExplicitSpacing = true;\n }\n if (options.spacing?.after !== undefined) {\n spacing.after = pointsToTwips(options.spacing.after);\n hasExplicitSpacing = true;\n }\n // Add line spacing if provided\n const lineSpacingConfig = convertLineSpacingToDocx(options.lineSpacing);\n if (lineSpacingConfig) {\n spacing.line = lineSpacingConfig.line;\n spacing.lineRule = lineSpacingConfig.lineRule;\n hasExplicitSpacing = true;\n }\n\n // Build children array\n const children: any[] = [];\n\n // Add prepended children first (e.g., bookmarks)\n if (options.prependChildren) {\n children.push(...options.prependChildren);\n }\n\n // Add column break if requested\n if (options.columnBreak) {\n children.push(new ColumnBreak());\n }\n\n // Check if text has decorators (bold/italic markers)\n const hasDecorators = /(\\*\\*\\*|___|(\\*\\*|__)|(\\*|_))/.test(normalizedText);\n\n // Build base text style from options (overrides theme style at run level)\n const baseTextStyle = {\n ...(options.fontFamily && { font: options.fontFamily }),\n ...(options.fontSize && { size: options.fontSize * 2 }), // points to half-points\n ...(options.fontColor && { color: resolveColor(options.fontColor, theme) }),\n ...(options.bold !== undefined && { bold: options.bold }),\n ...(options.italic !== undefined && { italics: options.italic }),\n ...(options.underline !== undefined && {\n underline: options.underline ? { type: 'single' as const } : undefined,\n }),\n };\n\n // Create bookmark if bookmarkId is provided\n if (options.bookmarkId) {\n // Register bookmark\n globalBookmarkRegistry.register(\n options.bookmarkId,\n normalizedText,\n 'heading'\n );\n\n // Wrap heading text in bookmark\n const headingTextChildren: (TextRun | any)[] = [];\n\n if (hasDecorators) {\n // For headings with decorators, parse text runs first\n const textRuns = parseTextWithDecorators(normalizedText, baseTextStyle, {\n boldColor: options.boldColor,\n enableHyperlinks: true,\n });\n headingTextChildren.push(...textRuns);\n } else {\n // For simple headings, add single text run\n headingTextChildren.push(\n new TextRun({ text: normalizedText, ...baseTextStyle })\n );\n }\n\n // Wrap in bookmark\n children.push(\n new Bookmark({\n id: options.bookmarkId,\n children: headingTextChildren,\n })\n );\n } else {\n // No bookmark, add text directly\n if (hasDecorators) {\n // For headings with decorators, parse and add text runs\n const textRuns = parseTextWithDecorators(normalizedText, baseTextStyle, {\n boldColor: options.boldColor,\n enableHyperlinks: true,\n });\n children.push(...textRuns);\n } else {\n // For simple headings, add single text run\n children.push(new TextRun({ text: normalizedText, ...baseTextStyle }));\n }\n }\n\n return new Paragraph({\n children,\n style: styleId,\n alignment: getAlignment(options.alignment || 'left'),\n // Only override spacing if explicitly provided\n spacing: hasExplicitSpacing ? spacing : undefined,\n ...(options.keepNext !== undefined && { keepNext: options.keepNext }),\n ...(options.keepLines !== undefined && { keepLines: options.keepLines }),\n });\n}\n\n/**\n * Create title page content\n */\nexport function createTitleContent(\n title?: string,\n subtitle?: string\n): Paragraph[] {\n // If no title, return empty array (skip title section entirely)\n if (!title) {\n return [];\n }\n\n const normalizedTitle = normalizeUnicodeText(title);\n const elements: Paragraph[] = [];\n\n elements.push(\n new Paragraph({\n text: normalizedTitle,\n style: 'Title',\n })\n );\n\n if (subtitle) {\n const normalizedSubtitle = normalizeUnicodeText(subtitle);\n elements.push(\n new Paragraph({\n text: normalizedSubtitle,\n style: 'Subtitle',\n })\n );\n }\n\n elements.push(new Paragraph({ children: [new PageBreak()] }));\n\n return elements;\n}\n\n/**\n * Create an image with optional caption\n */\nexport async function createImage(\n path: string,\n theme: ThemeConfig,\n options: ImageOptions = {}\n): Promise<Paragraph[]> {\n const elements: Paragraph[] = [];\n const isFloating = !!options.floating;\n const alignment = isFloating\n ? undefined\n : getAlignment(options.alignment || 'center');\n\n let imagePath = path;\n let imageBuffer: Buffer;\n\n try {\n // Try to use the provided path first\n imageBuffer = await getImageBuffer(imagePath);\n\n // Calculate available document width/height for percentage calculations\n const {\n getAvailableWidthTwips,\n getPageWidthTwips,\n getAvailableHeightTwips,\n getPageHeightTwips,\n } = await import('../utils/widthUtils');\n const widthRef = options.widthRelativeTo || 'content';\n const heightRef = options.heightRelativeTo || 'content';\n const availableWidthTwips =\n widthRef === 'page'\n ? getPageWidthTwips(theme)\n : getAvailableWidthTwips(theme);\n const availableHeightTwips =\n heightRef === 'page'\n ? getPageHeightTwips(theme)\n : getAvailableHeightTwips(theme);\n // Convert twips to pixels: 1 twip = 1/1440 inch, 1 inch = 96 pixels (screen DPI)\n const availableWidthPx = Math.round((availableWidthTwips / 1440) * 96);\n const availableHeightPx = Math.round((availableHeightTwips / 1440) * 96);\n\n // Default size calculations (fallback)\n const columnWidthCm = 7.36;\n const pixelsPerCm = 37.795275591;\n const columnWidthPx = Math.round(columnWidthCm * pixelsPerCm);\n const fallbackHeight = Math.round(columnWidthPx * 0.6);\n\n // Parse width value (handles both number and percentage string)\n // Default to 100% if no width is specified\n const parsedWidth = parseWidthValue(\n options.width ?? '100%',\n availableWidthPx\n );\n\n // Parse height value if provided\n const parsedHeight =\n options.height !== undefined\n ? parseDimensionValue(options.height, availableHeightPx)\n : undefined;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imagePath,\n parsedWidth,\n parsedHeight,\n columnWidthPx,\n fallbackHeight\n );\n\n // Build ImageRun configuration with optional floating\n const { mapFloatingOptions } = await import(\n '../utils/docxImagePositioning'\n );\n const floating = isFloating\n ? mapFloatingOptions(options.floating)\n : undefined;\n\n // Detect image type from path/base64 data URI\n const { detectImageType } = await import('../utils/imageUtils');\n const imageType = detectImageType(imagePath);\n\n // Create ImageRun based on image type\n const imageRun =\n imageType === 'svg'\n ? new ImageRun({\n type: 'svg',\n data: imageBuffer,\n fallback: {\n type: 'png',\n data: imageBuffer, // Use the same buffer as fallback for now\n },\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n ...(floating && { floating }),\n })\n : new ImageRun({\n type: imageType,\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n ...(floating && { floating }),\n });\n\n // Convert spacing from points to twips\n const spacing: any = {};\n if (options.spacing?.before !== undefined) {\n spacing.before = pointsToTwips(options.spacing.before);\n }\n if (options.spacing?.after !== undefined) {\n spacing.after = pointsToTwips(options.spacing.after);\n }\n\n elements.push(\n new Paragraph({\n children: [imageRun],\n alignment,\n ...(Object.keys(spacing).length > 0 && { spacing }),\n ...(options.keepNext !== undefined && { keepNext: options.keepNext }),\n ...(options.keepLines !== undefined && {\n keepLines: options.keepLines,\n }),\n })\n );\n } catch (error) {\n // If the image cannot be loaded, try the placeholder\n throw new Error(`Failed to load image from ${imagePath}`);\n }\n\n if (options.caption) {\n // Check if caption has decorators (bold/italic markers)\n const hasDecorators = /(\\*\\*\\*|___|(\\*\\*|__)|(\\*|_))/.test(options.caption);\n\n if (!hasDecorators) {\n // No decorators - use Normal style for font inheritance\n elements.push(\n new Paragraph({\n text: normalizeUnicodeText(options.caption),\n style: 'Normal',\n alignment: AlignmentType.LEFT, // Captions default to left alignment\n })\n );\n } else {\n // Has decorators - use parseTextWithDecorators (same as text component)\n const textRuns = parseTextWithDecorators(\n options.caption,\n {},\n {\n enableHyperlinks: true,\n }\n );\n\n elements.push(\n new Paragraph({\n children: textRuns,\n style: 'Normal', // Use Normal style for consistent font inheritance\n alignment: AlignmentType.LEFT, // Captions default to left alignment\n })\n );\n }\n }\n\n return elements;\n}\n\n/**\n * Create a statistic display\n */\nexport function createStatistic(\n data: StatisticData,\n options: StatisticOptions = {}\n): Paragraph[] {\n const alignment = getAlignment(data.alignment || 'center');\n const normalizedNumber = normalizeUnicodeText(data.number);\n const normalizedDescription = normalizeUnicodeText(data.description);\n\n return [\n new Paragraph({\n text: normalizedNumber,\n style: 'StatisticNumber',\n alignment,\n spacing: options.spacing,\n }),\n new Paragraph({\n text: normalizedDescription,\n style: 'StatisticDescription',\n alignment,\n }),\n ];\n}\n\n/**\n * Create a list of items using proper docx numbering\n */\nexport function createList(\n items: (string | { text: string; level?: number })[],\n _theme: ThemeConfig,\n _themeName: string,\n options: ListOptions = {}\n): Paragraph[] {\n if (!items || items.length === 0) {\n return [];\n }\n\n const paragraphs: Paragraph[] = [];\n\n items.forEach((item, index) => {\n // Handle both string and object items\n const itemText = typeof item === 'string' ? item : item.text;\n const itemLevel = typeof item === 'object' ? item.level || 0 : 0;\n\n if (!itemText.trim()) {\n return; // Skip empty items\n }\n\n // Parse rich text decorators for each item\n // Don't pass font/size/color - let list items inherit from Normal paragraph style\n const textRuns = parseTextWithDecorators(\n itemText,\n {},\n {\n enableHyperlinks: true,\n }\n );\n\n // Calculate spacing for this item (convert points to twips)\n const spacing: { before?: number; after?: number } = {};\n if (index === 0 && options.spacing?.before) {\n spacing.before = pointsToTwips(options.spacing.before);\n }\n if (index === items.length - 1 && options.spacing?.after) {\n spacing.after = pointsToTwips(options.spacing.after);\n } else if (options.spacing?.item) {\n spacing.after = pointsToTwips(options.spacing.item);\n }\n\n // Create the paragraph with proper numbering reference\n const paragraph = new Paragraph({\n style: 'Normal', // Apply Normal style for font inheritance\n children: textRuns,\n alignment: options.alignment\n ? getAlignment(options.alignment)\n : AlignmentType.LEFT,\n spacing,\n // Use proper docx numbering instead of prepending text\n ...(options.numberingReference && {\n numbering: {\n reference: options.numberingReference,\n level: itemLevel,\n },\n }),\n });\n\n paragraphs.push(paragraph);\n });\n\n return paragraphs;\n}\n\n/**\n * Create a table\n */\ntype TableFontConfig = {\n family?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n};\n\ntype BorderColor =\n | string\n | {\n bottom?: string;\n top?: string;\n right?: string;\n left?: string;\n };\n\ntype BorderSize =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype Padding =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype CellDefaults = {\n color?: string;\n backgroundColor?: string;\n horizontalAlignment?: 'left' | 'center' | 'right' | 'justify';\n verticalAlignment?: 'top' | 'middle' | 'bottom';\n font?: TableFontConfig;\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n padding?: Padding;\n height?: number;\n};\n\n// After merging, borders and padding are always normalized to per-side format\ntype NormalizedCellDefaults = {\n color?: string;\n backgroundColor?: string;\n horizontalAlignment?: 'left' | 'center' | 'right' | 'justify';\n verticalAlignment?: 'top' | 'middle' | 'bottom';\n font?: TableFontConfig;\n borderColor: { top: string; right: string; bottom: string; left: string };\n borderSize: { top: number; right: number; bottom: number; left: number };\n padding?: { top: number; right: number; bottom: number; left: number };\n height?: number;\n};\n\n// Hide borders configuration - can be boolean or per-side object\ntype HideBorders =\n | boolean\n | {\n top?: boolean;\n right?: boolean;\n bottom?: boolean;\n left?: boolean;\n insideHorizontal?: boolean;\n insideVertical?: boolean;\n };\n\ntype TableConfig = {\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n hideBorders?: HideBorders;\n cellDefaults?: CellDefaults;\n headerCellDefaults?: CellDefaults;\n width?: number;\n columns: {\n /** Width in points (number) or as percentage string e.g. \"40%\" */\n width?: number | string;\n cellDefaults?: CellDefaults;\n header?: CellDefaults & {\n content?: string | ComponentDefinition;\n };\n cells?: (CellDefaults & {\n content?: string | ComponentDefinition;\n })[];\n }[];\n keepInOnePage?: boolean;\n keepNext?: boolean;\n repeatHeaderOnPageBreak?: boolean;\n};\n\nexport async function createTable(\n columns: TableConfig['columns'],\n tableConfig: TableConfig,\n theme: ThemeConfig,\n themeName: string,\n _options: TableOptions = {}\n): Promise<Table> {\n // Note: _options parameter is available for future table customization\n const tableStyle = getTableStyle(theme, themeName);\n\n // Determine number of rows from the first column\n const numRows = columns[0]?.cells?.length || 0;\n\n // Default values for missing cell defaults\n const getDefaultCellDefaults = (): CellDefaults => ({\n color: '000000',\n backgroundColor: 'FFFFFF',\n horizontalAlignment: 'left',\n verticalAlignment: 'top',\n font: {\n family: 'Arial',\n size: 11,\n bold: false,\n italic: false,\n underline: false,\n },\n borderColor: '000000',\n borderSize: 1,\n });\n\n // Helper function to normalize border color to per-side format\n const normalizeBorderColor = (\n border: BorderColor | undefined\n ):\n | { top: string; right: string; bottom: string; left: string }\n | undefined => {\n if (border === undefined) return undefined;\n if (typeof border === 'string') {\n return { top: border, right: border, bottom: border, left: border };\n }\n return {\n top: border.top ?? '',\n right: border.right ?? '',\n bottom: border.bottom ?? '',\n left: border.left ?? '',\n };\n };\n\n // Helper function to normalize border size to per-side format\n const normalizeBorderSize = (\n border: BorderSize | undefined\n ):\n | { top: number; right: number; bottom: number; left: number }\n | undefined => {\n if (border === undefined) return undefined;\n if (typeof border === 'number') {\n return { top: border, right: border, bottom: border, left: border };\n }\n return {\n top: border.top ?? -1,\n right: border.right ?? -1,\n bottom: border.bottom ?? -1,\n left: border.left ?? -1,\n };\n };\n\n // Helper function to normalize padding to per-side format\n const normalizePadding = (\n padding: Padding | undefined\n ):\n | { top: number; right: number; bottom: number; left: number }\n | undefined => {\n if (padding === undefined) return undefined;\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding };\n }\n return {\n top: padding.top ?? -1,\n right: padding.right ?? -1,\n bottom: padding.bottom ?? -1,\n left: padding.left ?? -1,\n };\n };\n\n // Helper function to merge border colors at the side level\n const mergeBorderColorPerSide = (\n ...borders: (BorderColor | undefined)[]\n ): { top: string; right: string; bottom: string; left: string } => {\n const normalized = borders.map(normalizeBorderColor);\n const defaults = getDefaultCellDefaults();\n const defaultColor =\n typeof defaults.borderColor === 'string'\n ? defaults.borderColor\n : '000000';\n\n return {\n top: normalized.find((b) => b && b.top !== '')?.top ?? defaultColor,\n right: normalized.find((b) => b && b.right !== '')?.right ?? defaultColor,\n bottom:\n normalized.find((b) => b && b.bottom !== '')?.bottom ?? defaultColor,\n left: normalized.find((b) => b && b.left !== '')?.left ?? defaultColor,\n };\n };\n\n // Helper function to merge border sizes at the side level\n const mergeBorderSizePerSide = (\n ...borders: (BorderSize | undefined)[]\n ): { top: number; right: number; bottom: number; left: number } => {\n const normalized = borders.map(normalizeBorderSize);\n const defaults = getDefaultCellDefaults();\n const defaultSize =\n typeof defaults.borderSize === 'number' ? defaults.borderSize : 1;\n\n return {\n top: normalized.find((b) => b && b.top !== -1)?.top ?? defaultSize,\n right: normalized.find((b) => b && b.right !== -1)?.right ?? defaultSize,\n bottom:\n normalized.find((b) => b && b.bottom !== -1)?.bottom ?? defaultSize,\n left: normalized.find((b) => b && b.left !== -1)?.left ?? defaultSize,\n };\n };\n\n // Helper to create border override for table outer borders based on position\n const getTableOuterBorder = (\n position: {\n isHeader?: boolean;\n isFirstCol?: boolean;\n isLastCol?: boolean;\n isLastRow?: boolean;\n },\n tableBorderColor?: BorderColor,\n tableBorderSize?: BorderSize\n ): {\n borderColor?: Partial<{\n top: string;\n right: string;\n bottom: string;\n left: string;\n }>;\n borderSize?: Partial<{\n top: number;\n right: number;\n bottom: number;\n left: number;\n }>;\n } => {\n const result: {\n borderColor?: Partial<{\n top: string;\n right: string;\n bottom: string;\n left: string;\n }>;\n borderSize?: Partial<{\n top: number;\n right: number;\n bottom: number;\n left: number;\n }>;\n } = {};\n\n if (tableBorderColor) {\n const normalizedColor = normalizeBorderColor(tableBorderColor);\n if (normalizedColor) {\n result.borderColor = {};\n if (position.isHeader && normalizedColor.top !== '')\n result.borderColor.top = normalizedColor.top;\n if (position.isFirstCol && normalizedColor.left !== '')\n result.borderColor.left = normalizedColor.left;\n if (position.isLastCol && normalizedColor.right !== '')\n result.borderColor.right = normalizedColor.right;\n if (position.isLastRow && normalizedColor.bottom !== '')\n result.borderColor.bottom = normalizedColor.bottom;\n }\n }\n\n if (tableBorderSize) {\n const normalizedSize = normalizeBorderSize(tableBorderSize);\n if (normalizedSize) {\n result.borderSize = {};\n if (position.isHeader && normalizedSize.top !== -1)\n result.borderSize.top = normalizedSize.top;\n if (position.isFirstCol && normalizedSize.left !== -1)\n result.borderSize.left = normalizedSize.left;\n if (position.isLastCol && normalizedSize.right !== -1)\n result.borderSize.right = normalizedSize.right;\n if (position.isLastRow && normalizedSize.bottom !== -1)\n result.borderSize.bottom = normalizedSize.bottom;\n }\n }\n\n return result;\n };\n\n // Helper function to merge padding at the side level\n const mergePaddingPerSide = (\n ...paddings: (Padding | undefined)[]\n ):\n | { top: number; right: number; bottom: number; left: number }\n | undefined => {\n const normalized = paddings.map(normalizePadding);\n const hasAny = normalized.some((p) => p !== undefined);\n if (!hasAny) return undefined;\n\n return {\n top: normalized.find((p) => p && p.top !== -1)?.top ?? 0,\n right: normalized.find((p) => p && p.right !== -1)?.right ?? 0,\n bottom: normalized.find((p) => p && p.bottom !== -1)?.bottom ?? 0,\n left: normalized.find((p) => p && p.left !== -1)?.left ?? 0,\n };\n };\n\n // Helper function to merge cell defaults with priority: cell > column > table outer border (for specific sides) > table cellDefaults > default\n const mergeCellDefaults = (\n tableDef?: CellDefaults,\n columnDef?: CellDefaults,\n cellDef?: Partial<CellDefaults>,\n position?: {\n isFirstCol?: boolean;\n isLastCol?: boolean;\n isLastRow?: boolean;\n },\n tableOuterBorder?: { borderColor?: BorderColor; borderSize?: BorderSize }\n ): NormalizedCellDefaults => {\n const defaults = getDefaultCellDefaults();\n\n // Merge font configs\n const mergedFont: TableFontConfig = {\n ...defaults.font,\n ...tableDef?.font,\n ...columnDef?.font,\n ...cellDef?.font,\n };\n\n // Get table outer border overrides based on position\n const outerBorder =\n position && tableOuterBorder\n ? getTableOuterBorder(\n position,\n tableOuterBorder.borderColor,\n tableOuterBorder.borderSize\n )\n : {};\n\n // Merge border colors per side (priority: cell > column > table outer border > table cellDefaults > table borderColor > default)\n // tableOuterBorder.borderColor is used twice: via outerBorder for edge-specific application,\n // and directly as fallback for ALL borders when not overridden by cellDefaults\n const mergedBorderColor = mergeBorderColorPerSide(\n cellDef?.borderColor,\n columnDef?.borderColor,\n outerBorder.borderColor as BorderColor,\n tableDef?.borderColor,\n tableOuterBorder?.borderColor // Apply table-level borderColor to all cells as fallback\n );\n\n // Merge border sizes per side (priority: cell > column > table outer border > table cellDefaults > table borderSize > default)\n const mergedBorderSize = mergeBorderSizePerSide(\n cellDef?.borderSize,\n columnDef?.borderSize,\n outerBorder.borderSize as BorderSize,\n tableDef?.borderSize,\n tableOuterBorder?.borderSize // Apply table-level borderSize to all cells as fallback\n );\n\n // Merge padding per side (priority: cell > column > table)\n const mergedPadding = mergePaddingPerSide(\n cellDef?.padding,\n columnDef?.padding,\n tableDef?.padding\n );\n\n return {\n color:\n cellDef?.color ?? columnDef?.color ?? tableDef?.color ?? defaults.color,\n backgroundColor:\n cellDef?.backgroundColor ??\n columnDef?.backgroundColor ??\n tableDef?.backgroundColor ??\n defaults.backgroundColor,\n horizontalAlignment:\n cellDef?.horizontalAlignment ??\n columnDef?.horizontalAlignment ??\n tableDef?.horizontalAlignment ??\n defaults.horizontalAlignment,\n verticalAlignment:\n cellDef?.verticalAlignment ??\n columnDef?.verticalAlignment ??\n tableDef?.verticalAlignment ??\n defaults.verticalAlignment,\n font: mergedFont,\n borderColor: mergedBorderColor,\n borderSize: mergedBorderSize,\n padding: mergedPadding,\n height: cellDef?.height ?? columnDef?.height ?? tableDef?.height,\n };\n };\n\n // Helper function to merge header cell defaults with priority: header > columnCellDefaults > table outer border (for specific sides) > headerCellDefaults > cellDefaults > default\n const mergeHeaderCellDefaults = (\n tableDef?: CellDefaults,\n headerTableDef?: CellDefaults,\n columnDef?: CellDefaults,\n headerDef?: Partial<CellDefaults>,\n position?: { isFirstCol?: boolean; isLastCol?: boolean },\n tableOuterBorder?: { borderColor?: BorderColor; borderSize?: BorderSize }\n ): NormalizedCellDefaults => {\n const defaults = getDefaultCellDefaults();\n\n // Merge font configs with new priority\n const mergedFont: TableFontConfig = {\n ...defaults.font,\n ...tableDef?.font,\n ...headerTableDef?.font,\n ...columnDef?.font,\n ...headerDef?.font,\n };\n\n // Get table outer border overrides based on position (headers always affect top border)\n const outerBorder =\n position && tableOuterBorder\n ? getTableOuterBorder(\n {\n isHeader: true,\n isFirstCol: position.isFirstCol,\n isLastCol: position.isLastCol,\n },\n tableOuterBorder.borderColor,\n tableOuterBorder.borderSize\n )\n : {};\n\n // Merge border colors per side (priority: header > columnCellDefaults > table outer border > headerCellDefaults > cellDefaults > table borderColor > default)\n // tableOuterBorder.borderColor is used twice: via outerBorder for edge-specific application,\n // and directly as fallback for ALL borders when not overridden by cellDefaults\n const mergedBorderColor = mergeBorderColorPerSide(\n headerDef?.borderColor,\n columnDef?.borderColor,\n outerBorder.borderColor as BorderColor,\n headerTableDef?.borderColor,\n tableDef?.borderColor,\n tableOuterBorder?.borderColor // Apply table-level borderColor to all cells as fallback\n );\n\n // Merge border sizes per side (priority: header > columnCellDefaults > table outer border > headerCellDefaults > cellDefaults > table borderSize > default)\n const mergedBorderSize = mergeBorderSizePerSide(\n headerDef?.borderSize,\n columnDef?.borderSize,\n outerBorder.borderSize as BorderSize,\n headerTableDef?.borderSize,\n tableDef?.borderSize,\n tableOuterBorder?.borderSize // Apply table-level borderSize to all cells as fallback\n );\n\n // Merge padding per side (priority: header > headerCellDefaults > columnCellDefaults > cellDefaults)\n const mergedPadding = mergePaddingPerSide(\n headerDef?.padding,\n headerTableDef?.padding,\n columnDef?.padding,\n tableDef?.padding\n );\n\n return {\n color:\n headerDef?.color ??\n headerTableDef?.color ??\n columnDef?.color ??\n tableDef?.color ??\n defaults.color,\n backgroundColor:\n headerDef?.backgroundColor ??\n headerTableDef?.backgroundColor ??\n columnDef?.backgroundColor ??\n tableDef?.backgroundColor ??\n defaults.backgroundColor,\n horizontalAlignment:\n headerDef?.horizontalAlignment ??\n headerTableDef?.horizontalAlignment ??\n columnDef?.horizontalAlignment ??\n tableDef?.horizontalAlignment ??\n defaults.horizontalAlignment,\n verticalAlignment:\n headerDef?.verticalAlignment ??\n headerTableDef?.verticalAlignment ??\n columnDef?.verticalAlignment ??\n tableDef?.verticalAlignment ??\n defaults.verticalAlignment,\n font: mergedFont,\n borderColor: mergedBorderColor,\n borderSize: mergedBorderSize,\n padding: mergedPadding,\n height:\n headerDef?.height ??\n headerTableDef?.height ??\n columnDef?.height ??\n tableDef?.height,\n };\n };\n\n // Helper function to get border value for a specific side\n // After normalization, borders are always objects with side properties\n const getBorderValue = (\n border: {\n top: string | number;\n right: string | number;\n bottom: string | number;\n left: string | number;\n },\n side: 'top' | 'bottom' | 'left' | 'right'\n ) => {\n return border[side];\n };\n\n // Helper function to get padding value for a specific side\n // After normalization, padding is always an object with side properties or undefined\n const getPaddingValue = (\n padding:\n | { top: number; right: number; bottom: number; left: number }\n | undefined,\n side: 'top' | 'bottom' | 'left' | 'right'\n ): number | undefined => {\n if (padding === undefined) return undefined;\n return padding[side] * 20; // Convert points to twips\n };\n\n // Helper function to create margins object from padding\n // After normalization, padding is always an object with side properties or undefined\n // Returns ITableCellMarginOptions with marginUnitType set to DXA (twips)\n const createMarginsFromPadding = (\n padding:\n | { top: number; right: number; bottom: number; left: number }\n | undefined\n ) => {\n if (padding === undefined) return undefined;\n\n return {\n marginUnitType: WidthType.DXA, // Specify that values are in twips\n top: getPaddingValue(padding, 'top') ?? 0,\n bottom: getPaddingValue(padding, 'bottom') ?? 0,\n left: getPaddingValue(padding, 'left') ?? 0,\n right: getPaddingValue(padding, 'right') ?? 0,\n };\n };\n\n // Normalize hideBorders config to per-side format\n const normalizeHideBorders = (\n hideBorders: HideBorders | undefined\n ): {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n insideHorizontal: boolean;\n insideVertical: boolean;\n } => {\n if (hideBorders === undefined) {\n return {\n top: false,\n right: false,\n bottom: false,\n left: false,\n insideHorizontal: false,\n insideVertical: false,\n };\n }\n if (typeof hideBorders === 'boolean') {\n return {\n top: hideBorders,\n right: hideBorders,\n bottom: hideBorders,\n left: hideBorders,\n insideHorizontal: hideBorders,\n insideVertical: hideBorders,\n };\n }\n return {\n top: hideBorders.top ?? false,\n right: hideBorders.right ?? false,\n bottom: hideBorders.bottom ?? false,\n left: hideBorders.left ?? false,\n insideHorizontal: hideBorders.insideHorizontal ?? false,\n insideVertical: hideBorders.insideVertical ?? false,\n };\n };\n\n // Normalized hidden borders config\n const hiddenBorders = normalizeHideBorders(tableConfig.hideBorders);\n\n // Helper function to create border config\n const createBorder = (size: number, color: string, isHidden?: boolean) => {\n if (size === 0 || isHidden) {\n return { style: BorderStyle.NONE, size: 0, color: '000000' };\n }\n return {\n style: BorderStyle.SINGLE,\n size: size * 8, // Convert points to eighths of a point\n color: color || '000000',\n };\n };\n\n // Helper to determine if a specific border should be hidden based on cell position\n const shouldHideBorder = (\n side: 'top' | 'right' | 'bottom' | 'left',\n position: {\n isFirstRow?: boolean;\n isLastRow?: boolean;\n isFirstCol?: boolean;\n isLastCol?: boolean;\n }\n ): boolean => {\n // Map cell position to which hideBorders config applies\n // Outer borders use top/right/bottom/left, inner borders use insideHorizontal/insideVertical\n switch (side) {\n case 'top':\n return position.isFirstRow\n ? hiddenBorders.top\n : hiddenBorders.insideHorizontal;\n case 'bottom':\n return position.isLastRow\n ? hiddenBorders.bottom\n : hiddenBorders.insideHorizontal;\n case 'left':\n return position.isFirstCol\n ? hiddenBorders.left\n : hiddenBorders.insideVertical;\n case 'right':\n return position.isLastCol\n ? hiddenBorders.right\n : hiddenBorders.insideVertical;\n default:\n return false;\n }\n };\n\n // Helper function to process cell content\n const processCellContent = async (\n cell: string | ComponentDefinition | undefined,\n cellDefaults: NormalizedCellDefaults,\n baseCellStyle: typeof tableStyle.tableCell\n ): Promise<\n (TextRun | ImageRun | ExternalHyperlink | InternalHyperlink)[]\n > => {\n let cellChildren: (\n | TextRun\n | ImageRun\n | ExternalHyperlink\n | InternalHyperlink\n )[] = [];\n\n // Handle undefined or empty content\n if (!cell) {\n return cellChildren;\n }\n\n // Create merged style with config overrides\n const mergedStyle = {\n font: cellDefaults.font?.family || baseCellStyle.font,\n size: cellDefaults.font?.size\n ? cellDefaults.font.size * 2\n : baseCellStyle.size, // Convert to half-points\n bold: cellDefaults.font?.bold ?? false,\n italics: cellDefaults.font?.italic ?? false,\n underline: cellDefaults.font?.underline\n ? { type: 'single' as const }\n : undefined,\n color: cellDefaults.color || baseCellStyle.color,\n };\n\n if (typeof cell === 'object' && 'name' in cell && 'props' in cell) {\n // Handle ComponentDefinition\n if (isParagraphComponent(cell)) {\n const textComp = cell as ParagraphComponentDefinition;\n cellChildren = parseTextWithDecorators(\n textComp.props.text,\n mergedStyle,\n { enableHyperlinks: true }\n );\n } else if (isImageComponent(cell)) {\n const imageComp = cell as ImageComponentDefinition;\n try {\n // Get image source (base64 or path)\n const imageSource = imageComp.props.base64 || imageComp.props.path;\n if (!imageSource) {\n throw new Error(\n 'Image component requires either \"path\" or \"base64\" property'\n );\n }\n\n // Read from local file, URL, or base64\n const imageBuffer = await getImageBuffer(imageSource);\n\n // Parse width value if it's a string percentage (like \"90%\")\n const parsedWidth =\n typeof imageComp.props.width === 'string'\n ? parseWidthValue(imageComp.props.width, 300) // Use a reasonable default for table context\n : imageComp.props.width;\n\n // Parse height value if it's a string percentage (like \"90%\")\n const parsedHeight =\n typeof imageComp.props.height === 'string'\n ? parseWidthValue(imageComp.props.height, 200) // Use a reasonable default for table context\n : imageComp.props.height;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imageSource,\n parsedWidth,\n parsedHeight,\n 60, // fallback width\n 20 // fallback height\n );\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n });\n cellChildren = [imageRun];\n } catch (error) {\n // Fallback for missing images\n const imageSource =\n imageComp.props.base64 || imageComp.props.path || 'unknown';\n cellChildren = [\n new TextRun({\n text: `[IMAGE: ${imageSource.substring(0, 50)}${imageSource.length > 50 ? '...' : ''}]`,\n font: mergedStyle.font,\n size: mergedStyle.size,\n color: '#999999',\n }),\n ];\n }\n } else {\n // Unsupported component type in table cell\n cellChildren = [\n new TextRun({\n text: `[Unsupported component type: ${cell.name}]`,\n font: mergedStyle.font,\n size: mergedStyle.size,\n color: '#999999',\n }),\n ];\n }\n } else {\n // Handle plain string\n cellChildren = parseTextWithDecorators(cell as string, mergedStyle, {\n enableHyperlinks: true,\n });\n }\n\n return cellChildren;\n };\n\n // Create header row by iterating through columns\n // Calculate row height from any header cell that defines it\n const numColumns = columns.length;\n const headerHeight = columns.reduce<number | undefined>(\n (maxHeight, column, colIndex) => {\n const headerCell = column.header;\n const position = {\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n };\n const mergedDefaults = mergeHeaderCellDefaults(\n tableConfig.cellDefaults,\n tableConfig.headerCellDefaults,\n column.cellDefaults,\n headerCell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n if (mergedDefaults.height !== undefined) {\n return maxHeight !== undefined\n ? Math.max(maxHeight, mergedDefaults.height)\n : mergedDefaults.height;\n }\n return maxHeight;\n },\n undefined\n );\n\n const headerRow = new TableRow({\n tableHeader: tableConfig.repeatHeaderOnPageBreak,\n height:\n headerHeight !== undefined\n ? { value: headerHeight * 20, rule: 'atLeast' as const }\n : undefined,\n children: await Promise.all(\n columns.map(async (column, colIndex) => {\n const headerCell = column.header;\n\n // Determine position for outer border application and hideBorders\n const position = {\n isFirstRow: true, // Header is always the first row\n isLastRow: numRows === 0, // Header is last row only if no data rows\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n };\n\n // Merge cell defaults with priority: header > columnCellDefaults > table outer border > headerCellDefaults > cellDefaults\n const mergedDefaults = mergeHeaderCellDefaults(\n tableConfig.cellDefaults,\n tableConfig.headerCellDefaults,\n column.cellDefaults,\n headerCell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n\n const cellChildren = await processCellContent(\n headerCell?.content,\n mergedDefaults,\n tableStyle.tableHeader\n );\n\n const horizontalAlignment = mergedDefaults.horizontalAlignment!;\n const verticalAlignment = getVerticalAlignment(\n mergedDefaults.verticalAlignment\n );\n\n return new TableCell({\n children: [\n new Paragraph({\n ...(tableConfig.keepInOnePage && { keepNext: true }),\n alignment: getAlignment(horizontalAlignment),\n children: cellChildren,\n }),\n ],\n\n verticalAlign: verticalAlignment,\n shading: {\n fill:\n mergedDefaults.backgroundColor ||\n getThemeColors(theme).background,\n },\n margins: createMarginsFromPadding(mergedDefaults.padding),\n borders: {\n top: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'top') as number,\n getBorderValue(mergedDefaults.borderColor, 'top') as string,\n shouldHideBorder('top', position)\n ),\n bottom: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'bottom') as number,\n getBorderValue(mergedDefaults.borderColor, 'bottom') as string,\n shouldHideBorder('bottom', position)\n ),\n left: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'left') as number,\n getBorderValue(mergedDefaults.borderColor, 'left') as string,\n shouldHideBorder('left', position)\n ),\n right: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'right') as number,\n getBorderValue(mergedDefaults.borderColor, 'right') as string,\n shouldHideBorder('right', position)\n ),\n },\n });\n })\n ),\n });\n\n // Create data rows\n const dataRows = await Promise.all(\n Array.from({ length: numRows }, async (_, rowIndex) => {\n const isLastRow = rowIndex === numRows - 1;\n\n // Calculate row height from any cell in this row that defines it\n const rowHeight = columns.reduce<number | undefined>(\n (maxHeight, column, colIndex) => {\n const cell = column.cells?.[rowIndex];\n if (cell) {\n const position = {\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n isLastRow,\n };\n const mergedDefaults = mergeCellDefaults(\n tableConfig.cellDefaults,\n column.cellDefaults,\n cell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n if (mergedDefaults.height !== undefined) {\n return maxHeight !== undefined\n ? Math.max(maxHeight, mergedDefaults.height)\n : mergedDefaults.height;\n }\n }\n return maxHeight;\n },\n undefined\n );\n\n return new TableRow({\n height:\n rowHeight !== undefined\n ? { value: rowHeight * 20, rule: 'atLeast' as const }\n : undefined,\n children: await Promise.all(\n columns.map(async (column, colIndex) => {\n const cell = column.cells?.[rowIndex];\n\n // Determine position for outer border application and hideBorders\n const position = {\n isFirstRow: false, // Data rows are never the first row (header is)\n isFirstCol: colIndex === 0,\n isLastCol: colIndex === numColumns - 1,\n isLastRow,\n };\n\n if (!cell) {\n // Handle missing cell data - merge defaults properly\n const mergedDefaultsForMissing = mergeCellDefaults(\n tableConfig.cellDefaults,\n column.cellDefaults,\n undefined,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n return new TableCell({\n children: [\n new Paragraph({\n ...((tableConfig.keepInOnePage && !isLastRow) ||\n (isLastRow && tableConfig.keepNext)\n ? { keepNext: true }\n : {}),\n alignment: AlignmentType.LEFT,\n children: [],\n }),\n ],\n borders: {\n top: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'top'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'top'\n ) as string,\n shouldHideBorder('top', position)\n ),\n bottom: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'bottom'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'bottom'\n ) as string,\n shouldHideBorder('bottom', position)\n ),\n left: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'left'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'left'\n ) as string,\n shouldHideBorder('left', position)\n ),\n right: createBorder(\n getBorderValue(\n mergedDefaultsForMissing.borderSize,\n 'right'\n ) as number,\n getBorderValue(\n mergedDefaultsForMissing.borderColor,\n 'right'\n ) as string,\n shouldHideBorder('right', position)\n ),\n },\n });\n }\n\n // Merge cell defaults with priority: cell > column > table outer border > table cellDefaults\n const mergedDefaults = mergeCellDefaults(\n tableConfig.cellDefaults,\n column.cellDefaults,\n cell,\n position,\n {\n borderColor: tableConfig.borderColor,\n borderSize: tableConfig.borderSize,\n }\n );\n\n const cellChildren = await processCellContent(\n cell.content,\n mergedDefaults,\n tableStyle.tableCell\n );\n\n const horizontalAlignment = mergedDefaults.horizontalAlignment!;\n const verticalAlignment = getVerticalAlignment(\n mergedDefaults.verticalAlignment\n );\n\n return new TableCell({\n children: [\n new Paragraph({\n ...((tableConfig.keepInOnePage && !isLastRow) ||\n (isLastRow && tableConfig.keepNext)\n ? { keepNext: true }\n : {}),\n alignment: getAlignment(horizontalAlignment),\n children: cellChildren,\n }),\n ],\n verticalAlign: verticalAlignment,\n shading: {\n fill:\n mergedDefaults.backgroundColor ||\n getThemeColors(theme).background,\n },\n margins: createMarginsFromPadding(mergedDefaults.padding),\n borders: {\n top: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'top') as number,\n getBorderValue(mergedDefaults.borderColor, 'top') as string,\n shouldHideBorder('top', position)\n ),\n bottom: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'bottom') as number,\n getBorderValue(\n mergedDefaults.borderColor,\n 'bottom'\n ) as string,\n shouldHideBorder('bottom', position)\n ),\n left: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'left') as number,\n getBorderValue(mergedDefaults.borderColor, 'left') as string,\n shouldHideBorder('left', position)\n ),\n right: createBorder(\n getBorderValue(mergedDefaults.borderSize, 'right') as number,\n getBorderValue(mergedDefaults.borderColor, 'right') as string,\n shouldHideBorder('right', position)\n ),\n },\n });\n })\n ),\n });\n })\n );\n\n // Calculate column widths - if any column has explicit width, use DXA for all\n const hasExplicitWidths = columns.some((col) => col.width !== undefined);\n\n let columnWidths: number[];\n let tableWidth: {\n size: number;\n type: (typeof WidthType)[keyof typeof WidthType];\n };\n\n if (hasExplicitWidths) {\n // Use explicit widths in DXA (twips) - convert from points\n const widthUtils = await import('../utils/widthUtils');\n const { getAvailableWidthTwips, relativeLengthToTwips } = widthUtils;\n\n // Get available table width in twips (page width minus margins)\n const availableTableWidth = getAvailableWidthTwips(theme, themeName);\n\n // Convert explicit column widths (points or percentage strings) to twips\n const columnsWithExplicitWidthTwips = columns.map((col) =>\n col.width !== undefined\n ? relativeLengthToTwips(col.width, availableTableWidth)\n : undefined\n );\n\n // Calculate total width used by columns with explicit widths\n const totalExplicitWidth = columnsWithExplicitWidthTwips.reduce(\n (sum: number, w) => sum + (w || 0),\n 0\n );\n\n if (totalExplicitWidth > availableTableWidth) {\n console.warn(\n `[json-to-office] Column widths total (${totalExplicitWidth} twips) exceeds available table width (${availableTableWidth} twips). Table may overflow.`\n );\n }\n\n // Count columns without explicit width\n const columnsWithoutWidth = columns.filter(\n (col) => col.width === undefined\n ).length;\n\n // Calculate remaining space and distribute among columns without explicit width\n const remainingWidth = Math.max(\n 0,\n availableTableWidth - totalExplicitWidth\n );\n const defaultColumnWidth =\n columnsWithoutWidth > 0\n ? remainingWidth / columnsWithoutWidth\n : pointsToTwips(72); // Fallback to 1 inch if all columns have explicit widths\n\n // Assign widths: use explicit width (in twips) or calculated default\n columnWidths = columnsWithExplicitWidthTwips.map(\n (w) => w || defaultColumnWidth\n );\n const totalWidth = columnWidths.reduce((sum, w) => sum + w, 0);\n tableWidth = { size: totalWidth, type: WidthType.DXA };\n } else {\n // Use percentage-based equal distribution\n const percentPerColumn = 100 / columns.length;\n columnWidths = columns.map(() => percentPerColumn);\n tableWidth = { size: tableConfig.width ?? 100, type: WidthType.PERCENTAGE };\n }\n\n return new Table({\n width: tableWidth,\n layout: TableLayoutType.FIXED,\n columnWidths: columnWidths,\n rows: [headerRow, ...dataRows],\n });\n}\n\n/**\n * Convert alignment string to docx AlignmentType\n */\nfunction getAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n\n/**\n * Convert vertical alignment string to docx VerticalAlign\n */\nfunction getVerticalAlignment(\n alignment: string | undefined\n):\n | typeof VerticalAlign.TOP\n | typeof VerticalAlign.CENTER\n | typeof VerticalAlign.BOTTOM\n | undefined {\n if (!alignment) return undefined;\n\n switch (alignment) {\n case 'top':\n return VerticalAlign.TOP;\n case 'middle':\n return VerticalAlign.CENTER;\n case 'bottom':\n return VerticalAlign.BOTTOM;\n default:\n return undefined;\n }\n}\n\n/**\n * Create header element from content\n */\nexport function createHeaderElement(\n children: (Paragraph | Table)[],\n _options?: {\n position?: 'left' | 'center' | 'right';\n }\n): Header {\n return new Header({\n children: children,\n });\n}\n\n/**\n * Create footer element from content\n */\nexport function createFooterElement(\n children: (Paragraph | Table)[],\n _options?: {\n position?: 'left' | 'center' | 'right';\n }\n): Footer {\n return new Footer({\n children: children,\n });\n}\n\n/**\n * Create page number element\n */\nexport function createPageNumberElement(\n format?: string,\n alignment?: 'left' | 'center' | 'right'\n): Paragraph {\n const children: (TextRun | ExternalHyperlink | InternalHyperlink)[] = [];\n\n if (format) {\n // Use placeholder processor to handle {PAGE} and other placeholders\n children.push(...processTextWithPlaceholders(format, {}));\n } else {\n // Default: just page number\n children.push(\n new TextRun({\n children: [PageNumber.CURRENT],\n })\n );\n }\n\n return new Paragraph({\n alignment: getAlignment(alignment || 'center'),\n children,\n });\n}\n\n/**\n * Create mixed content paragraph with text and image elements\n */\nexport async function createMixedContentParagraph(\n textContent: string,\n textOptions: {\n fontSize?: number;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n },\n imagePath?: string,\n imageOptions?: {\n width?: number;\n height?: number;\n },\n alignment?: 'left' | 'center' | 'right',\n theme?: import('../styles').ThemeConfig\n): Promise<Paragraph> {\n const children: (TextRun | ImageRun)[] = [];\n const normalizedTextContent = normalizeUnicodeText(textContent);\n\n // Add text content\n if (normalizedTextContent) {\n children.push(\n new TextRun({\n text: normalizedTextContent,\n font: theme ? getThemeFonts(theme).body.family : undefined,\n size: textOptions.fontSize ? textOptions.fontSize * 2 : 20, // Convert to half-points\n color:\n textOptions.color ||\n (theme ? getThemeColors(theme).textPrimary : undefined),\n bold: textOptions.bold || false,\n italics: textOptions.italic || false,\n })\n );\n }\n\n // Add image if provided\n if (imagePath) {\n try {\n const imageBuffer = await getImageBuffer(imagePath);\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imagePath,\n imageOptions?.width,\n imageOptions?.height,\n 60, // fallback width\n 20 // fallback height\n );\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n });\n\n // Add some spacing before the image\n children.push(new TextRun({ text: ' ' }));\n children.push(imageRun);\n } catch (error) {\n // Fallback for missing images\n children.push(\n new TextRun({\n text: ` [IMAGE: ${imagePath}]`,\n font: theme ? getThemeFonts(theme).body.family : undefined,\n size: (textOptions.fontSize || 10) * 2,\n color: theme ? getThemeColors(theme).secondary : undefined,\n bold: true,\n })\n );\n }\n }\n\n return new Paragraph({\n alignment: getAlignment(alignment || 'left'),\n children,\n });\n}\n\n/**\n * Create a table specifically for headers/footers with custom styling\n */\n\nexport async function createHeaderFooterTable(\n rows: (string | ComponentDefinition)[][],\n options: {\n cellAlignments?: ('left' | 'center' | 'right')[];\n fontSize?: number;\n bold?: boolean;\n color?: string;\n noBorders?: boolean;\n cellStyling?: {\n [rowIndex: number]: {\n [cellIndex: number]: {\n bold?: boolean;\n color?: string;\n fontSize?: number;\n };\n };\n };\n theme?: ThemeConfig;\n themeName?: string;\n } = {}\n): Promise<Table> {\n const {\n cellAlignments = ['left', 'right'],\n fontSize = 10,\n bold = false,\n color = '#000000',\n noBorders = true,\n cellStyling = {},\n theme,\n } = options;\n\n // Use theme's normal style for header/footer text since header/footer styles are removed\n const normalStyle = theme?.styles?.normal;\n\n const defaultFont = theme\n ? resolveFontFamily(theme, normalStyle?.font)\n : 'Arial';\n const defaultSize = normalStyle?.size || fontSize;\n const defaultColor =\n normalStyle?.color && theme\n ? resolveColor(normalStyle.color, theme)\n : color;\n\n const tableRows = await Promise.all(\n rows.map(\n async (row, rowIndex) =>\n new TableRow({\n children: await Promise.all(\n row.map(async (cell, cellIndex) => {\n const alignment = cellAlignments[cellIndex] || 'left';\n const cellStyle = cellStyling[rowIndex]?.[cellIndex] || {};\n\n let paragraphChildren: (\n | TextRun\n | ImageRun\n | ExternalHyperlink\n | InternalHyperlink\n )[] = [];\n\n // Handle ComponentDefinition first\n if (\n typeof cell === 'object' &&\n 'name' in cell &&\n 'props' in cell\n ) {\n // This is a ComponentDefinition\n if (isParagraphComponent(cell)) {\n const textComp = cell as ParagraphComponentDefinition;\n // Use parseTextWithDecorators to support rich text formatting\n const textStyle = {\n font:\n textComp.props.font?.family || (defaultFont as string),\n size:\n ((textComp.props.font?.size || defaultSize) as number) *\n 2, // Convert to half-points\n bold: textComp.props.font?.bold ?? false,\n color:\n (textComp.props.font?.color && theme\n ? resolveColor(textComp.props.font.color, theme)\n : undefined) || defaultColor,\n } as const;\n paragraphChildren = parseTextWithDecorators(\n textComp.props.text,\n textStyle,\n { enableHyperlinks: true }\n );\n } else if (isImageComponent(cell)) {\n const imageComp = cell as ImageComponentDefinition;\n try {\n // Get image source (base64 or path)\n const imageSource =\n imageComp.props.base64 || imageComp.props.path;\n if (!imageSource) {\n throw new Error(\n 'Image component requires either \"path\" or \"base64\" property'\n );\n }\n\n // Read from local file, URL, or base64\n const imageBuffer = await getImageBuffer(imageSource);\n\n // Parse width value if it's a string percentage (like \"90%\")\n const parsedWidth =\n typeof imageComp.props.width === 'string'\n ? parseWidthValue(imageComp.props.width, 300) // Use a reasonable default for table context\n : imageComp.props.width;\n\n // Parse height value if it's a string percentage (like \"90%\")\n const parsedHeight =\n typeof imageComp.props.height === 'string'\n ? parseWidthValue(imageComp.props.height, 200) // Use a reasonable default for table context\n : imageComp.props.height;\n\n // Calculate dimensions with aspect ratio preservation\n const dimensions = await calculateImageDimensions(\n imageSource,\n parsedWidth,\n parsedHeight,\n 60, // fallback width\n 20 // fallback height\n );\n\n const imageRun = new ImageRun({\n type: 'png',\n data: imageBuffer,\n transformation: {\n width: dimensions.width,\n height: dimensions.height,\n },\n });\n paragraphChildren = [imageRun];\n } catch (error) {\n // Fallback for missing images\n const imageSource =\n imageComp.props.base64 ||\n imageComp.props.path ||\n 'unknown';\n paragraphChildren = [\n new TextRun({\n text: `[IMAGE: ${imageSource.substring(0, 50)}${imageSource.length > 50 ? '...' : ''}]`,\n size: fontSize * 2,\n bold: true,\n color: '#999999',\n }),\n ];\n }\n } else {\n // Unsupported component type in table cell\n paragraphChildren = [\n new TextRun({\n text: `[Unsupported component type: ${cell.name}]`,\n size: fontSize * 2,\n color: '#999999',\n }),\n ];\n }\n } else if (typeof cell === 'string') {\n // Handle plain string text (including placeholders)\n const textStyle = {\n font: defaultFont,\n size: (cellStyle.fontSize || defaultSize) * 2,\n bold: cellStyle.bold !== undefined ? cellStyle.bold : bold,\n color: cellStyle.color || defaultColor,\n };\n\n // Use parseTextWithDecorators which now handles both decorators and placeholders\n paragraphChildren = parseTextWithDecorators(cell, textStyle, {\n enableHyperlinks: true,\n });\n }\n\n return new TableCell({\n children: [\n new Paragraph({\n alignment: getAlignment(alignment),\n children: paragraphChildren,\n }),\n ],\n margins: {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n borders: noBorders\n ? {\n top: { style: BorderStyle.NONE, size: 0 },\n bottom: { style: BorderStyle.NONE, size: 0 },\n left: { style: BorderStyle.NONE, size: 0 },\n right: { style: BorderStyle.NONE, size: 0 },\n }\n : undefined,\n });\n })\n ),\n })\n )\n );\n\n return new Table({\n width: { size: 100, type: WidthType.PERCENTAGE },\n layout: TableLayoutType.FIXED, // Lock column widths to prevent horizontal resizing\n rows: tableRows,\n borders: noBorders\n ? {\n top: { style: BorderStyle.NONE, size: 0 },\n bottom: { style: BorderStyle.NONE, size: 0 },\n left: { style: BorderStyle.NONE, size: 0 },\n right: { style: BorderStyle.NONE, size: 0 },\n insideHorizontal: { style: BorderStyle.NONE, size: 0 },\n insideVertical: { style: BorderStyle.NONE, size: 0 },\n }\n : undefined,\n });\n}\n","/**\n * Bookmark Registry\n * Utilities for managing document bookmarks for internal hyperlinks\n */\n\nexport interface BookmarkInfo {\n id: string;\n title: string;\n type: string; // e.g., 'heading', 'paragraph', 'table', etc.\n}\n\n/**\n * Registry for managing document bookmarks\n * Used to track bookmark IDs and validate internal hyperlink targets\n */\nexport class BookmarkRegistry {\n private bookmarks: Map<string, BookmarkInfo> = new Map();\n private counter = 0;\n\n /**\n * Register a bookmark\n */\n register(id: string, title: string, type: string): void {\n if (this.bookmarks.has(id)) {\n console.warn(\n `Duplicate bookmark ID: ${id}. Using the latest registration.`\n );\n }\n this.bookmarks.set(id, { id, title, type });\n }\n\n /**\n * Generate a unique bookmark ID from text\n * Converts text to a URL-friendly format\n */\n generateId(text: string, _type: string = 'bookmark'): string {\n // Convert to lowercase, replace spaces with hyphens, remove special characters\n const baseId = text\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .substring(0, 40); // Limit length\n\n // Ensure uniqueness by appending counter if needed\n let id = baseId;\n let attempt = 0;\n while (this.bookmarks.has(id) && attempt < 100) {\n id = `${baseId}-${++attempt}`;\n }\n\n return id;\n }\n\n /**\n * Check if a bookmark exists\n */\n exists(id: string): boolean {\n return this.bookmarks.has(id);\n }\n\n /**\n * Get bookmark info by ID\n */\n get(id: string): BookmarkInfo | undefined {\n return this.bookmarks.get(id);\n }\n\n /**\n * Get all registered bookmarks\n */\n getAll(): BookmarkInfo[] {\n return Array.from(this.bookmarks.values());\n }\n\n /**\n * Clear all bookmarks\n */\n clear(): void {\n this.bookmarks.clear();\n this.counter = 0;\n }\n\n /**\n * Validate that all internal hyperlink references exist\n * Returns array of missing bookmark IDs\n */\n validateReferences(referencedIds: string[]): string[] {\n const missing: string[] = [];\n for (const id of referencedIds) {\n if (!this.exists(id)) {\n missing.push(id);\n }\n }\n return missing;\n }\n}\n\n// Global registry instance\nexport const globalBookmarkRegistry = new BookmarkRegistry();\n","/**\n * Heading Component\n * Standard component for rendering heading elements in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isHeadingComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport {\n resolveHeadingProps,\n getHeadingDefaultsForLevel,\n} from '../styles/utils/componentDefaults';\nimport { createHeading } from '../core/content';\nimport { globalBookmarkRegistry } from '../utils/bookmarkRegistry';\n\n/**\n * Render heading component\n */\nexport function renderHeadingComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isHeadingComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveHeadingProps(component.props, theme);\n\n // Get level-specific theme defaults and merge them\n // Only apply level defaults if no explicit alignment was provided in the original props\n const level = resolvedConfig.level || 1;\n const levelDefaults = getHeadingDefaultsForLevel(theme, level);\n const finalConfig = {\n ...resolvedConfig,\n // Only apply level defaults if no explicit alignment was provided in the original props\n ...(component.props.alignment ? {} : levelDefaults),\n };\n\n // Generate or use bookmark ID for internal linking\n // If component has id, use it; otherwise generate from heading text\n const bookmarkId =\n (component as any).id ||\n globalBookmarkRegistry.generateId(finalConfig.text, 'heading');\n\n // Create heading with optional column break and bookmark\n const header = createHeading(\n finalConfig.text,\n finalConfig.level || 1,\n theme,\n themeName,\n {\n alignment: finalConfig.alignment,\n spacing: finalConfig.spacing,\n lineSpacing: finalConfig.lineSpacing,\n columnBreak: finalConfig.columnBreak,\n // Local font overrides\n fontFamily: finalConfig.font?.family,\n fontSize: finalConfig.font?.size,\n fontColor: finalConfig.font?.color,\n bold: finalConfig.font?.bold,\n italic: finalConfig.font?.italic,\n underline: finalConfig.font?.underline,\n // Pagination control\n keepNext: finalConfig.keepNext,\n keepLines: finalConfig.keepLines,\n // Bookmark ID for internal linking\n bookmarkId: bookmarkId,\n }\n );\n\n return [header];\n}\n","/**\n * Paragraph Component\n * Standard component for rendering paragraph content in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isParagraphComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveParagraphProps } from '../styles/utils/componentDefaults';\nimport { createText, createList } from '../core/content';\nimport {\n globalNumberingRegistry,\n createNumberingConfig,\n type NumberingConfig,\n type ListLevelConfig,\n} from '../utils/numberingConfig';\n\n/**\n * Parse markdown list syntax from paragraph text\n * Returns null if no list detected, or { type, items } if list found\n */\nfunction parseMarkdownList(text: string): {\n type: 'unordered' | 'ordered';\n items: { text: string; level: number }[];\n} | null {\n const lines = text.split('\\n');\n const items: { text: string; level: number }[] = [];\n let isUnordered: boolean | null = null;\n let isOrdered: boolean | null = null;\n\n for (const line of lines) {\n // Skip empty lines\n if (!line.trim()) continue;\n\n // Match unordered list: optional spaces + (- or *) + space + text\n const unorderedMatch = line.match(/^(\\s*)([-*])\\s+(.+)$/);\n if (unorderedMatch) {\n const indentLevel = Math.floor(unorderedMatch[1].length / 2); // 2 spaces = 1 level\n const text = unorderedMatch[3];\n items.push({ text, level: indentLevel });\n if (isUnordered === null) isUnordered = true;\n continue;\n }\n\n // Match ordered list: optional spaces + number + . + space + text\n const orderedMatch = line.match(/^(\\s*)(\\d+)\\.\\s+(.+)$/);\n if (orderedMatch) {\n const indentLevel = Math.floor(orderedMatch[1].length / 2); // 2 spaces = 1 level\n const text = orderedMatch[3];\n items.push({ text, level: indentLevel });\n if (isOrdered === null) isOrdered = true;\n continue;\n }\n\n // If we find a line that doesn't match list syntax, this isn't a list\n return null;\n }\n\n // If no items found, or mixed list types, not a valid list\n if (items.length === 0 || (isUnordered && isOrdered)) {\n return null;\n }\n\n return {\n type: isUnordered ? 'unordered' : 'ordered',\n items,\n };\n}\n\n/**\n * Render paragraph component\n */\nexport function renderParagraphComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isParagraphComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveParagraphProps(component.props, theme);\n\n // Check if text contains markdown list syntax\n const listData = parseMarkdownList(resolvedConfig.text);\n\n if (listData) {\n // Text is a markdown list - render as proper docx list\n const reference =\n globalNumberingRegistry.generateReference('markdown-list');\n\n // Create appropriate numbering configuration\n const levels: ListLevelConfig[] = [];\n\n if (listData.type === 'unordered') {\n // Bullet list with different bullets for each level\n levels.push(\n { level: 0, format: 'bullet', text: '•', alignment: 'left' },\n { level: 1, format: 'bullet', text: '◦', alignment: 'left' },\n { level: 2, format: 'bullet', text: '▪', alignment: 'left' }\n );\n } else {\n // Ordered list with decimal, lowercase letter, lowercase roman\n levels.push(\n { level: 0, format: 'decimal', text: '%1.', alignment: 'left' },\n { level: 1, format: 'lowerLetter', text: '%2.', alignment: 'left' },\n { level: 2, format: 'lowerRoman', text: '%3.', alignment: 'left' }\n );\n }\n\n const numberingConfig: NumberingConfig = {\n reference,\n levels,\n };\n\n globalNumberingRegistry.register(createNumberingConfig(numberingConfig));\n\n // Create list paragraphs\n return createList(listData.items, theme, themeName, {\n numberingReference: reference,\n spacing: resolvedConfig.spacing as\n | { before?: number; after?: number; item?: number }\n | undefined,\n alignment: resolvedConfig.alignment,\n });\n }\n\n // Not a list - render as regular text paragraph\n // Map themeStyle (theme logical name) to DOCX style id\n // Supports both predefined styles and custom styles from theme.styles\n const styleFromTheme = (() => {\n const key = resolvedConfig.themeStyle;\n if (!key) return undefined;\n\n const lowerKey = key.toLowerCase();\n\n // Map predefined style names to Word style IDs\n if (lowerKey === 'normal') return 'Normal';\n if (lowerKey === 'title') return 'Title';\n if (lowerKey === 'subtitle') return 'Subtitle';\n const headingMatch = lowerKey.match(/^heading([1-6])$/);\n if (headingMatch) {\n // For paragraph components, use display-only heading styles that are visually\n // identical but do NOT participate in TOC/outline levels\n return `JTD_HeadingText${headingMatch[1]}`;\n }\n\n // For custom styles, use the exact key as the style ID\n // Custom styles are registered in themeToDocxAdapter with their exact key as ID\n return key;\n })();\n\n // Extract outline level from style if present (for TOC support)\n const outlineLevel = (() => {\n const key = resolvedConfig.themeStyle;\n if (!key) return undefined;\n\n // Never contribute paragraph component paragraphs to TOC when using heading styles\n // Even if the theme sets outlineLevel for heading styles, ignore it here\n const lowerKey = key.toLowerCase();\n const headingMatch = lowerKey.match(/^heading([1-6])$/);\n if (headingMatch) return undefined;\n\n // Check if this is a custom style with outline level\n const customStyle = theme.styles?.[key as keyof typeof theme.styles];\n if (\n customStyle &&\n typeof customStyle === 'object' &&\n 'outlineLevel' in customStyle\n ) {\n return (customStyle as any).outlineLevel;\n }\n\n return undefined;\n })();\n\n // Create text paragraph with optional column break and floating positioning\n const text = createText(resolvedConfig.text, theme, themeName, {\n style: styleFromTheme,\n spacing: resolvedConfig.spacing as\n | { before?: number; after?: number }\n | undefined,\n lineSpacing: resolvedConfig.font?.lineSpacing,\n alignment: resolvedConfig.alignment,\n boldColor: resolvedConfig.boldColor,\n columnBreak: resolvedConfig.columnBreak,\n // Pass font properties\n fontFamily: resolvedConfig.font?.family,\n fontSize: resolvedConfig.font?.size,\n fontColor: resolvedConfig.font?.color,\n bold: resolvedConfig.font?.bold,\n italic: resolvedConfig.font?.italic,\n underline: resolvedConfig.font?.underline,\n // Pass outline level for TOC support\n outlineLevel: outlineLevel,\n // Pass floating positioning properties\n floating: resolvedConfig.floating,\n // Pass keepNext property\n keepNext: resolvedConfig.keepNext,\n // Pass keepLines property\n keepLines: resolvedConfig.keepLines,\n // Pass bookmark ID for internal linking\n bookmarkId: resolvedConfig.id,\n });\n\n return [text];\n}\n","/**\n * List Component\n * Standard component for rendering list elements in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isListComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveListProps } from '../styles/utils/componentDefaults';\nimport { createList } from '../core/content';\nimport {\n globalNumberingRegistry,\n createNumberingConfig,\n type NumberingConfig,\n type ListLevelConfig,\n} from '../utils/numberingConfig';\n\n/**\n * Convert simplified format to proper level configurations\n */\nfunction createLevelsFromSimplifiedProps(\n props: ReturnType<typeof resolveListProps>\n): ListLevelConfig[] {\n const levels: ListLevelConfig[] = [];\n\n // Determine format from simplified options\n let format: string;\n let text: string | undefined;\n\n if (props.format) {\n if (props.format === 'numbered') {\n format = 'decimal';\n text = '%1.';\n } else if (props.format === 'none') {\n format = 'none';\n text = '';\n } else {\n format = props.format;\n }\n } else {\n // Default to bullet\n format = 'bullet';\n text = props.bullet || '•';\n }\n\n // Create level 0 configuration\n const level0: ListLevelConfig = {\n level: 0,\n format,\n text,\n alignment: 'left',\n start: props.start,\n };\n\n // Add indent if specified\n if (props.indent) {\n if (typeof props.indent === 'number') {\n level0.indent = { left: props.indent };\n } else {\n level0.indent = props.indent;\n }\n }\n\n levels.push(level0);\n\n // Add default sublevels for nested lists\n if (format === 'bullet') {\n levels.push(\n { level: 1, format: 'bullet', text: '◦', alignment: 'left' },\n { level: 2, format: 'bullet', text: '▪', alignment: 'left' }\n );\n } else if (format === 'decimal') {\n levels.push(\n { level: 1, format: 'lowerLetter', text: '%2.', alignment: 'left' },\n { level: 2, format: 'lowerRoman', text: '%3.', alignment: 'left' }\n );\n }\n\n return levels;\n}\n\n/**\n * Get the maximum level used in list items\n */\nfunction getMaxLevelFromItems(\n items: (string | { text: string; level?: number })[] | undefined\n): number {\n if (!items || !Array.isArray(items)) {\n return 0;\n }\n\n let maxLevel = 0;\n for (const item of items) {\n if (typeof item === 'object' && item.level !== undefined) {\n maxLevel = Math.max(maxLevel, item.level);\n }\n }\n return maxLevel;\n}\n\n/**\n * Fill in missing levels with default configurations\n */\nfunction fillMissingLevels(\n levels: ListLevelConfig[],\n maxLevel: number\n): ListLevelConfig[] {\n // Create a map of existing levels\n const levelMap = new Map<number, ListLevelConfig>();\n for (const level of levels) {\n levelMap.set(level.level, level);\n }\n\n // Get level 0 to determine the base format\n const level0 = levelMap.get(0);\n const baseFormat = level0?.format || 'bullet';\n\n // Create default levels for any missing ones\n const result: ListLevelConfig[] = [];\n for (let i = 0; i <= maxLevel; i++) {\n if (levelMap.has(i)) {\n result.push(levelMap.get(i)!);\n } else {\n // Create default sublevel based on parent format\n if (baseFormat === 'bullet') {\n const bullets = ['•', '◦', '▪', '▫', '‣'];\n result.push({\n level: i,\n format: 'bullet',\n text: bullets[i % bullets.length],\n alignment: 'left',\n });\n } else if (baseFormat === 'decimal' || baseFormat === 'numbered') {\n const formats = ['decimal', 'lowerLetter', 'lowerRoman'];\n const format = formats[i % formats.length];\n result.push({\n level: i,\n format,\n text: `%${i + 1}.`,\n alignment: 'left',\n });\n } else {\n // For other formats, continue with the same format\n result.push({\n level: i,\n format: baseFormat,\n text: `%${i + 1}.`,\n alignment: 'left',\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Render list component\n */\nexport function renderListComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isListComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveListProps(component.props, theme);\n\n // Determine the maximum level needed from items\n const maxLevel = getMaxLevelFromItems(resolvedConfig.items);\n\n // Generate or use provided reference ID\n const reference =\n resolvedConfig.reference ||\n globalNumberingRegistry.generateReference('list');\n\n // Build numbering configuration if not already registered\n if (!globalNumberingRegistry.has(reference)) {\n let levels: ListLevelConfig[];\n\n if (resolvedConfig.levels && resolvedConfig.levels.length > 0) {\n // Use explicit level configurations, filling in missing levels\n levels = fillMissingLevels(\n resolvedConfig.levels as ListLevelConfig[],\n maxLevel\n );\n } else {\n // Build from simplified options\n const baseLevels = createLevelsFromSimplifiedProps(resolvedConfig);\n levels = fillMissingLevels(baseLevels, maxLevel);\n }\n\n const config: NumberingConfig = {\n reference,\n levels,\n };\n const numberingConfig = createNumberingConfig(config);\n globalNumberingRegistry.register(numberingConfig);\n }\n\n // Create the list paragraphs with numbering reference\n return createList(resolvedConfig.items, theme, themeName, {\n numberingReference: reference,\n spacing: resolvedConfig.spacing,\n alignment: resolvedConfig.alignment,\n });\n}\n","/**\n * Image Component\n * Standard component for rendering images in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isImageComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveImageProps } from '../styles/utils/componentDefaults';\nimport { createImage } from '../core/content';\n\n/**\n * Render image component\n */\nexport async function renderImageComponent(\n component: ComponentDefinition,\n theme: ThemeConfig\n): Promise<Paragraph[]> {\n if (!isImageComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveImageProps(component.props, theme);\n\n // Use base64 if provided, otherwise use path\n const imageSource = resolvedConfig.base64 || resolvedConfig.path;\n\n if (!imageSource) {\n throw new Error(\n 'Image component requires either \"path\" or \"base64\" property'\n );\n }\n\n return await createImage(imageSource, theme, {\n caption: resolvedConfig.caption,\n width: resolvedConfig.width,\n height: resolvedConfig.height,\n widthRelativeTo: (resolvedConfig as any).widthRelativeTo,\n heightRelativeTo: (resolvedConfig as any).heightRelativeTo,\n alignment: resolvedConfig.alignment,\n spacing: resolvedConfig.spacing,\n floating: resolvedConfig.floating,\n keepNext: resolvedConfig.keepNext,\n keepLines: resolvedConfig.keepLines,\n });\n}\n","/**\n * Text Box Component\n * Floating container that groups child paragraphs (from text/image components)\n */\n\nimport {\n Paragraph,\n Table,\n TableRow,\n TableCell,\n WidthType,\n TableAnchorType,\n RelativeHorizontalPosition,\n RelativeVerticalPosition,\n OverlapType,\n TableLayoutType,\n} from 'docx';\nimport {\n ComponentDefinition,\n TextBoxComponentDefinition,\n isTextBoxComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\n// No direct image or text parsing here; children components render themselves\nimport { renderComponent } from '../core/render';\nimport { NONE_BORDERS } from '../styles/utils/borderUtils';\nimport { buildCellOptions, CellStyleConfig } from '../styles/utils/cellUtils';\n\n// VML style helpers removed in favor of floating table approach\n\n// Map floating config to docx paragraph frame options to enforce wrapping at paragraph level\n\n// Map floating config to table float options for a one-cell table container\nfunction mapTableFloatOptions(\n floating?: NonNullable<TextBoxComponentDefinition['props']['floating']>\n): any | undefined {\n if (!floating) return undefined;\n\n const opt: any = {};\n\n const hp = floating.horizontalPosition;\n if (hp?.relative) {\n opt.horizontalAnchor =\n hp.relative === 'margin'\n ? TableAnchorType.MARGIN\n : hp.relative === 'page'\n ? TableAnchorType.PAGE\n : TableAnchorType.TEXT;\n }\n if (hp?.offset !== undefined) {\n opt.absoluteHorizontalPosition = hp.offset;\n } else if (hp?.align) {\n const map: Record<\n string,\n (typeof RelativeHorizontalPosition)[keyof typeof RelativeHorizontalPosition]\n > = {\n left: RelativeHorizontalPosition.LEFT,\n center: RelativeHorizontalPosition.CENTER,\n right: RelativeHorizontalPosition.RIGHT,\n inside: RelativeHorizontalPosition.INSIDE,\n outside: RelativeHorizontalPosition.OUTSIDE,\n };\n opt.relativeHorizontalPosition = map[hp.align];\n }\n\n const vp = floating.verticalPosition;\n if (vp?.relative) {\n opt.verticalAnchor =\n vp.relative === 'margin'\n ? TableAnchorType.MARGIN\n : vp.relative === 'page'\n ? TableAnchorType.PAGE\n : TableAnchorType.TEXT;\n }\n if (vp?.offset !== undefined) {\n opt.absoluteVerticalPosition = vp.offset;\n } else if (vp?.align) {\n const mapV: Record<\n string,\n (typeof RelativeVerticalPosition)[keyof typeof RelativeVerticalPosition]\n > = {\n top: RelativeVerticalPosition.TOP,\n center: RelativeVerticalPosition.CENTER,\n bottom: RelativeVerticalPosition.BOTTOM,\n inside: RelativeVerticalPosition.INSIDE,\n outside: RelativeVerticalPosition.OUTSIDE,\n } as any;\n opt.relativeVerticalPosition = mapV[vp.align];\n }\n\n // Map wrap margins to clearance distances\n const m = floating.wrap?.margins;\n if (m) {\n if (m.top !== undefined) opt.topFromText = m.top;\n if (m.right !== undefined) opt.rightFromText = m.right;\n if (m.bottom !== undefined) opt.bottomFromText = m.bottom;\n if (m.left !== undefined) opt.leftFromText = m.left;\n }\n\n opt.overlap = OverlapType.OVERLAP;\n\n return opt;\n}\n\nexport async function renderTextBoxComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n _context: import('../types').RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!isTextBoxComponent(component)) return [];\n const tb = component as TextBoxComponentDefinition;\n\n const isInline = !tb.props.floating;\n const childComponents = tb.children || [];\n\n if (isInline) {\n // Inline: use a one-cell table container for multi-paragraph support\n const cellChildren: (Paragraph | Table)[] = [];\n // Create context with current text-box as parent\n const childContext: import('../types').RenderContext = {\n ..._context,\n parent: tb,\n };\n for (const child of childComponents) {\n const rendered = await renderComponent(\n child,\n theme,\n themeName,\n childContext\n );\n cellChildren.push(...rendered);\n }\n\n const styleCfg = (tb.props as any).style as CellStyleConfig | undefined;\n const cellOpts = buildCellOptions(cellChildren, styleCfg, theme);\n\n const row = new TableRow({ children: [new TableCell(cellOpts)] });\n const table = new Table({\n layout: TableLayoutType.FIXED, // Lock column widths\n rows: [row],\n width: { size: 100, type: WidthType.PERCENTAGE },\n borders: NONE_BORDERS,\n });\n return [table];\n }\n\n // Always use a floating one-cell table container for multi-paragraph support\n\n // If there is at least one table or image child, use a floating one-cell table container\n const cellChildren: (Paragraph | Table)[] = [];\n // Create context with current text-box as parent\n const childContext: import('../types').RenderContext = {\n ..._context,\n parent: tb,\n };\n for (const child of childComponents) {\n const rendered = await renderComponent(\n child,\n theme,\n themeName,\n childContext\n );\n cellChildren.push(...rendered);\n }\n\n const styleCfg = (tb.props as any).style as CellStyleConfig | undefined;\n const cellOpts = buildCellOptions(cellChildren, styleCfg, theme);\n\n const row = new TableRow({\n children: [new TableCell(cellOpts)],\n });\n\n const float = mapTableFloatOptions(tb.props.floating);\n\n // Conversion factor: 1 pixel = 15 twips (at 96 DPI: 1440 twips/inch / 96 pixels/inch)\n const PIXELS_TO_TWIPS = 15;\n const DEFAULT_WIDTH_TWIPS = 5000; // ~333 pixels\n\n // Support width as number (pixels) or percentage string\n // Read from props.width (new location) with fallback to props.floating.width (legacy, in twips)\n const rawWidth = tb.props.width ?? (tb.props.floating as any)?.width;\n let widthSize: number;\n let widthType: (typeof WidthType)[keyof typeof WidthType];\n\n if (rawWidth === undefined) {\n // No width specified, use default\n widthSize = DEFAULT_WIDTH_TWIPS;\n widthType = WidthType.DXA;\n } else if (typeof rawWidth === 'string' && rawWidth.endsWith('%')) {\n // Percentage width\n widthSize = parseFloat(rawWidth);\n widthType = WidthType.PERCENTAGE;\n } else {\n // Number in pixels - convert to twips (DXA)\n widthSize =\n typeof rawWidth === 'number'\n ? rawWidth * PIXELS_TO_TWIPS\n : DEFAULT_WIDTH_TWIPS;\n widthType = WidthType.DXA;\n }\n\n const table = new Table({\n layout: TableLayoutType.FIXED, // Lock column widths\n rows: [row],\n width: { size: widthSize, type: widthType },\n float,\n borders: NONE_BORDERS,\n });\n return [table];\n}\n","/**\n * Border utilities for consistent border styling across modules\n */\n\nimport { BorderStyle } from 'docx';\nimport { resolveColor } from './colorUtils';\nimport { ThemeConfig } from '../index';\n\n/**\n * Standard \"no borders\" configuration for tables\n * Used when borders should be invisible/disabled\n */\nexport const NONE_BORDERS = {\n top: { style: BorderStyle.NONE, size: 0, color: '000000' },\n right: { style: BorderStyle.NONE, size: 0, color: '000000' },\n bottom: { style: BorderStyle.NONE, size: 0, color: '000000' },\n left: { style: BorderStyle.NONE, size: 0, color: '000000' },\n insideHorizontal: { style: BorderStyle.NONE, size: 0, color: '000000' },\n insideVertical: { style: BorderStyle.NONE, size: 0, color: '000000' },\n} as const;\n\n/**\n * Maps border style string to docx BorderStyle enum\n * @param s - Border style string ('dashed', 'dotted', 'double', 'none', 'single')\n * @returns Corresponding BorderStyle enum value\n */\nexport function mapBorderStyle(\n s?: string\n): (typeof BorderStyle)[keyof typeof BorderStyle] {\n switch (s) {\n case 'dashed':\n return BorderStyle.DASHED;\n case 'dotted':\n return BorderStyle.DOTTED;\n case 'double':\n return BorderStyle.DOUBLE;\n case 'none':\n return BorderStyle.NONE;\n default:\n return BorderStyle.SINGLE;\n }\n}\n\n/**\n * Border configuration object\n */\nexport interface BorderConfig {\n style?: string;\n width?: number;\n color?: string;\n}\n\n/**\n * Converts border configuration to docx border format\n * @param b - Border configuration object\n * @param theme - Theme configuration for color resolution\n * @returns Docx border object or undefined if no border\n */\nexport function convertBorder(\n b: BorderConfig | undefined,\n theme: ThemeConfig\n):\n | {\n style: (typeof BorderStyle)[keyof typeof BorderStyle];\n size: number;\n color: string;\n }\n | undefined {\n if (!b) return undefined;\n\n return {\n style: mapBorderStyle(b.style),\n size: b.width !== undefined ? Math.max(1, Math.round(b.width * 8)) : 1,\n color: b.color ? resolveColor(b.color, theme) : '000000',\n };\n}\n\n/**\n * Borders configuration for all four sides\n */\nexport interface BordersConfig {\n top?: BorderConfig;\n right?: BorderConfig;\n bottom?: BorderConfig;\n left?: BorderConfig;\n}\n\n/**\n * Converts borders configuration object to docx borders format\n * Returns undefined if no borders are defined\n * @param bordersConfig - Configuration for all four borders\n * @param theme - Theme configuration for color resolution\n * @returns Docx borders object or undefined\n */\nexport function convertBorders(\n bordersConfig: BordersConfig | undefined,\n theme: ThemeConfig\n):\n | Record<\n string,\n {\n style: (typeof BorderStyle)[keyof typeof BorderStyle];\n size: number;\n color: string;\n }\n >\n | undefined {\n if (!bordersConfig) return undefined;\n\n const borders: Record<\n string,\n {\n style: (typeof BorderStyle)[keyof typeof BorderStyle];\n size: number;\n color: string;\n }\n > = {};\n\n const top = convertBorder(bordersConfig.top, theme);\n const right = convertBorder(bordersConfig.right, theme);\n const bottom = convertBorder(bordersConfig.bottom, theme);\n const left = convertBorder(bordersConfig.left, theme);\n\n if (top) borders.top = top;\n if (right) borders.right = right;\n if (bottom) borders.bottom = bottom;\n if (left) borders.left = left;\n\n return Object.keys(borders).length > 0 ? borders : undefined;\n}\n","/**\n * Cell utilities for building table cell configurations\n */\n\nimport { Paragraph, Table } from 'docx';\nimport { pointsToTwips } from './styleHelpers';\nimport { resolveColor } from './colorUtils';\nimport { ThemeConfig } from '../index';\nimport { convertBorders, BordersConfig } from './borderUtils';\n\n/**\n * Padding configuration for all four sides\n */\nexport interface PaddingConfig {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\n/**\n * Shading configuration\n */\nexport interface ShadingConfig {\n fill?: string;\n}\n\n/**\n * Complete cell style configuration\n */\nexport interface CellStyleConfig {\n padding?: PaddingConfig;\n border?: BordersConfig;\n shading?: ShadingConfig;\n}\n\n/**\n * Builds cell options object for TableCell constructor\n * Handles margins (padding), shading, and borders consistently\n * @param children - Child elements to include in the cell\n * @param styleCfg - Style configuration for the cell\n * @param theme - Theme configuration for color resolution\n * @returns Cell options object ready for TableCell constructor\n */\nexport function buildCellOptions(\n children: (Paragraph | Table)[],\n styleCfg: CellStyleConfig | undefined,\n theme: ThemeConfig\n): {\n children: (Paragraph | Table)[];\n margins: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n shading?: { fill: string };\n borders?: Record<string, { style: any; size: number; color: string }>;\n} {\n const cellOpts: any = {\n children: children.length ? children : [new Paragraph({})],\n margins: {\n top: styleCfg?.padding?.top ? pointsToTwips(styleCfg.padding.top) : 0,\n right: styleCfg?.padding?.right\n ? pointsToTwips(styleCfg.padding.right)\n : 0,\n bottom: styleCfg?.padding?.bottom\n ? pointsToTwips(styleCfg.padding.bottom)\n : 0,\n left: styleCfg?.padding?.left ? pointsToTwips(styleCfg.padding.left) : 0,\n },\n };\n\n // Apply shading if configured\n if (styleCfg?.shading?.fill) {\n cellOpts.shading = { fill: resolveColor(styleCfg.shading.fill, theme) };\n }\n\n // Apply borders if configured\n if (styleCfg?.border) {\n const borders = convertBorders(styleCfg.border, theme);\n if (borders && Object.keys(borders).length > 0) {\n cellOpts.borders = borders;\n }\n }\n\n return cellOpts;\n}\n","/**\n * Table Component\n * Standard component for rendering tables in documents\n */\n\nimport { Table } from 'docx';\nimport { ComponentDefinition, isTableComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { createTable } from '../core/content';\n\ntype CellContent = string | ComponentDefinition;\n\ntype HorizontalAlignment = 'left' | 'center' | 'right' | 'justify';\n\ntype VerticalAlignment = 'top' | 'middle' | 'bottom';\n\ntype FontConfig = {\n family?: string;\n size?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n};\n\ntype BorderColor =\n | string\n | {\n bottom?: string;\n top?: string;\n right?: string;\n left?: string;\n };\n\ntype BorderSize =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype Padding =\n | number\n | {\n bottom?: number;\n top?: number;\n right?: number;\n left?: number;\n };\n\ntype CellDefaults = {\n color?: string;\n backgroundColor?: string;\n horizontalAlignment?: HorizontalAlignment;\n verticalAlignment?: VerticalAlignment;\n font?: FontConfig;\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n padding?: Padding;\n height?: number;\n};\n\ntype TableConfig = {\n borderColor?: BorderColor;\n borderSize?: BorderSize;\n cellDefaults?: CellDefaults;\n headerCellDefaults?: CellDefaults;\n width?: number;\n columns: {\n /** Width in points (number) or as percentage string e.g. \"40%\" */\n width?: number | string;\n cellDefaults?: CellDefaults;\n header?: CellDefaults & {\n content?: CellContent;\n };\n cells?: (CellDefaults & {\n content?: CellContent;\n })[];\n }[];\n keepInOnePage?: boolean;\n keepNext?: boolean;\n repeatHeaderOnPageBreak?: boolean;\n};\n\n/**\n * Render table component\n * Supports new column-based format with cell defaults and legacy headers/rows format\n */\nexport async function renderTableComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Promise<Table[]> {\n if (!isTableComponent(component)) return [];\n\n const rawConfig = component.props as any;\n const result: Table[] = [];\n\n // Check if this is the old format (has headers and rows properties)\n if (rawConfig.headers && rawConfig.rows) {\n // Convert old format to new format\n const headers = rawConfig.headers as string[];\n const rows = rawConfig.rows as string[][];\n\n const defaultCellDefaults: CellDefaults = {\n color: '000000',\n backgroundColor: 'FFFFFF',\n horizontalAlignment: 'left',\n verticalAlignment: 'top',\n font: {\n family: 'Arial',\n size: 11,\n bold: false,\n italic: false,\n underline: false,\n },\n borderColor: '000000',\n borderSize: 1,\n };\n\n const config: TableConfig = {\n borderColor: '000000',\n borderSize: 1,\n cellDefaults: defaultCellDefaults,\n width: 100,\n columns: headers.map((header, colIndex) => ({\n cellDefaults: { ...defaultCellDefaults },\n header: {\n ...defaultCellDefaults,\n content: header,\n },\n cells: rows.map((row) => ({\n ...defaultCellDefaults,\n content: row[colIndex] || '',\n })),\n })),\n };\n\n result.push(await createTable(config.columns, config, theme, themeName));\n\n return result;\n }\n\n // New column-based format\n const config = rawConfig as TableConfig;\n\n result.push(await createTable(config.columns, config, theme, themeName));\n\n return result;\n}\n","/**\n * Section Component\n * Standard component for rendering document sections with child components\n */\n\nimport { Paragraph, Table, BookmarkStart, BookmarkEnd } from 'docx';\nimport {\n ComponentDefinition,\n RenderContext,\n isSectionComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { renderComponent } from '../core/render';\n\n/**\n * Generate unique bookmark ID for section scoping\n * Uses timestamp and random component for uniqueness without global state\n */\nfunction generateSectionBookmarkId(): { id: string; linkId: number } {\n const linkId = Math.floor(Math.random() * 1000000);\n return {\n id: `_Section_${linkId}_${Date.now()}`,\n linkId,\n };\n}\n\n/**\n * Render section component with bookmark support for scoped TOCs\n */\nexport async function renderSectionComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!isSectionComponent(component)) return [];\n\n const elements: (Paragraph | Table)[] = [];\n\n // Generate unique bookmark ID for this section\n const { id: sectionBookmarkId, linkId: bookmarkLinkId } =\n generateSectionBookmarkId();\n\n // Add bookmark in a zero-spacing paragraph at section start\n // This prevents visual gaps while maintaining bookmark functionality\n elements.push(\n new Paragraph({\n children: [new BookmarkStart(sectionBookmarkId, bookmarkLinkId)],\n spacing: {\n before: 0,\n after: 0,\n line: 0,\n },\n })\n );\n\n // Update context with section bookmark ID for child components (especially TOCs)\n const sectionContext: RenderContext = {\n ...context,\n section: {\n ...context.section,\n sectionBookmarkId,\n },\n };\n\n // Render child components with updated context\n if (component.children) {\n for (const child of component.children) {\n const childElements = await renderComponent(\n child,\n theme,\n themeName,\n sectionContext\n );\n elements.push(...childElements);\n }\n }\n\n // Add bookmark end after section content\n // Use zero spacing to prevent visual gap\n elements.push(\n new Paragraph({\n children: [new BookmarkEnd(bookmarkLinkId)],\n spacing: {\n before: 0,\n after: 0,\n line: 0,\n },\n })\n );\n\n return elements;\n}\n","/**\n * Columns Component\n * Standard component for rendering content in columns layout\n */\n\nimport {\n Paragraph,\n Table,\n TableRow,\n TableCell,\n WidthType,\n BorderStyle,\n VerticalAlign,\n TableLayoutType,\n} from 'docx';\nimport {\n ComponentDefinition,\n RenderContext,\n isColumnsComponent,\n isTextBoxComponent,\n} from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveColumnsProps } from '../styles/utils/componentDefaults';\nimport { renderComponent } from '../core/render';\nimport {\n getAvailableWidthTwips,\n relativeLengthToTwips,\n} from '../utils/widthUtils';\nimport { NONE_BORDERS } from '../styles/utils/borderUtils';\n\n/**\n * Render columns component\n */\nexport async function renderColumnsComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<(Paragraph | Table)[]> {\n if (!isColumnsComponent(component)) return [];\n\n // Check if parent is a text-box component\n if (context.parent && isTextBoxComponent(context.parent)) {\n // Render as table-based columns when inside a text-box\n return await renderColumnsAsTable(component, theme, themeName, context);\n }\n\n // Standard section-based rendering (existing behavior)\n // Resolve configuration with theme defaults\n // Note: resolvedConfig is available for future use if needed\n resolveColumnsProps(component.props, theme);\n\n const elements: (Paragraph | Table)[] = [];\n\n if (component.children) {\n for (const child of component.children) {\n const childElements = await renderComponent(\n child,\n theme,\n themeName,\n context\n );\n elements.push(...childElements);\n }\n }\n\n return elements;\n}\n\n/**\n * Render columns as a multi-column table (for use inside text-boxes)\n */\nasync function renderColumnsAsTable(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string,\n context: RenderContext\n): Promise<Table[]> {\n const cfg = (component as any).props || {};\n const columns = cfg.columns || [];\n\n // Normalize columns configuration\n let columnConfigs: Array<{ width?: number | string; gap?: number | string }> =\n [];\n if (typeof columns === 'number') {\n // Equal-width columns\n columnConfigs = Array(columns).fill({ width: 'auto' });\n } else if (Array.isArray(columns)) {\n columnConfigs = columns;\n } else {\n // Invalid config, return empty\n return [];\n }\n\n const columnCount = columnConfigs.length;\n if (columnCount === 0) return [];\n\n // Calculate column widths\n const availableWidthTwips = getAvailableWidthTwips(theme, themeName);\n const columnWidths: number[] = [];\n const columnGaps: number[] = [];\n let totalDefinedWidth = 0;\n let totalGaps = 0;\n const autoWidthIndexes: number[] = [];\n\n for (let i = 0; i < columnCount; i++) {\n const col = columnConfigs[i];\n\n // Calculate width\n if (col.width === undefined || col.width === 'auto') {\n autoWidthIndexes.push(i);\n columnWidths.push(0); // Placeholder\n } else {\n const widthTwips = relativeLengthToTwips(col.width, availableWidthTwips);\n columnWidths.push(widthTwips);\n totalDefinedWidth += widthTwips;\n }\n\n // Calculate gap (space after this column)\n if (i < columnCount - 1) {\n const gapTwips =\n col.gap !== undefined\n ? relativeLengthToTwips(col.gap, availableWidthTwips)\n : cfg.gap !== undefined\n ? relativeLengthToTwips(cfg.gap, availableWidthTwips)\n : 720; // Default: 0.5 inch\n columnGaps.push(gapTwips);\n totalGaps += gapTwips;\n } else {\n columnGaps.push(0); // No gap after last column\n }\n }\n\n // Distribute remaining width among auto-width columns\n const remainingWidth = Math.max(\n 0,\n availableWidthTwips - totalDefinedWidth - totalGaps\n );\n if (autoWidthIndexes.length > 0) {\n const autoColumnWidth = Math.floor(\n remainingWidth / autoWidthIndexes.length\n );\n for (const idx of autoWidthIndexes) {\n columnWidths[idx] = autoColumnWidth;\n }\n }\n\n // Distribute child components across columns\n const childComponents = (component as any).children || [];\n const columnContents: ComponentDefinition[][] = Array(columnCount)\n .fill(null)\n .map(() => []);\n\n // Simple distribution: round-robin\n for (let i = 0; i < childComponents.length; i++) {\n const colIndex = i % columnCount;\n columnContents[colIndex].push(childComponents[i]);\n }\n\n // Render each column's content\n const cells: TableCell[] = [];\n for (let i = 0; i < columnCount; i++) {\n const columnElements: (Paragraph | Table)[] = [];\n\n for (const child of columnContents[i]) {\n const rendered = await renderComponent(child, theme, themeName, context);\n columnElements.push(...rendered);\n }\n\n // If column is empty, add empty paragraph\n if (columnElements.length === 0) {\n columnElements.push(new Paragraph({}));\n }\n\n cells.push(\n new TableCell({\n children: columnElements,\n width: { size: columnWidths[i], type: WidthType.DXA },\n margins: {\n top: 0,\n right: columnGaps[i] / 2,\n bottom: 0,\n left: i > 0 ? columnGaps[i - 1] / 2 : 0,\n },\n verticalAlign: VerticalAlign.TOP,\n borders: {\n top: { style: BorderStyle.NONE, size: 0, color: '000000' },\n right: { style: BorderStyle.NONE, size: 0, color: '000000' },\n bottom: { style: BorderStyle.NONE, size: 0, color: '000000' },\n left: { style: BorderStyle.NONE, size: 0, color: '000000' },\n },\n })\n );\n }\n\n const row = new TableRow({ children: cells });\n const table = new Table({\n rows: [row],\n width: { size: 100, type: WidthType.PERCENTAGE },\n layout: TableLayoutType.FIXED, // Lock column widths\n borders: NONE_BORDERS,\n });\n\n return [table];\n}\n","/**\n * Statistic Component\n * Standard component for rendering statistic displays in documents\n */\n\nimport { Paragraph } from 'docx';\nimport { ComponentDefinition, isStatisticComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { resolveStatisticProps } from '../styles/utils/componentDefaults';\nimport { createStatistic } from '../core/content';\n\n/**\n * Render statistic component\n */\nexport function renderStatisticComponent(\n component: ComponentDefinition,\n theme: ThemeConfig\n): Paragraph[] {\n if (!isStatisticComponent(component)) return [];\n\n // Resolve configuration with theme defaults\n const resolvedConfig = resolveStatisticProps(component.props, theme);\n\n return createStatistic(\n {\n number: resolvedConfig.number,\n description: resolvedConfig.description,\n alignment: resolvedConfig.alignment,\n },\n {\n spacing: resolvedConfig.spacing as\n | { before?: number; after?: number }\n | undefined,\n }\n );\n}\n","/**\n * Header Component\n * Standard component for rendering header elements in documents\n */\n\nimport { Paragraph, TextRun } from 'docx';\nimport {\n ComponentDefinition,\n HeaderComponentDefinition,\n isHeaderComponent,\n} from '../types';\nimport { ThemeConfig, getBodyTextStyle } from '../styles';\nimport { getThemeColors } from '../themes/defaults';\nimport { getAlignment } from '../utils/alignmentUtils';\n\n/**\n * Render header component\n */\nexport function renderHeaderComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isHeaderComponent(component)) return [];\n\n const headerComp = component as HeaderComponentDefinition;\n const bodyStyle = getBodyTextStyle(theme, themeName);\n\n // Simple header implementation - just a text paragraph\n return [\n new Paragraph({\n children: [\n new TextRun({\n text: `[Header: ${headerComp.props.alignment || 'center'}]`,\n font: bodyStyle.font,\n size: bodyStyle.size,\n color: getThemeColors(theme).secondary,\n }),\n ],\n alignment: getAlignment(headerComp.props.alignment || 'center'),\n style: 'Normal',\n }),\n ];\n}\n","/**\n * Alignment Utilities\n * Shared utilities for converting alignment strings to docx AlignmentType\n */\n\nimport { AlignmentType } from 'docx';\n\n/**\n * Convert alignment string to docx AlignmentType\n */\nexport function getAlignment(\n alignment: string\n): (typeof AlignmentType)[keyof typeof AlignmentType] {\n switch (alignment) {\n case 'center':\n return AlignmentType.CENTER;\n case 'right':\n return AlignmentType.RIGHT;\n case 'justify':\n return AlignmentType.JUSTIFIED;\n default:\n return AlignmentType.LEFT;\n }\n}\n","/**\n * Footer Component\n * Standard component for rendering footer elements in documents\n */\n\nimport { Paragraph, TextRun } from 'docx';\nimport {\n ComponentDefinition,\n FooterComponentDefinition,\n isFooterComponent,\n} from '../types';\nimport { ThemeConfig, getBodyTextStyle } from '../styles';\nimport { getThemeColors } from '../themes/defaults';\nimport { getAlignment } from '../utils/alignmentUtils';\n\n/**\n * Render footer component\n */\nexport function renderFooterComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n themeName: string\n): Paragraph[] {\n if (!isFooterComponent(component)) return [];\n\n const footerComp = component as FooterComponentDefinition;\n const bodyStyle = getBodyTextStyle(theme, themeName);\n\n // Simple footer implementation - just a text paragraph\n return [\n new Paragraph({\n children: [\n new TextRun({\n text: `[Footer: ${footerComp.props.alignment || 'center'}]`,\n font: bodyStyle.font,\n size: bodyStyle.size,\n color: getThemeColors(theme).secondary,\n }),\n ],\n alignment: getAlignment(footerComp.props.alignment || 'center'),\n style: 'Normal',\n }),\n ];\n}\n","/**\n * Table of Contents Component\n * Renders TOC using Word's native TableOfContents field with bookmark scoping support\n */\n\nimport {\n Paragraph,\n TableOfContents,\n AlignmentType,\n TextRun,\n StyleLevel,\n} from 'docx';\nimport type { ITableOfContentsOptions } from 'docx';\nimport type { TocProps } from '@json-to-office/shared-docx';\nimport type { ThemeConfig } from '../../styles';\nimport type { RenderContext } from '../../types';\n\nexport interface TocComponentDefinition {\n name: 'toc';\n id?: string;\n props: TocProps;\n}\n\n/**\n * Parse and validate a depth range configuration\n * @param rawDepth - Raw depth configuration from user input\n * @param fieldName - Name of the field (for error messages)\n * @param defaultFrom - Default 'from' value if not specified\n * @param defaultTo - Default 'to' value if not specified\n * @returns Validated depth range with from and to values\n */\nfunction parseDepthRange(\n rawDepth: any,\n fieldName: string,\n defaultFrom = 1,\n defaultTo = 3\n): { from: number; to: number } {\n if (typeof rawDepth !== 'object' || rawDepth === null) {\n throw new Error(\n `${fieldName} must be a range object with optional \"from\" and/or \"to\" fields, received: ${JSON.stringify(rawDepth)}`\n );\n }\n\n // Apply defaults for missing values\n const from = rawDepth.from ?? defaultFrom;\n const to = rawDepth.to ?? defaultTo;\n\n // Validate range\n if (from < 1 || from > 6 || to < 1 || to > 6) {\n throw new Error(\n `${fieldName} range values must be between 1 and 6, received: from=${from}, to=${to}`\n );\n }\n if (from > to) {\n throw new Error(\n `${fieldName} \"from\" must be less than or equal to \"to\", received: from=${from}, to=${to}`\n );\n }\n\n return { from, to };\n}\n\n/**\n * Render TOC component using Word's native TableOfContents field with bookmark scoping\n *\n * This creates a dynamic TOC that:\n * - Auto-populates with headings from configured scope\n * - Updates automatically when document structure changes\n * - Includes clickable hyperlinks to content\n * - Shows page numbers (if enabled)\n * - Respects configured depth limits\n *\n * Scope behavior:\n * - scope: 'document' → Scans entire document (default when TOC is at report level)\n * - scope: 'section' → Scans only parent section content (uses bookmark)\n * - scope: 'auto' → Automatically detects: section if inside section, otherwise document\n */\nexport function renderTocComponent(\n component: TocComponentDefinition,\n theme: ThemeConfig,\n context?: RenderContext\n): (Paragraph | TableOfContents)[] {\n const componentProps = component.props;\n\n // Parse depth parameter - supports range with optional from/to\n const rawDepth = componentProps.depth ?? { to: 3 };\n const depthRange = parseDepthRange(rawDepth, 'TOC depth', 1, 3);\n const depthStart = depthRange.from;\n const depthEnd = depthRange.to;\n\n // Parse pageNumbersDepth parameter - controls which levels show page numbers\n let pageNumbersStart: number | undefined;\n let pageNumbersEnd: number | undefined;\n\n if (componentProps.pageNumbersDepth !== undefined) {\n const pageNumbersRange = parseDepthRange(\n componentProps.pageNumbersDepth,\n 'TOC pageNumbersDepth',\n 1,\n 3\n );\n pageNumbersStart = pageNumbersRange.from;\n pageNumbersEnd = pageNumbersRange.to;\n }\n\n // Note: numberingStyle is not currently used by docx.js TableOfContents API\n // Future enhancement: implement custom numbering via post-processing or XmlComponent\n // const numberingStyle = componentProps.numberingStyle ?? 'numeric';\n const includePageNumbers = componentProps.includePageNumbers !== false; // default true\n const scope = componentProps.scope ?? 'auto';\n\n // Determine effective scope based on configuration and context\n const effectiveScope =\n scope === 'auto'\n ? context?.section?.sectionBookmarkId\n ? 'section'\n : 'document'\n : scope;\n\n // Get section bookmark ID if scoped to section\n const sectionBookmarkId =\n effectiveScope === 'section'\n ? context?.section?.sectionBookmarkId\n : undefined;\n\n // Validate bookmark if section-scoped\n if (effectiveScope === 'section' && !sectionBookmarkId) {\n // Log warning but gracefully fall back to document scope\n console.warn(\n 'TOC configured for section scope but no section bookmark found. Falling back to document scope.'\n );\n }\n\n const paragraphs: (Paragraph | TableOfContents)[] = [];\n\n // Add TOC title only if explicitly provided\n if (componentProps.title) {\n paragraphs.push(\n new Paragraph({\n children: [\n new TextRun({\n text: componentProps.title,\n bold: true,\n size: 28, // 14pt (size is in half-points)\n }),\n ],\n spacing: {\n before: theme.componentDefaults?.heading?.spacing?.before ?? 240,\n // Increase spacing between the title and the TOC list\n // 180 ~= 9pt, provides clearer separation by default\n after: 180,\n },\n alignment: AlignmentType.LEFT,\n })\n );\n }\n\n // Build style mappings for TOC levels based on depth\n // StyleLevel requires styleName (string) and level (number)\n const stylesWithLevels: StyleLevel[] = [];\n\n // For section-scoped TOCs, exclude heading levels equal to or above the section title level\n // This prevents the section title from appearing in its own TOC\n const sectionTitleLevel = context?.section?.sectionTitleLevel;\n const startLevel =\n effectiveScope === 'section' && sectionTitleLevel\n ? sectionTitleLevel // Start from the level after the section title\n : 0; // Document scope starts from level 1 (index 0)\n\n // Do NOT map built-in heading styles via \\t switch.\n // Use headingStyleRange (\\o) exclusively for Heading 1..6 to avoid any interference\n // between TOC styles and document heading styles.\n\n // Add custom style mappings if provided\n // These allow arbitrary theme styles to appear in the TOC at specified levels\n if (componentProps.styles && componentProps.styles.length > 0) {\n for (const styleMapping of componentProps.styles) {\n // The TOC \\t (stylesWithLevels) switch expects Word style DISPLAY NAMES, not IDs.\n // Our theme registers custom styles with:\n // - id: original key (e.g., \"MySpectacularStyle\")\n // - name: Title Case with spaces (e.g., \"My Spectacular Style\")\n // Convert known custom style IDs to their display names to ensure Word matches them.\n const styleId = styleMapping.styleId;\n const isCustomStyle =\n !!theme.styles &&\n Object.prototype.hasOwnProperty.call(theme.styles, styleId);\n const styleDisplayName = isCustomStyle\n ? styleId\n .replace(/([A-Z])/g, ' $1')\n .replace(/[-_]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n : styleId; // If it's not a custom style key, assume it's already a display name\n\n stylesWithLevels.push(\n new StyleLevel(styleDisplayName, styleMapping.level)\n );\n }\n }\n\n // Create Word TOC field with optional bookmark scoping\n // The TableOfContents class generates a field code that Word will populate\n // Format (document scope): { TOC \\o \"1-N\" \\h \\z \\u }\n // Format (section scope): { TOC \\b BookmarkName \\o \"1-N\" \\h \\z \\u }\n // - \\b BookmarkName: Limit TOC to entries within specified bookmark\n // - \\o \"1-N\": Include outline levels 1 through N\n // - \\h: Make TOC entries hyperlinks\n // - \\z: Hide page numbers in web layout\n // - \\u: Use outline levels instead of TC fields\n\n // Calculate heading range for \\o switch\n // For section-scoped TOCs: start AFTER section title level (e.g., level 2 if section is level 1)\n // For document-scoped TOCs: use depthStart and depthEnd from parsed depth config\n const effectiveDepthStart =\n effectiveScope === 'section' && sectionTitleLevel\n ? Math.max(depthStart, startLevel + 1) // Skip section title level, but respect user's depthStart\n : depthStart;\n const effectiveDepthEnd = depthEnd;\n\n // Build TOC options\n const tocOptions: ITableOfContentsOptions = {\n hyperlink: true, // Enable clickable hyperlinks (\\h switch)\n headingStyleRange: `${effectiveDepthStart}-${effectiveDepthEnd}`, // Outline level range (\\o switch)\n stylesWithLevels, // Style-to-TOC-level mappings (\\t switch)\n // Add bookmark scope if within a section (\\b switch)\n entriesFromBookmark: sectionBookmarkId,\n // Handle page number visibility\n // If pageNumbersDepth is specified, use it to control which levels show page numbers\n // Otherwise, respect includePageNumbers boolean (default true)\n ...(() => {\n if (pageNumbersStart !== undefined && pageNumbersEnd !== undefined) {\n // pageNumbersDepth specified: hide page numbers outside the specified range\n // Word's \\n switch omits page numbers for specified levels\n // We need to invert the logic: specify levels to OMIT, not levels to SHOW\n const levelsToOmit: string[] = [];\n\n // Omit levels before pageNumbersStart\n if (pageNumbersStart > effectiveDepthStart) {\n levelsToOmit.push(`${effectiveDepthStart}-${pageNumbersStart - 1}`);\n }\n\n // Omit levels after pageNumbersEnd\n if (pageNumbersEnd < effectiveDepthEnd) {\n levelsToOmit.push(`${pageNumbersEnd + 1}-${effectiveDepthEnd}`);\n }\n\n // Only add the option if there are levels to omit\n return levelsToOmit.length > 0\n ? { pageNumbersEntryLevelsRange: levelsToOmit.join(',') }\n : {};\n } else if (!includePageNumbers) {\n // includePageNumbers is false: omit page numbers for all levels\n return {\n pageNumbersEntryLevelsRange: `${effectiveDepthStart}-${effectiveDepthEnd}`,\n };\n } else {\n // includePageNumbers is true and no pageNumbersDepth: show page numbers for all levels\n return {};\n }\n })(),\n // Add separator between entry text and page number\n // Boolean: true = \"\\t\" (tab, default), false = \" \" (space)\n ...(componentProps.numberSeparator !== undefined\n ? {\n entryAndPageNumberSeparator: componentProps.numberSeparator\n ? '\\t'\n : ' ',\n }\n : { entryAndPageNumberSeparator: '\\t' }), // default to tab\n };\n\n // Insert TOC as a top-level block (not wrapped in a Paragraph).\n // Wrapping TableOfContents inside a Paragraph produces an empty SDT above\n // the actual entries in Word. Adding directly avoids that artifact.\n paragraphs.push(\n new TableOfContents(componentProps.title ?? 'Table of Contents', tocOptions)\n );\n\n // Do not append an extra empty paragraph after TOC to avoid\n // unwanted blank lines/newlines at the end of the TOC block.\n\n // Note: Word will automatically handle:\n // - Page number display (based on document view mode)\n // - Numbering style (inherited from heading styles)\n // - Indentation (based on heading levels)\n // - Updates (right-click TOC → Update Field in Word)\n\n return paragraphs;\n}\n","/**\n * Environment detection utilities\n */\n\n/**\n * Check if the current environment is Node.js\n * This is used to conditionally load Node.js-only modules\n */\nexport function isNodeEnvironment(): boolean {\n // Check for Node.js-specific globals\n return (\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null &&\n typeof process.versions.node === 'string'\n );\n}\n\n/**\n * Check if Node.js built-in modules are available\n * More specific check for modules that require Node.js built-ins\n */\nexport function hasNodeBuiltins(): boolean {\n try {\n // Check if we can access Node.js built-in modules\n // This will fail in browser environments\n return (\n typeof require !== 'undefined' ||\n (typeof process !== 'undefined' &&\n typeof process.versions === 'object' &&\n typeof process.versions.node === 'string')\n );\n } catch {\n return false;\n }\n}\n","/**\n * Highcharts Component\n * Standard component for generating charts using Highcharts Export Server\n */\n\nimport { Paragraph, Table } from 'docx';\nimport { ComponentDefinition, isHighchartsComponent } from '../types';\nimport { ThemeConfig } from '../styles';\nimport { createImage } from '../core/content';\nimport { isNodeEnvironment } from '../utils/environment';\n\n// Import only the types we actually use from shared package\nimport type { HighchartsProps } from '@json-to-office/shared-docx';\n\n// Re-export HighchartsProps for backward compatibility\nexport type { HighchartsProps } from '@json-to-office/shared-docx';\n\n/**\n * Chart generation result\n */\nexport interface ChartGenerationResult {\n base64DataUri: string;\n width: number;\n height: number;\n}\n\nconst DEFAULT_EXPORT_SERVER_URL = 'http://localhost:7801';\n\nfunction getExportServerUrl(propsUrl?: string): string {\n return propsUrl || process.env.HIGHCHARTS_SERVER_URL || DEFAULT_EXPORT_SERVER_URL;\n}\n\n/**\n * Generate chart using Highcharts Export Server\n */\nasync function generateChart(\n config: HighchartsProps\n): Promise<ChartGenerationResult> {\n // Only run in Node.js environments\n if (!isNodeEnvironment()) {\n throw new Error(\n 'Highcharts export server requires a Node.js environment. ' +\n 'Chart generation is not available in browser environments.'\n );\n }\n\n const serverUrl = getExportServerUrl(config.serverUrl);\n\n const requestBody: Record<string, unknown> = {\n infile: config.options,\n type: 'png',\n b64: true,\n scale: config.scale,\n };\n\n const response = await fetch(`${serverUrl}/export`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n }).catch((error) => {\n throw new Error(\n `Highcharts Export Server is not running at ${serverUrl}. ` +\n 'Start it with: npx highcharts-export-server --enableServer true\\n' +\n `Cause: ${error instanceof Error ? error.message : String(error)}`\n );\n });\n\n if (!response.ok) {\n throw new Error(\n `Highcharts export server returned ${response.status}: ${response.statusText}`\n );\n }\n\n const base64Data = await response.text();\n const base64DataUri = `data:image/png;base64,${base64Data}`;\n const width = config.options.chart.width;\n const height = config.options.chart.height;\n\n return {\n base64DataUri,\n width,\n height,\n };\n}\n\n/**\n * Render highcharts component\n */\nexport async function renderHighchartsComponent(\n component: ComponentDefinition,\n theme: ThemeConfig,\n _themeName: string\n): Promise<(Paragraph | Table)[]> {\n if (!isHighchartsComponent(component)) return [];\n\n const config = component.props as HighchartsProps;\n\n // Generate the chart\n const chartResult = await generateChart(config);\n\n // If either config.width or config.height is provided, use config dimensions only\n // Otherwise fall back to chart dimensions\n const hasConfigDimensions =\n config.width !== undefined || config.height !== undefined;\n const renderWidth = hasConfigDimensions ? config.width : chartResult.width;\n const renderHeight = hasConfigDimensions\n ? config.height\n : chartResult.height;\n\n // Add chart image using the image component with base64 data URI\n const imageParagraphs = await createImage(\n chartResult.base64DataUri,\n theme,\n {\n width: renderWidth,\n height: renderHeight,\n alignment: 'center',\n }\n );\n\n return imageParagraphs;\n}\n","/**\n * Text Space After Custom Component\n * A text component with hardcoded spacing after the paragraph\n *\n * This component is provided as an example of the legacy custom component system.\n * For new custom components, use the plugin system instead:\n * @see packages/core/src/plugin/example/ for modern examples\n */\n\nimport { Type, Static } from '@sinclair/typebox';\nimport { createComponent, createVersion } from '../plugin/createComponent';\nimport type { ComponentDefinition } from '@json-to-office/shared-docx';\n\n/**\n * Props schema for text-space-after component\n */\nconst TextSpaceAfterPropsSchema = Type.Object({\n text: Type.String({\n description: 'Text content to display',\n }),\n // Retained for backwards compatibility of props shape, but not applied\n spacing: Type.Optional(\n Type.Object({\n before: Type.Optional(Type.Number()),\n after: Type.Optional(Type.Number()),\n })\n ),\n});\n\nexport type TextSpaceAfterProps = Static<typeof TextSpaceAfterPropsSchema>;\n\n/**\n * Text space after component - adds hardcoded spacing after paragraphs\n */\nexport const textSpaceAfterComponent = createComponent({\n name: 'text-space-after',\n versions: {\n '1.0.0': createVersion({\n propsSchema: TextSpaceAfterPropsSchema,\n description: 'Text component with hardcoded spacing after the paragraph',\n render: async ({ props }) => {\n // Create paragraph component with hardcoded spacing after\n const result: ComponentDefinition = {\n name: 'paragraph',\n props: {\n text: props.text,\n spacing: {\n ...props.spacing,\n after: props.spacing?.after || 12,\n },\n },\n };\n\n return [result];\n },\n }),\n },\n});\n","import type { TSchema } from '@sinclair/typebox';\nimport type { ComponentDefinition } from '@json-to-office/shared-docx';\nimport type { ThemeConfig } from '../styles';\nimport {\n createVersion as sharedCreateVersion,\n createComponent as sharedCreateComponent,\n} from '@json-to-office/shared/plugin';\nimport type {\n RenderContext as SharedRenderContext,\n RenderFunction as SharedRenderFunction,\n ComponentVersion as SharedComponentVersion,\n ComponentVersionMap as SharedComponentVersionMap,\n CustomComponent as SharedCustomComponent,\n} from '@json-to-office/shared/plugin';\n\n// ---- DOCX-specific type aliases (backward compat) ----\n\n/**\n * DOCX render context with ThemeConfig baked in\n */\nexport type RenderContext<T> = SharedRenderContext<T, ThemeConfig>;\n\nexport type RenderFunction<\n TProps,\n TComponentDefinition = ComponentDefinition,\n> = SharedRenderFunction<TProps, TComponentDefinition, ThemeConfig>;\n\nexport type ComponentVersion<\n TComponentDefinition = ComponentDefinition,\n TPropsSchema extends TSchema = TSchema,\n> = SharedComponentVersion<TComponentDefinition, TPropsSchema, ThemeConfig>;\n\nexport type ComponentVersionMap<TComponentDefinition = ComponentDefinition> =\n SharedComponentVersionMap<TComponentDefinition, ThemeConfig>;\n\nexport type CustomComponent<\n TComponentDefinition = ComponentDefinition,\n TVersions extends\n ComponentVersionMap<TComponentDefinition> = ComponentVersionMap<TComponentDefinition>,\n TName extends string = string,\n> = SharedCustomComponent<TComponentDefinition, TVersions, TName>;\n\n// ---- Re-export factory functions (thin wrappers for DOCX defaults) ----\n\nexport function createVersion<\n TPropsSchema extends TSchema,\n TComponentDefinition = ComponentDefinition,\n>(\n version: ComponentVersion<TComponentDefinition, TPropsSchema>\n): ComponentVersion<TComponentDefinition, TPropsSchema> {\n return sharedCreateVersion(version);\n}\n\nexport function createComponent<\n TComponentDefinition = ComponentDefinition,\n TVersions extends\n ComponentVersionMap<TComponentDefinition> = ComponentVersionMap<TComponentDefinition>,\n TName extends string = string,\n>(\n component: CustomComponent<TComponentDefinition, TVersions, TName>\n): CustomComponent<TComponentDefinition, TVersions, TName> {\n return sharedCreateComponent(component);\n}\n","/**\n * JSON Document Parser - Re-exports from shared package\n *\n * This module re-exports the JSON parsing functionality from the shared package\n * and provide a clean interface for the core package.\n */\n\n// Re-export everything from shared package's JSON parser\nexport {\n JsonDocumentParser,\n JsonParsingError,\n JsonValidationError,\n parseJsonComponent,\n validateJsonComponent,\n parseJsonWithLineNumbers,\n} from '@json-to-office/shared-docx';\n\n// Re-export types needed by other modules\nexport type {\n DocumentValidationResult,\n DocumentValidationError,\n} from '@json-to-office/shared-docx';\n","/**\n * Component Normalizer - Transforms JSON components where business logic requires it\n *\n * This module ONLY handles transformations that are actually necessary:\n * 1. Columns shorthand notation (columns: 3 → array format)\n * 2. Recursive processing of nested components\n * 3. Gap application for columns\n *\n * All other properties are preserved as-is from TypeBox validation.\n * This prevents information loss and maintains single source of truth.\n */\n\nimport {\n ComponentDefinition,\n ReportComponentDefinition,\n SectionComponentDefinition,\n ColumnsComponentDefinition,\n ColumnsProps,\n} from '../types';\n\n/**\n * Normalize a component definition and its nested children\n * Preserves all validated properties - only transforms where business logic requires\n */\nexport function normalizeComponent(\n component: ComponentDefinition\n): ComponentDefinition {\n // Handle columns component with shorthand notation\n if (component.name === 'columns') {\n return normalizeColumnsComponent(component as ColumnsComponentDefinition);\n }\n\n // Handle components with children - recursively normalize\n if ('children' in component && component.children) {\n return {\n ...component, // Preserve ALL properties from validated component\n children: component.children.map(normalizeComponent),\n } as ComponentDefinition;\n }\n\n // Handle section component with header/footer arrays\n if (component.name === 'section') {\n return normalizeSectionComponent(component as SectionComponentDefinition);\n }\n\n // All other components: return as-is (already validated by TypeBox)\n return component;\n}\n\n/**\n * Normalize columns component\n * Converts shorthand notation and applies gap logic\n */\nfunction normalizeColumnsComponent(\n component: ColumnsComponentDefinition\n): ColumnsComponentDefinition {\n const cfg = component.props || ({} as any);\n\n // Helper: apply top-level gap to all columns except last where not overridden\n const applyTopLevelGap = (\n cols: Array<{ width?: unknown; gap?: unknown }>,\n topGap: unknown\n ) =>\n cols.map((c, i) => {\n const isLast = i === cols.length - 1;\n if (!isLast && c.gap === undefined && topGap !== undefined) {\n return { ...c, gap: topGap };\n }\n return c;\n });\n\n // Helper: normalize 'auto' to unspecified width (internal layout splits remainder)\n const normalizeAutoWidth = (\n cols: Array<{ width?: unknown; gap?: unknown }>\n ) =>\n cols.map((c) => ({\n ...c,\n width: c.width === 'auto' ? undefined : c.width,\n }));\n\n let columnsArray: Array<{ width?: unknown; gap?: unknown }>;\n\n if (typeof cfg.columns === 'number' && cfg.columns > 0) {\n // Shorthand: N equal-width columns; apply gap after each except last\n const n = cfg.columns as number;\n const base = Array.from(\n { length: n },\n () => ({}) as { width?: unknown; gap?: unknown }\n );\n const topLevelGap = cfg.gap !== undefined ? cfg.gap : '5%';\n columnsArray = applyTopLevelGap(base, topLevelGap);\n } else if (Array.isArray(cfg.columns)) {\n // Array form; honor per-column config\n columnsArray = cfg.columns as Array<{ width?: unknown; gap?: unknown }>;\n // Apply top-level gap unless column overrides; skip last column\n const topLevelGap = cfg.gap !== undefined ? cfg.gap : '5%';\n columnsArray = applyTopLevelGap(columnsArray, topLevelGap);\n // Normalize 'auto' widths to unspecified so layout can allocate remainder\n columnsArray = normalizeAutoWidth(columnsArray);\n } else {\n // Minimal valid shape\n columnsArray = [{}];\n }\n\n const normalizedProps: ColumnsProps = {\n columns: columnsArray,\n } as ColumnsProps;\n\n return {\n ...component, // Preserve any additional properties\n name: 'columns',\n props: normalizedProps,\n children: component.children\n ? component.children.map(normalizeComponent)\n : undefined,\n };\n}\n\n/**\n * Normalize section component\n * Handles recursive processing of header/footer component arrays\n */\nfunction normalizeSectionComponent(\n component: SectionComponentDefinition\n): SectionComponentDefinition {\n const props = component.props || ({} as any);\n\n return {\n ...component, // Preserve ALL properties\n props: {\n ...props, // Preserve ALL props properties\n header: props.header\n ? props.header === 'linkToPrevious'\n ? 'linkToPrevious'\n : props.header.map((m: ComponentDefinition) => normalizeComponent(m))\n : undefined,\n footer: props.footer\n ? props.footer === 'linkToPrevious'\n ? 'linkToPrevious'\n : props.footer.map((m: ComponentDefinition) => normalizeComponent(m))\n : undefined,\n },\n children: component.children\n ? component.children.map(normalizeComponent)\n : undefined,\n };\n}\n\n/**\n * Normalize entire document (top-level report component)\n * Returns as single-element tuple for backward compatibility\n */\nexport function normalizeDocument(\n document: ComponentDefinition | ReportComponentDefinition\n): [ReportComponentDefinition] {\n // Validate it's a report component\n if (document.name !== 'docx') {\n throw new Error(\n 'Top-level document must be a docx component with name=\"docx\"'\n );\n }\n\n const normalized = normalizeComponent(document) as ReportComponentDefinition;\n return [normalized];\n}\n\n/**\n * Validate component structure (container vs content components)\n */\nexport function validateComponentStructure(component: any): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n // Components that can have children\n const containerComponents = ['docx', 'section', 'columns', 'text-box'];\n\n // Check if content components have children (they shouldn't)\n if (\n !containerComponents.includes(component.name) &&\n component.children &&\n component.children.length > 0\n ) {\n errors.push(\n `Component name \"${component.name}\" cannot have child components`\n );\n }\n\n // Recursively validate child components\n if (component.children) {\n component.children.forEach(\n (childComponent: ComponentDefinition, index: number) => {\n const childResult = validateComponentStructure(childComponent);\n if (!childResult.valid) {\n errors.push(\n ...childResult.errors.map(\n (error) => `Component[${index}]: ${error}`\n )\n );\n }\n }\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import { promises as fs } from 'fs';\nimport { join, resolve, isAbsolute } from 'path';\nimport { watch, FSWatcher } from 'fs';\nimport { ComponentDefinition } from '@json-to-office/shared-docx';\nimport { parseJsonWithLineNumbers } from './parser';\n\n/**\n * File System utilities for JSON report definitions\n */\n\n/**\n * Load JSON report definition from file\n * Supports both relative and absolute file paths\n */\nexport async function loadJsonDefinition(\n filePath: string\n): Promise<ComponentDefinition> {\n try {\n // Resolve path (handles both relative and absolute paths)\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n\n // Check if file exists\n await fs.access(absolutePath);\n\n // Read file content\n const fileContent = await fs.readFile(absolutePath, 'utf-8');\n\n // Parse JSON with line number tracking for better errors\n return parseJsonWithLineNumbers(fileContent) as ComponentDefinition;\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'ENOENT':\n throw new JsonFileError(\n `File not found: ${filePath}`,\n 'FILE_NOT_FOUND'\n );\n case 'EACCES':\n throw new JsonFileError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED'\n );\n case 'EISDIR':\n throw new JsonFileError(\n `Path is a directory: ${filePath}`,\n 'IS_DIRECTORY'\n );\n default:\n throw new JsonFileError(\n `File system error: ${fsError.message}`,\n 'FS_ERROR'\n );\n }\n }\n\n // Re-throw parsing errors with file context\n if (error instanceof Error) {\n throw new JsonFileError(\n `Error loading ${filePath}: ${error.message}`,\n 'PARSE_ERROR',\n error\n );\n }\n\n throw new JsonFileError(\n `Unknown error loading ${filePath}`,\n 'UNKNOWN_ERROR'\n );\n }\n}\n\n/**\n * Load JSON definition with validation but without throwing on validation errors\n */\nexport async function loadJsonDefinitionSafe(filePath: string): Promise<{\n success: boolean;\n definition?: ComponentDefinition;\n error?: JsonFileError;\n}> {\n try {\n const definition = await loadJsonDefinition(filePath);\n return { success: true, definition };\n } catch (error) {\n return {\n success: false,\n error:\n error instanceof JsonFileError\n ? error\n : new JsonFileError(\n error instanceof Error ? error.message : String(error),\n 'UNKNOWN_ERROR'\n ),\n };\n }\n}\n\n/**\n * Watch JSON file for changes and call callback on modifications\n * Useful for development workflows\n */\nexport function watchJsonFile(\n filePath: string,\n callback: (\n _definition: ComponentDefinition | null,\n _error?: JsonFileError\n ) => void\n): JsonFileWatcher {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n\n // Initial load\n loadJsonDefinitionSafe(absolutePath).then((result) => {\n if (result.success) {\n callback(result.definition!);\n } else {\n callback(null, result.error);\n }\n });\n\n // Set up file watcher\n const watcher = watch(absolutePath, { persistent: true }, (eventType) => {\n if (eventType === 'change') {\n // Debounce rapid file changes\n setTimeout(async () => {\n const result = await loadJsonDefinitionSafe(absolutePath);\n if (result.success) {\n callback(result.definition!);\n } else {\n callback(null, result.error);\n }\n }, 100);\n }\n });\n\n return new JsonFileWatcher(watcher, absolutePath);\n}\n\n/**\n * Watch multiple JSON files and call callback when any changes\n */\nexport function watchJsonFiles(\n filePaths: string[],\n callback: (\n _filePath: string,\n _definition: ComponentDefinition | null,\n _error?: JsonFileError\n ) => void\n): JsonFileWatcher[] {\n return filePaths.map((filePath) => {\n return watchJsonFile(filePath, (definition, error) => {\n callback(filePath, definition, error);\n });\n });\n}\n\n/**\n * Check if file exists and is accessible\n */\nexport async function checkJsonFile(filePath: string): Promise<{\n exists: boolean;\n readable: boolean;\n isDirectory: boolean;\n error?: string;\n}> {\n try {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n const stats = await fs.stat(absolutePath);\n\n return {\n exists: true,\n readable: true,\n isDirectory: stats.isDirectory(),\n };\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'ENOENT':\n return {\n exists: false,\n readable: false,\n isDirectory: false,\n error: 'File not found',\n };\n case 'EACCES':\n return {\n exists: true,\n readable: false,\n isDirectory: false,\n error: 'Permission denied',\n };\n default:\n return {\n exists: false,\n readable: false,\n isDirectory: false,\n error: fsError.message,\n };\n }\n }\n\n return {\n exists: false,\n readable: false,\n isDirectory: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Find JSON files in a directory (non-recursive)\n */\nexport async function findJsonFiles(directoryPath: string): Promise<string[]> {\n try {\n const absolutePath = isAbsolute(directoryPath)\n ? directoryPath\n : resolve(directoryPath);\n const entries = await fs.readdir(absolutePath, { withFileTypes: true });\n\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))\n .map((entry) => join(absolutePath, entry.name));\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'ENOENT':\n throw new JsonFileError(\n `Directory not found: ${directoryPath}`,\n 'DIRECTORY_NOT_FOUND'\n );\n case 'ENOTDIR':\n throw new JsonFileError(\n `Path is not a directory: ${directoryPath}`,\n 'NOT_DIRECTORY'\n );\n case 'EACCES':\n throw new JsonFileError(\n `Permission denied: ${directoryPath}`,\n 'PERMISSION_DENIED'\n );\n default:\n throw new JsonFileError(\n `Directory error: ${fsError.message}`,\n 'DIRECTORY_ERROR'\n );\n }\n }\n\n throw new JsonFileError(\n `Unknown error reading directory ${directoryPath}`,\n 'UNKNOWN_ERROR'\n );\n }\n}\n\n/**\n * Save JSON report definition to file\n */\nexport async function saveJsonDefinition(\n definition: ComponentDefinition,\n filePath: string,\n options: { pretty?: boolean; backup?: boolean } = {}\n): Promise<void> {\n const { pretty = true, backup = false } = options;\n\n try {\n const absolutePath = isAbsolute(filePath) ? filePath : resolve(filePath);\n\n // Create backup if requested\n if (backup) {\n try {\n const backupPath = `${absolutePath}.backup`;\n await fs.copyFile(absolutePath, backupPath);\n } catch (error) {\n // Ignore backup errors if original file doesn't exist\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as Error & { code?: string }).code !== 'ENOENT'\n ) {\n console.warn(`Failed to create backup: ${error.message}`);\n }\n }\n }\n\n // Serialize JSON\n const jsonContent = pretty\n ? JSON.stringify(definition, null, 2)\n : JSON.stringify(definition);\n\n // Write file\n await fs.writeFile(absolutePath, jsonContent, 'utf-8');\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const fsError = error as Error & { code?: string };\n\n switch (fsError.code) {\n case 'EACCES':\n throw new JsonFileError(\n `Permission denied: ${filePath}`,\n 'PERMISSION_DENIED'\n );\n case 'ENOSPC':\n throw new JsonFileError(\n `No space left on device: ${filePath}`,\n 'NO_SPACE'\n );\n default:\n throw new JsonFileError(\n `Write error: ${fsError.message}`,\n 'WRITE_ERROR'\n );\n }\n }\n\n throw new JsonFileError(\n `Unknown error saving ${filePath}`,\n 'UNKNOWN_ERROR'\n );\n }\n}\n\n/**\n * File watcher wrapper class\n */\nexport class JsonFileWatcher {\n private watcher: FSWatcher;\n private filePath: string;\n\n constructor(watcher: FSWatcher, filePath: string) {\n this.watcher = watcher;\n this.filePath = filePath;\n }\n\n /**\n * Stop watching the file\n */\n public close(): void {\n this.watcher.close();\n }\n\n /**\n * Get the watched file path\n */\n public getFilePath(): string {\n return this.filePath;\n }\n}\n\n/**\n * Custom error class for file system operations\n */\nexport class JsonFileError extends Error {\n public readonly code: string;\n public readonly originalError?: Error;\n\n constructor(message: string, code: string, originalError?: Error) {\n super(message);\n this.name = 'JsonFileError';\n this.code = code;\n this.originalError = originalError;\n }\n}\n\n/**\n * Utility function to validate JSON file extension\n */\nexport function hasJsonExtension(filePath: string): boolean {\n return filePath.toLowerCase().endsWith('.json');\n}\n\n/**\n * Utility to ensure a path has .json extension\n */\nexport function ensureJsonExtension(filePath: string): string {\n return hasJsonExtension(filePath) ? filePath : `${filePath}.json`;\n}\n","/**\n * Warnings Document Generator\n * Utility to generate a document from generation warnings\n */\n\nimport type { GenerationWarning } from '@json-to-office/shared-docx';\nimport type { ComponentDefinition, ReportComponentDefinition } from '../types';\n\n/**\n * Generate a report document from warnings\n * Returns null if there are no warnings\n */\nexport function generateWarningsDocument(\n warnings: GenerationWarning[] | null\n): ReportComponentDefinition | null {\n if (!warnings || warnings.length === 0) {\n return null;\n }\n\n const children: ComponentDefinition[] = [\n {\n name: 'heading',\n props: {\n level: 1,\n text: 'Document Generation Warnings',\n },\n },\n {\n name: 'paragraph',\n props: {\n text: `${warnings.length} warning(s) were generated during document processing.`,\n spacing: {\n after: 24,\n },\n },\n },\n ];\n\n // Group warnings by component\n const warningsByComponent = new Map<string, GenerationWarning[]>();\n for (const warning of warnings) {\n const existing = warningsByComponent.get(warning.component) || [];\n existing.push(warning);\n warningsByComponent.set(warning.component, existing);\n }\n\n // Create sections for each component with warnings\n for (const [componentName, componentWarnings] of warningsByComponent.entries()) {\n children.push({\n name: 'heading',\n props: {\n level: 3,\n text: `Component: ${componentName}`,\n },\n });\n\n // Add each warning as a list item with details\n const warningItems: string[] = [];\n for (const warning of componentWarnings) {\n let warningText = warning.message;\n\n // Add context if present\n if (warning.context && Object.keys(warning.context).length > 0) {\n const contextStr = Object.entries(warning.context)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ');\n warningText += ` (${contextStr})`;\n }\n\n warningItems.push(warningText);\n }\n\n children.push({\n name: 'list',\n props: {\n items: warningItems,\n spacing: {\n after: 12,\n },\n },\n });\n }\n\n return {\n name: 'docx',\n props: {\n metadata: {\n title: 'Generation Warnings',\n },\n theme: 'minimal',\n },\n children,\n };\n}\n\n/**\n * Format warnings as plain text\n * Useful for logging or text output\n */\nexport function formatWarningsText(\n warnings: GenerationWarning[] | null\n): string {\n if (!warnings || warnings.length === 0) {\n return 'No warnings generated.';\n }\n\n const lines: string[] = [\n `Document Generation Warnings (${warnings.length} total)`,\n '='.repeat(50),\n '',\n ];\n\n // Group by component\n const warningsByComponent = new Map<string, GenerationWarning[]>();\n for (const warning of warnings) {\n const existing = warningsByComponent.get(warning.component) || [];\n existing.push(warning);\n warningsByComponent.set(warning.component, existing);\n }\n\n for (const [componentName, componentWarnings] of warningsByComponent.entries()) {\n lines.push(`Component: ${componentName}`);\n lines.push('-'.repeat(30));\n\n for (let i = 0; i < componentWarnings.length; i++) {\n const warning = componentWarnings[i];\n lines.push(` ${i + 1}. ${warning.message}`);\n\n if (warning.context && Object.keys(warning.context).length > 0) {\n lines.push(` Context: ${JSON.stringify(warning.context, null, 2)}`);\n }\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","// Version information\nexport function getCoreVersion(): string {\n return 'Core v1.0.0';\n}\n\n// Core functional API\nexport {\n generateDocument,\n generateFromConfig,\n generateDocumentFromJson,\n generateDocumentFromFile,\n generateBufferFromJson,\n generateBufferFromFile,\n generateAndSaveFromJson,\n generateAndSaveFromFile,\n validateJsonSchema,\n isReportComponentDefinition,\n saveDocument,\n generateAndSave,\n DocumentGenerator as CoreDocumentGenerator,\n} from './core/generator';\n\n// Cache API (general purpose caching, not specific to custom components)\nexport {\n MemoryCache,\n CacheKeyGenerator,\n DEFAULT_CACHE_CONFIG,\n getCacheConfigFromEnv,\n mergeConfigs,\n ComponentCacheAnalytics,\n // Types\n type CacheConfiguration,\n type CachedComponent,\n type CacheStatistics,\n type CacheKeyOptions,\n type CacheEvents,\n type CacheAnalyticsReport,\n type ComponentPerformanceMetrics,\n type ComponentCacheTrends,\n type CacheOptimizationRecommendation,\n type TimeSeriesPoint,\n} from './cache/index';\n\n// Component cache functions from core\nexport {\n initializeComponentCache,\n getComponentCache,\n clearComponentCache,\n getComponentCacheStats,\n warmComponentCache,\n} from './core/cached-render';\n\n// Legacy class-based API is now removed - use functional API above\n\n// Runtime exports (only type guards and functions)\nexport {\n // Type guards\n isReportComponent,\n isSectionComponent,\n isHeadingComponent,\n isParagraphComponent,\n isColumnsComponent,\n isImageComponent,\n isStatisticComponent,\n isTableComponent,\n isListComponent,\n isHeaderComponent,\n isFooterComponent,\n isHighchartsComponent,\n} from './types/index';\n\n// Export core-specific types only\nexport type {\n // Core-specific types\n ImageContent,\n StatisticContent,\n TableData,\n SectionProperties,\n ColumnSettings,\n PageSizeOptions,\n PageMarginOptions,\n PageNumberOptions,\n PageBorderOptions,\n RenderContext,\n} from './types/index';\n\n// Utilities\nexport * from './utils/formatters';\nexport { parseTextWithDecorators } from './utils/textParser';\nexport { isNodeEnvironment, hasNodeBuiltins } from './utils/environment';\nexport {\n generateWarningsDocument,\n formatWarningsText,\n} from './utils/warningsDocument';\n\n// Styles and themes\nexport {\n themes,\n minimalTheme,\n corporateTheme,\n modernTheme,\n} from './styles/index';\nexport type { ThemeName } from './styles/index';\n\n// JSON Theme System\nexport {\n loadThemeFromJson,\n loadThemeFromFile,\n exportThemeToJson,\n validateThemeJsonString,\n ThemeValidationError,\n ThemeParseError,\n ThemeFileError,\n createMinimalTheme,\n} from './themes/json/index';\n\n// Examples and utilities\nexport {\n examples,\n getExample,\n getExampleNames,\n loadJsonExample,\n} from './templates/documents/index';\nexport { runExample } from './utils/exampleRunner';\n\n// Export component implementations\nimport './components/index';\n\n// Re-export types from components (excluding those that come from shared)\nexport type {\n // ChartGenerationResult is specific to the component implementation\n ChartGenerationResult,\n} from './components/highcharts';\n\n// Note: TextSpaceAfterProps and HighchartsProps types are now in shared package\n// and should be imported from there to maintain single source of truth\n\n// Plugin System API\nexport {\n // Core plugin functions\n createComponent,\n createVersion,\n createDocumentGenerator,\n\n // Validation utilities\n validateComponentProps,\n validateDocument,\n cleanComponentProps,\n ComponentValidationError,\n\n // Schema utilities\n generatePluginDocumentSchema,\n exportPluginSchema,\n generateComponentSchemas,\n mergeSchemas,\n\n // Types\n type CustomComponent,\n type ComponentVersion,\n type ComponentVersionMap,\n type RenderFunction,\n type RenderContext as ComponentRenderContext,\n type DocumentGenerator,\n type DocumentGeneratorOptions,\n type GenerationResult,\n type BufferGenerationResult,\n type FileGenerationResult,\n type ValidationResult,\n type ValidationError,\n\n // Type utilities for custom components\n type ExtractCustomComponentType,\n type CustomComponentUnion,\n type ExtendedComponentDefinition,\n type ExtendedReportComponent,\n type InferCustomComponents,\n} from './plugin/index';\n\n// Plugin types\nexport type {\n PluginComponent,\n PluginRenderFunction,\n PluginValidationError,\n PluginValidationResult,\n} from './types/plugin';\n","/**\n * Examples registry - JSON-based examples\n * This file provides a unified interface to the JSON examples system\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { ComponentDefinition } from '@json-to-office/shared-docx';\n\nlet _dirname: string | null = null;\n\nfunction getDirname(): string {\n if (_dirname === null) {\n try {\n _dirname = path.dirname(fileURLToPath(import.meta.url));\n } catch {\n throw new Error(\n 'Cannot resolve file paths in a bundled environment. Example loading from disk is not available.'\n );\n }\n }\n return _dirname;\n}\n\n/**\n * Load a JSON example by name\n */\nexport function loadJsonExample(name: string): ComponentDefinition {\n // Since this file is bundled into dist/index.js, getDirname() will be the dist directory\n // The JSON files are copied to dist/templates/documents/ by the tsup config\n const filePath = path.join(\n getDirname(),\n 'templates',\n 'documents',\n `${name}.docx.json`\n );\n\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(content) as ComponentDefinition;\n } catch (error) {\n throw new Error(\n `Failed to load JSON example \"${name}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Get list of available JSON examples\n */\nexport function getAvailableJsonExamples(): string[] {\n // Since this file is bundled into dist/index.js, getDirname() will be the dist directory\n // The JSON files are copied to dist/templates/documents/ by the tsup config\n const examplesDir = path.join(getDirname(), 'templates', 'documents');\n\n try {\n const files = fs.readdirSync(examplesDir);\n return files\n .filter((file) => file.endsWith('.docx.json'))\n .map((file) => path.basename(file, '.docx.json'))\n .sort();\n } catch (error) {\n console.warn('Could not read JSON examples directory:', error);\n return [];\n }\n}\n\n/**\n * Example descriptions for documentation\n */\nexport const EXAMPLE_DESCRIPTIONS: Record<string, string> = {\n 'quarterly-report':\n 'Full quarterly report with TOC, sections, tables, statistics, columns, and lists',\n 'technical-guide':\n 'API integration guide with headers/footers, code-style text, tables, images, and multi-column layouts',\n proposal:\n 'Cloud migration proposal with headers/footers, statistics, side-by-side cost comparison tables, and ordered lists',\n};\n\n/**\n * Registry of available JSON examples (lazy-loaded)\n * For backward compatibility, this returns ComponentDefinition objects\n */\nconst _exampleCache: Record<string, ComponentDefinition> = {};\n\nexport const examples = new Proxy({} as Record<string, ComponentDefinition>, {\n get(_target, prop: string) {\n if (!_exampleCache[prop]) {\n try {\n _exampleCache[prop] = loadJsonExample(prop);\n } catch {\n return undefined;\n }\n }\n return _exampleCache[prop];\n },\n\n ownKeys(_target) {\n return getAvailableJsonExamples();\n },\n\n has(_target, prop: string) {\n return getAvailableJsonExamples().includes(prop);\n },\n});\n\n/**\n * Get example definition by name\n */\nexport const getExample = (\n exampleName: string\n): ComponentDefinition | undefined => {\n return examples[exampleName];\n};\n\n/**\n * Get all available example names\n */\nexport const getExampleNames = (): string[] => {\n return getAvailableJsonExamples();\n};\n\n// Use loadJsonExample() directly or access via the examples proxy\nexport const quarterlyReportExample = () => loadJsonExample('quarterly-report');\nexport const technicalGuideExample = () => loadJsonExample('technical-guide');\nexport const proposalExample = () => loadJsonExample('proposal');\n\n/**\n * Print usage information\n */\nexport function printExampleUsage(): void {\n const available = getAvailableJsonExamples();\n\n console.log('📋 Available JSON Examples:');\n console.log('===========================');\n\n available.forEach((name) => {\n const description =\n EXAMPLE_DESCRIPTIONS[name] || 'No description available';\n console.log(`\\n📄 ${name}:`);\n console.log(` ${description}`);\n console.log(` Usage: loadJsonExample('${name}')`);\n });\n\n console.log('\\n🔧 Example code:');\n console.log('```typescript');\n console.log(\n 'import { loadJsonExample, generateDocumentFromJson } from \"cool-report-generator\";'\n );\n console.log('');\n console.log('const jsonConfig = loadJsonExample(\"comprehensive\");');\n console.log('const document = await generateDocumentFromJson(jsonConfig);');\n console.log('```');\n}\n","/**\n * Universal example runner utility\n * Provides common functionality for running examples\n */\n\nimport { generateDocument, saveDocument } from '../core/generator';\nimport { ReportComponentDefinition } from '../types';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport interface ExampleRunnerOptions {\n outputFilename?: string;\n outputDir?: string;\n verbose?: boolean;\n}\n\n/**\n * Run an example and generate a document\n * @param example - The example definition to run\n * @param options - Options for running the example\n */\nexport async function runExample(\n example: ReportComponentDefinition,\n options: ExampleRunnerOptions = {}\n): Promise<void> {\n const { outputFilename, outputDir, verbose = true } = options;\n\n if (!example.props) {\n throw new Error('Example must have props');\n }\n\n const reportTitle = String(example.props.metadata?.title) || 'Document';\n const baseFilename =\n outputFilename || `${reportTitle.toLowerCase().replace(/\\s+/g, '-')}.docx`;\n\n // Use output directory if provided, otherwise use default output/examples path\n const defaultOutputDir = path.join(process.cwd(), 'output', 'examples');\n const finalOutputDir = outputDir || defaultOutputDir;\n const filename = path.join(finalOutputDir, baseFilename);\n\n if (verbose) {\n console.log(`=== ${reportTitle} Generation ===\\n`);\n console.log(`Generating ${reportTitle} with modular system...`);\n }\n\n try {\n // Ensure output directory exists\n await fs.promises.mkdir(finalOutputDir, { recursive: true });\n\n const document = await generateDocument(example);\n await saveDocument(document, filename);\n\n if (verbose) {\n console.log(`✓ ${reportTitle} saved: ${filename}`);\n console.log(`\\n✅ ${reportTitle} generated successfully!`);\n }\n } catch (error) {\n if (verbose) {\n console.error(`${reportTitle} generation failed:`, error);\n }\n throw error;\n }\n}\n","import { Packer } from 'docx';\nimport type { TSchema } from '@sinclair/typebox';\nimport type { CustomComponent } from './createComponent';\nimport type { ComponentDefinition, ReportComponentDefinition } from '../types';\nimport { type ThemeConfig, getThemeWithFallback } from '../styles';\nimport type { GenerationWarning } from '@json-to-office/shared-docx';\nimport type {\n ExtendedReportComponent,\n DocumentGeneratorBuilder,\n GenerationResult,\n BufferGenerationResult,\n FileGenerationResult,\n ValidationResult,\n} from './types';\nimport {\n validateDocument,\n cleanComponentProps,\n ComponentValidationError,\n DuplicateComponentError,\n} from './validation';\nimport { resolveComponentVersion } from './version-resolver';\nimport { generatePluginDocumentSchema, exportPluginSchema } from './schema';\nimport { processDocument } from '../core/structure';\nimport { applyLayout } from '../core/layout';\nimport { renderDocument } from '../core/render';\nimport { normalizeDocument } from '../json/normalizer';\n\n/**\n * Options for creating a document generator\n */\nexport interface DocumentGeneratorOptions {\n /** Theme configuration */\n theme: ThemeConfig;\n /** Custom themes keyed by name, resolved per-document via document.props.theme */\n customThemes?: Record<string, ThemeConfig>;\n /** Enable caching for better performance */\n enableCache?: boolean;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Internal state held by each builder instance\n */\ninterface BuilderState {\n components: readonly CustomComponent<any, any, any>[];\n componentNames: Set<string>;\n theme: ThemeConfig;\n customThemes?: Record<string, ThemeConfig>;\n debug: boolean;\n enableCache: boolean;\n}\n\n/**\n * Create the builder implementation with the given state\n */\nfunction createBuilderImpl<\n TComponents extends readonly CustomComponent<any, any, any>[],\n>(state: BuilderState): DocumentGeneratorBuilder<TComponents> {\n // Create component map for quick lookup\n const componentMap = new Map(state.components.map((c) => [c.name, c]));\n\n /**\n * Resolve theme for a document: customThemes → built-in → constructor fallback\n */\n function resolveDocumentTheme(themeName: string): ThemeConfig {\n if (state.customThemes) {\n if (state.customThemes[themeName]) {\n return state.customThemes[themeName];\n }\n const key = Object.keys(state.customThemes).find(\n (k) => k.toLowerCase() === themeName.toLowerCase()\n );\n if (key) {\n return state.customThemes[key];\n }\n }\n return getThemeWithFallback(themeName);\n }\n\n /**\n * Process custom components in the document\n */\n async function processDocumentComponents(\n components: ComponentDefinition[],\n warningsCollector: GenerationWarning[],\n resolvedTheme: ThemeConfig,\n depth = 0\n ): Promise<ComponentDefinition[]> {\n if (depth > 20) {\n throw new Error(\n 'Maximum component nesting depth exceeded (20). Check for circular component references.'\n );\n }\n const processedComponents: ComponentDefinition[] = [];\n\n for (const componentData of components) {\n // Safe type narrowing for custom component detection\n const componentName = (componentData as { name?: string })?.name;\n\n if (!componentName) {\n processedComponents.push(componentData);\n continue;\n }\n\n const customComponent = componentMap.get(componentName);\n\n if (customComponent) {\n // This is a custom component - validate and process it\n try {\n const componentWithName = componentData as {\n name: string;\n version?: string;\n props?: unknown;\n children?: unknown;\n };\n\n if (!componentWithName.props) {\n throw new Error(\n `Custom component '${componentName}' must have a 'props' property. Use format: { name: '${componentName}', props: {...} }`\n );\n }\n\n // Resolve the correct version entry\n const versionEntry = resolveComponentVersion(\n customComponent.name,\n customComponent.versions,\n componentWithName.version\n );\n\n // Validate and clean the props against the resolved version's schema\n const cleanedProps = cleanComponentProps(\n versionEntry,\n componentWithName.props\n );\n\n // Process nested children if this is a container\n let nestedChildren: unknown[] | undefined;\n if (\n componentWithName.children &&\n Array.isArray(componentWithName.children)\n ) {\n nestedChildren = await processDocumentComponents(\n componentWithName.children as ComponentDefinition[],\n warningsCollector,\n resolvedTheme,\n depth + 1\n );\n }\n\n // Create addWarning callback for this component\n const versionLabel = componentWithName.version\n ? `${customComponent.name}@${componentWithName.version}`\n : customComponent.name;\n\n const addWarning = (\n message: string,\n context?: Record<string, unknown>\n ) => {\n warningsCollector.push({\n component: versionLabel,\n message,\n severity: 'warning',\n context,\n });\n };\n\n // Call the render function with context object\n const result = await versionEntry.render({\n props: cleanedProps,\n theme: resolvedTheme,\n addWarning,\n children: nestedChildren,\n });\n\n // Ensure result is an array\n const resultComponents = (\n Array.isArray(result) ? result : [result]\n ) as ComponentDefinition[];\n\n // Recursively process the result in case it contains more custom components\n const processedResult = await processDocumentComponents(\n resultComponents,\n warningsCollector,\n resolvedTheme,\n depth + 1\n );\n processedComponents.push(...processedResult);\n\n if (state.debug) {\n console.log(\n `Processed custom component '${versionLabel}':`,\n processedResult\n );\n }\n } catch (error) {\n if (error instanceof ComponentValidationError) {\n throw error;\n }\n throw new Error(\n `Error processing custom component '${customComponent.name}': ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n } else {\n // This is a standard component or nested container - process recursively\n if (\n 'children' in componentData &&\n Array.isArray(componentData.children)\n ) {\n const processedNested = await processDocumentComponents(\n componentData.children,\n warningsCollector,\n resolvedTheme,\n depth + 1\n );\n processedComponents.push({\n ...componentData,\n children: processedNested,\n });\n } else {\n processedComponents.push(componentData);\n }\n }\n }\n\n return processedComponents;\n }\n\n /**\n * Add a custom component to the generator\n */\n function addComponent<TNewComponent extends CustomComponent<any, any, any>>(\n component: TNewComponent\n ): DocumentGeneratorBuilder<readonly [...TComponents, TNewComponent]> {\n if (!component.name) {\n throw new Error('Component name is required');\n }\n\n if (state.componentNames.has(component.name)) {\n throw new DuplicateComponentError(component.name);\n }\n\n // Create NEW immutable state\n const newComponentNames = new Set(state.componentNames);\n newComponentNames.add(component.name);\n\n const newState: BuilderState = {\n components: [...state.components, component],\n componentNames: newComponentNames,\n theme: state.theme,\n customThemes: state.customThemes,\n debug: state.debug,\n enableCache: state.enableCache,\n };\n\n // Return NEW builder with expanded type\n return createBuilderImpl<readonly [...TComponents, TNewComponent]>(\n newState\n );\n }\n\n /**\n * Generate a document\n */\n async function generate(\n document: ExtendedReportComponent<TComponents>\n ): Promise<GenerationResult> {\n try {\n // Cast to ReportComponentDefinition for internal processing\n const internalDocument = document as unknown as ReportComponentDefinition;\n\n // Validate the document first\n validateDocument(\n internalDocument,\n state.components as unknown as CustomComponent<TSchema>[]\n );\n\n // Resolve theme per-document: customThemes → built-in → constructor fallback\n const themeName = internalDocument.props.theme || 'minimal';\n const docTheme = resolveDocumentTheme(themeName);\n\n // Initialize warnings collector\n const warnings: GenerationWarning[] = [];\n\n // Process custom components to convert them to standard components\n const processedComponents = await processDocumentComponents(\n internalDocument.children || [],\n warnings,\n docTheme\n );\n\n // Create a new document definition with processed components\n const processedDocument: ReportComponentDefinition = {\n ...internalDocument,\n children: processedComponents,\n };\n\n // Normalize components (handle shorthand notations and nested structures)\n // We bypass JSON validation since we've already validated with custom schemas\n const [finalReportComponent] = normalizeDocument(processedDocument);\n\n // Use the document generation pipeline directly\n const structure = await processDocument(\n finalReportComponent,\n docTheme,\n themeName\n );\n const layout = applyLayout(structure.sections, docTheme, themeName);\n const generatedDocument = await renderDocument(structure, layout);\n\n return {\n document: generatedDocument,\n warnings: warnings.length > 0 ? warnings : null,\n };\n } catch (error) {\n if (state.debug) {\n console.error('Document generation error:', error);\n }\n throw error;\n }\n }\n\n /**\n * Generate a document and return as buffer\n */\n async function generateBuffer(\n document: ExtendedReportComponent<TComponents>\n ): Promise<BufferGenerationResult> {\n const { document: doc, warnings } = await generate(document);\n const buffer = await Packer.toBuffer(doc);\n return { buffer, warnings };\n }\n\n /**\n * Generate a document and save to file\n */\n async function generateFile(\n document: ExtendedReportComponent<TComponents>,\n outputPath: string\n ): Promise<FileGenerationResult> {\n const { buffer, warnings } = await generateBuffer(document);\n const fs = await import('fs/promises');\n await fs.writeFile(outputPath, new Uint8Array(buffer));\n return { warnings };\n }\n\n /**\n * Get registered component names\n */\n function getComponentNames(): string[] {\n return Array.from(state.componentNames);\n }\n\n /**\n * Validate a document without generating it\n */\n function validate(\n document: ExtendedReportComponent<TComponents>\n ): ValidationResult {\n try {\n // Cast to ReportComponentDefinition for internal validation\n const internalDocument = document as unknown as ReportComponentDefinition;\n validateDocument(\n internalDocument,\n state.components as unknown as CustomComponent<TSchema>[]\n );\n return { valid: true };\n } catch (error) {\n if (error instanceof ComponentValidationError) {\n return {\n valid: false,\n errors: error.errors.map((e) => ({\n path: e.path,\n message: e.message,\n })),\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: 'document',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n }\n\n /**\n * Generate the extended JSON schema for document validation\n */\n function generateSchema(includeStandardComponents = true): TSchema {\n return generatePluginDocumentSchema(\n state.components as unknown as CustomComponent<TSchema>[],\n includeStandardComponents\n );\n }\n\n /**\n * Export the extended JSON schema to a file\n */\n async function exportSchemaToFile(\n outputPath: string,\n options?: {\n includeStandardComponents?: boolean;\n prettyPrint?: boolean;\n }\n ): Promise<void> {\n await exportPluginSchema(\n state.components as unknown as CustomComponent<TSchema>[],\n outputPath,\n options\n );\n }\n\n /**\n * Get the compiled standard components definition\n */\n async function getStandardComponentsDefinition(\n document: ExtendedReportComponent<TComponents>\n ): Promise<ReportComponentDefinition> {\n try {\n // Cast to ReportComponentDefinition for internal processing\n const internalDocument = document as unknown as ReportComponentDefinition;\n\n // Validate the document first\n validateDocument(\n internalDocument,\n state.components as unknown as CustomComponent<TSchema>[]\n );\n\n // Resolve theme for plugin component rendering\n const themeName = internalDocument.props.theme || 'minimal';\n const docTheme = resolveDocumentTheme(themeName);\n\n // Initialize warnings collector (not returned by this function)\n const warnings: GenerationWarning[] = [];\n\n // Process custom components to convert them to standard components\n const processedComponents = await processDocumentComponents(\n internalDocument.children || [],\n warnings,\n docTheme\n );\n\n // Create a new document definition with processed components\n const processedDocument: ReportComponentDefinition = {\n ...internalDocument,\n children: processedComponents,\n };\n\n // Normalize components (handle shorthand notations and nested structures)\n // We bypass JSON validation since we've already validated with custom schemas\n const [finalReportComponent] = normalizeDocument(processedDocument);\n\n // Return the normalized document with all custom components resolved to standard components\n return finalReportComponent;\n } catch (error) {\n if (state.debug) {\n console.error('Error getting standard components definition:', error);\n }\n throw error;\n }\n }\n\n // Return frozen builder object\n return Object.freeze({\n addComponent,\n generate,\n generateBuffer,\n generateFile,\n getComponentNames,\n validate,\n generateSchema,\n exportSchema: exportSchemaToFile,\n getStandardComponentsDefinition,\n });\n}\n\n/**\n * Create a document generator with chainable component registration.\n */\nexport function createDocumentGenerator(\n options: DocumentGeneratorOptions\n): DocumentGeneratorBuilder<readonly []> {\n const initialState: BuilderState = {\n components: [],\n componentNames: new Set(),\n theme: options.theme,\n customThemes: options.customThemes,\n debug: options.debug ?? false,\n enableCache: options.enableCache ?? false,\n };\n\n return createBuilderImpl<readonly []>(initialState);\n}\n","export { resolveComponentVersion } from '@json-to-office/shared/plugin';\n","import type { TSchema, Static } from '@sinclair/typebox';\nimport type { CustomComponent } from './createComponent';\nimport type { ReportComponentDefinition } from '../types';\nimport { resolveComponentVersion } from './version-resolver';\nimport {\n validateCustomComponentProps,\n ComponentValidationError,\n type ComponentValidationResult,\n} from '@json-to-office/shared/plugin';\nimport {\n validateDocument as validateDocumentUnified,\n type ValidationError,\n} from '@json-to-office/shared-docx/validation/unified';\nimport type { ValidationResult } from '@json-to-office/shared';\n\n// Re-export errors from shared\nexport {\n DuplicateComponentError,\n ComponentValidationError,\n} from '@json-to-office/shared/plugin';\n\n/**\n * Validate a component props against a schema.\n * Accepts a narrower interface — only needs { propsSchema }.\n */\nexport function validateComponentProps<TPropsSchema extends TSchema>(\n schema: { propsSchema: TPropsSchema },\n props: unknown,\n componentName?: string\n): ComponentValidationResult<TPropsSchema> {\n return validateCustomComponentProps<TPropsSchema>(schema.propsSchema, props, {\n clean: true,\n applyDefaults: true,\n componentName,\n });\n}\n\n/**\n * Validate document and all custom components (version-aware)\n */\nexport function validateDocument(\n document: ReportComponentDefinition,\n customComponents: CustomComponent<any, any, any>[]\n): ValidationResult & { success: boolean } {\n // First validate the document structure\n const documentResult = validateDocumentUnified(document, {\n clean: true,\n applyDefaults: true,\n });\n\n if (!documentResult.valid) {\n return { ...documentResult, success: false };\n }\n\n // Then validate each custom component if present\n const errors: ValidationError[] = [];\n\n function validateComponents(components: any[], pathPrefix = 'children') {\n components.forEach((componentData, index) => {\n const customComponent = customComponents.find(\n (cc) => cc.name === componentData.name\n );\n if (!customComponent) {\n return;\n }\n\n const versionEntry = resolveComponentVersion(\n customComponent.name,\n customComponent.versions,\n componentData.version\n );\n\n const validation = validateComponentProps(\n versionEntry,\n componentData.props,\n customComponent.name\n );\n\n if (!validation.valid && validation.errors) {\n const indexedErrors = validation.errors.map(\n (error: ValidationError) => ({\n ...error,\n path: `${pathPrefix}[${index}].${error.path}`,\n })\n );\n errors.push(...indexedErrors);\n }\n\n if (componentData.children && Array.isArray(componentData.children)) {\n validateComponents(\n componentData.children,\n `${pathPrefix}[${index}].children`\n );\n }\n });\n }\n\n if (document.children) {\n validateComponents(document.children);\n }\n\n return errors.length > 0\n ? { success: false, errors, valid: false }\n : { success: true, errors: [], valid: true };\n}\n\n/**\n * Validates component props and returns the typed props or throws.\n */\nexport function getValidatedProps<TPropsSchema extends TSchema>(\n schema: { propsSchema: TPropsSchema },\n props: unknown\n): Static<TPropsSchema> {\n const validation = validateComponentProps(schema, props);\n\n if (!validation.valid) {\n throw new ComponentValidationError(validation.errors || [], props);\n }\n\n return validation.data!;\n}\n\n// Re-export types\nexport type { ValidationError } from '@json-to-office/shared-docx/validation/unified';\nexport type { ComponentValidationResult } from '@json-to-office/shared/plugin';\n\nexport const cleanComponentProps = getValidatedProps;\n","import { Type, TSchema, TObject } from '@sinclair/typebox';\nimport { latestVersion } from '@json-to-office/shared-docx';\nimport type { CustomComponent } from './createComponent';\nimport {\n ReportPropsSchema,\n SectionPropsSchema,\n HeadingPropsSchema,\n ParagraphPropsSchema,\n ListPropsSchema,\n ImagePropsSchema,\n TablePropsSchema,\n} from '@json-to-office/shared-docx';\nimport { generateUnifiedDocumentSchema } from '@json-to-office/shared-docx/schemas/generator';\n\n// Schema cache to avoid regenerating identical schemas\nconst schemaCache = new Map<string, TSchema>();\n\n/**\n * Generate a JSON schema for plugin-enhanced documents at RUNTIME.\n *\n * Iterates each component's versions map to produce per-version\n * CustomComponentInfo entries for the unified schema generator.\n */\nexport function generatePluginDocumentSchema(\n customComponents: CustomComponent<any, any, any>[],\n includeStandardComponents = true\n): TSchema {\n // Produce per-version CustomComponentInfo entries for version-discriminated validation\n const customComponentInfos = customComponents.map((component) => {\n const versionKeys = Object.keys(component.versions);\n\n // Build per-version props entries\n const versionedProps = versionKeys.map((v) => ({\n version: v,\n propsSchema: component.versions[v].propsSchema,\n hasChildren: component.versions[v].hasChildren === true,\n description: component.versions[v].description,\n }));\n\n // propsSchema is used as fallback label — use latest version's props\n const latestKey = versionKeys.reduce((a, b) => (a > b ? a : b));\n\n return {\n name: component.name,\n propsSchema: component.versions[latestKey].propsSchema,\n hasChildren: versionKeys.some(\n (v) => component.versions[v].hasChildren === true\n ),\n versionedProps,\n };\n });\n\n return generateUnifiedDocumentSchema({\n includeStandardComponents: includeStandardComponents,\n includeTheme: true,\n customComponents: customComponentInfos,\n title: 'Plugin Document Definition',\n description: 'Document definition with custom plugin components',\n });\n}\n\n/**\n * Create a union type from an array of schemas\n */\nexport function createUnionSchema(schemas: TSchema[]): TSchema {\n if (schemas.length === 0) {\n return Type.Any();\n }\n if (schemas.length === 1) {\n return schemas[0];\n }\n return Type.Union(schemas as [TSchema, TSchema, ...TSchema[]]);\n}\n\n/**\n * Export a plugin-enhanced JSON schema to a file at RUNTIME\n */\nexport async function exportPluginSchema(\n customComponents: CustomComponent<any, any, any>[],\n outputPath: string,\n options: {\n includeStandardComponents?: boolean;\n prettyPrint?: boolean;\n } = {}\n): Promise<void> {\n const { includeStandardComponents = true, prettyPrint = true } = options;\n\n const { convertToJsonSchema, exportSchemaToFile } = await import(\n '@json-to-office/shared-docx/schemas/export'\n );\n\n const schema = generatePluginDocumentSchema(\n customComponents,\n includeStandardComponents\n );\n\n const jsonSchema = convertToJsonSchema(schema, {\n $schema: 'http://json-schema.org/draft-07/schema#',\n });\n\n await exportSchemaToFile(jsonSchema, outputPath, { prettyPrint });\n}\n\n/**\n * Generate schemas for individual custom components (version-aware).\n * Produces per-version schemas keyed as `name` or `name@version`.\n */\nexport function generateComponentSchemas(\n customComponents: CustomComponent<any, any, any>[]\n): Record<string, TSchema> {\n const schemas: Record<string, TSchema> = {};\n\n for (const component of customComponents) {\n const versionKeys = Object.keys(component.versions);\n const latest = latestVersion(versionKeys);\n\n for (const v of versionKeys) {\n const entry = component.versions[v];\n const cacheKey = `component_${component.name}@${v}`;\n\n if (schemaCache.has(cacheKey)) {\n schemas[`${component.name}@${v}`] = schemaCache.get(cacheKey)!;\n } else {\n const schemaObj = entry.propsSchema as TObject;\n const properties = schemaObj.properties || {};\n\n const componentSchemaProps: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n version: Type.Optional(Type.Literal(v)),\n id: Type.Optional(Type.String()),\n ...properties,\n };\n\n if (entry.hasChildren) {\n componentSchemaProps.children = Type.Optional(Type.Array(Type.Any()));\n }\n\n const componentSchema = Type.Object(componentSchemaProps);\n schemaCache.set(cacheKey, componentSchema);\n schemas[`${component.name}@${v}`] = componentSchema;\n }\n }\n\n // Also add a \"default\" entry keyed by name (uses latest)\n const latestEntry = component.versions[latest];\n const defaultCacheKey = `component_${component.name}_default`;\n\n if (schemaCache.has(defaultCacheKey)) {\n schemas[component.name] = schemaCache.get(defaultCacheKey)!;\n } else {\n const schemaObj = latestEntry.propsSchema as TObject;\n const properties = schemaObj.properties || {};\n\n const componentSchemaProps: Record<string, TSchema> = {\n name: Type.Literal(component.name),\n id: Type.Optional(Type.String()),\n ...properties,\n };\n\n if (latestEntry.hasChildren) {\n componentSchemaProps.children = Type.Optional(Type.Array(Type.Any()));\n }\n\n const componentSchema = Type.Object(componentSchemaProps);\n schemaCache.set(defaultCacheKey, componentSchema);\n schemas[component.name] = componentSchema;\n }\n }\n\n return schemas;\n}\n\n/**\n * Merge custom component schemas with standard schemas\n */\nexport function mergeSchemas(\n customComponents: CustomComponent<any, any, any>[],\n standardSchemas?: Record<string, TSchema>\n): Record<string, TSchema> {\n const customSchemas = generateComponentSchemas(customComponents);\n\n if (standardSchemas) {\n return {\n ...standardSchemas,\n ...customSchemas,\n };\n }\n\n const defaultStandardSchemas: Record<string, TSchema> = {\n docx: Type.Object({\n name: Type.Literal('docx'),\n id: Type.Optional(Type.String()),\n props: ReportPropsSchema,\n children: Type.Optional(Type.Array(Type.Any())),\n }),\n section: Type.Object({\n name: Type.Literal('section'),\n id: Type.Optional(Type.String()),\n props: SectionPropsSchema,\n children: Type.Optional(Type.Array(Type.Any())),\n }),\n heading: Type.Object({\n name: Type.Literal('heading'),\n id: Type.Optional(Type.String()),\n props: HeadingPropsSchema,\n }),\n text: Type.Object({\n name: Type.Literal('text'),\n id: Type.Optional(Type.String()),\n props: ParagraphPropsSchema,\n }),\n list: Type.Object({\n name: Type.Literal('list'),\n id: Type.Optional(Type.String()),\n props: ListPropsSchema,\n }),\n image: Type.Object({\n name: Type.Literal('image'),\n id: Type.Optional(Type.String()),\n props: ImagePropsSchema,\n }),\n table: Type.Object({\n name: Type.Literal('table'),\n id: Type.Optional(Type.String()),\n props: TablePropsSchema,\n }),\n };\n\n return {\n ...defaultStandardSchemas,\n ...customSchemas,\n };\n}\n"],"mappings":"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","names":["themes","path","fs","path","path","AlignmentType","format","getAlignment","Paragraph","TextRun","ImageRun","AlignmentType","BookmarkStart","BookmarkEnd","TextRun","ExternalHyperlink","InternalHyperlink","TextRun","createTextRunsWithNewlines","InternalHyperlink","ExternalHyperlink","createHash","TextRun","AlignmentType","BorderStyle","PageNumber","TextRun","path","getAvailableWidthTwips","getPageWidthTwips","getAvailableHeightTwips","getPageHeightTwips","mapFloatingOptions","detectImageType","AlignmentType","BorderStyle","TextRun","relativeLengthToTwips","text","format","Table","TableRow","TableCell","WidthType","TableLayoutType","BorderStyle","convertBorders","Paragraph","Paragraph","convertBorders","cellChildren","childContext","styleCfg","cellOpts","row","TableRow","TableCell","table","Table","TableLayoutType","WidthType","config","Paragraph","Paragraph","Paragraph","Table","TableRow","TableCell","WidthType","BorderStyle","VerticalAlign","TableLayoutType","Paragraph","TableCell","WidthType","VerticalAlign","BorderStyle","TableRow","Table","TableLayoutType","Paragraph","TextRun","AlignmentType","getAlignment","Paragraph","TextRun","getAlignment","Paragraph","TextRun","Paragraph","TextRun","getAlignment","Paragraph","AlignmentType","TextRun","getAlignment","AlignmentType","globalNumberingRegistry","Paragraph","TextRun","ImageRun","BookmarkStart","BookmarkEnd","fs","fs","fixFloatingImageIds","fs","path","fileURLToPath","path","fs","Packer","ComponentValidationError","Type","Type","ComponentValidationError","Packer","fs"]}