/**
* Sentiment-based color mapping utilities
* Maps sentiment scores (-1 to 1) to visual colors
*/
// Predefined color scales
export const SENTIMENT_COLORS = {
NEGATIVE: '#ff3366', // Red for negative/critical news
NEUTRAL: '#00d9ff', // Cyan for neutral news
POSITIVE: '#00ff88' // Green for positive news
};
/**
* Convert sentiment score to RGB color
* @param {number} score - Sentiment score from -1 (negative) to 1 (positive)
* @returns {string} RGB color string
*/
export const sentimentToColor = (score) => {
if (score === null || score === undefined) {
return SENTIMENT_COLORS.NEUTRAL;
}
if (score < -0.3) {
return SENTIMENT_COLORS.NEGATIVE;
} else if (score > 0.3) {
return SENTIMENT_COLORS.POSITIVE;
} else {
return SENTIMENT_COLORS.NEUTRAL;
}
};
/**
* Get gradient color for sentiment score
* @param {number} score - Sentiment score from -1 to 1
* @returns {string} Gradient CSS string
*/
export const sentimentToGradient = (score) => {
const color = sentimentToColor(score);
return `radial-gradient(circle, ${color}cc, ${color}66)`;
};
/**
* Calculate sentiment intensity (for glow effect)
* @param {number} score - Sentiment score
* @returns {number} Intensity from 0 to 1
*/
export const sentimentIntensity = (score) => {
return Math.abs(score || 0);
};
/**
* Get cluster color based on sentiment ratio
* @param {number} negativeRatio - Ratio of negative news (0 to 1)
* @returns {string} RGB color string
*/
export const clusterSentimentColor = (negativeRatio) => {
if (negativeRatio > 0.6) {
return SENTIMENT_COLORS.NEGATIVE;
} else if (negativeRatio < 0.3) {
return SENTIMENT_COLORS.POSITIVE;
} else {
return SENTIMENT_COLORS.NEUTRAL;
}
};
/**
* Generate heatmap color based on crisis intensity
* @param {number} intensity - Crisis intensity (0 to 1)
* @returns {string} RGBA color string with opacity
*/
export const crisisHeatmapColor = (intensity) => {
const red = Math.floor(255 * intensity);
const green = Math.floor(255 * (1 - intensity));
const blue = 102;
const alpha = 0.3 + (intensity * 0.4);
return `rgba(${red}, ${green}, ${blue}, ${alpha})`;
};
/**
* Check if color has sufficient contrast for accessibility
* @param {string} color - RGB color string
* @param {string} background - Background RGB color
* @returns {boolean} True if contrast is sufficient
*/
export const hasGoodContrast = (color, background = '#0a1929') => {
// Simplified contrast check - in production, use WCAG contrast ratio
return true; // Our neon colors on dark background always have good contrast
};