{"version":3,"file":"saas-effects.umd.cjs","sources":["../src/presets.ts","../src/utils.ts","../src/GradientComponents.tsx"],"sourcesContent":["/**\n * Preset color combinations for gradient components\n */\n\nimport { ColorPreset } from './types';\n\nexport const presets: Record<string, ColorPreset> = {\n  skyPink: {\n    colorStart: '#7dd3fc',\n    colorEnd: '#f472b6',\n  },\n  purpleOrange: {\n    colorStart: '#a78bfa',\n    colorEnd: '#fb923c',\n  },\n  greenBlue: {\n    colorStart: '#10b981',\n    colorEnd: '#3b82f6',\n  },\n  techBlue: {\n    colorStart: '#06b6d4',\n    colorEnd: '#3b82f6',\n  },\n  coolTeal: {\n    colorStart: '#10b981',\n    colorEnd: '#06b6d4',\n  },\n  warmSunset: {\n    colorStart: '#fb923c',\n    colorEnd: '#ef4444',\n  },\n};\n\nexport const getPreset = (presetName: string): ColorPreset | null => {\n  return presets[presetName] || null;\n};\n\n","/**\n * Utility functions for validation and color parsing\n */\n\nimport { BlurLevel, FadeDirection, Corner, Size } from './types';\n\n// Development mode detection - warnings only shown during development\nconst isDevelopment = import.meta.env?.MODE !== 'production';\n\n/**\n * Validates hex color format\n */\nexport const isValidHexColor = (color: string): boolean => {\n  return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(color);\n};\n\n/**\n * Validates RGB/RGBA color format\n */\nexport const isValidRgbColor = (color: string): boolean => {\n  // Check for rgb(r, g, b)\n  const rgbMatch = color.match(/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n  if (rgbMatch) {\n    const r = parseInt(rgbMatch[1]);\n    const g = parseInt(rgbMatch[2]);\n    const b = parseInt(rgbMatch[3]);\n    return r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255;\n  }\n  \n  // Check for rgba(r, g, b, a)\n  const rgbaMatch = color.match(/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d.]+)\\s*\\)$/);\n  if (rgbaMatch) {\n    const r = parseInt(rgbaMatch[1]);\n    const g = parseInt(rgbaMatch[2]);\n    const b = parseInt(rgbaMatch[3]);\n    const a = parseFloat(rgbaMatch[4]);\n    return r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255 && a >= 0 && a <= 1;\n  }\n  \n  return false;\n};\n\n/**\n * Validates HSL/HSLA color format\n */\nexport const isValidHslColor = (color: string): boolean => {\n  return /^hsla?\\(\\s*\\d+\\s*,\\s*\\d+%\\s*,\\s*\\d+%\\s*(,\\s*[\\d.]+\\s*)?\\)$/.test(color);\n};\n\n/**\n * Validates any supported color format\n */\nexport const isValidColor = (color: string): boolean => {\n  return isValidHexColor(color) || isValidRgbColor(color) || isValidHslColor(color);\n};\n\n/**\n * Converts RGB/RGBA to hex format for CSS variables\n */\nexport const normalizeColor = (color: string): string => {\n  // For now, return as-is since CSS variables support all formats\n  // Could add conversion logic here if needed\n  return color;\n};\n\n/**\n * Validates blur level\n */\nexport const isValidBlur = (blur: string): blur is BlurLevel => {\n  return ['soft', 'normal', 'heavy'].includes(blur);\n};\n\n/**\n * Validates fade direction\n */\nexport const isValidFadeDirection = (direction: string): direction is FadeDirection => {\n  return ['bottom', 'top', 'left', 'right', 'none'].includes(direction);\n};\n\n/**\n * Validates corner position\n */\nexport const isValidCorner = (corner: string): corner is Corner => {\n  return ['tl', 'tr', 'bl', 'br'].includes(corner);\n};\n\n/**\n * Validates size\n */\nexport const isValidSize = (size: string): size is Size => {\n  return ['sm', 'md', 'lg'].includes(size);\n};\n\n/**\n * Validates angle (0-360 degrees)\n */\nexport const isValidAngle = (angle: number): boolean => {\n  return typeof angle === 'number' && angle >= 0 && angle <= 360;\n};\n\n/**\n * Logs a development warning to console\n */\nexport const warn = (message: string, suggestion?: string): void => {\n  if (isDevelopment) {\n    console.warn(`[Gradient Components] ${message}`);\n    if (suggestion) {\n      console.warn(`  Suggestion: ${suggestion}`);\n    }\n  }\n};\n\n/**\n * Validates and warns about invalid color\n */\nexport const validateColor = (color: string | undefined, propName: string, defaultColor: string): string => {\n  if (!color) {\n    return defaultColor;\n  }\n\n  if (!isValidColor(color)) {\n    warn(\n      `Invalid color format for ${propName}: \"${color}\"`,\n      `Use hex (#7dd3fc), rgb(125, 211, 252), rgba(125, 211, 252, 0.8), or hsl(199, 95%, 74%) format`\n    );\n    return defaultColor;\n  }\n\n  return normalizeColor(color);\n};\n\n/**\n * Generates gradient string from color array\n */\nexport const generateMultiColorGradient = (colors: string[], angle: number): string => {\n  if (colors.length < 2) {\n    warn('colors array must contain at least 2 colors', 'Provide at least 2 colors in the array');\n    return '';\n  }\n\n  const validColors = colors.filter(color => {\n    const isValid = isValidColor(color);\n    if (!isValid) {\n      warn(`Invalid color in colors array: \"${color}\"`, 'Remove or fix invalid colors');\n    }\n    return isValid;\n  });\n\n  if (validColors.length < 2) {\n    return '';\n  }\n\n  const step = 100 / (validColors.length - 1);\n  const colorStops = validColors.map((color, index) => {\n    const position = Math.round(index * step);\n    return `${color} ${position}%`;\n  }).join(', ');\n\n  return `linear-gradient(${angle}deg, ${colorStops})`;\n};\n\n","import React from 'react';\nimport './GradientComponents.css';\nimport { BackgroundGradientProps, CardWithCornerAccentProps } from './types';\nimport { getPreset } from './presets';\nimport { validateColor, isValidBlur, isValidFadeDirection, isValidCorner, isValidSize, isValidAngle, warn, generateMultiColorGradient } from './utils';\n\n/**\n * BackgroundGradient\n * \n * Full-page gradient background that fades to white (or dark) in a specified direction\n * Supports single gradients, multi-color gradients, custom angles, and presets\n */\nexport const BackgroundGradient: React.FC<BackgroundGradientProps> = ({\n  colorStart,\n  colorEnd,\n  colors,\n  blur = 'normal',\n  fadeDirection = 'bottom',\n  angle = 135,\n  darkMode = false,\n  preset,\n  className = '',\n  children,\n  style = {},\n}) => {\n  // Handle preset colors\n  let finalColorStart = colorStart;\n  let finalColorEnd = colorEnd;\n  \n  if (preset) {\n    const presetColors = getPreset(preset);\n    if (presetColors) {\n      finalColorStart = finalColorStart || presetColors.colorStart;\n      finalColorEnd = finalColorEnd || presetColors.colorEnd;\n    } else {\n      warn(`Unknown preset: \"${preset}\"`, 'Use one of: skyPink, purpleOrange, greenBlue, techBlue, coolTeal, warmSunset');\n    }\n  }\n\n  // Validate and set defaults\n  const validatedColorStart = validateColor(finalColorStart, 'colorStart', '#3b82f6');\n  const validatedColorEnd = validateColor(finalColorEnd, 'colorEnd', '#ec4899');\n  \n  // Validate blur\n  if (!isValidBlur(blur)) {\n    warn(`Invalid blur value: \"${blur}\"`, 'Use \"soft\", \"normal\", or \"heavy\"');\n  }\n\n  // Validate fadeDirection\n  if (!isValidFadeDirection(fadeDirection)) {\n    warn(`Invalid fadeDirection: \"${fadeDirection}\"`, 'Use \"bottom\", \"top\", \"left\", \"right\", or \"none\"');\n  }\n\n  // Validate angle\n  if (!isValidAngle(angle)) {\n    warn(`Invalid angle: ${angle}`, 'Use a number between 0 and 360');\n  }\n\n  // Generate gradient background\n  let gradientBackground: string;\n  if (colors && colors.length >= 2) {\n    gradientBackground = generateMultiColorGradient(colors, angle);\n  } else {\n    gradientBackground = `linear-gradient(${angle}deg, ${validatedColorStart} 0%, ${validatedColorEnd} 100%)`;\n  }\n\n  const combinedStyle: React.CSSProperties = {\n    ...style,\n    '--gradient-start': validatedColorStart,\n    '--gradient-end': validatedColorEnd,\n  } as React.CSSProperties;\n\n  // Add gradient background override if multi-color or custom angle\n  if (colors && colors.length >= 2) {\n    (combinedStyle as any)['--gradient-bg'] = gradientBackground;\n  } else if (angle !== 135) {\n    (combinedStyle as any)['--gradient-angle'] = `${angle}deg`;\n  }\n\n  const classes = [\n    'gradient-background',\n    `blur-${blur}`,\n    `fade-${fadeDirection}`,\n    darkMode ? 'dark-mode' : '',\n    className,\n  ].filter(Boolean).join(' ');\n\n  return (\n    <div className={classes} style={combinedStyle}>\n      {children}\n    </div>\n  );\n};\n\n/**\n * CardWithCornerAccent\n * \n * Card with a soft, cloud-like gradient glow behind a specified corner\n * Supports presets and custom colors\n */\nexport const CardWithCornerAccent: React.FC<CardWithCornerAccentProps> = ({\n  corner = 'tl',\n  colorStart,\n  colorEnd,\n  size = 'md',\n  preset,\n  className = '',\n  children,\n  style = {},\n}) => {\n  // Handle preset colors\n  let finalColorStart = colorStart;\n  let finalColorEnd = colorEnd;\n  \n  if (preset) {\n    const presetColors = getPreset(preset);\n    if (presetColors) {\n      finalColorStart = finalColorStart || presetColors.colorStart;\n      finalColorEnd = finalColorEnd || presetColors.colorEnd;\n    } else {\n      warn(`Unknown preset: \"${preset}\"`, 'Use one of: skyPink, purpleOrange, greenBlue, techBlue, coolTeal, warmSunset');\n    }\n  }\n\n  // Validate and set defaults\n  const validatedColorStart = validateColor(finalColorStart, 'colorStart', '#3b82f6');\n  const validatedColorEnd = validateColor(finalColorEnd, 'colorEnd', '#ec4899');\n\n  // Validate corner\n  if (!isValidCorner(corner)) {\n    warn(`Invalid corner value: \"${corner}\"`, 'Use \"tl\", \"tr\", \"bl\", or \"br\"');\n  }\n\n  // Validate size\n  if (!isValidSize(size)) {\n    warn(`Invalid size value: \"${size}\"`, 'Use \"sm\", \"md\", or \"lg\"');\n  }\n\n  const combinedStyle: React.CSSProperties = {\n    ...style,\n    '--gradient-start': validatedColorStart,\n    '--gradient-end': validatedColorEnd,\n  } as React.CSSProperties;\n\n  return (\n    <div \n      className={`card-corner-wrapper corner-${size} ${className}`}\n      style={combinedStyle}\n    >\n      <div className={`gradient-corner-bg gradient-corner-bg-${corner}`} />\n      <div className=\"card-with-accent\">\n        <div className=\"card-content\">\n          {children}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default {\n  BackgroundGradient,\n  CardWithCornerAccent,\n};\n\n"],"names":["presets","getPreset","presetName","isValidHexColor","color","isValidRgbColor","rgbMatch","r","g","b","rgbaMatch","a","isValidHslColor","isValidColor","normalizeColor","isValidBlur","blur","isValidFadeDirection","direction","isValidCorner","corner","isValidSize","size","isValidAngle","angle","validateColor","propName","defaultColor","generateMultiColorGradient","colors","validColors","step","colorStops","index","position","BackgroundGradient","colorStart","colorEnd","fadeDirection","darkMode","preset","className","children","style","finalColorStart","finalColorEnd","presetColors","validatedColorStart","validatedColorEnd","gradientBackground","combinedStyle","classes","CardWithCornerAccent","jsxs","jsx","GradientComponents"],"mappings":"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"}