152 lines
4.2 KiB
JavaScript
152 lines
4.2 KiB
JavaScript
const colors = require('./app/theme/colors');
|
|
const defaultColors = require('tailwindcss/colors');
|
|
const plugin = require('tailwindcss/plugin');
|
|
|
|
const deprecatedDefaults = [
|
|
'lightBlue',
|
|
'warmGray',
|
|
'trueGray',
|
|
'coolGray',
|
|
'blueGray',
|
|
];
|
|
deprecatedDefaults.forEach((color) => {
|
|
delete defaultColors[color];
|
|
});
|
|
|
|
const cssVar = (name) => `var(--${name})`;
|
|
|
|
function createColorVariables(colors, darkColors) {
|
|
const result = {};
|
|
|
|
// Process all colors
|
|
Object.entries(colors).forEach(([key, value]) => {
|
|
// Skip nested objects for now (we'll handle them separately)
|
|
if (typeof value !== 'object' || value === null) {
|
|
result[key] = cssVar(`color-${key}`);
|
|
}
|
|
});
|
|
|
|
// Handle nested color objects
|
|
Object.entries(colors).forEach(([key, value]) => {
|
|
if (typeof value === 'object' && value !== null && key !== 'dark') {
|
|
result[key] = {};
|
|
Object.entries(value).forEach(([nestedKey, nestedValue]) => {
|
|
result[key][nestedKey] = cssVar(`color-${key}-${nestedKey}`);
|
|
});
|
|
}
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
const variableBasedColors = createColorVariables(colors);
|
|
|
|
module.exports = {
|
|
mode: 'jit',
|
|
darkMode: 'class',
|
|
content: ['./app/**/*.tsx', './app/**/*.js'],
|
|
theme: {
|
|
// Use variable references instead of hard-coded colors
|
|
colors: {
|
|
...defaultColors,
|
|
...variableBasedColors,
|
|
},
|
|
extend: {
|
|
keyframes: {
|
|
'fade-in': {
|
|
'0%': {
|
|
opacity: '0',
|
|
},
|
|
'100%': {
|
|
opacity: '1',
|
|
},
|
|
},
|
|
'bg-spin': {
|
|
'0%': {
|
|
backgroundPosition: '0 50%',
|
|
},
|
|
'50%': {
|
|
backgroundPosition: '100% 50%',
|
|
},
|
|
'100%': {
|
|
backgroundPosition: '0 50%',
|
|
},
|
|
},
|
|
},
|
|
animation: {
|
|
'fade-in': 'fade-in 0.2s ease-out',
|
|
'bg-spin': 'bg-spin 1s ease infinite',
|
|
},
|
|
colors: {
|
|
'disabled-text': cssVar('color-disabled-text'),
|
|
},
|
|
boxShadow: {
|
|
'border-blue': `0 0 0 1px ${cssVar('color-active-blue-border')}`,
|
|
'border-main': `0 0 0 1px ${cssVar('color-main')}`,
|
|
'border-gray': `0 0 0 1px ${cssVar('color-gray-border')}`,
|
|
},
|
|
button: {
|
|
'background-color': 'red',
|
|
},
|
|
},
|
|
},
|
|
variants: {
|
|
visibility: ['responsive', 'hover', 'focus', 'group-hover'],
|
|
},
|
|
plugins: [
|
|
plugin(function ({ addBase }) {
|
|
const lightModeVars = {};
|
|
|
|
Object.entries(colors).forEach(([key, value]) => {
|
|
if (typeof value !== 'object' || value === null || key === 'dark') {
|
|
lightModeVars[`--color-${key}`] = value;
|
|
}
|
|
});
|
|
Object.entries(colors).forEach(([key, value]) => {
|
|
if (typeof value === 'object' && value !== null && key !== 'dark') {
|
|
Object.entries(value).forEach(([nestedKey, nestedValue]) => {
|
|
lightModeVars[`--color-${key}-${nestedKey}`] = nestedValue;
|
|
});
|
|
}
|
|
});
|
|
|
|
const darkModeVars = {};
|
|
|
|
if (colors.dark) {
|
|
// Process flat dark colors
|
|
Object.entries(colors.dark).forEach(([key, value]) => {
|
|
if (typeof value !== 'object') {
|
|
// Find the corresponding light mode key
|
|
const lightKey = key.replace('dark-', '');
|
|
darkModeVars[`--color-${lightKey}`] = value;
|
|
}
|
|
});
|
|
|
|
Object.entries(colors.dark).forEach(([key, value]) => {
|
|
if (typeof value === 'object' && value !== null) {
|
|
Object.entries(value).forEach(([nestedKey, nestedValue]) => {
|
|
darkModeVars[`--color-${key}-${nestedKey}`] = nestedValue;
|
|
});
|
|
}
|
|
});
|
|
|
|
if (colors['gray-light'] && colors.dark['gray-light']) {
|
|
darkModeVars['--color-gray-light'] = colors.dark['gray-light'];
|
|
}
|
|
if (colors['gray-dark'] && colors.dark['gray-dark']) {
|
|
darkModeVars['--color-gray-dark'] = colors.dark['gray-dark'];
|
|
}
|
|
darkModeVars['--color-disabled-text'] =
|
|
colors.dark['text-disabled'] || 'rgba(255, 255, 255, 0.38)';
|
|
}
|
|
|
|
addBase({
|
|
':root': lightModeVars,
|
|
'.dark': darkModeVars,
|
|
});
|
|
}),
|
|
],
|
|
corePlugins: {
|
|
preflight: false,
|
|
},
|
|
};
|