Files
wanderer/assets/tailwind.config.js
Dmitry Popov 4136aaad76 Initial commit
2024-09-18 01:55:30 +04:00

128 lines
4.1 KiB
JavaScript

// See the Tailwind configuration guide for advanced usage
// https://tailwindcss.com/docs/configuration
const plugin = require('tailwindcss/plugin');
const colors = require('tailwindcss/colors');
const fs = require('fs');
const path = require('path');
module.exports = {
content: [
'./js/**/*.js',
'./js/**/*.ts',
'./js/**/*.tsx',
'../lib/wanderer_app_web.ex',
'../lib/wanderer_app_web/**/*.*ex',
'../deps/live_select/lib/live_select/component.*ex',
],
theme: {
extend: {
animation: {
text: 'text 30s ease infinite',
'horizontal-bounce': 'horizontal-bounce 1.5s ease-in-out infinite',
gradient: 'gradient 8s linear infinite',
rotate: 'rotate 10s linear infinite',
},
colors: {
brand: '#FD4F00',
primary: colors.rose,
neutral: colors.slate,
info: colors.blue,
success: colors.green,
danger: colors.red,
},
transitionProperty: ['visibility'],
transitionDuration: {
2000: '2000ms',
},
transitionDelay: {
2000: '2000ms',
5000: '5000ms',
},
keyframes: {
text: {
'0%, 100%': {
'background-size': '200% 200%',
'background-position': 'left center',
},
'50%': {
'background-size': '200% 200%',
'background-position': 'right center',
},
},
'horizontal-bounce': {
'0%, 100%': {
transform: 'translateX(0)',
},
'50%': {
transform: 'translateX(15px)',
},
},
gradient: {
to: { 'background-position': '200% center' },
},
rotate: {
'0%': { transform: 'rotate(0deg) scale(10)' },
'100%': { transform: 'rotate(-360deg) scale(10)' },
},
},
},
},
plugins: [
require('daisyui'),
require('@tailwindcss/forms'),
require('@tailwindcss/typography'),
// Allows prefixing tailwind classes with LiveView classes to add rules
// only when LiveView classes are applied, for example:
//
// <div class="phx-click-loading:animate-ping">
//
plugin(({ addVariant }) => addVariant('phx-no-feedback', ['.phx-no-feedback&', '.phx-no-feedback &'])),
plugin(({ addVariant }) => addVariant('phx-click-loading', ['.phx-click-loading&', '.phx-click-loading &'])),
plugin(({ addVariant }) => addVariant('phx-submit-loading', ['.phx-submit-loading&', '.phx-submit-loading &'])),
plugin(({ addVariant }) => addVariant('phx-change-loading', ['.phx-change-loading&', '.phx-change-loading &'])),
plugin(({ addVariant }) => addVariant('phx-page-loading', ['.phx-page-loading&', '.phx-page-loading &'])),
// Embeds Heroicons (https://heroicons.com) into your app.css bundle
// See your `CoreComponents.icon/1` for more information.
//
plugin(function ({ matchComponents, theme }) {
let iconsDir = path.join(__dirname, './vendor/heroicons/optimized');
let values = {};
let icons = [
['', '/24/outline'],
['-solid', '/24/solid'],
['-mini', '/20/solid'],
];
icons.forEach(([suffix, dir]) => {
fs.readdirSync(path.join(iconsDir, dir)).forEach(file => {
let name = path.basename(file, '.svg') + suffix;
values[name] = { name, fullPath: path.join(iconsDir, dir, file) };
});
});
matchComponents(
{
hero: ({ name, fullPath }) => {
let content = fs
.readFileSync(fullPath)
.toString()
.replace(/\r?\n|\r/g, '');
return {
[`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`,
'-webkit-mask': `var(--hero-${name})`,
mask: `var(--hero-${name})`,
'mask-repeat': 'no-repeat',
'background-color': 'currentColor',
'vertical-align': 'middle',
display: 'inline-block',
width: theme('spacing.5'),
height: theme('spacing.5'),
};
},
},
{ values },
);
}),
],
};