{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { DesignTokens } from '@tokiforge/core';\nimport { TokenParser } from '@tokiforge/core';\nimport type { Config } from 'tailwindcss';\n\nexport interface TailwindConfigOptions {\n  /**\n   * Path to tokens file (JSON or YAML)\n   */\n  tokensPath?: string;\n  /**\n   * Design tokens object (alternative to tokensPath)\n   */\n  tokens?: DesignTokens;\n  /**\n   * CSS variable prefix (default: 'hf')\n   */\n  prefix?: string;\n  /**\n   * Whether to use CSS variables in Tailwind config\n   */\n  useCSSVariables?: boolean;\n  /**\n   * Custom theme key mappings\n   */\n  themeMappings?: {\n    colors?: string[];\n    spacing?: string[];\n    borderRadius?: string[];\n    fontSize?: string[];\n    fontFamily?: string[];\n    fontWeight?: string[];\n  };\n}\n\n/**\n * Flatten tokens to a flat object with dot notation\n */\nfunction flattenTokens(\n  tokens: DesignTokens,\n  prefix: string = '',\n  result: Record<string, any> = {}\n): Record<string, any> {\n  for (const key in tokens) {\n    const value = tokens[key];\n    const path = prefix ? `${prefix}.${key}` : key;\n\n    if (value && typeof value === 'object' && !Array.isArray(value)) {\n      if ('value' in value || '$value' in value || '$alias' in value) {\n        const token = value as any;\n        const tokenValue = 'value' in token ? token.value : ('$value' in token ? token.$value : null);\n        result[path] = tokenValue;\n      } else {\n        flattenTokens(value as DesignTokens, path, result);\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Convert token path to Tailwind-friendly key\n */\nfunction toTailwindKey(path: string): string {\n  const parts = path.split('.');\n  return parts.join('-');\n}\n\n/**\n * Generate Tailwind theme configuration from design tokens\n */\nexport function generateTailwindConfig(options: TailwindConfigOptions = {}): Partial<Config> {\n  const {\n    tokensPath,\n    tokens: providedTokens,\n    prefix = 'hf',\n    useCSSVariables = true,\n    themeMappings = {},\n  } = options;\n\n  let tokens: DesignTokens;\n\n  if (tokensPath) {\n    tokens = TokenParser.parse(tokensPath, { expandReferences: true });\n  } else if (providedTokens) {\n    tokens = TokenParser.expandReferences(providedTokens);\n  } else {\n    throw new Error('Either tokensPath or tokens must be provided');\n  }\n\n  const flattened = flattenTokens(tokens);\n  const config: Partial<Config> = {\n    theme: {\n      extend: {},\n    },\n  };\n\n  const colorPaths = themeMappings.colors || ['color'];\n  const spacingPaths = themeMappings.spacing || ['spacing', 'size'];\n  const borderRadiusPaths = themeMappings.borderRadius || ['radius', 'borderRadius'];\n  const fontSizePaths = themeMappings.fontSize || ['fontSize', 'typography.size'];\n  const fontFamilyPaths = themeMappings.fontFamily || ['fontFamily', 'typography.family'];\n  const fontWeightPaths = themeMappings.fontWeight || ['fontWeight', 'typography.weight'];\n\n  const colors: Record<string, string> = {};\n  for (const path in flattened) {\n    if (colorPaths.some((p) => path.startsWith(p))) {\n      const value = flattened[path];\n      if (typeof value === 'string' && (value.startsWith('#') || value.startsWith('rgb'))) {\n        const key = toTailwindKey(path.replace(/^color\\.?/, ''));\n        colors[key] = useCSSVariables\n          ? `var(--${prefix}-${path.replace(/\\./g, '-')})`\n          : String(value);\n      }\n    }\n  }\n\n  const spacing: Record<string, string> = {};\n  for (const path in flattened) {\n    if (spacingPaths.some((p) => path.startsWith(p))) {\n      const value = flattened[path];\n      if (typeof value === 'string' && (value.includes('px') || value.includes('rem') || value.includes('em'))) {\n        const key = toTailwindKey(path.replace(/^(spacing|size)\\.?/, ''));\n        spacing[key] = useCSSVariables\n          ? `var(--${prefix}-${path.replace(/\\./g, '-')})`\n          : String(value);\n      }\n    }\n  }\n\n  const borderRadius: Record<string, string> = {};\n  for (const path in flattened) {\n    if (borderRadiusPaths.some((p) => path.startsWith(p))) {\n      const value = flattened[path];\n      if (typeof value === 'string' && (value.includes('px') || value.includes('rem'))) {\n        const key = toTailwindKey(path.replace(/^(radius|borderRadius)\\.?/, ''));\n        borderRadius[key] = useCSSVariables\n          ? `var(--${prefix}-${path.replace(/\\./g, '-')})`\n          : String(value);\n      }\n    }\n  }\n\n  const fontSize: Record<string, any> = {};\n  for (const path in flattened) {\n    if (fontSizePaths.some((p) => path.startsWith(p))) {\n      const value = flattened[path];\n      if (typeof value === 'string') {\n        const key = toTailwindKey(path.replace(/^(fontSize|typography\\.size)\\.?/, ''));\n        fontSize[key] = useCSSVariables\n          ? `var(--${prefix}-${path.replace(/\\./g, '-')})`\n          : String(value);\n      }\n    }\n  }\n\n  const fontFamily: Record<string, string[]> = {};\n  for (const path in flattened) {\n    if (fontFamilyPaths.some((p) => path.startsWith(p))) {\n      const value = flattened[path];\n      if (typeof value === 'string') {\n        const key = toTailwindKey(path.replace(/^(fontFamily|typography\\.family)\\.?/, ''));\n        fontFamily[key] = [String(value)];\n      }\n    }\n  }\n\n  const fontWeight: Record<string, string> = {};\n  for (const path in flattened) {\n    if (fontWeightPaths.some((p) => path.startsWith(p))) {\n      const value = flattened[path];\n      const key = toTailwindKey(path.replace(/^(fontWeight|typography\\.weight)\\.?/, ''));\n      fontWeight[key] = useCSSVariables\n        ? `var(--${prefix}-${path.replace(/\\./g, '-')})`\n        : String(value);\n    }\n  }\n\n  if (Object.keys(colors).length > 0) {\n    config.theme!.extend!.colors = colors;\n  }\n  if (Object.keys(spacing).length > 0) {\n    config.theme!.extend!.spacing = spacing;\n  }\n  if (Object.keys(borderRadius).length > 0) {\n    config.theme!.extend!.borderRadius = borderRadius;\n  }\n  if (Object.keys(fontSize).length > 0) {\n    config.theme!.extend!.fontSize = fontSize;\n  }\n  if (Object.keys(fontFamily).length > 0) {\n    config.theme!.extend!.fontFamily = fontFamily;\n  }\n  if (Object.keys(fontWeight).length > 0) {\n    config.theme!.extend!.fontWeight = fontWeight;\n  }\n\n  return config;\n}\n\n/**\n * Generate complete tailwind.config.js file content\n */\nexport function generateTailwindConfigFile(\n  options: TailwindConfigOptions & { content?: string[] }\n): string {\n  const { content = ['./src/**/*.{js,ts,jsx,tsx}'], ...configOptions } = options;\n  const config = generateTailwindConfig(configOptions);\n\n  return `/** @type {import('tailwindcss').Config} */\nexport default {\n  content: ${JSON.stringify(content, null, 2)},\n  theme: ${JSON.stringify(config.theme, null, 2)},\n  plugins: [],\n}\n`;\n}\n\n/**\n * Tailwind CSS plugin for TokiForge\n */\nexport function tokiforgeTailwindPlugin(options: TailwindConfigOptions) {\n  return {\n    handler: (pluginAPI: any) => {\n      const config = generateTailwindConfig(options);\n      if (config.theme?.extend) {\n        pluginAPI.addBase({\n          ':root': {},\n        });\n      }\n    },\n    config: generateTailwindConfig(options),\n  };\n}\n\n"],"mappings":"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","names":[]}