anti-ui
Version:
Una librería para hacer que tus proyectos de Tailwind se vean horribles automáticamente
96 lines (81 loc) • 2.7 kB
text/typescript
import { IntensityLevel, ThemeRules } from '../types';
import { themes } from '../themes';
// Factor de aplicación según la intensidad
const INTENSITY_FACTORS: Record<IntensityLevel, number> = {
'subtle': 0.25,
'moderate': 0.5,
'maximum': 0.75,
'forbidden': 1.0
};
/**
* Transforma las clases de Tailwind según el tema y la intensidad seleccionados
*/
export const transformClasses = (
originalClasses: string,
themeName: string,
intensity: IntensityLevel
): string => {
// Si no es un tema válido, devolver las clases originales
if (!themes[themeName as keyof typeof themes]) {
return originalClasses;
}
const theme = themes[themeName as keyof typeof themes];
const intensityFactor = INTENSITY_FACTORS[intensity];
// Separar las clases en un array
const classArray = originalClasses.split(' ');
let transformedClasses: string[] = [];
// Por cada clase, determinar si se aplica la transformación según la intensidad
classArray.forEach(originalClass => {
// Probabilidad de que se aplique la transformación basada en la intensidad
const applyTransform = Math.random() < intensityFactor;
if (applyTransform) {
// Aplicar transformaciones en orden
let transformedClass = applyThemeRules(originalClass, theme);
transformedClasses.push(transformedClass);
} else {
// Mantener la clase original
transformedClasses.push(originalClass);
}
});
// Eliminar duplicados y clases vacías
transformedClasses = transformedClasses.filter(Boolean);
transformedClasses = [...new Set(transformedClasses)];
return transformedClasses.join(' ');
};
/**
* Aplica las reglas de tema a una clase específica
*/
function applyThemeRules(originalClass: string, theme: ThemeRules): string {
// Intentar cada tipo de transformación en orden
let result = originalClass;
// Aplicar transformaciones en orden de prioridad
const transformations = [
theme.fontFamily,
theme.colors,
theme.spacing,
theme.alignment,
theme.borders,
theme.shadows,
theme.animations,
theme.misc
];
for (const transformation of transformations) {
const transformed = transformation(result);
// Si la transformación cambió algo, usar el resultado
if (transformed !== result) {
return transformed;
}
}
return result;
}
/**
* Parsea un string de clases de Tailwind y las transforma
*/
export const processClassString = (
classString?: string | null,
themeName: string = 'nightmare90s',
intensity: IntensityLevel = 'moderate'
): string => {
if (!classString) return '';
return transformClasses(classString, themeName, intensity);
};